系统上线运行问题修改
This commit is contained in:
parent
812afaf9a4
commit
bde66e30a1
|
|
@ -38,6 +38,7 @@
|
||||||
"js-cookie": "3.0.1",
|
"js-cookie": "3.0.1",
|
||||||
"jsencrypt": "3.0.0-rc.1",
|
"jsencrypt": "3.0.0-rc.1",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
|
"pdfjs-dist": "^2.10.377",
|
||||||
"quill": "2.0.2",
|
"quill": "2.0.2",
|
||||||
"screenfull": "5.0.2",
|
"screenfull": "5.0.2",
|
||||||
"sm-crypto": "^0.3.13",
|
"sm-crypto": "^0.3.13",
|
||||||
|
|
@ -46,6 +47,7 @@
|
||||||
"vue": "2.6.12",
|
"vue": "2.6.12",
|
||||||
"vue-count-to": "1.0.13",
|
"vue-count-to": "1.0.13",
|
||||||
"vue-cropper": "0.5.5",
|
"vue-cropper": "0.5.5",
|
||||||
|
"vue-pdf": "^4.3.0",
|
||||||
"vue-router": "3.4.9",
|
"vue-router": "3.4.9",
|
||||||
"vuedraggable": "2.24.3",
|
"vuedraggable": "2.24.3",
|
||||||
"vuex": "3.6.0"
|
"vuex": "3.6.0"
|
||||||
|
|
|
||||||
|
|
@ -45,8 +45,10 @@
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="账号" prop="linkUser">
|
<el-form-item label="账号" prop="linkUser">
|
||||||
<el-input
|
<el-input
|
||||||
|
type="password"
|
||||||
clearable
|
clearable
|
||||||
maxlength="50"
|
maxlength="50"
|
||||||
|
show-password
|
||||||
show-word-limit
|
show-word-limit
|
||||||
placeholder="请输入账号"
|
placeholder="请输入账号"
|
||||||
v-model="addAndEditForm.linkUser"
|
v-model="addAndEditForm.linkUser"
|
||||||
|
|
@ -56,8 +58,10 @@
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="密码" prop="linkPassword">
|
<el-form-item label="密码" prop="linkPassword">
|
||||||
<el-input
|
<el-input
|
||||||
|
type="password"
|
||||||
clearable
|
clearable
|
||||||
maxlength="50"
|
maxlength="50"
|
||||||
|
show-password
|
||||||
show-word-limit
|
show-word-limit
|
||||||
placeholder="请输入密码"
|
placeholder="请输入密码"
|
||||||
v-model="addAndEditForm.linkPassword"
|
v-model="addAndEditForm.linkPassword"
|
||||||
|
|
@ -570,25 +574,45 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 新增产品案例Tab
|
// 新增产品案例Tab
|
||||||
handleAddProductCase() {
|
/*handleAddProductCase() {// 获取当前最大的案例序号并加1,避免序号重复
|
||||||
const newTabIndex = this.editableTabs.length + 1
|
const maxIndex = this.editableTabs.length > 0
|
||||||
|
? Math.max(...this.editableTabs.map(tab => parseInt(tab.name))) + 1
|
||||||
|
: 1;
|
||||||
const newTab = {
|
const newTab = {
|
||||||
title: `案例${newTabIndex}`,
|
title: `案例${maxIndex}`,
|
||||||
name: newTabIndex.toString(),
|
name: maxIndex.toString(),
|
||||||
formInfo: {
|
formInfo: {
|
||||||
id: '',
|
id: '',
|
||||||
caseCompany: '',
|
caseCompany: '',
|
||||||
caseImage: [],
|
caseImage: [],
|
||||||
caseIntroduction: '',
|
caseIntroduction: '',
|
||||||
caseSort: newTabIndex,
|
caseSort: maxIndex,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
this.editableTabs.push(newTab)
|
this.editableTabs.push(newTab)
|
||||||
// 自动切换到新Tab
|
// 自动切换到新Tab
|
||||||
this.currentTab = newTab.name
|
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
|
// 移除产品案例Tab
|
||||||
handleRemoveTab(removeTabName) {
|
/*handleRemoveTab(removeTabName) {
|
||||||
// 禁止删除最后一个Tab
|
// 禁止删除最后一个Tab
|
||||||
// if (this.editableTabs.length <= 1) {
|
// if (this.editableTabs.length <= 1) {
|
||||||
// this.$message.warning('至少保留一个案例')
|
// this.$message.warning('至少保留一个案例')
|
||||||
|
|
@ -634,7 +658,41 @@ export default {
|
||||||
tab.formInfo.caseSort = index + 1
|
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的表单校验
|
// Tab切换事件:触发当前Tab的表单校验
|
||||||
handleTabClick() {
|
handleTabClick() {
|
||||||
// this.$nextTick(() => {
|
// this.$nextTick(() => {
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,8 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import axios from 'axios'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "pdfPreview.vue",
|
name: "pdfPreview.vue",
|
||||||
data() {
|
data() {
|
||||||
|
|
@ -13,17 +15,28 @@ export default {
|
||||||
pdfUrl: ''
|
pdfUrl: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
async created() {
|
||||||
// 从URL参数获取PDF地址
|
// 从URL参数获取PDF地址
|
||||||
const urlParams = new URLSearchParams(window.location.search);
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
const encodedUrl = urlParams.get('url');
|
const encodedUrl = urlParams.get('url');
|
||||||
const title = urlParams.get('title') || '文档预览';
|
const title = urlParams.get('title') || '文档预览';
|
||||||
|
|
||||||
// 设置页面标题
|
|
||||||
document.title = title;
|
document.title = title;
|
||||||
|
|
||||||
if (encodedUrl) {
|
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) {
|
previewDocs(item) {
|
||||||
const {fileName, filePath} = item;
|
const {fileName, filePath} = item;
|
||||||
|
console.log(filePath)
|
||||||
|
|
||||||
|
if(!fileName){
|
||||||
|
this.$modal.msgWarning('格式不正常,请重新上传');
|
||||||
|
}
|
||||||
// 获取文件扩展名
|
// 获取文件扩展名
|
||||||
const fileExtension = fileName.split('.').pop().toLowerCase();
|
const fileExtension = fileName.split('.').pop().toLowerCase();
|
||||||
|
|
||||||
|
|
@ -343,7 +347,10 @@ export default {
|
||||||
|
|
||||||
// 构造正确的预览页面filePath(适配history模式和base路径)
|
// 构造正确的预览页面filePath(适配history模式和base路径)
|
||||||
const basePath = process.env.VUE_APP_ENV === 'production' ? '/pubSerPlatform' : '';
|
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');
|
window.open(previewPageUrl, '_blank');
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,8 @@
|
||||||
default-expand-all
|
default-expand-all
|
||||||
highlight-current
|
highlight-current
|
||||||
@node-click="handleNodeClick"
|
@node-click="handleNodeClick"
|
||||||
|
@node-expand="onNodeExpand"
|
||||||
|
@node-collapse="onNodeCollapse"
|
||||||
>
|
>
|
||||||
<span class="custom-tree-node" slot-scope="{ node, data }">
|
<span class="custom-tree-node" slot-scope="{ node, data }">
|
||||||
<span>{{ node.label }}</span>
|
<span>{{ node.label }}</span>
|
||||||
|
|
@ -336,31 +338,80 @@ export default {
|
||||||
},
|
},
|
||||||
|
|
||||||
toggleExpandAll() {
|
toggleExpandAll() {
|
||||||
if (this.isTreeExpanded) {
|
// 在切换前使用实时判断,避免 state 不同步导致“一次无效”
|
||||||
// 当前是展开状态,执行折叠
|
const allExpanded = this.isAllExpanded();
|
||||||
|
if (allExpanded) {
|
||||||
this.collapseAll();
|
this.collapseAll();
|
||||||
this.isTreeExpanded = false;
|
|
||||||
} else {
|
} else {
|
||||||
// 当前是折叠状态,执行展开
|
|
||||||
this.expandAll();
|
this.expandAll();
|
||||||
this.isTreeExpanded = true;
|
|
||||||
}
|
}
|
||||||
|
// 更新按钮显示状态
|
||||||
|
this.isTreeExpanded = !allExpanded;
|
||||||
},
|
},
|
||||||
|
|
||||||
// 展开所有节点
|
// 展开所有节点
|
||||||
expandAll() {
|
expandAll() {
|
||||||
this.$refs.tree.store.root.childNodes.forEach(node => {
|
if (!this.$refs.tree || !this.$refs.tree.store) return;
|
||||||
node.expanded = true;
|
this.expandNodes(this.$refs.tree.store.root.childNodes);
|
||||||
});
|
this.isTreeExpanded = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
// 折叠所有节点
|
// 折叠所有节点
|
||||||
collapseAll() {
|
collapseAll() {
|
||||||
this.$refs.tree.store.root.childNodes.forEach(node => {
|
if (!this.$refs.tree || !this.$refs.tree.store) return;
|
||||||
node.expanded = false;
|
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>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -20,16 +20,20 @@
|
||||||
<!--用户数据-->
|
<!--用户数据-->
|
||||||
<pane size="84">
|
<pane size="84">
|
||||||
<el-col>
|
<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-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>
|
||||||
<el-form-item label="手机号码" prop="phonenumber">
|
<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>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-select v-model="queryParams.status" placeholder="用户状态" clearable style="width: 240px">
|
<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-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
|
@ -47,7 +51,9 @@
|
||||||
|
|
||||||
|
|
||||||
<el-form-item label="创建时间">
|
<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-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||||
|
|
@ -57,19 +63,27 @@
|
||||||
|
|
||||||
<el-row :gutter="10" class="mb8">
|
<el-row :gutter="10" class="mb8">
|
||||||
<el-col :span="1.5">
|
<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>
|
||||||
<el-col :span="1.5">
|
<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>
|
||||||
<el-col :span="1.5">
|
<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>
|
||||||
<!-- <el-col :span="1.5">-->
|
<!-- <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-button type="info" plain icon="el-icon-upload2" size="mini" @click="handleImport" v-hasPermi="['system:user:import']">导入</el-button>-->
|
||||||
<!-- </el-col>-->
|
<!-- </el-col>-->
|
||||||
<el-col :span="1.5">
|
<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>
|
</el-col>
|
||||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
@ -78,14 +92,19 @@
|
||||||
<el-table-column type="selection" width="50" align="center"/>
|
<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" 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="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="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="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="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="postName" prop="postName"
|
||||||
<el-table-column label="角色" align="center" key="roleName" prop="roleName" :show-overflow-tooltip="true" />
|
: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="phonenumber" prop="phonenumber"
|
||||||
|
v-if="columns.phonenumber.visible" width="120"/>
|
||||||
<!-- <el-table-column label="状态" align="center" key="status" v-if="columns.status.visible">
|
<!-- <el-table-column label="状态" align="center" key="status" v-if="columns.status.visible">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
||||||
|
|
@ -96,11 +115,22 @@
|
||||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>-->
|
</el-table-column>-->
|
||||||
<el-table-column label="操作" align="center" width="180" class-name="small-padding fixed-width">
|
<el-table-column label="操作" align="center" width="260" class-name="small-padding fixed-width">
|
||||||
<template slot-scope="scope" v-if="scope.row.userId !== 1">
|
<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-edit" @click="handleUpdate(scope.row)"
|
||||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']">删除</el-button>
|
v-hasPermi="['system:user:edit']">修改
|
||||||
<el-button size="mini" type="text" icon="el-icon-key" @click="handleResetPwd(scope.row)" v-hasPermi="['system:user:resetPwd']">重置密码</el-button>
|
</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-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-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
|
||||||
<el-dropdown-menu slot="dropdown">
|
<el-dropdown-menu slot="dropdown">
|
||||||
|
|
@ -112,7 +142,8 @@
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</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>
|
</el-col>
|
||||||
</pane>
|
</pane>
|
||||||
</splitpanes>
|
</splitpanes>
|
||||||
|
|
@ -130,7 +161,8 @@
|
||||||
|
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="部门" prop="deptId">
|
<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-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
@ -139,14 +171,16 @@
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="职位" prop="postIds">
|
<el-form-item label="职位" prop="postIds">
|
||||||
<el-select v-model="form.postIds" placeholder="请选择职位">
|
<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-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="角色" prop="roleIds">
|
<el-form-item label="角色" prop="roleIds">
|
||||||
<el-select v-model="form.roleIds" placeholder="请选择角色">
|
<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-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
@ -177,15 +211,20 @@
|
||||||
|
|
||||||
<!-- 用户导入对话框 -->
|
<!-- 用户导入对话框 -->
|
||||||
<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
|
<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>
|
<i class="el-icon-upload"></i>
|
||||||
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
|
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
|
||||||
<div class="el-upload__tip text-center" slot="tip">
|
<div class="el-upload__tip text-center" slot="tip">
|
||||||
<div class="el-upload__tip" slot="tip">
|
<div class="el-upload__tip" slot="tip">
|
||||||
<el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
|
<el-checkbox v-model="upload.updateSupport"/>
|
||||||
|
是否更新已经存在的用户数据
|
||||||
</div>
|
</div>
|
||||||
<span>仅允许导入xls、xlsx格式文件。</span>
|
<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>
|
</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
<div slot="footer" class="dialog-footer">
|
<div slot="footer" class="dialog-footer">
|
||||||
|
|
@ -197,7 +236,16 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus, deptTreeSelect } from "@/api/system/user"
|
import {
|
||||||
|
listUser,
|
||||||
|
getUser,
|
||||||
|
delUser,
|
||||||
|
addUser,
|
||||||
|
updateUser,
|
||||||
|
resetUserPwd,
|
||||||
|
changeUserStatus,
|
||||||
|
deptTreeSelect
|
||||||
|
} from "@/api/system/user"
|
||||||
import {listRole} from "@/api/system/role" // 导入角色API
|
import {listRole} from "@/api/system/role" // 导入角色API
|
||||||
import {getToken} from "@/utils/auth"
|
import {getToken} from "@/utils/auth"
|
||||||
import Treeselect from "@riophae/vue-treeselect"
|
import Treeselect from "@riophae/vue-treeselect"
|
||||||
|
|
@ -405,16 +453,22 @@ export default {
|
||||||
|
|
||||||
// 过滤禁用的部门
|
// 过滤禁用的部门
|
||||||
filterDisabledDept(deptList) {
|
filterDisabledDept(deptList) {
|
||||||
return deptList.filter(dept => {
|
return deptList
|
||||||
if (dept.disabled) {
|
.filter(dept => !dept.disabled) // 直接过滤掉禁用的部门
|
||||||
return false
|
.map(dept => {
|
||||||
|
const newDept = {...dept}
|
||||||
|
if (newDept.children && newDept.children.length) {
|
||||||
|
newDept.children = this.filterDisabledDept(newDept.children)
|
||||||
}
|
}
|
||||||
if (dept.children && dept.children.length) {
|
// 如果 children 为空数组,干脆删除
|
||||||
dept.children = this.filterDisabledDept(dept.children)
|
if (!newDept.children || newDept.children.length === 0) {
|
||||||
|
delete newDept.children
|
||||||
}
|
}
|
||||||
return true
|
return newDept
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
// 筛选节点
|
// 筛选节点
|
||||||
filterNode(value, data) {
|
filterNode(value, data) {
|
||||||
if (!value) return true
|
if (!value) return true
|
||||||
|
|
@ -565,6 +619,28 @@ export default {
|
||||||
})
|
})
|
||||||
}).catch(() => {})*/
|
}).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
|
const userId = row.userId
|
||||||
|
|
@ -628,7 +704,8 @@ export default {
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.getList()
|
this.getList()
|
||||||
this.$modal.msgSuccess("删除成功")
|
this.$modal.msgSuccess("删除成功")
|
||||||
}).catch(() => {})
|
}).catch(() => {
|
||||||
|
})
|
||||||
},
|
},
|
||||||
/** 导出按钮操作 */
|
/** 导出按钮操作 */
|
||||||
handleExport() {
|
handleExport() {
|
||||||
|
|
@ -643,8 +720,7 @@ export default {
|
||||||
},
|
},
|
||||||
/** 下载模板操作 */
|
/** 下载模板操作 */
|
||||||
importTemplate() {
|
importTemplate() {
|
||||||
this.download('system/user/importTemplate', {
|
this.download('system/user/importTemplate', {}, `user_template_${new Date().getTime()}.xlsx`)
|
||||||
}, `user_template_${new Date().getTime()}.xlsx`)
|
|
||||||
},
|
},
|
||||||
// 文件上传中处理
|
// 文件上传中处理
|
||||||
handleFileUploadProgress(event, file, fileList) {
|
handleFileUploadProgress(event, file, fileList) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue