系统上线运行问题修改
This commit is contained in:
parent
812afaf9a4
commit
bde66e30a1
|
|
@ -38,6 +38,7 @@
|
|||
"js-cookie": "3.0.1",
|
||||
"jsencrypt": "3.0.0-rc.1",
|
||||
"nprogress": "0.2.0",
|
||||
"pdfjs-dist": "^2.10.377",
|
||||
"quill": "2.0.2",
|
||||
"screenfull": "5.0.2",
|
||||
"sm-crypto": "^0.3.13",
|
||||
|
|
@ -46,6 +47,7 @@
|
|||
"vue": "2.6.12",
|
||||
"vue-count-to": "1.0.13",
|
||||
"vue-cropper": "0.5.5",
|
||||
"vue-pdf": "^4.3.0",
|
||||
"vue-router": "3.4.9",
|
||||
"vuedraggable": "2.24.3",
|
||||
"vuex": "3.6.0"
|
||||
|
|
|
|||
|
|
@ -45,8 +45,10 @@
|
|||
<el-col :span="12">
|
||||
<el-form-item label="账号" prop="linkUser">
|
||||
<el-input
|
||||
type="password"
|
||||
clearable
|
||||
maxlength="50"
|
||||
show-password
|
||||
show-word-limit
|
||||
placeholder="请输入账号"
|
||||
v-model="addAndEditForm.linkUser"
|
||||
|
|
@ -56,8 +58,10 @@
|
|||
<el-col :span="12">
|
||||
<el-form-item label="密码" prop="linkPassword">
|
||||
<el-input
|
||||
type="password"
|
||||
clearable
|
||||
maxlength="50"
|
||||
show-password
|
||||
show-word-limit
|
||||
placeholder="请输入密码"
|
||||
v-model="addAndEditForm.linkPassword"
|
||||
|
|
@ -570,25 +574,45 @@ export default {
|
|||
}
|
||||
},
|
||||
// 新增产品案例Tab
|
||||
handleAddProductCase() {
|
||||
const newTabIndex = this.editableTabs.length + 1
|
||||
/*handleAddProductCase() {// 获取当前最大的案例序号并加1,避免序号重复
|
||||
const maxIndex = this.editableTabs.length > 0
|
||||
? Math.max(...this.editableTabs.map(tab => parseInt(tab.name))) + 1
|
||||
: 1;
|
||||
const newTab = {
|
||||
title: `案例${newTabIndex}`,
|
||||
name: newTabIndex.toString(),
|
||||
title: `案例${maxIndex}`,
|
||||
name: maxIndex.toString(),
|
||||
formInfo: {
|
||||
id: '',
|
||||
caseCompany: '',
|
||||
caseImage: [],
|
||||
caseIntroduction: '',
|
||||
caseSort: newTabIndex,
|
||||
caseSort: maxIndex,
|
||||
},
|
||||
}
|
||||
this.editableTabs.push(newTab)
|
||||
// 自动切换到新Tab
|
||||
this.currentTab = newTab.name
|
||||
},*/
|
||||
|
||||
handleAddProductCase() {
|
||||
const newIndex = this.editableTabs.length + 1;
|
||||
const newTab = {
|
||||
title: `案例${newIndex}`,
|
||||
name: newIndex.toString(),
|
||||
formInfo: {
|
||||
id: '',
|
||||
caseCompany: '',
|
||||
caseIntroduction: '',
|
||||
caseSort: newIndex,
|
||||
caseImage: [],
|
||||
},
|
||||
};
|
||||
this.editableTabs.push(newTab);
|
||||
this.currentTab = newTab.name;
|
||||
},
|
||||
|
||||
// 移除产品案例Tab
|
||||
handleRemoveTab(removeTabName) {
|
||||
/*handleRemoveTab(removeTabName) {
|
||||
// 禁止删除最后一个Tab
|
||||
// if (this.editableTabs.length <= 1) {
|
||||
// this.$message.warning('至少保留一个案例')
|
||||
|
|
@ -634,7 +658,41 @@ export default {
|
|||
tab.formInfo.caseSort = index + 1
|
||||
})
|
||||
}
|
||||
},*/
|
||||
|
||||
handleRemoveTab(removeTabName) {
|
||||
// 找到要删除的Tab索引
|
||||
const removeIndex = this.editableTabs.findIndex(
|
||||
(tab) => tab.name === removeTabName,
|
||||
);
|
||||
|
||||
if (this.formType === 2) {
|
||||
this.editDeleteCaseId.push(
|
||||
this.editableTabs[removeIndex].formInfo?.id,
|
||||
);
|
||||
}
|
||||
|
||||
this.editableTabs.splice(removeIndex, 1);
|
||||
|
||||
// 删除后重新编号 title 和 name
|
||||
this.editableTabs.forEach((tab, index) => {
|
||||
tab.title = `案例${index + 1}`;
|
||||
tab.name = (index + 1).toString();
|
||||
tab.formInfo.caseSort = index + 1;
|
||||
});
|
||||
|
||||
// 调整 currentTab
|
||||
if (this.editableTabs.length === 0) {
|
||||
this.currentTab = '';
|
||||
} else if (removeIndex === 0) {
|
||||
this.currentTab = this.editableTabs[0].name;
|
||||
} else {
|
||||
this.currentTab =
|
||||
this.editableTabs[removeIndex - 1]?.name ||
|
||||
this.editableTabs[this.editableTabs.length - 1].name;
|
||||
}
|
||||
},
|
||||
|
||||
// Tab切换事件:触发当前Tab的表单校验
|
||||
handleTabClick() {
|
||||
// this.$nextTick(() => {
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import axios from 'axios'
|
||||
|
||||
export default {
|
||||
name: "pdfPreview.vue",
|
||||
data() {
|
||||
|
|
@ -13,17 +15,28 @@ export default {
|
|||
pdfUrl: ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
async created() {
|
||||
// 从URL参数获取PDF地址
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const encodedUrl = urlParams.get('url');
|
||||
const title = urlParams.get('title') || '文档预览';
|
||||
|
||||
// 设置页面标题
|
||||
document.title = title;
|
||||
|
||||
if (encodedUrl) {
|
||||
this.pdfUrl = decodeURIComponent(encodedUrl);
|
||||
const fileUrl = decodeURIComponent(encodedUrl);
|
||||
try {
|
||||
const res = await axios.get(fileUrl, {
|
||||
responseType: 'blob' // 关键:拿到二进制流
|
||||
});
|
||||
|
||||
// 强制当 pdf 来用
|
||||
const blob = new Blob([res.data], { type: 'application/pdf' });
|
||||
this.pdfUrl = URL.createObjectURL(blob);
|
||||
|
||||
} catch (err) {
|
||||
console.error('加载PDF失败:', err);
|
||||
this.$message.error('PDF加载失败,请稍后重试');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -328,7 +328,11 @@ export default {
|
|||
// 预览文档
|
||||
previewDocs(item) {
|
||||
const {fileName, filePath} = item;
|
||||
console.log(filePath)
|
||||
|
||||
if(!fileName){
|
||||
this.$modal.msgWarning('格式不正常,请重新上传');
|
||||
}
|
||||
// 获取文件扩展名
|
||||
const fileExtension = fileName.split('.').pop().toLowerCase();
|
||||
|
||||
|
|
@ -343,7 +347,10 @@ export default {
|
|||
|
||||
// 构造正确的预览页面filePath(适配history模式和base路径)
|
||||
const basePath = process.env.VUE_APP_ENV === 'production' ? '/pubSerPlatform' : '';
|
||||
const previewPageUrl = `${window.location.origin}${basePath}/pdf-preview?url=${encodeURIComponent(fileUrl)}&title=产品手册预览`;
|
||||
// const previewPageUrl = `${window.location.origin}${basePath}/pdf-preview?url=${encodeURIComponent(fileUrl)}&title=产品手册预览`;
|
||||
|
||||
const previewPageUrl = `${window.location.origin}${basePath}/pdf-preview?url=${encodeURIComponent(fileUrl)}&title=${encodeURIComponent('产品手册预览')}`;
|
||||
|
||||
|
||||
// 在新窗口中打开预览页面
|
||||
window.open(previewPageUrl, '_blank');
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@
|
|||
default-expand-all
|
||||
highlight-current
|
||||
@node-click="handleNodeClick"
|
||||
@node-expand="onNodeExpand"
|
||||
@node-collapse="onNodeCollapse"
|
||||
>
|
||||
<span class="custom-tree-node" slot-scope="{ node, data }">
|
||||
<span>{{ node.label }}</span>
|
||||
|
|
@ -336,31 +338,80 @@ export default {
|
|||
},
|
||||
|
||||
toggleExpandAll() {
|
||||
if (this.isTreeExpanded) {
|
||||
// 当前是展开状态,执行折叠
|
||||
// 在切换前使用实时判断,避免 state 不同步导致“一次无效”
|
||||
const allExpanded = this.isAllExpanded();
|
||||
if (allExpanded) {
|
||||
this.collapseAll();
|
||||
this.isTreeExpanded = false;
|
||||
} else {
|
||||
// 当前是折叠状态,执行展开
|
||||
this.expandAll();
|
||||
this.isTreeExpanded = true;
|
||||
}
|
||||
// 更新按钮显示状态
|
||||
this.isTreeExpanded = !allExpanded;
|
||||
},
|
||||
|
||||
// 展开所有节点
|
||||
expandAll() {
|
||||
this.$refs.tree.store.root.childNodes.forEach(node => {
|
||||
node.expanded = true;
|
||||
});
|
||||
if (!this.$refs.tree || !this.$refs.tree.store) return;
|
||||
this.expandNodes(this.$refs.tree.store.root.childNodes);
|
||||
this.isTreeExpanded = true;
|
||||
},
|
||||
|
||||
// 折叠所有节点
|
||||
collapseAll() {
|
||||
this.$refs.tree.store.root.childNodes.forEach(node => {
|
||||
node.expanded = false;
|
||||
if (!this.$refs.tree || !this.$refs.tree.store) return;
|
||||
this.collapseNodes(this.$refs.tree.store.root.childNodes);
|
||||
this.isTreeExpanded = false;
|
||||
},
|
||||
|
||||
// 递归展开节点
|
||||
expandNodes(nodes) {
|
||||
nodes.forEach(node => {
|
||||
node.expanded = true;
|
||||
if (node.childNodes && node.childNodes.length > 0) {
|
||||
this.expandNodes(node.childNodes);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// 递归折叠节点
|
||||
collapseNodes(nodes) {
|
||||
nodes.forEach(node => {
|
||||
node.expanded = false;
|
||||
if (node.childNodes && node.childNodes.length > 0) {
|
||||
this.collapseNodes(node.childNodes);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// 判断“是否全部展开” —— 如果所有有子节点的节点都 expanded === true 则返回 true
|
||||
isAllExpanded() {
|
||||
const rootNodes = this.$refs.tree && this.$refs.tree.store && this.$refs.tree.store.root
|
||||
? this.$refs.tree.store.root.childNodes
|
||||
: [];
|
||||
const check = (nodes) => {
|
||||
for (const node of nodes) {
|
||||
// 如果存在子节点,则当前节点必须 expanded 且其子节点也要全部展开
|
||||
if (node.childNodes && node.childNodes.length > 0) {
|
||||
if (!node.expanded) return false;
|
||||
if (!check(node.childNodes)) return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
return check(rootNodes);
|
||||
},
|
||||
|
||||
// 当任意节点被手动展开时触发:重新计算“全部展开”状态
|
||||
onNodeExpand(/* node */) {
|
||||
// node 参数可选,用不到就不使用
|
||||
this.isTreeExpanded = this.isAllExpanded();
|
||||
},
|
||||
|
||||
// 当任意节点被手动折叠时触发:重新计算“全部展开”状态
|
||||
onNodeCollapse(/* node */) {
|
||||
this.isTreeExpanded = this.isAllExpanded();
|
||||
},
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -20,16 +20,20 @@
|
|||
<!--用户数据-->
|
||||
<pane size="84">
|
||||
<el-col>
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"
|
||||
label-width="68px">
|
||||
<el-form-item label="用户名称" prop="userName">
|
||||
<el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable style="width: 240px" @keyup.enter.native="handleQuery" />
|
||||
<el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable style="width: 240px"
|
||||
@keyup.enter.native="handleQuery"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="手机号码" prop="phonenumber">
|
||||
<el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable style="width: 240px" @keyup.enter.native="handleQuery" />
|
||||
<el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable style="width: 240px"
|
||||
@keyup.enter.native="handleQuery"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select v-model="queryParams.status" placeholder="用户状态" clearable style="width: 240px">
|
||||
<el-option v-for="dict in dict.type.sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
|
||||
<el-option v-for="dict in dict.type.sys_normal_disable" :key="dict.value" :label="dict.label"
|
||||
:value="dict.value"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
|
|
@ -47,7 +51,9 @@
|
|||
|
||||
|
||||
<el-form-item label="创建时间">
|
||||
<el-date-picker v-model="dateRange" style="width: 240px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
|
||||
<el-date-picker v-model="dateRange" style="width: 240px" value-format="yyyy-MM-dd" type="daterange"
|
||||
range-separator="-" start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
|
|
@ -57,62 +63,87 @@
|
|||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:user:add']">新增</el-button>
|
||||
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
|
||||
v-hasPermi="['system:user:add']">新增
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate" v-hasPermi="['system:user:edit']">修改</el-button>
|
||||
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
|
||||
v-hasPermi="['system:user:edit']">修改
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:user:remove']">删除</el-button>
|
||||
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
|
||||
@click="handleDelete" v-hasPermi="['system:user:remove']">删除
|
||||
</el-button>
|
||||
</el-col>
|
||||
<!-- <el-col :span="1.5">-->
|
||||
<!-- <el-button type="info" plain icon="el-icon-upload2" size="mini" @click="handleImport" v-hasPermi="['system:user:import']">导入</el-button>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="1.5">-->
|
||||
<!-- <el-button type="info" plain icon="el-icon-upload2" size="mini" @click="handleImport" v-hasPermi="['system:user:import']">导入</el-button>-->
|
||||
<!-- </el-col>-->
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['system:user:export']">导出</el-button>
|
||||
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
|
||||
v-hasPermi="['system:user:export']">导出
|
||||
</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" ></right-toolbar>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="50" align="center" />
|
||||
<el-table-column label="编号" align="center" type="index" width="50" />
|
||||
<el-table-column type="selection" width="50" align="center"/>
|
||||
<el-table-column label="编号" align="center" type="index" width="50"/>
|
||||
<!-- <el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns.userId.visible" />-->
|
||||
<el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns.userName.visible" :show-overflow-tooltip="true" />
|
||||
<!-- <el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns.nickName.visible" :show-overflow-tooltip="true" />-->
|
||||
<el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns.deptName.visible" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="用户名称" align="center" key="userName" prop="userName"
|
||||
v-if="columns.userName.visible" :show-overflow-tooltip="true"/>
|
||||
<!-- <el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns.nickName.visible" :show-overflow-tooltip="true" />-->
|
||||
<el-table-column label="部门" align="center" key="deptName" prop="dept.deptName"
|
||||
v-if="columns.deptName.visible" :show-overflow-tooltip="true"/>
|
||||
|
||||
<el-table-column label="职位" align="center" key="postName" prop="postName" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="角色" align="center" key="roleName" prop="roleName" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="职位" align="center" key="postName" prop="postName"
|
||||
:show-overflow-tooltip="true"/>
|
||||
<el-table-column label="角色" align="center" key="roleName" prop="roleName"
|
||||
:show-overflow-tooltip="true"/>
|
||||
|
||||
<el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns.phonenumber.visible" width="120" />
|
||||
<!-- <el-table-column label="状态" align="center" key="status" v-if="columns.status.visible">
|
||||
<template slot-scope="scope">
|
||||
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns.createTime.visible" width="160">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>-->
|
||||
<el-table-column label="操作" align="center" width="180" class-name="small-padding fixed-width">
|
||||
<el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber"
|
||||
v-if="columns.phonenumber.visible" width="120"/>
|
||||
<!-- <el-table-column label="状态" align="center" key="status" v-if="columns.status.visible">
|
||||
<template slot-scope="scope">
|
||||
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns.createTime.visible" width="160">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>-->
|
||||
<el-table-column label="操作" align="center" width="260" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope" v-if="scope.row.userId !== 1">
|
||||
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:user:edit']">修改</el-button>
|
||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']">删除</el-button>
|
||||
<el-button size="mini" type="text" icon="el-icon-key" @click="handleResetPwd(scope.row)" v-hasPermi="['system:user:resetPwd']">重置密码</el-button>
|
||||
<!-- <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:user:resetPwd', 'system:user:edit']">
|
||||
<el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item command="handleResetPwd" icon="el-icon-key" v-hasPermi="['system:user:resetPwd']">重置密码</el-dropdown-item>
|
||||
<el-dropdown-item command="handleAuthRole" icon="el-icon-circle-check" v-hasPermi="['system:user:edit']">分配角色</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>-->
|
||||
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['system:user:edit']">修改
|
||||
</el-button>
|
||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['system:user:remove']">删除
|
||||
</el-button>
|
||||
<el-button size="mini" type="text" icon="el-icon-key" @click="handleResetPwd(scope.row)"
|
||||
v-hasPermi="['system:user:resetPwd']">重置密码
|
||||
</el-button>
|
||||
|
||||
<el-button size="mini" type="text" icon="el-icon-key" @click="handleUpdatePwd(scope.row)"
|
||||
v-hasPermi="['system:user:resetPwd']">修改密码
|
||||
</el-button>
|
||||
|
||||
<!-- <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:user:resetPwd', 'system:user:edit']">
|
||||
<el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item command="handleResetPwd" icon="el-icon-key" v-hasPermi="['system:user:resetPwd']">重置密码</el-dropdown-item>
|
||||
<el-dropdown-item command="handleAuthRole" icon="el-icon-circle-check" v-hasPermi="['system:user:edit']">分配角色</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>-->
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
|
||||
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize" @pagination="getList"/>
|
||||
</el-col>
|
||||
</pane>
|
||||
</splitpanes>
|
||||
|
|
@ -123,14 +154,15 @@
|
|||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="用户名称" prop="userName">
|
||||
<el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30" />
|
||||
<el-form-item label="用户名称" prop="userName">
|
||||
<el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="部门" prop="deptId">
|
||||
<treeselect v-model="form.deptId" :options="enabledDeptOptions" :show-count="true" placeholder="请选择部门" />
|
||||
<treeselect v-model="form.deptId" :options="enabledDeptOptions" :show-count="true"
|
||||
placeholder="请选择部门"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
|
@ -139,14 +171,16 @@
|
|||
<el-col :span="12">
|
||||
<el-form-item label="职位" prop="postIds">
|
||||
<el-select v-model="form.postIds" placeholder="请选择职位">
|
||||
<el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId" :disabled="item.status == 1" ></el-option>
|
||||
<el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId"
|
||||
:disabled="item.status == 1"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="角色" prop="roleIds">
|
||||
<el-select v-model="form.roleIds" placeholder="请选择角色">
|
||||
<el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId" :disabled="item.status == 1"></el-option>
|
||||
<el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId"
|
||||
:disabled="item.status == 1"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
|
@ -155,7 +189,7 @@
|
|||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="手机号码" prop="phonenumber">
|
||||
<el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
|
||||
<el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
|
|
@ -177,15 +211,20 @@
|
|||
|
||||
<!-- 用户导入对话框 -->
|
||||
<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
|
||||
<el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
|
||||
<el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
|
||||
:action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
|
||||
:on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
|
||||
<i class="el-icon-upload"></i>
|
||||
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
|
||||
<div class="el-upload__tip text-center" slot="tip">
|
||||
<div class="el-upload__tip" slot="tip">
|
||||
<el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
|
||||
<el-checkbox v-model="upload.updateSupport"/>
|
||||
是否更新已经存在的用户数据
|
||||
</div>
|
||||
<span>仅允许导入xls、xlsx格式文件。</span>
|
||||
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板</el-link>
|
||||
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
|
||||
@click="importTemplate">下载模板
|
||||
</el-link>
|
||||
</div>
|
||||
</el-upload>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
|
|
@ -197,12 +236,21 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus, deptTreeSelect } from "@/api/system/user"
|
||||
import { listRole } from "@/api/system/role" // 导入角色API
|
||||
import { getToken } from "@/utils/auth"
|
||||
import {
|
||||
listUser,
|
||||
getUser,
|
||||
delUser,
|
||||
addUser,
|
||||
updateUser,
|
||||
resetUserPwd,
|
||||
changeUserStatus,
|
||||
deptTreeSelect
|
||||
} from "@/api/system/user"
|
||||
import {listRole} from "@/api/system/role" // 导入角色API
|
||||
import {getToken} from "@/utils/auth"
|
||||
import Treeselect from "@riophae/vue-treeselect"
|
||||
import "@riophae/vue-treeselect/dist/vue-treeselect.css"
|
||||
import { Splitpanes, Pane } from "splitpanes"
|
||||
import {Splitpanes, Pane} from "splitpanes"
|
||||
import "splitpanes/dist/splitpanes.css"
|
||||
|
||||
// 导入部门树组件
|
||||
|
|
@ -270,7 +318,7 @@ export default {
|
|||
// 是否更新已经存在的用户数据
|
||||
updateSupport: 0,
|
||||
// 设置上传的请求头部
|
||||
headers: { Authorization: "Bearer " + getToken() },
|
||||
headers: {Authorization: "Bearer " + getToken()},
|
||||
// 上传的地址
|
||||
url: process.env.VUE_APP_BASE_API + "/system/user/importData"
|
||||
},
|
||||
|
|
@ -288,22 +336,22 @@ export default {
|
|||
roleName: "",
|
||||
// 列信息
|
||||
columns: {
|
||||
userId: { label: '用户编号', visible: true },
|
||||
userName: { label: '用户名称', visible: true },
|
||||
nickName: { label: '用户昵称', visible: true },
|
||||
deptName: { label: '部门', visible: true },
|
||||
phonenumber: { label: '手机号码', visible: true },
|
||||
status: { label: '状态', visible: true },
|
||||
createTime: { label: '创建时间', visible: true }
|
||||
userId: {label: '用户编号', visible: true},
|
||||
userName: {label: '用户名称', visible: true},
|
||||
nickName: {label: '用户昵称', visible: true},
|
||||
deptName: {label: '部门', visible: true},
|
||||
phonenumber: {label: '手机号码', visible: true},
|
||||
status: {label: '状态', visible: true},
|
||||
createTime: {label: '创建时间', visible: true}
|
||||
},
|
||||
// 表单校验
|
||||
rules: {
|
||||
userName: [
|
||||
{ required: true, message: "用户名称不能为空", trigger: "blur" },
|
||||
{ min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
|
||||
{required: true, message: "用户名称不能为空", trigger: "blur"},
|
||||
{min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur'}
|
||||
],
|
||||
phonenumber: [
|
||||
{ required: true, message: '手机号码不能为空', trigger: 'blur' },
|
||||
{required: true, message: '手机号码不能为空', trigger: 'blur'},
|
||||
{
|
||||
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
|
||||
message: "请输入正确的手机号码",
|
||||
|
|
@ -311,16 +359,16 @@ export default {
|
|||
}
|
||||
],
|
||||
deptId: [
|
||||
{ required: true, message: '部门不能为空', trigger: 'blur' }
|
||||
{required: true, message: '部门不能为空', trigger: 'blur'}
|
||||
],
|
||||
postIds: [
|
||||
{ required: true, message: '岗位不能为空', trigger: 'blur' }
|
||||
{required: true, message: '岗位不能为空', trigger: 'blur'}
|
||||
],
|
||||
roleIds: [
|
||||
{ required: true, message: '角色不能为空', trigger: 'blur' }
|
||||
{required: true, message: '角色不能为空', trigger: 'blur'}
|
||||
],
|
||||
permissions: [
|
||||
{ type: 'array', required: true, message: '请至少选择一个权限', trigger: 'blur' }
|
||||
{type: 'array', required: true, message: '请至少选择一个权限', trigger: 'blur'}
|
||||
]
|
||||
},
|
||||
}
|
||||
|
|
@ -405,16 +453,22 @@ export default {
|
|||
|
||||
// 过滤禁用的部门
|
||||
filterDisabledDept(deptList) {
|
||||
return deptList.filter(dept => {
|
||||
if (dept.disabled) {
|
||||
return false
|
||||
}
|
||||
if (dept.children && dept.children.length) {
|
||||
dept.children = this.filterDisabledDept(dept.children)
|
||||
}
|
||||
return true
|
||||
})
|
||||
return deptList
|
||||
.filter(dept => !dept.disabled) // 直接过滤掉禁用的部门
|
||||
.map(dept => {
|
||||
const newDept = {...dept}
|
||||
if (newDept.children && newDept.children.length) {
|
||||
newDept.children = this.filterDisabledDept(newDept.children)
|
||||
}
|
||||
// 如果 children 为空数组,干脆删除
|
||||
if (!newDept.children || newDept.children.length === 0) {
|
||||
delete newDept.children
|
||||
}
|
||||
return newDept
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
// 筛选节点
|
||||
filterNode(value, data) {
|
||||
if (!value) return true
|
||||
|
|
@ -429,11 +483,11 @@ export default {
|
|||
// 用户状态修改
|
||||
handleStatusChange(row) {
|
||||
let text = row.status === "0" ? "启用" : "停用"
|
||||
this.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function() {
|
||||
this.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function () {
|
||||
return changeUserStatus(row.userId, row.status)
|
||||
}).then(() => {
|
||||
this.$modal.msgSuccess(text + "成功")
|
||||
}).catch(function() {
|
||||
}).catch(function () {
|
||||
row.status = row.status === "0" ? "1" : "0"
|
||||
})
|
||||
},
|
||||
|
|
@ -565,13 +619,35 @@ export default {
|
|||
})
|
||||
}).catch(() => {})*/
|
||||
},
|
||||
|
||||
handleUpdatePwd(row) {
|
||||
this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
closeOnClickModal: false,
|
||||
inputPattern: /^.{5,20}$/,
|
||||
inputErrorMessage: "用户密码长度必须介于 5 和 20 之间",
|
||||
inputValidator: (value) => {
|
||||
if (/<|>|"|'|\||\\/.test(value)) {
|
||||
return "不能包含非法字符:< > \" ' \\\ |"
|
||||
}
|
||||
if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\w\s]).*$/.test(value)) {
|
||||
return "密码必须包含大写字母、小写字母、数字和特殊符号"
|
||||
}
|
||||
},
|
||||
}).then(({ value }) => {
|
||||
resetUserPwd(row.userId, value).then(response => {
|
||||
this.$modal.msgSuccess("修改成功,新密码是:" + value)
|
||||
})
|
||||
}).catch(() => {})
|
||||
},
|
||||
/** 分配角色操作 */
|
||||
handleAuthRole: function(row) {
|
||||
handleAuthRole: function (row) {
|
||||
const userId = row.userId
|
||||
this.$router.push("/system/user-auth/role/" + userId)
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm: function() {
|
||||
submitForm: function () {
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (valid) {
|
||||
// 保存原始的 postIds 和 roleIds 值
|
||||
|
|
@ -623,12 +699,13 @@ export default {
|
|||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const userIds = row.userId || this.ids
|
||||
this.$modal.confirm('是否确认删除此数据项?').then(function() {
|
||||
this.$modal.confirm('是否确认删除此数据项?').then(function () {
|
||||
return delUser(userIds)
|
||||
}).then(() => {
|
||||
this.getList()
|
||||
this.$modal.msgSuccess("删除成功")
|
||||
}).catch(() => {})
|
||||
}).catch(() => {
|
||||
})
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
|
|
@ -643,8 +720,7 @@ export default {
|
|||
},
|
||||
/** 下载模板操作 */
|
||||
importTemplate() {
|
||||
this.download('system/user/importTemplate', {
|
||||
}, `user_template_${new Date().getTime()}.xlsx`)
|
||||
this.download('system/user/importTemplate', {}, `user_template_${new Date().getTime()}.xlsx`)
|
||||
},
|
||||
// 文件上传中处理
|
||||
handleFileUploadProgress(event, file, fileList) {
|
||||
|
|
@ -655,7 +731,7 @@ export default {
|
|||
this.upload.open = false
|
||||
this.upload.isUploading = false
|
||||
this.$refs.upload.clearFiles()
|
||||
this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
|
||||
this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", {dangerouslyUseHTMLString: true})
|
||||
this.getList()
|
||||
},
|
||||
// 提交上传文件
|
||||
|
|
|
|||
Loading…
Reference in New Issue