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