系统上线运行问题修改
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,62 +63,87 @@
|
||||||
|
|
||||||
<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>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
|
||||||
<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"
|
||||||
<!-- <el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns.nickName.visible" :show-overflow-tooltip="true" />-->
|
v-if="columns.userName.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="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="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"
|
||||||
<!-- <el-table-column label="状态" align="center" key="status" v-if="columns.status.visible">
|
v-if="columns.phonenumber.visible" width="120"/>
|
||||||
<template slot-scope="scope">
|
<!-- <el-table-column label="状态" align="center" key="status" v-if="columns.status.visible">
|
||||||
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
<template slot-scope="scope">
|
||||||
</template>
|
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
||||||
</el-table-column>
|
</template>
|
||||||
<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns.createTime.visible" width="160">
|
</el-table-column>
|
||||||
<template slot-scope="scope">
|
<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns.createTime.visible" width="160">
|
||||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
<template slot-scope="scope">
|
||||||
</template>
|
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||||
</el-table-column>-->
|
</template>
|
||||||
<el-table-column label="操作" align="center" width="180" class-name="small-padding fixed-width">
|
</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">
|
<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-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-delete" @click="handleDelete(scope.row)"
|
||||||
<el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
|
v-hasPermi="['system:user:remove']">删除
|
||||||
<el-dropdown-menu slot="dropdown">
|
</el-button>
|
||||||
<el-dropdown-item command="handleResetPwd" icon="el-icon-key" v-hasPermi="['system:user:resetPwd']">重置密码</el-dropdown-item>
|
<el-button size="mini" type="text" icon="el-icon-key" @click="handleResetPwd(scope.row)"
|
||||||
<el-dropdown-item command="handleAuthRole" icon="el-icon-circle-check" v-hasPermi="['system:user:edit']">分配角色</el-dropdown-item>
|
v-hasPermi="['system:user:resetPwd']">重置密码
|
||||||
</el-dropdown-menu>
|
</el-button>
|
||||||
</el-dropdown>-->
|
|
||||||
|
<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>
|
</template>
|
||||||
</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>
|
||||||
|
|
@ -123,14 +154,15 @@
|
||||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="用户名称" prop="userName">
|
<el-form-item label="用户名称" prop="userName">
|
||||||
<el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30" />
|
<el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<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>
|
||||||
|
|
@ -155,7 +189,7 @@
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="手机号码" prop="phonenumber">
|
<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-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,12 +236,21 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus, deptTreeSelect } from "@/api/system/user"
|
import {
|
||||||
import { listRole } from "@/api/system/role" // 导入角色API
|
listUser,
|
||||||
import { getToken } from "@/utils/auth"
|
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 Treeselect from "@riophae/vue-treeselect"
|
||||||
import "@riophae/vue-treeselect/dist/vue-treeselect.css"
|
import "@riophae/vue-treeselect/dist/vue-treeselect.css"
|
||||||
import { Splitpanes, Pane } from "splitpanes"
|
import {Splitpanes, Pane} from "splitpanes"
|
||||||
import "splitpanes/dist/splitpanes.css"
|
import "splitpanes/dist/splitpanes.css"
|
||||||
|
|
||||||
// 导入部门树组件
|
// 导入部门树组件
|
||||||
|
|
@ -270,7 +318,7 @@ export default {
|
||||||
// 是否更新已经存在的用户数据
|
// 是否更新已经存在的用户数据
|
||||||
updateSupport: 0,
|
updateSupport: 0,
|
||||||
// 设置上传的请求头部
|
// 设置上传的请求头部
|
||||||
headers: { Authorization: "Bearer " + getToken() },
|
headers: {Authorization: "Bearer " + getToken()},
|
||||||
// 上传的地址
|
// 上传的地址
|
||||||
url: process.env.VUE_APP_BASE_API + "/system/user/importData"
|
url: process.env.VUE_APP_BASE_API + "/system/user/importData"
|
||||||
},
|
},
|
||||||
|
|
@ -288,22 +336,22 @@ export default {
|
||||||
roleName: "",
|
roleName: "",
|
||||||
// 列信息
|
// 列信息
|
||||||
columns: {
|
columns: {
|
||||||
userId: { label: '用户编号', visible: true },
|
userId: {label: '用户编号', visible: true},
|
||||||
userName: { label: '用户名称', visible: true },
|
userName: {label: '用户名称', visible: true},
|
||||||
nickName: { label: '用户昵称', visible: true },
|
nickName: {label: '用户昵称', visible: true},
|
||||||
deptName: { label: '部门', visible: true },
|
deptName: {label: '部门', visible: true},
|
||||||
phonenumber: { label: '手机号码', visible: true },
|
phonenumber: {label: '手机号码', visible: true},
|
||||||
status: { label: '状态', visible: true },
|
status: {label: '状态', visible: true},
|
||||||
createTime: { label: '创建时间', visible: true }
|
createTime: {label: '创建时间', visible: true}
|
||||||
},
|
},
|
||||||
// 表单校验
|
// 表单校验
|
||||||
rules: {
|
rules: {
|
||||||
userName: [
|
userName: [
|
||||||
{ required: true, message: "用户名称不能为空", trigger: "blur" },
|
{required: true, message: "用户名称不能为空", trigger: "blur"},
|
||||||
{ min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
|
{min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur'}
|
||||||
],
|
],
|
||||||
phonenumber: [
|
phonenumber: [
|
||||||
{ required: true, message: '手机号码不能为空', trigger: 'blur' },
|
{required: true, message: '手机号码不能为空', trigger: 'blur'},
|
||||||
{
|
{
|
||||||
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
|
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
|
||||||
message: "请输入正确的手机号码",
|
message: "请输入正确的手机号码",
|
||||||
|
|
@ -311,16 +359,16 @@ export default {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
deptId: [
|
deptId: [
|
||||||
{ required: true, message: '部门不能为空', trigger: 'blur' }
|
{required: true, message: '部门不能为空', trigger: 'blur'}
|
||||||
],
|
],
|
||||||
postIds: [
|
postIds: [
|
||||||
{ required: true, message: '岗位不能为空', trigger: 'blur' }
|
{required: true, message: '岗位不能为空', trigger: 'blur'}
|
||||||
],
|
],
|
||||||
roleIds: [
|
roleIds: [
|
||||||
{ required: true, message: '角色不能为空', trigger: 'blur' }
|
{required: true, message: '角色不能为空', trigger: 'blur'}
|
||||||
],
|
],
|
||||||
permissions: [
|
permissions: [
|
||||||
{ type: 'array', required: true, message: '请至少选择一个权限', trigger: 'blur' }
|
{type: 'array', required: true, message: '请至少选择一个权限', trigger: 'blur'}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -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 (dept.children && dept.children.length) {
|
if (newDept.children && newDept.children.length) {
|
||||||
dept.children = this.filterDisabledDept(dept.children)
|
newDept.children = this.filterDisabledDept(newDept.children)
|
||||||
}
|
}
|
||||||
return true
|
// 如果 children 为空数组,干脆删除
|
||||||
})
|
if (!newDept.children || newDept.children.length === 0) {
|
||||||
|
delete newDept.children
|
||||||
|
}
|
||||||
|
return newDept
|
||||||
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
// 筛选节点
|
// 筛选节点
|
||||||
filterNode(value, data) {
|
filterNode(value, data) {
|
||||||
if (!value) return true
|
if (!value) return true
|
||||||
|
|
@ -429,11 +483,11 @@ export default {
|
||||||
// 用户状态修改
|
// 用户状态修改
|
||||||
handleStatusChange(row) {
|
handleStatusChange(row) {
|
||||||
let text = row.status === "0" ? "启用" : "停用"
|
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)
|
return changeUserStatus(row.userId, row.status)
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.$modal.msgSuccess(text + "成功")
|
this.$modal.msgSuccess(text + "成功")
|
||||||
}).catch(function() {
|
}).catch(function () {
|
||||||
row.status = row.status === "0" ? "1" : "0"
|
row.status = row.status === "0" ? "1" : "0"
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
@ -565,13 +619,35 @@ 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
|
||||||
this.$router.push("/system/user-auth/role/" + userId)
|
this.$router.push("/system/user-auth/role/" + userId)
|
||||||
},
|
},
|
||||||
/** 提交按钮 */
|
/** 提交按钮 */
|
||||||
submitForm: function() {
|
submitForm: function () {
|
||||||
this.$refs["form"].validate(valid => {
|
this.$refs["form"].validate(valid => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
// 保存原始的 postIds 和 roleIds 值
|
// 保存原始的 postIds 和 roleIds 值
|
||||||
|
|
@ -623,12 +699,13 @@ export default {
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
handleDelete(row) {
|
handleDelete(row) {
|
||||||
const userIds = row.userId || this.ids
|
const userIds = row.userId || this.ids
|
||||||
this.$modal.confirm('是否确认删除此数据项?').then(function() {
|
this.$modal.confirm('是否确认删除此数据项?').then(function () {
|
||||||
return delUser(userIds)
|
return delUser(userIds)
|
||||||
}).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) {
|
||||||
|
|
@ -655,7 +731,7 @@ export default {
|
||||||
this.upload.open = false
|
this.upload.open = false
|
||||||
this.upload.isUploading = false
|
this.upload.isUploading = false
|
||||||
this.$refs.upload.clearFiles()
|
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()
|
this.getList()
|
||||||
},
|
},
|
||||||
// 提交上传文件
|
// 提交上传文件
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue