Lou
2024-01-20 ec59ab15df819e21a73435b7522b51982a3b4ca5
merge
27 files modified
2 files added
5976 ■■■■■ changed files
package-lock.json 24 ●●●●● patch | view | raw | blame | history
public/index.html 212 ●●●● patch | view | raw | blame | history
src/config/website.js 3 ●●●● patch | view | raw | blame | history
src/lang/en.js 198 ●●●● patch | view | raw | blame | history
src/page/index/logo.vue 124 ●●●●● patch | view | raw | blame | history
src/page/index/top/index.vue 10 ●●●●● patch | view | raw | blame | history
src/page/login/index.vue 15 ●●●●● patch | view | raw | blame | history
src/page/login/tenement.vue 157 ●●●●● patch | view | raw | blame | history
src/router/avue-router.js 171 ●●●● patch | view | raw | blame | history
src/router/page/index.js 123 ●●●●● patch | view | raw | blame | history
src/store/getters.js 65 ●●●●● patch | view | raw | blame | history
src/store/modules/common.js 73 ●●●● patch | view | raw | blame | history
src/styles/login.scss 10 ●●●●● patch | view | raw | blame | history
src/views/article/discussionManage.vue 1442 ●●●● patch | view | raw | blame | history
src/views/authority/role.vue 665 ●●●● patch | view | raw | blame | history
src/views/cGovernance/reportForRepairs.vue 899 ●●●●● patch | view | raw | blame | history
src/views/grid/gridman.vue 4 ●●● patch | view | raw | blame | history
src/views/place/components/baseAllInfo.vue 49 ●●●● patch | view | raw | blame | history
src/views/place/index.vue 6 ●●●● patch | view | raw | blame | history
src/views/property/components/propertyEdit.vue 10 ●●●●● patch | view | raw | blame | history
src/views/property/propertyCapitalApply.vue 947 ●●●● patch | view | raw | blame | history
src/views/property/propertyCompany.vue 3 ●●●● patch | view | raw | blame | history
src/views/system/dept.vue 2 ●●● patch | view | raw | blame | history
src/views/wel/index.vue 11 ●●●● patch | view | raw | blame | history
src/views/work/process/maintenanceFundApply/detail.vue 2 ●●● patch | view | raw | blame | history
src/views/work/process/maintenanceFundApply/edit.vue 2 ●●● patch | view | raw | blame | history
src/views/work/process/maintenanceFundApply/form.vue 2 ●●● patch | view | raw | blame | history
src/views/work/process/maintenanceFundApply/handle.vue 739 ●●●● patch | view | raw | blame | history
vue.config.js 8 ●●●●● patch | view | raw | blame | history
package-lock.json
@@ -5484,7 +5484,11 @@
    },
    "node_modules/echarts": {
      "version": "5.4.3",
<<<<<<< HEAD
      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz",
=======
      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.4.3.tgz",
>>>>>>> 7777a40af5210dce0abe07360a48042b1bc8d264
      "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==",
      "dependencies": {
        "tslib": "2.3.0",
@@ -14957,7 +14961,11 @@
    },
    "node_modules/tslib": {
      "version": "2.3.0",
<<<<<<< HEAD
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
=======
      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
>>>>>>> 7777a40af5210dce0abe07360a48042b1bc8d264
      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
    },
    "node_modules/tty-browserify": {
@@ -16911,7 +16919,11 @@
    },
    "node_modules/zrender": {
      "version": "5.4.4",
<<<<<<< HEAD
      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz",
=======
      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.4.4.tgz",
>>>>>>> 7777a40af5210dce0abe07360a48042b1bc8d264
      "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==",
      "dependencies": {
        "tslib": "2.3.0"
@@ -21353,7 +21365,11 @@
    },
    "echarts": {
      "version": "5.4.3",
<<<<<<< HEAD
      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz",
=======
      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.4.3.tgz",
>>>>>>> 7777a40af5210dce0abe07360a48042b1bc8d264
      "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==",
      "requires": {
        "tslib": "2.3.0",
@@ -29241,7 +29257,11 @@
    },
    "tslib": {
      "version": "2.3.0",
<<<<<<< HEAD
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
=======
      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
>>>>>>> 7777a40af5210dce0abe07360a48042b1bc8d264
      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
    },
    "tty-browserify": {
@@ -30861,7 +30881,11 @@
    },
    "zrender": {
      "version": "5.4.4",
<<<<<<< HEAD
      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz",
=======
      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.4.4.tgz",
>>>>>>> 7777a40af5210dce0abe07360a48042b1bc8d264
      "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==",
      "requires": {
        "tslib": "2.3.0"
public/index.html
@@ -2,124 +2,124 @@
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta http-equiv="X-UA-Compatible" content="chrome=1"/>
  <meta name="renderer" content="webkit">
  <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
  <meta name="format-detection" content="telephone=no">
  <link rel="stylesheet" href="<%= BASE_URL %>cdn/element-ui/2.15.6/theme-chalk/index.css">
  <link rel="stylesheet" href="<%= BASE_URL %>cdn/animate/3.5.2/animate.css">
  <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/index.css">
  <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/avue/iconfont.css">
  <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/saber/iconfont.css">
  <link rel="stylesheet" href="<%= BASE_URL %>cdn/avue/2.10.16/index.css">
  <script src="<%= BASE_URL %>cdn/xlsx/FileSaver.min.js"></script>
  <script src="<%= BASE_URL %>cdn/xlsx/xlsx.full.min.js"></script>
  <!-- AvueMap-begin-->
  <script>
    window._AMapSecurityConfig = {
      securityJsCode: '5c569caedb31676fc64da5be4c5e8cee',
    }
  </script>
  <script type="text/javascript" src='https://webapi.amap.com/maps?v=1.4.11&key=fce315b8c816ec06755a523ccae9922d&plugin=AMap.PlaceSearch'></script>
  <script src="https://webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta http-equiv="X-UA-Compatible" content="chrome=1" />
    <meta name="renderer" content="webkit">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/element-ui/2.15.6/theme-chalk/index.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/animate/3.5.2/animate.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/index.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/avue/iconfont.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/saber/iconfont.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/avue/2.10.16/index.css">
    <script src="<%= BASE_URL %>cdn/xlsx/FileSaver.min.js"></script>
    <script src="<%= BASE_URL %>cdn/xlsx/xlsx.full.min.js"></script>
    <!-- AvueMap-begin-->
    <script>
        window._AMapSecurityConfig={
            securityJsCode: '5c569caedb31676fc64da5be4c5e8cee',
        }
    </script>
    <script type="text/javascript"
        src='https://webapi.amap.com/maps?v=1.4.11&key=fce315b8c816ec06755a523ccae9922d&plugin=AMap.PlaceSearch'></script>
    <script src="https://webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
    <!-- AvueMap-end-->
  <link rel="icon" href="<%= BASE_URL %>favicon.png">
  <title>基层智治综合协同平台</title>
    <link rel="icon" href="<%= BASE_URL %>favicon.png">
  <style>
    html,
    body,
    #app {
      height: 100%;
      margin: 0;
      padding: 0;
    }
    <style>
        html,
        body,
        #app {
            height: 100%;
            margin: 0;
            padding: 0;
        }
    .avue-home {
      background-color: #303133;
      height: 100%;
      display: flex;
      flex-direction: column;
    }
        .avue-home {
            background-color: #303133;
            height: 100%;
            display: flex;
            flex-direction: column;
        }
    .avue-home__main {
      user-select: none;
      width: 100%;
      flex-grow: 1;
      display: flex;
      justify-content: center;
      align-items: center;
      flex-direction: column;
    }
        .avue-home__main {
            user-select: none;
            width: 100%;
            flex-grow: 1;
            display: flex;
            justify-content: center;
            align-items: center;
            flex-direction: column;
        }
    .avue-home__footer {
      width: 100%;
      flex-grow: 0;
      text-align: center;
      padding: 1em 0;
    }
        .avue-home__footer {
            width: 100%;
            flex-grow: 0;
            text-align: center;
            padding: 1em 0;
        }
    .avue-home__footer > a {
      font-size: 12px;
      color: #ABABAB;
      text-decoration: none;
    }
        .avue-home__footer>a {
            font-size: 12px;
            color: #ABABAB;
            text-decoration: none;
        }
    .avue-home__loading {
      height: 32px;
      width: 32px;
      margin-bottom: 20px;
    }
        .avue-home__loading {
            height: 32px;
            width: 32px;
            margin-bottom: 20px;
        }
    .avue-home__title {
      color: #FFF;
      font-size: 14px;
      margin-bottom: 10px;
    }
        .avue-home__title {
            color: #FFF;
            font-size: 14px;
            margin-bottom: 10px;
        }
    .avue-home__sub-title {
      color: #ABABAB;
      font-size: 12px;
    }
  </style>
        .avue-home__sub-title {
            color: #ABABAB;
            font-size: 12px;
        }
    </style>
</head>
<body>
<noscript>
  <strong>
    很抱歉,如果没有 JavaScript 支持,Saber 将不能正常工作。请启用浏览器的 JavaScript 然后继续。
  </strong>
</noscript>
<div id="app">
  <div class="avue-home">
    <div class="avue-home__main">
      <img class="avue-home__loading" src="<%= BASE_URL %>svg/loading-spin.svg" alt="loading">
      <div class="avue-home__title">
        正在加载资源
      </div>
      <div class="avue-home__sub-title d">
        初次加载资源可能需要较多时间 请耐心等待
      </div>
    <noscript>
        <strong>
            很抱歉,如果没有 JavaScript 支持,Saber 将不能正常工作。请启用浏览器的 JavaScript 然后继续。
        </strong>
    </noscript>
    <div id="app">
        <div class="avue-home">
            <div class="avue-home__main">
                <img class="avue-home__loading" src="<%= BASE_URL %>svg/loading-spin.svg" alt="loading">
                <div class="avue-home__title">
                    正在加载资源
                </div>
                <div class="avue-home__sub-title d">
                    初次加载资源可能需要较多时间 请耐心等待
                </div>
            </div>
            <div class="avue-home__footer">
                <a href="https://bladex.cn" target="_blank">
                    https://bladex.cn </a>
            </div>
        </div>
    </div>
    <div class="avue-home__footer">
      <a href="https://bladex.cn" target="_blank">
        https://bladex.cn </a>
    </div>
  </div>
</div>
<!-- built files will be auto injected -->
<script src="<%= BASE_URL %>util/aes.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/vue/2.6.10/vue.min.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/vuex/3.1.1/vuex.min.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/vue-router/3.0.1/vue-router.min.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/axios/1.0.0/axios.min.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/element-ui/2.15.6/index.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/avue/2.10.16/avue.min.js" charset="utf-8"></script>
<script src="<%= BASE_URL %>cdn/nutflow/wf-design-base/index.umd.min.js" charset="utf-8"></script>
    <!-- built files will be auto injected -->
    <script src="<%= BASE_URL %>util/aes.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/vue/2.6.10/vue.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/vuex/3.1.1/vuex.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/vue-router/3.0.1/vue-router.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/axios/1.0.0/axios.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/element-ui/2.15.6/index.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/avue/2.10.16/avue.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/nutflow/wf-design-base/index.umd.min.js" charset="utf-8"></script>
</body>
</html>
</html>
src/config/website.js
@@ -4,7 +4,7 @@
export default {
  title: "saber",
  logo: "S",
  key: 'saber',//配置主键,目前用于存储
  key: 'saber', //配置主键,目前用于存储
  indexTitle: '基层智治综合协同平台',
  clientId: 'saber', // 客户端id
  clientSecret: 'saber_secret', // 客户端密钥
@@ -44,6 +44,7 @@
  authUrl: 'http://localhost/blade-auth/oauth/render',
  // 报表设计器地址(cloud端口为8108,boot端口为80)
  reportUrl: 'https://srgdjczzxtpt.com:2080/jczz-ureport/ureport',
  // reportUrl: 'http://localhost:9528/ureport',
  // 单点登录系统认证(blade-auth服务的地)
  ssoUrl: 'http://localhost:8100/oauth/authorize?client_id=saber&response_type=code&redirect_uri=',
  // 单点登录回调地址(Saber服务的地址)
src/lang/en.js
@@ -1,122 +1,122 @@
export default {
  title: '基层智治综合协同平台',
  logoutTip: 'Exit the system, do you want to continue?',
  submitText: 'submit',
  cancelText: 'cancel',
  search: 'Please input search content',
  menuTip: 'none menu list',
  title: "",
  logoutTip: "Exit the system, do you want to continue?",
  submitText: "submit",
  cancelText: "cancel",
  search: "Please input search content",
  menuTip: "none menu list",
  common: {
    condition: 'condition',
    display: 'display',
    hide: 'hide'
    condition: "condition",
    display: "display",
    hide: "hide",
  },
  tip: {
    select: 'Please select',
    input: 'Please input'
    select: "Please select",
    input: "Please input",
  },
  upload: {
    upload: 'upload',
    tip: 'Drag files here,/'
    upload: "upload",
    tip: "Drag files here,/",
  },
  date: {
    start: 'Start date',
    end: 'End date',
    t: 'today',
    y: 'yesterday',
    n: 'nearly 7',
    a: 'whole'
    start: "Start date",
    end: "End date",
    t: "today",
    y: "yesterday",
    n: "nearly 7",
    a: "whole",
  },
  form: {
    printBtn: 'print',
    mockBtn: 'mock',
    submitBtn: 'submit',
    emptyBtn: 'empty'
    printBtn: "print",
    mockBtn: "mock",
    submitBtn: "submit",
    emptyBtn: "empty",
  },
  crud: {
    filter: {
      addBtn: 'add',
      clearBtn: 'clear',
      resetBtn: 'reset',
      cancelBtn: 'cancel',
      submitBtn: 'submit'
      addBtn: "add",
      clearBtn: "clear",
      resetBtn: "reset",
      cancelBtn: "cancel",
      submitBtn: "submit",
    },
    column: {
      name: 'name',
      hide: 'hide',
      fixed: 'fixed',
      filters: 'filters',
      sortable: 'sortable',
      index: 'index',
      width: 'width'
      name: "name",
      hide: "hide",
      fixed: "fixed",
      filters: "filters",
      sortable: "sortable",
      index: "index",
      width: "width",
    },
    tipStartTitle: 'Currently selected',
    tipEndTitle: 'items',
    editTitle: 'edit',
    copyTitle: 'copy',
    addTitle: 'add',
    viewTitle: 'view',
    filterTitle: 'filter',
    showTitle: 'showTitle',
    menu: 'menu',
    addBtn: 'add',
    show: 'show',
    hide: 'hide',
    open: 'open',
    shrink: 'shrink',
    printBtn: 'print',
    excelBtn: 'excel',
    updateBtn: 'update',
    cancelBtn: 'cancel',
    searchBtn: 'search',
    emptyBtn: 'empty',
    menuBtn: 'menu',
    saveBtn: 'save',
    viewBtn: 'view',
    editBtn: 'edit',
    copyBtn: 'copy',
    delBtn: 'delete'
    tipStartTitle: "Currently selected",
    tipEndTitle: "items",
    editTitle: "edit",
    copyTitle: "copy",
    addTitle: "add",
    viewTitle: "view",
    filterTitle: "filter",
    showTitle: "showTitle",
    menu: "menu",
    addBtn: "add",
    show: "show",
    hide: "hide",
    open: "open",
    shrink: "shrink",
    printBtn: "print",
    excelBtn: "excel",
    updateBtn: "update",
    cancelBtn: "cancel",
    searchBtn: "search",
    emptyBtn: "empty",
    menuBtn: "menu",
    saveBtn: "save",
    viewBtn: "view",
    editBtn: "edit",
    copyBtn: "copy",
    delBtn: "delete",
  },
  login: {
    title: 'Login ',
    info: 'BladeX Development Platform',
    tenantId: 'Please input tenantId',
    username: 'Please input username',
    password: 'Please input a password',
    wechat: 'Wechat',
    qq: 'QQ',
    github: 'github',
    gitee: 'gitee',
    phone: 'Please input a phone',
    code: 'Please input a code',
    submit: 'Login',
    userLogin: 'userLogin',
    phoneLogin: 'phoneLogin',
    thirdLogin: 'thirdLogin',
    ssoLogin: 'ssoLogin',
    msgText: 'send code',
    msgSuccess: 'reissued code',
    title: "Login ",
    info: "BladeX Development Platform",
    tenantId: "Please input tenantId",
    username: "Please input username",
    password: "Please input a password",
    wechat: "Wechat",
    qq: "QQ",
    github: "github",
    gitee: "gitee",
    phone: "Please input a phone",
    code: "Please input a code",
    submit: "Login",
    userLogin: "userLogin",
    phoneLogin: "phoneLogin",
    thirdLogin: "thirdLogin",
    ssoLogin: "ssoLogin",
    msgText: "send code",
    msgSuccess: "reissued code",
  },
  navbar: {
    info: 'info',
    logOut: 'logout',
    userinfo: 'userinfo',
    switchDept : 'switch dept',
    dashboard: 'dashboard',
    lock: 'lock',
    bug: 'none bug',
    bugs: 'bug',
    screenfullF: 'exit screenfull',
    screenfull: 'screenfull',
    language: 'language',
    notice: 'notice',
    theme: 'theme',
    color: 'color'
    info: "info",
    logOut: "logout",
    userinfo: "userinfo",
    switchDept: "switch dept",
    dashboard: "dashboard",
    lock: "lock",
    bug: "none bug",
    bugs: "bug",
    screenfullF: "exit screenfull",
    screenfull: "screenfull",
    language: "language",
    notice: "notice",
    theme: "theme",
    color: "color",
  },
  tagsView: {
    search: 'Search',
    menu: 'menu',
    clearCache: 'Clear Cache',
    closeOthers: 'Close Others',
    closeAll: 'Close All'
  }
    search: "Search",
    menu: "menu",
    clearCache: "Clear Cache",
    closeOthers: "Close Others",
    closeAll: "Close All",
  },
};
src/page/index/logo.vue
@@ -1,73 +1,89 @@
<!--
 * @Author: shuishen 1109946754@qq.com
 * @Date: 2023-12-14 17:10:00
 * @LastEditors: shuishen 1109946754@qq.com
 * @LastEditTime: 2024-01-19 15:47:47
 * @FilePath: \jczz_web\src\page\index\logo.vue
 * @Description:
 *
 * Copyright (c) 2024 by shuishen, All Rights Reserved.
-->
<template>
  <div class="avue-logo">
    <transition name="fade">
      <span v-if="keyCollapse"
            class="avue-logo_subtitle"
            key="0">
        {{website.logo}}
      </span>
    </transition>
    <transition-group name="fade">
      <template v-if="!keyCollapse">
        <span class="avue-logo_title"
              key="1">{{website.indexTitle}} </span>
      </template>
    </transition-group>
  </div>
    <div class="avue-logo">
        <transition name="fade">
            <span v-if="keyCollapse" class="avue-logo_subtitle" key="0">
                {{ website.logo }}
            </span>
        </transition>
        <transition-group name="fade">
            <template v-if="!keyCollapse">
                <span class="avue-logo_title" key="1">{{ webTitle }} </span>
            </template>
        </transition-group>
    </div>
</template>
<script>
import { mapGetters } from "vuex";
import { getStore } from "@/util/store"
import { mapGetters } from "vuex"
export default {
  name: "logo",
  data() {
    return {};
  },
  created() {},
  computed: {
    ...mapGetters(["website", "keyCollapse"])
  },
  methods: {}
};
    name: "logo",
    data () {
        return {
            webTitle: getStore({ name: "webTitle" })
        }
    },
    created () { },
    computed: {
        ...mapGetters(["website", "keyCollapse"])
    },
    methods: {}
}
</script>
<style lang="scss">
.fade-leave-active {
  transition: opacity 0.2s;
    transition: opacity 0.2s;
}
.fade-enter-active {
  transition: opacity 2.5s;
    transition: opacity 2.5s;
}
.fade-enter,
.fade-leave-to {
  opacity: 0;
    opacity: 0;
}
.avue-logo {
  position: fixed;
  top: 0;
  left: 0;
  width: 240px;
  height: 64px;
  line-height: 64px;
  background-color: #20222a;
  font-size: 20px;
  overflow: hidden;
  box-sizing: border-box;
  box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15);
  color: rgba(255, 255, 255, 0.8);
  z-index: 1024;
  &_title {
    display: block;
    text-align: center;
    font-weight: 300;
    position: fixed;
    top: 0;
    left: 0;
    width: 240px;
    height: 64px;
    line-height: 64px;
    background-color: #20222a;
    font-size: 20px;
  }
  &_subtitle {
    display: block;
    text-align: center;
    font-size: 18px;
    font-weight: bold;
    color: #fff;
  }
    overflow: hidden;
    box-sizing: border-box;
    box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15);
    color: rgba(255, 255, 255, 0.8);
    z-index: 1024;
    &_title {
        display: block;
        text-align: center;
        font-weight: 300;
        font-size: 20px;
    }
    &_subtitle {
        display: block;
        text-align: center;
        font-size: 18px;
        font-weight: bold;
        color: #fff;
    }
}
</style>
src/page/index/top/index.vue
@@ -94,6 +94,7 @@
    </div>
</template>
<script>
import { getStore } from "@/util/store"
import { setTheme } from "@/util/util"
import { resetRouter } from '@/router/router'
import { mapGetters, mapState } from "vuex"
@@ -121,6 +122,7 @@
    name: "top",
    data () {
        return {
            webType: getStore({ name: "webType" }),
            searchShow: false,
            userBox: false,
            userForm: {
@@ -242,7 +244,13 @@
            }).then(() => {
                this.$store.dispatch("LogOut").then(() => {
                    resetRouter()
                    this.$router.push({ path: "/login" })
                    if (this.webType == 'default') {
                        this.$router.push({ path: "/login" })
                    } else {
                        this.$router.push({ path: "/tenementLogin" })
                    }
                })
            })
        }
src/page/login/index.vue
@@ -7,7 +7,8 @@
                    {{ time }}
                </div>
                <!-- <img class="img" src="/img/logo.png" alt=""> -->
                <p class="title">{{ $t('login.info') }}</p>
                <!-- <p class="title">{{ $t('login.info') }}</p> -->
                <p class="title">基层智治综合协同平台</p>
            </div>
            <div class="login-border">
                <img class="img" src="/img/logo.png" alt="">
@@ -33,6 +34,7 @@
    </div>
</template>
<script>
import { setStore, getStore } from "@/util/store"
import Watermark from "@/warterMarkVUE"
import userLogin from "./userlogin"
import codeLogin from "./codelogin"
@@ -71,6 +73,17 @@
        }
    },
    created () {
        document.title = "基层智治综合协同平台"
        setStore({
            name: "webTitle",
            content: '基层智治综合协同平台',
        })
        setStore({
            name: "webType",
            content: 'default',
        })
        Watermark.remove()
        this.handleLogin()
src/page/login/tenement.vue
New file
@@ -0,0 +1,157 @@
<template>
    <div class="login-container" ref="login" @keyup.enter.native="handleLogin">
        <top-color v-show="false"></top-color>
        <div class="login-weaper animated bounceInDown">
            <div class="login-left">
                <div class="login-time">
                    {{ time }}
                </div>
                <!-- <img class="img" src="/img/logo.png" alt=""> -->
                <!-- <p class="title">{{ $t('login.info') }}</p> -->
                <p class="title">上饶市智慧物业管理平台</p>
            </div>
            <div class="login-border">
                <img class="img" src="/img/logo.png" alt="">
                <div class="login-main">
                    <h4 class="login-title">
                        {{ $t('login.title') }}
                        <!-- <top-lang></top-lang> -->
                    </h4>
                    <userLogin v-if="activeName === 'user'"></userLogin>
                    <!-- <codeLogin v-else-if="activeName==='code'"></codeLogin> -->
                    <!-- <thirdLogin v-else-if="activeName==='third'"></thirdLogin> -->
                    <div class="login-menu">
                        <!-- <a href="#" @click.stop="activeName='user'">{{ $t('login.userLogin') }}</a> -->
                        <!--<a href="#" @click.stop="activeName='code'">{{ $t('login.phoneLogin') }}</a>-->
                        <!-- <a href="#" @click.stop="activeName='third'">{{ $t('login.thirdLogin') }}</a> -->
                        <!-- <a :href="website.ssoUrl + website.redirectUri">{{ $t('login.ssoLogin') }}</a> -->
                    </div>
                </div>
            </div>
        </div>
        <div class="copyright-box">
            版权所有:上饶市住房和城乡建设局
            <br />
            技术支持:上饶国控数字科技有限公司
        </div>
    </div>
</template>
<script>
import { setStore, getStore } from "@/util/store"
import Watermark from "@/warterMarkVUE"
import userLogin from "./userlogin"
import codeLogin from "./codelogin"
import thirdLogin from "./thirdlogin"
import { mapGetters } from "vuex"
import { dateFormat } from "@/util/date"
import { validatenull } from "@/util/validate"
import topLang from "@/page/index/top/top-lang"
import topColor from "@/page/index/top/top-color"
import { getQueryString, getTopUrl } from "@/util/util"
export default {
    name: "login",
    components: {
        userLogin,
        codeLogin,
        thirdLogin,
        topLang,
        topColor
    },
    data () {
        return {
            time: "",
            activeName: "user",
            socialForm: {
                tenantId: "000000",
                source: "",
                code: "",
                state: "",
            }
        }
    },
    watch: {
        $route () {
            this.handleLogin()
        }
    },
    created () {
        document.title = "上饶市智慧物业管理平台"
        setStore({
            name: "webTitle",
            content: '上饶市智慧物业管理平台',
        })
        setStore({
            name: "webType",
            content: 'secend',
        })
        Watermark.remove()
        this.handleLogin()
        this.getTime()
    },
    mounted () {
    },
    computed: {
        ...mapGetters(["website", "tagWel"])
    },
    props: [],
    methods: {
        getTime () {
            setInterval(() => {
                this.time = dateFormat(new Date())
            }, 1000)
        },
        handleLogin () {
            const topUrl = getTopUrl()
            const redirectUrl = "/oauth/redirect/"
            const ssoCode = "?code="
            this.socialForm.source = getQueryString("source")
            this.socialForm.code = getQueryString("code")
            this.socialForm.state = getQueryString("state")
            if (validatenull(this.socialForm.source) && topUrl.includes(redirectUrl)) {
                let source = topUrl.split("?")[0]
                source = source.split(redirectUrl)[1]
                this.socialForm.source = source
            }
            if (topUrl.includes(redirectUrl) && !validatenull(this.socialForm.source) && !validatenull(this.socialForm.code) && !validatenull(this.socialForm.state)) {
                const loading = this.$loading({
                    lock: true,
                    text: '第三方系统登录中,请稍后。。。',
                    spinner: "el-icon-loading"
                })
                this.$store.dispatch("LoginBySocial", this.socialForm).then(() => {
                    window.location.href = topUrl.split(redirectUrl)[0]
                    this.$router.push({ path: this.tagWel.value })
                    loading.close()
                }).catch(() => {
                    loading.close()
                })
            } else if (!topUrl.includes(redirectUrl) && !validatenull(this.socialForm.code) && !validatenull(this.socialForm.state)) {
                const loading = this.$loading({
                    lock: true,
                    text: '单点系统登录中,请稍后。。。',
                    spinner: "el-icon-loading"
                })
                this.$store.dispatch("LoginBySso", this.socialForm).then(() => {
                    window.location.href = topUrl.split(ssoCode)[0]
                    this.$router.push({ path: this.tagWel.value })
                    loading.close()
                }).catch(() => {
                    loading.close()
                })
            }
        }
    }
}
</script>
<style lang="scss">
@import "@/styles/login.scss";
</style>
src/router/avue-router.js
@@ -1,8 +1,10 @@
let RouterPlugin = function () {
  this.$router = null;
  this.$store = null;
};
import { getStore } from "@/util/store";
RouterPlugin.install = function (vue, option = {}) {
  this.$router = option.router;
  this.$store = option.store;
@@ -10,53 +12,58 @@
  // 这个的作用是 为了检查出网页链接,因为本项目用到了 iframe
  function isURL(s) {
    if (s.includes('html')) return true;
    return /^http[s]?:\/\/.*/.test(s)
    if (s.includes("html")) return true;
    return /^http[s]?:\/\/.*/.test(s);
  }
  // 将参数处理为参数的形式拼接
  function objToform(obj) {
    let result = [];
    Object.keys(obj).forEach(ele => {
    Object.keys(obj).forEach((ele) => {
      result.push(`${ele}=${obj[ele]}`);
    })
    return result.join('&');
    });
    return result.join("&");
  }
  this.$router.$avueRouter = {
    //全局配置
    $website: this.$store.getters.website,
    group: '',
    group: "",
    meta: {},
    safe: this,
    // 设置标题
    setTitle: (title) => {
      const defaultTitle = this.$vue.$t('title');
      title = title ? `${title}-${defaultTitle}` : defaultTitle;
      //   const defaultTitle = this.$vue.$t("title");
      title = title
        ? `${title}-${getStore({ name: "webTitle" })}`
        : getStore({ name: "webTitle" });
      document.title = title;
    },
    closeTag: (value) => {
      let tag = value || this.$store.getters.tag;
      if (typeof value === 'string') {
        tag = this.$store.getters.tagList.filter(ele => ele.value === value)[0]
      if (typeof value === "string") {
        tag = this.$store.getters.tagList.filter(
          (ele) => ele.value === value
        )[0];
      }
      this.$store.commit('DEL_TAG', tag)
      this.$store.commit("DEL_TAG", tag);
    },
    generateTitle: (title, key) => {
      if (!key) return title;
      const hasKey = this.$vue.$te('route.' + key)
      const hasKey = this.$vue.$te("route." + key);
      if (hasKey) {
        // $t :this method from vue-i18n, inject in @/lang/index.js
        const translatedTitle = this.$vue.$t('route.' + key)
        const translatedTitle = this.$vue.$t("route." + key);
        return translatedTitle
        return translatedTitle;
      }
      return title
      return title;
    },
    //处理路由
    getPath: function (params) {
      let {src} = params;
      let result = src || '/';
      let { src } = params;
      let result = src || "/";
      if (isURL(src)) {
        result = `/myiframe/urlPath?${objToform(params)}`;
      }
@@ -65,12 +72,11 @@
    //正则处理路由
    vaildPath: function (list, path) {
      let result = false;
      list.forEach(ele => {
      list.forEach((ele) => {
        if (new RegExp("^" + ele + ".*", "g").test(path)) {
          result = true
          result = true;
        }
      })
      });
      return result;
    },
    //设置路由值
@@ -85,24 +91,24 @@
    },
    //动态路由
    // 路由是专门的一个接口获取
      /**
       * aMenu: 接受到的动态路由数据 menu的结构外层有父级path 里面有一个childen 记录页面的路由
       * first: 为了区分外界 调用formatRoutes 和 当前文件调用 formatRoutes
      */
    /**
     * aMenu: 接受到的动态路由数据 menu的结构外层有父级path 里面有一个childen 记录页面的路由
     * first: 为了区分外界 调用formatRoutes 和 当前文件调用 formatRoutes
     */
    formatRoutes: function (aMenu = [], first) {
      // window.console.log('aMenu')
      // window.console.log(aMenu)
      const aRouter = []
      const aRouter = [];
      // 获取到全局配置中的 props
      const propsConfig = this.$website.menu.props;
      // 设置 props默认值 作用就是将字段设置成配置的
      const propsDefault = {
        label: propsConfig.label || 'name',
        path: propsConfig.path || 'path',
        icon: propsConfig.icon || 'icon',
        children: propsConfig.children || 'children',
        meta: propsConfig.meta || 'meta',
      }
        label: propsConfig.label || "name",
        path: propsConfig.path || "path",
        icon: propsConfig.icon || "icon",
        children: propsConfig.children || "children",
        meta: propsConfig.meta || "meta",
      };
      // 如果没有权限菜单就结束
      if (aMenu.length === 0) return;
      // 开始处理menu
@@ -113,25 +119,28 @@
        let path = (() => {
            if (first) {
              // 将 '/index' 替换为 ''
              return oMenu[propsDefault.path].replace('/index', '')
              return oMenu[propsDefault.path].replace("/index", "");
            } else {
              return oMenu[propsDefault.path]
              return oMenu[propsDefault.path];
            }
          })(),
          //特殊处理组件 执行完这个 component 也就是精确到具体的文件了  views文件夹下面就是具体的页面代码
          component = 'views' + oMenu.path,
          component = "views" + oMenu.path,
          name = oMenu[propsDefault.label],
          icon = oMenu[propsDefault.icon],
          children = oMenu[propsDefault.children],
          meta = oMenu[propsDefault.meta] || {};
          // meta中 keepalive 的处理
        meta = Object.assign(meta, (function () {
          if (option.keepAlive === true) {
            return {
              keepAlive: true
        // meta中 keepalive 的处理
        meta = Object.assign(
          meta,
          (function () {
            if (option.keepAlive === true) {
              return {
                keepAlive: true,
              };
            }
          }
        })());
          })()
        );
        //是否有子路由
        const isChild = children.length !== 0;
        const oRouter = {
@@ -139,15 +148,15 @@
          component(resolve) {
            // 判断是否为首路由
            if (first) {
              require(['../page/index'], resolve)
              return
              require(["../page/index"], resolve);
              return;
              // 判断是否为多层路由
            } else if (isChild && !first) {
              require(['../page/index/layout'], resolve)
              return
              require(["../page/index/layout"], resolve);
              return;
              // 判断是否为最终的页面视图
            } else {
              require([`../${component}.vue`], resolve)
              require([`../${component}.vue`], resolve);
            }
          },
          name: name,
@@ -155,45 +164,49 @@
          meta: meta,
          redirect: (() => {
            // 第一次进来但是没有子路由的 需要添加redirect
            if (!isChild && first && !isURL(path)) return `${path}/index`
            else return '';
            if (!isChild && first && !isURL(path)) return `${path}/index`;
            else return "";
          })(),
          // 整理子路由的route 配置
          // 处理是否为一级路由
          children: !isChild ? (() => {
            if (first) {
              // 这里的isURL判断,因为这个网站有使用 iframe。所以需要判断是否为网页链接
              if (!isURL(path)) oMenu[propsDefault.path] = `${path}/index`;
              return [{
                component(resolve) {
                  require([`../${component}.vue`], resolve)
                },
                icon: icon,
                name: name,
                meta: meta,
                path: 'index'
              }]
            }
            return [];
          })() : (() => {
            /**
             * 这里是重点,当有子路由的时候 会再去执行 formatRoutes 方法,然后又会有一个新的 aMenu for循环。
             * 最后返回的是一个数组 aRouter 这个数组就会作为 childen的值被 return
            */
            return this.formatRoutes(children, false)
          })()
        }
        aRouter.push(oRouter)
          children: !isChild
            ? (() => {
                if (first) {
                  // 这里的isURL判断,因为这个网站有使用 iframe。所以需要判断是否为网页链接
                  if (!isURL(path)) oMenu[propsDefault.path] = `${path}/index`;
                  return [
                    {
                      component(resolve) {
                        require([`../${component}.vue`], resolve);
                      },
                      icon: icon,
                      name: name,
                      meta: meta,
                      path: "index",
                    },
                  ];
                }
                return [];
              })()
            : (() => {
                /**
                 * 这里是重点,当有子路由的时候 会再去执行 formatRoutes 方法,然后又会有一个新的 aMenu for循环。
                 * 最后返回的是一个数组 aRouter 这个数组就会作为 childen的值被 return
                 */
                return this.formatRoutes(children, false);
              })(),
        };
        aRouter.push(oRouter);
      }
      // for循环结束
      // 这个first 卡的其实就是首路由
      if (first) {
        this.safe.$router.addRoutes(aRouter)
        this.safe.$router.addRoutes(aRouter);
      } else {
        // 这里返回的是子组件
        return aRouter
        return aRouter;
      }
    }
  }
}
    },
  };
};
export default RouterPlugin;
src/router/page/index.js
@@ -1,81 +1,102 @@
import Layout from '@/page/index/'
/*
 * @Author: shuishen 1109946754@qq.com
 * @Date: 2023-12-14 17:10:00
 * @LastEditors: shuishen 1109946754@qq.com
 * @LastEditTime: 2024-01-19 11:40:51
 * @FilePath: \jczz_web\src\router\page\index.js
 * @Description:
 *
 * Copyright (c) 2024 by shuishen, All Rights Reserved.
 */
import Layout from "@/page/index/";
export default [{
  path: '/login',
  name: '登录页',
  component: () =>
    import( /* webpackChunkName: "page" */ '@/page/login/index'),
  meta: {
    keepAlive: true,
    isTab: false,
    isAuth: false
  }
},
export default [
  {
    path: '/lock',
    name: '锁屏页',
    path: "/login",
    name: "登录页",
    component: () =>
      import( /* webpackChunkName: "page" */ '@/page/lock/index'),
      import(/* webpackChunkName: "page" */ "@/page/login/index"),
    meta: {
      keepAlive: true,
      isTab: false,
      isAuth: false
    }
      isAuth: false,
    },
  },
  {
    path: '/404',
    path: "/tenementLogin",
    name: "登录页",
    component: () =>
      import( /* webpackChunkName: "page" */ '@/components/error-page/404'),
    name: '404',
      import(/* webpackChunkName: "page" */ "@/page/login/tenement.vue"),
    meta: {
      keepAlive: true,
      isTab: false,
      isAuth: false
    }
      isAuth: false,
    },
  },
  {
    path: '/403',
    component: () =>
      import( /* webpackChunkName: "page" */ '@/components/error-page/403'),
    name: '403',
    path: "/lock",
    name: "锁屏页",
    component: () => import(/* webpackChunkName: "page" */ "@/page/lock/index"),
    meta: {
      keepAlive: true,
      isTab: false,
      isAuth: false
    }
      isAuth: false,
    },
  },
  {
    path: '/500',
    path: "/404",
    component: () =>
      import( /* webpackChunkName: "page" */ '@/components/error-page/500'),
    name: '500',
      import(/* webpackChunkName: "page" */ "@/components/error-page/404"),
    name: "404",
    meta: {
      keepAlive: true,
      isTab: false,
      isAuth: false
    }
      isAuth: false,
    },
  },
  {
    path: '/',
    name: '主页',
    redirect: '/wel'
    path: "/403",
    component: () =>
      import(/* webpackChunkName: "page" */ "@/components/error-page/403"),
    name: "403",
    meta: {
      keepAlive: true,
      isTab: false,
      isAuth: false,
    },
  },
  {
    path: '/myiframe',
    path: "/500",
    component: () =>
      import(/* webpackChunkName: "page" */ "@/components/error-page/500"),
    name: "500",
    meta: {
      keepAlive: true,
      isTab: false,
      isAuth: false,
    },
  },
  {
    path: "/",
    name: "主页",
    redirect: "/wel",
  },
  {
    path: "/myiframe",
    component: Layout,
    redirect: '/myiframe',
    children: [{
      path: ":routerPath",
      name: 'iframe',
      component: () =>
        import( /* webpackChunkName: "page" */ '@/components/iframe/main'),
      props: true
    }]
    redirect: "/myiframe",
    children: [
      {
        path: ":routerPath",
        name: "iframe",
        component: () =>
          import(/* webpackChunkName: "page" */ "@/components/iframe/main"),
        props: true,
      },
    ],
  },
  {
    path: '*',
    redirect: '/404'
  }
]
    path: "*",
    redirect: "/404",
  },
];
src/store/getters.js
@@ -1,29 +1,40 @@
/*
 * @Author: shuishen 1109946754@qq.com
 * @Date: 2023-12-14 17:10:00
 * @LastEditors: shuishen 1109946754@qq.com
 * @LastEditTime: 2024-01-19 15:58:57
 * @FilePath: \jczz_web\src\store\getters.js
 * @Description:
 *
 * Copyright (c) 2024 by shuishen, All Rights Reserved.
 */
const getters = {
  tag: state => state.tags.tag,
  language: state => state.common.language,
  website: state => state.common.website,
  userInfo: state => state.user.userInfo,
  colorName: state => state.common.colorName,
  themeName: state => state.common.themeName,
  isShade: state => state.common.isShade,
  isCollapse: state => state.common.isCollapse,
  keyCollapse: (state, getters) => getters.screen > 1 ? getters.isCollapse : false,
  screen: state => state.common.screen,
  isLock: state => state.common.isLock,
  isFullScren: state => state.common.isFullScren,
  isMenu: state => state.common.isMenu,
  lockPasswd: state => state.common.lockPasswd,
  tagList: state => state.tags.tagList,
  tagWel: state => state.tags.tagWel,
  token: state => state.user.token,
  roles: state => state.user.roles,
  permission: state => state.user.permission,
  menu: state => state.user.menu,
  menuId: state => state.user.menuId,
  menuAll: state => state.user.menuAll,
  logsList: state => state.logs.logsList,
  logsLen: state => state.logs.logsList.length || 0,
  tag: (state) => state.tags.tag,
  language: (state) => state.common.language,
  website: (state) => state.common.website,
  userInfo: (state) => state.user.userInfo,
  colorName: (state) => state.common.colorName,
  themeName: (state) => state.common.themeName,
  isShade: (state) => state.common.isShade,
  isCollapse: (state) => state.common.isCollapse,
  keyCollapse: (state, getters) =>
    getters.screen > 1 ? getters.isCollapse : false,
  screen: (state) => state.common.screen,
  isLock: (state) => state.common.isLock,
  isFullScren: (state) => state.common.isFullScren,
  isMenu: (state) => state.common.isMenu,
  lockPasswd: (state) => state.common.lockPasswd,
  tagList: (state) => state.tags.tagList,
  tagWel: (state) => state.tags.tagWel,
  token: (state) => state.user.token,
  roles: (state) => state.user.roles,
  permission: (state) => state.user.permission,
  menu: (state) => state.user.menu,
  menuId: (state) => state.user.menuId,
  menuAll: (state) => state.user.menuAll,
  logsList: (state) => state.logs.logsList,
  logsLen: (state) => state.logs.logsList.length || 0,
  logsFlag: (state, getters) => getters.logsLen === 0,
  flowRoutes: state => state.dict.flowRoutes,
}
export default getters
  flowRoutes: (state) => state.dict.flowRoutes,
};
export default getters;
src/store/modules/common.js
@@ -1,20 +1,25 @@
import {
  setStore,
  getStore,
  removeStore
} from '@/util/store'
import website from '@/config/website'
/*
 * @Author: shuishen 1109946754@qq.com
 * @Date: 2023-12-14 17:10:00
 * @LastEditors: shuishen 1109946754@qq.com
 * @LastEditTime: 2024-01-19 16:43:29
 * @FilePath: \jczz_web\src\store\modules\common.js
 * @Description:
 *
 * Copyright (c) 2024 by shuishen, All Rights Reserved.
 */
import { setStore, getStore, removeStore } from "@/util/store";
import website from "@/config/website";
const common = {
  state: {
    language: getStore({name: 'language'}) || 'zh',
    language: getStore({ name: "language" }) || "zh",
    isCollapse: false,
    isFullScren: false,
    isMenu: true,
    isShade: false,
    screen: -1,
    isLock: getStore({name: 'isLock'}) || false,
    isLock: getStore({ name: "isLock" }) || false,
    showTag: true,
    showDebug: true,
    showCollapse: true,
@@ -24,18 +29,18 @@
    showTheme: true,
    showMenu: true,
    showColor: true,
    colorName: getStore({name: 'colorName'}) || '#409EFF',
    themeName: 'theme-white',
    lockPasswd: getStore({name: 'lockPasswd'}) || '',
    colorName: getStore({ name: "colorName" }) || "#409EFF",
    themeName: "theme-white",
    lockPasswd: getStore({ name: "lockPasswd" }) || "",
    website: website,
  },
  mutations: {
    SET_LANGUAGE: (state, language) => {
      state.language = language
      state.language = language;
      setStore({
        name: 'language',
        content: state.language
      })
        name: "language",
        content: state.language,
      });
    },
    SET_SHADE: (state, active) => {
      state.isShade = active;
@@ -52,10 +57,10 @@
    SET_LOCK: (state) => {
      state.isLock = true;
      setStore({
        name: 'isLock',
        name: "isLock",
        content: state.isLock,
        type: 'session'
      })
        type: "session",
      });
    },
    SET_SCREEN: (state, screen) => {
      state.screen = screen;
@@ -63,37 +68,37 @@
    SET_COLOR_NAME: (state, colorName) => {
      state.colorName = colorName;
      setStore({
        name: 'colorName',
        name: "colorName",
        content: state.colorName,
      })
      });
    },
    SET_THEME_NAME: (state, themeName) => {
      state.themeName = themeName;
      setStore({
        name: 'themeName',
        name: "themeName",
        content: state.themeName,
      })
      });
    },
    SET_LOCK_PASSWD: (state, lockPasswd) => {
      state.lockPasswd = lockPasswd;
      setStore({
        name: 'lockPasswd',
        name: "lockPasswd",
        content: state.lockPasswd,
        type: 'session'
      })
        type: "session",
      });
    },
    CLEAR_LOCK: (state) => {
      state.isLock = false;
      state.lockPasswd = '';
      state.lockPasswd = "";
      removeStore({
        name: 'lockPasswd',
        type: 'session'
        name: "lockPasswd",
        type: "session",
      });
      removeStore({
        name: 'isLock',
        type: 'session'
        name: "isLock",
        type: "session",
      });
    },
  }
}
export default common
  },
};
export default common;
src/styles/login.scss
@@ -8,6 +8,16 @@
    background-color: #469BC0;
    // background-image: url("/img/bg/bg.jpg");
    background-size: 100% 100%;
    .copyright-box {
        width: 100%;
        position: absolute;
        bottom: 40px;
        text-align: center;
        color: #fff;
        line-height: 24px;
        font-size: 14px;
    }
}
.login-weaper {
src/views/article/discussionManage.vue
@@ -1,777 +1,773 @@
<template>
    <basic-container>
        <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" ref="crud" @row-del="rowDel"
            v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave"
            :before-open="beforeOpen" @search-change="searchChange" @search-reset="searchReset"
            @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
            @refresh-change="refreshChange" @on-load="onLoad">
            <template slot="menuLeft">
                <el-button size="small" icon="el-icon-delete" plain v-if="permission.article_delete" @click="handleDelete">删
                    除
                </el-button>
            </template>
  <basic-container>
    <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" ref="crud" @row-del="rowDel"
      v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave" :before-open="beforeOpen"
      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
      @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
      <template slot="menuLeft">
        <el-button size="small" icon="el-icon-delete" plain v-if="permission.article_delete" @click="handleDelete">删
          除
        </el-button>
      </template>
            <template slot-scope="{type,size,row }" slot="menu">
                <el-button icon="el-icon-s-tools" :size="size" :type="type" @click.stop="openDilog(row, 1)">
                    设置
                </el-button>
      <template slot-scope="{type,size,row }" slot="menu">
        <el-button icon="el-icon-s-tools" :size="size" :type="type" @click.stop="openDilog(row, 1)">
          设置
        </el-button>
                <el-button icon="el-icon-edit" :size="size" :type="type" @click.stop="openEditPopup(row, 1)">
                    编辑议题
                </el-button>
        <el-button icon="el-icon-edit" :size="size" :type="type" @click.stop="openEditPopup(row, 1)">
          编辑议题
        </el-button>
                <el-button icon="el-icon-user" :size="size" :type="type" @click.stop="openUserPopup(row, 1)">
                    参与用户
                </el-button>
        <el-button icon="el-icon-user" :size="size" :type="type" @click.stop="openUserPopup(row, 1)">
          参与用户
        </el-button>
                <el-button v-if="row.publish == '1'" icon="el-icon-close" :size="size" :type="type"
                    @click.stop="updateFb(row)">
                    撤销
                </el-button>
        <el-button v-if="row.publish == '1'" icon="el-icon-close" :size="size" :type="type" @click.stop="updateFb(row)">
          撤销
        </el-button>
                <el-button v-if="row.publish == '0'" icon="el-icon-check" :size="size" :type="type"
                    @click.stop="updateFb(row)">
                    发布
                </el-button>
            </template>
        <el-button v-if="row.publish == '0'" icon="el-icon-check" :size="size" :type="type" @click.stop="updateFb(row)">
          发布
        </el-button>
      </template>
            <template slot-scope="{ row, size }" slot="publish">
                <el-tag :size="size" :type="showStatus(row.publish, 1).type" v-text="showStatus(row.publish, 1).text">
                </el-tag>
            </template>
      <template slot-scope="{ row, size }" slot="publish">
        <el-tag :size="size" :type="showStatus(row.publish, 1).type" v-text="showStatus(row.publish, 1).text">
        </el-tag>
      </template>
            <template slot-scope="{ row, size }" slot="iscomment">
                <el-tag :size="size" :type="showStatus(row.iscomment, 2).type" v-text="showStatus(row.iscomment, 2).text">
                </el-tag>
            </template>
        </avue-crud>
      <template slot-scope="{ row, size }" slot="iscomment">
        <el-tag :size="size" :type="showStatus(row.iscomment, 2).type" v-text="showStatus(row.iscomment, 2).text">
        </el-tag>
      </template>
    </avue-crud>
        <deitDiscussion ref="DeitDiscussion">
        </deitDiscussion>
    <deitDiscussion ref="DeitDiscussion">
    </deitDiscussion>
        <discussionManageChild ref="discussionManageChild" />
    <discussionManageChild ref="discussionManageChild" />
    </basic-container>
  </basic-container>
</template>
<script>
import {
  import {
    getList,
    remove,
    update,
    add,
    getNotice,
    upcomment
} from "@/api/article/article"
  } from "@/api/article/article"
import {
  import {
    getListPd,
    removePd,
    updatePd,
    addPd,
    getNoticePd,
    upcommentPd
} from "@/api/discuss/publicDiscuss"
import website from '@/config/website'
import {
  } from "@/api/discuss/publicDiscuss"
  import website from '@/config/website'
  import {
    getDistrictTree
} from "@/api/district/index"
import {
  } from "@/api/district/index"
  import {
    mapGetters
} from "vuex"
import deitDiscussion from "./components/deitDiscussion"
import discussionManageChild from "./components/discussionManageChild"
  } from "vuex"
  import deitDiscussion from "./components/deitDiscussion"
  import discussionManageChild from "./components/discussionManageChild"
export default {
  export default {
    components: {
        deitDiscussion,
        discussionManageChild,
      deitDiscussion,
      discussionManageChild,
    },
    data () {
        return {
            discussForm: {
                ontitle: '',
                title: '',
                openFlag: 0,
                numberRestrictions: 0,
                voteRestrictions: 0,
                userRestrictions: 0,
                signatureFlag: 0,
                endTime: '',
                articleId: '',
                createTime: '',
                updateTime: '',
                deleteFlag: '',
                repeatVote: 0,
                voteNumberPublic: 0,
                appointUser: 0,
                userIds: '',
                eventType: 1,
            },
            form: {},
            query: {},
            loading: true,
            page: {
                pageSize: 10,
                currentPage: 1,
                total: 0,
            },
            datetime: "",
            selectionList: [],
            option: {
                labelWidth: 96,
                searchLabelWidth: 96,
                searchShow: true,
                searchMenuSpan: 3,
                menuWidth: 500,
    data() {
      return {
        discussForm: {
          ontitle: '',
          title: '',
          openFlag: 0,
          numberRestrictions: 0,
          voteRestrictions: 0,
          userRestrictions: 0,
          signatureFlag: 0,
          endTime: '',
          articleId: '',
          createTime: '',
          updateTime: '',
          deleteFlag: '',
          repeatVote: 0,
          voteNumberPublic: 0,
          appointUser: 0,
          userIds: '',
          eventType: 1,
        },
        form: {},
        query: {},
        loading: true,
        page: {
          pageSize: 10,
          currentPage: 1,
          total: 0,
        },
        datetime: "",
        selectionList: [],
        option: {
          labelWidth: 96,
          searchLabelWidth: 96,
          searchShow: true,
          searchMenuSpan: 3,
          menuWidth: 500,
                height: "auto",
                calcHeight: 54,
                dialogWidth: 950,
                tip: false,
                border: false,
                //stripe:true,
                index: true,
                viewBtn: false,
                selection: true,
                excelBtn: true,
                dialogClickModal: false,
                column: [
                    {
                        overHidden: true,
                        label: "议事标题",
                        prop: "title",
                        span: 24,
                        row: true,
                        searchSpan: 4,
                        search: true,
                        rules: [{
                            required: true,
                            message: "请输入议事标题",
                            trigger: "blur",
                        },],
                    },
                    {
                        label: "范围",
                        prop: "articleList",
                        span: 24,
                        minRows: 2,
                        tags: true,
                        type: "tree",
                        multiple: true,
                        dicData: [],
                        rules: [{
                            required: true,
                            message: "请选择范围",
                            trigger: "blur",
                        },],
                        props: {
                            label: "name",
                            value: 'id'
                        },
                        hide: true,
                    },
                    {
                        width: 110,
                        label: "封面",
                        prop: "url",
                        // align:'center',
                        type: "upload",
                        listType: "picture-img",
                        action: "/api/blade-resource/oss/endpoint/put-file",
                        propsHttp: {
                            res: "data",
                            url: "link",
                        },
                        // hide: true,
                        span: 24,
                    },
                    {
                        width: 110,
                        label: "文章类型",
                        prop: "articleType",
                        addDisplay: true,
                        editDisplay: true,
                        viewDisplay: true,
                        searchSpan: 4,
                        checkStrictly: true,
                        dicUrl: "/api/blade-system/dict-biz/dictionary?code=investigateType",
                        props: {
                            label: "dictValue",
                            value: "dictKey",
                        },
                        search: true,
                        type: "tree",
                        rules: [{
                            required: true,
                            message: "请选择文章类型",
                            trigger: "blur",
                        },],
                    },
                    {
                        label: "发布时间",
                        prop: "dateTime",
                        type: "daterange",
                        format: "yyyy-MM-dd",
                        valueFormat: "yyyy-MM-dd",
                        searchSpan: 6,
                        searchRange: true,
                        hide: true,
                        addDisplay: false,
                        editDisplay: false,
                        viewDisplay: false,
                        search: true,
                        rules: [{
                            required: true,
                            message: "请选择发布时间",
                            trigger: "blur",
                        },],
                    },
                    {
                        width: 100,
                        label: "发布时间",
                        prop: "createTime",
                        type: "date",
                        format: "yyyy-MM-dd",
                        valueFormat: "yyyy-MM-dd HH:mm:ss",
                    },
                    {
                        width: 100,
                        label: "发布状态",
                        prop: "publish",
                        searchSpan: 4,
                        value: "0",
                        slot: true,
                        search: true,
                        type: "select",
                        rules: [{
                            required: true,
                            message: "请选择发布状态",
                            trigger: "blur",
                        },],
                        dicData: [{
                            label: "未发布",
                            value: "0",
                        },
                        {
                            label: "已发布",
                            value: "1",
                        }
                        ],
                    },
                    {
                        span: 24,
                        label: "评论区",
                        prop: "iscomment",
                        width: 80,
                        slot: true,
                        type: "switch",
                        activeColor: "#13ce66",
                        inactiveColor: "#ccc",
                        value: '1',
                        dicData: [{
                            label: "关闭",
                            value: "0",
                        },
                        {
                            label: "开启",
                            value: "1",
                        }
                        ],
                    },
                    {
                        label: "视频",
                        prop: "videoUrl",
                        type: "upload",
                        accept: "video/mp4",
                        display: false,
                        hide: true,
                        span: 24,
                        listType: "picture-img",
                        action: "/api/depl/put-depl",
                        propsHttp: {
                            url: "data",
                        },
                    },
                    {
                        label: "议事内容",
                        prop: "content",
                        component: "AvueUeditor",
                        options: {
                            action: "/api/blade-resource/oss/endpoint/put-file",
                            // customConfig: {
                            //   lineHeights: ['1', '1.15', '1.6', '2', '2.5', '3']
                            // },//wangEditor编辑的配置
                            props: {
                                res: "data",
                                url: "link",
                            },
                        },
                        hide: true,
                        minRows: 6,
                        span: 24,
                    },
                ],
          height: "auto",
          calcHeight: 54,
          dialogWidth: 950,
          tip: false,
          border: false,
          //stripe:true,
          index: true,
          viewBtn: false,
          selection: true,
          excelBtn: true,
          dialogClickModal: false,
          column: [{
              overHidden: true,
              label: "议事标题",
              prop: "title",
              span: 24,
              row: true,
              searchSpan: 4,
              search: true,
              rules: [{
                required: true,
                message: "请输入议事标题",
                trigger: "blur",
              }, ],
            },
            data: [],
            optionDiscuss: {
                column: [{
                    label: "",
                    type: 'title',
                    prop: "title",
                    span: 24,
                    row: true,
                    offset: 2,
                    styles: {
                        fontSize: '24px'
                    }
                }, {
                    labelWidth: 100,
                    label: '开启投票',
                    prop: 'openFlag',
                    type: 'radio',
                    button: true,
                    row: true,
                    offset: 6,
                    dicData: [{
                        label: '开启',
                        value: 0
                    }, {
                        label: '不开启',
                        value: 1
                    }],
                    rules: [{
                        required: true,
                        message: "请选择开启状态",
                        trigger: "blur",
                    },],
                }, {
                    labelWidth: 100,
                    label: '投票限制',
                    prop: 'voteRestrictions',
                    type: 'radio',
                    button: true,
                    row: true,
                    offset: 6,
                    dicData: [{
                        label: '一人一票',
                        value: 0
                    }, {
                        label: '一户一票',
                        value: 1
                    }],
                    rules: [{
                        required: true,
                        message: "请选择投票限制",
                        trigger: "blur",
                    },],
                }, {
                    labelWidth: 100,
                    label: '签名',
                    prop: 'signatureFlag',
                    type: 'radio',
                    button: true,
                    row: true,
                    offset: 6,
                    dicData: [{
                        label: '不需要',
                        value: 0
                    }, {
                        label: '需要',
                        value: 1
                    }],
                    rules: [{
                        required: true,
                        message: "请选择是否签名",
                        trigger: "blur",
                    },],
                }, {
                    labelWidth: 100,
                    label: '指定用户',
                    prop: 'appointUser',
                    type: 'radio',
                    button: true,
                    row: true,
                    offset: 6,
                    dicData: [{
                        label: '不限制',
                        value: 0
                    }, {
                        label: '指定用户',
                        value: 1
                    }],
                    rules: [{
                        required: true,
                        message: "请选择是否指定用户",
                        trigger: "blur",
                    },],
            {
              label: "范围",
              prop: "articleList",
              span: 24,
              minRows: 2,
              tags: true,
              type: "cascader",
              multiple: true,
              dicData: [],
              rules: [{
                required: true,
                message: "请选择范围",
                trigger: "blur",
              }, ],
              props: {
                label: "name",
                value: 'id'
              },
              hide: true,
            },
            {
              width: 110,
              label: "封面",
              prop: "url",
              // align:'center',
              type: "upload",
              listType: "picture-img",
              action: "/api/blade-resource/oss/endpoint/put-file",
              propsHttp: {
                res: "data",
                url: "link",
              },
              // hide: true,
              span: 24,
            },
            {
              width: 110,
              label: "文章类型",
              prop: "articleType",
              addDisplay: true,
              editDisplay: true,
              viewDisplay: true,
              searchSpan: 4,
              checkStrictly: true,
              dicUrl: "/api/blade-system/dict-biz/dictionary?code=investigateType",
              props: {
                label: "dictValue",
                value: "dictKey",
              },
              search: true,
              type: "tree",
              rules: [{
                required: true,
                message: "请选择文章类型",
                trigger: "blur",
              }, ],
            },
            {
              label: "发布时间",
              prop: "dateTime",
              type: "daterange",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              searchSpan: 6,
              searchRange: true,
              hide: true,
              addDisplay: false,
              editDisplay: false,
              viewDisplay: false,
              search: true,
              rules: [{
                required: true,
                message: "请选择发布时间",
                trigger: "blur",
              }, ],
            },
            {
              width: 100,
              label: "发布时间",
              prop: "createTime",
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd HH:mm:ss",
            },
            {
              width: 100,
              label: "发布状态",
              prop: "publish",
              searchSpan: 4,
              value: "0",
              slot: true,
              search: true,
              type: "select",
              rules: [{
                required: true,
                message: "请选择发布状态",
                trigger: "blur",
              }, ],
              dicData: [{
                  label: "未发布",
                  value: "0",
                },
                {
                    label: "截止时间",
                    row: true,
                    offset: 6,
                    prop: "endTime",
                    type: "datetime",
                    format: "yyyy-MM-dd hh:mm:ss",
                    valueFormat: "timestamp",
                    rules: [{
                        required: true,
                        message: "请选择截止时间",
                        trigger: "blur",
                    },],
                },
                ]
                  label: "已发布",
                  value: "1",
                }
              ],
            },
            districtTree: [],
        }
            {
              span: 24,
              label: "评论区",
              prop: "iscomment",
              width: 80,
              slot: true,
              type: "switch",
              activeColor: "#13ce66",
              inactiveColor: "#ccc",
              value: '1',
              dicData: [{
                  label: "关闭",
                  value: "0",
                },
                {
                  label: "开启",
                  value: "1",
                }
              ],
            },
            {
              label: "视频",
              prop: "videoUrl",
              type: "upload",
              accept: "video/mp4",
              display: false,
              hide: true,
              span: 24,
              listType: "picture-img",
              action: "/api/depl/put-depl",
              propsHttp: {
                url: "data",
              },
            },
            {
              label: "议事内容",
              prop: "content",
              component: "AvueUeditor",
              options: {
                action: "/api/blade-resource/oss/endpoint/put-file",
                // customConfig: {
                //   lineHeights: ['1', '1.15', '1.6', '2', '2.5', '3']
                // },//wangEditor编辑的配置
                props: {
                  res: "data",
                  url: "link",
                },
              },
              hide: true,
              minRows: 6,
              span: 24,
            },
          ],
        },
        data: [],
        optionDiscuss: {
          column: [{
              label: "",
              type: 'title',
              prop: "title",
              span: 24,
              row: true,
              offset: 2,
              styles: {
                fontSize: '24px'
              }
            }, {
              labelWidth: 100,
              label: '开启投票',
              prop: 'openFlag',
              type: 'radio',
              button: true,
              row: true,
              offset: 6,
              dicData: [{
                label: '开启',
                value: 0
              }, {
                label: '不开启',
                value: 1
              }],
              rules: [{
                required: true,
                message: "请选择开启状态",
                trigger: "blur",
              }, ],
            }, {
              labelWidth: 100,
              label: '投票限制',
              prop: 'voteRestrictions',
              type: 'radio',
              button: true,
              row: true,
              offset: 6,
              dicData: [{
                label: '一人一票',
                value: 0
              }, {
                label: '一户一票',
                value: 1
              }],
              rules: [{
                required: true,
                message: "请选择投票限制",
                trigger: "blur",
              }, ],
            }, {
              labelWidth: 100,
              label: '签名',
              prop: 'signatureFlag',
              type: 'radio',
              button: true,
              row: true,
              offset: 6,
              dicData: [{
                label: '不需要',
                value: 0
              }, {
                label: '需要',
                value: 1
              }],
              rules: [{
                required: true,
                message: "请选择是否签名",
                trigger: "blur",
              }, ],
            }, {
              labelWidth: 100,
              label: '指定用户',
              prop: 'appointUser',
              type: 'radio',
              button: true,
              row: true,
              offset: 6,
              dicData: [{
                label: '不限制',
                value: 0
              }, {
                label: '指定用户',
                value: 1
              }],
              rules: [{
                required: true,
                message: "请选择是否指定用户",
                trigger: "blur",
              }, ],
            },
            {
              label: "截止时间",
              row: true,
              offset: 6,
              prop: "endTime",
              type: "datetime",
              format: "yyyy-MM-dd hh:mm:ss",
              valueFormat: "timestamp",
              rules: [{
                required: true,
                message: "请选择截止时间",
                trigger: "blur",
              }, ],
            },
          ]
        },
        districtTree: [],
      }
    },
    watch: {
        "form.articleType": {
            handler (val) {
                if (val) {
                    var videoUrl = this.findObject(this.option.column, "videoUrl")
                    var content = this.findObject(this.option.column, "content")
                    if (val.indexOf('ksp') != -1) {
                        videoUrl.display = true
                        content.display = false
                        videoUrl.rules = [{
                            required: false,
                            message: "请选择视频",
                            trigger: "blur",
                        },]
                    } else {
                        videoUrl.display = false
                        content.display = true
                        videoUrl.rules = ""
                    }
                }
            },
            immediate: true,
        }
      "form.articleType": {
        handler(val) {
          if (val) {
            var videoUrl = this.findObject(this.option.column, "videoUrl")
            var content = this.findObject(this.option.column, "content")
            if (val.indexOf('ksp') != -1) {
              videoUrl.display = true
              content.display = false
              videoUrl.rules = [{
                required: false,
                message: "请选择视频",
                trigger: "blur",
              }, ]
            } else {
              videoUrl.display = false
              content.display = true
              videoUrl.rules = ""
            }
          }
        },
        immediate: true,
      }
    },
    computed: {
        ...mapGetters(["permission", "userInfo"]),
        permissionList () {
            return {
                addBtn: this.vaildData(this.permission.article_add, true),
                viewBtn: this.vaildData(this.permission.article_view, true),
                delBtn: this.vaildData(this.permission.article_delete, true),
                editBtn: this.vaildData(this.permission.article_edit, true),
            }
        },
        ids () {
            let ids = []
            this.selectionList.forEach((ele) => {
                ids.push(ele.id)
            })
            return ids.join(",")
        },
        showStatus () {
            return (data, type) => {
                if (data == 0) {
                    return {
                        text: type == 1 ? '未发布' : '关闭',
                        type: 'info'
                    }
                } else if (data == 1) {
                    return {
                        text: type == 1 ? '已发布' : '开启',
                        type: 'success'
                    }
                }
            }
      ...mapGetters(["permission", "userInfo"]),
      permissionList() {
        return {
          addBtn: this.vaildData(this.permission.article_add, true),
          viewBtn: this.vaildData(this.permission.article_view, true),
          delBtn: this.vaildData(this.permission.article_delete, true),
          editBtn: this.vaildData(this.permission.article_edit, true),
        }
      },
      ids() {
        let ids = []
        this.selectionList.forEach((ele) => {
          ids.push(ele.id)
        })
        return ids.join(",")
      },
      showStatus() {
        return (data, type) => {
          if (data == 0) {
            return {
              text: type == 1 ? '未发布' : '关闭',
              type: 'info'
            }
          } else if (data == 1) {
            return {
              text: type == 1 ? '已发布' : '开启',
              type: 'success'
            }
          }
        }
      }
    },
    methods: {
        openEditPopup (row) {
            this.$refs.DeitDiscussion.initData(row)
        },
      openEditPopup(row) {
        this.$refs.DeitDiscussion.initData(row)
      },
        openUserPopup (row) {
            this.$refs.DeitDiscussion.openUser(row)
        },
      openUserPopup(row) {
        this.$refs.DeitDiscussion.openUser(row)
      },
        openDilog (row, type) {
            var that = this
            this.$nextTick(() => {
                that.$refs.discussionManageChild.init(row)
            })
        },
      openDilog(row, type) {
        var that = this
        this.$nextTick(() => {
          that.$refs.discussionManageChild.init(row)
        })
      },
        rowSave (row, done, loading) {
            if (row.videoUrl.length == 0) {
                row.videoUrl = ""
            }
            row.userid = this.userInfo.user_id
            row.articleRange = JSON.stringify(row.articleList)
            if (row.url.length > 0) {
                var urls = []
                var split = row.url.split(",")
                split.forEach(url => {
                    var names = url.split("jczz/")
                    urls.push(names[1])
                })
                row.url = urls.join(",")
            }
            // 类型  0:文章 1经营性收支,2:物业招标 3:公益报名 4:选举调查
            row.type = 4
            row.publish = 1
            add(row).then(
                () => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    done()
                },
                (error) => {
                    window.console.log(error)
                    loading()
                }
            )
        },
        rowUpdate (row, index, done, loading) {
            row.articleRange = JSON.stringify(row.articleList)
            if (row.url.length > 0) {
                var urls = []
                var split = row.url.split(",")
                split.forEach(url => {
                    var names = url.split("jczz/")
                    urls.push(names[1])
                })
                row.url = urls.join(",")
            }
            update(row).then(
                () => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    done()
                },
                (error) => {
                    window.console.log(error)
                    loading()
                }
            )
        },
        rowDel (row) {
            this.$confirm("确定将选择数据删除?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning",
            })
                .then(() => {
                    return remove(row.id)
                })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                })
        },
        searchReset () {
            this.query = {}
            this.onLoad(this.page)
        },
        searchChange (params, done) {
            this.query = params
            this.page.currentPage = 1
            this.onLoad(this.page, params)
            done()
        },
        selectionChange (list) {
            this.selectionList = list
        },
        selectionClear () {
            this.selectionList = []
            this.$refs.crud.toggleSelection()
        },
        handleDelete () {
            if (this.selectionList.length === 0) {
                this.$message.warning("请选择至少一条数据")
                return
            }
            this.$confirm("确定将选择数据删除?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning",
            })
                .then(() => {
                    return remove(this.ids)
                })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    this.$refs.crud.toggleSelection()
                })
        },
        beforeOpen (done, type) {
            if (["edit", "view"].includes(type)) {
                getNotice(this.form.id).then((res) => {
                    let data = res.data.data
                    // data.forEach(item=>{
                    if (data.url.length > 0) {
                        var urls = []
                        var names = data.url.split(",")
                        names.forEach(name => {
                            urls.push(website.minioUrl + name)
                        })
                        data.url = urls.join(",")
                    }
                    // })
                    this.form = {
                        ...data,
                        articleList: JSON.parse(data.articleRange)
                    }
                })
            }
            // con
            done()
        },
        currentChange (currentPage) {
            this.page.currentPage = currentPage
        },
        sizeChange (pageSize) {
            this.page.pageSize = pageSize
        },
        refreshChange () {
            this.onLoad(this.page, this.query)
        },
        onLoad (page, params = {}) {
            const {
                dateTime
            } = this.query
            let values = {
                ...params,
            }
            if (dateTime) {
                values = {
                    ...params,
                    startTime: dateTime[0],
                    endTime: dateTime[1],
                    ...this.query,
                }
                values.dateTime = null
            }
            values.type = 4
            this.loading = true
            console.log(values)
            getList(page.currentPage, page.pageSize, values).then((res) => {
                const data = res.data.data
                this.page.total = data.total
                this.data = data.records
                this.data.forEach(item => {
                    if (item.url.length > 0) {
                        var urls = []
                        var names = item.url.split(",")
                        names.forEach(name => {
                            urls.push(website.minioUrl + name)
                        })
                        item.url = urls.join(",")
                    }
                })
                this.loading = false
                this.selectionClear()
            })
            getDistrictTree(params = {}).then((res) => {
                const data = res.data.data
                this.districtTree = data
                const column = this.findObject(this.option.column, "articleList")
                column.dicData = res.data.data
                this.loading = false
            })
        },
        updateFb (row) {
            if (row.publish == "0") {
                row.publish = "1"
            } else {
                row.publish = "0"
            }
            if (row.url.length > 0) {
                var urls = []
                var split = row.url.split(",")
                split.forEach(url => {
                    var names = url.split("jczz/")
                    urls.push(names[1])
                })
                row.url = urls.join(",")
            }
            update(row).then(
                () => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    done()
                },
                (error) => {
                    window.console.log(error)
                    loading()
                }
            )
        },
        kqcomment () {
            if (this.selectionList.length === 0) {
                this.$message.warning("请选择至少一条数据")
                return
            }
            this.$confirm("确定将选择数据开启评论?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning",
            }).then(() => {
                return upcomment(this.ids, "1")
            })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    this.$refs.crud.toggleSelection()
                })
        },
        gbcomment () {
            if (this.selectionList.length === 0) {
                this.$message.warning("请选择至少一条数据")
                return
            }
            this.$confirm("确定将选择数据开启评论?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning",
            }).then(() => {
                return upcomment(this.ids, "0")
            })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    this.$refs.crud.toggleSelection()
                })
      rowSave(row, done, loading) {
        if (row.videoUrl.length == 0) {
          row.videoUrl = ""
        }
        row.userid = this.userInfo.user_id
        row.articleRange = JSON.stringify(row.articleList)
        if (row.url.length > 0) {
          var urls = []
          var split = row.url.split(",")
          split.forEach(url => {
            var names = url.split("jczz/")
            urls.push(names[1])
          })
          row.url = urls.join(",")
        }
        // 类型  0:文章 1经营性收支,2:物业招标 3:公益报名 4:选举调查
        row.type = 4
        row.publish = 1
        add(row).then(
          () => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            done()
          },
          (error) => {
            window.console.log(error)
            loading()
          }
        )
      },
      rowUpdate(row, index, done, loading) {
        row.articleRange = JSON.stringify(row.articleList)
        if (row.url.length > 0) {
          var urls = []
          var split = row.url.split(",")
          split.forEach(url => {
            var names = url.split("jczz/")
            urls.push(names[1])
          })
          row.url = urls.join(",")
        }
        update(row).then(
          () => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            done()
          },
          (error) => {
            window.console.log(error)
            loading()
          }
        )
      },
      rowDel(row) {
        this.$confirm("确定将选择数据删除?", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          })
          .then(() => {
            return remove(row.id)
          })
          .then(() => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
          })
      },
      searchReset() {
        this.query = {}
        this.onLoad(this.page)
      },
      searchChange(params, done) {
        this.query = params
        this.page.currentPage = 1
        this.onLoad(this.page, params)
        done()
      },
      selectionChange(list) {
        this.selectionList = list
      },
      selectionClear() {
        this.selectionList = []
        this.$refs.crud.toggleSelection()
      },
      handleDelete() {
        if (this.selectionList.length === 0) {
          this.$message.warning("请选择至少一条数据")
          return
        }
        this.$confirm("确定将选择数据删除?", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          })
          .then(() => {
            return remove(this.ids)
          })
          .then(() => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            this.$refs.crud.toggleSelection()
          })
      },
      beforeOpen(done, type) {
        if (["edit", "view"].includes(type)) {
          getNotice(this.form.id).then((res) => {
            let data = res.data.data
            // data.forEach(item=>{
            if (data.url.length > 0) {
              var urls = []
              var names = data.url.split(",")
              names.forEach(name => {
                urls.push(website.minioUrl + name)
              })
              data.url = urls.join(",")
            }
            // })
            this.form = {
              ...data,
              articleList: JSON.parse(data.articleRange)
            }
          })
        }
        // con
        done()
      },
      currentChange(currentPage) {
        this.page.currentPage = currentPage
      },
      sizeChange(pageSize) {
        this.page.pageSize = pageSize
      },
      refreshChange() {
        this.onLoad(this.page, this.query)
      },
      onLoad(page, params = {}) {
        const {
          dateTime
        } = this.query
        let values = {
          ...params,
        }
        if (dateTime) {
          values = {
            ...params,
            startTime: dateTime[0],
            endTime: dateTime[1],
            ...this.query,
          }
          values.dateTime = null
        }
        values.type = 4
        this.loading = true
        console.log(values)
        getList(page.currentPage, page.pageSize, values).then((res) => {
          const data = res.data.data
          this.page.total = data.total
          this.data = data.records
          this.data.forEach(item => {
            if (item.url.length > 0) {
              var urls = []
              var names = item.url.split(",")
              names.forEach(name => {
                urls.push(website.minioUrl + name)
              })
              item.url = urls.join(",")
            }
          })
          this.loading = false
          this.selectionClear()
        })
        getDistrictTree(params = {}).then((res) => {
          const data = res.data.data
          this.districtTree = data
          const column = this.findObject(this.option.column, "articleList")
          column.dicData = res.data.data
          this.loading = false
        })
      },
      updateFb(row) {
        if (row.publish == "0") {
          row.publish = "1"
        } else {
          row.publish = "0"
        }
        if (row.url.length > 0) {
          var urls = []
          var split = row.url.split(",")
          split.forEach(url => {
            var names = url.split("jczz/")
            urls.push(names[1])
          })
          row.url = urls.join(",")
        }
        update(row).then(
          () => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            done()
          },
          (error) => {
            window.console.log(error)
            loading()
          }
        )
      },
      kqcomment() {
        if (this.selectionList.length === 0) {
          this.$message.warning("请选择至少一条数据")
          return
        }
        this.$confirm("确定将选择数据开启评论?", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          }).then(() => {
            return upcomment(this.ids, "1")
          })
          .then(() => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            this.$refs.crud.toggleSelection()
          })
      },
      gbcomment() {
        if (this.selectionList.length === 0) {
          this.$message.warning("请选择至少一条数据")
          return
        }
        this.$confirm("确定将选择数据开启评论?", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          }).then(() => {
            return upcomment(this.ids, "0")
          })
          .then(() => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            this.$refs.crud.toggleSelection()
          })
      }
    },
}
  }
</script>
<style>
.avue-upload__icon {
  .avue-upload__icon {
    line-height: 6;
}
</style>
  }
</style>
src/views/authority/role.vue
@@ -1,53 +1,27 @@
<template>
  <basic-container>
    <avue-crud :option="option"
               :table-loading="loading"
               :data="data"
               ref="crud"
               v-model="form"
               :permission="permissionList"
               :before-open="beforeOpen"
               @row-del="rowDel"
               @row-update="rowUpdate"
               @row-save="rowSave"
               @search-change="searchChange"
               @search-reset="searchReset"
               @selection-change="selectionChange"
               @current-change="currentChange"
               @size-change="sizeChange"
               @refresh-change="refreshChange"
               @on-load="onLoad">
      <template slot="menuLeft">
        <el-button type="danger"
                   size="small"
                   icon="el-icon-delete"
                   v-if="permission.role_delete"
                   plain
                   @click="handleDelete">删 除
        </el-button>
        <el-button size="small"
                   icon="el-icon-setting"
                   @click="handleRole"
                   v-if="userInfo.role_name.includes('admin')"
                   plain>权限设置
        </el-button>
      </template>
    </avue-crud>
    <el-dialog title="角色权限配置"
               append-to-body
               :visible.sync="box"
               width="345px">
      <el-tabs type="border-card">
        <el-tab-pane label="权限">
          <el-tree :data="menuGrantList"
                   show-checkbox
                   node-key="id"
                   ref="treeMenu"
                   :default-checked-keys="menuTreeObj"
                   :props="props">
          </el-tree>
        </el-tab-pane>
        <!-- <el-tab-pane label="数据权限">
    <basic-container>
        <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
            :permission="permissionList" :before-open="beforeOpen" @row-del="rowDel" @row-update="rowUpdate"
            @row-save="rowSave" @search-change="searchChange" @search-reset="searchReset"
            @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
            @refresh-change="refreshChange" @on-load="onLoad">
            <template slot="menuLeft">
                <el-button type="danger" size="small" icon="el-icon-delete" v-if="permission.role_delete" plain
                    @click="handleDelete">删 除
                </el-button>
                <el-button size="small" icon="el-icon-setting" @click="handleRole"
                    v-if="userInfo.role_name.includes('admin')" plain>权限设置
                </el-button>
            </template>
        </avue-crud>
        <el-dialog title="角色权限配置" append-to-body :visible.sync="box" width="345px">
            <el-tabs type="border-card">
                <el-tab-pane label="权限">
                    <el-tree :data="menuGrantList" show-checkbox node-key="id" ref="treeMenu"
                        :default-checked-keys="menuTreeObj" :props="props">
                    </el-tree>
                </el-tab-pane>
                <!-- <el-tab-pane label="数据权限">
          <el-tree :data="dataScopeGrantList"
                   show-checkbox
                   node-key="id"
@@ -65,316 +39,317 @@
                   :props="props">
          </el-tree>
        </el-tab-pane> -->
      </el-tabs>
            </el-tabs>
      <span slot="footer"
            class="dialog-footer">
        <el-button @click="box = false">取 消</el-button>
        <el-button type="primary"
                   @click="submit">确 定</el-button>
      </span>
    </el-dialog>
  </basic-container>
            <span slot="footer" class="dialog-footer">
                <el-button @click="box = false">取 消</el-button>
                <el-button type="primary" @click="submit">确 定</el-button>
            </span>
        </el-dialog>
    </basic-container>
</template>
<script>
  import {add, getList, getRoleList, getRole, getRoleTreeById, grant, grantTree, remove, update} from "@/api/system/role";
  import {mapGetters} from "vuex";
  import website from '@/config/website';
import { add, getList, getRoleList, getRole, getRoleTreeById, grant, grantTree, remove, update } from "@/api/system/role"
import { mapGetters } from "vuex"
import website from '@/config/website'
  export default {
    data() {
      return {
        form: {},
        box: false,
        props: {
          label: "title",
          value: "key"
        },
        menuGrantList: [],
        dataScopeGrantList: [],
        apiScopeGrantList: [],
        apiGrantList: [],
        menuTreeObj: [],
        dataScopeTreeObj: [],
        apiScopeTreeObj: [],
        selectionList: [],
        query: {},
        loading: true,
        page: {
          pageSize: 10,
          currentPage: 1,
          total: 0
        },
        option: {
          tip: false,
          simplePage: true,
          searchShow: true,
          searchMenuSpan: 6,
          tree: true,
          border: true,
          index: true,
          selection: true,
          viewBtn: true,
          dialogWidth: 900,
          dialogClickModal: false,
          column: [
            {
              label: "角色名称",
              prop: "roleName",
              search: true,
              span: 24,
              rules: [
                {
                  required: true,
                  message: "请输入角色名称",
                  trigger: "blur"
                }
              ]
export default {
    data () {
        return {
            form: {},
            box: false,
            props: {
                label: "title",
                value: "key"
            },
            // {
            //   label: "所属租户",
            //   prop: "tenantId",
            //   type: "tree",
            //   dicUrl: "/api/blade-system/tenant/select",
            //   addDisplay: false,
            //   editDisplay: false,
            //   viewDisplay: website.tenantMode,
            //   span: 24,
            //   props: {
            //     label: "tenantName",
            //     value: "tenantId"
            //   },
            //   hide: !website.tenantMode,
            //   search: website.tenantMode,
            //   rules: [{
            //     required: true,
            //     message: "请输入所属租户",
            //     trigger: "click"
            //   }]
            // },
            {
              label: "角色别名",
              prop: "roleAlias",
              search: true,
              span: 24,
              rules: [
                {
                  required: true,
                  message: "请输入角色别名",
                  trigger: "blur"
                }
              ]
            menuGrantList: [],
            dataScopeGrantList: [],
            apiScopeGrantList: [],
            apiGrantList: [],
            menuTreeObj: [],
            dataScopeTreeObj: [],
            apiScopeTreeObj: [],
            selectionList: [],
            query: {},
            loading: true,
            page: {
                pageSize: 10,
                currentPage: 1,
                total: 0
            },
            {
              label: "上级角色",
              prop: "parentId",
              dicData: [],
              type: "tree",
              hide: true,
              span: 24,
              props: {
                label: "title"
              },
              rules: [
                {
                  required: false,
                  message: "请选择上级角色",
                  trigger: "click"
                }
              ]
            option: {
                lazy: true,
                tip: false,
                simplePage: true,
                searchShow: true,
                searchMenuSpan: 6,
                tree: true,
                border: true,
                index: true,
                selection: true,
                viewBtn: true,
                dialogWidth: 900,
                dialogClickModal: false,
                column: [
                    {
                        label: "角色名称",
                        prop: "roleName",
                        search: true,
                        span: 24,
                        rules: [
                            {
                                required: true,
                                message: "请输入角色名称",
                                trigger: "blur"
                            }
                        ]
                    },
                    // {
                    //   label: "所属租户",
                    //   prop: "tenantId",
                    //   type: "tree",
                    //   dicUrl: "/api/blade-system/tenant/select",
                    //   addDisplay: false,
                    //   editDisplay: false,
                    //   viewDisplay: website.tenantMode,
                    //   span: 24,
                    //   props: {
                    //     label: "tenantName",
                    //     value: "tenantId"
                    //   },
                    //   hide: !website.tenantMode,
                    //   search: website.tenantMode,
                    //   rules: [{
                    //     required: true,
                    //     message: "请输入所属租户",
                    //     trigger: "click"
                    //   }]
                    // },
                    {
                        label: "角色别名",
                        prop: "roleAlias",
                        search: true,
                        span: 24,
                        rules: [
                            {
                                required: true,
                                message: "请输入角色别名",
                                trigger: "blur"
                            }
                        ]
                    },
                    {
                        label: "上级角色",
                        prop: "parentId",
                        type: "tree",
                        dicData: [],
                        addDisabled: false,
                        hide: true,
                        span: 24,
                        props: {
                            label: "title",
                            value: 'id'
                        },
                        rules: [
                            {
                                required: false,
                                message: "请选择上级角色",
                                trigger: "click"
                            }
                        ]
                    },
                    {
                        label: "角色排序",
                        prop: "sort",
                        type: "number",
                        span: 24,
                        rules: [
                            {
                                required: true,
                                message: "请输入角色排序",
                                trigger: "blur"
                            }
                        ]
                    }
                ]
            },
            {
              label: "角色排序",
              prop: "sort",
              type: "number",
              span: 24,
              rules: [
                {
                  required: true,
                  message: "请输入角色排序",
                  trigger: "blur"
                }
              ]
            }
          ]
        },
        data: []
      };
            data: []
        }
    },
    computed: {
      ...mapGetters(["userInfo", "permission"]),
      permissionList() {
        return {
          addBtn: this.vaildData(this.permission.role_add, false),
          viewBtn: this.vaildData(this.permission.role_view, false),
          delBtn: this.vaildData(this.permission.role_delete, false),
          editBtn: this.vaildData(this.permission.role_edit, false)
        };
      },
      ids() {
        let ids = [];
        this.selectionList.forEach(ele => {
          ids.push(ele.id);
        ...mapGetters(["userInfo", "permission"]),
        permissionList () {
            return {
                addBtn: this.vaildData(this.permission.role_add, false),
                viewBtn: this.vaildData(this.permission.role_view, false),
                delBtn: this.vaildData(this.permission.role_delete, false),
                editBtn: this.vaildData(this.permission.role_edit, false)
            }
        },
        ids () {
            let ids = []
            this.selectionList.forEach(ele => {
                ids.push(ele.id)
        });
        return ids.join(",");
      },
      idsArray() {
        let ids = [];
        this.selectionList.forEach(ele => {
          ids.push(ele.id);
        });
        return ids;
      }
            })
            return ids.join(",")
        },
        idsArray () {
            let ids = []
            this.selectionList.forEach(ele => {
                ids.push(ele.id)
            })
            return ids
        }
    },
    methods: {
      initData(roleId){
        getRoleTreeById(roleId).then(res => {
          const column = this.findObject(this.option.column, "parentId");
          column.dicData = res.data.data;
        });
      },
      submit() {
        const menuList = this.$refs.treeMenu.getCheckedKeys();
        const dataScopeList = [];
        const apiScopeList = [];
        grant(this.idsArray, menuList, dataScopeList, apiScopeList).then(() => {
          this.box = false;
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          this.onLoad(this.page);
        });
      },
      rowSave(row, done, loading) {
        add(row).then(() => {
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          done();
        }, error => {
          window.console.log(error);
          loading();
        });
      },
      rowUpdate(row, index, done, loading) {
        update(row).then(() => {
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          done();
        }, error => {
          window.console.log(error);
          loading();
        });
      },
      rowDel(row) {
        this.$confirm("确定将选择数据删除?", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        })
          .then(() => {
            return remove(row.id);
          })
          .then(() => {
            this.onLoad(this.page);
            this.$message({
              type: "success",
              message: "操作成功!"
            });
          });
      },
        initData (roleId) {
            getRoleTreeById(roleId).then(res => {
                const column = this.findObject(this.option.column, "parentId")
                column.dicData = res.data.data
            })
        },
        submit () {
            const menuList = this.$refs.treeMenu.getCheckedKeys()
            const dataScopeList = []
            const apiScopeList = []
            grant(this.idsArray, menuList, dataScopeList, apiScopeList).then(() => {
                this.box = false
                this.$message({
                    type: "success",
                    message: "操作成功!"
                })
                this.onLoad(this.page)
            })
        },
        rowSave (row, done, loading) {
            add(row).then(() => {
                this.onLoad(this.page)
                this.$message({
                    type: "success",
                    message: "操作成功!"
                })
                done()
            }, error => {
                window.console.log(error)
                loading()
            })
        },
        rowUpdate (row, index, done, loading) {
            update(row).then(() => {
                this.onLoad(this.page)
                this.$message({
                    type: "success",
                    message: "操作成功!"
                })
                done()
            }, error => {
                window.console.log(error)
                loading()
            })
        },
        rowDel (row) {
            this.$confirm("确定将选择数据删除?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning"
            })
                .then(() => {
                    return remove(row.id)
                })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!"
                    })
                })
        },
      searchReset() {
        this.query = {};
        this.onLoad(this.page);
      },
      searchChange(params, done) {
        this.query = params;
        this.page.currentPage = 1;
        this.onLoad(this.page, params);
        done();
      },
      selectionChange(list) {
        this.selectionList = list;
      },
      selectionClear() {
        this.selectionList = [];
        this.$refs.crud.toggleSelection();
      },
      beforeOpen(done, type) {
        if (["add", "edit"].includes(type)) {
          this.initData(this.form.id);
        searchReset () {
            this.query = {}
            this.onLoad(this.page)
        },
        searchChange (params, done) {
            this.query = params
            this.page.currentPage = 1
            this.onLoad(this.page, params)
            done()
        },
        selectionChange (list) {
            this.selectionList = list
        },
        selectionClear () {
            this.selectionList = []
            this.$refs.crud.toggleSelection()
        },
        beforeOpen (done, type) {
            if (["add", "edit"].includes(type)) {
                this.initData(this.form.id)
            }
            done()
        },
        handleRole () {
            if (this.selectionList.length !== 1) {
                this.$message.warning("只能选择一条数据")
                return
            }
            this.menuTreeObj = []
            this.dataScopeTreeObj = []
            this.apiScopeTreeObj = []
            grantTree()
                .then(res => {
                    this.menuGrantList = res.data.data.menu
                    // this.dataScopeGrantList = res.data.data.dataScope;
                    // this.apiScopeGrantList = res.data.data.apiScope;
                    getRole(this.ids).then(res => {
                        this.menuTreeObj = res.data.data.menu
                        // this.dataScopeTreeObj = res.data.data.dataScope;
                        // this.apiScopeTreeObj = res.data.data.apiScope;
                        this.box = true
                    })
                })
        },
        handleDelete () {
            if (this.selectionList.length === 0) {
                this.$message.warning("请选择至少一条数据")
                return
            }
            this.$confirm("确定将选择数据删除?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning"
            })
                .then(() => {
                    return remove(this.ids)
                })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!"
                    })
                    this.$refs.crud.toggleSelection()
                })
        },
        currentChange (currentPage) {
            this.page.currentPage = currentPage
        },
        sizeChange (pageSize) {
            this.page.pageSize = pageSize
        },
        refreshChange () {
            this.onLoad(this.page, this.query)
        },
        onLoad (page, params = {}) {
            this.loading = true
            getRoleList(Object.assign(params, this.query)).then(res => {
                this.data = res.data.data
                this.loading = false
                this.selectionClear()
            })
        }
        done();
      },
      handleRole() {
        if (this.selectionList.length !== 1) {
          this.$message.warning("只能选择一条数据");
          return;
        }
        this.menuTreeObj = [];
        this.dataScopeTreeObj = [];
        this.apiScopeTreeObj = [];
        grantTree()
          .then(res => {
            this.menuGrantList = res.data.data.menu;
            // this.dataScopeGrantList = res.data.data.dataScope;
            // this.apiScopeGrantList = res.data.data.apiScope;
            getRole(this.ids).then(res => {
              this.menuTreeObj = res.data.data.menu;
              // this.dataScopeTreeObj = res.data.data.dataScope;
              // this.apiScopeTreeObj = res.data.data.apiScope;
              this.box = true;
            });
          });
      },
      handleDelete() {
        if (this.selectionList.length === 0) {
          this.$message.warning("请选择至少一条数据");
          return;
        }
        this.$confirm("确定将选择数据删除?", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        })
          .then(() => {
            return remove(this.ids);
          })
          .then(() => {
            this.onLoad(this.page);
            this.$message({
              type: "success",
              message: "操作成功!"
            });
            this.$refs.crud.toggleSelection();
          });
      },
      currentChange(currentPage) {
        this.page.currentPage = currentPage;
      },
      sizeChange(pageSize) {
        this.page.pageSize = pageSize;
      },
      refreshChange() {
        this.onLoad(this.page, this.query);
      },
      onLoad(page, params = {}) {
        this.loading = true;
        getRoleList(Object.assign(params, this.query)).then(res => {
          this.data = res.data.data;
          this.loading = false;
          this.selectionClear();
        });
      }
    }
  };
}
</script>
src/views/cGovernance/reportForRepairs.vue
New file
@@ -0,0 +1,899 @@
<!--
 * @Author: shuishen 1109946754@qq.com
 * @Date: 2023-12-14 17:10:00
 * @LastEditors: shuishen 1109946754@qq.com
 * @LastEditTime: 2024-01-09 18:59:37
 * @FilePath: \jczz_web\src\views\task\reportForRepairs.vue
 * @Description:
 *
 * Copyright (c) 2023 by shuishen, All Rights Reserved.
-->
<!-- 走访日志 -->
<template>
    <basic-container>
        <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" ref="crud" @row-del="rowDel"
            v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave"
            :before-open="beforeOpen" @search-change="searchChange" @search-reset="searchReset"
            @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
            @refresh-change="refreshChange" @on-load="onLoad">
            <template slot="confirmFlag" slot-scope="{row, size}">
                <el-tag :size="size" :type="showConfirmFlag(row.confirmFlag).type">
                    {{ showConfirmFlag(row.confirmFlag).text }}
                </el-tag>
            </template>
            <template slot="expand" slot-scope="{row, size}">
                <el-timeline>
                    <el-timeline-item v-for="(item, index) in timeLineData(row)" :key="index" :timestamp="item.createTime"
                        :icon="item.icon" :color="item.color" :hide-timestamp="item.contentType == 3" placement="top">
                        <el-card v-show="item.contentType == 1" :body-style="{ padding: '10px', background: '#f8f8f8' }">
                            <div>
                                评价:{{ item.content }}
                            </div>
                            <el-rate v-model="item.point" disabled :colors="colors">
                            </el-rate>
                        </el-card>
                        <el-card v-show="item.peopleType != 1 && item.contentType == 0"
                            :body-style="{ padding: '10px', background: '#f8f8f8' }">
                            <div>
                                {{ item.name }} {{ item.mobile }}
                            </div>
                            <div>
                                {{ item.content }}
                            </div>
                            <div v-show="item.imageList != '' && item.imageList != null">
                                <el-image style="width: 100px; height: 100px" :src="showCurImage(item.imageList)"
                                    :preview-src-list="showImageListData(item.imageList)">
                                </el-image>
                            </div>
                        </el-card>
                        <el-card v-show="item.peopleType == 1 && item.contentType == 0"
                            :body-style="{ padding: '10px', background: '#f8f8f8' }">
                            <span style="color: rgb(204, 204, 204);">系统:{{ item.content || '959999' }}</span>
                        </el-card>
                        <span v-show="item.contentType == 3">结束</span>
                    </el-timeline-item>
                    <!-- <el-timeline-item timestamp="2018/4/12" placement="top">
                        <el-card>
                            <h4>更新 Github 模板</h4>
                            <p>王小虎 提交于 2018/4/12 20:46</p>
                        </el-card>
                    </el-timeline-item> -->
                </el-timeline>
            </template>
            <template slot-scope="{row, size, index}" slot="menu">
                <el-button :size="size" v-if="permission.report_for_repairs_details" type="text"
                    icon="el-icon-document-remove" @click="rowExpansion(row)">
                    详情
                </el-button>
                <el-button :size="size" v-if="permission.report_for_repairs_reply" type="text"
                    icon="el-icon-chat-dot-square" :disabled="row.confirmFlag === 3" @click="replyBtnClick(row)">
                    回复
                </el-button>
                <el-button :size="size" v-if="permission.report_for_repairs_turn_over" type="text"
                    icon="el-icon-document-copy" :disabled="row.confirmFlag === 3" @click="turnOverBtnClick(row)">
                    移交
                </el-button>
                <el-button :size="size" v-if="permission.report_for_repairs_del" type="text" icon="el-icon-delete"
                    @click="rowDel(row)">
                    删除
                </el-button>
            </template>
            <template slot="menuLeft">
                <el-button size="small" icon="el-icon-delete" plain v-if="permission.article_delete" @click="handleDelete">删
                    除
                </el-button>
            </template>
        </avue-crud>
        <el-dialog title="回复" append-to-body :visible.sync="replyPopup" center @close="popupClose">
            <avue-form ref="replyForm" :option="replyOption" v-model="replyForm" @submit="handleSubmit"
                @reset-change="handleReset">
                <template slot-scope="{row}" slot="videoList">
                    <el-upload class="video-uploader" action="/api/blade-resource/oss/endpoint/put-file"
                        :file-list="fileList" :headers="updateHeader" :show-file-list="true" :limit="1" :on-change="getFile"
                        :on-exceed="handleExceed" :on-success="uploadVideoProcess" :before-upload="beforeUploadVideo"
                        :before-remove="beforeRemove">
                        <el-button size="small" type="primary">点击上传</el-button>
                        <div slot="tip" class="el-upload__tip">上传视频只能是 mp4 格式,且大小不能超过 50MB</div>
                    </el-upload>
                </template>
            </avue-form>
        </el-dialog>
        <el-dialog title="转交" class="turn-over-popup" append-to-body :visible.sync="turnOverPopup" center
            @close="popupClose">
            <avue-form ref="turnOverForm" :option="turnOverOption" v-model="turnOverForm" @submit="turnOverHandleSubmit"
                @reset-change="turnOverHandleReset"></avue-form>
        </el-dialog>
    </basic-container>
</template>
<script>
import {
    getList,
    remove,
    update,
    add,
    getReportForRepairs,
    saveReply
} from "@/api/task/reportForRepairs"
import {
    mapGetters
} from "vuex"
import website from '@/config/website'
import {
    Base64
} from 'js-base64'
import {
    getToken
} from '@/util/auth'
export default {
    data () {
        let validatorPhone = function (rule, value, callback) {
            if (value) {
                if (!/^1[3456789]\d{9}$/.test(value)) {
                    callback(new Error('手机号格式有误!'))
                } else {
                    callback()
                }
            }
            callback()
        }
        return {
            colors: ['#99A9BF', '#F7BA2A', '#FF9900'],
            form: {},
            query: {},
            loading: true,
            page: {
                pageSize: 10,
                currentPage: 1,
                total: 0,
            },
            datetime: "",
            selectionList: [],
            option: {
                labelWidth: 96,
                searchLabelWidth: 96,
                searchShow: true,
                searchMenuSpan: 3,
                menuWidth: 280,
                viewBtn: false,
                editBtn: false,
                delBtn: false,
                index: false,
                selection: false,
                expand: true,
                height: "auto",
                calcHeight: 54,
                dialogWidth: 950,
                tip: false,
                border: true,
                //stripe:true,
                // excelBtn: true,
                dialogClickModal: false,
                column: [
                    {
                        width: 100,
                        label: "类型",
                        prop: "type",
                        span: 12,
                        searchLabelWidth: 66,
                        searchSpan: 4,
                        search: true,
                        dataType: "number",
                        type: "select",
                        dicUrl: "/api/blade-system/dict-biz/dictionary?code=reportForRepairsType",
                        props: {
                            label: "dictValue",
                            value: "dictKey",
                        },
                    },
                    {
                        width: 110,
                        label: "姓名",
                        prop: "realName",
                        span: 12,
                        searchSpan: 4,
                        searchLabelWidth: 66,
                        search: true,
                    },
                    {
                        width: 120,
                        label: "手机号码",
                        prop: "phone",
                        search: true,
                        searchSpan: 4,
                        slot: true,
                        rules: [{
                            validator: validatorPhone,
                            trigger: 'blur'
                        }],
                    },
                    {
                        width: 110,
                        label: "图片",
                        prop: "imageUrls",
                        type: "upload",
                        listType: "picture-card",
                        dataType: "string",
                        multiple: true,
                        action: "/api/blade-resource/oss/endpoint/put-file",
                        propsHttp: {
                            res: "data",
                            name: 'name',
                            url: "link",
                        },
                        span: 24,
                    },
                    {
                        overHidden: true,
                        label: "地点",
                        prop: "addressName",
                    },
                    {
                        width: 100,
                        label: "状态",
                        addDisplay: false,
                        editDisplay: false,
                        slot: true,
                        prop: "confirmFlag",
                        overHidden: true
                    },
                    {
                        width: 144,
                        label: "上报时间",
                        prop: "createTime",
                        addDisplay: false,
                        editDisplay: false,
                        type: "date",
                        format: "yyyy-MM-dd HH:mm:ss",
                        valueFormat: "yyyy-MM-dd HH:mm:ss",
                    },
                    {
                        width: 144,
                        label: "处理时间",
                        prop: "confirmTime",
                        addDisplay: false,
                        editDisplay: false,
                        type: "date",
                        format: "yyyy-MM-dd HH:mm:ss",
                        valueFormat: "yyyy-MM-dd HH:mm:ss",
                    },
                    {
                        label: "描述",
                        prop: "remark",
                        type: "textarea",
                        hide: true,
                        span: 24,
                    }
                ],
            },
            data: [],
            replyPopup: false,
            replyForm: {},
            replyOption: {
                submitBtn: true,
                submitText: '确定',
                emptyBtn: true,
                emptyText: '取消',
                column: [{
                    span: 24,
                    label: "说明",
                    prop: "content",
                    type: 'textarea',
                    minRows: 3,
                    maxRows: 5,
                    rules: [{
                        required: true,
                        message: "请输入说明",
                        trigger: "blur",
                    }],
                },
                {
                    label: '处理状态',
                    prop: 'confirmFlag',
                    type: 'select',
                    dicData: [{
                        label: '待处理',
                        value: 1
                    }, {
                        label: '处理中',
                        value: 2
                    }, {
                        label: '已处理',
                        value: 3
                    }],
                    rules: [{
                        required: true,
                        message: "请选择处理状态",
                        trigger: "blur",
                    }],
                },
                {
                    width: 110,
                    fileType: 'img',
                    label: "图片",
                    prop: "imageList",
                    type: "upload",
                    listType: "picture-card",
                    dataType: "string",
                    multiple: true,
                    action: "/api/blade-resource/oss/endpoint/put-file",
                    propsHttp: {
                        res: "data",
                        name: 'name',
                        url: "link",
                    },
                    span: 24,
                },
                {
                    slot: true,
                    label: "视频",
                    prop: "videoList",
                    span: 24,
                }
                ]
            },
            turnOverPopup: false,
            turnOverForm: {},
            turnOverOption: {
                submitBtn: true,
                submitText: '确定',
                emptyBtn: true,
                emptyText: '取消',
                column: [
                    // {
                    //     hide: true,
                    //     span: 14,
                    //     label: "地址",
                    //     prop: "addressCode",
                    // },
                    {
                        span: 24,
                        label: "人员类型",
                        prop: "peopleType",
                        type: 'select',
                        dicData: [{
                            label: '网格员',
                            value: 0
                        }, {
                            label: '物业公司人员',
                            value: 2
                        }],
                        cascader: ["transferUserId"],
                        rules: [{
                            required: true,
                            message: "请选择人员类型",
                            trigger: "blur",
                        }],
                    },
                    {
                        span: 24,
                        label: "指定人员",
                        prop: "transferUserId",
                        type: 'select',
                        dicUrl: `/api/blade-system/user/getUserInfoByCode?houseCode={{addressCode}}&type={{peopleType}}`,
                        props: {
                            label: "name",
                            value: "id",
                        },
                        change: ({
                            value,
                            column,
                            item,
                            dic
                        }) => {
                            this.curPeopleDetails = {}
                            if (value) {
                                this.curPeopleDetails = item
                            }
                        },
                        rules: [{
                            required: true,
                            message: "请选择指定人员",
                            trigger: "blur",
                        }],
                    },
                ]
            },
            curRow: {},
            fileList: [],
            updateHeader: {
                Authorization: `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`,
                'Blade-Auth': getToken()
            },
            curPeopleDetails: {},
            videoFlag: false,
            videoUploadPercent: ''
        }
    },
    watch: {},
    computed: {
        ...mapGetters(["permission", "userInfo"]),
        permissionList () {
            return {
                addBtn: this.vaildData(this.permission.reportForRepairs_add, true),
                viewBtn: this.vaildData(this.permission.reportForRepairs_view, true),
                delBtn: this.vaildData(this.permission.reportForRepairs_delete, true),
                editBtn: this.vaildData(this.permission.reportForRepairs_edit, true),
            }
        },
        ids () {
            let ids = []
            this.selectionList.forEach((ele) => {
                ids.push(ele.id)
            })
            return ids.join(",")
        },
        timeLineData () {
            return (row) => {
                let imageList = row.imageUrls
                if (row.taskRepairAppraiseList.length) {
                    return [{
                        createTime: row.createTime,
                        mobile: row.phone,
                        name: row.realName,
                        imageList,
                        content: row.remark,
                        color: '#1890ff',
                        contentType: 0,
                    },
                    ...row.taskRepairStepList.map((item, index) => {
                        if (index == 0) {
                            return {
                                ...item,
                                contentType: 0,
                            }
                        }
                        return {
                            ...item,
                            contentType: 0
                        }
                    }),
                    ...row.taskRepairAppraiseList.map(item => {
                        return {
                            ...item,
                            contentType: 1
                        }
                    }),
                    {
                        contentType: 3,
                        createTime: '',
                        icon: 'el-icon-check',
                        color: '#0bbd87'
                    }
                    ]
                } else {
                    return [{
                        createTime: row.createTime,
                        mobile: row.phone,
                        name: row.realName,
                        imageList,
                        content: row.remark,
                        color: '#1890ff',
                        contentType: 0,
                    },
                    ...row.taskRepairStepList.map((item, index) => {
                        if (index == 0) {
                            return {
                                ...item,
                                contentType: 0,
                            }
                        }
                        return {
                            ...item,
                            contentType: 0
                        }
                    })
                    ]
                }
            }
        },
        showCurImage () {
            return (data) => {
                if (data != null && data.length > 0) {
                    return data.split(',').filter(item => item != '')[0]
                }
                return ''
            }
        },
        showImageListData () {
            return (data) => {
                if (data != null && data.length > 0) {
                    return data.split(',').filter(item => item != '')
                }
                return []
            }
        },
        showConfirmFlag () {
            return (data) => {
                let tags = {}
                if (data == 1) {
                    tags = {
                        type: 'warning',
                        text: '待处理'
                    }
                } else if (data == 2) {
                    tags = {
                        type: '',
                        text: '处理中'
                    }
                } else if (data == 3) {
                    tags = {
                        type: 'success',
                        text: '已处理'
                    }
                } else if (data == 4) {
                    tags = {
                        type: 'success',
                        text: '已评价'
                    }
                }
                return tags
            }
        }
    },
    methods: {
        rowExpansion (row) {
            this.$refs.crud.toggleRowExpansion(row)
        },
        popupClose () {
            this.$refs.replyForm && this.$refs.replyForm.resetForm()
            this.$refs.turnOverForm && this.$refs.turnOverForm.resetForm()
        },
        saveReply (data, done) {
            saveReply(data).then(
                () => {
                    this.replyPopup = false
                    this.turnOverPopup = false
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    done()
                },
                (error) => {
                    window.console.log(error)
                }
            )
        },
        handleSubmit (form, done) {
            if (form.imageList.length > 0) {
                var urls = []
                var split = form.imageList.split(",").filter(item => item != '')
                split.forEach(url => {
                    var names = url.split("jczz/")
                    urls.push(names[1])
                })
                form.imageList = urls.join(",")
            }
            // if (form.imageList.length > 0) {
            //   var urls = []
            //   var split = form.imageList.split(",").filter(item => item != '')
            //   split.forEach(url => {
            //     var names = url.split("jczz/")
            //     urls.push(names[1])
            //   })
            //   form.imageList = urls.join(",")
            // }
            this.saveReply({
                ...form,
                videoList: this.fileList.map(item => item.response.data.link).join(','),
                repairId: this.curRow.id,
                peopleType: 0,
                mobile: this.userInfo.phone
            }, done)
        },
        handleReset () {
            this.fileList = []
            this.replyPopup = false
        },
        turnOverHandleSubmit (form, done) {
            let content = ''
            if (form.peopleType == 0) {
                content = `事件已移交至 网格员 ${this.curPeopleDetails.name}`
            } else if (form.peopleType == 2) {
                content = `事件已移交至 物业公司人员 ${this.curPeopleDetails.distictName || ''}${this.curPeopleDetails.name}`
            }
            this.saveReply({
                ...form,
                confirmFlag: 1,
                content,
                peopleType: 1,
                repairId: this.curRow.id,
            }, done)
        },
        turnOverHandleReset () {
            this.turnOverPopup = false
        },
        //移除
        beforeRemove (file, fileList) {
            return this.$confirm(`确定移除 ${file.name}?`).then(() => {
                this.fileList = fileList
            })
        },
        //上传
        getFile (file, fileList) {
            this.fileList = fileList
        },
        beforeUploadVideo (file) {
            const isLt50M = file.size / 1024 / 1024 < 50
            if (['video/mp4'].indexOf(file.type) == -1) {
                this.$message.error('上传视频只能是 mp4 格式!')
                return false
            }
            if (!isLt50M) {
                this.$message.error('上传视频大小不能超过 50MB!')
                return false
            }
            return true
        },
        handleExceed (files, fileList) {
            this.$message.warning("目前只能上传一个视频文件")
        },
        uploadVideoProcess (event, file, fileList) {
            console.log(event, file, fileList, this.fileList)
        },
        replyBtnClick (row) {
            this.curRow = row
            this.replyForm = {}
            this.replyPopup = true
        },
        turnOverBtnClick (row) {
            this.curRow = row
            this.turnOverForm = {
                addressCode: row.addressCode
            }
            this.turnOverPopup = true
        },
        rowSave (row, done, loading) {
            if (row.imageUrls.length > 0) {
                var urls = []
                var split = row.imageUrls.split(",")
                split.forEach(url => {
                    var names = url.split("jczz/")
                    urls.push(names[1])
                })
                row.imageUrls = urls.join(",")
            }
            add(row).then(
                () => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    done()
                },
                (error) => {
                    window.console.log(error)
                    loading()
                }
            )
        },
        rowUpdate (row, index, done, loading) {
            if (row.imageUrls.length > 0) {
                var urls = []
                var split = row.imageUrls.split(",")
                split.forEach(url => {
                    var names = url.split("jczz/")
                    urls.push(names[1])
                })
                row.imageUrls = urls.join(",")
            }
            update(row).then(
                () => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    done()
                },
                (error) => {
                    window.console.log(error)
                    loading()
                }
            )
        },
        rowDel (row) {
            this.$confirm("确定将选择数据删除?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning",
            })
                .then(() => {
                    return remove(row.id)
                })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                })
        },
        searchReset () {
            this.query = {}
            this.onLoad(this.page)
        },
        searchChange (params, done) {
            this.query = params
            this.page.currentPage = 1
            this.onLoad(this.page, params)
            done()
        },
        selectionChange (list) {
            this.selectionList = list
        },
        selectionClear () {
            this.selectionList = []
            this.$refs.crud.toggleSelection()
        },
        handleDelete () {
            if (this.selectionList.length === 0) {
                this.$message.warning("请选择至少一条数据")
                return
            }
            this.$confirm("确定将选择数据删除?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning",
            })
                .then(() => {
                    return remove(this.ids)
                })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    this.$refs.crud.toggleSelection()
                })
        },
        beforeOpen (done, type) {
            if (["edit", "view"].includes(type)) {
                getReportForRepairs(this.form.id).then((res) => {
                    this.form = res.data.data
                    if (this.form.imageUrls) {
                        if (this.form.imageUrls.length > 0) {
                            var urls = []
                            var names = this.form.imageUrls.split(",")
                            names.forEach(name => {
                                urls.push(website.minioUrl + name)
                            })
                            this.form.imageUrls = urls.join(",")
                        }
                    }
                })
            }
            done()
        },
        currentChange (currentPage) {
            this.page.currentPage = currentPage
        },
        sizeChange (pageSize) {
            this.page.pageSize = pageSize
        },
        refreshChange () {
            this.onLoad(this.page, this.query)
        },
        onLoad (page, params = {}) {
            const {
                dateTime
            } = this.query
            let values = {
                ...params,
            }
            if (dateTime) {
                values = {
                    ...params,
                    startTime: dateTime[0],
                    endTime: dateTime[1],
                    ...this.query,
                }
                values.dateTime = null
            }
            this.loading = true
            getList(page.currentPage, page.pageSize, values).then((res) => {
                const data = res.data.data
                this.page.total = data.total
                this.data = data.records
                this.data.forEach(item => {
                    if (item.imageUrls) {
                        if (item.imageUrls.length > 0) {
                            var urls = []
                            var names = item.imageUrls.split(",")
                            names.forEach(name => {
                                urls.push(website.minioUrl + name)
                            })
                            item.imageUrls = urls.join(",")
                        }
                    }
                    if (item.taskRepairStepList.length > 0) {
                        item.taskRepairStepList.forEach(ee => {
                            if (ee.imageList) {
                                if (ee.imageList.length > 0) {
                                    var urls = []
                                    var names = ee.imageList.split(",")
                                    names.forEach(name => {
                                        urls.push(website.minioUrl + name)
                                    })
                                    ee.imageList = urls.join(",")
                                }
                            }
                        })
                    }
                })
                this.loading = false
                this.selectionClear()
            })
        }
    },
}
</script>
<style>
.avue-upload__icon {
    line-height: 6;
}
</style>
src/views/grid/gridman.vue
@@ -125,9 +125,7 @@
                    {
                        overHidden: true,
                        label: "所属社区",
                        addDisplay: false,
                        editDisplay: false,
                        viewDisplay: false,
                        display: false,
                        prop: "communityName",
                        search: true,
                        searchSpan: 4,
src/views/place/components/baseAllInfo.vue
@@ -147,7 +147,7 @@
                            label: "name",
                            value: "id",
                        },
                        cascader: ["gridId"],
                        cascader: ["gridCode"],
                        rules: [
                            {
                                required: true,
@@ -159,14 +159,14 @@
                    {
                        hide: true,
                        label: "所属网格",
                        prop: "gridId",
                        prop: "gridCode",
                        type: "tree",
                        cell: true,
                        props: {
                            label: "gridName",
                            value: "id",
                            value: "gridCode",
                        },
                        dataType: 'string',
                        // dataType: 'string',
                        dicUrl:
                            "/api/blade-grid/grid/getGridList?communityCode={{neiCode}}",
                        rules: [
@@ -392,9 +392,6 @@
                getPlaceExt({ placeId: newData['id'] }),
            ]).then(that.$axios.spread(function (baseInfo, restInfo) {
                that.form = baseInfo.data.data
                console.log(that.form, 90999)
                // that.$nextTick(() => that.$refs.baseForm.dicInit('cascader'))
                that.form.location = [that.form.lng, that.form.lat, that.form.location].join(',')
@@ -436,13 +433,7 @@
                        planImageUrls
                    }
                }
                // that.$nextTick(() => {
                //     that.$refs.baseForm.dicInit('select')
                // })
            }))
            that.holdOnLoad(this.holdPage)
        },
        locationDispose (data) {
@@ -523,6 +514,7 @@
        },
        holdOnLoad (holdPage, params = {}) {
            if (!this.curRow.id) return
            let values = {
@@ -549,20 +541,27 @@
            this.holdPage.pageSize = pageSize
        },
        dataUpdate () {
            const that = this
            let imageUrls = this.form.imageUrls
            if (imageUrls.length > 0) {
        desposeImage (data) {
            if (data.length > 0) {
                var urls = []
                var split = imageUrls.split(",").filter(item => item != '')
                var split = data.split(",").filter(item => item != '')
                split.forEach(url => {
                    var names = url.split("jczz/")
                    urls.push(names[1])
                })
                imageUrls = urls.join(",")
                data = urls.join(",")
            }
            return data
        },
        dataUpdate () {
            const that = this
            let imageUrls = this.desposeImage(this.form.imageUrls)
            let placeImages = this.desposeImage(this.placeForm.imageUrls)
            let placePlanImageUrls = this.desposeImage(this.placeForm.planImageUrls)
            let label = this.form.label
@@ -582,14 +581,18 @@
                            label,
                            ...this.locationDispose(this.form.location)
                        }),
                        updatePlaceExt(this.placeForm)
                        updatePlaceExt({
                            ...this.placeForm,
                            imageUrls: placeImages,
                            planImageUrls: placePlanImageUrls
                        })
                    ]).then(that.$axios.spread(function () {
                        that.$message({
                            type: "success",
                            message: "操作成功!",
                        })
                        that.closeRowDetails()
                        that.roleBoxClose()
                        that.placeElement.onLoad(that.placeElement.page, that.placeElement.query)
src/views/place/index.vue
@@ -227,7 +227,7 @@
                            label: "name",
                            value: "id",
                        },
                        cascader: ["gridId"],
                        cascader: ["gridCode"],
                        rules: [
                            {
                                required: true,
@@ -256,12 +256,12 @@
                    {
                        hide: true,
                        label: "所属网格",
                        prop: "gridId",
                        prop: "gridCode",
                        type: "tree",
                        cell: true,
                        props: {
                            label: "gridName",
                            value: "id",
                            value: "gridCode",
                        },
                        dicUrl:
                            "/api/blade-grid/grid/getGridList?communityCode={{neiCode}}",
src/views/property/components/propertyEdit.vue
@@ -7,6 +7,7 @@
      <el-tab-pane label="经营信息" name="info2"></el-tab-pane>
      <el-tab-pane label="纳税信息" name="info3"></el-tab-pane>
      <el-tab-pane label="党建信息" name="info4"></el-tab-pane>
      <el-tab-pane label="街道社区" name="info8"></el-tab-pane>
      <el-tab-pane label="企业良好行为" name="info5"></el-tab-pane>
      <el-tab-pane label="项目良好行为" name="info6"></el-tab-pane>
      <el-tab-pane label="违法违规行为惩戒" name="info7"></el-tab-pane>
@@ -30,15 +31,16 @@
        <div v-if="item.choicesType == 0">
          <div v-for="(item1, index1) in item.subjectOptionList" :key="index1">
            <el-radio v-model="item1.ids" :label="item1.id">{{item1.optionName}}-----------{{item1.score}}</el-radio>
            <el-radio v-model="item1.ids" :label="item1.id">{{item1.optionName}}</el-radio>
          </div>
        </div>
        <!-- </el-radio-group> -->
        <div v-if="item.choicesType == 3">
          <!-- <div>{{item1.optionName}}</div> -->
          <div v-for="(item1, index1) in item.subjectOptionList" :key="index1">
          <div v-for="(item1, index1) in item.subjectOptionList" :key="index1" style="display: flex;">
            <div>{{item1.optionName}}:</div>
            <el-input-number v-model="item1.numbers" @change="handleChange" :min="0" :max="25"
              :label="item1.optionName"></el-input-number>
          </div>
@@ -310,4 +312,4 @@
</script>
<style>
</style>
</style>
src/views/property/propertyCapitalApply.vue
@@ -1,507 +1,506 @@
<!-- 物业公司管理 -->
<template>
    <basic-container>
        <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" ref="crud" @row-del="rowDel"
            v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave"
            :before-open="beforeOpen" @search-change="searchChange" @search-reset="searchReset"
            @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
            @refresh-change="refreshChange" @on-load="onLoad">
  <basic-container>
    <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" ref="crud" @row-del="rowDel"
      v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave" :before-open="beforeOpen"
      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
      @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
            <template slot-scope="{ row, size, index }" slot="menu">
                <el-button :size="size" type="text" v-if="row.applyStatus === 4" @click="handleWork(row)">调整申请
                </el-button>
                <el-button :size="size" type="text" @click="goDetail(row)">查看申请
                </el-button>
                <!-- <el-button :size="size" type="text" @click="goDetail(row)">删 除
      <template slot-scope="{ row, size, index }" slot="menu">
        <el-button :size="size" type="text" v-if="row.applyStatus === 4" @click="handleWork(row)">调整申请
        </el-button>
        <el-button :size="size" type="text" @click="goDetail(row)">查看申请
        </el-button>
        <!-- <el-button :size="size" type="text" @click="goDetail(row)">删 除
        </el-button> -->
            </template>
            <!-- <template slot="menuLeft">
      </template>
      <!-- <template slot="menuLeft">
         <el-button size="small" icon="el-icon-delete" plain v-if="permission.propertyCapitalApply_delete"
          @click="handleDelete">删 除
        </el-button>
      </template> -->
            <!-- <template slot="constructionSchemeUrlsType" slot-scope="{file}">
      <!-- <template slot="constructionSchemeUrlsType" slot-scope="{file}">
        <span>{{ file }}</span>
      </template> -->
        </avue-crud>
    </basic-container>
    </avue-crud>
  </basic-container>
</template>
<script>
import {
  import {
    getList,
    remove,
    update,
    add,
    getPropertyCapitalApply
} from "@/api/property/propertyCapitalApply"
import {
  } from "@/api/property/propertyCapitalApply"
  import {
    mapGetters
} from "vuex"
import website from '@/config/website'
import func from "@/util/func"
export default {
    data () {
        return {
            form: {
                // constructionSchemeUrls:[]
            },
            query: {},
            loading: true,
            page: {
                pageSize: 10,
                currentPage: 1,
                total: 0,
            },
            datetime: "",
            selectionList: [],
            option: {
                labelWidth: 154,
                searchLabelWidth: 96,
                searchShow: true,
                searchMenuSpan: 3,
                menuWidth: 210,
  } from "vuex"
  import website from '@/config/website'
  import func from "@/util/func"
  export default {
    data() {
      return {
        form: {
          // constructionSchemeUrls:[]
        },
        query: {},
        loading: true,
        page: {
          pageSize: 10,
          currentPage: 1,
          total: 0,
        },
        datetime: "",
        selectionList: [],
        option: {
          labelWidth: 154,
          searchLabelWidth: 96,
          searchShow: true,
          searchMenuSpan: 3,
          menuWidth: 210,
                height: "auto",
                calcHeight: 54,
                dialogWidth: 1150,
                tip: false,
                border: true,
                //stripe:true,
                index: true,
                editBtn: false,
                viewBtn: false,
                delBtn: false,
                selection: true,
                dialogClickModal: false,
                column: [{
                    width: 220,
                    overHidden: true,
                    label: '小区名称',
                    addDisplay: false,
                    editDisplay: false,
                    viewDisplay: false,
                    prop: "districtName",
                    search: true,
                    searchSpan: 4,
                    rules: [{
                        required: true,
                        message: "请输入小区名称",
                        trigger: "blur",
                    }],
                },
                {
                    hide: true,
                    parent: false,
                    label: "小区",
                    prop: "districtId",
                    search: false,
                    type: 'tree',
                    dicUrl: `/api/blade-district/district/getDistrictTree`,
                    props: {
                        label: "name",
                        value: "id"
                    },
                    defaultExpandedKeys: ["361102003"],
                    span: 12,
                    width: 260,
                    rules: [{
                        required: true,
                        message: "请选择小区",
                        trigger: "blur",
                    },],
                },
                {
                    label: '维修项目名称',
                    prop: 'name',
                    searchSpan: 5,
                    searchLabelWidth: 124,
                    search: true,
                    span: 12,
                    rules: [{
                        required: true,
                        message: "请输入维修项目名称",
                        trigger: "blur",
                    },],
                },
                {
                    width: 100,
                    label: "预计开工时间",
                    prop: "runTime",
                    span: 12,
                    type: "date",
                    format: "yyyy-MM-dd",
                    valueFormat: "yyyy-MM-dd",
                    rules: [{
                        required: true,
                        message: "请选择合同开始时间",
                        trigger: "blur",
                    },],
                },
                {
                    width: 100,
                    label: "预计竣工时间",
                    prop: "completedTime",
                    span: 12,
                    type: "date",
                    format: "yyyy-MM-dd",
                    valueFormat: "yyyy-MM-dd",
                    rules: [{
                        required: true,
                        message: "请选择合同结束时间",
                        trigger: "blur",
                    },],
                },
                {
                    label: "项目分摊方式",
                    prop: "allocationWay",
                    value: '按建筑面积分摊',
                    span: 14,
                    row: true,
                },
                {
                    width: 110,
                    label: '联系人',
                    prop: 'linkman',
                    span: 12,
                    searchSpan: 4,
                    searchLabelWidth: 80,
                    search: true,
                    rules: [{
                        required: true,
                        message: "请输入联系人",
                        trigger: "blur",
                    },],
                },
                {
                    width: 120,
                    label: '联系方式',
                    prop: 'linkPhone',
                    span: 12,
                    rules: [{
                        required: true,
                        message: "请输入联系方式",
                        trigger: "blur",
                    },],
                },
                {
                    width: 100,
                    label: '申请时间',
                    prop: 'applyTime',
                    span: 12,
                    display: false,
                }, {
                    label: '审核进度',
                    prop: 'applyStatus',
                    span: 12,
                    display: false,
                    dicData: [{
                        label: "待审核",
                        value: 0,
                    }, {
                        label: "业委会",
                        value: 1,
                    }, {
                        label: "街道",
                        value: 2,
                    }, {
                        label: "住建局",
                        value: 3,
                    }, {
                        label: "调整申请",
                        value: 4,
                    }, {
                        label: "审核通过",
                        value: 5,
                    }, {
                        label: "审核不通过",
                        value: 6,
                    }]
                },
                {
                    label: "项目预算总金额(元)",
                    prop: "budgetAmount",
                    span: 12,
                    hide: true,
                    type: 'number',
                    precision: 2,
                    value: '0.00'
                },
                {
                    label: "实际预算金额(元)",
                    prop: "actualAmount",
                    span: 12,
                    hide: true,
                    type: 'number',
                    precision: 2,
                    value: '0.00'
                },
                {
                    label: "自筹金额(元)",
                    prop: "selfAmount",
                    span: 12,
                    hide: true,
                    type: 'number',
                    precision: 2,
                    value: '0.00'
                },
                {
                    label: "预算应拨付金额(元)",
                    prop: "budgetAppropriateAmount",
                    span: 12,
                    hide: true,
                    type: 'number',
                    precision: 2,
                    value: '0.00'
                },
                {
                    label: "项目摘要",
                    span: 24,
                    hide: true,
                    prop: "projectDigest",
                    placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
                    type: "textarea"
                },
                {
                    label: "项目进度描述",
                    span: 24,
                    hide: true,
                    prop: "projectDescribe",
                    type: "textarea"
                },
                {
                    label: '施工方案附件',
                    prop: 'constructionSchemeUrls',
                    type: 'upload',
                    span: 24,
                    hide: true,
                    multiple: true,
                    // showFileList: true,
                    propsHttp: {
                        res: 'data',
                        name: "originalName",
                        url: "link"
                    },
                    action: '/api/blade-resource/oss/endpoint/put-file-attach',
                    rules: [{
                        required: true,
                        message: "请上传施工方案",
                        trigger: "blur",
                    },],
                }
                ],
          height: "auto",
          calcHeight: 54,
          dialogWidth: 1150,
          tip: false,
          border: true,
          //stripe:true,
          index: true,
          editBtn: false,
          viewBtn: false,
          delBtn: false,
          selection: true,
          dialogClickModal: false,
          column: [{
              width: 220,
              overHidden: true,
              label: '小区名称',
              addDisplay: false,
              editDisplay: false,
              viewDisplay: false,
              prop: "districtName",
              search: true,
              searchSpan: 4,
              rules: [{
                required: true,
                message: "请输入小区名称",
                trigger: "blur",
              }],
            },
            data: [],
        }
            {
              hide: true,
              parent: false,
              label: "小区",
              prop: "districtId",
              search: false,
              type: 'tree',
              dicUrl: `/api/blade-district/district/getDistrictTree`,
              props: {
                label: "name",
                value: "id"
              },
              defaultExpandedKeys: ["361102003"],
              span: 12,
              width: 260,
              rules: [{
                required: true,
                message: "请选择小区",
                trigger: "blur",
              }, ],
            },
            {
              label: '维修项目名称',
              prop: 'name',
              searchSpan: 5,
              searchLabelWidth: 124,
              search: true,
              span: 12,
              rules: [{
                required: true,
                message: "请输入维修项目名称",
                trigger: "blur",
              }, ],
            },
            {
              width: 100,
              label: "预计开工时间",
              prop: "runTime",
              span: 12,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同开始时间",
                trigger: "blur",
              }, ],
            },
            {
              width: 100,
              label: "预计竣工时间",
              prop: "completedTime",
              span: 12,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同结束时间",
                trigger: "blur",
              }, ],
            },
            {
              label: "项目分摊方式",
              prop: "allocationWay",
              value: '按建筑面积分摊',
              span: 12,
              row: true,
            },
            {
              width: 110,
              label: '联系人',
              prop: 'linkman',
              span: 12,
              searchSpan: 4,
              searchLabelWidth: 80,
              search: true,
              rules: [{
                required: true,
                message: "请输入联系人",
                trigger: "blur",
              }, ],
            },
            {
              width: 120,
              label: '联系方式',
              prop: 'linkPhone',
              span: 12,
              rules: [{
                required: true,
                message: "请输入联系方式",
                trigger: "blur",
              }, ],
            },
            {
              width: 100,
              label: '申请时间',
              prop: 'applyTime',
              span: 12,
              display: false,
            }, {
              label: '审核进度',
              prop: 'applyStatus',
              span: 12,
              display: false,
              dicData: [{
                label: "待审核",
                value: 0,
              }, {
                label: "业委会",
                value: 1,
              }, {
                label: "街道",
                value: 2,
              }, {
                label: "住建局",
                value: 3,
              }, {
                label: "调整申请",
                value: 4,
              }, {
                label: "审核通过",
                value: 5,
              }, {
                label: "审核不通过",
                value: 6,
              }]
            },
            {
              label: "项目预算总金额(元)",
              prop: "budgetAmount",
              span: 12,
              hide: true,
              type: 'number',
              precision: 2,
              value: '0.00'
            },
            {
              label: "实际预算金额(元)",
              prop: "actualAmount",
              span: 12,
              hide: true,
              type: 'number',
              precision: 2,
              value: '0.00'
            },
            {
              label: "自筹金额(元)",
              prop: "selfAmount",
              span: 12,
              hide: true,
              type: 'number',
              precision: 2,
              value: '0.00'
            },
            {
              label: "预算应拨付金额(元)",
              prop: "budgetAppropriateAmount",
              span: 12,
              hide: true,
              type: 'number',
              precision: 2,
              value: '0.00'
            },
            {
              label: "项目摘要",
              span: 24,
              hide: true,
              prop: "projectDigest",
              placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
              type: "textarea"
            },
            {
              label: "项目进度描述",
              span: 24,
              hide: true,
              prop: "projectDescribe",
              type: "textarea"
            },
            {
              label: '施工方案附件',
              prop: 'constructionSchemeUrls',
              type: 'upload',
              span: 24,
              hide: true,
              multiple: true,
              // showFileList: true,
              propsHttp: {
                res: 'data',
                name: "originalName",
                url: "link"
              },
              action: '/api/blade-resource/oss/endpoint/put-file-attach',
              rules: [{
                required: true,
                message: "请上传施工方案",
                trigger: "blur",
              }, ],
            }
          ],
        },
        data: [],
      }
    },
    watch: {},
    computed: {
        ...mapGetters(["permission", "userInfo"]),
        permissionList () {
            return {
                addBtn: this.vaildData(this.permission.propertyCapitalApply_add, true),
                viewBtn: this.vaildData(this.permission.propertyCapitalApply_view, true),
                delBtn: this.vaildData(this.permission.propertyCapitalApply_delete, true),
                editBtn: this.vaildData(this.permission.propertyCapitalApply_edit, true),
            }
        },
        ids () {
            let ids = []
            this.selectionList.forEach((ele) => {
                ids.push(ele.id)
            })
            return ids.join(",")
        },
      ...mapGetters(["permission", "userInfo"]),
      permissionList() {
        return {
          addBtn: this.vaildData(this.permission.propertyCapitalApply_add, true),
          viewBtn: this.vaildData(this.permission.propertyCapitalApply_view, true),
          delBtn: this.vaildData(this.permission.propertyCapitalApply_delete, true),
          editBtn: this.vaildData(this.permission.propertyCapitalApply_edit, true),
        }
      },
      ids() {
        let ids = []
        this.selectionList.forEach((ele) => {
          ids.push(ele.id)
        })
        return ids.join(",")
      },
    },
    methods: {
        handleWork (row) {
            this.$router.push({
                path: `/work/process/maintenanceFundApply/edit/${row.taskId}/${row.processInstanceId}/${row.id}`
            })
        },
        goDetail (row) {
            this.$router.push({
                path: `/work/process/maintenanceFundApply/detail/${row.processInstanceId}/${row.id}`
            })
        },
        rowSave (row, done, loading) {
            row.constructionSchemeUrls = func.join(row.constructionSchemeUrls)
            if (row.constructionSchemeUrls.length > 0) {
                var urls = []
                var split = row.constructionSchemeUrls.split(",")
                split.forEach(url => {
                    var names = url.split("jczz/")
                    urls.push(names[1])
                })
                row.constructionSchemeUrls = urls.join(",")
            }
            row.propertyFlag = 1
            add(row).then(
                () => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    done()
                },
                (error) => {
                    window.console.log(error)
                    loading()
                }
            )
        },
        rowUpdate (row, index, done, loading) {
            if (row.constructionSchemeUrls.length > 0) {
                var urls = []
                var split = row.constructionSchemeUrls.split(",")
                split.forEach(url => {
                    var names = url.split("jczz/")
                    urls.push(names[1])
                })
                row.constructionSchemeUrls = urls.join(",")
            }
            update(row).then(
                () => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    done()
                },
                (error) => {
                    window.console.log(error)
                    loading()
                }
            )
        },
        rowDel (row) {
            this.$confirm("确定将选择数据删除?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning",
            })
                .then(() => {
                    return remove(row.id)
                })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                })
        },
        searchReset () {
            this.query = {}
            this.onLoad(this.page)
        },
        searchChange (params, done) {
            this.query = params
            this.page.currentPage = 1
            this.onLoad(this.page, params)
            done()
        },
        selectionChange (list) {
            this.selectionList = list
        },
        selectionClear () {
            this.selectionList = []
            this.$refs.crud.toggleSelection()
        },
        handleDelete () {
            if (this.selectionList.length === 0) {
                this.$message.warning("请选择至少一条数据")
                return
            }
            this.$confirm("确定将选择数据删除?", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning",
            })
                .then(() => {
                    return remove(this.ids)
                })
                .then(() => {
                    this.onLoad(this.page)
                    this.$message({
                        type: "success",
                        message: "操作成功!",
                    })
                    this.$refs.crud.toggleSelection()
                })
        },
        beforeOpen (done, type) {
            if (["edit", "view"].includes(type)) {
                getPropertyCapitalApply(this.form.id).then((res) => {
                    this.form = res.data.data
                    this.form.propertyFlag = 1
                    if (this.form.constructionSchemeUrls.length > 0) {
                        var urls = []
                        var names = this.form.constructionSchemeUrls.split(",")
                        names.forEach(name => {
                            urls.push(website.minioUrl + name)
                        })
                        this.form.constructionSchemeUrls = urls.join(",")
                    }
                })
            }
            // con
            done()
        },
        currentChange (currentPage) {
            this.page.currentPage = currentPage
        },
        sizeChange (pageSize) {
            this.page.pageSize = pageSize
        },
        refreshChange () {
            this.onLoad(this.page, this.query)
        },
        onLoad (page, params = {}) {
            const {
                dateTime
            } = this.query
            let values = {
                ...params,
            }
            if (dateTime) {
                values = {
                    ...params,
                    startTime: dateTime[0],
                    endTime: dateTime[1],
                    ...this.query,
                }
                values.dateTime = null
            }
            this.loading = true
            getList(page.currentPage, page.pageSize, values).then((res) => {
                const data = res.data.data
                this.page.total = data.total
                this.data = data.records
                this.data.forEach(item => {
                    if (item.constructionSchemeUrls.length > 0) {
                        var urls = []
                        var names = item.constructionSchemeUrls.split(",")
                        names.forEach(name => {
                            urls.push(website.minioUrl + name)
                        })
                        item.constructionSchemeUrls = urls.join(",")
                    }
                })
                this.loading = false
                this.selectionClear()
            })
      handleWork(row) {
        this.$router.push({
          path: `/work/process/maintenanceFundApply/edit/${row.taskId}/${row.processInstanceId}/${row.id}`
        })
      },
      goDetail(row) {
        this.$router.push({
          path: `/work/process/maintenanceFundApply/detail/${row.processInstanceId}/${row.id}`
        })
      },
      rowSave(row, done, loading) {
        row.constructionSchemeUrls = func.join(row.constructionSchemeUrls)
        if (row.constructionSchemeUrls.length > 0) {
          var urls = []
          var split = row.constructionSchemeUrls.split(",")
          split.forEach(url => {
            var names = url.split("jczz/")
            urls.push(names[1])
          })
          row.constructionSchemeUrls = urls.join(",")
        }
        row.propertyFlag = 1
        add(row).then(
          () => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            done()
          },
          (error) => {
            window.console.log(error)
            loading()
          }
        )
      },
      rowUpdate(row, index, done, loading) {
        if (row.constructionSchemeUrls.length > 0) {
          var urls = []
          var split = row.constructionSchemeUrls.split(",")
          split.forEach(url => {
            var names = url.split("jczz/")
            urls.push(names[1])
          })
          row.constructionSchemeUrls = urls.join(",")
        }
        update(row).then(
          () => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            done()
          },
          (error) => {
            window.console.log(error)
            loading()
          }
        )
      },
      rowDel(row) {
        this.$confirm("确定将选择数据删除?", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          })
          .then(() => {
            return remove(row.id)
          })
          .then(() => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
          })
      },
      searchReset() {
        this.query = {}
        this.onLoad(this.page)
      },
      searchChange(params, done) {
        this.query = params
        this.page.currentPage = 1
        this.onLoad(this.page, params)
        done()
      },
      selectionChange(list) {
        this.selectionList = list
      },
      selectionClear() {
        this.selectionList = []
        this.$refs.crud.toggleSelection()
      },
      handleDelete() {
        if (this.selectionList.length === 0) {
          this.$message.warning("请选择至少一条数据")
          return
        }
        this.$confirm("确定将选择数据删除?", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          })
          .then(() => {
            return remove(this.ids)
          })
          .then(() => {
            this.onLoad(this.page)
            this.$message({
              type: "success",
              message: "操作成功!",
            })
            this.$refs.crud.toggleSelection()
          })
      },
      beforeOpen(done, type) {
        if (["edit", "view"].includes(type)) {
          getPropertyCapitalApply(this.form.id).then((res) => {
            this.form = res.data.data
            this.form.propertyFlag = 1
            if (this.form.constructionSchemeUrls.length > 0) {
              var urls = []
              var names = this.form.constructionSchemeUrls.split(",")
              names.forEach(name => {
                urls.push(website.minioUrl + name)
              })
              this.form.constructionSchemeUrls = urls.join(",")
            }
          })
        }
        // con
        done()
      },
      currentChange(currentPage) {
        this.page.currentPage = currentPage
      },
      sizeChange(pageSize) {
        this.page.pageSize = pageSize
      },
      refreshChange() {
        this.onLoad(this.page, this.query)
      },
      onLoad(page, params = {}) {
        const {
          dateTime
        } = this.query
        let values = {
          ...params,
        }
        if (dateTime) {
          values = {
            ...params,
            startTime: dateTime[0],
            endTime: dateTime[1],
            ...this.query,
          }
          values.dateTime = null
        }
        this.loading = true
        getList(page.currentPage, page.pageSize, values).then((res) => {
          const data = res.data.data
          this.page.total = data.total
          this.data = data.records
          this.data.forEach(item => {
            if (item.constructionSchemeUrls.length > 0) {
              var urls = []
              var names = item.constructionSchemeUrls.split(",")
              names.forEach(name => {
                urls.push(website.minioUrl + name)
              })
              item.constructionSchemeUrls = urls.join(",")
            }
          })
          this.loading = false
          this.selectionClear()
        })
      }
    }
}
  }
</script>
<style>
.avue-upload__icon {
  .avue-upload__icon {
    line-height: 6;
}
  }
</style>
src/views/property/propertyCompany.vue
@@ -18,7 +18,8 @@
          @click="openPayConfig(row)">商户配置
        </el-button>
        <el-button :size="size" icon="el-icon-circle-plus-outline" type="text" @click="addProperty(row)">物业评定
        <el-button :size="size" v-if="permission.property_evaluation" icon="el-icon-circle-plus-outline" type="text"
          @click="addProperty(row)">物业评定
        </el-button>
      </template>
    </avue-crud>
src/views/system/dept.vue
@@ -140,7 +140,7 @@
            label: "管辖区域",
            prop: "regionCode",
            type: "tree",
            dicUrl: "/api/blade-system/region/tree?cityCode=3611",
            dicUrl: "/api/blade-system/region/tree?cityCode=361100000000",
            props: {
              label: "name",
              value: "id",
src/views/wel/index.vue
@@ -1,8 +1,8 @@
<template>
    <div id="homeL">
        <div class="homeL-up">
            <span class="h1">基层智治综合协同平台</span>
            <span class="h2">Grassroots intelligent governance integrated cooperation platform</span>
            <span class="h1">{{ webTitle }}</span>
            <span class="h2"></span>
        </div>
        <div class="homeL-bar">
            <div class="outS" @click="down1">
@@ -29,15 +29,19 @@
</template>
  
<script>
import { getToken } from '@/util/auth'
import { getStore } from "@/util/store"
export default {
    data () {
        return {
            webTitle: getStore({ name: "webTitle" }),
            webType: getStore({ name: "webType" }),
            a: 1,
            globalUserInfo: getStore({ name: "userInfo" }),
        }
    },
    methods: {
        down1 () {
            this.$router.push({ path: "/userHouse/houseHoldList" })
@@ -55,7 +59,8 @@
            this.$router.push({ path: "/cGovernance/gridWorkLog" })
        },
        down6 () {
            window.open('http://srgdjczzxtpt.com:2181/databoard-server/uniformLogin?passwordlessToken=bmtMNkFYcjh1dk50UVlUYXpLV2xHUDZpdGU0d1ZqMStYV01aVzlVMGsyVT0=')
            let token = 'bearer ' + getToken()
            window.open(`http://srgdjczzxtpt.com:2181/uniform-auth/login?app=app_smart_aoi&Blade-Auth=${token}`)
        },
    },
    mouted () { },
src/views/work/process/maintenanceFundApply/detail.vue
@@ -176,7 +176,7 @@
              prop: "allocationWay",
              labelWidth: 140,
              value: '按建筑面积分摊',
              span: 14,
              span: 12,
              row: true,
              disabled: true
            },
src/views/work/process/maintenanceFundApply/edit.vue
@@ -182,7 +182,7 @@
              prop: "allocationWay",
              labelWidth: 140,
              value: '按建筑面积分摊',
              span: 14,
              span: 12,
              row: true,
            },
            {
src/views/work/process/maintenanceFundApply/form.vue
@@ -104,7 +104,7 @@
              prop: "allocationWay",
              labelWidth: 140,
              value: '按建筑面积分摊',
              span: 14,
              span: 12,
              row: true,
            },
            {
src/views/work/process/maintenanceFundApply/handle.vue
@@ -1,420 +1,419 @@
<template>
    <basic-container>
        <el-form ref="form" :model="form" :rules="rules" label-width="80px">
            <el-row type="flex" class="row-bg" justify="end">
                <el-form-item>
                    <el-button @click="handleCancel">关闭</el-button>
                </el-form-item>
            </el-row>
  <basic-container>
    <el-form ref="form" :model="form" :rules="rules" label-width="80px">
      <el-row type="flex" class="row-bg" justify="end">
        <el-form-item>
          <el-button @click="handleCancel">关闭</el-button>
        </el-form-item>
      </el-row>
            <el-card shadow="hover">
                <div slot="header">
                    <span>审批信息</span>
                </div>
                <avue-form :option="option" v-model="form"></avue-form>
            </el-card>
      <el-card shadow="hover">
        <div slot="header">
          <span>审批信息</span>
        </div>
        <avue-form :option="option" v-model="form"></avue-form>
      </el-card>
            <el-card shadow="hover">
                <div slot="header">
                    <span>流程信息</span>
                </div>
                <el-row type="flex" class="row-bg">
                    <el-timeline>
                        <el-timeline-item :key="flow.id" :timestamp="flow.createTime" v-for="flow in flowList"
                            placement="top">
                            <el-card shadow="hover">
                                <p>{{ flow.assigneeName }} 在 [{{ flow.createTime }}] 开始处理 [{{ flow.historyActivityName }}]
                                    环节</p>
                                <p v-if="flow.historyActivityDurationTime !== ''">任务历时 [{{ flow.historyActivityDurationTime
      <el-card shadow="hover">
        <div slot="header">
          <span>流程信息</span>
        </div>
        <el-row type="flex" class="row-bg">
          <el-timeline>
            <el-timeline-item :key="flow.id" :timestamp="flow.createTime" v-for="flow in flowList" placement="top">
              <el-card shadow="hover">
                <p>{{ flow.assigneeName }} 在 [{{ flow.createTime }}] 开始处理 [{{ flow.historyActivityName }}]
                  环节</p>
                <p v-if="flow.historyActivityDurationTime !== ''">任务历时 [{{ flow.historyActivityDurationTime
                                }}]
                                </p>
                                <p v-if="flow.comment !== ''">批复意见: [{{ flow.comment }}]</p>
                                <p v-if="flow.endTime !== ''">结束时间: [{{ flow.endTime }}]</p>
                            </el-card>
                        </el-timeline-item>
                    </el-timeline>
                </el-row>
            </el-card>
            <el-card shadow="hover">
                <div slot="header">
                    <span>流程跟踪</span>
                </div>
                <el-row class="row-bg">
                    <flow-design :is-display="true" :process-instance-id="processInstanceId"></flow-design>
                </el-row>
            </el-card>
        </el-form>
                </p>
                <p v-if="flow.comment !== ''">批复意见: [{{ flow.comment }}]</p>
                <p v-if="flow.endTime !== ''">结束时间: [{{ flow.endTime }}]</p>
              </el-card>
            </el-timeline-item>
          </el-timeline>
        </el-row>
      </el-card>
      <el-card shadow="hover">
        <div slot="header">
          <span>流程跟踪</span>
        </div>
        <el-row class="row-bg">
          <flow-design :is-display="true" :process-instance-id="processInstanceId"></flow-design>
        </el-row>
      </el-card>
    </el-form>
        <!-- <div style="">
    <!-- <div style="">
      <el-button type="primary" @click="handleAgree">同意</el-button>
      <el-button type="danger" @click="handleDisagree">驳回</el-button>
    </div> -->
        <div style="text-align: center;
    <div style="text-align: center;
    position: fixed;
    left: 0;
    right: 0;
    bottom: 10px;">
            <el-button type="primary" @click="handleAgree">同意</el-button>
            <el-button type="danger" @click="handleDisagree">驳回</el-button>
        </div>
      <el-button type="primary" @click="handleAgree">同意</el-button>
      <el-button type="danger" @click="handleDisagree">驳回</el-button>
    </div>
    </basic-container>
  </basic-container>
</template>
<script>
import {
  import {
    historyFlowList,
    leaveDetail
} from "@/api/work/process"
  } from "@/api/work/process"
import {
  import {
    getList,
    remove,
    update,
    add,
    getPropertyCapitalApply
} from "@/api/property/propertyCapitalApply"
import {
  } from "@/api/property/propertyCapitalApply"
  import {
    completeTask
} from "@/api/work/work"
import website from '@/config/website'
  } from "@/api/work/work"
  import website from '@/config/website'
export default {
    data () {
        return {
            taskId: '',
            businessId: '',
            processInstanceId: '',
            src: '',
            flowList: [],
            form: {
                flow: {
                    assigneeName: '',
                },
                startTime: '',
                endTime: '',
                reason: '',
  export default {
    data() {
      return {
        taskId: '',
        businessId: '',
        processInstanceId: '',
        src: '',
        flowList: [],
        form: {
          flow: {
            assigneeName: '',
          },
          startTime: '',
          endTime: '',
          reason: '',
        },
        option: {
          height: "auto",
          calcHeight: 54,
          dialogWidth: 1150,
          tip: false,
          searchShow: true,
          searchMenuSpan: 3,
          menuWidth: 350,
          border: true,
          //stripe:true,
          submitBtn: false,
          emptyBtn: false,
          index: true,
          viewBtn: true,
          selection: true,
          dialogClickModal: false,
          column: [{
              label: "小区",
              prop: "districtId",
              searchSpan: 5,
              search: true,
              type: 'tree',
              dicUrl: `/api/blade-district/district/getDistrictTree`,
              props: {
                label: "name",
                value: "id"
              },
              defaultExpandedKeys: ["361102003"],
              span: 12,
              labelWidth: 120,
              width: 220,
              overHidden: true,
              rules: [{
                required: true,
                message: "请选择小区",
                trigger: "blur",
              }, ],
              disabled: true
            },
            option: {
                height: "auto",
                calcHeight: 54,
                dialogWidth: 1150,
                tip: false,
                searchShow: true,
                searchMenuSpan: 3,
                menuWidth: 350,
                border: true,
                //stripe:true,
                submitBtn: false,
                emptyBtn: false,
                index: true,
                viewBtn: true,
                selection: true,
                dialogClickModal: false,
                column: [{
                    label: "小区",
                    prop: "districtId",
                    searchSpan: 5,
                    search: true,
                    type: 'tree',
                    dicUrl: `/api/blade-district/district/getDistrictTree`,
                    props: {
                        label: "name",
                        value: "id"
                    },
                    defaultExpandedKeys: ["361102003"],
                    span: 12,
                    labelWidth: 120,
                    width: 220,
                    overHidden: true,
                    rules: [{
                        required: true,
                        message: "请选择小区",
                        trigger: "blur",
                    },],
                    disabled: true
                },
                {
                    label: '维修项目名称',
                    prop: 'name',
                    searchLabelWidth: 120,
                    searchSpan: 5,
                    search: true,
                    span: 12,
                    labelWidth: 140,
                    rules: [{
                        required: true,
                        message: "请输入维修项目名称",
                        trigger: "blur",
                    },],
                    disabled: true
                },
                {
                    label: "预计开工时间",
                    prop: "runTime",
                    span: 12,
                    labelWidth: 140,
                    type: "date",
                    format: "yyyy-MM-dd",
                    valueFormat: "yyyy-MM-dd",
                    rules: [{
                        required: true,
                        message: "请选择合同开始时间",
                        trigger: "blur",
                    },],
                    disabled: true
                },
                {
                    label: "预计竣工时间",
                    prop: "completedTime",
                    labelWidth: 140,
                    span: 12,
                    type: "date",
                    format: "yyyy-MM-dd",
                    valueFormat: "yyyy-MM-dd",
                    rules: [{
                        required: true,
                        message: "请选择合同结束时间",
                        trigger: "blur",
                    },],
                    disabled: true
                },
                {
                    label: "项目分摊方式",
                    prop: "allocationWay",
                    labelWidth: 140,
                    value: '按建筑面积分摊',
                    span: 14,
                    row: true,
                    disabled: true
                },
                {
                    label: '联系人',
                    prop: 'linkman',
                    span: 12,
                    labelWidth: 120,
                    search: true,
                    searchSpan: 4,
                    rules: [{
                        required: true,
                        message: "请输入联系人",
                        trigger: "blur",
                    },],
                    disabled: true
                },
                {
                    label: '联系方式',
                    prop: 'linkPhone',
                    span: 12,
                    labelWidth: 140,
                    rules: [{
                        required: true,
                        message: "请输入联系方式",
                        trigger: "blur",
                    },],
                    disabled: true
                },
                {
                    label: "项目预算总金额(元)",
                    prop: "budgetAmount",
                    span: 12,
                    hide: true,
                    labelWidth: 140,
                    type: 'number',
                    precision: 2,
                    value: '0.00',
                    disabled: true
                },
                {
                    label: "实际预算金额(元)",
                    prop: "actualAmount",
                    span: 12,
                    hide: true,
                    labelWidth: 140,
                    type: 'number',
                    precision: 2,
                    value: '0.00',
                    disabled: true
                },
                {
                    label: "自筹金额(元)",
                    prop: "selfAmount",
                    span: 12,
                    hide: true,
                    labelWidth: 140,
                    type: 'number',
                    precision: 2,
                    value: '0.00',
                    disabled: true
                },
                {
                    label: "预算应拨付金额(元)",
                    prop: "budgetAppropriateAmount",
                    span: 12,
                    hide: true,
                    labelWidth: 140,
                    type: 'number',
                    precision: 2,
                    value: '0.00',
                    disabled: true
                },
                {
                    label: "项目摘要",
                    span: 24,
                    hide: true,
                    prop: "projectDigest",
                    placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
                    labelWidth: 140,
                    type: "textarea",
                    disabled: true
                },
                {
                    label: "项目进度描述",
                    span: 24,
                    hide: true,
                    prop: "projectDescribe",
                    labelWidth: 140,
                    type: "textarea",
                    disabled: true
                }, {
                    label: "批复意见",
                    span: 24,
                    hide: true,
                    prop: "comment",
                    labelWidth: 140,
                    type: "textarea",
                    rules: [{
                        required: true,
                        message: "请输入批复意见",
                        trigger: "blur",
                    },],
                },
                {
                    label: '施工方案附件',
                    prop: 'constructionSchemeUrls',
                    type: 'upload',
                    listType: 'picture-img',
                    span: 24,
                    hide: true,
                    labelWidth: 140,
                    multiple: true,
                    // showFileList: true,
                    propsHttp: {
                        res: 'data',
                        name: "originalName",
                        url: "link"
                    },
                    action: '/api/blade-resource/oss/endpoint/put-file-attach',
                    rules: [{
                        required: true,
                        message: "请上传施工方案",
                        trigger: "blur",
                    },],
                }
                ],
            {
              label: '维修项目名称',
              prop: 'name',
              searchLabelWidth: 120,
              searchSpan: 5,
              search: true,
              span: 12,
              labelWidth: 140,
              rules: [{
                required: true,
                message: "请输入维修项目名称",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "预计开工时间",
              prop: "runTime",
              span: 12,
              labelWidth: 140,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同开始时间",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "预计竣工时间",
              prop: "completedTime",
              labelWidth: 140,
              span: 12,
              type: "date",
              format: "yyyy-MM-dd",
              valueFormat: "yyyy-MM-dd",
              rules: [{
                required: true,
                message: "请选择合同结束时间",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "项目分摊方式",
              prop: "allocationWay",
              labelWidth: 140,
              value: '按建筑面积分摊',
              span: 12,
              row: true,
              disabled: true
            },
            {
              label: '联系人',
              prop: 'linkman',
              span: 12,
              labelWidth: 120,
              search: true,
              searchSpan: 4,
              rules: [{
                required: true,
                message: "请输入联系人",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: '联系方式',
              prop: 'linkPhone',
              span: 12,
              labelWidth: 140,
              rules: [{
                required: true,
                message: "请输入联系方式",
                trigger: "blur",
              }, ],
              disabled: true
            },
            {
              label: "项目预算总金额(元)",
              prop: "budgetAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "实际预算金额(元)",
              prop: "actualAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "自筹金额(元)",
              prop: "selfAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "预算应拨付金额(元)",
              prop: "budgetAppropriateAmount",
              span: 12,
              hide: true,
              labelWidth: 140,
              type: 'number',
              precision: 2,
              value: '0.00',
              disabled: true
            },
            {
              label: "项目摘要",
              span: 24,
              hide: true,
              prop: "projectDigest",
              placeholder: "例如:“XX小区XX栋XX设施设备维修,总的预算金额是X,是否含有审价,本次维修涉及范围共XX户,总面积的建筑面积为XX平方米”",
              labelWidth: 140,
              type: "textarea",
              disabled: true
            },
            {
              label: "项目进度描述",
              span: 24,
              hide: true,
              prop: "projectDescribe",
              labelWidth: 140,
              type: "textarea",
              disabled: true
            }, {
              label: "批复意见",
              span: 24,
              hide: true,
              prop: "comment",
              labelWidth: 140,
              type: "textarea",
              rules: [{
                required: true,
                message: "请输入批复意见",
                trigger: "blur",
              }, ],
            },
            {
              label: '施工方案附件',
              prop: 'constructionSchemeUrls',
              type: 'upload',
              listType: 'picture-img',
              span: 24,
              hide: true,
              labelWidth: 140,
              multiple: true,
              // showFileList: true,
              propsHttp: {
                res: 'data',
                name: "originalName",
                url: "link"
              },
              action: '/api/blade-resource/oss/endpoint/put-file-attach',
              rules: [{
                required: true,
                message: "请上传施工方案",
                trigger: "blur",
              }, ],
            }
          ],
        }
      }
    },
    created () {
    created() {
      this.init()
    },
    beforeRouteUpdate(to, from, next) {
      // 在当前路由改变,但是该组件被复用时调用
      // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候
      // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用
      // 可以访问组件实例 `this`
      if (to.fullPath !== from.fullPath) {
        next()
        this.init()
    },
    beforeRouteUpdate (to, from, next) {
        // 在当前路由改变,但是该组件被复用时调用
        // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候
        // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用
        // 可以访问组件实例 `this`
        if (to.fullPath !== from.fullPath) {
            next()
            this.init()
        }
      }
    },
    methods: {
        init () {
            this.taskId = this.$route.params.taskId
            this.processInstanceId = this.$route.params.processInstanceId
            this.businessId = this.$route.params.businessId
            historyFlowList(this.processInstanceId).then(res => {
                const data = res.data
                if (data.success) {
                    this.flowList = data.data
                }
            })
            getPropertyCapitalApply(this.businessId).then(res => {
                const data = res.data
                if (data.success) {
                    data.data.constructionSchemeUrls = website.minioUrl + data.data.constructionSchemeUrls
                    this.form = data.data
                }
            })
        },
        handleAgree () {
            if (!this.form.comment) {
                this.$message.warning('请先填写批复意见')
                return
            }
            const params = {
                taskId: this.taskId,
                processInstanceId: this.processInstanceId,
                flag: 'ok',
                comment: this.form.comment,
            }
            completeTask(params).then(res => {
                const data = res.data
                if (data.success) {
                    this.$message.success(data.msg)
                    this.$router.$avueRouter.closeTag()
                    this.$router.push({
                        path: `/work/todo`
                    })
                } else {
                    this.$message.error(data.msg || '提交失败')
                }
            })
        },
        handleDisagree () {
            if (!this.form.comment) {
                this.$message.warning('请先填写批复意见')
                return
            }
            const params = {
                taskId: this.taskId,
                processInstanceId: this.processInstanceId,
                comment: this.form.comment,
            }
            completeTask(params).then(res => {
                const data = res.data
                if (data.success) {
                    this.$message.success(data.msg)
                    this.$router.$avueRouter.closeTag()
                    this.$router.push({
                        path: `/work/todo`
                    })
                } else {
                    this.$message.error(data.msg || '提交失败')
                }
            })
        },
        handleCancel () {
      init() {
        this.taskId = this.$route.params.taskId
        this.processInstanceId = this.$route.params.processInstanceId
        this.businessId = this.$route.params.businessId
        historyFlowList(this.processInstanceId).then(res => {
          const data = res.data
          if (data.success) {
            this.flowList = data.data
          }
        })
        getPropertyCapitalApply(this.businessId).then(res => {
          const data = res.data
          if (data.success) {
            data.data.constructionSchemeUrls = website.minioUrl + data.data.constructionSchemeUrls
            this.form = data.data
          }
        })
      },
      handleAgree() {
        if (!this.form.comment) {
          this.$message.warning('请先填写批复意见')
          return
        }
        const params = {
          taskId: this.taskId,
          processInstanceId: this.processInstanceId,
          flag: 'ok',
          comment: this.form.comment,
        }
        completeTask(params).then(res => {
          const data = res.data
          if (data.success) {
            this.$message.success(data.msg)
            this.$router.$avueRouter.closeTag()
            this.$router.push({
                path: `/work/todo`
              path: `/work/todo`
            })
          } else {
            this.$message.error(data.msg || '提交失败')
          }
        })
      },
      handleDisagree() {
        if (!this.form.comment) {
          this.$message.warning('请先填写批复意见')
          return
        }
        const params = {
          taskId: this.taskId,
          processInstanceId: this.processInstanceId,
          comment: this.form.comment,
        }
        completeTask(params).then(res => {
          const data = res.data
          if (data.success) {
            this.$message.success(data.msg)
            this.$router.$avueRouter.closeTag()
            this.$router.push({
              path: `/work/todo`
            })
          } else {
            this.$message.error(data.msg || '提交失败')
          }
        })
      },
      handleCancel() {
        this.$router.$avueRouter.closeTag()
        this.$router.push({
          path: `/work/todo`
        })
      }
    }
}
  }
</script>
<style scoped>
.container {
  .container {
    position: relative;
    /* 确保按钮相对于该元素定位 */
}
  }
#myButton {
  #myButton {
    position: fixed;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
}
  }
</style>
vue.config.js
@@ -18,7 +18,9 @@
    entry.add("@/mock").end();
  },
  css: {
    extract: { ignoreOrder: true },
    extract: {
      ignoreOrder: true
    },
  },
  //开发模式反向代理配置,生产模式请使用Nginx部署并配置反向代理
  devServer: {
@@ -26,9 +28,9 @@
    proxy: {
      "/api": {
        //本地服务接口地址
        target: "https://srgdjczzxtpt.com:2080/api",
        // target: "https://srgdjczzxtpt.com:2080/api",
        // target: "http://z4042833u6.wicp.vip",
        // target: "http://localhost:9528",
        target: "http://localhost:9528",
        // target:"http://192.168.0.109:9528",
        //远程演示服务地址,可用于直接启动项目
        //target: 'https://saber.bladex.cn/api',