提交 1b479add authored 作者: Administrator's avatar Administrator

更新代码

上级 be6baf29
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
"eslint": "^8.4.1", "eslint": "^8.4.1",
"eslint-plugin-vue": "^8.2.0", "eslint-plugin-vue": "^8.2.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mockjs": "^1.1.0",
"moment": "^2.29.1", "moment": "^2.29.1",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"qs": "^6.10.3", "qs": "^6.10.3",
...@@ -30,20 +29,16 @@ ...@@ -30,20 +29,16 @@
}, },
"devDependencies": { "devDependencies": {
"@types/lodash": "^4.14.182", "@types/lodash": "^4.14.182",
"@types/mockjs": "^1.0.4",
"@types/node": "^16.11.12", "@types/node": "^16.11.12",
"@types/qs": "^6.9.7", "@types/qs": "^6.9.7",
"@vitejs/plugin-vue": "^2.3.1", "@vitejs/plugin-vue": "^2.3.1",
"node-sass": "^7.0.0", "sass": "^1.86.0",
"sass": "^1.44.0",
"sass-loader": "^12.4.0",
"typescript": "^4.4.3", "typescript": "^4.4.3",
"unplugin-auto-import": "^0.7.1", "unplugin-auto-import": "^0.7.1",
"unplugin-icons": "^0.14.3", "unplugin-icons": "^0.14.3",
"unplugin-vue-components": "^0.19.3", "unplugin-vue-components": "^0.19.3",
"vite": "^2.6.14", "vite": "^2.6.14",
"vite-plugin-inspect": "^0.5.0", "vite-plugin-inspect": "^0.5.0",
"vite-plugin-mock": "^2.9.6",
"vite-plugin-svg-icons": "^2.0.1", "vite-plugin-svg-icons": "^2.0.1",
"vue-tsc": "^0.3.0" "vue-tsc": "^0.3.0"
}, },
......
<script lang="ts"> <script lang="ts" setup>
import { ElConfigProvider } from "element-plus"; import { ElConfigProvider } from "element-plus";
import zhCn from "element-plus/lib/locale/lang/zh-cn"; import locale from "element-plus/es/locale/lang/zh-cn";
export default { </script>
components: {
[ElConfigProvider.name]: ElConfigProvider, <template>
}, <el-config-provider :locale="locale">
setup() { <router-view></router-view>
let locale = zhCn; </el-config-provider>
return { </template>
locale,
}; <style lang="scss">
}, .margin-bottom-10 {
}; margin-bottom: 10px;
</script> }
<template> /* 1px边框适配 */
<el-config-provider :locale="locale"> .border-top-1px {
<router-view></router-view> position: relative;
</el-config-provider> &::after {
</template> content: "";
position: absolute;
<style lang="scss"> top: 0;
.margin-bottom-10 { left: 0;
margin-bottom: 10px; width: 100%;
} border-top: 1px solid #e1e1e1;
transform: scaleY(0.5);
/* 1px边框适配 */ }
.border-top-1px { }
position: relative; .border-bottom-1px {
&::after { position: relative;
content: ""; &::after {
position: absolute; content: "";
top: 0; position: absolute;
left: 0; bottom: 0;
width: 100%; left: 0;
border-top: 1px solid #e1e1e1; width: 100%;
transform: scaleY(0.5); border-bottom: 1px solid #e0e0e0;
} transform: scaleY(0.4);
} }
.border-bottom-1px { }
position: relative; .border-left-1px {
&::after { position: relative;
content: ""; &::after {
position: absolute; content: "";
bottom: 0; position: absolute;
left: 0; bottom: 0;
width: 100%; left: 0;
border-bottom: 1px solid #e0e0e0; height: 100%;
transform: scaleY(0.4); border-left: 1px solid #e0e0e0;
} transform: scaleX(0.4);
} }
.border-left-1px { }
position: relative;
&::after { /* 1px边框适配end */
content: ""; /* flex布局 */
position: absolute; /* 两端对齐 */
bottom: 0; .space-between {
left: 0; display: flex;
height: 100%; align-items: center;
border-left: 1px solid #e0e0e0; justify-content: space-between;
transform: scaleX(0.4); }
} /* 垂直居中对齐 */
} .flex-center-h {
display: flex;
/* 1px边框适配end */ align-items: center;
/* flex布局 */ }
/* 两端对齐 */
.space-between { /* 垂直水平居中对齐 */
display: flex; .flex-center {
align-items: center; display: flex;
justify-content: space-between; align-items: center;
} justify-content: center;
/* 垂直居中对齐 */ }
.flex-center-h {
display: flex; /* 上下贴边 子class 宽度需100% */
align-items: center; .align-content {
} display: flex;
flex-flow: wrap;
/* 垂直水平居中对齐 */ align-content: space-between;
.flex-center { }
display: flex; /* flex布局end */
align-items: center; .font12 {
justify-content: center; font-size: 12px;
} }
.font14 {
/* 上下贴边 子class 宽度需100% */ font-size: 14px;
.align-content { }
display: flex; .font16 {
flex-flow: wrap; font-size: 16px;
align-content: space-between; }
} /* 超出省略... */
/* flex布局end */ .over1 {
.font12 { overflow: hidden;
font-size: 12px; text-overflow: ellipsis;
} word-break: break-all;
.font14 { display: -webkit-box;
font-size: 14px; -webkit-line-clamp: 1;
} -webkit-box-orient: vertical;
.font16 {
font-size: 16px; display: -moz-box;
} -moz-line-clamp: 1 !important;
/* 超出省略... */ -moz-box-orient: vertical;
.over1 { }
overflow: hidden;
text-overflow: ellipsis; .over2 {
word-break: break-all; overflow: hidden;
display: -webkit-box; text-overflow: ellipsis;
-webkit-line-clamp: 1; word-break: break-all;
-webkit-box-orient: vertical;
display: -webkit-box;
display: -moz-box; -webkit-line-clamp: 2;
-moz-line-clamp: 1 !important; -webkit-box-orient: vertical;
-moz-box-orient: vertical;
} display: -moz-box;
-moz-line-clamp: 2 !important;
.over2 { -moz-box-orient: vertical;
overflow: hidden; }
text-overflow: ellipsis;
word-break: break-all; .over3 {
overflow: hidden;
display: -webkit-box; text-overflow: ellipsis;
-webkit-line-clamp: 2; word-break: break-all;
-webkit-box-orient: vertical;
display: -webkit-box;
display: -moz-box; -webkit-line-clamp: 3;
-moz-line-clamp: 2 !important; -webkit-box-orient: vertical;
-moz-box-orient: vertical;
} display: -moz-box;
-moz-line-clamp: 3 !important;
.over3 { -moz-box-orient: vertical;
overflow: hidden; }
text-overflow: ellipsis; /* 超出省略...end */
word-break: break-all; </style>
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
display: -moz-box;
-moz-line-clamp: 3 !important;
-moz-box-orient: vertical;
}
/* 超出省略...end */
</style>
$color-primary: #007aff; $color-primary: #007aff;
@import "./body.scss"; @use "./body.scss";
@import "./common.scss"; @use "./common.scss";
@import "./layout.scss"; @use "./layout.scss";
\ No newline at end of file \ No newline at end of file
//自定义按钮权限指令 //自定义按钮权限指令
import { Directive } from 'vue' import { Directive } from "vue";
import { store } from '@/store/index'; import { store } from "@/store/index";
export const permission: Directive = { export const permission: Directive = {
mounted(el, binding) { mounted(el, binding) {
//value按钮上的权限 //value按钮上的权限
const { value } = binding; const { value } = binding;
//获取用户所有的权限 //获取用户所有的权限
const permissions = store.getters['user/getPermissions']; const permissions = store.getters["user/getPermissions"];
console.log('所有的权限') //判断传递进来的按钮权限,是否存在
console.log(permissions) if (value && value instanceof Array && value.length > 0) {
//判断传递进来的按钮权限,是否存在 const permissionRoles = value;
if (value && value instanceof Array && value.length > 0) { //判断传递进来的按钮权限字段,是否存在当前用户的permissions
const permissionRoles = value; const hasPermission = permissions.some((role) => {
//判断传递进来的按钮权限字段,是否存在当前用户的permissions return permissionRoles.includes(role);
const hasPermission = permissions.some((role) => { });
return permissionRoles.includes(role) if (!hasPermission) {
}) //没有权限时,影藏
if (!hasPermission) { //没有权限时,影藏 el.style.display = "none";
el.style.display = 'none' }
} } else {
} else { throw new Error("当前没有权限!");
throw new Error('当前没有权限!') }
} },
} };
}
\ No newline at end of file
import { createApp } from 'vue' import { createApp } from "vue";
import App from './App.vue' import App from "./App.vue";
// 注入路由 // 注入路由
import router from './router'; import router from "./router";
import { start, close } from '@/utils/nprogress' import { getToken, cleanSession } from "@/utils/auth";
import { getToken, cleanSession, getMenu } from '@/utils/auth' import { store, key } from "@/store";
import { elNotificaton } from '@/utils/customemessage' import * as ElIconModules from "@element-plus/icons-vue";
import '@/mock' //生产时请注释掉, //全局添加组件
import { filterAsyncRoutes } from '@/store/modules/menu' // 全局注入ui组件库,按需引入迁移到vite.config.ts配置
import { store, key } from '@/store' import ElementPlus from "element-plus";
import * as ElIconModules from '@element-plus/icons-vue' import "element-plus/dist/index.css";
//全局添加组件 import { CopyData, resetForm } from "./utils/common";
// 全局注入ui组件库,按需引入迁移到vite.config.ts配置 import LqConfirm from "./utils/LqConfirm";
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css' //引入按钮权限
import { CopyData, resetForm } from './utils/common'; import { permission } from "./directives/permission";
import LqConfirm from './utils/LqConfirm'
//引入echarts // 国际
import * as echarts from 'echarts' import i18n from "@/lang/index";
//引入按钮权限
import { permission } from './directives/permission' //注册svg图标脚本
//引入socket import "virtual:svg-icons-register";
import SocketService from '@/socket/main' import GlobalComponents from "./global-components";
// SocketService.Instance.connect();
const whiteList = ["/login"]; //白名单
// 国际化 // 设置路由导航守卫
import i18n from "@/lang/index"; router.beforeEach(async (to, from, next) => {
//设置标题
//注册svg图标脚本 if (to.meta.title) {
import 'virtual:svg-icons-register' document.title = String(to.meta.title);
import GlobalComponents from './global-components'; } else {
document.title = import.meta.env.VITE_APP_TITLE;
const whiteList = ['/login']; //白名单 }
// 设置路由导航守卫 //获取token
router.beforeEach(async (to, from, next) => { let token = getToken();
//设置标题 if (token) {
if (to.meta.title) { if (to.path === "/login" || to.path === "/") {
document.title = String(to.meta.title) next({ path: "/" });
} } else {
else { if (store.state.menu.menuList.length == 1) {
document.title = import.meta.env.VITE_APP_TITLE; try {
} await store.dispatch("user/getInfo");
//获取token await store.dispatch("menu/getMenuList", router);
let token = getToken(); next({ ...to, replace: true });
if (token) { } catch (error) {
if (to.path === '/login' || to.path === '/') { cleanSession();
next({ path: '/' }) next({ path: "/login" });
} else { }
if (store.state.menu.menuList.length == 1) { } else {
try { next();
await store.dispatch('user/getInfo') }
await store.dispatch('menu/getMenuList', router) }
next({ ...to, replace: true }) } else {
} catch (error) { //判断是否在白名单中
cleanSession(); if (whiteList.indexOf(to.path) !== -1) {
next({ path: '/login' }) //存在白名单,放行
} next();
} else {
} else { //不存在,登录
next() next({ path: "/login" });
} }
} }
} else { });
//判断是否在白名单中
if (whiteList.indexOf(to.path) !== -1) { //存在白名单,放行 const app = createApp(App);
next(); Object.keys(ElIconModules).forEach((key) => {
} else { //不存在,登录 app.component(key, ElIconModules[key as keyof typeof ElIconModules]);
next({ path: '/login' }) });
} app.use(store, key);
} app.use(router);
}) app.use(ElementPlus);
app.use(i18n);
app.mount("#app");
const app = createApp(App); //注册
Object.keys(ElIconModules).forEach((key) => { app.directive("permission", permission);
app.component(key, ElIconModules[key as keyof typeof ElIconModules])
}); GlobalComponents(app);
app.use(store, key)
app.use(router); //清空表单
app.use(ElementPlus) app.config.globalProperties.$resetForm = resetForm;
app.use(i18n); //对象复制
app.mount('#app'); app.config.globalProperties.$objCoppy = CopyData;
//注册 //确定弹框
app.directive('permission', permission); app.config.globalProperties.$lqconfirm = LqConfirm;
GlobalComponents(app)
//清空表单
app.config.globalProperties.$resetForm = resetForm;
//对象复制
app.config.globalProperties.$objCoppy = CopyData;
//确定弹框
app.config.globalProperties.$lqconfirm = LqConfirm;
// 路由加载结束后执行
router.afterEach(() => {
close()
})
import Mock from 'mockjs'
Mock.mock(`${import.meta.env.VITE_APP_BASE_URL}/department/index`, {
code: 200,
'data|1-10': [
{
"id|+1": 0,
cname: '@cname',
ename: '@name',
'type|+1': 0 ,
'code|+1': 'code001',
'children|1-10': [
{
"id|+1": 10,
cname: '@cname',
ename: '@name',
'type|+1': 0,
'code|+1': 'code002',
'children|1-10': [
{
"id|+1": 20,
cname: '@cname',
ename: '@name',
'type|+1': 0,
'code|+1': 'code003',
}
]
}
]
}
],
msg: null,
success: true
})
Mock.mock(`${import.meta.env.VITE_APP_BASE_URL}/department/bizunit`, {
code: 200,
'data|1-10': [
{
"id|+1": 0,
cname: '@cname',
ename: '@name',
'depart|+1': '' ,
'product': '',
'code|+1': 'code001'
}
],
msg: null,
success: true
})
import Mock from "mockjs";
import '@/mock/login'
import '@/mock/table'
import '@/mock/departmentManage'
import '@/mock/project'
// 设置全局延时
Mock.setup({
timeout: '300-600'
})
\ No newline at end of file
import Mock from "mockjs";
// Mock.mock(`${import.meta.env.VITE_APP_BASE_URL}/login`, 'post', ({body}) => {
// let result = {data: {},code:0,message:''}
// const {name, password} = JSON.parse(body)
//
// let success = false
//
// if (success) {
// result.code = 0
// result.message = Mock.mock('@TIMEFIX').CN + ',欢迎回来'
//
// result.data = {"msg":"欢迎回来",'token':"iwoefwietowewewo"}
// } else {
// result.code = -1
// result.message = '账户名或密码错误(admin/888888 or test/888888)'
// }
// return result
// })
\ No newline at end of file
import Mock from 'mockjs'
Mock.mock(`${import.meta.env.VITE_APP_BASE_URL}/project/projectType`, {
code: 200,
'data|1-100': [
{
"id|+1": 0,
cname: '@cname',
ename: '@name',
'code|+1': 'code001',
'bizunits': [],
'effect_time': '@date',
'lose_effect_time': '@date',
'detail': ''
}
],
msg: null,
success: true
})
Mock.mock(`${import.meta.env.VITE_APP_BASE_URL}/project/projectMaster`, {
code: 200,
'data|1-10': [
{
"id|+1": 0,
bizUnit: '研发事业部',
classificationIds: '',
classificationName: 'code001',
createTime: '@date',
'isEnabled|1': false,
name: '@cname',
notes: null,
'templatePhases|1-5': [
{
data: null,
children: [],
displayShow: null,
isLeaf: true,
'id|+1': 0,
label: '@cname',
'selected|1': false,
text: '',
title: '',
value: ''
}
]
}
],
msg: null,
success: true
})
import Mock from 'mockjs'
Mock.mock(`${import.meta.env.VITE_APP_BASE_URL}/systemMenus/index`, {
code: 200,
data: {
'treeList|1-10': [
{
"id|+1": 0,
icon: '',
lable: '@cname',
parentId: '',
'sort|0-100': 0,
'show|1': false,
controller: '@name',
url: '/index'
}
]
},
msg: null,
success: true
})
import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router"; import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router";
import Layout from '@/layout/index.vue' import Layout from "@/layout/index.vue";
const routes: Array<RouteRecordRaw> = [ import { start, close } from "@/utils/nprogress";
{
path: '/', const routes: Array<RouteRecordRaw> = [
component: Layout, {
redirect: '/licInformation', path: "/",
}, component: Layout,
{ redirect: "/licInformation",
path: '/login', children: [],
name: 'login', },
component: () => import("@/views/login/login.vue"), {
}, path: "/login",
{ name: "login",
path: '/404', component: () => import("@/views/login/login.vue"),
name: '404', },
component: () => import("@/views/exception/404.vue") {
}, path: "/404",
// { name: "404",
// path: '/:catchAll(.*)', component: () => import("@/views/exception/404.vue"),
// redirect: '/404' },
// } ];
]
export const asyncRoutes: Array<RouteRecordRaw> = [];
export const asyncRoutes: Array<RouteRecordRaw> = []
const router = createRouter({
history: createWebHashHistory(),
const router = createRouter({ routes,
history: createWebHashHistory(), });
// routes = routes:routes
routes router.beforeEach(() => {
}) start();
});
export function addRoutes(routes:any){
router.addRoute(routes) router.afterEach(() => {
} close();
});
export default router;
export function addRoutes(routes: any) {
router.addRoute(routes);
}
export default router;
<template> <template>
<div class="user-containter"> <div class="user-containter">
<el-form :inline="true"> <el-form :inline="true">
<el-form-item label="账号"> <el-form-item label="账号">
<el-input placeholder="账号模糊查询"></el-input> <el-input placeholder="账号模糊查询"></el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary">查询</el-button> <el-button type="primary">查询</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-form :inline="true"> <el-form :inline="true">
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleAdd">添加用户</el-button> <el-button type="primary" @click="handleAdd">添加用户</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-table :data="tableData" border> <el-table :data="tableData" border>
<el-table-column type="selection"></el-table-column> <el-table-column type="selection"></el-table-column>
<el-table-column v-for="i in tableColumn" :label="i.label" :prop="i.prop" :width="i.width" align="center"> <el-table-column v-for="i in tableColumn" :label="i.label" :prop="i.prop" :width="i.width" align="center">
<template #default="scope" v-if="i.prop == 'avatar'"> <template #default="scope" v-if="i.prop == 'avatar'">
<el-avatar :src="scope.row.avatar"></el-avatar> <el-avatar :src="scope.row.avatar"></el-avatar>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="200px" align="center" fixed="right"> <el-table-column label="操作" width="200px" align="center" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button type="text" @click="handleEditPwd(scope.row)">修改密码</el-button> <el-button type="text" @click="handleEditPwd(scope.row)">修改密码</el-button>
<el-divider direction="vertical" /> <el-divider direction="vertical" />
<el-button type="text" @click="handleEdit(scope)">编辑</el-button> <el-button type="text" @click="handleEdit(scope)">编辑</el-button>
<el-divider direction="vertical" /> <el-divider direction="vertical" />
<el-popconfirm title="确认删除?" @confirm="handleDelete(scope)"> <el-popconfirm title="确认删除?" @confirm="handleDelete(scope)">
<template #reference> <template #reference>
<el-button type="text">删除</el-button> <el-button type="text">删除</el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-drawer v-model="showDrawer" :title="drawerTitle"> <el-drawer v-model="showDrawer" :title="drawerTitle">
<el-form class="form" ref="form" :rules="rules" :model="formData" size="large" label-position="right" <el-form class="form" ref="form" :rules="rules" :model="formData" size="large" label-position="right"
label-width="80px"> label-width="80px">
<el-form-item v-for="item in formColumn" :prop="item.prop" :label="item.label"> <el-form-item v-for="item in formColumn" :prop="item.prop" :label="item.label">
<el-input v-if="item.type == 'input'" v-model="formData[item.prop]" :placeholder="item.placeholder"> <el-input v-if="item.type == 'input'" v-model="formData[item.prop]" :placeholder="item.placeholder">
</el-input> </el-input>
<el-upload v-if="item.type == 'avatar'"> <el-upload v-if="item.type == 'avatar'">
<img class="avatar" :src="formData[item.prop]" /> <img class="avatar" :src="formData[item.prop]" />
</el-upload> </el-upload>
<el-date-picker v-if="item.type == 'date'" v-model="formData[item.prop]" format="YYYY-MM-DD" <el-date-picker v-if="item.type == 'date'" v-model="formData[item.prop]" format="YYYY-MM-DD"
value-format="YYYY-MM-DD"></el-date-picker> value-format="YYYY-MM-DD"></el-date-picker>
<el-select v-if="item.type == 'select'" v-model="formData[item.prop]" multiple style="width: 300px"> <el-select v-if="item.type == 'select'" v-model="formData[item.prop]" multiple style="width: 300px">
<el-option v-for="i in roles" :key="i.id" :label="i.roleName" :value="i.id"></el-option> <el-option v-for="i in roles" :key="i.id" :label="i.roleName" :value="i.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="showDrawer = false">关闭</el-button> <el-button @click="showDrawer = false">关闭</el-button>
<el-button type="primary" @click="handleSubmit">{{ drawerTitle }}</el-button> <el-button type="primary" @click="handleSubmit">{{ drawerTitle }}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-drawer> </el-drawer>
<el-dialog v-model="showDialog" title="修改密码" width="30%"> <el-dialog v-model="showDialog" title="修改密码" width="30%">
<el-form :model="editPwdData" ref="editPwdRef" :rules="rules" label-width="80px"> <el-form :model="editPwdData" ref="editPwdRef" :rules="rules" label-width="80px">
<el-form-item label="用户账号"> <el-form-item label="用户账号">
<el-input v-model="editPwdData.account" :disabled="true" /> <el-input v-model="editPwdData.account" :disabled="true" />
</el-form-item> </el-form-item>
<el-form-item label="密码" prop="password"> <el-form-item label="密码" prop="password">
<el-input v-model="editPwdData.password" type="password" show-password clearable <el-input v-model="editPwdData.password" type="password" show-password clearable
placeholder="请输入密码" /> placeholder="请输入密码" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="showDialog = false">取消</el-button> <el-button @click="showDialog = false">取消</el-button>
<el-button type="primary" @click="handlePwdAdd">确认</el-button> <el-button type="primary" @click="handlePwdAdd">确认</el-button>
</template> </template>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { reactive, ref } from 'vue' import { reactive, ref } from 'vue'
import { addUser, getUserInfo, editUser, deleteUser, getAllRole, findRoleByUser, editPassWord } from '@/services/api/user/userAPI' import { addUser, getUserInfo, editUser, deleteUser, getAllRole, findRoleByUser, editPassWord } from '@/services/api/user/userAPI'
import { valid } from 'mockjs'; const showDialog = ref(false)
const showDialog = ref(false) const editPwdRef = ref()
const editPwdRef = ref() const editPwdData = ref({
const editPwdData = ref({ password: '',
password: '', account: ''
account: '' })
})
const tableColumn = reactive([
const tableColumn = reactive([ {
{ label: '用户账号',
label: '用户账号', prop: 'fauthAccount',
prop: 'fauthAccount', width: ''
width: '' },
}, {
{ label: '用户名',
label: '用户名', prop: 'name',
prop: 'name', width: ''
width: '' },
}, {
{ label: '工号',
label: '工号', prop: 'fworkNo',
prop: 'fworkNo', width: ''
width: '' },
}, {
{ label: '工作地点',
label: '工作地点', prop: 'fworkAddr',
prop: 'fworkAddr', width: ''
width: '' },
}, {
{ label: '状态',
label: '状态', prop: 'fstate',
prop: 'fstate', width: ''
width: '' },
}, {
{ label: '职位',
label: '职位', prop: 'fposition',
prop: 'fposition', width: ''
width: '' },
}, {
{ label: '入职日期',
label: '入职日期', prop: 'finductionDate',
prop: 'finductionDate', width: '155px'
width: '155px' },
}, {
{ label: '英文名',
label: '英文名', prop: 'fenglishName',
prop: 'fenglishName', width: ''
width: '' },
}, {
{ label: '部门',
label: '部门', prop: 'fdept',
prop: 'fdept', width: ''
width: '' },
}, {
{ label: '头像',
label: '头像', prop: 'avatar',
prop: 'avatar', width: ''
width: '' },
}, {
{ label: '创建人',
label: '创建人', prop: 'fcreator',
prop: 'fcreator', width: ''
width: '' },
}, {
{ label: '创建日期',
label: '创建日期', prop: 'fdate',
prop: 'fdate', width: '155px'
width: '155px' }
} ])
])
let tableData = ref([])
let tableData = ref([])
const form = ref()
const form = ref() let formColumn = reactive([
let formColumn = reactive([ {
{ label: '用户账号',
label: '用户账号', prop: 'fauthAccount',
prop: 'fauthAccount', type: 'input',
type: 'input', placeholder: '请输入用户账号'
placeholder: '请输入用户账号' },
}, {
{ label: '用户名',
label: '用户名', prop: 'name',
prop: 'name', type: 'input',
type: 'input', placeholder: '请输入用户名'
placeholder: '请输入用户名' },
}, {
{ label: '用户介绍',
label: '用户介绍', prop: 'introduction',
prop: 'introduction', type: 'input',
type: 'input', placeholder: '请输入用户介绍'
placeholder: '请输入用户介绍' },
}, {
{ label: '工号',
label: '工号', prop: 'fworkNo',
prop: 'fworkNo', type: 'input',
type: 'input', placeholder: '请输入工号'
placeholder: '请输入工号' },
}, {
{ label: '工作地点',
label: '工作地点', prop: 'fworkAddr',
prop: 'fworkAddr', type: 'input',
type: 'input', placeholder: '请输入工作地点'
placeholder: '请输入工作地点' },
}, {
{ label: '状态',
label: '状态', prop: 'fstate',
prop: 'fstate', type: 'input',
type: 'input', placeholder: '请输入状态'
placeholder: '请输入状态' },
}, {
{ label: '角色分配',
label: '角色分配', prop: 'roles',
prop: 'roles', type: 'select',
type: 'select', placeholder: '分配角色'
placeholder: '分配角色' },
}, {
{ label: '职位',
label: '职位', prop: 'fposition',
prop: 'fposition', type: 'input',
type: 'input', placeholder: '请输入职位'
placeholder: '请输入职位' },
}, {
{ label: '手机',
label: '手机', prop: 'fphone',
prop: 'fphone', type: 'input',
type: 'input', placeholder: '请输入手机'
placeholder: '请输入手机' },
}, {
{ label: '邮箱',
label: '邮箱', prop: 'fmail',
prop: 'fmail', type: 'input',
type: 'input', placeholder: '请输入邮箱'
placeholder: '请输入邮箱' },
}, {
{ label: '入职日期',
label: '入职日期', prop: 'finductionDate',
prop: 'finductionDate', type: 'date',
type: 'date', placeholder: '请输入入职日期'
placeholder: '请输入入职日期' },
}, {
{ label: '英文名',
label: '英文名', prop: 'fenglishName',
prop: 'fenglishName', type: 'input',
type: 'input', placeholder: '请输入英文名'
placeholder: '请输入英文名' },
}, {
{ label: '部门',
label: '部门', prop: 'fdept',
prop: 'fdept', type: 'input',
type: 'input', placeholder: '请输入部门'
placeholder: '请输入部门' },
}, {
{ label: '头像',
label: '头像', prop: 'avatar',
prop: 'avatar', type: 'avatar'
type: 'avatar' }
} ])
]) const rules = reactive({
const rules = reactive({ fauthAccount: [
fauthAccount: [ { required: true, message: '请输入用户账号', trigger: 'blur' }
{ required: true, message: '请输入用户账号', trigger: 'blur' } ],
], name: [
name: [ { required: true, message: '请输入用户名', trigger: 'blur' }
{ required: true, message: '请输入用户名', trigger: 'blur' } ],
], password: [
password: [ { required: true, message: '请输入登录密码', trigger: 'blur' }
{ required: true, message: '请输入登录密码', trigger: 'blur' } ]
] })
}) let formData = ref<any>({})
let formData = ref<any>({})
let drawerTitle = ref('')
let drawerTitle = ref('') let showDrawer = ref(false)
let showDrawer = ref(false)
let roles = ref<any>([])
let roles = ref<any>([])
function init() {
function init() { getUserInfo().then((res) => {
getUserInfo().then((res) => { if (res.code == 200) {
if (res.code == 200) { tableData.value = res.data.records
tableData.value = res.data.records }
} })
}) getAllRole().then((res) => {
getAllRole().then((res) => { if (res.code == 200) {
if (res.code == 200) { roles.value = res.data
roles.value = res.data }
} })
}) }
}
function handleEditPwd(row: any) {
function handleEditPwd(row: any) { editPwdData.value.password = ''
editPwdData.value.password = '' editPwdData.value.account = row.fauthAccount
editPwdData.value.account = row.fauthAccount showDialog.value = true
showDialog.value = true
}
}
function handlePwdAdd() {
function handlePwdAdd() { editPwdRef.value?.validate((valid: boolean) => {
editPwdRef.value?.validate((valid: boolean) => { if (valid) {
if (valid) { editPassWord(editPwdData.value).then((res: any) => {
editPassWord(editPwdData.value).then((res: any) => { if (res.code === 200) {
if (res.code === 200) { showDialog.value = false
showDialog.value = false }
} })
}) }
} })
}) }
}
function handleEdit(scope: any) {
function handleEdit(scope: any) { formData.value = {}
formData.value = {} let params = {
let params = { userId: scope.row.userId
userId: scope.row.userId }
} findRoleByUser(params).then((res) => {
findRoleByUser(params).then((res) => { if (res.code == 200) {
if (res.code == 200) { formData.value.roles = res.data
formData.value.roles = res.data }
} })
}) for (let i in scope.row) {
for (let i in scope.row) { formData.value[i] = scope.row[i]
formData.value[i] = scope.row[i] }
} for (let j in formColumn) {
for (let j in formColumn) { if (formColumn[j].prop == 'password') {
if (formColumn[j].prop == 'password') { formColumn.splice(Number(j), 1)
formColumn.splice(Number(j), 1) break
break }
} }
} for (let k in formData.value) {
for (let k in formData.value) { if (k == 'password') {
if (k == 'password') { delete formData[k]
delete formData[k] break
break }
} }
} drawerTitle.value = '编辑'
drawerTitle.value = '编辑' showDrawer.value = true
showDrawer.value = true }
}
function handleAdd() {
function handleAdd() { formData.value = {}
formData.value = {} formColumn.splice(1, 0, {
formColumn.splice(1, 0, { label: '登录密码',
label: '登录密码', prop: 'password',
prop: 'password', type: 'input',
type: 'input', placeholder: '请输入登录密码'
placeholder: '请输入登录密码' })
}) drawerTitle.value = '添加'
drawerTitle.value = '添加' showDrawer.value = true
showDrawer.value = true }
}
function handleSubmit() {
function handleSubmit() { if (drawerTitle.value == '添加') {
if (drawerTitle.value == '添加') { form.value.validate((valid: boolean) => {
form.value.validate((valid: boolean) => { if (valid) {
if (valid) { addUser(formData.value).then((res) => {
addUser(formData.value).then((res) => { if (res.code == 200) {
if (res.code == 200) { init()
init() showDrawer.value = false
showDrawer.value = false }
} })
}) }
} })
}) }
} if (drawerTitle.value == '编辑') {
if (drawerTitle.value == '编辑') { form.value.validate((valid: boolean) => {
form.value.validate((valid: boolean) => { if (valid) {
if (valid) { editUser(formData.value).then((res) => {
editUser(formData.value).then((res) => { if (res.code == 200) {
if (res.code == 200) { init()
init() showDrawer.value = false
showDrawer.value = false }
} })
}) }
} })
}) }
} }
}
function handleDelete(scope: any) {
function handleDelete(scope: any) { let params = {
let params = { userId: scope.row.userId
userId: scope.row.userId }
} deleteUser(params).then((res) => {
deleteUser(params).then((res) => { if (res.code == 200) {
if (res.code == 200) { init()
init() }
} })
}) }
}
init()
init()
</script>
</script> <style scoped>
<style scoped> .user-containter {
.user-containter { padding: 20px;
padding: 20px; }
}
.form {
.form { overflow-x: hidden;
overflow-x: hidden; overflow-y: auto;
overflow-y: auto; height: calc(100vh - 120px);
height: calc(100vh - 120px); }
}
.avatar {
.avatar { width: 120px;
width: 120px; height: 120px;
height: 120px; display: block;
display: block; }
}
.el-dropdown-link {
.el-dropdown-link { cursor: pointer;
cursor: pointer; color: var(--el-color-primary);
color: var(--el-color-primary); align-items: center;
align-items: center; }
}
</style> </style>
\ No newline at end of file
...@@ -12,7 +12,6 @@ import path from "path"; ...@@ -12,7 +12,6 @@ import path from "path";
// import Icons from 'unplugin-icons/vite' // import Icons from 'unplugin-icons/vite'
// import IconsResolver from 'unplugin-icons/resolver' // import IconsResolver from 'unplugin-icons/resolver'
import Inspect from "vite-plugin-inspect"; import Inspect from "vite-plugin-inspect";
import { viteMockServe } from "vite-plugin-mock";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons"; import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
const pathSrc = path.resolve(__dirname, "src"); const pathSrc = path.resolve(__dirname, "src");
...@@ -28,10 +27,7 @@ export default ({ command, mode }) => { ...@@ -28,10 +27,7 @@ export default ({ command, mode }) => {
// 指定symbolId格式 // 指定symbolId格式
symbolId: "icon-[dir]-[name]", symbolId: "icon-[dir]-[name]",
}), }),
viteMockServe({
// default
mockPath: "mock",
}),
// AutoImport({ // AutoImport({
// // Auto import functions from Vue, e.g. ref, reactive, toRef... // // Auto import functions from Vue, e.g. ref, reactive, toRef...
// // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等 // // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等
...@@ -86,7 +82,7 @@ export default ({ command, mode }) => { ...@@ -86,7 +82,7 @@ export default ({ command, mode }) => {
// '/foo': '', // '/foo': '',
// 选项写法 // 选项写法
"/lic": { "/lic": {
target: "http://192.168.1.41:8090", target: "http://192.168.1.252:8090",
}, },
}, },
hmr: { hmr: {
...@@ -94,7 +90,6 @@ export default ({ command, mode }) => { ...@@ -94,7 +90,6 @@ export default ({ command, mode }) => {
}, },
}, },
resolve: { resolve: {
// 设置项目文件导入路径
alias: { alias: {
"@": pathSrc, "@": pathSrc,
}, },
...@@ -102,12 +97,9 @@ export default ({ command, mode }) => { ...@@ -102,12 +97,9 @@ export default ({ command, mode }) => {
css: { css: {
// css预处理器 // css预处理器
preprocessorOptions: { preprocessorOptions: {
// 引入 var.scss 这样就可以在全局中使用 var.scss中预定义的变量了
// 给导入的路径最后加上 ;
scss: { scss: {
charset: false, //防止样式出现警告,中文 charset: false, //防止样式出现警告,中文
additionalData: '@import "@/assets/styles/global.scss";', additionalData: '@use "@/assets/styles/global.scss";',
}, },
}, },
}, },
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论