马宇豪
2023-06-08 d081cdaabcb942298f1df374f6a1cd626741098f
新增页面和配置,部分接口对接
已重命名1个文件
已修改17个文件
已添加4个文件
已删除1个文件
1219 ■■■■ 文件已修改
src/api/login.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/user.js 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/menu/index.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/util/AntDesign.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/util/permission.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/util/request.js 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/util/storage.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/HomeDefault.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/ModuleOne.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/components/pwdMod.vue 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/components/sameLevelMod.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/components/userMod.vue 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/list.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/massSend.vue 279 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/msgReview.vue 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/notice.vue 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/sameLevel.vue 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/smsSetting.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/userManage.vue 115 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home.vue 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Login.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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',
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,
    })
}
}
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,
    })
}
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",
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,
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'),
        // },
    ]
  },
];
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;
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();
    }
});
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);
    }
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();
    },
};
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()
src/views/Admin/ModuleOne.vue
文件已删除
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;
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;
        }
      });
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;
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() {
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>
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>
src/views/Admin/notice.vue
文件名从 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}`);
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) {
src/views/Admin/smsSetting.vue
对比新文件
@@ -0,0 +1,9 @@
<template>
  <div class="inner">
    短信平台设置
  </div>
</template>
<script>
</script>
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
    },
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
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;