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