From d081cdaabcb942298f1df374f6a1cd626741098f Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期四, 08 六月 2023 14:17:14 +0800 Subject: [PATCH] 新增页面和配置,部分接口对接 --- src/views/Admin/msgReview.vue | 189 +++++++++ src/api/login.js | 9 src/views/Admin/components/userMod.vue | 83 ++- src/views/Admin/smsSetting.vue | 9 src/api/user.js | 67 ++ src/views/Admin/components/pwdMod.vue | 59 ++ src/util/request.js | 25 src/util/storage.js | 8 src/views/Admin/components/sameLevelMod.vue | 2 src/router/index.js | 28 + src/views/Login.vue | 21 src/util/permission.js | 20 /dev/null | 8 src/views/Admin/list.vue | 22 src/layout/menu/index.js | 15 src/main.js | 8 src/views/Admin/HomeDefault.vue | 11 src/views/Admin/massSend.vue | 279 +++++++++++++ src/views/Admin/sameLevel.vue | 85 +-- src/views/Admin/userManage.vue | 115 ++-- src/views/Home.vue | 53 ++ src/util/AntDesign.js | 1 src/views/Admin/notice.vue | 102 ++-- 23 files changed, 953 insertions(+), 266 deletions(-) diff --git a/src/api/login.js b/src/api/login.js index 02227ae..03b659c 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -1,7 +1,7 @@ //将拦截器整体导入 import request from '@/util/request'//导入已经写好的拦截器 -export function Login(data){ +export function login(data){ return request({ url:'/account/auth/login', method:'post', @@ -9,6 +9,13 @@ }) } +export function loginOut(){ + return request({ + url:'/account/auth/logout', + method:'get' + }) +} + export function getMenuAdmin(){ return request({ url:'/sys/menu/get/u', diff --git a/src/api/user.js b/src/api/user.js index 9e68e96..15e2ee5 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -1,18 +1,73 @@ //将拦截器整体导入 import request from '@/util/request'//导入已经写好的拦截器 +// 用户管理 export function getUser(data){ return request({ - url:'/account/user/find/user/list', - method:'post', - data:data, + url: '/account/user/find/user/list', + method: 'post', + data: data, }) } export function addUser(data){ return request({ - url:'/account/user/add', - method:'post', + url: '/account/user/add', + method: 'post', data: data, }) -} \ No newline at end of file +} + +export function delUser(id){ + return request({ + url: '/account/user/deleteUser?userId=' + id, + method: 'get', + }) +} + +export function updatePwd(data){ + return request({ + url: '/account/user/update/password', + method: 'post', + data: data + }) +} + +// 平级接收人管理 +export function getRecipient(data){ + return request({ + url:'/mesmanager/recipient/page', + method:'post', + data:data, + }) +} + +export function getRecipientById(data){ + return request({ + url:'/mesmanager/recipient/findById', + method:'post', + data:data, + }) +} + +export function addRecipient(data){ + return request({ + url:'/mesmanager/recipient/page', + method:'post', + data:data, + }) +} + + + + + + + + + + + + + + diff --git a/src/layout/menu/index.js b/src/layout/menu/index.js index 6656602..f4df312 100644 --- a/src/layout/menu/index.js +++ b/src/layout/menu/index.js @@ -39,17 +39,22 @@ MenuPath: "/torelease", }, { - MenuID: "24", + MenuID: "22", + MenuTitle: "信息审核", + MenuPath: "/msgReview", + }, + { + MenuID: "23", MenuTitle: "信息发布", MenuPath: "/report", }, { - MenuID: "22", + MenuID: "24", MenuTitle: "历史信息", MenuPath: "/history", }, { - MenuID: "23", + MenuID: "25", MenuTitle: "叫应记录", MenuPath: "/callRecord", }, @@ -62,7 +67,7 @@ Children: [{ MenuID: "31", MenuTitle: "常规群发", - MenuPath: "/module", + MenuPath: "/massSend", }, { MenuID: "32", @@ -88,7 +93,7 @@ { MenuID: "42", MenuTitle: "短信平台设置", - MenuPath: "/smssetting", + MenuPath: "/smsSetting", }, // { // MenuID: "43", diff --git a/src/main.js b/src/main.js index 355abe3..c241380 100644 --- a/src/main.js +++ b/src/main.js @@ -8,6 +8,8 @@ //设置组件默认中文 import 'moment/locale/zh-cn'; +import '@/util/permission' +import {message,Modal} from "ant-design-vue"; moment.locale('zh-cn'); Vue.config.productionTip = false @@ -22,7 +24,11 @@ return moment(value).from(moment()) } }) - +Vue.prototype.$message = message; +Vue.prototype.$confirm = Modal.confirm; +message.config({ + duration: 2 +}) new Vue({ router, store, diff --git a/src/router/index.js b/src/router/index.js index 5cc0150..3378c61 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -56,8 +56,14 @@ path: '/torelease', name: 'torelease', meta: { title: '信息编辑' }, - component: () => import('@/views/Admin/Notice'), + component: () => import('@/views/Admin/notice'), }, + { + path: '/msgReview', + name: '/msgReview', + meta: { title: '信息审核' }, + component: () => import('@/views/Admin/msgReview'), + }, { path: '/report', name: 'report', @@ -77,6 +83,12 @@ component: () => import('@/views/Admin/callRecord'), }, { + path: '/massSend', + name: 'massSend', + meta: { title: '常规群发' }, + component: () => import('@/views/Admin/massSend'), + }, + { path: '/msgRecord', name: 'msgRecord', meta: { title: '短信记录' }, @@ -95,11 +107,17 @@ component: () => import('@/views/Admin/userManage'), }, { - path: '/menu', - name: 'menu', - meta: { title: '菜单管理' }, - component: () => import('@/views/Admin/menuManage'), + path: '/smsSetting', + name: 'smsSetting', + meta: { title: '短信平台设置' }, + component: () => import('@/views/Admin/smsSetting'), }, + // { + // path: '/menu', + // name: 'menu', + // meta: { title: '菜单管理' }, + // component: () => import('@/views/Admin/menuManage'), + // }, ] }, ]; diff --git a/src/util/AntDesign.js b/src/util/AntDesign.js index d356151..2c484ef 100644 --- a/src/util/AntDesign.js +++ b/src/util/AntDesign.js @@ -31,4 +31,3 @@ message } from "ant-design-vue"; Vue.use(Alert).use(Pagination).use(Tag).use(Switch).use(FormModel).use(Modal).use(Cascader).use(TreeSelect).use(Button).use(Layout).use(Menu).use(Icon).use(Form).use(Input).use(Tabs).use(Checkbox).use(Row).use(Col).use(Avatar).use(Divider).use(Card).use(List).use(Tooltip).use(Dropdown).use(Select).use(Radio).use(DatePicker).use(Table); -Vue.prototype.$message = message; \ No newline at end of file diff --git a/src/util/permission.js b/src/util/permission.js new file mode 100644 index 0000000..acff799 --- /dev/null +++ b/src/util/permission.js @@ -0,0 +1,20 @@ +import router from '@/router/index'; +import Cookies from "js-cookie"; +import {message} from "ant-design-vue"; +// 这里就可以进行vue-router的beforeEach拦截了,你也可以放其他地方,我比较喜欢放这 +router.beforeEach((to, from, next) => { + // 这里先获取下用户信息,我偷懒用sessionStorage存了 + // 里面包含了用户权限,用户各种信息等 + const token = Cookies.get('resTk') + // 这里必须加上to.path !== 'login'的判断,不然会陷入无限循环, + // 因为逻辑是第一次进来,判断用户信息不存在,即!user为true,由于使用的是next('/login')而非next(), + // 会再次进入路由跳转,next()方法没有参数是直接进入页面,不会再次进入路由拦截,有参数则会,因为跳转, + // 所以再次进入路由,再次判断,再次进入路由,再次判断,循环往复无限循环 + // 所以一定要加to.path !== 'login'的判断 + if (!token && to.path !== '/') { + message.error('用户信息已过期,请重新登录'); + next('/'); + }else { + next(); + } +}); \ No newline at end of file diff --git a/src/util/request.js b/src/util/request.js index 8f3b97a..34ba6b5 100644 --- a/src/util/request.js +++ b/src/util/request.js @@ -1,6 +1,8 @@ import axios from "axios";//原生的axios import Cookies from 'js-cookie'; import { Session } from '@/util/storage'; +import {message} from "ant-design-vue"; +import { loginOut } from "@/api/login"; //用来拦截用的 axios.defaults.headers.post["Content-Type"] = "application/json;charset=utf-8"; //创建一个单例 @@ -34,7 +36,7 @@ (response) => { // 对响应数据做点什么 if (response.data.code && response.data.code === 'A0213') { - this.$message.error('用户uid不存在'); + message.error('用户uid不存在'); // useLoginApi() // .signOut() // .then(() => { @@ -42,33 +44,32 @@ // window.location.href = '/'; // }); } else if (response.data.code && response.data.code === 405) { - this.$message.error('token失效'); - // useLoginApi() - // .signOut() - // .then(() => { - // Session.clear(); - // window.location.href = '/'; - // }); + message.error('token失效'); + loginOut() + .then(() => { + Session.clear(); + window.location.href = '/'; + }); } return Promise.resolve(response); }, (error) => { // 对响应错误做点什么 if (error.message.indexOf('timeout') != -1) { - this.$message.error('网络超时'); + message.error('网络超时'); setTimeout(() => { Session.clear(); window.location.href = '/'; }, 1000); } else if (error.message == 'Network Error') { - this.$message.error('网络连接错误'); + message.error('网络连接错误'); setTimeout(() => { Session.clear(); window.location.href = '/'; }, 1000); } else { - if (error.response.data) this.$message.error(error.response.data.error); - else this.$message.error('接口路径找不到'); + if (error.response.data) message.error(error.response.data.error); + else message.error('接口路径找不到'); } return Promise.reject(error); } diff --git a/src/util/storage.js b/src/util/storage.js index 6db7091..614ef0f 100644 --- a/src/util/storage.js +++ b/src/util/storage.js @@ -37,23 +37,23 @@ export const Session = { // 设置临时缓存 set(key, val) { - if (key === 'token') return Cookies.set(key, val); + if (key === 'resTk') return Cookies.set(key, val); window.sessionStorage.setItem(key, JSON.stringify(val)); }, // 获取临时缓存 get(key) { - if (key === 'token') return Cookies.get(key); + if (key === 'resTk') return Cookies.get(key); let json = window.sessionStorage.getItem(key); return JSON.parse(json); }, // 移除临时缓存 remove(key) { - if (key === 'token') return Cookies.remove(key); + if (key === 'resTk') return Cookies.remove(key); window.sessionStorage.removeItem(key); }, // 移除全部临时缓存 clear() { - Cookies.remove('token'); + Cookies.remove('resTk'); window.sessionStorage.clear(); }, }; diff --git a/src/views/Admin/HomeDefault.vue b/src/views/Admin/HomeDefault.vue index 77f65b6..f3a24e2 100644 --- a/src/views/Admin/HomeDefault.vue +++ b/src/views/Admin/HomeDefault.vue @@ -6,7 +6,7 @@ <div class="content-left"> <img src="./../../assets/user.png" alt=""> <div class="user"> - <h2>{{ dateTime + ',李静,欢迎使用自治区自然灾害综合风险预警发布及响应联动系统。' }}</h2> + <h2>{{ dateTime}},{{userName}},欢迎使用自治区自然灾害综合风险预警发布及响应联动系统</h2> <p>自治区预警中心干部 工作人员</p> </div> </div> @@ -48,6 +48,7 @@ import QuickNavigation from '@/components/Home/QuickNavigation' import IndexEcharts from '@/components/Home/IndexEcharts' import Team from '@/components/Home/Team' +import Cookies from "js-cookie"; export default { name: 'home-default', @@ -58,6 +59,14 @@ IndexEcharts, Team }, + data() { + return { + userName: '' + }; + }, + created() { + this.userName = JSON.parse(Cookies.get('userInfo')).realName + }, computed: { dateTime () { let date = new Date() diff --git a/src/views/Admin/ModuleOne.vue b/src/views/Admin/ModuleOne.vue deleted file mode 100644 index b216ca4..0000000 --- a/src/views/Admin/ModuleOne.vue +++ /dev/null @@ -1,8 +0,0 @@ -<template> - <div class="module-one"> - </div> -</template> - -<script> - -</script> \ No newline at end of file diff --git a/src/views/Admin/components/pwdMod.vue b/src/views/Admin/components/pwdMod.vue index 63b8145..3725c90 100644 --- a/src/views/Admin/components/pwdMod.vue +++ b/src/views/Admin/components/pwdMod.vue @@ -1,6 +1,7 @@ <template> <a-modal title="重置密码" + centered :visible="visible" :confirm-loading="confirmLoading" width="50%" @@ -11,11 +12,16 @@ :afterClose="clearMod" > <a-form-model ref="ruleForm" :rules="rules" :model="form" :label-col="labelCol" :wrapper-col="wrapperCol" :colon="false"> - <a-form-model-item label="请输入新密码" prop="newPwd"> - <a-input v-model="form.newPwd"/> + <a-form-model-item label="原密码" prop="oldPwd"> +<!-- <a-input v-model="form.oldPwd"/>--> + <a-input-password v-model="form.oldPwd" placeholder="请输入原密码" /> </a-form-model-item> - <a-form-model-item label="确认密码" prop="checkPwd"> - <a-input v-model="form.checkPwd"/> + <a-form-model-item label="新密码" prop="newPwd"> +<!-- <a-input v-model="form.newPwd"/>--> + <a-input-password v-model="form.newPwd" placeholder="请输入新密码" /> + </a-form-model-item> + <a-form-model-item label="重复新密码" prop="reNewPwd"> + <a-input-password v-model="form.reNewPwd" placeholder="请再次输入新密码" /> </a-form-model-item> </a-form-model> </a-modal> @@ -23,7 +29,9 @@ <script> import {verifyPasswordPowerful, verifyPhone, verifyTelPhone} from "@/util/validate"; - +import { updatePwd } from '@/api/user' +import {loginOut} from "@/api/login"; +import {Session} from "@/util/storage"; export default { name: 'pwdMod', data () { @@ -52,14 +60,20 @@ confirmLoading: false, labelCol: { span: 4 }, wrapperCol: { span: 14 }, + updateType: 0, form: { - id: null, + uid: null, + oldPwd: '', newPwd: '', - checkPwd: '' + reNewPwd: '' }, rules: { - newPwd: [{ required: true, validator: validatePwd, trigger: 'blur'}], - checkPwd: [{ required: true, validator: validatePwd2, trigger: 'blur'}] + // oldPwd: [{ required: true, validator: validatePwd, trigger: 'blur'}], + // newPwd: [{ required: true, validator: validatePwd, trigger: 'blur'}], + // reNewPwd: [{ required: true, validator: validatePwd2, trigger: 'blur'}] + oldPwd: [{ required: true, message: '请输入原密码', trigger: 'blur'}], + newPwd: [{ required: true, message: '请输入新密码', trigger: 'blur'}], + reNewPwd: [{ required: true, validator: validatePwd2, trigger: 'blur'}] } } }, @@ -69,13 +83,36 @@ methods:{ clearMod(){ this.$refs.ruleForm.clearValidate() + this.$refs.ruleForm.resetFields() }, onSubmit() { this.$refs.ruleForm.validate(valid => { if (valid) { - alert('submit!'); - this.visible = false + let {reNewPwd, ...data} = this.form + updatePwd(data).then(res=>{ + if(res.data.code == 100){ + if(this.updateType == 1){ + this.$message.success('密码修改成功,需重新登录'); + loginOut().then(res=>{ + if (res.data.code === 100) { + Session.clear(); // 清除缓存/token等 + // 使用 reload 时,不需要调用 resetRoute() 重置路由 + this.$router.push('/') + // window.location.reload(); + } else { + this.$message.warning(res.data.msg); + } + }) + }else{ + this.$message.success('密码修改成功'); + this.$emit('refresh') + } + this.visible = false + }else{ + this.$message.warning(res.data.msg); + } + }) } else { console.log('error submit!!'); return false; diff --git a/src/views/Admin/components/sameLevelMod.vue b/src/views/Admin/components/sameLevelMod.vue index 2befd6c..74df5ab 100644 --- a/src/views/Admin/components/sameLevelMod.vue +++ b/src/views/Admin/components/sameLevelMod.vue @@ -2,6 +2,7 @@ <a-modal :title="title" :visible="visible" + centered :confirm-loading="confirmLoading" width="50%" cancelText="取消" @@ -111,7 +112,6 @@ alert('submit!'); this.visible = false } else { - console.log('error submit!!'); return false; } }); diff --git a/src/views/Admin/components/userMod.vue b/src/views/Admin/components/userMod.vue index e1cb1a1..9a5f08a 100644 --- a/src/views/Admin/components/userMod.vue +++ b/src/views/Admin/components/userMod.vue @@ -2,6 +2,7 @@ <a-modal :title="title" :visible="visible" + centered :confirm-loading="confirmLoading" width="50%" cancelText="取消" @@ -11,29 +12,29 @@ :afterClose="clearMod" > <a-form-model ref="ruleForm" :rules="rules" :model="form" :label-col="labelCol" :wrapper-col="wrapperCol" :colon="false"> - <a-form-model-item label="姓名" prop="name"> - <a-input v-model="form.name"/> + <a-form-model-item label="姓名" prop="realName"> + <a-input v-model="form.realName"/> </a-form-model-item> <a-form-model-item label="手机号码" prop="phone"> <a-input v-model="form.phone"/> </a-form-model-item> - <a-form-model-item label="用户名" prop="userName"> - <a-input v-model="form.userName"/> + <a-form-model-item label="用户名" prop="name"> + <a-input v-model="form.name"/> </a-form-model-item> - <a-form-model-item label="密码" v-if="title== '新增用户'" prop="password"> - <a-input v-model="form.password"/> + <a-form-model-item label="密码" v-if="title== '新增用户'" prop="pwd"> + <a-input v-model="form.pwd"/> </a-form-model-item> - <a-form-model-item label="重复密码" v-if="title== '新增用户'" prop="rePassword"> - <a-input v-model="form.rePassword"/> + <a-form-model-item label="重复密码" v-if="title== '新增用户'" prop="dupPwd"> + <a-input v-model="form.dupPwd"/> </a-form-model-item> <a-form-model-item label="性别" prop="sex"> - <a-radio-group v-model="form.sex" :default-value="0" button-style="solid"> - <a-radio-button :value="0">男</a-radio-button> - <a-radio-button :value="1">女</a-radio-button> + <a-radio-group v-model="form.sex" :default-value="1" button-style="solid"> + <a-radio-button :value="1">男</a-radio-button> + <a-radio-button :value="0">女</a-radio-button> </a-radio-group> </a-form-model-item> - <a-form-model-item label="选择级别" prop="level"> - <a-select v-model="form.level" placeholder="监管级别"> + <a-form-model-item label="选择级别" prop="unittype"> + <a-select v-model="form.unittype" placeholder="监管级别"> <a-select-option :value="1"> 省级 </a-select-option> @@ -63,12 +64,12 @@ <a-input v-model="unitName"/> </a-form-model-item> <a-form-model-item label="角色" prop="role"> - <a-select v-model="form.role" placeholder="角色"> - <a-select-option :value="1"> + <a-select v-model="form.roleId" placeholder="角色"> + <a-select-option :value="2"> 领导 </a-select-option> - <a-select-option :value="2"> - 公司人员 + <a-select-option :value="3"> + 工作人员 </a-select-option> </a-select> </a-form-model-item> @@ -90,26 +91,26 @@ areaData: [], unitName: '', form: { - name: '', + realName: '', phone: '', - userName: '', - password: '', - rePassword: '', + name: '', + pwd: '', + dupPwd: '', sex: null, - level: null, + unittype: null, area: null, - role: null + roleId: null }, rules: { - name: [{ required: true, message: '请输入姓名', trigger: 'blur'}], + realName: [{ required: true, message: '请输入姓名', trigger: 'blur'}], phone: [{ required: true, message: '请输入手机号', trigger: 'blur'}], - userName: [{ required: true, message: '请输入用户名', trigger: 'blur'}], - password: [{ required: true, message: '请输入密码', trigger: 'blur'}], - rePassword: [{ required: true, message: '请再次输入密码', trigger: 'blur'}], + name: [{ required: true, message: '请输入用户名', trigger: 'blur'}], + pwd: [{ required: true, message: '请输入密码', trigger: 'blur'}], + dupPwd: [{ required: true, message: '请再次输入密码', trigger: 'blur'}], sex: [{ required: true, message: '请选择性别', trigger: 'change'}], - level: [{ required: true, message: '请选择监管级别', trigger: 'change'}], + unittype: [{ required: true, message: '请选择监管级别', trigger: 'change'}], area: [{ required: true, message: '请选择行政区划', trigger: 'change'}], - role: [{ required: true, message: '请选择角色', trigger: 'change'}] + roleId: [{ required: true, message: '请选择角色', trigger: 'change'}] } } }, @@ -122,19 +123,21 @@ if(type == 'add'){ t.title = '新增用户' t.form = { - name: '', + realName: '', phone: '', - userName: '', - password: '', - rePassword: '', + name: '', + pwd: '', + dupPwd: '', sex: undefined, - level: undefined, + unittype: undefined, area: undefined, - role: undefined + roleId: null } }else{ t.title = '编辑用户' - t.form = data + data.roleId = data.role.roleId + const { realName,phone,name,sex,unittype,roleId } = data + t.form = { realName,phone,name,sex,unittype,roleId } } t.visible = true }, @@ -146,8 +149,12 @@ onSubmit() { this.$refs.ruleForm.validate(valid => { if (valid) { - alert('submit!'); - this.visible = false + if(this.title == '新增用户') + addUser(this.form).then((res)=>{ + if(res.data.code == 100){ + console.log(res,'res') + } + }) } else { console.log('error submit!!'); return false; diff --git a/src/views/Admin/list.vue b/src/views/Admin/list.vue index 4a42bf5..84a0b38 100644 --- a/src/views/Admin/list.vue +++ b/src/views/Admin/list.vue @@ -23,8 +23,8 @@ <a-range-picker format="YYYY-MM-DD" :placeholder="['开始时间', '结束时间']" - @change="onChange" - @ok="onOk" + @change="timeChange" + @ok="timeOk" style="width: 100%" /> </a-col> @@ -38,19 +38,19 @@ <!-- 表格实体部分--> <div class="table-cont"> <a-table :columns="columns" :data-source="data" bordered> - <template slot="time" slot-scope="text,record"> + <template #time="text,record"> <a v-if="!record.readed" style="color:red">[未读]</a>{{text}} </template> - <span slot="level" slot-scope="text"> + <template #level="text"> <a-tag :color="text === '黄色' ? 'yellow' :text === '橙色'? 'orange':text === '红色'?'red':'blue'"> {{ text }} </a-tag> - </span> - <template slot="attachment" slot-scope="text"> + </template> + <template #attachment="text"> <span v-if="text==='无'">无</span> <a v-else><b><a-icon type="paper-clip" /> {{text}}</b></a> </template > - <template slot="receipt" slot-scope="text"> + <template #receipt="text"> <span v-if="text=='待叫应'" style='background-color:blue;padding:5px;color:#fff;border-radius: 5px;'>{{text}}</span> <span v-else-if="text=='已叫应'" @@ -58,7 +58,7 @@ <span v-else style='background-color:red;padding:5px;color:#fff;border-radius: 5px;'>{{text}} </span> </template> - <template slot="operation" slot-scope="text, record, index"> + <template #operation="text, record, index"> <div class="editable-row-operations"> <div v-if="record.receipt==='待叫应'"> <a @click="showModal" style="color:orangered"><a-icon type="notification" /> @@ -253,11 +253,11 @@ popupScroll() { console.log('popupScroll'); }, - onChange(date, dateString) { + timeChange(date, dateString) { console.log(date, dateString); }, - onOk(value) { - console.log('onOk: ', value); + timeOk(value) { + console.log('timeOk: ', value); }, //叫应回执时间 showModal() { diff --git a/src/views/Admin/massSend.vue b/src/views/Admin/massSend.vue new file mode 100644 index 0000000..59301a3 --- /dev/null +++ b/src/views/Admin/massSend.vue @@ -0,0 +1,279 @@ +<template> + <div class="inner"> + <h2>预警信息发布</h2> + <a-form-model :model="form" :wrapper-col="wrapperCol"> + <div class="left"> + <a-form-model-item prop="title"> + <a-input v-model="form.title" placeholder="请输入标题" style="height: 50px; font-size: 20px;" /> + </a-form-model-item> +<!-- <a-row>--> +<!-- <a-col :span="12" style="display: flex;align-items: center">--> +<!-- <span style="display: block;margin-bottom: 24px">相关灾种</span>--> + +<!-- </a-col>--> +<!-- <a-col :span="12" style="display: flex;align-items: center;justify-content: right">--> +<!-- <span style="display: block;margin-bottom: 24px">预警级别:</span>--> + +<!-- </a-col>--> +<!-- </a-row>--> + + <a-row> + <a-col :span="12"> + <a-form-model-item prop="type"> + <a-radio-group v-model="form.type" default-value="a" button-style="solid"> + <a-radio-button value="a"> + 常规 + </a-radio-button> + <a-radio-button value="b"> + 紧临 + </a-radio-button> + </a-radio-group> + </a-form-model-item> + </a-col> + <a-col :span="12" style="display: flex;align-items: center;justify-content: right"> + <a-form-model-item prop="riskType" style="margin-right: 20px"> + <a-select placeholder="请选择相关灾种" v-model="form.riskType" style="width: 240px" allowClear @change="handleRisk"> + <a-select-option v-for="item in riskOptions" :key="item.value" :value="item.value"> + {{ item.name }} + </a-select-option> + </a-select> + </a-form-model-item> + <a-form-model-item prop="level"> + <a-select placeholder="请选择预警级别" v-model="form.level" style="width: 240px" allowClear @change="handleLevel"> + <a-select-option v-for="item in levelOptions" :key="item.value" :value="item.value"> + {{ item.name }} + </a-select-option> + </a-select> + </a-form-model-item> + </a-col> + </a-row> + <a-form-model-item prop="message"> + <a-textarea v-model="form.message" placeholder="请输入短信通知内容部分" :auto-size="{ minRows: 3, maxRows: 5 }" /> + </a-form-model-item> + <a-row> + <a-col :span="12"> + <a-button>上传附件</a-button> + </a-col> + <a-col :span="12" style="display: flex;align-items: center;justify-content: right"> + <b style="margin-bottom: 24px">超时设置:</b> + <a-form-model-item prop="overTime"> + <a-input v-model="form.overTime" style="width:200px;" placeholder="输入时间" suffix="分钟"/> + </a-form-model-item> + </a-col> + </a-row> + <span><b>发布单位:</b>{{department}}</span> + <br/><br/> + <!-- 子单位--> + <a-row :gutter="24"> + <a-col :span="12"> + <b style="margin-bottom: 6px">选择接收单位:</b> + <a-form-model-item prop="svalue"> + <a-tree-select + show-search + tree-checkable + treeCheckStrictly + style="width: 100%" + v-model="form.svalue" + :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" + placeholder="选择工作通知接收单位" + allow-clear + multiple + tree-default-expand-all + @change="onChanges" + @search="onSearch" + @select="onSelect" + > + <a-tree-select-node key="0" value="all" title="全选"> + </a-tree-select-node> + <a-tree-select-node key="0-1" value="乌鲁木齐" title="乌鲁木齐(张XX 13268813610)"> + <a-tree-select-node key="0-1-1" value="米东区" title="米东区(张XX 13268813610)"> + <a-tree-select-node key="0-1-1-1" value="XX村1" title="XX村(李有田 13268813610)" /> + </a-tree-select-node> + <a-tree-select-node key="0-1-2" value="天山区" title="天山区"> + <a-tree-select-node key="0-1-2-1" value="XX村2"> + <b slot="title" style="color: #08c">XX村</b> + </a-tree-select-node> + </a-tree-select-node> + </a-tree-select-node> + </a-tree-select> + </a-form-model-item> + </a-col> + <a-col :span="12"> + <b style="margin-bottom: 6px">平级接收人选择:</b> + <a-form-model-item prop="sameDep"> + <a-select mode="multiple" placeholder="选择平级接收单位" v-model="form.sameDep" @change="handle"> + <a-select-option v-for="item in filteredOptions" :key="item" :value="item"> + {{ item }} + </a-select-option> + </a-select> + </a-form-model-item> + </a-col> + </a-row> +<!-- <div>--> +<!-- <b>选择审批领导:</b> --> +<!-- <a-select show-search placeholder="请选择审批领导"--> +<!-- option-filter-prop="children" style="width: 300px" :filter-option="filterOption"--> +<!-- @focus="handleFocus" @blur="handleBlur" @change="handleChange">--> +<!-- <a-select-option value="jack">--> +<!-- 裴小威--> +<!-- </a-select-option>--> +<!-- <a-select-option value="lucy">--> +<!-- 赵东升--> +<!-- </a-select-option>--> +<!-- <a-select-option value="tom">--> +<!-- 王卫萍--> +<!-- </a-select-option>--> +<!-- </a-select>--> +<!-- </div>--> + <div style="display: flex;justify-content: right"> + <a-button type="primary" style="width: 250px;"> + 确认发送 + </a-button> + </div> + </div> + + <div class="right"> + <h2>短信预览</h2> + <div class="mobile"> + <div class="mesg"> + <P>【{{form.title}}】{{form.message}}。发布单位:{{department}}</P> + </div> + + </div> + </div> + </a-form-model> + </div> +</template> + +<script> + + + const OPTIONS = ['自治区消防(李XX)', '自治区公安厅(王XX)', '自治区自然资源厅(刘XX)']; + export default { + name: "release", + data() { + return { + message: '', + signname: '自然灾害风险预警提示', + department: '自治区自然灾害综合监测预警中心', + wrapperCol: { span: 24 }, + form: { + title: '', + riskType: 1, + level: 1, + type: 'a', + svalue: undefined, + sameDep: [], + message: '', + overTime: '' + }, + riskOptions: [ + {name: '地震',value: 1}, + {name: '洪涝',value: 2}, + {name: '气象',value: 3}, + {name: '泥石流',value: 4}, + {name: '水旱',value: 5}, + {name: '森林草原火灾',value: 6} + ], + levelOptions: [ + {name: '红色预警',value: 1}, + {name: '橙色预警',value: 2}, + {name: '黄色预警',value: 3}, + {name: '蓝色预警',value: 4}, + {name: '其他短信通知',value: 5} + ] + }; + }, + components: {}, + computed: { + filteredOptions() { + return OPTIONS.filter(o => !this.form.sameDep.includes(o)); + }, + }, + methods: { + //选择子部门部分 + onChanges(value) { + if(value.find(i=>i.value == 'all')){ + console.log('全选了') + }else{ + this.svalue = value; + } + console.log(this.svalue); + }, + onSearch() { + console.log(...arguments); + }, + onSelect() { + console.log(...arguments); + }, + //选择平级部门部分 + handleRisk(selectedItems) { + // this.selectedItems = selectedItems; + }, + handleLevel(selectedItems) { + // this.selectedItems = selectedItems; + }, + handle(selectedItems) { + // this.selectedItems = selectedItems; + }, + onChange(){ + console.log(this.value) + }, + handleChange(value) { + console.log(`selected ${value}`); + }, + handleBlur() { + console.log('blur'); + }, + handleFocus() { + console.log('focus'); + }, + filterOption(input, option) { + return ( + option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0 + ); + }, + }, + } +</script> + +<style lang="less" scoped> + .left { + width: 58%; + float: left; + } + + .right { + width: 39%; + float: right; + border-left: 1px silver solid; + padding-left: 18px; + + .mobile { + position: relative; + background: black; + border: 1px solid black; + width: 280px; + min-height: 500px; + border-radius: 25px; + margin-left: 20px; + + .mesg { + width: 260px; + margin: 25px auto; + min-height: 450px; + background: white; + padding-top: 10px; + + p { + padding: 15px; + background-color: #f5f5f5; + border-radius: 10px; + font-size: 16px; + margin: 15px 10px; + } + } + } + + } +</style> \ No newline at end of file diff --git a/src/views/Admin/msgReview.vue b/src/views/Admin/msgReview.vue new file mode 100644 index 0000000..51d274e --- /dev/null +++ b/src/views/Admin/msgReview.vue @@ -0,0 +1,189 @@ +<template> + <div class="inner"> + <a-row type="flex" justify="space-between" style="margin-bottom: 20px"> + <a-col :span="8"> + <a-radio-group v-model="category"> + <a-radio-button :value="0"> + 全部 + </a-radio-button> + <a-radio-button :value="1"> + 审核通过 + </a-radio-button> + <a-radio-button :value="2"> + 未审核 + </a-radio-button> + <a-radio-button :value="3"> + 审核驳回 + </a-radio-button> + </a-radio-group> + </a-col> + <a-col :span="16"> + <a-row type="flex" justify="end" :gutter="12"> + <a-col :span="8"> + <a-range-picker + format="YYYY-MM-DD" + :placeholder="['开始时间', '结束时间']" + @change="timeChange" + @ok="timeOk" + style="width: 100%" + /> + </a-col> + <a-col :span="4"> + <a-button type="primary">查询</a-button> + <a-button style="margin-left: 12px">重置</a-button> + </a-col> + </a-row> + </a-col> + </a-row> + + <div class="table-cont"> + <a-table :columns="columns" :data-source="data" bordered> + <template #level="level"> + <a-tag :color="level === '黄色' ? 'yellow' :level === '橙色'? 'orange':level === '红色'?'red':'blue'"> + {{ level }} + </a-tag> + </template> + <template #attachment="text"> + <span v-if="text==='无'">无</span> + <a v-else><b><a-icon type="paper-clip" /> {{text}}</b></a> + </template > + <template #status="status"> + <a-tag + :color="status === 1 ? 'green' : status === 2 ? 'blue' : 'red'" + > + {{ status==1?'审核通过':status==2?'未审核':'审核驳回' }} + </a-tag> + </template> + <template #operation="text, record, index"> + <a-button type="link" v-if="record.status == 1 || record.status == 3">查看信息详情</a-button> + <a-button type="primary" v-if="record.status == 2">查看并审核</a-button> + </template> + </a-table> + </div> + + </div> +</template> + +<script> + +export default { + name: 'msgReview', + components: {}, + data () { + return { + category: 0, + columns: [ + { + title: '序号', + dataIndex: 'key', + width: '5%', + }, + { + title: '提交审核时间', + dataIndex: 'time', + width: '15%', + scopedSlots: { + customRender: 'time' + }, //设置定制化表格数据 + }, + { + title: '发布单位', + dataIndex: 'department', + width: '12%', + }, + { + title: '类别', + dataIndex: 'category', + width: '8%', + }, + { + title: '级别', + dataIndex: 'level', + scopedSlots: { + customRender: 'level' + }, //设置定制化表格数据 + width: '8%', + }, + { + title: '信息标题', + dataIndex: 'title', + width: '16%', + }, + { + title: '附件', + dataIndex: 'attachment', + width: '6%', + scopedSlots: { + customRender: 'attachment' + }, + }, + { + title: '审核情况', + dataIndex: 'status', + width: '10%', + scopedSlots: { + customRender: 'status' + }, //设置定制化表格数据 + }, + { + title: '操作', + dataIndex: 'operation', + scopedSlots: { + customRender: 'operation' + }, + }, + ], + data: [ + { + key: 1, + id:1001, + time: '2023-05-02 15:30', + department: '自治区预警中心', + category: '气象', + level: '黄色', + title: '全疆高温红色预警', + attachment: '1', + status: 1 + }, + { + key: 2, + id:1002, + time: '2023-05-02 15:30', + department: '自治区预警中心', + category: '气象', + level: '橙色', + title: '全疆高温红色预警', + attachment: '1', + status: 2 + }, + { + key: 3, + id:1003, + time: '2023-05-02 15:30', + department: '自治区预警中心', + category: '气象', + level: '橙色', + title: '全疆高温红色预警', + attachment: '1', + status: 3 + } + ] + } + }, + created() { + const t = this + }, + methods:{ + timeChange(date, dateString) { + console.log(date, dateString); + }, + timeOk(value) { + console.log('timeOk: ', value); + }, + } +} +</script> + +<style lang="less" scoped> + +</style> diff --git a/src/views/Admin/Notice.vue b/src/views/Admin/notice.vue similarity index 90% rename from src/views/Admin/Notice.vue rename to src/views/Admin/notice.vue index 4b5a012..2c46405 100644 --- a/src/views/Admin/Notice.vue +++ b/src/views/Admin/notice.vue @@ -40,38 +40,42 @@ <br /><br /> <a-textarea v-model="message" placeholder="请输入短信通知内容部分" :auto-size="{ minRows: 3, maxRows: 5 }" /> - <br /><br /> - <a-button>上传附件</a-button> <div style="float: right;width:50%;text-align: right;">超时设置: <a-input style="width:100px;" placeholder="输入时间" /> 分钟</div> <br /><br /> - <span><b>发布单位:</b>{{department}}</span> - <br/><br/> - <!-- 子单位--> - <b>选择接收单位:</b> - <a-tree-select - show-search - style="width: 100%" - :value="svalue" - :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" - placeholder="选择工作通知接收单位" - allow-clear - multiple - tree-default-expand-all - @change="onChanges" - @search="onSearch" - @select="onSelect" - > - <a-tree-select-node key="0-1" value="乌鲁木齐" title="乌鲁木齐(张XX 13268813610)"> - <a-tree-select-node key="0-1-1" value="米东区" title="米东区(张XX 13268813610)"> - <a-tree-select-node key="0-1-1-1" value="XX村1" title="XX村(李有田 13268813610)" /> - </a-tree-select-node> - <a-tree-select-node key="0-1-2" value="天山区" title="天山区"> - <a-tree-select-node key="0-1-2-1" value="XX村2"> - <b slot="title" style="color: #08c">XX村</b> - </a-tree-select-node> - </a-tree-select-node> - </a-tree-select-node> - </a-tree-select> - + <a-button>上传附件</a-button> <div style="float: right;width:50%;text-align: right;">超时设置: <a-input style="width:100px;" placeholder="输入时间" /> 分钟</div> + <br /><br /> + <span><b>发布单位:</b>{{department}}</span> + <br/><br/> + <!-- 子单位--> + <div style="margin-bottom: 10px">选择接收单位:</div> + <a-tree-select + show-search + tree-checkable + treeCheckStrictly + style="width: 100%" + v-model="svalue" + :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" + placeholder="选择工作通知接收单位" + allow-clear + multiple + tree-default-expand-all + @change="onChanges" + @search="onSearch" + @select="onSelect" + > + <a-tree-select-node key="0" value="all" title="全选"> + </a-tree-select-node> + <a-tree-select-node key="0-1" value="乌鲁木齐" title="乌鲁木齐(张XX 13268813610)"> + <a-tree-select-node key="0-1-1" value="米东区" title="米东区(张XX 13268813610)"> + <a-tree-select-node key="0-1-1-1" value="XX村1" title="XX村(李有田 13268813610)" /> + </a-tree-select-node> + <a-tree-select-node key="0-1-2" value="天山区" title="天山区"> + <a-tree-select-node key="0-1-2-1" value="XX村2"> + <b slot="title" style="color: #08c">XX村</b> + </a-tree-select-node> + </a-tree-select-node> + </a-tree-select-node> + </a-tree-select> + <br/><br/> <div style="float: right;"><b>选择审批领导:</b> <a-select show-search placeholder="请选择审批领导" option-filter-prop="children" style="width: 200px" :filter-option="filterOption" @@ -117,7 +121,7 @@ message: '', signname: '自然灾害风险预警提示', department: '自治区自然灾害综合监测预警中心', - selectedItems: [], + selectedItems: [], svalue:undefined, }; }, @@ -127,24 +131,28 @@ return OPTIONS.filter(o => !this.selectedItems.includes(o)); }, }, - methods: { - //选择子部门部分 - onChanges(value) { - console.log(value); - this.svalue = value; - }, - onSearch() { - console.log(...arguments); - }, - onSelect() { - console.log(...arguments); - }, + methods: { + //选择子部门部分 + onChanges(value) { + if(value.find(i=>i.value == 'all')){ + console.log('全选了') + }else{ + this.svalue = value; + } + console.log(this.svalue); + }, + onSearch() { + console.log(...arguments); + }, + onSelect() { + console.log(...arguments); + }, //选择平级部门部分 handle(selectedItems) { this.selectedItems = selectedItems; - }, - onChange(){ - console.log(this.value) + }, + onChange(){ + console.log(this.value) }, handleChange(value) { console.log(`selected ${value}`); diff --git a/src/views/Admin/sameLevel.vue b/src/views/Admin/sameLevel.vue index 8832d14..1aa7c5f 100644 --- a/src/views/Admin/sameLevel.vue +++ b/src/views/Admin/sameLevel.vue @@ -10,7 +10,7 @@ <a-cascader :options="areaData" v-model="areaVal" placeholder="行政规划" expandTrigger="hover" changeOnSelect @change="onChange" style="width: 100%"/> </a-col> <a-col :span="4"> - <a-button type="primary" @click="getUserList">查询</a-button> + <a-button type="primary">查询</a-button> <a-button style="margin-left: 12px" @click="resetSearch">重置</a-button> </a-col> </a-row> @@ -18,15 +18,18 @@ </a-row> <div class="table-cont"> <a-table :columns="columns" :data-source="tableData" :pagination="pagination" :rowKey="record=>record.name" bordered> - <template #levels="level"> + <template #unittype="unittype"> <a-tag - :color="level === 1 ? 'pink' : level === 2 ? 'blue' : 'green'" + :color="unittype === 1 ? 'purple' : unittype === 2 ? 'blue' : unittype === 3 ? 'cyan' : 'green'" > - {{ level === 1 ? '省级' : level === 2 ? '地(市、州)级' : level === 3 ? '区县级' : '村(乡、镇)级' }} + {{ unittype==1?'省级':unittype==2?'地(市、州)级':unittype==3?'区县级':'村(乡、镇)级' }} </a-tag> </template> - <template #area="area"> - {{findAreaById(areaData,area)}} + <template #area="text,row"> + <span v-if="row.province !== null && row.province !== ''">{{row.province}}</span> + <span v-if="row.city !== null && row.city !== ''">-{{row.city}}</span> + <span v-if="row.area !== null && row.area !== ''">-{{row.area}}</span> + <span v-if="row.town !== null && row.town !== ''">-{{row.town}}</span> </template> <template #action="action,row"> <a-button type="link" @click="editData('edit',row)">编辑</a-button> @@ -34,12 +37,12 @@ </template> </a-table> </div> - <same-level-mod ref="sameLevelMod" @refrech="getUserList"></same-level-mod> + <same-level-mod ref="sameLevelMod" @refrech=""></same-level-mod> </div> </template> <script> -import {getUser} from '@/api/user' +import {getRecipient} from '@/api/user' import sameLevelMod from "@/views/Admin/components/sameLevelMod" export default { name: 'sameLevel', @@ -53,19 +56,22 @@ pageIndex: 1, pageSize: 10, searchParams:{ - districtId: null + province: '', + city: '', + area: '', + town: '' } }, columns:[ { title: '单位名称', - dataIndex: 'depName', - key: 'depName' + dataIndex: 'company', + key: 'company' }, { title: '接收人姓名', - dataIndex: 'name', - key: 'name' + dataIndex: 'recipientName', + key: 'recipientName' }, { title: '手机号码', @@ -74,14 +80,14 @@ }, { title: '级别', - dataIndex: 'level', - key: 'level', - scopedSlots: { customRender: 'levels' } + dataIndex: 'unittype', + // key: 'unittype', + scopedSlots: { customRender: 'unittype' } }, { title: '行政区划', dataIndex: 'area', - key: 'area', + // key: 'area', scopedSlots: { customRender: 'area' } }, { @@ -90,34 +96,12 @@ scopedSlots: { customRender: 'action' } }, ], - tableData: [ - { - depName: '阿勒泰地区自然资源局', - name: 'John Brown', - phone: '15261806177', - level: 1, - area: 111 - }, - { - depName: '阿勒泰地区公安局', - name: 'Jim Green', - phone: '15261806178', - level: 2, - area: 211 - }, - { - depName: '阿勒泰地区自然资源局', - name: 'Joe Black', - phone: '15261806176', - level: 3, - area: 11 - }, - ], + tableData: [], pagination: { current: 1, defaultCurrent: 1, defaultPageSize: 10, - total: 11, + total: 0, onChange: ( page, pageSize ) => this.onPageChange(page,pageSize) }, areaData: [ @@ -158,12 +142,18 @@ }, created() { const t = this - t.getUserList() + t.getSameLevel() }, methods:{ - async getUserList(){ + async getSameLevel(){ const t = this - const res = await getUser(t.search) + const res = await getRecipient(t.search) + if(res.data.code == 100){ + t.tableData = res.data.data + t.pagination.total = res.data.total + }else{ + t.$message.warning(res.data.msg); + } }, resetSearch(){ @@ -173,7 +163,10 @@ pageIndex: 1, pageSize: 10, searchParams:{ - districtId: null + province: '', + city: '', + area: '', + town: '' } } t.getUserList() @@ -191,7 +184,7 @@ }, onChange(value) { const t = this - t.search.searchParams.districtId = value[value.length - 1] + // t.search.searchParams.districtId = value[value.length - 1] }, findAreaById(data,value) { diff --git a/src/views/Admin/smsSetting.vue b/src/views/Admin/smsSetting.vue new file mode 100644 index 0000000..ecd3bf3 --- /dev/null +++ b/src/views/Admin/smsSetting.vue @@ -0,0 +1,9 @@ +<template> + <div class="inner"> + 短信平台设置 + </div> +</template> + +<script> + +</script> \ No newline at end of file diff --git a/src/views/Admin/userManage.vue b/src/views/Admin/userManage.vue index 7ca56eb..d07f68f 100644 --- a/src/views/Admin/userManage.vue +++ b/src/views/Admin/userManage.vue @@ -38,38 +38,42 @@ <div class="table-cont"> <a-table :columns="columns" :data-source="tableData" :pagination="pagination" :rowKey="record=>record.id" bordered> <template #sex="sex"> - {{ sex == 0?'男':'女' }} + {{ sex == 1?'男':'女'}} </template> - <template #level="level"> + <template #unittype="unittype"> <a-tag - :key="level" - :color="level === 1 ? 'pink' : level === 2 ? 'blue' : 'green'" + :color="unittype === 1 ? 'purple' : unittype === 2 ? 'blue' : unittype === 3 ? 'cyan' : 'green'" > - {{ level==1?'省级':level==2?'地(市、州)级':level==3?'区县级':'村(乡、镇)级' }} + {{ unittype==1?'省级':unittype==2?'地(市、州)级':unittype==3?'区县级':'村(乡、镇)级' }} </a-tag> </template> - <template #area="area"> - {{findAreaById(areaData,area)}} + <template #area="text,row"> + <span v-if="row.province !== null && row.province !== ''">{{row.province}}</span> + <span v-if="row.city !== null && row.city !== ''">-{{row.city}}</span> + <span v-if="row.area !== null && row.area !== ''">-{{row.area}}</span> + <span v-if="row.town !== null && row.town !== ''">-{{row.town}}</span> </template> <template #role="role"> - {{ role == 1?'领导':'工作人员'}} + {{ role.roleName}} </template> <template #action="action,row"> <a-button type="link" @click="editData('edit',row)">编辑</a-button> - <a-button type="link" class="delBtn">删除</a-button> + <a-button type="link" class="delBtn" @click="delData(row)">删除</a-button> <a-button type="link" @click="editPwd(row)">重置密码</a-button> </template> </a-table> </div> - <user-mod ref="userMod" @refrech="getUserList"></user-mod> - <pwd-mod ref="pwdMod" @refrech="getUserList"></pwd-mod> + <user-mod ref="userMod" @refresh="getUserList"></user-mod> + <pwd-mod ref="pwdMod" @refresh="getUserList"></pwd-mod> </div> </template> <script> -import {getUser} from '@/api/user' +import {getUser,delUser} from '@/api/user' import userMod from "@/views/Admin/components/userMod" import pwdMod from "@/views/Admin/components/pwdMod"; +import {loginOut} from "@/api/login"; +import {Session} from "@/util/storage"; export default { name: 'user', components: { @@ -85,7 +89,7 @@ searchParams:{ realName: '', districtId: null, - unittype: undefined + unittype: null } }, columns:[ @@ -96,8 +100,8 @@ }, { title: '姓名', - dataIndex: 'name', - key: 'name' + dataIndex: 'realName', + key: 'realName' }, { title: '手机号码', @@ -106,8 +110,8 @@ }, { title: '用户名', - dataIndex: 'userName', - key: 'userName' + dataIndex: 'name', + key: 'name' }, { title: '性别', @@ -117,14 +121,14 @@ }, { title: '级别', - dataIndex: 'level', - key: 'level', - scopedSlots: { customRender: 'level' } + dataIndex: 'unittype', + // key: 'unittype', + scopedSlots: { customRender: 'unittype' } }, { title: '行政区划', dataIndex: 'area', - key: 'area', + // key: 'area', scopedSlots: { customRender: 'area' } }, { @@ -139,43 +143,12 @@ scopedSlots: { customRender: 'action' }, }, ], - tableData: [ - { - id: 1, - name: 'John Brown', - phone: '15261806177', - userName: 'JBrown', - sex: 0, - level: 1, - area: 111, - role: 1 - }, - { - id: 2, - name: 'Jim Green', - phone: '15261806178', - userName: 'JGreen', - sex: 1, - level: 2, - area: 211, - role: 2 - }, - { - id: 3, - name: 'Joe Black', - phone: '15261806176', - userName: 'JBlack', - sex: 0, - level: 3, - area: 11, - role: 1 - }, - ], + tableData: [], pagination: { current: 1, defaultCurrent: 1, defaultPageSize: 10, - total: 11, + total: 0, onChange: ( page, pageSize ) => this.onPageChange(page,pageSize) }, areaData: [ @@ -222,6 +195,35 @@ async getUserList(){ const t = this const res = await getUser(t.search) + if(res.data.code == 100){ + t.tableData = res.data.data + t.pagination.total = res.data.total + }else{ + t.$message.warning(res.data.msg); + } + }, + + async delData(row){ + const t = this + this.$confirm({ + title: '提示', + content: h => <div>是否删除该条用户信息?</div>, + cancelText: '取消', + okText: '确认', + centered: true, + async onOk() { + let res = await delUser(row.id) + if(res.data.code == 100){ + t.$message.success('删除用户信息成功'); + t.getUserList() + }else{ + t.$message.warning(res.data.msg); + } + }, + onCancel() { + console.log('Cancel'); + }, + }); }, resetSearch(){ @@ -233,7 +235,7 @@ searchParams:{ realName: '', districtId: null, - unittype: undefined + unittype: null } } t.getUserList() @@ -247,7 +249,8 @@ editPwd(record){ const t = this - t.$refs.pwdMod.form.id = record.id + t.$refs.pwdMod.form.uid = record.id + t.$refs.pwdMod.updateType = 2 t.$refs.pwdMod.visible = true }, diff --git a/src/views/Home.vue b/src/views/Home.vue index 44ea8d8..e9d3509 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -11,14 +11,14 @@ @click="() => (collapsed = !collapsed)"/> <a-dropdown> <a class="ant-dropdown-link" @click="e => e.preventDefault()"> - 您好,李静 <a-icon type="down"/> + 您好,{{userInfo.realName}} <a-icon type="down"/> </a> <a-menu slot="overlay"> <a-menu-item> - <a href="javascript:;">修改密码</a> + <a href="javascript:;" @click="editPwd">修改密码</a> </a-menu-item> <a-menu-item> - <a href="javascript:;">回到首页</a> + <a href="javascript:;" @click="backHome">回到首页</a> </a-menu-item> <a-menu-item> <a @click="logout">退出登录</a> @@ -32,11 +32,14 @@ }"> <!-- Content --> <router-view ref="tabContent"></router-view> - <div style="height: 30px"></div> + <div style="height: 30px;text-align: center;line-height: 30px"> + 技术支持:中国科学院 + </div> </a-layout-content> </a-layout> </a-layout> + <pwd-mod ref="pwdMod"></pwd-mod> <!-- <center style="textAlign: center;margin-left: 5%;margin-top:50px;">--> <!-- 技术支持:中国科学院--> <!-- </center>--> @@ -46,10 +49,15 @@ <script> import menuSider from "@/layout/menuSider"; import TabsHeader from '@/components/TabsHeader'; + import pwdMod from "@/views/Admin/components/pwdMod"; + import { loginOut } from "@/api/login"; + import { Session } from '@/util/storage'; + import Cookies from 'js-cookie'; export default { name: "Home", data() { return { + userInfo: {}, collapsed: false, //返回logo图片或表述 pageList: [], activePage: '', @@ -59,8 +67,10 @@ components: { menuSider, TabsHeader, + pwdMod }, created() { + this.userInfo = JSON.parse(Cookies.get('userInfo')) const route = this.$route if (this.pageList.findIndex(item => item.path === route.path) === -1) { this.pageList.push(this.createPage(route)) @@ -92,8 +102,41 @@ } }, methods: { + backHome(){ + this.$router.push('/home') + }, + + editPwd(){ + const t = this + t.$refs.pwdMod.updateType = 1 + t.$refs.pwdMod.form.uid = t.userInfo.uid + t.$refs.pwdMod.visible = true + }, + logout(){ - this.$router.push('/') + const t = this + this.$confirm({ + title: '提示', + content: h => <div>该操作将登出,是否继续?</div>, + cancelText: '取消', + okText: '确认', + centered: true, + async onOk() { + const res = await loginOut() + if (res.data.code === 100) { + Session.clear(); // 清除缓存/token等 + // 使用 reload 时,不需要调用 resetRoute() 重置路由 + t.$router.push('/') + // window.location.reload(); + } else { + this.$message.warning(res.data.msg); + } + }, + onCancel() { + console.log('Cancel'); + }, + class: 'test', + }); }, changePage(key) { this.activePage = key diff --git a/src/views/Login.vue b/src/views/Login.vue index da63a14..605f8eb 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -18,6 +18,7 @@ placeholder="请输入用户" size="large" v-model="form.name" + autocomplete="new-password" > <a-icon slot="prefix" type="user" style="color:rgba(0,0,0,.25)" /> </a-input> @@ -28,6 +29,7 @@ placeholder="请输入密码" size="large" v-model="form.pwd" + autocomplete="new-password" > <a-icon slot="prefix" type="lock" style="color:rgba(0,0,0,.25)" /> </a-input-password> @@ -78,8 +80,8 @@ <!-- </a-tab-pane>--> <!-- </a-tabs>--> <div style="margin-bottom: 20px"> - <a-checkbox :checked="true" style="color:#fff;">自动登录</a-checkbox> - <a style="float: right">忘记密码</a> + <a-checkbox :checked="isAuto" style="color:#fff;">自动登录</a-checkbox> +<!-- <a style="float: right">忘记密码</a>--> </div> <a-form-item style="text-align: center"> <a-button @@ -88,6 +90,7 @@ style="width: 100%" size="large" @click="handleSubmit" + :loading="isLoading" > 登录 </a-button> @@ -100,12 +103,14 @@ <script> -import { Login, getMenuAdmin } from "@/api/login"; +import { login, getMenuAdmin } from "@/api/login"; import Cookies from 'js-cookie'; export default { name: "login", data() { return { + isLoading: false, + isAuto: false, // hasErrors, // form: this.$form.createForm(this), form: { @@ -119,7 +124,7 @@ menu: [] }; }, - mounted() { + created() { // this.$nextTick(() => { // this.form.validateFields(); // }); @@ -128,15 +133,17 @@ handleSubmit() { this.$refs.ruleForm.validate(async (valid) => { if (valid) { - const res = await Login(this.form) + this.isLoading = true + const res = await login(this.form) if (res.data.code === 100) { Cookies.set('resTk', res.data.data.tk); Cookies.set('resUid', res.data.data.uid); + Cookies.set('userInfo',JSON.stringify(res.data.data),{expires: 7}) this.$router.push('/home') } else { - console.log(res.data.msg) this.$message.warning(res.data.msg); } + this.isLoading = false } else { console.log('error submit!!'); return false; @@ -170,7 +177,7 @@ } .hedaer { margin: 0px auto; - padding-top:100px; + padding-top:200px; width: 1000px; text-align: center; text-shadow:0 0 1px #000; -- Gitblit v1.9.2