公共服务平台-用户管理
This commit is contained in:
parent
2a4d6b82f1
commit
b6f9fab911
|
|
@ -0,0 +1,10 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
// 查询产品宣传物料
|
||||
export function getMaterialListAPI(data) {
|
||||
return request({
|
||||
url: '/screen/material/getMaterialList',
|
||||
method: 'POST',
|
||||
data,
|
||||
})
|
||||
}
|
||||
|
|
@ -1,25 +1,400 @@
|
|||
<template>
|
||||
<!-- 宣传物料 -->
|
||||
<div class="pro-materials"> 宣传物料,正在开发中,敬请期待... </div>
|
||||
<!-- 宣传物料 -->
|
||||
<div class="pro-materials">
|
||||
<div class="sidebar">
|
||||
<div
|
||||
:key="item.value"
|
||||
class="category-item"
|
||||
v-for="item in leftMenuList"
|
||||
@click="activeTypeValue = item.value"
|
||||
:class="{ active: activeTypeValue == item.value }"
|
||||
>
|
||||
{{ item.label }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content-area" ref="servicesGrid">
|
||||
<div
|
||||
:key="item.id"
|
||||
class="services-grid"
|
||||
v-for="item in showProMaterialsDuctList"
|
||||
>
|
||||
<div class="card-image" @click="previewDocs(item)">
|
||||
<ImagePreview
|
||||
:height="150"
|
||||
:borderRadius="10"
|
||||
:width="itemWidth"
|
||||
:src1="item.image"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="card-content" :style="{ width: itemWidth - 40 + 'px' }">
|
||||
<!-- 第一行:名称和版本 -->
|
||||
<el-tooltip :content="item.name" placement="top" :effect="'light'" :enterable="false">
|
||||
<div class="card-title-row">
|
||||
<span class="title-name">{{ item.name }}</span>
|
||||
<span class="title-version">{{ item.version }}</span>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
|
||||
<!-- 第二行:描述 + 按钮 -->
|
||||
<div class="card-footer">
|
||||
<el-tooltip :content="item.description" placement="top" :effect="'light'" :enterable="false">
|
||||
<span class="title-desc">{{ item.description }}</span>
|
||||
</el-tooltip>
|
||||
|
||||
<div
|
||||
class="primary-btn"
|
||||
|
||||
@click="handleDownload(item)"
|
||||
>
|
||||
下 载
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<DialogModel
|
||||
:dialogConfig="dialogConfig"
|
||||
@closeDialogOuter="handleCloseDialogOuter"
|
||||
>
|
||||
<template #outerContent>
|
||||
<div class="preview-docs">
|
||||
<iframe :src="iframeUrl" width="100%" height="100%" />
|
||||
</div>
|
||||
</template>
|
||||
</DialogModel>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import DialogModel from '@/components/DialogModel/index'
|
||||
import {getMaterialListAPI} from '@/api/publicService/proMaterials'
|
||||
import { encryptCBCTime } from '@/utils/aes'
|
||||
import useBase64 from '@/utils/base64Utils.js'
|
||||
|
||||
export default {
|
||||
name: 'ProMaterials',
|
||||
name: 'ProMaterials',
|
||||
components: {
|
||||
DialogModel,
|
||||
},
|
||||
dicts: ['tb_product_type'],
|
||||
data() {
|
||||
return {
|
||||
iframeUrl: '',
|
||||
activeTypeValue: 'all', // 当前激活的分类
|
||||
leftMenuList: [
|
||||
{
|
||||
label: '全部',
|
||||
value: 'all',
|
||||
},
|
||||
], // 左侧菜单列表
|
||||
proMaterialsListAll: [], // 所有材料列表
|
||||
showProMaterialsDuctList: [], // 需要显示的材料列表
|
||||
itemWidth: 0, // 材料卡片宽度
|
||||
dialogConfig: {
|
||||
outerTitle: '查看',
|
||||
outerVisible: false,
|
||||
outerWidth: '90%',
|
||||
minHeight: '90vh',
|
||||
},
|
||||
lookFile: 'http://192.168.0.14:8012/onlinePreview?url=',
|
||||
filePreviewPath: 'http://218.21.27.6:18013/onlinePreview?url=',
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getProductCenterListInScreenFun()
|
||||
},
|
||||
mounted() {
|
||||
// 监听字典数据加载完成事件
|
||||
this.$on('dictReady', (dict) => {
|
||||
this.initLeftMenuList()
|
||||
})
|
||||
|
||||
// 如果字典数据已经加载完成,直接初始化
|
||||
if (this.dict && this.dict.type && this.dict.type.tb_product_type) {
|
||||
this.initLeftMenuList()
|
||||
}
|
||||
|
||||
this.getItemWidth()
|
||||
},
|
||||
|
||||
methods: {
|
||||
// 获取产品卡片宽度
|
||||
getItemWidth() {
|
||||
this.itemWidth = (this.$refs.servicesGrid?.clientWidth - 120) / 4
|
||||
},
|
||||
|
||||
// 初始化左侧菜单列表
|
||||
initLeftMenuList() {
|
||||
try {
|
||||
if (
|
||||
this.dict &&
|
||||
this.dict.type &&
|
||||
this.dict.type.tb_product_type
|
||||
) {
|
||||
// 添加字典数据到菜单
|
||||
this.dict.type.tb_product_type.forEach((item) => {
|
||||
this.leftMenuList.push({
|
||||
label: item.label,
|
||||
value: item.value,
|
||||
})
|
||||
})
|
||||
}
|
||||
} catch (error) {
|
||||
}
|
||||
},
|
||||
// 下载
|
||||
handleDownload(service) {
|
||||
let url = service.filePath;
|
||||
|
||||
// 确保 URL 是完整的绝对路径
|
||||
if (!url.startsWith('http://') && !url.startsWith('https://')) {
|
||||
if (url.startsWith('www.')) {
|
||||
url = 'https://' + url;
|
||||
} else {
|
||||
url = 'https://' + url;
|
||||
}
|
||||
}
|
||||
|
||||
// 创建临时 a 标签来触发下载
|
||||
const link = document.createElement('a');
|
||||
link.href = url;
|
||||
link.download = ''; // 可指定文件名,如 'filename.zip';空字符串表示使用服务器原文件名
|
||||
link.target = '_blank'; // 兼容某些浏览器
|
||||
link.style.display = 'none';
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link); // 清理
|
||||
alert('下载成功')
|
||||
|
||||
/*// 确保 URL 是完整的绝对路径
|
||||
let url = service.filePath
|
||||
// 如果 URL 不是以 http:// 或 https:// 开头,则添加 https://
|
||||
if (!url.startsWith('http://') && !url.startsWith('https://')) {
|
||||
// 如果 URL 以 www. 开头,直接添加 https://
|
||||
if (url.startsWith('www.')) {
|
||||
url = 'https://' + url
|
||||
} else {
|
||||
// 其他情况,添加 https://
|
||||
url = 'https://' + url
|
||||
}
|
||||
}
|
||||
window.open(url, '_blank')*/
|
||||
},
|
||||
// 鼠标悬浮
|
||||
handleCardHover(serviceId) {
|
||||
this.hoveredCard = serviceId
|
||||
},
|
||||
// 鼠标离开
|
||||
handleCardLeave() {
|
||||
this.hoveredCard = null
|
||||
},
|
||||
|
||||
// 获取产品列表
|
||||
async getProductCenterListInScreenFun() {
|
||||
const res = await getMaterialListAPI({})
|
||||
this.proMaterialsListAll = res.rows
|
||||
this.showProMaterialsDuctList = this.proMaterialsListAll
|
||||
},
|
||||
|
||||
// 关闭弹框
|
||||
handleCloseDialogOuter() {
|
||||
this.dialogConfig.outerVisible = false
|
||||
},
|
||||
|
||||
// 预览文档
|
||||
previewDocs(item) {
|
||||
const { originalName, filePath } = item
|
||||
let filePreviewPath = ''
|
||||
let time = encryptCBCTime(Math.floor(Date.now()).toString())
|
||||
|
||||
const encodedPath = filePath.includes('http')
|
||||
? encodeURIComponent(useBase64.encode64(`${filePath}`))
|
||||
: encodeURIComponent(
|
||||
useBase64.encode64(`${this.lookFile}/${filePath}`),
|
||||
)
|
||||
filePreviewPath = `${this.lookFile}${encodedPath}&token=${time}`
|
||||
|
||||
const isEdgeOrOther = /Edg|Chrome|Firefox|Safari/.test(
|
||||
navigator.userAgent,
|
||||
)
|
||||
if (isEdgeOrOther) {
|
||||
const url = new URL(filePreviewPath)
|
||||
url.searchParams.append('preventDownload', 'true')
|
||||
filePreviewPath = url.toString()
|
||||
}
|
||||
|
||||
this.iframeUrl = filePreviewPath
|
||||
this.dialogConfig.outerVisible = true
|
||||
},
|
||||
},
|
||||
|
||||
// 监听分类变化
|
||||
watch: {
|
||||
activeTypeValue(newVal) {
|
||||
if (newVal === 'all') {
|
||||
this.showProMaterialsDuctList = this.proMaterialsListAll
|
||||
} else {
|
||||
this.showProMaterialsDuctList = this.proMaterialsListAll.filter(
|
||||
(item) => item.typeId === Number(newVal),
|
||||
)
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
<style scoped lang="scss">
|
||||
.pro-materials {
|
||||
width: 100%;
|
||||
width: 100%;
|
||||
height: 100%; /* 设置视口高度 */
|
||||
display: flex;
|
||||
margin: 0 auto;
|
||||
padding: 40px 20px 0;
|
||||
gap: 24px;
|
||||
box-sizing: border-box; /* 确保padding包含在高度内 */
|
||||
|
||||
/* 左侧分类菜单 */
|
||||
.sidebar {
|
||||
width: 160px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.content-area {
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
background-color: #f0f2f5;
|
||||
font-size: 16px;
|
||||
color: #333;
|
||||
text-align: center;
|
||||
line-height: 1.5;
|
||||
letter-spacing: 1px;
|
||||
font-weight: 600;
|
||||
font-family: 'Arial', sans-serif;
|
||||
padding-bottom: 20px;
|
||||
padding-right: 12px;
|
||||
padding-top: 2px;
|
||||
max-height: calc(100vh - 80px); /* 减去顶部padding */
|
||||
overflow-y: auto;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 20px;
|
||||
|
||||
.services-grid {
|
||||
height: 260px; /* 给子元素设置固定高度以便测试滚动 */
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-sizing: border-box;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
transition: all 0.3s ease;
|
||||
border: 1px solid #d6d1d1;
|
||||
border-radius: 10px;
|
||||
align-content: flex-start;
|
||||
justify-items: center;
|
||||
|
||||
// background-color: skyblue;
|
||||
}
|
||||
|
||||
.card-image {
|
||||
height: 165px;
|
||||
border-top-left-radius: 10px;
|
||||
border-top-right-radius: 10px;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-sizing: border-box;
|
||||
border-bottom: 1px solid #d6d1d1;
|
||||
}
|
||||
|
||||
.services-grid:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
|
||||
.card-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.card-title-row,
|
||||
.card-footer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
width: 100%;
|
||||
min-height: 24px;
|
||||
}
|
||||
|
||||
.title-name {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.title-version {
|
||||
flex-shrink: 0;
|
||||
color: #999;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.card-footer {
|
||||
justify-content: space-between; /* 描述左对齐,按钮右对齐 */
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.title-desc {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.primary-btn {
|
||||
flex-shrink: 0;
|
||||
padding: 4px 12px;
|
||||
background: linear-gradient(180deg, #00c7ef 0%, #005eef 100%);
|
||||
color: white;
|
||||
border-radius: 4px;
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.primary-btn.isDisabled {
|
||||
cursor: not-allowed;
|
||||
opacity: 0.6;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.category-item {
|
||||
padding: 12px 16px;
|
||||
margin-bottom: 8px;
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.category-item:hover {
|
||||
background-color: #f0f7ff;
|
||||
color: #4a90e2;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
.category-item.active {
|
||||
background: url('../../../assets/images/publicService/btn-sel.png') no-repeat center center;
|
||||
background-size: 100% 100%;
|
||||
color: white;
|
||||
}
|
||||
.preview-docs {
|
||||
width: 100%;
|
||||
height: 79vh;
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -99,7 +99,8 @@
|
|||
|
||||
<el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="角色编号" prop="roleId" width="120" />
|
||||
<!-- <el-table-column label="角色编号" prop="roleId" width="120" />-->
|
||||
<el-table-column label="角色编号" align="center" type="index" width="120" />
|
||||
<el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" />
|
||||
<el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" />
|
||||
<el-table-column label="显示顺序" prop="roleSort" width="100" />
|
||||
|
|
@ -142,7 +143,7 @@
|
|||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['system:role:remove']"
|
||||
>删除</el-button>
|
||||
<el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']">
|
||||
<!-- <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']">
|
||||
<el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item command="handleDataScope" icon="el-icon-circle-check"
|
||||
|
|
@ -150,7 +151,7 @@
|
|||
<el-dropdown-item command="handleAuthUser" icon="el-icon-user"
|
||||
v-hasPermi="['system:role:edit']">分配用户</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</el-dropdown>-->
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,20 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="head-container">
|
||||
<el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px" />
|
||||
<el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search"
|
||||
style="margin-bottom: 20px"/>
|
||||
<!-- 新增:展开/折叠按钮 -->
|
||||
<div style="text-align: center">
|
||||
<span style="color: #606266;"> 组织架构 </span>
|
||||
<el-button
|
||||
type="info"
|
||||
plain
|
||||
icon="el-icon-sort"
|
||||
size="mini"
|
||||
@click="toggleExpandAll"
|
||||
>展开/折叠
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="head-container">
|
||||
|
|
@ -26,6 +39,7 @@
|
|||
@click.stop="() => handleAddDept(data)"
|
||||
v-hasPermi="['system:dept:add']"
|
||||
title="新增子部门"
|
||||
:disabled="node.level >= 3"
|
||||
></el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
|
|
@ -55,38 +69,39 @@
|
|||
<el-row>
|
||||
<el-col :span="24" v-if="deptForm.parentId !== 0">
|
||||
<el-form-item label="上级部门" prop="parentId">
|
||||
<treeselect v-model="deptForm.parentId" :options="deptOptionsForDialog" :normalizer="normalizer" placeholder="选择上级部门" />
|
||||
<treeselect v-model="deptForm.parentId" :options="deptOptionsForDialog" :normalizer="normalizer"
|
||||
placeholder="选择上级部门"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="部门名称" prop="deptName">
|
||||
<el-input v-model="deptForm.deptName" placeholder="请输入部门名称" />
|
||||
<el-input v-model="deptForm.deptName" placeholder="请输入部门名称"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="显示排序" prop="orderNum">
|
||||
<el-input-number v-model="deptForm.orderNum" controls-position="right" :min="0" />
|
||||
<el-input-number v-model="deptForm.orderNum" controls-position="right" :min="0"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="负责人" prop="leader">
|
||||
<el-input v-model="deptForm.leader" placeholder="请输入负责人" maxlength="20" />
|
||||
<el-input v-model="deptForm.leader" placeholder="请输入负责人" maxlength="20"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="联系电话" prop="phone">
|
||||
<el-input v-model="deptForm.phone" placeholder="请输入联系电话" maxlength="11" />
|
||||
<el-input v-model="deptForm.phone" placeholder="请输入联系电话" maxlength="11"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="邮箱" prop="email">
|
||||
<el-input v-model="deptForm.email" placeholder="请输入邮箱" maxlength="50" />
|
||||
<el-input v-model="deptForm.email" placeholder="请输入邮箱" maxlength="50"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
|
|
@ -96,7 +111,8 @@
|
|||
v-for="dict in dict.type.sys_normal_disable"
|
||||
:key="dict.value"
|
||||
:label="dict.value"
|
||||
>{{dict.label}}</el-radio>
|
||||
>{{ dict.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
|
@ -111,14 +127,14 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept"
|
||||
import {listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild} from "@/api/system/dept"
|
||||
import Treeselect from "@riophae/vue-treeselect"
|
||||
import "@riophae/vue-treeselect/dist/vue-treeselect.css"
|
||||
|
||||
export default {
|
||||
name: "DeptTreeWithOperations",
|
||||
dicts: ['sys_normal_disable'],
|
||||
components: { Treeselect },
|
||||
components: {Treeselect},
|
||||
props: {
|
||||
deptOptions: {
|
||||
type: Array,
|
||||
|
|
@ -134,6 +150,7 @@ export default {
|
|||
},
|
||||
data() {
|
||||
return {
|
||||
isTreeExpanded: true, // 当前是否已展开(false 表示当前是收起状态,应显示“展开”)
|
||||
deptName: undefined,
|
||||
deptOpen: false, // 是否显示部门弹出层
|
||||
deptTitle: "", // 部门弹出层标题
|
||||
|
|
@ -142,13 +159,13 @@ export default {
|
|||
// 部门表单校验
|
||||
deptRules: {
|
||||
parentId: [
|
||||
{ required: true, message: "上级部门不能为空", trigger: "blur" }
|
||||
{required: true, message: "上级部门不能为空", trigger: "blur"}
|
||||
],
|
||||
deptName: [
|
||||
{ required: true, message: "部门名称不能为空", trigger: "blur" }
|
||||
{required: true, message: "部门名称不能为空", trigger: "blur"}
|
||||
],
|
||||
orderNum: [
|
||||
{ required: true, message: "显示排序不能为空", trigger: "blur" }
|
||||
{required: true, message: "显示排序不能为空", trigger: "blur"}
|
||||
],
|
||||
email: [
|
||||
{
|
||||
|
|
@ -215,7 +232,7 @@ export default {
|
|||
listDeptExcludeChild(deptId).then(response => {
|
||||
this.deptOptionsForDialog = this.handleTree(response.data, "deptId")
|
||||
if (this.deptOptionsForDialog.length == 0) {
|
||||
const noResultsOptions = { deptId: this.deptForm.parentId, deptName: this.deptForm.parentName, children: [] }
|
||||
const noResultsOptions = {deptId: this.deptForm.parentId, deptName: this.deptForm.parentName, children: []}
|
||||
this.deptOptionsForDialog.push(noResultsOptions)
|
||||
}
|
||||
})
|
||||
|
|
@ -225,12 +242,13 @@ export default {
|
|||
handleDeleteDept(data) {
|
||||
const deptName = data.label
|
||||
const deptId = data.id
|
||||
this.$modal.confirm('是否确认删除名称为"' + deptName + '"的数据项?').then(function() {
|
||||
this.$modal.confirm('是否确认删除名称为"' + deptName + '"的数据项?').then(function () {
|
||||
return delDept(deptId)
|
||||
}).then(() => {
|
||||
this.$emit('dept-deleted')
|
||||
this.$modal.msgSuccess("删除成功")
|
||||
}).catch(() => {})
|
||||
}).catch(() => {
|
||||
})
|
||||
},
|
||||
/** 部门表单重置 */
|
||||
resetDeptForm() {
|
||||
|
|
@ -313,8 +331,36 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tree
|
||||
}
|
||||
},
|
||||
|
||||
toggleExpandAll() {
|
||||
if (this.isTreeExpanded) {
|
||||
// 当前是展开状态,执行折叠
|
||||
this.collapseAll();
|
||||
this.isTreeExpanded = false;
|
||||
} else {
|
||||
// 当前是折叠状态,执行展开
|
||||
this.expandAll();
|
||||
this.isTreeExpanded = true;
|
||||
}
|
||||
},
|
||||
|
||||
// 展开所有节点
|
||||
expandAll() {
|
||||
this.$refs.tree.store.root.childNodes.forEach(node => {
|
||||
node.expanded = true;
|
||||
});
|
||||
},
|
||||
|
||||
// 折叠所有节点
|
||||
collapseAll() {
|
||||
this.$refs.tree.store.root.childNodes.forEach(node => {
|
||||
node.expanded = false;
|
||||
});
|
||||
},
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -65,23 +65,28 @@
|
|||
<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-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-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></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" key="userId" prop="userId" v-if="columns.userId.visible" />
|
||||
<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="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="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">
|
||||
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
||||
</template>
|
||||
|
|
@ -90,18 +95,19 @@
|
|||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
|
||||
</el-table-column>-->
|
||||
<el-table-column label="操作" align="center" width="180" 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-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-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-dropdown>-->
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
|
@ -117,76 +123,39 @@
|
|||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="用户昵称" prop="nickName">
|
||||
<el-input v-model="form.nickName" 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="请选择归属部门" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="手机号码" prop="phonenumber">
|
||||
<el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="邮箱" prop="email">
|
||||
<el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item v-if="form.userId == undefined" label="用户名称" prop="userName">
|
||||
<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 v-if="form.userId == undefined" label="用户密码" prop="password">
|
||||
<el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20" show-password />
|
||||
<el-form-item label="部门" prop="deptId">
|
||||
<treeselect v-model="form.deptId" :options="enabledDeptOptions" :show-count="true" placeholder="请选择部门" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="用户性别">
|
||||
<el-select v-model="form.sex" placeholder="请选择性别">
|
||||
<el-option v-for="dict in dict.type.sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="状态">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio v-for="dict in dict.type.sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="岗位">
|
||||
<el-select v-model="form.postIds" multiple placeholder="请选择岗位">
|
||||
<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-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="角色">
|
||||
<el-select v-model="form.roleIds" multiple placeholder="请选择角色">
|
||||
<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-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注">
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="手机号码" prop="phonenumber">
|
||||
<el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
|
@ -322,27 +291,22 @@ export default {
|
|||
{ required: true, message: "用户名称不能为空", trigger: "blur" },
|
||||
{ min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
|
||||
],
|
||||
nickName: [
|
||||
{ required: true, message: "用户昵称不能为空", trigger: "blur" }
|
||||
],
|
||||
password: [
|
||||
{ required: true, message: "用户密码不能为空", trigger: "blur" },
|
||||
{ min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' },
|
||||
{ pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }
|
||||
],
|
||||
email: [
|
||||
{
|
||||
type: "email",
|
||||
message: "请输入正确的邮箱地址",
|
||||
trigger: ["blur", "change"]
|
||||
}
|
||||
],
|
||||
phonenumber: [
|
||||
{ required: true, message: '手机号码不能为空', trigger: 'blur' },
|
||||
{
|
||||
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
|
||||
message: "请输入正确的手机号码",
|
||||
trigger: "blur"
|
||||
}
|
||||
],
|
||||
deptId: [
|
||||
{ required: true, message: '部门不能为空', trigger: 'blur' }
|
||||
],
|
||||
postIds: [
|
||||
{ required: true, message: '岗位不能为空', trigger: 'blur' }
|
||||
],
|
||||
roleIds: [
|
||||
{ required: true, message: '角色不能为空', trigger: 'blur' }
|
||||
]
|
||||
},
|
||||
}
|
||||
|
|
@ -380,8 +344,9 @@ export default {
|
|||
},
|
||||
/** 获取角色列表 */
|
||||
getRoleList() {
|
||||
listRole().then(response => {
|
||||
return listRole().then(response => {
|
||||
this.roleOptions = response.rows
|
||||
return response
|
||||
})
|
||||
},
|
||||
|
||||
|
|
@ -539,8 +504,8 @@ export default {
|
|||
this.form = response.data
|
||||
this.postOptions = response.posts
|
||||
this.roleOptions = response.roles
|
||||
this.$set(this.form, "postIds", response.postIds)
|
||||
this.$set(this.form, "roleIds", response.roleIds)
|
||||
this.$set(this.form, "postIds", Number(response.postIds))
|
||||
this.$set(this.form, "roleIds", Number(response.roleIds))
|
||||
this.open = true
|
||||
this.title = "修改用户"
|
||||
this.form.password = ""
|
||||
|
|
@ -548,7 +513,12 @@ export default {
|
|||
},
|
||||
/** 重置密码按钮操作 */
|
||||
handleResetPwd(row) {
|
||||
this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
|
||||
const value = 'Bonus@admin123';
|
||||
resetUserPwd(row.userId, value).then(response => {
|
||||
this.$modal.msgSuccess("重置成功,新密码是:" + value)
|
||||
})
|
||||
|
||||
/*this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
closeOnClickModal: false,
|
||||
|
|
@ -563,7 +533,7 @@ export default {
|
|||
resetUserPwd(row.userId, value).then(response => {
|
||||
this.$modal.msgSuccess("修改成功,新密码是:" + value)
|
||||
})
|
||||
}).catch(() => {})
|
||||
}).catch(() => {})*/
|
||||
},
|
||||
/** 分配角色操作 */
|
||||
handleAuthRole: function(row) {
|
||||
|
|
@ -574,17 +544,31 @@ export default {
|
|||
submitForm: function() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (valid) {
|
||||
// 保存原始的 postIds 和 roleIds 值
|
||||
const originalPostIds = this.form.postIds;
|
||||
const originalRoleIds = this.form.roleIds;
|
||||
|
||||
this.form.postIds = Array.isArray(this.form.postIds) ? this.form.postIds : [this.form.postIds];
|
||||
this.form.roleIds = Array.isArray(this.form.roleIds) ? this.form.roleIds : [this.form.roleIds];
|
||||
if (this.form.userId != undefined) {
|
||||
updateUser(this.form).then(response => {
|
||||
this.$modal.msgSuccess("修改成功")
|
||||
this.open = false
|
||||
this.getList()
|
||||
}).catch(() => {
|
||||
// 如果更新失败,恢复原始值
|
||||
this.form.postIds = originalPostIds;
|
||||
this.form.roleIds = originalRoleIds;
|
||||
})
|
||||
} else {
|
||||
addUser(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功")
|
||||
this.open = false
|
||||
this.getList()
|
||||
}).catch(() => {
|
||||
// 如果更新失败,恢复原始值
|
||||
this.form.postIds = originalPostIds;
|
||||
this.form.roleIds = originalRoleIds;
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -593,7 +577,7 @@ export default {
|
|||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const userIds = row.userId || this.ids
|
||||
this.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function() {
|
||||
this.$modal.confirm('是否确认删除此数据项?').then(function() {
|
||||
return delUser(userIds)
|
||||
}).then(() => {
|
||||
this.getList()
|
||||
|
|
|
|||
Loading…
Reference in New Issue