鲁班七号
2023-05-22 83d52c58d6717a2233e1b04e22769f58afcbf20b
初始化
已修改1个文件
已添加44个文件
已删除1个文件
14143 ■■■■■ 文件已修改
.DS_Store 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.en.md 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
babel.config.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json 11653 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
public/index.html 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/.DS_Store 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/.DS_Store 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/img/.DS_Store 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/img/bg.jpeg 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/img/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/user.png 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Home/Dynamic.vue 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Home/IndexEcharts.vue 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Home/Projecting.vue 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Home/QuickNavigation.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Home/Team.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/ResponseList.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/TabsHeader.vue 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/menu/index.js 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/menuSider.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/index.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/util/AntDesign.js 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/Audit.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/Details.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/History.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/HomeDefault.vue 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/List.vue 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/ModuleOne.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/Notice.vue 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/Release.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/Report.vue 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/Response.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/Torelease.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/UserManage.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Admin/Wendy.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home.vue 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Login.vue 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/SameLevel.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.DS_Store
Binary files differ
.gitignore
对比新文件
@@ -0,0 +1,19 @@
# Build and Release Folders
bin-debug/
bin-release/
[Oo]bj/
[Bb]in/
node_modules
# Other files and folders
.settings/
# Executables
*.swf
*.air
*.ipa
*.apk
# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties`
# should NOT be excluded as they contain compiler settings and other important
# information for Eclipse / Flash Builder.
README.en.md
文件已删除
README.md
@@ -1,37 +1,15 @@
# 自然灾害二期
### 1、菜单代码位置
#### 介绍
自然灾害响应回执系统
/src/layout/menu
#### 软件架构
软件架构说明
### 2、首页最近叫应组件
/src/components/Home/Dynamic
#### 安装教程
### 3、其他首页组件
1.  xxxx
2.  xxxx
3.  xxxx
/src/components/Home/
#### 使用说明
### 4、组件路由备忘,建议直接查看路由文件
1.  xxxx
2.  xxxx
3.  xxxx
#### 参与贡献
1.  Fork 本仓库
2.  新建 Feat_xxx 分支
3.  提交代码
4.  新建 Pull Request
#### 特技
1.  使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2.  Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3.  你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4.  [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5.  Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6.  Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
/views/Admin/Notice
babel.config.js
对比新文件
@@ -0,0 +1,12 @@
module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    ['import', {
      'libraryName': 'ant-design-vue',
      'libraryDirectory': 'es',
      'style': 'css'
    }]
  ]
}
package-lock.json
对比新文件
文件太大
package.json
对比新文件
@@ -0,0 +1,35 @@
{
  "name": "response",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve --open",
    "build": "vue-cli-service build"
  },
  "dependencies": {
    "ant-design-vue": "^1.7.7",
    "core-js": "^3.6.5",
    "echarts": "^5.1.2",
    "moment": "^2.29.1",
    "quill-image-resize-module": "^3.0.0",
    "vue": "^2.6.11",
    "vue-quill-editor": "^3.0.6",
    "vue-router": "^3.2.0",
    "vuex": "^3.4.0"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-router": "~4.5.0",
    "@vue/cli-plugin-vuex": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "babel-plugin-import": "^1.13.3",
    "less": "^3.0.4",
    "less-loader": "^5.0.0",
    "vue-template-compiler": "^2.6.11"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}
public/favicon.ico
public/index.html
对比新文件
@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>
src/.DS_Store
Binary files differ
src/App.vue
对比新文件
@@ -0,0 +1,24 @@
<template>
  <div id="app">
    <router-view/>
  </div>
</template>
<style lang="less">
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
* {
  margin: 0px;
  padding: 0px;
}
.inner{
    background-color: #fff;padding: 20px 10px;
    height: 100vh;
}
.ftright{
    float:right;
}
</style>
src/assets/.DS_Store
Binary files differ
src/assets/img/.DS_Store
Binary files differ
src/assets/img/bg.jpeg
src/assets/img/logo.png
src/assets/logo.png
src/assets/user.png
src/components/Home/Dynamic.vue
对比新文件
@@ -0,0 +1,53 @@
<template>
  <a-card title="最新叫应记录">
    <a-list item-layout="horizontal" :data-source="lists">
      <a-list-item slot="renderItem" slot-scope="item">
        <a-list-item-meta
          :description="item.created | filterTime"
        >
          <a slot="title" href="#">{{ item.title }}</a>
          <a-avatar
            slot="avatar"
            src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"
          />
        </a-list-item-meta>
      </a-list-item>
    </a-list>
  </a-card>
</template>
<script>
export default {
  name: "Dynamic",
  data() {
    return {
      lists: [
        {
          title: "阿勒泰地区莽村 李有田 在 20230301大风红色预警提示 进行了“已安排部署”叫应。",
          created: '2023-03-1 12:12:12'
        },
        {
          title: "李宏伟 在 20230301大风红色预警提示 进行了“已安排部署”叫应。",
          created: '2023-03-12 12:12:12'
        },
        {
          title: "李宏伟 在 20230301大风红色预警提示 进行了“已安排部署”叫应。",
          created: '2023-03-12 12:12:12'
        },
        {
          title: "李宏伟 在 20230301大风红色预警提示 进行了“已安排部署”叫应。",
          created: '2023-03-12 12:12:12'
        },
        {
          title: "阿勒泰地区莽村 李有田 在 20230311大风红色预警工作通知 进行了“已安排部署”叫应。",
          created: '2023-03-12 12:12:12'
        },
        {
          title: "木木  在 20230301大风红色预警提示 进行了“已安排部署”叫应。",
          created: '2023-03-12 12:12:12'
        }
      ],
    };
  },
};
</script>
src/components/Home/IndexEcharts.vue
对比新文件
@@ -0,0 +1,86 @@
<template>
  <a-card title="综合预警指数">
    <div id="echartsMain" style="height: 300px;"></div>
  </a-card>
</template>
<script>
import * as echarts from 'echarts'
export default {
  name: "index-echarts",
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      let chartDom = document.getElementById("echartsMain");
      let myChart = echarts.init(chartDom);
      myChart.setOption({
        legend: {
          data: ["红", "橙", "黄"],
          bottom: '10',
          icon: 'circle'
        },
        tooltip: {
          show: true,
          axisPointer: {
            type: 'cross',
            animation: true
          },
          backgroundColor: 'rgba(255, 255, 255, .5)'
        },
        radar: {
          shape: 'circle',
          indicator: [
            { name: "地震", max: 80 },
            { name: "森林草原火灾", max: 80 },
            { name: "水旱", max: 80 },
            { name: "地质", max: 80 },
            { name: "气象", max: 80 }
          ],
        },
        series: [
          {
            type: "radar",
            data: [
              {
                value: [10, 40, 20, 60, 10, 60],
                name: "红",
                lineStyle:{
                    color:'red'
                },
                itemStyle: {
                    color:'red'
                }
              },
              {
                value: [50, 14, 28, 26, 42, 21],
                name: "橙",
                lineStyle:{
                    color:'#f66d05'
                },
                itemStyle: {
                    color:'#f66d05'
                }
              },
              {
                value: [60, 20, 43, 73, 12, 80],
                name: "黄",
                lineStyle:{
                    color:'#f7ad00'
                },
                itemStyle: {
                    color:'#f7ad00'
                }
              },
            ],
          },
        ],
      });
    },
  },
};
</script>
src/components/Home/Projecting.vue
对比新文件
@@ -0,0 +1,108 @@
<template>
  <a-card title="近期通知" class="projecting">
    <a slot="extra" href="#" style="color: rgb(19, 194, 194)">全部通知</a>
    <a-card-grid style="width:33.33%;text-align:center" v-for="(item, index) in lists" :key="'projecting' + index">
      <div class="title">
        <img :src="item.img" :alt="item.title">
        <span>{{ item.title }}</span>
      </div>
      <p>{{ item.content }}</p>
      <div class="project-item">
        <b>{{ item.name }}</b>
        <span>{{ item.created | filterTime }}</span>
      </div>
    </a-card-grid>
  </a-card>
</template>
<script>
export default {
  name: 'projecting',
  data () {
    return {
      lists: [
        {
          img: require('@/assets/user.png'),
          title: '气象 红色预警',//显示灾害种类和对应颜色级别
          content: '根据中央气象台消息,全疆近日气温将……',
          name: '自治区',
          created: '2020-10-12 12:12:12'
        },
        {
          img: require('@/assets/user.png'),
          title: '气象 红色预警',
          content: '今日阿勒泰地区将持续低温,请各单位……',
          name: '阿勒泰地区',
          created: '2021-08-21 12:12:12'
        },
        {
          img: require('@/assets/user.png'),
          title: '气象 黄色预警',
          content: '根据中央气象台消息,全疆近日气温将……',
          name: '自治区',
          created: '2022-10-12 12:12:12'
        },
        {
          img: require('@/assets/user.png'),
          title: '气象 红色预警',
          content: '根据中央气象台消息,全疆近日气温将……',
          name: '自治区',
          created: '2022-08-21 12:12:12'
        },
        {
          img: require('@/assets/user.png'),
          title: '气象 红色预警',
          content: '根据中央气象台消息,全疆近日气温将……',
          name: '自治区',
          created: '2022-10-12 12:12:12'
        },
        {
          img: require('@/assets/user.png'),
          title: '气象 红色预警',
          content: '根据中央气象台消息,全疆近日气温将……',
          name: '自治区',
          created: '2022-08-25 12:12:12'
        }
      ]
    }
  }
}
</script>
<style lang="less" scoped>
.projecting {
  .title {
    text-align: left;
    margin-bottom: 10px;
    img {
      width: 32px;
      height: 32px;
      margin-right: 16px;
    }
    span {
      color: rgba(0, 0, 0, 0.85);
      font-weight: 500;
      font-size: 16px;
    }
  }
  p {
    text-align: left;
    height: 44px;
    line-height: 22px;
    overflow: hidden;
    color: rgba(0, 0, 0, 0.45);
  }
  .project-item {
    display: flex;
    justify-content: space-between;
    span {
      &:first-child {
        &:hover {
          color: rgb(19, 194, 194);
          cursor: pointer;
        }
      }
    }
  }
}
</style>
src/components/Home/QuickNavigation.vue
对比新文件
@@ -0,0 +1,28 @@
<template>
  <a-card title="快捷操作" class="quick">
    <a style="color:blue">待叫应(1)</a>
    <a >待审核</a>
    <a>发布通知</a>
    <a>查看统计</a>
    <a>用户管理</a>
    <!-- <a-button><a-icon type="plus" />添加</a-button> -->
  </a-card>
</template>
<script>
export default {
  name: 'quick-navigation'
}
</script>
<style lang="less" scoped>
.quick {
  a {
    display: inline-block;
    width: 25%;
    font-size: 14px;
    margin-bottom: 13px;
    color: #333;
  }
}
</style>
src/components/Home/Team.vue
对比新文件
@@ -0,0 +1,60 @@
<template>
  <a-card title="各地区统计数据">
    <div class="item" v-for="(item, index) in lists" :key="'team' + index">
      <a style="border: 1px solid #1890ff;padding: 5px 8px;border-radius: 5px;">{{ item.title }}</a>
    </div>
  </a-card>
</template>
<script>
export default {
  name: 'Team',
  data () {
    return {
      lists: [
        {
          title: '全疆汇总',
          url:''
        },
        {
          title: '乌鲁木齐市',
          url:''
        },
        {
          title: '吐鲁番市',
          url:''
        },
        {
          title: '昌吉市',
          url:''
        },
        {
          title: '巴音郭楞蒙古自治州',
          url:''
        },
        {
          title: '伊犁哈萨克自治州',
          url:''
        },
        {
          title: '阿克苏地区',
          url:''
        },
      ]
    }
  }
}
</script>
<style lang="less" scoped>
.item {
  width: 50%;
  display: inline-block;
  margin-bottom: 20px;
  img {
    width: 32px;
    height: 32px;
    margin-right: 20px;
  }
}
</style>
src/components/ResponseList.vue
对比新文件
@@ -0,0 +1,8 @@
<template>
</template>
<script>
</script>
<style>
</style>
src/components/TabsHeader.vue
对比新文件
@@ -0,0 +1,53 @@
<template>
  <ul>
    <li v-for="(page, index) in pageList" :key="index" :class="page.path == activePage ? 'act' : ''">
      <span @click="onTabClick(page.path)">{{page.title}}</span>
      <a-icon type="close" @click="onClose(page.path)"/>
    </li>
  </ul>
</template>
<script>
export default {
  name: 'tabs-header',
  props: {
    pageList: Array,
    activePage: String
  },
  methods: {
    onTabClick(key) {
      if(this.activePage !== key) {
        this.$emit('change', key)
      }
    },
    onClose(key) {
      this.$emit('close', key)
    }
  }
}
</script>
<style lang="less" scoped>
ul {
  display: flex;
  list-style-type: none;
  padding-left: 16px;
  margin-top: 16px;
  margin-bottom: 0px;
  li {
    padding: 5px 10px;
    background-color: rgb(250,250,250);
    margin-right: 10px;
    border-radius: 5px;
    cursor: pointer;
    span {
      font-size: 14px;
      margin-right: 10px;
    }
  }
  .act {
    background-color: #fff;
    color: rgb(24,144,255);
  }
}
</style>
src/layout/menu/index.js
对比新文件
@@ -0,0 +1,102 @@
const menuData = [{
        MenuTitle: "首页",
        Icon: "home",
        MenuID: "1",
        Children: [{
                MenuID: "11",
                MenuTitle: "控制面板",
                MenuPath: "/home",
            },
            {
                MenuID: "18",
                MenuTitle: "实时气象",
                MenuPath: "/wendy",
            },
            {
                MenuID: "12",
                MenuTitle: "我收到的",
                MenuPath: "/list"
            },
            {
                MenuID: "14",
                MenuTitle: "我发布的",
                MenuPath: "/release"
            },
            {
                MenuID: "13",
                MenuTitle: "数据统计",
                MenuPath: "/audit"
            }
        ],
    },
    {
        MenuTitle: "预警信息管理",
        Icon: "mail",
        MenuID: "2",
        Children: [{
                MenuID: "21",
                MenuTitle: "信息编辑",
                MenuPath: "/torelease",
            },
            {
                MenuID: "24",
                MenuTitle: "信息发布",
                MenuPath: "/report",
            },
            {
                MenuID: "22",
                MenuTitle: "历史信息",
                MenuPath: "/history",
            },
            {
                MenuID: "23",
                MenuTitle: "叫应记录",
                MenuPath: "/responses",
            },
        ],
    },
    {
        MenuTitle: "短信管理",
        Icon: "message",
        MenuID: "3",
        Children: [{
                MenuID: "31",
                MenuTitle: "常规群发",
                MenuPath: "/module",
            },
            {
                MenuID: "32",
                MenuTitle: "短信记录",
                MenuPath: "/",
            },
            {
                MenuID: "33",
                MenuTitle: "平级接收人管理",
                MenuPath: "/samelevel",
            },
        ],
    },
    {
        MenuTitle: "设置",
        Icon: "setting",
        MenuID: "4",
        Children: [{
                MenuID: "41",
                MenuTitle: "用户管理",
                MenuPath: "/user",
            },
            {
                MenuID: "42",
                MenuTitle: "短信平台设置",
                MenuPath: "/smssetting",
            },
            {
                MenuID: "43",
                MenuTitle: "菜单权限",
                MenuPath: "/munu",
            },
        ],
    },
]
export default menuData;
src/layout/menuSider.vue
对比新文件
@@ -0,0 +1,43 @@
<template>
  <a-menu
    theme="dark"
    mode="inline"
    :selectedKeys="[$route.path]"
    :openKeys="openKeys"
    @openChange="onOpenChange"
  >
    <a-sub-menu :key="nav.MenuID" v-for="nav in navData">
      <div slot="title">
        <a-icon :type="nav.Icon" />
        <span>{{ nav.MenuTitle }} </span>
      </div>
      <a-menu-item :key="nChild.MenuPath" v-for="nChild in nav.Children">
        <router-link :to="nChild.MenuPath">
          {{ nChild.MenuTitle }}
        </router-link>
      </a-menu-item>
    </a-sub-menu>
  </a-menu>
</template>
<script>
import menuData from './menu'
export default {
  name: "menu-sider",
  data() {
    return {
      navData: menuData,
      openKeys: ['1','2','3','4']
    };
  },
  methods: {
    onOpenChange(openKeys) {
      if (openKeys.length !== 0) {
        this.openKeys = [openKeys[1]]
      } else {
        this.openKeys = ['']
      }
    },
  }
};
</script>
src/main.js
对比新文件
@@ -0,0 +1,29 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import './util/AntDesign'
import 'ant-design-vue/dist/antd.css'
import moment from 'moment'
//设置组件默认中文
import 'moment/locale/zh-cn';
moment.locale('zh-cn');
Vue.config.productionTip = false
Vue.filter('filterTime', (value) => {
  moment.locale('zh-cn') // 使用中文
  // 判断当前日期是否是7天之前
  if (moment(value).isBefore(moment().subtract(7, 'days'))) {
    return moment(value).format('YYYY-MM-DD')
  } else {
    // 1小时前
    return moment(value).from(moment())
  }
})
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
src/router/index.js
对比新文件
@@ -0,0 +1,106 @@
import Vue from "vue";
import VueRouter from "vue-router";
Vue.use(VueRouter);
const routes = [
  {
    path: '/',
    name: 'login',
    component: () => import('@/views/Login'),
    meta: { title: '登录' },
  },
  {
    path: '/home',
    name: 'home',
    component: () => import('@/views/Home'),
    children: [
      {
        path: '/home',
        name: 'default',
        meta: { title: '控制面板' },
        component: () => import('@/views/Admin/HomeDefault'),
      },
      {
        path: '/wendy',
        name: 'default',
        meta: { title: '实时气象' },
        component: () => import('@/views/Admin/Wendy'),
      },
      {
        path: '/release',
        name: 'release',
        meta: { title: '我发布的' },
        component: () => import('@/views/Admin/Release'),
      },
      {
        path: '/list',
        name: 'list',
        meta: { title: '我收到的' },
        component: () => import('@/views/Admin/List'),
      },
      {
        path: '/details',
        name: 'detail',
        meta: { title: '信息详情' },
        component: () => import('@/views/Admin/Details'),
      },
      {
        path: '/audit',
        name: 'audit',
        meta: { title: '数据统计' },
        component: () => import('@/views/Admin/Audit'),
      },
      {
        path: '/torelease',
        name: 'torelease',
        meta: { title: '信息编辑' },
        component: () => import('@/views/Admin/Notice'),
      },
      {
        path: '/report',
        name: 'report',
        meta: { title: '信息发布' },
        component: () => import('@/views/Admin/Report'),
      },
      {
        path: '/history',
        name: 'history',
        meta: { title: '历史信息' },
        component: () => import('@/views/Admin/History'),
      },
      {
        path: '/responses',
        name: 'response',
        meta: { title: '叫应记录' },
        component: () => import('@/views/Admin/Response'),
      },
      {
        path: '/samelevel',
        name: 'samelevel',
        meta: { title: '叫应记录' },
        component: () => import('@/views/SameLevel'),
      },
      {
        path: '/user',
        name: 'user',
        meta: { title: '管理' },
        component: () => import('@/views/Admin/UserManage'),
      },
    ]
  },
];
const router = new VueRouter({
  mode: "history",
  base: process.env.BASE_URL,
  routes,
});
// 全局后置钩子
router.afterEach((to) => {
  // 设置title
  document.title = to.meta.title;
});
export default router;
src/store/index.js
对比新文件
@@ -0,0 +1,15 @@
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})
src/util/AntDesign.js
对比新文件
@@ -0,0 +1,51 @@
import Vue from "vue";
import {
  Button,
  Layout,
  Menu,
  Icon,
  Form,
  Input,
  Tabs,
  Checkbox,
  Row,
  Col,
  Avatar,
  Divider,
  Card,
  List,
  Tooltip,
  Dropdown,
  Select,
  Radio,
  DatePicker,
  Table,
  Tag,
  Modal,
  TreeSelect,
  Alert
} from "ant-design-vue";
Vue.use(Alert);
Vue.use(TreeSelect);
Vue.use(Button);
Vue.use(Layout);
Vue.use(Menu);
Vue.use(Icon);
Vue.use(Form);
Vue.use(Input);
Vue.use(Tabs);
Vue.use(Checkbox);
Vue.use(Row);
Vue.use(Col);
Vue.use(Avatar);
Vue.use(Divider);
Vue.use(Card);
Vue.use(List);
Vue.use(Tooltip);
Vue.use(Dropdown);
Vue.use(Select);
Vue.use(Radio);
Vue.use(DatePicker);
Vue.use(Table);
Vue.use(Tag);
Vue.use(Modal);
src/views/Admin/Audit.vue
对比新文件
@@ -0,0 +1,9 @@
<template>
    <div>数据统计模块待呈现</div>
</template>
<script>
</script>
<style>
</style>
src/views/Admin/Details.vue
对比新文件
@@ -0,0 +1,54 @@
<template>
    <div class="inner">
        <h2>标题:{{title}}</h2>
        <p><b>类别:</b>{{category}}</p>
        <p><b>级别:</b><a-tag :color="level === '黄色' ? 'yellow' :level === '橙色'? 'orange':level === '红色'?'red':'blue'">
                    {{ level }}
                </a-tag></p>
        <p><b>发布单位:</b>{{department}}</p>
        <p><b>短信内容:</b><i>{{smsmessage}}</i></p>
        <p><b>附件内容:</b><a :href=attachment.url><a-icon type="link" />  {{attachment.title}}</a></p>
        <p><b>响应状态:</b>
        <span v-if="receipt=='待叫应'"
                    style='background-color:blue;padding:5px;color:#fff;border-radius: 5px;'>{{receipt}}</span>
                <span v-else-if="receipt=='已叫应'"
                    style='background-color:limegreen;padding:5px;color:#2a2a2a;border-radius: 5px;'>{{receipt}}</span>
                <span v-else style='background-color:red;padding:5px;color:#fff;border-radius: 5px;'>{{receipt}}
                </span></p>
    </div>
</template>
<script>
    export default{
        data(){
            return{
                        key: 1,
                        id:1001,
                        time: '2023年5月3日 15:30',
                        department: '自治区预警中心',
                        category: '气象',
                        level: '黄色',
                        title: '标题:全疆(地区)高温橙色预警',
                        attachment: {
                            title:'中央气象台2023年5月3日报告',
                            url:'http://www.baidu.com'
                        },
                        smsmessage: '【自然灾害预警提示】中央气象台2023年5月3日报告,我省南部将持续高温天气,请各部门注意采取相应措施。发布单位:自治区预警中心',
                        receipt: '已叫应'
            }
        }
    }
</script>
<style scoped>
p{
    font-size:16px;
}
i{
    background-color: aliceblue;
    padding: 2px 5px;
}
.inner{
    padding:25px 25px;
}
</style>
src/views/Admin/History.vue
对比新文件
@@ -0,0 +1,183 @@
<template>
    <div class="inner">
        <template>
            <a-alert message="提示:此处显示您及您辖区下的所有历史发布信息。" type="info" close-text="关闭提示" />
        </template>
        <br />
        <a-radio-group v-model="category">
            <a-radio-button value="default">
                全部
            </a-radio-button>
            <a-radio-button value="1">
                紧临
            </a-radio-button>
            <a-radio-button value="2">
                常规
            </a-radio-button>
        </a-radio-group>
        <div style="float:right">
            时间区间筛选:<a-range-picker :placeholder="['开始时间', '结束时间']" @change="onChange" />
        </div>
        <br /><br />
        <!-- 表格实体部分-->
        <a-table :columns="columns" :data-source="data" bordered>
            <span slot="level" slot-scope="text">
                <a-tag :color="text === '黄色' ? 'yellow' :text === '橙色'? 'orange':text === '红色'?'red':'blue'">
                    {{ text }}
                </a-tag>
            </span>
            <template slot="attachment" slot-scope="text">
                <span v-if="text==='无'">无</span>
                <a v-else><b><a-icon type="paper-clip" /> {{text}}</b></a>
            </template>
            <template slot="operation" slot-scope="text, record, index">
                <div class="editable-row-operations">
                    <a @click="showModal" style="color:orangered">
                        叫应列表</a>&nbsp;&nbsp;
                    <router-link :to="{path:'/details',query: {id: record.id}}">信息详情</router-link>
                </div>
            </template>
        </a-table>
        <!-- 对话框 -->
        <a-modal title="查看叫应详情" okText="确认" cancelText="关闭" :visible="visible" :confirm-loading="confirmLoading"
            @ok="handleOk" @cancel="handleOk">
        </a-modal>
    </div>
</template>
<script>
    const columns = [{
            title: '序号',
            dataIndex: 'key',
            width: '8%',
        },
        {
            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: 'receipt',
            width: '10%',
            scopedSlots: {
                customRender: 'receipt'
            }, //设置定制化表格数据
        },
        {
            title: '操作',
            dataIndex: 'operation',
            scopedSlots: {
                customRender: 'operation'
            },
        },
    ];
    const data = [{
            key: 1,
            id: 1001,
            time: '2023年5月3日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '黄色',
            title: '全疆高温黄色预警',
            attachment: '1',
            receipt: '部分叫应'
        },
        {
            key: 2,
            id: 1002,
            time: '2023年5月3日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '黄色',
            title: '全疆高温黄色预警',
            attachment: '1',
            receipt: '全部叫应'
        }, {
            key: 3,
            id: 1003,
            time: '2023年5月3日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '黄色',
            title: '全疆高温黄色预警',
            attachment: '1',
            receipt: '均未叫应'
        }, {
            key: 4,
            id: 1004,
            time: '2023年5月3日 15:30',
            department: '阿克苏应急管理局',
            category: '气象',
            level: '红色',
            title: '阿克苏地区高温红色预警',
            attachment: '1',
            receipt: '均未叫应'
        }, {
            key: 5,
            id: 1005,
            time: '2023年5月1日 15:30',
            department: '阿克苏应急管理局',
            category: '气象',
            level: '红色',
            title: '全疆高温红色预警',
            attachment: '1',
            receipt: '均未叫应'
        }
    ]
    export default {
        data() {
            return {
                category: 'default',
                data,
                columns,
                visible: false,
                confirmLoading: false,
            }
        },
        methods: {
            //弹出层
            showModal() {
                this.visible = true;
            },
            handleOk(e) {
                this.visible = false;
            },
        }
    }
</script>
src/views/Admin/HomeDefault.vue
对比新文件
@@ -0,0 +1,122 @@
<template>
  <div class="home-default">
    <div class="home-default-header">
      <h1>工作台</h1>
      <div class="content">
        <div class="content-left">
          <img src="./../../assets/user.png" alt="">
          <div class="user">
            <h2>{{ dateTime + ',李静,欢迎使用自治区自然灾害综合风险预警发布及响应联动系统。' }}</h2>
            <p>自治区预警中心干部  工作人员</p>
          </div>
        </div>
        <div class="content-right">
          <div class="item">
            <p>本月通知数</p>
            <span>646</span>
          </div>
          <a-divider type="vertical" style="height: 100%; margin: 0px 16px"/>
          <div class="item">
            <p>叫应数</p>
            <span>568</span>
          </div>
          <a-divider type="vertical" style="height: 100%; margin: 0px 16px"/>
          <div class="item">
            <p>叫应率</p>
            <span>88%</span>
          </div>
        </div>
      </div>
    </div>
    <div class="home-default-content">
      <div class="left">
        <Projecting />
        <Dynamic style="margin-top: 20px"/>
      </div>
      <div class="right">
        <QuickNavigation />
        <IndexEcharts style="margin-top: 20px"/>
        <Team style="margin-top: 20px"/>
      </div>
    </div>
  </div>
</template>
<script>
import Projecting from '@/components/Home/Projecting'
import Dynamic from '@/components/Home/Dynamic'
import QuickNavigation from '@/components/Home/QuickNavigation'
import IndexEcharts from '@/components/Home/IndexEcharts'
import Team from '@/components/Home/Team'
export default {
  name: 'home-default',
  components: {
    Projecting,
    Dynamic,
    QuickNavigation,
    IndexEcharts,
    Team
  },
  computed: {
    dateTime () {
      let date = new Date()
      if (date.getHours() >= 0 && date.getHours() < 12) {
        return '上午好'
      } else if (date.getHours() >= 12 && date.getHours() < 18) {
        return '下午好'
      } else {
        return '晚上好'
      }
    }
  }
}
</script>
<style lang="less" scoped>
.home-default {
  .home-default-header {
    background-color: #fff;
    padding: 24px;
    h1 {
      font-size: 20px;
      color: rgba(0, 0, 0, 0.85);
      margin-bottom: 16px;
    }
    .content {
      display: flex;
      justify-content: space-between;
      .content-left {
        display: flex;
        img {
          width: 64px;
          height: 64px;
          margin-right: 20px;
        }
        .user {
          p {
            margin-bottom: 0px;
          }
        }
      }
      .content-right {
        display: flex;
        .item {
          text-align: center;
        }
      }
    }
  }
  .home-default-content {
    display: flex;
    justify-content: space-between;
    margin-top: 20px;
    .left {
      width: 66%;
    }
    .right {
      width: 33%;
    }
  }
}
</style>
src/views/Admin/List.vue
对比新文件
@@ -0,0 +1,261 @@
<template>
    <div class="inner">
        <a-radio-group v-model="category">
            <a-radio-button value="default">
                全部
            </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>
        <div style="float:right">
            时间区间筛选:<a-range-picker :placeholder="['开始时间', '结束时间']" @change="onChange" />
        </div>
        <br /><br />
        <!-- 表格实体部分-->
        <a-table :columns="columns" :data-source="data" bordered>
            <template slot="time" slot-scope="text,record">
                <a v-if="!record.readed" style="color:red">[未读]</a>{{text}}
            </template>
            <span slot="level" slot-scope="text">
                <a-tag :color="text === '黄色' ? 'yellow' :text === '橙色'? 'orange':text === '红色'?'red':'blue'">
                    {{ text }}
                </a-tag>
            </span>
            <template slot="attachment" slot-scope="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">
                <span v-if="text=='待叫应'"
                    style='background-color:blue;padding:5px;color:#fff;border-radius: 5px;'>{{text}}</span>
                <span v-else-if="text=='已叫应'"
                    style='background-color:limegreen;padding:5px;color:#2a2a2a;border-radius: 5px;'>{{text}}</span>
                <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">
                <div class="editable-row-operations">
                    <div v-if="record.receipt==='待叫应'">
                        <a @click="showModal" style="color:orangered"><a-icon type="notification" />
                            确认已收到</a>&nbsp;&nbsp;
                    </div>
                    <br />
                    <router-link :to="{path:'/torelease'}">转发</router-link>&nbsp;&nbsp;
                    <router-link :to="{path:'/details',query: {id: record.id}}">查看详情</router-link>
                </div>
            </template>
        </a-table>
        <!-- 对话框 -->
        <a-modal title="回执"
        okText="确认已安排部署"
        cancelText="取消"
        :visible="visible" :confirm-loading="confirmLoading" @ok="handleOk"
            @cancel="handleCancel">
            <p>{{ ModalText }}</p>
        </a-modal>
    </div>
</template>
<script>
    const 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: 'receipt',
            width: '10%',
            scopedSlots: {
                customRender: 'receipt'
            }, //设置定制化表格数据
        },
        {
            title: '操作',
            dataIndex: 'operation',
            scopedSlots: {
                customRender: 'operation'
            },
        },
    ];
    const data = [{
            key: 1,
            id:1001,
            readed:false,
            time: '2023年5月3日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '黄色',
            title: '全疆高温红色预警',
            attachment: '1',
            receipt: '待叫应'
        },
        {
            key: 2,
            readed:true,
            id:1002,
            time: '2023年5月2日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '橙色',
            title: '全疆高温红色预警',
            attachment: '1',
            receipt: '已叫应'
        },
        {
            key: 3,
            readed:true,
            id:1003,
            time: '2023年5月1日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '橙色',
            title: '全疆高温红色预警',
            attachment: '1',
            receipt: '已叫应'
        },
        {
            key: 4,
            readed:true,
            id:1004,
            time: '2023年5月1日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '橙色',
            title: '全疆高温红色预警',
            attachment: '2',
            receipt: '超时未叫应'
        },
        {
            key: 5,
            readed:true,
            id:1005,
            time: '2023年4月21日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '橙色',
            title: '全疆高温红色预警',
            attachment: '无',
            receipt: '已叫应'
        },
        {
            key: 6,
            readed:true,
            id:1006,
            time: '2023年4月21日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '橙色',
            title: '全疆高温红色预警',
            attachment: '1',
            receipt: '已叫应'
        },
        {
            key: 7,
            readed:true,
            id:1007,
            time: '2023年1月21日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '红色',
            title: '全疆低温红色预警',
            attachment: '1',
            receipt: '已叫应'
        },
    ];
    export default {
        data() {
            this.cacheData = data.map(item => ({
                ...item
            }));
            return {
                data,
                columns,
                editingKey: '',
                category: 'default',
                ModalText: '确认已经安排部署?',
                visible: false,
                confirmLoading: false,
            };
        },
        methods: {
            handleChange(value) {
                console.log(`Selected: ${value}`);
            },
            popupScroll() {
                console.log('popupScroll');
            },
            onChange(date, dateString) {
                console.log(date, dateString);
            },
            //叫应回执时间
            showModal() {
                this.visible = true;
            },
            handleOk(e) {
                this.ModalText = '正在提交您的叫应状态...';
                this.confirmLoading = true;
                setTimeout(() => {
                    this.visible = false;
                    this.confirmLoading = false;
                }, 2000);
            },
            handleCancel(e) {
                this.visible = false;
            },
        },
    };
</script>
<style>
</style>
src/views/Admin/ModuleOne.vue
对比新文件
@@ -0,0 +1,8 @@
<template>
  <div class="module-one">
  </div>
</template>
<script>
</script>
src/views/Admin/Notice.vue
对比新文件
@@ -0,0 +1,206 @@
<template>
    <div class="inner">
        <h2>预警信息发布</h2>
        <div class="left">
            <a-input placeholder="请输入标题" style="height: 50px; font-size: 20px;" />
            <br /><br />
            <a-radio-group v-model="value" @change="onChange">
                <a-radio :value="1">
                    蓝色
                </a-radio>
                <a-radio :value="2">
                    黄色
                </a-radio>
                <a-radio :value="3">
                    橙色
                </a-radio>
                <a-radio :value="4">
                    红色
                </a-radio>
            </a-radio-group>
            <br /><br />
            <a-radio-group 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>
            <div class="ftright">
                平级接收人选择:
                <a-select mode="multiple" placeholder="选择平级接收单位" :value="selectedItems" style="width: 180px"
                    @change="handle">
                    <a-select-option v-for="item in filteredOptions" :key="item" :value="item">
                        {{ item }}
                    </a-select-option>
                </a-select>
            </div>
            <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>
              <br/><br/>
            <div style="float: right;"><b>选择审批领导:</b> <a-select show-search placeholder="请选择审批领导"
                    option-filter-prop="children" style="width: 200px" :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>
            <br /><br />
            <a-button type="primary" class="ftright">
                确认并提交审核
            </a-button>
        </div>
        <div class="right">
            <h2>短信预览</h2>
            <div class="mobile">
                <div class="mesg">
                    <P>【{{signname}}】{{message}}。发布单位:{{department}}</P>
                </div>
            </div>
        </div>
    </div>
</template>
<script>
    const OPTIONS = ['自治区消防(李XX)', '自治区公安厅(王XX)', '自治区自然资源厅(刘XX)'];
    export default {
        name: "release",
        data() {
            return {
                value: 1,
                message: '',
                signname: '自然灾害风险预警提示',
                department: '自治区自然灾害综合监测预警中心',
                selectedItems: [],
                svalue:undefined,
            };
        },
        components: {},
        computed: {
            filteredOptions() {
                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);
                },
            //选择平级部门部分
            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/Release.vue
对比新文件
@@ -0,0 +1,163 @@
<template>
  <div class="inner">
      <a-radio-group v-model="category">
          <a-radio-button value="default">
              全部
          </a-radio-button>
          <a-radio-button value="1">
              紧临
          </a-radio-button>
          <a-radio-button value="2">
              常规
          </a-radio-button>
      </a-radio-group>
      <div style="float:right">
          时间区间筛选:<a-range-picker :placeholder="['开始时间', '结束时间']" @change="onChange" />
      </div>
      <br/><br/>
      <!-- 表格实体部分-->
      <a-table :columns="columns" :data-source="data" bordered>
          <span slot="level" slot-scope="text">
              <a-tag :color="text === '黄色' ? 'yellow' :text === '橙色'? 'orange':text === '红色'?'red':'blue'">
                  {{ text }}
              </a-tag>
          </span>
          <template slot="attachment" slot-scope="text">
              <span v-if="text==='无'">无</span>
              <a v-else><b><a-icon type="paper-clip" /> {{text}}</b></a>
          </template >
          <template slot="operation" slot-scope="text, record, index">
              <div class="editable-row-operations">
                <a @click="showModal" style="color:orangered">
                    叫应列表</a>&nbsp;&nbsp;
                  <router-link :to="{path:'/details',query: {id: record.id}}">信息详情</router-link>
              </div>
          </template>
      </a-table>
      <!-- 对话框 -->
      <a-modal title="查看叫应详情"
      okText="确认"
      cancelText="关闭"
      :visible="visible" :confirm-loading="confirmLoading" @ok="handleOk" @cancel="handleOk">
      </a-modal>
  </div>
</template>
<script>
    const columns = [{
            title: '序号',
            dataIndex: 'key',
            width: '8%',
        },
        {
            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: 'receipt',
            width: '10%',
            scopedSlots: {
                customRender: 'receipt'
            }, //设置定制化表格数据
        },
        {
            title: '操作',
            dataIndex: 'operation',
            scopedSlots: {
                customRender: 'operation'
            },
        },
    ];
    const data = [{
            key: 1,
            id:1001,
            readed:false,
            time: '2023年5月3日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '黄色',
            title: '全疆高温红色预警',
            attachment: '1',
            receipt: '部分叫应'
        },
        {
                key: 2,
                id:1002,
                readed:false,
                time: '2023年5月3日 15:30',
                department: '自治区预警中心',
                category: '气象',
                level: '黄色',
                title: '全疆高温红色预警',
                attachment: '1',
                receipt: '全部叫应'
            },{
                key: 3,
                id:1003,
                readed:false,
                time: '2023年5月3日 15:30',
                department: '自治区预警中心',
                category: '气象',
                level: '黄色',
                title: '全疆高温红色预警',
                attachment: '1',
                receipt: '均未叫应'
            }]
    export default {
        data() {
            return {
                category: 'default',
                data,
                columns,
                visible: false,
                confirmLoading: false,
            }
        },
        methods: {
            //弹出层
            showModal() {
                this.visible = true;
            },
            handleOk(e) {
                this.visible = false;
            },
        }
        }
</script>
src/views/Admin/Report.vue
对比新文件
@@ -0,0 +1,175 @@
<template>
  <div class="inner">
      <a-radio-group v-model="category">
          <a-radio-button value="default">
              全部
          </a-radio-button>
          <a-radio-button value="1">
              已审核
          </a-radio-button>
          <a-radio-button value="2">
              未审核
          </a-radio-button>
      </a-radio-group>
      <div style="float:right">
          时间区间筛选:<a-range-picker :placeholder="['开始时间', '结束时间']" @change="onChange" />
      </div>
      <br/><br/>
      <!-- 表格实体部分-->
      <a-table :columns="columns" :data-source="data" bordered>
          <span slot="level" slot-scope="text">
              <a-tag :color="text === '黄色' ? 'yellow' :text === '橙色'? 'orange':text === '红色'?'red':'blue'">
                  {{ text }}
              </a-tag>
          </span>
          <template slot="attachment" slot-scope="text">
              <span v-if="text==='无'">无</span>
              <a v-else><b><a-icon type="paper-clip" /> {{text}}</b></a>
          </template >
          <template slot="operation" slot-scope="text, record, index">
              <div class="editable-row-operations">
                <a-button v-if="record.audit==='已审核'" type="primary" @click="showModal(record.id)" >
                    确认发布</a-button>&nbsp;&nbsp;
                  <router-link :to="{path:'/details',query: {id: record.id}}">信息详情</router-link>
                &nbsp;&nbsp;<a style="color:red">删除</a>
              </div>
          </template>
      </a-table>
      <!-- 对话框 -->
      <a-modal title="信息发布"
      okText="确认发布"
      cancelText="取消"
      :visible="visible" :confirm-loading="confirmLoading" @ok="handleOk" @cancel="handleCancel">
      <p>确认发布 “[{{show_id}}]2023年5月23日,全疆黄色高温预警信息”?</p>
      </a-modal>
  </div>
</template>
<script>
    const columns = [{
            title: '编号',
            dataIndex: 'id',
            width: '8%',
        },
        {
            title: '提交审核时间',
            dataIndex: 'time',
            width: '13%',
            scopedSlots: {
                customRender: 'time'
            }, //设置定制化表格数据
        },
        {
            title: '发布单位',
            dataIndex: 'department',
            width: '12%',
        },
        {
            title: '类别',
            dataIndex: 'category',
            width: '6%',
        },
        {
            title: '级别',
            dataIndex: 'level',
            scopedSlots: {
                customRender: 'level'
            }, //设置定制化表格数据
            width: '6%',
        },
        {
            title: '信息标题',
            dataIndex: 'title',
            width: '16%',
        },
        {
            title: '附件',
            dataIndex: 'attachment',
            width: '6%',
            scopedSlots: {
                customRender: 'attachment'
            },
        },
        {
            title: '审核情况',
            dataIndex: 'audit',
            width: '10%',
            scopedSlots: {
                customRender: 'audit'
            }, //设置定制化表格数据
        },
        {
            title: '操作',
            dataIndex: 'operation',
            scopedSlots: {
                customRender: 'operation'
            },
        },
    ];
    const data = [{
            key: 1,
            id:1001,
            readed:false,
            time: '2023年5月3日 15:30',
            department: '自治区预警中心',
            category: '气象',
            level: '黄色',
            title: '全疆高温红色预警',
            attachment: '1',
            audit: '已审核'
        },
        {
                key: 2,
                id:1002,
                readed:false,
                time: '2023年5月3日 15:30',
                department: '自治区预警中心',
                category: '气象',
                level: '黄色',
                title: '全疆高温红色预警',
                attachment: '1',
                audit: '未审核'
            },{
                key: 3,
                id:1003,
                readed:false,
                time: '2023年5月3日 15:30',
                department: '自治区预警中心',
                category: '气象',
                level: '黄色',
                title: '全疆高温红色预警',
                attachment: '1',
                audit: '已审核'
            }]
    export default {
        data() {
            return {
                category: 'default',
                data,
                columns,
                visible: false,
                confirmLoading: false,
                show_id:''
            }
        },
        methods: {
            showModal(id) {
                this.visible = true;
                this.show_id=id
            },
            //确认发布
            handleOk(e) {
                this.ModalText = '正在发布,请稍候...';
                this.confirmLoading = true;
                setTimeout(() => {
                    this.visible = false;
                    this.confirmLoading = false;
                }, 2000);
            },
            handleCancel(e) {
                this.visible = false;
            },
        }
        }
</script>
src/views/Admin/Response.vue
对比新文件
@@ -0,0 +1,8 @@
<template>
</template>
<script>
</script>
<style>
</style>
src/views/Admin/Torelease.vue
对比新文件
@@ -0,0 +1,8 @@
<template>
</template>
<script>
</script>
<style>
</style>
src/views/Admin/UserManage.vue
对比新文件
@@ -0,0 +1,3 @@
<template>
  <div>UserManage</div>
</template>
src/views/Admin/Wendy.vue
对比新文件
@@ -0,0 +1,11 @@
<template>
    <div class="inner">
        <iframe width="100%" height="600" src="https://embed.windy.com/embed2.html?lat=43.419&lon=87.613&detailLat=43.598&detailLon=87.613&width=800&height=600&zoom=9&level=surface&overlay=wind&product=ecmwf&menu=&message=&marker=&calendar=now&pressure=true&type=map&location=coordinates&detail=true&metricWind=default&metricTemp=default&radarRange=-1" frameborder="0"></iframe>
    </div>
</template>
<script>
</script>
<style>
</style>
src/views/Home.vue
对比新文件
@@ -0,0 +1,195 @@
<template>
    <div>
        <a-layout id="components-layout-demo-custom-trigger" :style="{ height: '100vh' }">
            <a-layout-sider v-model="collapsed" :trigger="null" collapsible>
                <div class="logo">{{ collapsed ? collapsed : '预警响应系统' }}</div>
                <menuSider />
            </a-layout-sider>
            <a-layout>
                <a-layout-header style="background: #fff; padding: 0">
                    <a-icon class="trigger" :type="collapsed ? 'menu-unfold' : 'menu-fold'"
                        @click="() => (collapsed = !collapsed)" />
                    <a-dropdown>
                        <a class="ant-dropdown-link" @click="e => e.preventDefault()">
                            您好,李静 <a-icon type="down" />
                        </a>
                        <a-menu slot="overlay">
                            <a-menu-item>
                                <a href="javascript:;">修改密码</a>
                            </a-menu-item>
                            <a-menu-item>
                                <a href="javascript:;">回到首页</a>
                            </a-menu-item>
                            <a-menu-item>
                                <a @click="logout">退出登录</a>
                            </a-menu-item>
                        </a-menu>
                    </a-dropdown>
                </a-layout-header>
                <TabsHeader :pageList="pageList" :activePage="activePage" @change="changePage" @close="remove" />
                <a-layout-content :style="{
          margin: '15px 16px 24px 16px',
        }">
                    <!-- Content -->
                    <router-view ref="tabContent"></router-view>
                    <div style="height: 30px"></div>
                </a-layout-content>
            </a-layout>
        </a-layout>
        <center style="textAlign: center;margin-left: 5%;margin-top:50px;">
            技术支持:中国科学院
        </center>
    </div>
</template>
<script>
    import menuSider from "@/layout/menuSider";
    import TabsHeader from '@/components/TabsHeader';
    export default {
        name: "Home",
        data() {
            return {
                collapsed: false, //返回logo图片或表述
                pageList: [],
                activePage: '',
                multiPage: 24
            };
        },
        components: {
            menuSider,
            TabsHeader,
        },
        created() {
            const route = this.$route
            if (this.pageList.findIndex(item => item.path === route.path) === -1) {
                this.pageList.push(this.createPage(route))
            }
            this.activePage = route.path
            if (this.multiPage) {
                this.$nextTick(() => {
                    this.setCachedKey(route)
                })
                this.addListener()
            }
        },
        watch: {
            '$route': function(newRoute) {
                this.activePage = newRoute.path
                const page = this.pageList.find(item => item.path === newRoute.path)
                if (!this.multiPage) {
                    this.pageList = [this.createPage(newRoute)]
                } else if (page) {
                    page.fullPath = newRoute.fullPath
                } else if (!page) {
                    this.pageList.push(this.createPage(newRoute))
                }
                if (this.multiPage) {
                    this.$nextTick(() => {
                        this.setCachedKey(newRoute)
                    })
                }
            }
        },
        methods: {
            logout(){
                this.$router.push('/')
            },
            changePage(key) {
                this.activePage = key
                const page = this.pageList.find(item => item.path === key)
                this.$router.push(page.fullPath)
            },
            remove(key, next) {
                if (this.pageList.length === 1) {
                    return;
                }
                //清除缓存
                let index = this.pageList.findIndex(item => item.path === key)
                this.clearCaches = this.pageList.splice(index, 1).map(page => page.cachedKey)
                if (next) {
                    this.$router.push(next)
                } else if (key === this.activePage) {
                    index = index >= this.pageList.length ? this.pageList.length - 1 : index
                    this.activePage = this.pageList[index].path
                    this.$router.push(this.activePage)
                }
            },
            createPage(route) {
                return {
                    keyPath: route.matched[route.matched.length - 1].path,
                    fullPath: route.fullPath,
                    loading: false,
                    path: route.path,
                    title: route.meta && route.meta.title,
                    unclose: route.meta && route.meta.page && (route.meta.page.closable === false),
                }
            },
            /**
             * 设置页面缓存的key
             * @param route 页面对应的路由
             */
            setCachedKey(route) {
                const page = this.pageList.find(item => item.path === route.path)
                page.unclose = route.meta && route.meta.page && (route.meta.page.closable === false)
                if (!page._init_) {
                    const vnode = this.$refs.tabContent.$vnode
                    page.cachedKey = vnode.key + vnode.componentOptions.Ctor.cid
                    page._init_ = true
                }
            },
            /**
             * 添加监听器
             */
            addListener() {
                window.addEventListener('page:close', this.closePageListener)
            },
            /**
             * 移出监听器
             */
            removeListener() {
                window.removeEventListener('page:close', this.closePageListener)
            },
            closePageListener(event) {
                const {
                    closeRoute,
                    nextRoute
                } = event.detail
                const closePath = typeof closeRoute === 'string' ? closeRoute : closeRoute.path
                const path = closePath && closePath.split('?')[0]
                this.remove(path, nextRoute)
            },
        }
    };
</script>
<style lang="less" scoped>
    #components-layout-demo-custom-trigger .trigger {
        font-size: 18px;
        line-height: 64px;
        padding: 0 24px;
        cursor: pointer;
        transition: color 0.3s;
    }
    #components-layout-demo-custom-trigger .trigger:hover {
        color: #1890ff;
    }
    .logo {
        height: 36px;
        background: rgba(255, 255, 255, 0.2);
        margin: 16px;
        color: #faad14;
        text-align: center;
        line-height: 36px;
        font-size: 22px;
        text-shadow: 0 0 1px #000,
    }
    .ant-dropdown-link {
        float: right;
        margin-right: 25px;
    }
</style>
src/views/Login.vue
对比新文件
@@ -0,0 +1,150 @@
<template>
    <div class='bd'>
    <div class="hedaer">
      <h2>新疆维吾尔自治区自然灾害综合监测预警中心</h2>
      <h1>自然灾害综合风险预警发布及响应联动系统</h1>
    </div>
  <div class="login">
    <a-form
      layout="horizontal"
      :form="form"
      @submit="handleSubmit"
      class="login-form"
    >
      <a-tabs default-active-key="1" @change="callback">
        <a-tab-pane key="1" tab="用户名登录">
          <a-form-item>
            <a-input
              placeholder="请输入用户"
              size="large"
            >
              <a-icon slot="prefix" type="user" style="color:rgba(0,0,0,.25)" />
            </a-input>
          </a-form-item>
          <a-form-item>
            <a-input-password
              type="password"
              placeholder="请输入密码"
              size="large"
            >
              <a-icon slot="prefix" type="lock" style="color:rgba(0,0,0,.25)" />
            </a-input-password>
          </a-form-item>
        </a-tab-pane>
        <a-tab-pane key="2" tab="验证码登录" force-render>
          <a-form-item>
            <a-input
              placeholder="手机号"
              size="large"
            >
              <a-icon slot="prefix" type="mobile" style="color:rgba(0,0,0,.25)" />
            </a-input>
          </a-form-item>
          <a-form-item>
            <a-row :gutter="8">
              <a-col :span="17">
                <a-input placeholder="验证码">
                  <a-icon slot="prefix" type="mobile" style="color:rgba(0,0,0,.25)" />
                </a-input>
              </a-col>
              <a-col :span="7">
                <a-button style="width: 100%">获取验证码</a-button>
              </a-col>
            </a-row>
          </a-form-item>
        </a-tab-pane>
      </a-tabs>
      <div style="margin-bottom: 20px">
        <a-checkbox :checked="true" style="color:#fff;">自动登录</a-checkbox>
        <a style="float: right">忘记密码</a>
      </div>
      <a-form-item style="text-align: center">
        <a-button
          type="primary"
          html-type="submit"
          style="width: 100%"
          size="large"
        >
          登录
        </a-button>
      </a-form-item>
      <center><p>技术支持:中国科学院</p></center>
    </a-form>
  </div>
  </div>
</template>
<script>
export default {
  name: "login",
  data() {
    return {
      // hasErrors,
      form: this.$form.createForm(this),
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.form.validateFields();
    });
  },
  methods: {
    handleSubmit(e) {
      e.preventDefault();
      this.form.validateFields((err, values) => {
        if (!err) {
          console.log("Received values of form: ", values);
          this.$router.push({ name: "default" });
        }
      });
    },
    callback(key) {
      console.log(key);
    },
  },
};
</script>
<style lang="less" scoped>
    p{
        color:#fff;
        margin-top: 55px;
    }
h2{
    font-size: 30px;
}
.bd {
    width: 100%;
    height: 100vh;
    background: url('../assets/img/bg.jpeg') no-repeat;
    background-size: 100% 100%;
    background-attachment: fixed;/* 不设置的话页面滑动时,背景会不铺满*/
}
/deep/ .ant-tabs-bar {
  border-bottom: 0px;
  text-align: center;
}
  .hedaer {
    margin: 0px auto;
    padding-top:100px;
    width: 1000px;
    text-align: center;
    text-shadow:0 0 1px #000;
    h2{font-size: 36px;color:#fff;}
    h1{font-size: 48px;color:#fff;}
    }
.login {
  .login-form {
    width: 400px;
    margin: 60px auto 0px;
  }
}
.ant-tabs{
    color:#fff;
    }
</style>
src/views/SameLevel.vue
对比新文件
@@ -0,0 +1,11 @@
<template>
    <div>
         平级单位接收人通讯录管理
    </div>
</template>
<script>
</script>
<style>
</style>