CzRger 1 anno fa
parent
commit
a967eebe98
81 ha cambiato i file con 1443 aggiunte e 2754 eliminazioni
  1. 1 0
      src/App.vue
  2. 0 15
      src/api/modules/account.ts
  3. 0 16
      src/api/modules/common.ts
  4. 0 22
      src/api/modules/config.ts
  5. 0 22
      src/api/modules/daily.ts
  6. 0 8
      src/api/modules/dept.ts
  7. 0 36
      src/api/modules/dict.ts
  8. 0 17
      src/api/modules/login-log.ts
  9. 0 40
      src/api/modules/notice.ts
  10. 0 17
      src/api/modules/oper-log.ts
  11. 0 8
      src/api/modules/sign.ts
  12. 0 32
      src/api/modules/ztpt.ts
  13. BIN
      src/assets/images/global/login_bg.jpeg
  14. BIN
      src/assets/images/global/password.png
  15. BIN
      src/assets/images/global/user.png
  16. BIN
      src/assets/images/layout/background.png
  17. BIN
      src/assets/images/layout/background_home.png
  18. BIN
      src/assets/images/layout/head-bg.png
  19. BIN
      src/assets/images/layout/head-com-avatar.png
  20. BIN
      src/assets/images/layout/head-com-bg.png
  21. BIN
      src/assets/images/layout/head-com-dropdown.png
  22. BIN
      src/assets/images/layout/head-com-info-center.png
  23. BIN
      src/assets/images/layout/head-com-search.png
  24. BIN
      src/assets/images/layout/logo_icon.png
  25. BIN
      src/assets/images/layout/logo_name.png
  26. BIN
      src/assets/images/layout/menu-active-special.png
  27. BIN
      src/assets/images/layout/menu-bg-special.png
  28. BIN
      src/assets/images/layout/menu-item-bg-active.png
  29. BIN
      src/assets/images/layout/menu-item-bg.png
  30. BIN
      src/assets/images/layout/menu-top-title.png
  31. BIN
      src/assets/mock.png
  32. 0 5
      src/assets/svg/business/arrow_1.svg
  33. 0 8
      src/assets/svg/business/arrow_2.svg
  34. 0 7
      src/assets/svg/business/cus-content_field-column-drag.svg
  35. 0 7
      src/assets/svg/business/cus-content_field-column-select.svg
  36. 0 8
      src/assets/svg/business/cus-content_field-column.svg
  37. 0 11
      src/assets/svg/business/cus-content_field-fixed.svg
  38. 0 11
      src/assets/svg/business/cus-content_field-in.svg
  39. 0 11
      src/assets/svg/business/cus-content_tools.svg
  40. 0 9
      src/assets/svg/business/default.svg
  41. 0 1
      src/assets/svg/business/menu-mock.svg
  42. 0 1
      src/assets/svg/business/u212.svg
  43. 0 17
      src/assets/svg/global/关注对象.svg
  44. 0 11
      src/assets/svg/global/字典管理.svg
  45. 0 16
      src/assets/svg/global/安全审计.svg
  46. 0 13
      src/assets/svg/global/权限管理.svg
  47. 0 11
      src/assets/svg/global/标签管理.svg
  48. 0 1
      src/assets/svg/global/水军水手.svg
  49. 0 23
      src/assets/svg/global/港岙口.svg
  50. 0 13
      src/assets/svg/global/用户管理.svg
  51. 0 1
      src/assets/svg/global/网络管理.svg
  52. 0 13
      src/assets/svg/global/船舶管理.svg
  53. 0 1
      src/assets/svg/global/菜单管理.svg
  54. 0 1
      src/assets/svg/global/调度管理.svg
  55. 0 12
      src/assets/svg/global/部门管理.svg
  56. 0 23
      src/assets/svg/global/配置管理.svg
  57. 0 22
      src/assets/svg/global/随船人员.svg
  58. 9 1
      src/components/easyMap/func/base-draw.ts
  59. 63 10
      src/components/easyMap/index.vue
  60. 3 0
      src/components/vue-drag-resize/index.vue
  61. 52 0
      src/components/vue-drag-resize/vue-drag-resize.css
  62. 20 0
      src/components/vue-drag-resize/vue-drag-resize.html
  63. 858 0
      src/components/vue-drag-resize/vue-drag-resize.js
  64. 109 119
      src/layout/header/head-com.vue
  65. 0 146
      src/layout/header/navigation.vue
  66. 46 158
      src/layout/index.vue
  67. 30 101
      src/layout/menu/menu.vue
  68. 61 109
      src/layout/menu/sub-menu.vue
  69. 2 0
      src/plugins/initProperties.ts
  70. 48 32
      src/router/index.ts
  71. 10 5
      src/router/modules/static.ts
  72. 2 242
      src/store/modules/app.ts
  73. 4 277
      src/store/modules/dictionary-define.ts
  74. 38 335
      src/store/modules/dictionary.ts
  75. 21 0
      src/utils/permissions.ts
  76. 18 0
      src/utils/util.ts
  77. 40 0
      src/views/gis/index.vue
  78. 0 207
      src/views/global/head/info.vue
  79. 0 173
      src/views/global/head/password.vue
  80. 0 158
      src/views/global/login.vue
  81. 8 191
      vite.config.ts

+ 1 - 0
src/App.vue

@@ -28,6 +28,7 @@ export default defineComponent({
     const store = useStore()
     const locale = ref(zhLocale)
     const that = (getCurrentInstance() as ComponentInternalInstance).appContext.config.globalProperties
+    sessionStorage.setItem('sg_token', '123')
     return {
       locale
     }

+ 0 - 15
src/api/modules/account.ts

@@ -1,15 +0,0 @@
-import { handle } from '../index'
-
-const suffix = 'api'
-
-// 获取个人信息
-export const getUserInfo = () => handle({
-  url: `/${suffix}/account/search`,
-  method: 'get',
-})
-//  根据部门ID获取用户列表
-export const getAccountListByDeptId = (params: any) => handle({
-  url: `/${suffix}/account/list`,
-  method: 'get',
-  params
-})

+ 0 - 16
src/api/modules/common.ts

@@ -1,16 +0,0 @@
-import { handle } from '../index'
-
-const suffix = 'api'
-// 文件上传
-export const commonUpload = (params: any) => handle({
-  url: `/${suffix}/common/upload`,
-  method: 'post',
-  params,
-})
-// 文件下载
-export const commonDownload = (params: any) => handle({
-  url: `/${suffix}/common/download`,
-  method: 'get',
-  params,
-  config: {responseType: 'blob'}
-})

+ 0 - 22
src/api/modules/config.ts

@@ -1,22 +0,0 @@
-import { handle } from '../index'
-
-const suffix = 'api'
-
-//  公共配置 > 获取对应详情
-// 签到管理-签到时间	sign.begin.time
-// 签到管理-签到提醒时间	sign.remind.time
-// 签到管理-签退时间	sign.end.time
-// 日志管理-截止提交时间	log.submit.time
-// 日志管理-日志提交提醒时间	log.remind.time
-// 周报管理-截止提交时间	week.submit.time
-// 周报管理-日志提交提醒时间	week.remind.time
-export const getConfigConfigKey = (key: any) => handle({
-  url: `/${suffix}/config/configKey/${key}`,
-  method: 'get',
-})
-//  公共配置 > 修改键值
-export const editConfigEditConfigKey = (params: any) => handle({
-  url: `/${suffix}/config/edit/configKey`,
-  method: 'put',
-  params
-})

+ 0 - 22
src/api/modules/daily.ts

@@ -1,22 +0,0 @@
-import { handle } from '../index'
-
-const suffix = 'api'
-
-//  日志管理 > 列表
-export const getDailyReportList = (params: any) => handle({
-  url: `/${suffix}/daily/report/list`,
-  method: 'post',
-  params
-})
-//  日志管理 > 新增
-export const addDailyReportSave = (params: any) => handle({
-  url: `/${suffix}/daily/report/save`,
-  method: 'post',
-  params
-})
-//  日志管理 > 编辑
-export const editDailyReportEdit = (params: any) => handle({
-  url: `/${suffix}/daily/report/edit`,
-  method: 'put',
-  params
-})

+ 0 - 8
src/api/modules/dept.ts

@@ -1,8 +0,0 @@
-import { handle } from '../index'
-
-const suffix = 'api'
-
-export const getDeptList = () => handle({
-  url: `/${suffix}/dept/list`,
-  method: 'get',
-})

+ 0 - 36
src/api/modules/dict.ts

@@ -1,36 +0,0 @@
-import { handle } from '../index'
-
-const suffix = 'api'
-//  字典管理 > 树
-export const getDictTypeTreeSelectTree = () => handle({
-  url: `/${suffix}/dict/type/treeselect`,
-  method: 'get',
-})
-//  字典管理 > 列表
-export const getDictDataList = (params: any) => handle({
-  url: `/${suffix}/dict/data/list`,
-  method: 'get',
-  params
-})
-//  字典管理 > 列表 > 新增
-export const addDictData = (params: any) => handle({
-  url: `/${suffix}/dict/data/save`,
-  method: 'post',
-  params
-})
-//  字典管理 > 列表 > 编辑
-export const editDictData = (params: any) => handle({
-  url: `/${suffix}/dict/data/edit`,
-  method: 'put',
-  params
-})
-//  字典管理 > 列表 > 删除
-export const delDictData = (id: any) => handle({
-  url: `/${suffix}/dict/data/${id}`,
-  method: 'delete',
-})
-//  字典管理 > 获取字典翻译
-export const dictDataType = (type: any) => handle({
-  url: `/${suffix}/dict/data/type/${type}`,
-  method: 'get',
-})

+ 0 - 17
src/api/modules/login-log.ts

@@ -1,17 +0,0 @@
-import { handle } from '../index'
-
-const suffix = 'api'
-
-//  登录日志 > 列表
-export const getLoginLogList = (params: any) => handle({
-  url: `/${suffix}/login/log/list`,
-  method: 'post',
-  params
-})
-//  登录日志 > 导出
-export const loginLogExport = (params: any) => handle({
-  url: `/${suffix}/login/log/export`,
-  method: 'post',
-  params,
-  config: {responseType: 'blob'}
-})

+ 0 - 40
src/api/modules/notice.ts

@@ -1,40 +0,0 @@
-import { handle } from '../index'
-
-const suffix = 'api'
-
-//  通知公告 > 列表
-export const getNoticeList = (params: any) => handle({
-  url: `/${suffix}/notice/list`,
-  method: 'post',
-  params
-})
-//  通知公告 > 新增
-export const addNoticeSave = (params: any) => handle({
-  url: `/${suffix}/notice/save`,
-  method: 'post',
-  params
-})
-//  通知公告 > 编辑
-export const editNoticeEdit = (params: any) => handle({
-  url: `/${suffix}/notice/edit`,
-  method: 'put',
-  params
-})
-//  通知公告 > 查看
-export const getNoticeSearch = (params: any) => handle({
-  url: `/${suffix}/notice/search`,
-  method: 'get',
-  params
-})
-//  通知公告 > 发布
-export const getNoticePublish = (params: any) => handle({
-  url: `/${suffix}/notice/publish`,
-  method: 'get',
-  params
-})
-//  通知公告 > 撤回
-export const getNoticeRevoke = (params: any) => handle({
-  url: `/${suffix}/notice/revoke`,
-  method: 'get',
-  params
-})

+ 0 - 17
src/api/modules/oper-log.ts

@@ -1,17 +0,0 @@
-import { handle } from '../index'
-
-const suffix = 'api'
-
-//  操作记录 > 列表
-export const getOperationLogList = (params: any) => handle({
-  url: `/${suffix}/operLog/list`,
-  method: 'post',
-  params
-})
-//  操作记录 > 导出
-export const operLogExport = (params: any) => handle({
-  url: `/${suffix}/operLog/export`,
-  method: 'post',
-  params,
-  config: {responseType: 'blob'}
-})

+ 0 - 8
src/api/modules/sign.ts

@@ -1,8 +0,0 @@
-import { handle } from '../index'
-
-const suffix = 'api'
-
-export const getSignTime = () => handle({
-  url: `/${suffix}/sign/time`,
-  method: 'get',
-})

+ 0 - 32
src/api/modules/ztpt.ts

@@ -1,32 +0,0 @@
-import { handle } from '../index'
-
-const suffix = 'api-ztpt'
-
-export const ztptGetLoginCode = (params: any) => handle({
-  url: `/${suffix}/api-idaas/validata/code/${params}`,
-  method: 'get',
-  config: {
-    responseType: 'blob'
-  }
-})
-
-export const ztptLogin = (params: any) => handle({
-  url: `/${suffix}/api-idaas/idaas/sso/login`,
-  method: 'post',
-  params
-})
-
-export const ztptGetUserInfo = () => handle({
-  url: `/${suffix}/api-idaas/idaas/sso/user/info`,
-  method: 'get',
-})
-
-export const ztptGetUserRoleList = () => handle({
-  url: `/${suffix}/api-idaas/idaas/ps/user/roleList`,
-  method: 'get',
-})
-
-export const ztptLogout = () => handle({
-  url: `/${suffix}/api-idaas/mq/user/logout`,
-  method: 'get',
-})

BIN
src/assets/images/global/login_bg.jpeg


BIN
src/assets/images/global/password.png


BIN
src/assets/images/global/user.png


BIN
src/assets/images/layout/background.png


BIN
src/assets/images/layout/background_home.png


BIN
src/assets/images/layout/head-bg.png


BIN
src/assets/images/layout/head-com-avatar.png


BIN
src/assets/images/layout/head-com-bg.png


BIN
src/assets/images/layout/head-com-dropdown.png


BIN
src/assets/images/layout/head-com-info-center.png


BIN
src/assets/images/layout/head-com-search.png


BIN
src/assets/images/layout/logo_icon.png


BIN
src/assets/images/layout/logo_name.png


BIN
src/assets/images/layout/menu-active-special.png


BIN
src/assets/images/layout/menu-bg-special.png


BIN
src/assets/images/layout/menu-item-bg-active.png


BIN
src/assets/images/layout/menu-item-bg.png


BIN
src/assets/images/layout/menu-top-title.png


BIN
src/assets/mock.png


File diff suppressed because it is too large
+ 0 - 5
src/assets/svg/business/arrow_1.svg


File diff suppressed because it is too large
+ 0 - 8
src/assets/svg/business/arrow_2.svg


+ 0 - 7
src/assets/svg/business/cus-content_field-column-drag.svg

@@ -1,7 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg t="1692757700168" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
-     p-id="17105" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128">
-  <path d="M204.8 341.333333h614.4v68.266667H204.8v-68.266667z m0 273.066667h614.4v68.266667H204.8v-68.266667z"
-        fill="#000000" p-id="17106"></path>
-</svg>

+ 0 - 7
src/assets/svg/business/cus-content_field-column-select.svg

@@ -1,7 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg t="1692757700168" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
-     p-id="17105" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128">
-  <path d="M204.8 341.333333h614.4v68.266667H204.8v-68.266667z m0 273.066667h614.4v68.266667H204.8v-68.266667z"
-        p-id="17106"></path>
-</svg>

File diff suppressed because it is too large
+ 0 - 8
src/assets/svg/business/cus-content_field-column.svg


File diff suppressed because it is too large
+ 0 - 11
src/assets/svg/business/cus-content_field-fixed.svg


File diff suppressed because it is too large
+ 0 - 11
src/assets/svg/business/cus-content_field-in.svg


File diff suppressed because it is too large
+ 0 - 11
src/assets/svg/business/cus-content_tools.svg


+ 0 - 9
src/assets/svg/business/default.svg

@@ -1,9 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg t="1692585246601" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
-     p-id="10280" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
-  <path
-    d="M512 958.8C265.6 958.8 65.2 758.4 65.2 512S265.6 65.2 512 65.2 958.8 265.6 958.8 512 758.4 958.8 512 958.8z m0-832c-212.4 0-385.2 172.8-385.2 385.2S299.6 897.2 512 897.2 897.2 724.4 897.2 512 724.4 126.8 512 126.8z"
-    p-id="10281"></path>
-  <path d="M512 512m-169.5 0a169.5 169.5 0 1 0 339 0 169.5 169.5 0 1 0-339 0Z" p-id="10282"></path>
-</svg>

File diff suppressed because it is too large
+ 0 - 1
src/assets/svg/business/menu-mock.svg


File diff suppressed because it is too large
+ 0 - 1
src/assets/svg/business/u212.svg


+ 0 - 17
src/assets/svg/global/关注对象.svg

@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 26.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
-<path d="M99.8,117.4l-9.9,5.2c-1.2,0.6-2.6-0.4-2.4-1.7l1.9-11l-8-7.8c-1-0.9-0.4-2.6,0.9-2.8l11.1-1.6l5-10c0.6-1.2,2.3-1.2,2.9,0
-	l5,10l11.1,1.6c1.3,0.2,1.9,1.8,0.9,2.8l-8,7.8l1.9,11c0.2,1.3-1.2,2.4-2.4,1.7L99.8,117.4L99.8,117.4z"/>
-<g>
-	<path d="M36.4,47.2h4.5c-0.3,1.5-0.5,3.1-0.5,4.9c0,15.8,12.9,28.7,28.7,28.7c15.8,0,28.7-12.9,28.7-28.7c0-1.8-0.2-3.4-0.5-4.9
-		l4.1,0c1.4-0.1,3-1.7,3-2.9C103.5,24.4,90.9,4.3,68.2,4.3c-22.7,0-34.6,19.8-36,38.2c-0.1,1.1,0.8,2.4,1.5,3.3
-		C34.3,46.3,35.3,47.2,36.4,47.2z M70.4,34.2l-4.1,0l-5.3,0.2c-6.9,0.5-11.6,1.9-14.9,4.3h-4.9c2.7-15.8,13.3-26,27-26h0.5
-		c13.5,0.2,23.9,10.4,26.6,26H92c-3.2-2.4-7.7-3.7-14.2-4.3L77,34.4L70.4,34.2z M52.6,44.7c0.8-0.4,1.6-0.7,2.5-0.9l0.5-0.1
-		c1-0.2,2.2-0.4,3.4-0.6l1.7-0.2l7-0.3h1.5l5,0.1l4.2,0.3l2.8,0.4c0.5,0.1,0.9,0.2,1.3,0.3l0.5,0.1c0.9,0.2,1.9,0.6,2.7,1
-		c2.3,1.1,3.7,2.7,3.7,7.4c0,11.2-9.1,20.2-20.2,20.2c-11.2,0-20.2-9.1-20.2-20.2C48.8,47.3,50.2,45.8,52.6,44.7z"/>
-	<path d="M76.7,117.2c0-0.6,0-1.2,0-1.7H20c1.7-13.7,13.2-23.9,27.1-23.9h36.7c1.8-3,4-5.9,6.4-8.4c-0.3,0-0.6,0-0.9,0H47.1
-		c-9.5,0-18.5,3.7-25.3,10.5s-10.5,15.7-10.5,25.3v5h65.7C76.8,121.7,76.7,119.5,76.7,117.2z"/>
-</g>
-</svg>

+ 0 - 11
src/assets/svg/global/字典管理.svg

@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 26.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
-<path d="M97.3,9.4H30.7c-8.6,0-15.6,7-15.6,15.6v83c0,6.7,5.5,12.2,12.2,12.2h75.1c2.3,0,4.2-1.9,4.2-4.2s-1.9-4.2-4.2-4.2H27.2
-	c-2,0-3.7-1.6-3.7-3.7s1.6-3.7,3.7-3.7h81.4c2.3,0,4.2-1.9,4.2-4.2V25C112.9,16.4,105.9,9.4,97.3,9.4z M23.6,25
-	c0-3.9,3.2-7.1,7.1-7.1h37.2v26.8c0,1.7,1,3.3,2.6,3.9c1.6,0.7,3.4,0.3,4.6-0.9l7.1-7.1l7.1,7.1c1.2,1.2,3,1.6,4.6,0.9
-	c1.6-0.7,2.6-2.2,2.6-3.9V17.9h0.7c3.9,0,7.1,3.2,7.1,7.1v70.8H37.7V44.7c0-2.3-1.9-4.2-4.2-4.2s-4.2,1.9-4.2,4.2v51.1h-2
-	c-1.3,0-2.5,0.2-3.7,0.6V25z M88.1,34.4l-2.9-2.9c-0.8-0.8-1.9-1.3-3-1.3c0,0,0,0,0,0c-1.1,0-2.2,0.5-3,1.3l-2.9,2.9V17.9h11.8V34.4
-	z"/>
-</svg>

+ 0 - 16
src/assets/svg/global/安全审计.svg

@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 26.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 109.8 109.8" style="enable-background:new 0 0 109.8 109.8;" xml:space="preserve">
-<path d="M53,109.6c-4.3,0-8.6-1.3-12.2-3.7l-15.4-10C11.6,86.8,3.3,71.3,3.3,54.8v-22c0-4.8,3.3-9,8-10.1c12.8-3.4,24.7-9.5,35-17.8
-	c3.9-3.3,9.5-3.3,13.4,0c10.3,8.3,22.2,14.4,35,17.8c4.7,1.1,8.1,5.3,8.1,10.2v8.5c0,2.2-1.8,4-4,4s-4-1.8-4-4l0,0v-8.6
-	c0-1-0.6-1.9-1.6-2.3C79,27,65.9,20.4,54.5,11.3c-0.8-0.7-2-0.7-2.9,0C40.2,20.4,27,27,12.9,30.6c-1.1,0.3-1.8,1.3-1.7,2.3v21.9
-	c0,13.8,6.9,26.8,18.5,34.4l15.4,10.1c4.7,3.1,10.8,3.1,15.6,0c1.9-1.1,4.4-0.5,5.5,1.4c1,1.8,0.6,4-1.1,5.2
-	C61.5,108.3,57.3,109.6,53,109.6z"/>
-<path d="M81.4,54.8c0.3-0.1,0.6-0.1,0.9,0l15.4,8.9c0.5,0.3,0.9,0.9,0.9,1.5v17.7c0,0.6-0.3,1.2-0.9,1.5l-15.4,8.9
-	c-0.5,0.3-1.2,0.3-1.7,0l-15.4-8.9c-0.5-0.3-0.8-0.9-0.8-1.5V65.4c0-0.6,0.3-1.2,0.9-1.5L80.7,55c0.3-0.1,0.6-0.1,0.9,0 M81.4,47
-	c-1.7,0-3.4,0.5-4.9,1.3l-15.3,8.6c-3,1.7-4.9,4.9-4.9,8.4v17.6c0,3.5,1.9,6.7,4.9,8.4l15.4,8.9c3,1.7,6.7,1.7,9.8,0l15.4-8.9
-	c3-1.8,4.8-5,4.8-8.4V65.4c0-3.5-1.9-6.7-4.9-8.4l-15.2-8.9c-1.5-0.9-3.2-1.3-4.9-1.3L81.4,47z"/>
-<path d="M82,72c1.2,0,2.2,1,2.2,2.2s-1,2.2-2.2,2.2s-2.2-1-2.2-2.2l0,0C79.8,73,80.8,72,82,72 M82,66.3c-4.4,0-7.9,3.5-7.9,7.9
-	s3.5,7.9,7.9,7.9s7.9-3.5,7.9-7.9c0.1-4.4-3.3-8-7.7-8.2c-0.1,0-0.2,0-0.2,0S82,66.3,82,66.3z"/>
-</svg>

+ 0 - 13
src/assets/svg/global/权限管理.svg

@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 26.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
-<g>
-	<path d="M42.7,53.8c0,10.5,7.8,19.6,18.2,21.2v23.4c0,2.2,1.9,4,4,4s4-1.9,4-4V86h5.4c2.2,0,4-1.9,4-4.1c0-2.2-1.9-4-4-4H69v-3.1
-		c9.7-2.1,16.8-10.9,16.8-21c0-11.9-9.7-21.5-21.5-21.5S42.7,41.9,42.7,53.8z M50.8,53.8c0-7.5,5.9-13.4,13.5-13.4
-		c7.5,0,13.4,5.9,13.4,13.4c0,7.5-5.9,13.4-13.4,13.4c0,0,0,0,0,0c-3.6,0-7-1.4-9.5-3.9C52.2,60.8,50.8,57.4,50.8,53.8z"/>
-	<path d="M111.8,26.5c-0.3-1.7-1.4-3.2-2.9-3.7L65.1,8.6c-0.8-0.3-1.6-0.3-2.4,0L18.9,22.8c-1.6,0.5-2.7,2.1-2.7,3.8l0,55.4
-		c0.4,3.1,4.4,19.4,46.1,38.9c0.6,0.3,1.1,0.3,1.6,0.3c0.5,0,1.1,0,1.6-0.3c41.7-19.6,45.8-35.9,46.1-39L111.8,26.5z M103.4,29.6
-		v51.8c-0.2,0.8-4.1,14.3-39.7,31.4C27.3,95.3,24.2,81.9,24.1,81.4V29.6l39.7-13.1L103.4,29.6z"/>
-</g>
-</svg>

+ 0 - 11
src/assets/svg/global/标签管理.svg

@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 26.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
-<path d="M71.6,127.9c-2.7,0-5.3-1.1-7.2-3L3.9,61.8c-1.8-1.9-3.5-4.2,6.2-44.2c1.1-4.8,4.9-8.4,9.8-9.3c39.8-6.7,41.6-5.2,43.4-3.3
-	l60.4,63.2c3.9,4.9,3.2,12-1.5,16l-41.6,40C78.2,126.6,75,127.9,71.6,127.9z M10.6,56.9l59.6,62.4c0.4,0.3,0.9,0.5,1.4,0.5
-	c1.3-0.1,2.5-0.6,3.4-1.5l41.5-40c1.7-1.6,2.1-3.8,1.3-4.6L58.1,11.5c-12.4,0.7-24.7,2.3-36.8,5c-1.6,0.3-2.9,1.5-3.3,3.1
-	C14.6,31.8,12.1,44.3,10.6,56.9z"/>
-<path d="M44.3,56.5c-7.7,0-13.9-6.2-13.9-13.9s6.2-13.9,13.9-13.9s13.9,6.2,13.9,13.9c0,0,0,0.1,0,0.1C58.2,50.3,52,56.5,44.3,56.5z
-	 M44.3,37c-3.1,0-5.7,2.5-5.7,5.7s2.5,5.7,5.7,5.7s5.7-2.5,5.7-5.7S47.5,37,44.3,37L44.3,37z"/>
-</svg>

File diff suppressed because it is too large
+ 0 - 1
src/assets/svg/global/水军水手.svg


+ 0 - 23
src/assets/svg/global/港岙口.svg

@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 26.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
-<g>
-	<path d="M124.5,98.9l0-0.4c-0.2-2.1-2-3.7-4.2-3.7h-3.1l-9.3-56.7h15.5v-8.4h-13.4l0-15.1l0-0.4c0-0.2-0.1-0.4-0.1-0.5
-		c-0.6-2.2-2.8-3.6-5.1-3L28.1,29.7h-1.3v8.4h3.6v7.5l-0.8,0C23.6,46,18.9,51,18.9,57l0,7.3l0,0.4c0.2,2.1,2,3.7,4.2,3.7l21.7,0
-		l0.4,0c2.1-0.2,3.7-2,3.7-4.2l0-7.3l0-0.6c-0.3-5.6-4.6-10.1-10.1-10.7v-7.6h44.1l-9.3,56.7l-4,0l-0.4,0c-2.1,0.2-3.7,2-3.7,4.2
-		l0,16.4l0,0.4c0.2,2.1,2,3.7,4.2,3.7l50.7,0l0.4,0c2.1-0.2,3.7-2,3.7-4.2L124.5,98.9z M40.5,57l0,3H27.2l0-3l0-0.4
-		c0.2-1.6,1.5-2.7,3-2.7h0h7.2l0.6,0.1C39.5,54.3,40.5,55.6,40.5,57z M62.6,29.7l38.9-9.7l0,9.7H62.6z M99.1,57.6l3.3-1.3l0.5,3.2
-		L99.1,57.6z M95.3,78.6l9.8-5.3l1.7,10.6L95.3,78.6z M85.4,74.5l2.2-13.4l11.6,6L85.4,74.5z M84.1,82.7l24.5,11.2l0.1,0.9H82.1
-		L84.1,82.7z M101,47.9L89,52.5l2.4-14.4h8L101,47.9z M116.1,103.1v8H73.8v-8H116.1z"/>
-	<path d="M60.9,103.8l-1.5,0.1c-2.1,0.2-3.9,1.2-5.2,2.9c-0.3,0.3-0.7,0.5-1.2,0.5c0,0,0,0,0,0c-0.5,0-1-0.2-1.4-0.7
-		c-0.2-0.2-0.4-0.5-0.6-0.7l-0.2-0.2l5.5-12.3l0.2-0.4c0.1-0.4,0.2-0.8,0.2-1.2c0-2.3-1.9-4.2-4.2-4.2l-41.1,0l-0.4,0
-		c-0.4,0-0.9,0.2-1.3,0.3c-1,0.5-1.8,1.3-2.2,2.3c-0.4,1-0.4,2.2,0.1,3.2l5.9,12.9c-0.1,0.1-0.2,0.2-0.2,0.3
-		c-0.3,0.4-0.8,0.6-1.2,0.5c-0.5,0-1-0.3-1.4-0.7c-1.3-1.7-3.5-2.8-5.7-2.8H4.1v6.6l-0.5,0l0.5,1.2l0.2,0.2c2,2.2,4.6,3.5,7.4,3.7
-		c0.1,0,0.3,0,0.4,0c2.3,0,4.6-0.8,6.4-2.3c2.1,1.7,4.5,2.5,7.1,2.3c2.5,0.1,5-0.7,7-2.3c2.1,1.7,4.6,2.5,7.1,2.3
-		c2.6,0.2,5-0.7,7-2.3c2,1.6,4.4,2.4,6.9,2.3c2.7-0.1,5.2-1.3,7.1-3.5c0.2-0.2,0.5-0.6,0.3-1V103.8z M32.5,103.8
-		c-2.5-0.2-5,0.9-6.5,2.9c-0.2,0.2-0.4,0.3-0.6,0.4c-0.3-0.1-0.5-0.3-0.8-0.5c-0.2-0.2-0.4-0.5-0.6-0.7l-0.4-0.4
-		c-0.6-0.5-1.3-0.9-2-1.2l-3.8-8.4H46l-4.1,9.1c-0.7,0.5-1.3,1-1.8,1.6c-0.2,0.2-0.4,0.3-0.6,0.4c-0.3-0.1-0.5-0.3-0.7-0.5
-		c-0.2-0.2-0.4-0.5-0.6-0.7l-0.4-0.4C36.3,104.3,34.4,103.7,32.5,103.8z"/>
-</g>
-</svg>

+ 0 - 13
src/assets/svg/global/用户管理.svg

@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 26.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
-<g>
-	<path d="M68.7,97.9c0,2.3,1.8,4.2,4.2,4.2h31.1c2.3,0,4.2-1.8,4.2-4.2s-1.8-4.2-4.2-4.2H72.9C70.6,93.7,68.7,95.5,68.7,97.9z"/>
-	<path d="M87.5,78c1.1,0,2.2-0.4,3-1.2c0.8-0.8,1.3-1.8,1.3-3c0-1.1-0.4-2.2-1.2-3c-5.5-5.7-11.8-9.8-18.8-12.4
-		c7.2-5.3,11.5-13.5,11.5-22.5c0-15.4-12.5-27.9-27.9-27.9C40.1,8.1,27.6,20.6,27.6,36c0,8.9,4.4,17.3,11.6,22.5
-		C18.3,66.2,3.9,88.4,3.9,113c0,2.3,1.8,4.2,4.2,4.2s4.2-1.8,4.2-4.2c0-27.1,19.4-49.2,43.3-49.2c10.8,0,21.1,4.6,29.1,12.8
-		C85.3,77.5,86.4,78,87.5,78z M75,36c0,10.8-8.8,19.5-19.5,19.5S36,46.8,36,36s8.8-19.5,19.5-19.5S75,25.3,75,36z"/>
-	<path d="M122.7,109.4H72.9c-2.3,0-4.2,1.8-4.2,4.2s1.8,4.2,4.2,4.2h49.8c2.3,0,4.2-1.8,4.2-4.2S125.1,109.4,122.7,109.4z"/>
-</g>
-</svg>

File diff suppressed because it is too large
+ 0 - 1
src/assets/svg/global/网络管理.svg


+ 0 - 13
src/assets/svg/global/船舶管理.svg

@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 26.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 144.1 128" style="enable-background:new 0 0 144.1 128;" xml:space="preserve">
-<path d="M44.2,50.3h17.5c2.4,0,4.4,2,4.4,4.4l0,0c0,2.4-2,4.4-4.4,4.4H44.2c-2.4,0-4.4-2-4.4-4.4l0,0C39.8,52.3,41.8,50.3,44.2,50.3
-	z"/>
-<path d="M110.5,116.6l26.2-40.7c1.9-2.9-0.2-6.7-3.7-6.7h-21.9V35.6c0-2.4-2-4.4-4.4-4.4H70.2V15.3c0-2.4-2-4.4-4.4-4.4h-26
-	c-2.4,0-4.4,2-4.4,4.4v16H25.1c-2.4,0-4.4,2-4.4,4.4v33.6H10.5c-2.9,0-5,2.8-4.2,5.6l11.8,40.6c0.5,1.9,2.2,3.2,4.2,3.2h84.5
-	C108.2,118.6,109.7,117.9,110.5,116.6z M48.6,19.7h8.6c2.4,0,4.4,2,4.4,4.4v7.3H44.2V24C44.2,21.6,46.1,19.7,48.6,19.7z M34,40h63.9
-	c2.4,0,4.4,2,4.4,4.4v5.9H82c-2.4,0-4.4,2-4.4,4.4l0,0c0,2.4,2,4.4,4.4,4.4h20.4v10.2H29.6V44.4C29.6,42,31.6,40,34,40z M120.7,84.7
-	l-15,23.3c-0.8,1.2-2.2,2-3.7,2H29.1c-2,0-3.7-1.3-4.2-3.2l-6.4-23.3c-0.8-2.8,1.3-5.5,4.2-5.5h94.2
-	C120.3,77.9,122.5,81.7,120.7,84.7z"/>
-</svg>

File diff suppressed because it is too large
+ 0 - 1
src/assets/svg/global/菜单管理.svg


File diff suppressed because it is too large
+ 0 - 1
src/assets/svg/global/调度管理.svg


+ 0 - 12
src/assets/svg/global/部门管理.svg

@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 26.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
-<path d="M118.7,83.2h-7.8L95,62c-0.7-1-1.7-1.5-2.9-1.5H69.1V47.9h28.3c5,0,9-4,9-9V28.2c0-5-4-9-9-9h-64c-5,0-9,4-9,9v10.7
-	c0,5,4,9,9,9h28.3v12.7h-23c-1.2,0-2.3,0.5-3,1.5L19.9,83.2h-7.8c-2.1,0-3.7,1.6-3.7,3.7v21.3c0,2.1,1.6,3.7,3.7,3.7h21.3
-	c2.1,0,3.7-1.6,3.7-3.7V86.9c0-2.1-1.6-3.7-3.7-3.7h-4.3l11.5-15.3h21.2v15.3h-7c-2.1,0-3.7,1.6-3.7,3.7v21.3c0,2.1,1.6,3.7,3.7,3.7
-	h21.3c2.1,0,3.7-1.6,3.7-3.7V86.9c0-2.1-1.6-3.7-3.7-3.7h-7V67.9h21.1l11.6,15.3h-4.3c-2.1,0-3.7,1.6-3.7,3.7v21.3
-	c0,2.1,1.6,3.7,3.7,3.7h21.3c2.1,0,3.7-1.6,3.7-3.7V86.9C122.4,84.8,120.8,83.2,118.7,83.2z M101.1,104.5v-14h14v14H101.1z
-	 M72.4,90.5v14h-14v-14H72.4z M99.1,28.2v10.7c0,0.9-0.7,1.7-1.7,1.7h-64c-0.9,0-1.7-0.7-1.7-1.7V28.2c0-0.9,0.7-1.7,1.7-1.7h64
-	C98.3,26.5,99.1,27.3,99.1,28.2z M15.7,104.5v-14h14v14H15.7z"/>
-</svg>

+ 0 - 23
src/assets/svg/global/配置管理.svg

@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 26.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
-<g>
-	<path d="M73.8,73h10.8l0.2-0.7c0.9-2.4,1.4-5,1.4-7.6c0-12.2-10.1-22.2-22.5-22.2s-22.5,9.9-22.5,22.2s10.1,22.2,22.5,22.2h1v-9.3
-		h-1c-7.2,0-13.1-5.8-13.1-12.8c0-7.1,5.9-12.8,13.1-12.8c7.2,0,13.1,5.7,13.1,12.8c0,2.4-0.7,4.7-1.9,6.7L73.8,73z"/>
-	<path d="M61.9,107l-5.1,0l-1.5-11l-2.7-1c-3.6-1.3-7-3.2-10-5.6l-2.2-1.8L30,91.9L23,80l8.9-6.8l-0.5-2.8c-0.3-1.9-0.5-3.8-0.5-5.7
-		c0-1.9,0.2-3.8,0.5-5.7l0.5-2.8l-9-6.8l6.9-11.7L40.4,42l2.2-1.8c3-2.5,6.3-4.4,10-5.7l2.7-1l1.5-11h13.8l1.6,11l2.7,1
-		c3.6,1.3,7,3.2,10,5.6L87,42l10.4-4.4l7,11.9l-9,6.8l0.5,2.8c0.7,3.8,0.7,7.6,0,11.3L95.4,73h15.2l-4.9-3.8c0.3-3,0.3-6,0-8.9
-		l5.5-4.2c3.3-2.1,4.3-6.3,2.4-9.7l-8.8-15c-2-3.3-6.2-4.5-9.6-2.8l-6.5,2.6c-2.5-1.8-5.1-3.3-7.9-4.5L79.7,20
-		c-0.2-3.8-3.4-6.9-7.3-6.9H54.9c0,0-0.1,0-0.1,0c-3.9,0-7,3-7.2,6.8l-0.9,6.9c-2.8,1.2-5.5,2.7-7.9,4.5l-6.4-2.6
-		c-3.4-1.7-7.7-0.5-9.6,2.8l-8.8,15c-1.9,3.4-0.9,7.6,2.3,9.6l5.6,4.2c-0.4,3-0.4,6,0,8.9l-5.5,4.2c-3.3,2-4.3,6.4-2.4,9.7l8.8,15
-		c2,3.3,6.2,4.5,9.6,2.8l6.5-2.6c2.4,1.8,5.1,3.3,7.9,4.5l0.9,6.8c0.2,3.9,3.4,6.8,7.2,6.8c0,0,0.1,0,0.1,0h7c1.5,0,2.8-1.2,2.8-2.8
-		v-3.9c0-0.7-0.3-1.4-0.8-2C63.3,107.3,62.6,107,61.9,107z"/>
-	<path d="M113.4,92.7H72.7c-1.5,0-2.7,1.2-2.7,2.7v3.9c0,1.5,1.2,2.6,2.7,2.6h40.7c1.5,0,2.7-1.2,2.7-2.7v-3.9
-		C116.1,93.9,114.9,92.7,113.4,92.7z"/>
-	<path d="M113.4,78.2H72.7c-1.5,0-2.7,1.2-2.7,2.6v3.9c0,1.5,1.2,2.6,2.7,2.6h40.7c0,0,0,0,0,0c1.4,0,2.6-1.2,2.7-2.6v-3.9
-		C116.1,79.4,114.9,78.2,113.4,78.2z"/>
-	<path d="M113.4,107.2H72.7c0,0,0,0,0,0c-1.5,0-2.6,1.2-2.7,2.7v3.9c0,1.5,1.2,2.6,2.7,2.6h40.7h0c1.5,0,2.6-1.2,2.7-2.7v-3.9
-		C116.1,108.4,114.9,107.2,113.4,107.2z"/>
-</g>
-</svg>

+ 0 - 22
src/assets/svg/global/随船人员.svg

@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 26.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
-<style type="text/css">
-	.st0{stroke:#000000;stroke-miterlimit:10;}
-</style>
-<path class="st0" d="M113.5,112.1c-3.9,8.9-14.3,13-23.1,9.1c-4.1-1.7-7.4-5-9.1-9.1l-1.7-4.1h9.1l-1.4,3c1.6,2.7,4.2,4.7,7.3,5.4
-	v-9.8h-4.4c-1.6,0-3-1.4-3-3c0-1.6,1.4-3,3-3h4.4v-2.3c-2.8-1.6-3.8-5.2-2.1-8c1.6-2.8,5.2-3.8,8-2.1c2.8,1.6,3.8,5.2,2.1,8
-	c-0.5,0.9-1.2,1.6-2.1,2.1v2.3h4.4c1.6,0,3,1.4,3,3c0,1.6-1.4,3-3,3l0,0h-4.4v9.8c3.1-0.7,5.7-2.7,7.3-5.4l-1.4-3h9.1L113.5,112.1z"
-	/>
-<g>
-	<path d="M36.1,47.1h4.5c-0.3,1.5-0.5,3.1-0.5,4.9c0,15.8,12.9,28.7,28.7,28.7c15.8,0,28.7-12.9,28.7-28.7c0-1.8-0.2-3.4-0.5-4.9
-		l4.1,0c1.4-0.1,3-1.7,3-2.9C103.3,24.3,90.6,4.2,68,4.2C45.2,4.2,33.4,24,32,42.4c-0.1,1.1,0.8,2.4,1.5,3.3
-		C34,46.2,35,47.1,36.1,47.1z M70.2,34.1l-4.1,0l-5.3,0.2c-6.9,0.5-11.6,1.9-14.9,4.3h-4.9c2.7-15.8,13.3-26,27-26h0.5
-		C82,12.9,92.3,23.1,95,38.6h-3.3c-3.2-2.4-7.7-3.7-14.2-4.3l-0.8-0.1L70.2,34.1z M52.3,44.6c0.8-0.4,1.6-0.7,2.5-0.9l0.5-0.1
-		c1-0.2,2.2-0.4,3.4-0.6l1.7-0.2l7-0.3h1.5l5,0.1l4.2,0.3l2.8,0.4c0.5,0.1,0.9,0.2,1.3,0.3l0.5,0.1c0.9,0.2,1.9,0.6,2.7,1
-		c2.3,1.1,3.7,2.7,3.7,7.4c0,11.2-9.1,20.2-20.2,20.2c-11.2,0-20.2-9.1-20.2-20.2C48.6,47.2,50,45.7,52.3,44.6z"/>
-	<path d="M76.4,117.1c0-0.6,0-1.2,0-1.7H19.8c1.7-13.7,13.2-23.9,27.1-23.9h36.7c1.8-3,4-5.9,6.4-8.4c-0.3,0-0.6,0-0.9,0H46.8
-		c-9.5,0-18.5,3.7-25.3,10.5s-10.5,15.7-10.5,25.3v5h65.7C76.6,121.6,76.4,119.4,76.4,117.1z"/>
-</g>
-</svg>

+ 9 - 1
src/components/easyMap/func/base-draw.ts

@@ -86,7 +86,15 @@ export const drawViews = (map, arr) => {
         map.addLayer(_vector);
     }
     _source.clear() //  清空标绘
-    const features = arr.map(v => {
+    const features = arr.filter(v => {
+         try {
+             new format.WKT().readFeature(v.wkt)
+             return true
+         } catch (e) {
+             console.error('错误坐标:' + v.wkt)
+             return false
+         }
+    }).map(v => {
         const feat: any = new format.WKT().readFeature(v.wkt)
         const type = feat.getGeometry().getType()
         const {

+ 63 - 10
src/components/easyMap/index.vue

@@ -26,16 +26,46 @@
               v-model:visible="drawEditsConfig.showPosition"
           >
             <div class="popover">
-                <el-input
-                    v-model="drawEditsConfig.wkt"
+              <CusForm ref="ref_drawEditsForm" labelWidth="0">
+                <CusFormColumn
+                    ref="ref_drawEditsWkt"
+                    required
+                    :span="24"
                     type="textarea"
                     :rows="4"
-                    placeholder="请输入经纬度"
-                ></el-input>
-                <div class="footer">
-                  <el-button size="small" type="primary" @click="changeWkt">保存</el-button>
-                  <el-button size="small" @click="drawEditsConfig.showPosition = false">取消</el-button>
-                </div>
+                    v-model:param="drawEditsConfig.wkt"
+                    :placeholder="drawEditsWktPlaceholderCpt"
+                    :rules="[
+                      {
+                        handle: (val) => drawEditsConfig.featureType !== 'Point' || (drawEditsConfig.featureType === 'Point' && $easyMap.validWkt.Point(val)),
+                        message: '点位WKT坐标格式错误'
+                      },
+                      {
+                        handle: (val) => drawEditsConfig.featureType !== 'LineString' || (drawEditsConfig.featureType === 'LineString' && $easyMap.validWkt.LineString(val)),
+                        message: '线段WKT坐标格式错误'
+                      },
+                      {
+                        handle: (val) => drawEditsConfig.featureType !== 'Polygon' || (drawEditsConfig.featureType === 'Polygon' && $easyMap.validWkt.Polygon(val)),
+                        message: '区域WKT坐标格式错误'
+                      },
+                      {
+                        handle: (val) => drawEditsConfig.featureType !== 'Polygon' || (drawEditsConfig.featureType === 'Polygon' && $easyMap.validWkt.PolygonKinks(val)),
+                        message: '区域坐标不可自相交'
+                      },
+                    ]"
+                />
+              </CusForm>
+
+<!--              <el-input-->
+<!--                  v-model="drawEditsConfig.wkt"-->
+<!--                  type="textarea"-->
+<!--                  :rows="4"-->
+<!--                  placeholder="请输入经纬度"-->
+<!--              ></el-input>-->
+              <div class="footer">
+                <el-button size="small" type="primary" @click="changeWkt">保存</el-button>
+                <el-button size="small" @click="drawEditsConfig.showPosition = false">取消</el-button>
+              </div>
             </div>
             <template #reference>
               <div class="reference">
@@ -127,6 +157,7 @@ import DrawFunc, {DrawClear} from "./func/draw";
 import LocationFunc from "./func/location";
 import ToolsLocationCom from './component/tools/tools-location.vue'
 import * as BaseDraw from './func/base-draw'
+import {ElMessage, ElMessageBox} from "element-plus";
 
 export default defineComponent({
   name: "EasyMap",
@@ -244,10 +275,30 @@ export default defineComponent({
       state.drawEditsConfig.featureType = val
       drawEdits(state.drawEditsConfig, state.drawEditsConfig.emitFunc)
     }
+    const ref_drawEditsForm = ref();
     const changeWkt = () => {
       //  缺少wkt格式校验
-      drawEdits(state.drawEditsConfig, state.drawEditsConfig.emitFunc)
+      ref_drawEditsForm.value.submit().then(() => {
+        drawEdits(state.drawEditsConfig, state.drawEditsConfig.emitFunc)
+      }).catch((e) => {
+        ElMessage({
+          message: e[0].message,
+          grouping: true,
+          type: 'warning',
+        })
+      })
     }
+    const drawEditsWktPlaceholderCpt = computed(() => {
+      let str = ''
+      if (state.drawEditsConfig.featureType === 'Point') {
+        str = '请输入点位WKT格式坐标,例:POINT(109.1 20.5)'
+      } else if (state.drawEditsConfig.featureType === 'LineString') {
+        str = '请输入线段WKT格式坐标,例:LINESTRING(109.2 19.5,109.6 19.1,110.2 19.4)'
+      } else if (state.drawEditsConfig.featureType === 'Polygon') {
+        str = '请输入区域WKT格式坐标,例:POLYGON((109.7 19.3,109.5 19.1,109.8 19.1,109.7 19.3))'
+      }
+      return str
+    })
     onMounted(() => {
       nextTick(() => {});
     });
@@ -264,7 +315,9 @@ export default defineComponent({
       handleOlMapLoad,
       judgeBaseLayerActive,
       drawEditsSwitchFeatureType,
-      changeWkt
+      changeWkt,
+      ref_drawEditsForm,
+      drawEditsWktPlaceholderCpt
     };
   },
 });

+ 3 - 0
src/components/vue-drag-resize/index.vue

@@ -0,0 +1,3 @@
+<template src="./vue-drag-resize.html"></template>
+<script src="./vue-drag-resize.js"></script>
+<style src="./vue-drag-resize.css"></style>

+ 52 - 0
src/components/vue-drag-resize/vue-drag-resize.css

@@ -0,0 +1,52 @@
+.vdr {
+    position: absolute;
+    box-sizing: border-box;
+}
+.vdr.active:before{
+    content: '';
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    top: 0;
+    left: 0;
+    box-sizing: border-box;
+    /*outline: 1px dashed #d6d6d6;*/
+}
+.vdr-stick {
+    box-sizing: border-box;
+    position: absolute;
+    font-size: 1px;
+    background: #ffffff;
+    border: 1px solid #6c6c6c;
+    box-shadow: 0 0 2px #bbb;
+}
+.inactive .vdr-stick {
+    display: none;
+}
+.vdr-stick-tl, .vdr-stick-br {
+    cursor: nwse-resize;
+}
+.vdr-stick-tm, .vdr-stick-bm {
+    left: 50%;
+    cursor: ns-resize;
+}
+.vdr-stick-tr, .vdr-stick-bl {
+    cursor: nesw-resize;
+}
+.vdr-stick-ml, .vdr-stick-mr {
+    top: 50%;
+    cursor: ew-resize;
+}
+.vdr-stick.not-resizable{
+    display: none;
+}
+.content-container{
+    display: block;
+    position: relative;
+}
+
+.vdr-stick {
+    /*background-color: transparent;*/
+    /*box-shadow: none;*/
+    /*border-color: transparent;*/
+}

+ 20 - 0
src/components/vue-drag-resize/vue-drag-resize.html

@@ -0,0 +1,20 @@
+<div class="vdr" :style="positionStyle"
+     :class="`${(active || isActive) ? 'active' : 'inactive'} ${contentClass ? contentClass: ''}`"
+     @mousedown="bodyDown($event)"
+     @touchstart="bodyDown($event)"
+     @touchend="up($event)">
+    <div :style="sizeStyle" class="content-container" ref="container">
+        <slot></slot>
+    </div>
+    <template v-if="resize">
+        <div
+                v-for="stick in sticks"
+                class="vdr-stick"
+                :class="['vdr-stick-' + stick, isResizable ? '' : 'not-resizable']"
+                @mousedown.stop.prevent="stickDown(stick, $event)"
+                @touchstart.stop.prevent="stickDown(stick, $event)"
+                :style="vdrStick(stick)">
+        </div>
+    </template>
+
+</div>

+ 858 - 0
src/components/vue-drag-resize/vue-drag-resize.js

@@ -0,0 +1,858 @@
+const styleMapping = {
+    y: {
+        t: 'top',
+        m: 'marginTop',
+        b: 'bottom',
+    },
+    x: {
+        l: 'left',
+        m: 'marginLeft',
+        r: 'right',
+    },
+};
+
+function addEvents(events) {
+    events.forEach((cb, eventName) => {
+        document.documentElement.addEventListener(eventName, cb);
+    });
+}
+
+function removeEvents(events) {
+    events.forEach((cb, eventName) => {
+        document.documentElement.removeEventListener(eventName, cb);
+    });
+}
+
+export default {
+    name: 'vue-drag-resize',
+
+    emits: ['clicked', 'dragging', 'dragstop', 'resizing', 'resizestop', 'activated', 'deactivated'],
+
+    props: {
+        stickSize: {
+            type: Number, default: 8,
+        },
+        parentScaleX: {
+            type: Number, default: 1,
+        },
+        parentScaleY: {
+            type: Number, default: 1,
+        },
+        isActive: {
+            type: Boolean, default: false,
+        },
+        preventActiveBehavior: {
+            type: Boolean, default: false,
+        },
+        isDraggable: {
+            type: Boolean, default: true,
+        },
+        isResizable: {
+            type: Boolean, default: true,
+        },
+        aspectRatio: {
+            type: Boolean, default: false,
+        },
+        parentLimitation: {
+            type: Boolean, default: false,
+        },
+        snapToGrid: {
+            type: Boolean, default: false,
+        },
+        gridX: {
+            type: Number,
+            default: 50,
+            validator(val) {
+                return val >= 0;
+            },
+        },
+        gridY: {
+            type: Number,
+            default: 50,
+            validator(val) {
+                return val >= 0;
+            },
+        },
+        parentW: {
+            type: Number,
+            default: 0,
+            validator(val) {
+                return val >= 0;
+            },
+        },
+        parentH: {
+            type: Number,
+            default: 0,
+            validator(val) {
+                return val >= 0;
+            },
+        },
+        // w: {
+        //     type: [String, Number],
+        //     default: 200,
+        //     validator(val) {
+        //         return (typeof val === 'string') ? val === 'auto' : val >= 0;
+        //     },
+        // },
+        // h: {
+        //     type: [String, Number],
+        //     default: 200,
+        //     validator(val) {
+        //         return (typeof val === 'string') ? val === 'auto' : val >= 0;
+        //     },
+        // },
+        minw: {
+            type: Number,
+            default: 50,
+            validator(val) {
+                return val >= 0;
+            },
+        },
+        minh: {
+            type: Number,
+            default: 50,
+            validator(val) {
+                return val >= 0;
+            },
+        },
+        // x: {
+        //     type: Number,
+        //     default: 0,
+        //     validator(val) {
+        //         return typeof val === 'number';
+        //     },
+        // },
+        // y: {
+        //     type: Number,
+        //     default: 0,
+        //     validator(val) {
+        //         return typeof val === 'number';
+        //     },
+        // },
+        z: {
+            type: [String, Number],
+            default: 'auto',
+            validator(val) {
+                return (typeof val === 'string') ? val === 'auto' : val >= 0;
+            },
+        },
+        dragHandle: {
+            type: String,
+            default: null,
+        },
+        dragCancel: {
+            type: String,
+            default: null,
+        },
+        sticks: {
+            type: Array,
+            default() {
+                return ['tl', 'tm', 'tr', 'mr', 'br', 'bm', 'bl', 'ml'];
+            },
+        },
+        axis: {
+            type: String,
+            default: 'both',
+            validator(val) {
+                return ['x', 'y', 'both', 'none'].indexOf(val) !== -1;
+            },
+        },
+        contentClass: {
+            type: String,
+            required: false,
+            default: '',
+        },
+        layout: {
+            required: true
+        },
+        resize: {
+            type: Boolean,
+            required: false,
+            default: true,
+        }
+    },
+
+    data() {
+        return {
+            fixAspectRatio: null,
+            active: null,
+            zIndex: null,
+            parentWidth: null,
+            parentHeight: null,
+            left: null,
+            top: null,
+            right: null,
+            bottom: null,
+            minHeight: null,
+        };
+    },
+
+    beforeCreate() {
+        this.stickDrag = false;
+        this.bodyDrag = false;
+        this.dimensionsBeforeMove = { pointerX: 0, pointerY: 0, x: 0, y: 0, w: 0, h: 0 };
+        this.limits = {
+            left: { min: null, max: null },
+            right: { min: null, max: null },
+            top: { min: null, max: null },
+            bottom: { min: null, max: null },
+        };
+
+        this.currentStick = null;
+    },
+
+    mounted() {
+        this.initResize()
+        window.addEventListener('resize', this.initResize)
+        this.domEvents = new Map([
+            ['mousemove', this.move],
+            ['mouseup', this.up],
+            ['mouseleave', this.up],
+            ['mousedown', this.deselect],
+            ['touchmove', this.move],
+            ['touchend', this.up],
+            ['touchcancel', this.up],
+            ['touchstart', this.up],
+        ]);
+
+        addEvents(this.domEvents);
+
+        if (this.dragHandle) {
+            [...this.$el.querySelectorAll(this.dragHandle)].forEach((dragHandle) => {
+                dragHandle.setAttribute('data-drag-handle', this._uid);
+            });
+        }
+
+        if (this.dragCancel) {
+            [...this.$el.querySelectorAll(this.dragCancel)].forEach((cancelHandle) => {
+                cancelHandle.setAttribute('data-drag-cancel', this._uid);
+            });
+        }
+    },
+
+    beforeDestroy() {
+        removeEvents(this.domEvents);
+        window.removeEventListener('resize', this.initResize)
+    },
+
+    methods: {
+        initResize(notEmit) {
+            this.parentElement = this.$el.parentNode;
+            this.parentWidth = this.parentW ? this.parentW : this.parentElement.clientWidth;
+            this.parentHeight = this.parentH ? this.parentH : this.parentElement.clientHeight;
+            if (this.layout.left || !this.layout.right) {
+                this.left = this.layout.left || 0;
+            } else {
+                this.left = this.parentWidth - (this.layout.width || 0) - (this.layout.right || 0)
+            }
+            if (this.layout.top || !this.layout.bottom) {
+                this.top = this.layout.top || 0;
+            } else {
+                this.top = this.parentHeight - (this.layout.height || 0) - (this.layout.right || 0)
+            }
+            this.right = this.parentWidth - (this.layout.width === 'auto' ? this.$refs.container.scrollWidth : this.layout.width) - this.left;
+            this.bottom = this.parentHeight - (this.layout.height === 'auto' ? this.$refs.container.scrollHeight : this.layout.height) - this.top;
+            if (this.layout.width === 'max') {
+                this.left = 0
+                this.right = 0
+            }
+            if (this.layout.height === 'max') {
+                this.top = 0;
+                this.bottom = 0;
+            }
+            if (this.right < 0) {
+                this.left += this.right
+                this.right = 0
+            }
+            if (this.left < 0) {
+                this.right += this.left
+                this.left = 0
+            }
+            if (this.bottom < 0) {
+                this.top += this.bottom
+                this.bottom = 0
+            }
+            if (this.top < 0) {
+                this.bottom += this.top
+                this.top = 0
+            }
+            if (!notEmit) {
+                this.$emit('resizing', this.rect);
+            }
+        },
+        deselect() {
+            if (this.preventActiveBehavior) {
+                return;
+            }
+            this.active = false;
+        },
+
+        move(ev) {
+            if (!this.stickDrag && !this.bodyDrag) {
+                return;
+            }
+
+            ev.stopPropagation();
+
+            const pageX = typeof ev.pageX !== 'undefined' ? ev.pageX : ev.touches[0].pageX;
+            const pageY = typeof ev.pageY !== 'undefined' ? ev.pageY : ev.touches[0].pageY;
+
+            const { dimensionsBeforeMove } = this;
+
+            const delta = {
+                x: (dimensionsBeforeMove.pointerX - pageX) / this.parentScaleX,
+                y: (dimensionsBeforeMove.pointerY - pageY) / this.parentScaleY,
+            };
+
+            if (this.stickDrag) {
+                this.stickMove(delta);
+            }
+
+            if (this.bodyDrag) {
+                if (this.axis === 'x') {
+                    delta.y = 0;
+                } else if (this.axis === 'y') {
+                    delta.x = 0;
+                } else if (this.axis === 'none') {
+                    return;
+                }
+                this.bodyMove(delta);
+            }
+        },
+
+        up(ev) {
+            if (this.stickDrag) {
+                this.stickUp(ev);
+            } else if (this.bodyDrag) {
+                this.bodyUp(ev);
+            }
+        },
+
+        bodyDown(ev) {
+            if (['INPUT', 'TEXTAREA', 'CANVAS'].includes(ev.target.nodeName) || ev.target.className.includes('el-slider')) {
+                return;
+            }
+            this.initResize()
+            const { target, button } = ev;
+
+            if (!this.preventActiveBehavior) {
+                this.active = true;
+            }
+
+            if (button && button !== 0) {
+                return;
+            }
+
+            this.$emit('clicked', ev);
+
+            if (!this.active) {
+                return;
+            }
+
+            if (this.dragHandle && target.getAttribute('data-drag-handle') !== this._uid.toString()) {
+                return;
+            }
+
+            if (this.dragCancel && target.getAttribute('data-drag-cancel') === this._uid.toString()) {
+                return;
+            }
+
+            if (typeof ev.stopPropagation !== 'undefined') {
+                ev.stopPropagation();
+            }
+
+            if (typeof ev.preventDefault !== 'undefined') {
+                ev.preventDefault();
+            }
+
+            if (this.isDraggable) {
+                this.bodyDrag = true;
+            }
+
+            const pointerX = typeof ev.pageX !== 'undefined' ? ev.pageX : ev.touches[0].pageX;
+            const pointerY = typeof ev.pageY !== 'undefined' ? ev.pageY : ev.touches[0].pageY;
+
+            this.saveDimensionsBeforeMove({ pointerX, pointerY });
+
+            if (this.parentLimitation) {
+                this.limits = this.calcDragLimitation();
+            }
+        },
+
+        bodyMove(delta) {
+            const { dimensionsBeforeMove, parentWidth, parentHeight, gridX, gridY, width, height } = this;
+
+            let newTop = dimensionsBeforeMove.top - delta.y;
+            let newBottom = dimensionsBeforeMove.bottom + delta.y;
+            let newLeft = dimensionsBeforeMove.left - delta.x;
+            let newRight = dimensionsBeforeMove.right + delta.x;
+
+            if (this.snapToGrid) {
+                let alignTop = true;
+                let alignLeft = true;
+
+                let diffT = newTop - Math.floor(newTop / gridY) * gridY;
+                let diffB = (parentHeight - newBottom) - Math.floor((parentHeight - newBottom) / gridY) * gridY;
+                let diffL = newLeft - Math.floor(newLeft / gridX) * gridX;
+                let diffR = (parentWidth - newRight) - Math.floor((parentWidth - newRight) / gridX) * gridX;
+
+                if (diffT > (gridY / 2)) {
+                    diffT -= gridY;
+                }
+                if (diffB > (gridY / 2)) {
+                    diffB -= gridY;
+                }
+                if (diffL > (gridX / 2)) {
+                    diffL -= gridX;
+                }
+                if (diffR > (gridX / 2)) {
+                    diffR -= gridX;
+                }
+
+                if (Math.abs(diffB) < Math.abs(diffT)) {
+                    alignTop = false;
+                }
+                if (Math.abs(diffR) < Math.abs(diffL)) {
+                    alignLeft = false;
+                }
+
+                newTop -= (alignTop ? diffT : diffB);
+                newBottom = parentHeight - height - newTop;
+                newLeft -= (alignLeft ? diffL : diffR);
+                newRight = parentWidth - width - newLeft;
+            }
+
+            ({
+                newLeft: this.left,
+                newRight: this.right,
+                newTop: this.top,
+                newBottom: this.bottom,
+            } = this.rectCorrectionByLimit({ newLeft, newRight, newTop, newBottom }));
+
+            this.$emit('dragging', this.rect);
+        },
+
+        bodyUp() {
+            this.bodyDrag = false;
+            this.$emit('dragging', this.rect);
+            this.$emit('dragstop', this.rect);
+
+            this.dimensionsBeforeMove = { pointerX: 0, pointerY: 0, x: 0, y: 0, w: 0, h: 0 };
+
+            this.limits = {
+                left: { min: null, max: null },
+                right: { min: null, max: null },
+                top: { min: null, max: null },
+                bottom: { min: null, max: null },
+            };
+        },
+
+        stickDown(stick, ev, force = false) {
+            if ((!this.isResizable || !this.active) && !force) {
+                return;
+            }
+
+            this.stickDrag = true;
+
+            const pointerX = typeof ev.pageX !== 'undefined' ? ev.pageX : ev.touches[0].pageX;
+            const pointerY = typeof ev.pageY !== 'undefined' ? ev.pageY : ev.touches[0].pageY;
+
+            this.saveDimensionsBeforeMove({ pointerX, pointerY });
+
+            this.currentStick = stick;
+
+            this.limits = this.calcResizeLimits();
+        },
+
+        saveDimensionsBeforeMove({ pointerX, pointerY }) {
+            this.dimensionsBeforeMove.pointerX = pointerX;
+            this.dimensionsBeforeMove.pointerY = pointerY;
+
+            this.dimensionsBeforeMove.left = this.left;
+            this.dimensionsBeforeMove.right = this.right;
+            this.dimensionsBeforeMove.top = this.top;
+            this.dimensionsBeforeMove.bottom = this.bottom;
+
+            this.dimensionsBeforeMove.width = this.width;
+            this.dimensionsBeforeMove.height = this.height;
+
+            this.aspectFactor = this.width / this.height;
+        },
+
+        stickMove(delta) {
+            const {
+                currentStick,
+                dimensionsBeforeMove,
+                gridY,
+                gridX,
+                snapToGrid,
+                parentHeight,
+                parentWidth,
+            } = this;
+
+            let newTop = dimensionsBeforeMove.top;
+            let newBottom = dimensionsBeforeMove.bottom;
+            let newLeft = dimensionsBeforeMove.left;
+            let newRight = dimensionsBeforeMove.right;
+            switch(currentStick[0]) {
+                case 'b':
+                    newBottom = dimensionsBeforeMove.bottom + delta.y;
+
+                    if (snapToGrid) {
+                        newBottom = parentHeight - Math.round((parentHeight - newBottom) / gridY) * gridY;
+                    }
+
+                    break;
+
+                case 't':
+                    newTop = dimensionsBeforeMove.top - delta.y;
+
+                    if (snapToGrid) {
+                        newTop = Math.round(newTop / gridY) * gridY;
+                    }
+
+                    break;
+                default:
+                    break;
+            }
+
+            switch(currentStick[1]) {
+                case 'r':
+                    newRight = dimensionsBeforeMove.right + delta.x;
+
+                    if (snapToGrid) {
+                        newRight = parentWidth - Math.round((parentWidth - newRight) / gridX) * gridX;
+                    }
+
+                    break;
+
+                case 'l':
+                    newLeft = dimensionsBeforeMove.left - delta.x;
+
+                    if (snapToGrid) {
+                        newLeft = Math.round(newLeft / gridX) * gridX;
+                    }
+
+                    break;
+                default:
+                    break;
+            }
+
+            ({
+                newLeft,
+                newRight,
+                newTop,
+                newBottom,
+            } = this.rectCorrectionByLimit({ newLeft, newRight, newTop, newBottom }));
+
+            if (this.aspectRatio) {
+                ({
+                    newLeft,
+                    newRight,
+                    newTop,
+                    newBottom,
+                } = this.rectCorrectionByAspectRatio({ newLeft, newRight, newTop, newBottom }));
+            }
+
+            this.left = newLeft;
+            this.right = newRight;
+            this.top = newTop;
+            this.bottom = newBottom;
+
+            this.$emit('resizing', this.rect);
+        },
+
+        stickUp() {
+            this.stickDrag = false;
+            this.dimensionsBeforeMove = {
+                pointerX: 0,
+                pointerY: 0,
+                x: 0,
+                y: 0,
+                w: 0,
+                h: 0,
+            };
+            this.limits = {
+                left: { min: null, max: null },
+                right: { min: null, max: null },
+                top: { min: null, max: null },
+                bottom: { min: null, max: null },
+            };
+
+            this.$emit('resizing', this.rect);
+            this.$emit('resizestop', this.rect);
+        },
+
+        calcDragLimitation() {
+            const { parentWidth, parentHeight } = this;
+
+            return {
+                left: { min: 0, max: parentWidth - this.width },
+                right: { min: 0, max: parentWidth - this.width },
+                top: { min: 0, max: parentHeight - this.height },
+                bottom: { min: 0, max: parentHeight - this.height },
+            };
+        },
+
+        calcResizeLimits() {
+            const { aspectFactor, width, height, bottom, top, left, right } = this;
+            let { minh: minHeight, minw: minWidth } = this;
+
+            const parentLim = this.parentLimitation ? 0 : null;
+
+            if (this.aspectRatio) {
+                if (minWidth / minHeight > aspectFactor) {
+                    minHeight = minWidth / aspectFactor;
+                } else {
+                    minWidth = aspectFactor * minHeight;
+                }
+            }
+
+            const limits = {
+                left: { min: parentLim, max: left + (width - minWidth) },
+                right: { min: parentLim, max: right + (width - minWidth) },
+                top: { min: parentLim, max: top + (height - minHeight) },
+                bottom: { min: parentLim, max: bottom + (height - minHeight) },
+            };
+
+            if (this.aspectRatio) {
+                const aspectLimits = {
+                    left: {
+                        min: left - (Math.min(top, bottom) * aspectFactor) * 2,
+                        max: left + ((((height - minHeight) / 2) * aspectFactor) * 2),
+                    },
+                    right: {
+                        min: right - (Math.min(top, bottom) * aspectFactor) * 2,
+                        max: right + ((((height - minHeight) / 2) * aspectFactor) * 2),
+                    },
+                    top: {
+                        min: top - (Math.min(left, right) / aspectFactor) * 2,
+                        max: top + ((((width - minWidth) / 2) / aspectFactor) * 2),
+                    },
+                    bottom: {
+                        min: bottom - (Math.min(left, right) / aspectFactor) * 2,
+                        max: bottom + ((((width - minWidth) / 2) / aspectFactor) * 2),
+                    },
+                };
+
+                if (this.currentStick[0] === 'm') {
+                    limits.left = {
+                        min: Math.max(limits.left.min, aspectLimits.left.min),
+                        max: Math.min(limits.left.max, aspectLimits.left.max),
+                    };
+                    limits.right = {
+                        min: Math.max(limits.right.min, aspectLimits.right.min),
+                        max: Math.min(limits.right.max, aspectLimits.right.max),
+                    };
+
+                } else if (this.currentStick[1] === 'm') {
+                    limits.top = {
+                        min: Math.max(limits.top.min, aspectLimits.top.min),
+                        max: Math.min(limits.top.max, aspectLimits.top.max),
+                    };
+                    limits.bottom = {
+                        min: Math.max(limits.bottom.min, aspectLimits.bottom.min),
+                        max: Math.min(limits.bottom.max, aspectLimits.bottom.max),
+                    };
+                }
+            }
+
+            return limits;
+        },
+
+        sideCorrectionByLimit(limit, current) {
+            let value = current;
+
+            if (limit.min !== null && current < limit.min) {
+                value = limit.min;
+            } else if (limit.max !== null && limit.max < current) {
+                value = limit.max;
+            }
+
+            return value;
+        },
+
+        rectCorrectionByLimit(rect) {
+            const { limits } = this;
+            let { newRight, newLeft, newBottom, newTop } = rect;
+
+            newLeft = this.sideCorrectionByLimit(limits.left, newLeft);
+            newRight = this.sideCorrectionByLimit(limits.right, newRight);
+            newTop = this.sideCorrectionByLimit(limits.top, newTop);
+            newBottom = this.sideCorrectionByLimit(limits.bottom, newBottom);
+
+            return {
+                newLeft,
+                newRight,
+                newTop,
+                newBottom,
+            };
+        },
+
+        rectCorrectionByAspectRatio(rect) {
+            let { newLeft, newRight, newTop, newBottom } = rect;
+            const { parentWidth, parentHeight, currentStick, aspectFactor, dimensionsBeforeMove } = this;
+
+            let newWidth = parentWidth - newLeft - newRight;
+            let newHeight = parentHeight - newTop - newBottom;
+
+            if (currentStick[1] === 'm') {
+                const deltaHeight = newHeight - dimensionsBeforeMove.height;
+
+                newLeft -= (deltaHeight * aspectFactor) / 2;
+                newRight -= (deltaHeight * aspectFactor) / 2;
+            } else if (currentStick[0] === 'm') {
+                const deltaWidth = newWidth - dimensionsBeforeMove.width;
+
+                newTop -= (deltaWidth / aspectFactor) / 2;
+                newBottom -= (deltaWidth / aspectFactor) / 2;
+            } else if (newWidth / newHeight > aspectFactor) {
+                newWidth = aspectFactor * newHeight;
+
+                if (currentStick[1] === 'l') {
+                    newLeft = parentWidth - newRight - newWidth;
+                } else {
+                    newRight = parentWidth - newLeft - newWidth;
+                }
+            } else {
+                newHeight = newWidth / aspectFactor;
+
+                if (currentStick[0] === 't') {
+                    newTop = parentHeight - newBottom - newHeight;
+                } else {
+                    newBottom = parentHeight - newTop - newHeight;
+                }
+            }
+
+            return { newLeft, newRight, newTop, newBottom };
+        },
+    },
+
+    computed: {
+        positionStyle() {
+            return {
+                top: this.top + 'px',
+                left: this.left + 'px',
+                zIndex: this.zIndex,
+            };
+        },
+
+        sizeStyle(){
+            // let width = 0;
+            // if (this.layout.width === 'auto') {
+            //     width = 'auto'
+            // } else if (this.layout.width === 'max') {
+            //     width = this.parentWidth + 'px'
+            // } else {
+            //     width = this.width + 'px'
+            // }
+            // let height = 0
+            // if (this.layout.height === 'auto') {
+            //     height = 'auto'
+            // } else if (this.layout.height === 'max') {
+            //     height = this.parentHeight + 'px'
+            // } else {
+            //     height = this.height + 'px'
+            // }
+            return {
+                width: this.layout.width == 'auto' ? 'auto' : this.width + 'px',
+                height: this.layout.height == 'auto' ? 'auto' : this.height + 'px'
+            };
+        },
+
+        vdrStick() {
+            return (stick) => {
+                const stickStyle = {
+                    width: `${this.stickSize / this.parentScaleX}px`,
+                    height: `${this.stickSize / this.parentScaleY}px`,
+                };
+                stickStyle[styleMapping.y[stick[0]]] = `${this.stickSize / this.parentScaleX / -2}px`;
+                stickStyle[styleMapping.x[stick[1]]] = `${this.stickSize / this.parentScaleX / -2}px`;
+                return stickStyle;
+            };
+        },
+
+        width() {
+            return this.parentWidth - this.left - this.right;
+        },
+
+        height() {
+            return this.parentHeight - this.top - this.bottom;
+        },
+
+        rect() {
+            return {
+                left: Math.round(this.left),
+                top: Math.round(this.top),
+                width: Math.round(this.width),
+                height: Math.round(this.height),
+            };
+        },
+    },
+
+    watch: {
+        active(isActive) {
+            if (isActive) {
+                this.$emit('activated');
+            } else {
+                this.$emit('deactivated');
+            }
+        },
+
+        isActive: {
+            immediate: true,
+            handler(val) {
+                this.active = val;
+            },
+        },
+
+        z: {
+            immediate: true,
+            handler(val) {
+                if (val >= 0 || val === 'auto') {
+                    this.zIndex = val;
+                }
+            },
+        },
+
+        layout: {
+            handler(newVal, oldVal) {
+
+                if (this.stickDrag || this.bodyDrag || (newVal.width === oldVal.width && newVal.height === oldVal.height && newVal.left === oldVal.left && newVal.top === oldVal.top)) {
+                    return;
+                }
+                // this.top = newVal.top
+                // this.left = newVal.left
+                // this.right = this.parentWidth - this.left - newVal.width
+                // this.bottom = this.parentHeight - this.top - newVal.height
+                this.initResize(true)
+                this.$nextTick(() => {
+                    this.stickDrag = false;
+                    this.bodyDrag = false;
+                    this.dimensionsBeforeMove = {pointerX: 0, pointerY: 0, x: 0, y: 0, w: 0, h: 0,};
+                    this.limits = {
+                        left: { min: null, max: null },
+                        right: { min: null, max: null },
+                        top: { min: null, max: null },
+                        bottom: { min: null, max: null },
+                    };
+                    this.$emit('dragging', newVal);
+                    this.$emit('resizing', newVal);
+                    this.$emit('dragstop', newVal);
+                    this.$emit('resizestop', newVal);
+                });
+            },
+            deep: true
+        },
+
+        parentW(val) {
+            this.right = val - this.width - this.left;
+            this.parentWidth = val;
+        },
+
+        parentH(val) {
+            this.bottom = val - this.height - this.top;
+            this.parentHeight = val;
+        },
+    },
+};

+ 109 - 119
src/layout/header/head-com.vue

@@ -1,37 +1,16 @@
 <template>
   <div class="head-com">
-    <div class="head-com-content">
-      <div class="hcc-search __hover">
-        <img src="@/assets/images/layout/head-com-search.png"/>
-      </div>
-      <el-divider direction="vertical" style="border-color: #0276e9;"/>
-      <div class="hcc-info-center __hover">
-        <el-badge :value="newInfoCenterNum" :max="99" class="item" :hidden="newInfoCenterNum === 0">
-          <img src="@/assets/images/layout/head-com-info-center.png"/>
-        </el-badge>
-      </div>
-      <div class="hcc-user">
-        <img class="avatar" src="@/assets/images/layout/head-com-avatar.png"/>
-        <el-dropdown @command="onCommand">
-          <div class="hcc-user-info __hover">
-            <div class="label">
-              <span class="name">{{$store.state.app.userInfo.nickName}}</span>
-              <span class="dept">{{$store.state.app.userInfo.deptName}}</span>
-            </div>
-            <img src="@/assets/images/layout/head-com-dropdown.png"/>
-          </div>
-          <template #dropdown>
-            <el-dropdown-menu>
-              <el-dropdown-item command="info">个人信息</el-dropdown-item>
-              <el-dropdown-item command="password">修改密码</el-dropdown-item>
-              <el-dropdown-item command="logout">退出</el-dropdown-item>
-            </el-dropdown-menu>
-          </template>
-        </el-dropdown>
-      </div>
+    <div class="head-com-left">
+      <CusEllipsis v-if="initDuty" :value="dutyPeopleCpt"/>
+    </div>
+    <div class="head-com-right">
+      <img class="icon-date" src="@/assets/images/layout/head_icon-1.png">
+      <div class="date">{{currentDateCpt}}</div>
+      <img class="icon-user" src="@/assets/images/layout/head_icon-2.png">
+      <div class="name">{{$store.state.app.userInfo?.displayName}}</div>
+      <div class="dept">{{$store.state.app.userInfo?.dept?.organizationName}}</div>
+      <div class="button __hover" @click="onLogout">退出</div>
     </div>
-    <InfoCom v-model:show="showInfo"/>
-    <PasswordCom v-model:show="showPassword"/>
   </div>
 </template>
 
@@ -50,46 +29,79 @@ import {
 } from 'vue'
 import {useStore} from 'vuex'
 import {useRouter, useRoute} from 'vue-router'
-import InfoCom from '@/views/global/head/info.vue'
-import PasswordCom from '@/views/global/head/password.vue'
-import {ElMessageBox} from "element-plus";
 import {toLogin} from "@/utils/permissions";
+import {ElMessageBox} from "element-plus";
 
 export default defineComponent({
   name: '',
-  components: {
-    InfoCom,
-    PasswordCom
-  },
+  components: {},
   setup() {
     const store = useStore();
     const router = useRouter();
     const route = useRoute();
     const that = (getCurrentInstance() as ComponentInternalInstance).appContext.config.globalProperties
     const state = reactive({
-      newInfoCenterNum: 88,
-      showInfo: false,
-      showPassword: false,
+      initDuty: false
+    })
+    const dutyPeopleCpt = computed(() => {
+      let str = ''
+      const dutyHallLeader = `值班厅领导:${store.state.app.dutyInfo?.dutyHallLeader ? store.state.dictionary.dutyHallLeaderMap.get(store.state.app.dutyInfo.dutyHallLeader) : '无'}`
+      const totalClass = `总值班:${store.state.app.dutyInfo?.totalClass ? store.state.dictionary.totalClassMap.get(store.state.app.dutyInfo.totalClass) : '无'}`
+      const shiftLeader = `带班领导:${store.state.app.dutyInfo?.shiftLeader ? store.state.dictionary.shiftLeaderMap.get(store.state.app.dutyInfo.shiftLeader) : '无'}`
+      const dutyPerson = `值班员:${store.state.app.dutyInfo?.dutyPerson ? store.state.app.dutyInfo.dutyPerson.split(',').map(v => store.state.dictionary.dutyPersonMap.get(v)).join('、') : '无'}`
+      str += `${dutyHallLeader} ${totalClass}   ${shiftLeader}   ${dutyPerson}`
+      return str
     })
-    const onCommand = (c) => {
-      if (c === 'info') {
-        state.showInfo = true
-      } else if (c === 'password') {
-        state.showPassword = true
-      } else if (c === 'logout') {
-        ElMessageBox.confirm("请确认是否退出登录?", "提示", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning",
-        }).then(() => {
-          that.$api.logout()
-          toLogin()
-        }).catch(() => {})
+    const currentDateCpt = computed(() => {
+      let d = ''
+      switch (new Date(store.state.app.timestamp).getDay()) {
+        case 0: d = '星期日'
+          break
+        case 1: d = '星期一'
+          break
+        case 2: d = '星期二'
+          break
+        case 3: d = '星期三'
+          break
+        case 4: d = '星期四'
+          break
+        case 5: d = '星期五'
+          break
+        case 6: d = '星期六'
+          break
       }
+      return that.$util.YMDHms(store.state.app.timestamp) + ' ' + d
+    })
+    const onLogout = () => {
+      ElMessageBox.confirm('请确认是否退出登录!', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: "warning",
+      }).then(() => {
+        that.$api.logout()
+        toLogin()
+      }).catch(() => {})
+    }
+    //  获取字典
+    const initDictionary = () => {
+      Promise.all([
+        store.dispatch('dictionary/LOAD_DICT_LIST', 'duty_hall_leader'),
+        store.dispatch('dictionary/LOAD_DICT_LIST', 'total_class'),
+        store.dispatch('dictionary/LOAD_DICT_LIST', 'shift_leader'),
+        store.dispatch('dictionary/LOAD_DICT_LIST', 'duty_person'),
+      ]).then(() => {
+        state.initDuty = true
+      })
     }
+    onMounted(() => {
+      initDictionary()
+      store.dispatch('app/LOAD_DUTY_INFO')
+    })
     return {
       ...toRefs(state),
-      onCommand
+      dutyPeopleCpt,
+      currentDateCpt,
+      onLogout
     }
   },
 })
@@ -97,75 +109,53 @@ export default defineComponent({
 
 <style scoped lang="scss">
   .head-com {
-    background-image: url("@/assets/images/layout/head-com-bg.png");
-    background-position-x: left;
-    background-position-y: bottom;
-    background-repeat: no-repeat;
-    width: 331px;
-    height: 48px;
+    width: 100%;
+    height: 100%;
     display: flex;
-    align-items: flex-end;
-    position: absolute;
-    top: 0;
-    right: 0;
-    .head-com-content {
-      width: 100%;
-      height: 40px;
+    justify-content: space-between;
+    padding-top: 42px;
+    box-sizing: border-box;
+    background-image: url("@/assets/images/layout/head_bg.png");
+    background-size: 100% 100%;
+    font-size: 14px;
+    font-family: PingFang SC-Regular, PingFang SC;
+    font-weight: 400;
+    color: #2EB8FF;
+    line-height: 20px;
+    .head-com-left {
+      width: 30%;
+      margin-left: 30px;
+      height: fit-content;
+      word-spacing: 16px;
+    }
+    .head-com-right {
+      margin-right: 30px;
+      height: fit-content;
       display: flex;
-      align-items: center;
-      .el-divider {
-        margin: 0;
+      .icon-date, .icon-user {
+        width: 16px;
+        height: 16px;
+        margin-right: 8px;
+        margin-top: 1px;
+      }
+      .date {
+        margin-right: 16px;
       }
-      .hcc-search {
-        width: 20px;
-        height: 20px;
-        margin-left: 30px;
-        margin-right: 18px;
-        >img {
-          width: 100%;
-          height: 100%;
-        }
+      .name {
+        margin-right: 4px;
       }
-      .hcc-info-center {
-        margin-left: 14px;
-        width: 18px;
-        height: 20px;
-        :deep(.el-badge__content) {
-          height: 16px;
-          top: 7px;
-          right: 8px;
-          border: none;
-        }
+      .dept {
+        margin-right: 16px;
       }
-      .hcc-user {
+      .button {
+        background-image: url("@/assets/images/layout/head_exit.png");
+        background-repeat: no-repeat;
+        background-size: 100% 100%;
+        width: 54px;
+        height: 26px;
+        color: #FFFFFF;
         display: flex;
-        align-items: center;
-        margin-left: auto;
-        margin-right: 7px;
-        .avatar {
-          width: 25px;
-          height: 25px;
-          margin-right: 30px;
-        }
-        .hcc-user-info {
-          display: flex;
-          align-items: center;
-          .label {
-            display: flex;
-            flex-direction: column;
-            font-family: Microsoft YaHei;
-            font-weight: 400;
-            color: #FFFFFF;
-            text-shadow: 0px 1px 2px rgba(41,111,208,0.2);
-            margin-right: 13px;
-            .name {
-              font-size: 14px;
-            }
-            .dept {
-              font-size: 12px;
-            }
-          }
-        }
+        justify-content: center;
       }
     }
   }

+ 0 - 146
src/layout/header/navigation.vue

@@ -1,146 +0,0 @@
-<template>
-  <div class="navigation-main">
-    <div class="list" ref="ref_list">
-      <template v-for="(item, index) in $store.state.menu.navigations">
-        <div class="navigation __hover" :class="{active: item.name === $route.name}" :style="`transform: translateX(${-8 * index}px);`" @click="toNavigation(item, index)">
-          <div class="title">{{item.title}}</div>
-          <SvgIcon class="close" name="close_1" @click.stop="closeNavigation(item, index)"/>
-        </div>
-      </template>
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-import {
-  defineComponent,
-  computed,
-  onMounted,
-  ref,
-  reactive,
-  watch,
-  getCurrentInstance,
-  ComponentInternalInstance,
-  toRefs,
-  nextTick
-} from 'vue'
-import {useStore} from 'vuex'
-import {useRouter, useRoute} from 'vue-router'
-
-export default defineComponent({
-  name: '',
-  components: {},
-  setup() {
-    const store = useStore();
-    const router = useRouter();
-    const route = useRoute();
-    const that = (getCurrentInstance() as ComponentInternalInstance).appContext.config.globalProperties
-    const state = reactive({})
-    const ref_list = ref()
-    const closeNavigation = (item: any, index: number) => {
-      if (item.name === route.name) {
-        const len = store.state.menu.navigations?.length
-        if (len === 1) {
-          router.push({
-            name: store.state.menu.homeRouterName
-          })
-        } else if (index === len - 1) {
-          router.push({
-            name: store.state.menu.navigations[index - 1].name
-          })
-        } else {
-          router.push({
-            name: store.state.menu.navigations[index + 1].name
-          })
-        }
-      }
-      store.dispatch('menu/LOAD_NAVIGATION_DEL', item.name)
-    }
-    const toNavigation = (item: any, index: number) => {
-      autoScroll(index)
-      router.push({name: item.name})
-    }
-    const autoScroll = (index: number) => {
-      const el = ref_list.value.children[index]
-      const relaLeft = el.offsetLeft - el.parentNode.offsetLeft
-      ref_list.value.scrollTo({
-        left: relaLeft - ref_list.value.clientWidth / 2,
-        behavior: "smooth",
-      })
-    }
-    const initScroll = () => {
-      let index = 0
-      store.state.menu.navigations.forEach((v: any, i: number) => {
-        if (v.name === route.name) {
-          index = i
-        }
-      })
-      autoScroll(index)
-    }
-    watch(() => [store.state.menu.navigations, route], (n: any) => {
-      initScroll()
-    }, {deep: true})
-    onMounted(() => {
-      initScroll()
-    })
-    return {
-      ...toRefs(state),
-      closeNavigation,
-      toNavigation,
-      ref_list
-    }
-  },
-})
-</script>
-
-<style scoped lang="scss">
-  .navigation-main {
-    margin: 10px 0 0 10px;
-    width: 100%;
-    .list {
-      width: 100%;
-      height: 32px;
-      display: flex;
-      align-items: flex-end;
-      overflow-x: auto;
-      &::-webkit-scrollbar { width: 0px; height: 0px; }
-      .navigation {
-        height: 28px;
-        box-sizing: border-box;
-        padding: 0 18px;
-        background-color: #0062E9;
-        clip-path: polygon(8px 0, calc(100% - 8px) 0, 100% 100%, 0 100%);
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        font-size: 12px;
-        font-family: Microsoft YaHei;
-        font-weight: 400;
-        color: #FFFFFF;
-        white-space: nowrap;
-        line-height: 1;
-        &:first-child {
-          clip-path: polygon(0 0, calc(100% - 8px) 0, 100% 100%, 0 100%);
-        }
-        &.active {
-          font-size: 14px;
-          color: #333333;
-          height: 100%;
-          background-color: #FFFFFF;
-          border-radius: 2px 2px 0 0;
-          z-index: 2;
-        }
-        .title {
-          min-width: 48px;
-          text-align: center;
-          padding-bottom: 2px;
-        }
-        .close {
-          margin-left: 14px;
-          width: 10px;
-          height: 10px;
-        }
-      }
-    }
-  }
-</style>

+ 46 - 158
src/layout/index.vue

@@ -1,43 +1,21 @@
 <template>
-  <template v-if="isSpecial">
-    <div class="layout-special">
-      <div class="layout-head-title">
-        <div class="lh-logo __hover" @click="goIndexPage">
-          <img class="lh-logo-icon" src="@/assets/images/layout/logo_icon.png"/>
-          <div class="lh-logo-title">综合态势防控平台</div>
-        </div>
-        <SvgIcon name="arrow_1" color="#ffffff" size="20" class="lh-expend __hover" :class="{not: !$store.state.menu.menuExpend}" @click="$store.dispatch('menu/LOAD_SWITCH_MENU_EXPEND')"/>
-      </div>
-      <MenuCom class="menu" :isSpecial="isSpecial" v-if="$store.state.menu.menuExpend"/>
-      <HeadCom class="head"/>
-      <RouterViewCom class="content"/>
+  <div class="layout">
+    <div class="layout-head">
+      <HeadCom/>
     </div>
-  </template>
-  <template v-else>
-    <div class="layout">
-      <div class="layout-head">
-        <div class="bg"/>
-        <div class="layout-head-title">
-          <div class="lh-logo __hover" @click="goIndexPage">
-            <img class="lh-logo-icon" src="@/assets/images/layout/logo_icon.png"/>
-            <div class="lh-logo-title">综合态势防控平台</div>
-          </div>
-          <SvgIcon name="arrow_1" color="#ffffff" size="20" class="lh-expend __hover" :class="{not: !$store.state.menu.menuExpend}" @click="$store.dispatch('menu/LOAD_SWITCH_MENU_EXPEND')"/>
-        </div>
-        <MenuCom class="menu" :isSpecial="isSpecial"/>
-        <HeadCom class="head"/>
+    <div class="layout-main">
+      <div class="layout-main-sub-menu" v-if="hasSubMenu">
+        <SubMenuCom/>
       </div>
-      <div class="layout-bottom">
-        <div class="layout-sub-menu" :class="{expend: $store.state.menu.menuExpend}" v-if="hasSubMenu">
-          <SubMenuCom :isExpend="$store.state.menu.menuExpend"/>
-        </div>
-        <div class="layout-content">
-          <NavigationCom v-if="hasSubMenu"/>
-          <RouterViewCom class="content"/>
-        </div>
+      <div class="layout-main-content">
+<!--        <NavigationCom v-if="hasSubMenu"/>-->
+        <RouterViewCom/>
       </div>
     </div>
-  </template>
+    <div class="layout-foot">
+      <MenuCom/>
+    </div>
+  </div>
 </template>
 
 <script lang="ts">
@@ -58,12 +36,11 @@ import {useRouter, useRoute} from 'vue-router'
 import RouterViewCom from './router-view.vue'
 import MenuCom from './menu/menu.vue'
 import SubMenuCom from './menu/sub-menu.vue'
-import NavigationCom from './header/navigation.vue'
 import HeadCom from './header/head-com.vue'
 
 export default defineComponent({
   name: '',
-  components: {RouterViewCom, MenuCom, SubMenuCom, NavigationCom, HeadCom},
+  components: {RouterViewCom, MenuCom, SubMenuCom, HeadCom},
   setup() {
     const store = useStore();
     const router = useRouter();
@@ -71,145 +48,56 @@ export default defineComponent({
     const that = (getCurrentInstance() as ComponentInternalInstance).appContext.config.globalProperties
     const state = reactive({
     })
-    const goIndexPage = () => {
-      // @ts-ignore
-      window.open(`http://${window.location.hostname}:${window.cusConfig.portalPort}`);
-    }
     const hasSubMenu = computed(() => {
       return store.state.menu.subMenuRouter?.length > 0
           && ![store.state.menu.homeRouterName].includes(route.name as string)
     })
-    const isSpecial = computed(() => {
-      return [store.state.menu.homeRouterName].includes(route.name as string)
-    })
     // 测试切换分支
     return {
       ...toRefs(state),
-      goIndexPage,
       hasSubMenu,
-      isSpecial
     }
   },
 })
 </script>
 
 <style scoped lang="scss">
-  .layout-head-title {
-    background-image: url("@/assets/images/layout/menu-top-title.png");
-    background-repeat: no-repeat;
-    width: 470px;
-    height: 69px;
-    display: flex;
-    align-items: center;
-    z-index: 2;
-    .lh-logo {
-      display: flex;
-      align-items: center;
-      .lh-logo-icon {
-        margin-left: 28px;
-        width: 40px;
-        height: 41px;
-      }
-      .lh-logo-title {
-        font-size: 30px;
-        font-family: Microsoft YaHei;
-        font-weight: bold;
-        color: #FFFFFF;
-        margin-left: 7px;
-        user-select: none;
-        padding-bottom: 2px;
-      }
-    }
-    .lh-expend {
-      width: 18px;
-      height: 16px;
-      margin-left: 41px;
-      margin-top: 28px;
-      transform: rotate(180deg) !important;
-      transition: 0.2s;
-      &.not {
-        transform: rotate(0deg) !important;
-      }
-    }
-  }
-  .layout-special {
+.layout {
+  width: 100%;
+  height: 100vh;
+  background-image: url("@/assets/images/layout/layout_bg.png");
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  position: relative;
+  .layout-head {
+    position: absolute;
     width: 100%;
-    height: 100vh;
-    position: relative;
-    .layout-head-title {
-      position: absolute;
-      top: 0;
-      left: 0;
-      z-index: 2;
-    }
-    .menu {
-      position: absolute;
-      z-index: 1;
-      top: 0;
-      left: 429px;
-    }
-    .head {
-      height: 40px;
-      position: absolute;
-      top: 0;
-      right: 0;
-      z-index: 1;
-    }
-    .content {
-      width: 100%;
-      height: 100%;
-      z-index: 1;
-    }
+    height: 135px;
+    top: 0;
+    left: 0;
+    z-index: 1;
   }
-  .layout {
-    display: flex;
-    flex-direction: column;
+  $mt: 91px;
+  .layout-main {
+    z-index: 2;
+    margin-top: $mt;
     width: 100%;
-    height: 100vh;
-    $layoutHeadHeight: 69px;
-    background-color: #082e94;
-    .layout-head {
-      width: 100%;
-      height: $layoutHeadHeight;
-      display: flex;
-      align-items: center;
-      .bg {
-        background-image: url("@/assets/images/layout/head-bg.png");
-        background-repeat: no-repeat;
-        background-position-x: right;
-        width: 100%;
-        height: 59px;
-        position: absolute;
-        top: 0;
-        left: 0;
-      }
-      .menu {
-        z-index: 1;
-      }
-      .head {
-        top: 11px;
-      }
+    height: calc(100% - #{$mt});
+    display: flex;
+    .layout-main-sub-menu {
+
     }
-    .layout-bottom {
-      width: 100%;
-      height: calc(100% - #{$layoutHeadHeight});
-      display: flex;
-      .layout-sub-menu {
-        width: 44px;
-        height: 100%;
-        &.expend {
-          width: 204px;
-        }
-      }
-      .layout-content {
-        flex: 1;
-        overflow: hidden;
-        display: flex;
-        flex-direction: column;
-        .content {
-          flex: 1;
-        }
-      }
+    .layout-main-content {
+      flex: 1;
     }
   }
+  .layout-foot {
+    z-index: 3;
+    position: absolute;
+    bottom: 0;
+  }
+}
 </style>

+ 30 - 101
src/layout/menu/menu.vue

@@ -1,25 +1,15 @@
 <!--顶部一级菜单-->
 <template>
-  <template v-if="isSpecial">
-    <div class="menu-special">
-      <template v-for="(item, index) in $store.state.menu.allRouters">
-        <div class="menu-item-special __hover" :class="{active: deepRouteName(item)}" @click="toMenu(item)">
+  <div class="menu">
+    <template v-for="(item, index) in $store.state.menu.allRouters">
+      <div class="menu-item __hover" @click="toMenu(item)">
+        <img :src="item.meta.icon"/>
+        <div class="menu-item-title">
           {{item.meta.title}}
         </div>
-      </template>
-    </div>
-  </template>
-  <template v-else>
-    <div class="menu-normal">
-      <template v-for="(item, index) in $store.state.menu.allRouters">
-        <div class="menu-normal-item __hover" :class="{active: deepRouteName(item)}" :style="`width: ${128 + 16 * (item.meta.title.length - 4 > 0 ? item.meta.title.length - 4 : 0)}px;`" @click="toMenu(item)">
-          <div class="menu-normal-item-title">
-            {{item.meta.title}}
-          </div>
-        </div>
-      </template>
-    </div>
-  </template>
+      </div>
+    </template>
+  </div>
 </template>
 
 <script lang="ts">
@@ -42,7 +32,6 @@ export default defineComponent({
   name: '',
   components: {},
   props: {
-    isSpecial: {}
   },
   setup() {
     const store = useStore();
@@ -53,105 +42,45 @@ export default defineComponent({
     })
     const toMenu = (menu: any) => {
       if (!route.matched.some(v => menu.path === v.path)) {
-        const homeRouteName = store.state.menu.homeRouterName
-        if (route.name === homeRouteName || menu.name === homeRouteName) {
-          const to = router.resolve({
-            path: menu.redirect || menu.path,
-          });
-          window.open(to.href, "_blank")
-        } else {
-          router.push({
-            path: menu.redirect || menu.path
-          })
-        }
-      }
-    }
-    const deepRouteName = (item: any) => {
-      let bool = false
-      const deep = (obj: any) => {
-        if (obj.name === route.name) {
-          bool = true
-        }
-        if (obj.children?.length > 0) {
-          obj.children.forEach((v: any) => {
-            deep(v)
-          })
-        }
+        router.push({
+          path: menu.redirect || menu.path
+        })
       }
-      deep(item)
-      return bool
     }
     return {
       ...toRefs(state),
       toMenu,
-      deepRouteName
     }
   },
 })
 </script>
 
 <style scoped lang="scss">
-  .menu-special {
-    height: 42px;
-    background-image: url("@/assets/images/layout/menu-bg-special.png");
-    background-position-x: right;
-    background-position-y: bottom;
+  .menu {
+    width: 1198px;
+    height: 49px;
+    background-image: url("@/assets/images/layout/menu_bg.png");
     background-repeat: no-repeat;
+    background-size: 100% 100%;
     display: flex;
-    align-items: center;
-    align-self: flex-start;
-    font-size: 14px;
-    font-family: Microsoft YaHei;
-    font-weight: 400;
-    color: #ffffff;
-    padding: 0 29px 0 34px;
-    .menu-item-special {
-      padding: 0 16px;
-      &.active {
-        position: relative;
-        font-size: 16px;
-        font-weight: bold;
-        text-shadow: 0px 3px 7px rgba(18,79,188,0.7);
-        &:before {
-          content: '';
-          position: absolute;
-          background-image: url("@/assets/images/layout/menu-active-special.png");
-          background-repeat: no-repeat;
-          background-size: 100%;
-          width: 100%;
-          height: 13px;
-          top: 17px;
-          left: 0;
-        }
-      }
-    }
-  }
-  .menu-normal {
-    display: flex;
-    align-items: center;
-    margin-top: 12px;
-    margin-left: -42px;
-    .menu-normal-item {
-      $menuSkexX: -42deg;
-      background-image: url("@/assets/images/layout/menu-item-bg.png");
-      background-repeat: no-repeat;
-      background-size: 100% 100%;
-      height: 55px;
-      transform: skewX($menuSkexX);
+    justify-content: center;
+    position: relative;
+    .menu-item {
+      height: 26px;
       display: flex;
       align-items: center;
-      justify-content: center;
-      margin-right: -18px;
-      font-size: 16px;
-      font-family: Microsoft YaHei;
-      font-weight: bold;
+      font-family: PangMenZhengDao;
+      font-size: 20px;
+      font-weight: 400;
       color: #FFFFFF;
-      &.active {
-        background-image: url("@/assets/images/layout/menu-item-bg-active.png");
+      position: relative;
+      top: -9px;
+      margin-right: 24px;
+      &:last-child {
+        margin-right: 0;
       }
-      .menu-normal-item-title {
-        transform: skewX(-$menuSkexX);
-        margin-right: 20%;
+      >img {
+        margin-right: 8px;
       }
     }
   }

+ 61 - 109
src/layout/menu/sub-menu.vue

@@ -1,49 +1,16 @@
 <!--左侧二级菜单树-->
 <template>
   <div class="sub-menu-main">
-    <template v-for="(item, index) in $store.state.menu.subMenuRouter">
-      <template v-if="isExpend">
-        <div class="smm-parent">
-          <div class="p-item __hover" :class="{current: item.name === $route.name}" @click="item.children?.length > 0 ? item.expend = !item.expend : toSubMenu(item)">
-            <SvgIcon class="menu-logo" name="menu-mock" size="18" color="#ffffff" rotate="90"/>
+    <div class="sub-menu-main-content">
+      <template v-for="(item, index) in $store.state.menu.subMenuRouter">
+        <div class="sub-menu-item __hover" :class="{active: item.name === $route.name}" @click="toSubMenu(item)">
+          <div class="sub-menu-item-content">
+            <div class="icon"/>
             {{item.meta.title}}
-            <SvgIcon class="menu-expend" name="arrow_2" size="12" color="#ffffff" :class="{active: item.expend}" v-if="item.children?.length > 0"/>
-          </div>
-          <div class="smm-son" v-if="item.children?.length > 0 && item.expend">
-            <template v-for="(subItem, subIndex) in item.children">
-              <div class="s-item __hover" :class="{current: subItem.name === $route.name}" @click="toSubMenu(subItem)">
-                {{subItem.meta.title}}
-              </div>
-            </template>
           </div>
         </div>
       </template>
-      <template v-else>
-        <template v-if="item.children?.length > 0">
-          <el-popover placement="right" :teleported="false" popper-class="smm-parent-son">
-            <template #reference>
-              <div class="smm-parent-not-expend __hover"  :class="{current: item.name === $route.name || item.children?.some(v => v.name === $route.name)}"  @click="toSubMenu(item)">
-                <SvgIcon class="menu-logo" name="menu-mock" size="18" color="#ffffff"/>
-<!--                <SvgIcon class="menu-expend" name="arrow_2" size="12" color="#ffffff" :class="{active: item.expend}" v-if="item.children?.length > 0"/>-->
-              </div>
-            </template>
-            <div class="smm-son">
-              <template v-for="(subItem, subIndex) in item.children">
-                <div class="s-item __hover" :class="{current: subItem.name === $route.name}" @click="toSubMenu(subItem)">
-                  {{subItem.meta.title}}
-                </div>
-              </template>
-            </div>
-          </el-popover>
-        </template>
-        <template v-else>
-          <div class="smm-parent-not-expend __hover"  :class="{current: item.name === $route.name || item.children?.some(v => v.name === $route.name)}"  @click="toSubMenu(item)">
-            <SvgIcon class="menu-logo" name="menu-mock" size="18" color="#ffffff"/>
-<!--            <SvgIcon class="menu-expend" name="arrow_2" size="12" color="#ffffff" :class="{active: item.expend}" v-if="item.children?.length > 0"/>-->
-          </div>
-        </template>
-      </template>
-    </template>
+    </div>
   </div>
 </template>
 
@@ -62,13 +29,11 @@ import {
 } from 'vue'
 import {useStore} from 'vuex'
 import {useRouter, useRoute} from 'vue-router'
-import {copy} from "@/utils/util";
 
 export default defineComponent({
   name: '',
   components: {},
   props: {
-    isExpend: {}
   },
   setup() {
     const store = useStore();
@@ -101,82 +66,69 @@ export default defineComponent({
 </script>
 
 <style scoped lang="scss">
-  .current {
-    background-color: #0062E9;
-  }
   .sub-menu-main {
-    width: 100%;
-    height: 100%;
-    overflow-y: auto;
-    background: linear-gradient(0deg, #021D78 0%, #0F44B6 100%);
-    padding-top: 13px;
-    .smm-parent {
-      .p-item {
+    width: 290px;
+    height: 918px;
+    background-image: url("@/assets/images/layout/sub-menu_bg.png");
+    background-repeat: no-repeat;
+    background-size: 100% auto;
+    position: relative;
+    .sub-menu-main-content {
+      position: absolute;
+      display: flex;
+      flex-direction: column;
+      top: 172px;
+      left: 30px;
+      .sub-menu-item {
+        width: 185px;
+        height: 66px;
         display: flex;
         align-items: center;
-        height: 44px;
-        line-height: 1;
-        user-select: none;
-        font-size: 14px;
-        font-family: Microsoft YaHei;
-        font-weight: 400;
-        color: #FFFFFF;
-        .menu-logo {
-          margin: 0 13px 0 15px;
+        position: relative;
+        &:after {
+          content: '';
+          position: absolute;
+          bottom: 0;
+          width: 100%;
+          height: 2px;
+          background: linear-gradient(270deg, rgba(51,146,255,0) 0%, #3392FF 51%, rgba(51,146,255,0) 100%);
         }
-        .menu-expend {
-          margin: 0 12px 0 auto;
-          transition: 0.2s;
-          &.active {
-            transform: rotate(90deg) !important;
+        &.active {
+          &:before {
+            content: '';
+            position: absolute;
+            width: 167px;
+            height: 42px;
+            background: linear-gradient(90deg, rgba(0,242,254,0) 0%, #00F2FE 39%, #00F2FE 61%, rgba(0,242,254,0) 95%);
+            z-index: 1;
+            opacity: 0.4;
+          }
+          .sub-menu-item-content {
+            text-shadow: 0px 2px 4px rgba(0,0,0,0.4);
+            color: #FFFFFF;
+            .icon {
+              background-color: #75fbff;
+              box-shadow: 0px 0px 20px 3px #75fbff;
+            }
           }
         }
-      }
-      .smm-son {
-        .s-item {
-          height: 44px;
-          padding-left: 46px;
-          display: flex;
-          align-items: center;
-          line-height: 1.2;
-          user-select: none;
-          font-size: 14px;
-          font-family: Microsoft YaHei;
-          font-weight: 400;
-          color: #FFFFFF;
-        }
-      }
-    }
-    .smm-parent-not-expend {
-      height: 44px;
-      display: flex;
-      align-items: center;
-      .menu-logo {
-        margin: 0 13px 0 15px;
-      }
-    }
-    :deep(.smm-parent-son) {
-      background: #0a369f;
-      border: none;
-      padding: 0;
-      width: auto !important;
-      min-width: 0;
-      .el-popper__arrow::before {
-        background: #0a369f;
-        border-color: #0a369f;
-      }
-      .smm-son {
-        .s-item {
-          padding: 0 20px;
-          height: 44px;
+        .sub-menu-item-content {
+          height: 42px;
+          font-size: 20px;
+          font-family: Microsoft YaHei-Bold, Microsoft YaHei;
+          font-weight: bold;
+          color: rgba(255,255,255,0.5);
           display: flex;
           align-items: center;
-          line-height: 1.2;
-          user-select: none;
-          font-size: 14px;
-          font-family: Microsoft YaHei;
-          font-weight: 400;
-          color: #FFFFFF;
+          padding-left: 30px;
+          z-index: 2;
+          .icon {
+            width: 16px;
+            height: 16px;
+            background-color: rgba(42, 187, 255, 0.3);
+            margin-right: 10px;
+            transform: rotate(45deg);
+          }
         }
       }
     }

+ 2 - 0
src/plugins/initProperties.ts

@@ -2,9 +2,11 @@ import { App } from 'vue'
 import * as api from '@/api/index'
 import * as util from '@/utils/util'
 import * as easyMap from '@/utils/easyMap'
+import * as permissions from '@/utils/permissions'
 
 export default async (app: App) => {
     app.config.globalProperties.$api = await api.default
     app.config.globalProperties.$util = util
     app.config.globalProperties.$easyMap = easyMap
+    app.config.globalProperties.$permissions = permissions
 }

+ 48 - 32
src/router/index.ts

@@ -1,18 +1,17 @@
 import {createRouter, createWebHistory} from 'vue-router'
 import LayoutCom from '@/layout/index.vue'
-import Demo, {mockRouter} from './modules/demo'
 import staticRouter from './modules/static'
 import store from '@/store/index'
 import TempCom from '@/views/global/temp.vue'
-import * as api from '@/api/index'
-import {getRoutes} from '@/api/modules/global/global'
 import RouterViewCom from "@/layout/router-view.vue";
+// import {stagingRouterMap, stagingRouter} from './modules/staging'
+// import {systemRouterMap, systemRouter} from './modules/system'
+import {ElMessage} from "element-plus";
 import {toLogin} from "@/utils/permissions";
 
-
-const demo = (import.meta as any).env.DEV ? Demo : new Map()
-export const RoutersMap = new Map([
-    ...demo,
+export const RoutersMap: any = new Map([
+    // ...stagingRouterMap,
+    // ...systemRouterMap,
 ])
 
 const routes = [
@@ -34,16 +33,16 @@ const router = createRouter({
 
 router.beforeEach((to, from , next) => {
     if (to.path === "/login") {
-        if ((import.meta as any).env.DEV) {
-            next()
+        if (sessionStorage.getItem("sg_token")) {
+            location.replace('/')
         } else {
-            toLogin()
+            next()
         }
     } else {
-        if (sessionStorage.getItem("ax_token")) {
+        if (sessionStorage.getItem("sg_token")) {
             getInit(to, next)
         } else if (to.query.axToken) {
-            sessionStorage.setItem("ax_token", <string>to.query.axToken);
+            sessionStorage.setItem("sg_token", <string>to.query.axToken);
             setTimeout(() => {//虽然不知道为什么要加宏任务,但是我不敢改
                 delete to.query.axToken
                 let url = `${window.location.origin + window.location.pathname}?`
@@ -62,10 +61,12 @@ router.beforeEach((to, from , next) => {
 const getInit = (to: any, next: any) => {
     document.title = to?.meta?.title || (import.meta as any).env.VITE_PROJECT_TITLE
     if (to.path === '/') {
-        const firstRoute = store.state.menu.allRouters[0]
-        next({
-            path: firstRoute.redirect || firstRoute.path
-        })
+        const firstRoute = store.state.menu.allRouters?.[0]
+        if (firstRoute) {
+            next({
+                path: firstRoute.redirect || firstRoute.path
+            })
+        }
     } else {
         const m = to.matched[1]?.children?.map((v: any) => {
             v.expend = v.children?.some((s: any) => s.path === to.path)
@@ -84,19 +85,38 @@ const getInit = (to: any, next: any) => {
 }
 
 export const initMainRouter = async () => {
-    if (sessionStorage.getItem("ax_token") && location.pathname !== '/login') {
-        await Promise.all([
-            getRoutes(),
-            store.dispatch('app/LOAD_USER_INFO')
-        ]).then(async ([r, u]) => {
-            await store.dispatch('app/LOAD_POWER_DEPT', u.deptId).then(() => {
-                setRouters(r)
-            })
-        })
+    if (sessionStorage.getItem("sg_token") && location.pathname !== '/login') {
+        setRouters()
+        // await Promise.all([
+        //     store.dispatch('app/LOAD_USER_INFO'),
+        // ]).then(async ([u]) => {
+        //     if (u.roles.some(v => ['ZBY', 'ZBGL'].includes(v.permissionValue))) {
+        //         setRouters()
+        //         store.dispatch('app/LOAD_PUBLIC_CONFIG', {key: 'sign.begin.time'})
+        //         store.dispatch('app/LOAD_PUBLIC_CONFIG', {key: 'sign.remind.time'})
+        //         store.dispatch('app/LOAD_PUBLIC_CONFIG', {key: 'sign.end.time'})
+        //         store.dispatch('app/LOAD_PUBLIC_CONFIG', {key: 'log.submit.time'})
+        //         store.dispatch('app/LOAD_PUBLIC_CONFIG', {key: 'log.remind.time'})
+        //         store.dispatch('app/LOAD_PUBLIC_CONFIG', {key: 'week.submit.date'})
+        //         store.dispatch('app/LOAD_PUBLIC_CONFIG', {key: 'week.submit.time'})
+        //         store.dispatch('app/LOAD_PUBLIC_CONFIG', {key: 'week.remind.time'})
+        //         store.dispatch('app/LOAD_SIGN_INFO')
+        //         store.dispatch('app/LOAD_DAILY_INFO')
+        //         store.dispatch('app/LOAD_WEEKLY_INFO')
+        //     } else {
+        //         ElMessage({
+        //             duration: 0,
+        //             type: 'warning',
+        //             message: '该账号无系统角色!点击关闭按钮跳转到登录页。',
+        //             showClose: true,
+        //             onClose: () => toLogin()
+        //         })
+        //     }
+        // })
     }
 
 }
-const setRouters = (res: any) => {
+const setRouters = () => {
     const deep = (arr: Array<any>, parentArr: Array<any>) => {
         return arr.map((v, i) => {
             const _pA = [...parentArr, v]
@@ -127,12 +147,8 @@ const setRouters = (res: any) => {
             return item.path
         }
     }
-    const arr = res.data.filter(v => {
-        return !['6990b747-f628-4698-bb69-d6147c27e7d6'].includes(v.menuCode)
-    })
-    if ((import.meta as any).env.DEV) {
-        arr.unshift(mockRouter)
-    }
+    const arr = []
+    // const arr = [stagingRouter, systemRouter]
     const menuRouters = deep(arr, [])
     //  初始化一级菜单默认重定向地址
     menuRouters.forEach(v => {

+ 10 - 5
src/router/modules/static.ts

@@ -1,10 +1,15 @@
 import RouterViewCom from "@/layout/router-view.vue";
 // 不需要菜单管理配置的路由
 const staticRouter = [
-  {
-    path: '/login',
-    name: 'fde2b927-2116-43f6-ba5e-94be4abacf39',
-    component: () => import('@/views/global/login.vue')
-  },
+  // {
+  //   path: '/login',
+  //   name: 'fde2b927-2116-43f6-ba5e-94be4abacf39',
+  //   component: () => import('@/views/global/login.vue')
+  // },
+    {
+      path: '/gis',
+      name: '83c18662-3524-4147-9271-91296fcd7780',
+      component: () => import('@/views/gis/index.vue')
+    },
 ]
 export default staticRouter

+ 2 - 242
src/store/modules/app.ts

@@ -1,261 +1,21 @@
 import * as api from '@/api/index'
-import {getPowerDept} from "@/api/modules/home-management/home";
-import {getUserInfo} from "@/api/modules/global/global";
+// import {getUserInfo} from "@/api/modules/global/global";
 
 const state = {
 	apiProxy: {
 		EzServer6Api: 'EzServer6-api',	// 地图底图代理
-		geoserverApi: 'geoserver-api',	// 地图服务代理
-		historyTrackWSApi: 'history-track-ws-api',	//	历史轨迹代理
-		rhWSApi: 'rh-ws-api',	// 融合实时船舶ws代理
-		bdWSApi: 'bd-ws-api',	// 北斗实时船舶ws代理
-		aisWSApi: 'ais-ws-api', //全球ais
-		xmbWSApi: 'xmb-ws-api',	// 小目标雷达实时船舶ws代理
-		hlxWSApi: 'hlx-ws-api',	// 海兰信守望者实时船舶ws代理
-		hlxRadarWSApi: 'hlx-radar-ws-api',	// 海兰信原始雷达实时船舶ws代理
-		zyhWSApi: 'zyh-ws-api',	// 中远海实时船舶ws代理
-		dcWSApi: 'dc-ws-api',	// 历史回放单船ws代理
-		kxWSApi: 'kx-ws-api',	// 历史回放框选ws代理
-		rhFindShipApi: 'rh-find-ship-api',	// 融合找船代理
-		warningWSApi: 'warning-ws-api',	//	预警推送ws代理
-		infoCenterWSApi: 'info-center-ws-api',	//	消息中心ws代理
-		policeManWSApi: 'police-man-ws-api',	//	执法记录仪ws代理
-		speedAnalysisApi: 'speed-analysis-api',	//	轨迹列表航速分析导出
-		jwtWSApi: 'jwt-ws-api',	//	警务通实时ws代理
-		pdtWSApi: 'pdt-ws-api',	//	PDT实时ws代理
-		policeCarWSApi: 'police-car-ws-api',	//	警车实时ws代理
-		policeBoatWSApi: 'police-boat-ws-api',	//	巡逻艇实时ws代理
 	},
 	userInfo: <any>{},
-	permissions: [],
-	deptTree: [],
-	deptList: [],
-	deptTreeMap: new Map(),
-	deptAllTree: [],
-	deptAllList: [],
-	deptAllTreeMap: new Map(),
-	userAllTree: [],
-	userAllList: [],
-	userAllTreeMap: new Map(),
-	powerDept: [],
-	zIndex: 100,
-	isDrag: false,
-	globalConfig: {
-		fileMax: 0,	//	上传文件最大值
-		fileType: '',	//	上传文件类型
-		imgMax: 0,	//	上传图片最大值
-		imgType: '',	//	上传图片类型
-		passwordLevel: '2',	//	密码安全等级
-	}
 }
 
 const getters = {
 }
 
 const mutations = {
-	SET_USER_INFO(state: any, data: object) {
-		state.userInfo = data
-	},
-	SET_PERMISSIONS(state: any, data: Array<string>) {
-		state.permissions = data
-	},
-	SET_DEPT_TREE(state: any, data: Array<any>) {
-		const recursive=(list: any) => {
-			return list.map((v: any) => {
-				if('children' in v && v.children && v.children.length!==0) {
-					v.children= recursive(v.children)
-				}else {
-					v.children=undefined
-				}
-				return {
-					deptLevel:v.deptLevel,
-					deptName:v?.deptName,
-					children:v.children,
-					deptId:v?.deptId
-				}
-			})
-		}
-		const deptMap = new Map()
-		const deptList: any = []
-		const setDept = (nodes: any) => {
-			nodes.forEach((v: any) => {
-				// v.deptId = v.id
-				// v.deptName = v.label
-				deptMap.set(v.deptId, v)
-				deptList.push(v)
-				if (v.children && v.children.length > 0) {
-					setDept(v.children)
-				}
-			})
-		}
-		setDept(data)
-		state.deptTree = recursive(data)
-		state.deptList = deptList
-		state.deptTreeMap = deptMap
-	},
-	SET_DEPT_ALL_TREE(state: any, data: Array<any>) {
-		const deptAllMap = new Map()
-		const deptAllList: any = []
-		const setDept = (nodes: any) => {
-			nodes.forEach((v: any) => {
-				// v.deptId = v.id
-				// v.deptName = v.label
-				deptAllMap.set(v.deptId, v)
-				deptAllList.push(v)
-				if (v.children && v.children.length > 0) {
-					setDept(v.children)
-				}
-			})
-		}
-		setDept(data)
-		state.deptAllTree = data
-		state.deptAllList = deptAllList
-		state.deptAllTreeMap = deptAllMap
-	},
-	SET_USER_ALL_TREE(state: any, data: Array<any>) {
-		const userAllMap = new Map()
-		const userAllList: any = []
-		const setUser = (nodes: any) => {
-			nodes.forEach((v: any) => {
-				if (!v.isDept) {
-					userAllMap.set(v.id, v)
-					userAllList.push(v)
-				}
-				if (v.children && v.children.length > 0) {
-					setUser(v.children)
-				}
-			})
-		}
-		setUser(data)
-		state.userAllTree = data
-		state.userAllList = userAllList
-		state.userAllTreeMap = userAllMap
-	},
-	SET_POWER_DEPT(state: any, data: any) {
-		state.powerDept = data
-	},
-	SET_DRAG_Z (state) {
-		state.zIndex++
-	},
-	SET_IS_DRAG(state) {
-		state.isDrag = !state.isDrag
-	},
-	SET_GLOBAL_CONFIG(state, rows) {
-		rows.forEach(v => {
-			if (v.configKey === 'global.fileSize') {
-				state.globalConfig.fileMax = Number(v.configValue)
-			} else if (v.configKey === 'global.fileType') {
-				state.globalConfig.fileType = v.configValue
-			} else if (v.configKey === 'global.imageSize') {
-				state.globalConfig.imgMax = Number(v.configValue)
-			} else if (v.configKey === 'global.imageType') {
-				state.globalConfig.imgType = v.configValue
-			} else if (v.configKey === 'global.pwdSecurityLevel') {
-				state.globalConfig.passwordLevel = v.configValue
-			}
-		})
-	}
+
 }
 
 const actions = {
-	LOAD_USER_INFO({ commit }: any, refresh: boolean = false) {
-		return new Promise((resolve, reject) => {
-			if (refresh || !state.userInfo?.userId) {
-				getUserInfo().then((res: any) => {
-					if (res.code === 200) {
-						commit('SET_USER_INFO', res.user)
-						commit('SET_PERMISSIONS', res.permissions)
-						resolve(state.userInfo)
-					} else {
-						reject(res.msg)
-					}
-				})
-			} else {
-				resolve(state.userInfo)
-			}
-		})
-	},
-	LOAD_DEPT_TREE({ commit }: any, userDeptId = '', refresh = false) {
-		return new Promise((resolve, reject) => {
-			if (state.deptTree.length === 0 || refresh) {
-				api.default.getDeptTree().then((res: any) => {
-					commit('SET_DEPT_TREE', res.data)
-					resolve(res.data)
-				}).catch(() => {
-					reject('获取部门树列表错误')
-				})
-			} else {
-				resolve(null)
-			}
-		})
-	},
-	LOAD_DEPT_ALL_TREE({ commit }: any, refresh = false) {
-		return new Promise((resolve, reject) => {
-			if (state.deptAllTree.length === 0 || refresh) {
-				api.default.getDeptTreeAll().then((res: any) => {
-					commit('SET_DEPT_ALL_TREE', res.data)
-					resolve(res.data)
-				}).catch(() => {
-					reject('获取部门树列表错误')
-				})
-			} else {
-				resolve(null)
-			}
-		})
-	},
-	LOAD_USER_ALL_TREE({ commit }: any, refresh = false) {
-		return new Promise((resolve, reject) => {
-			if (state.userAllTree.length === 0 || refresh) {
-				api.default.getUserAll().then((res: any) => {
-					commit('SET_USER_ALL_TREE', res.data)
-					resolve(res.data)
-				}).catch(() => {
-					reject('获取全部用户树列表错误')
-				})
-			} else {
-				resolve(null)
-			}
-		})
-	},
-	LOAD_POWER_DEPT({ commit }: any, userDeptId = '', refresh = false) {
-		return new Promise((resolve, reject) => {
-			if (state.powerDept?.length === 0 || refresh) {
-				getPowerDept(userDeptId).then((res: any) => {
-					commit('SET_POWER_DEPT', res.data)
-					resolve(res.data)
-				}).catch(() => {
-					reject('获取权限部门错误')
-				})
-			} else {
-				resolve(null)
-			}
-		})
-	},
-	LOAD_DRAG_Z ({ commit }) {
-		return new Promise(resolve => {
-			commit('SET_DRAG_Z')
-			resolve(state.zIndex)
-		})
-	},
-	LOAD_IS_DRAG({ commit }) {
-		commit('SET_IS_DRAG')
-	},
-	LOAD_GLOBAL_CONFIG({ commit }, refresh = false) {
-		return new Promise((resolve, reject) => {
-			if (!state.globalConfig.fileType || refresh) {
-				api.default.getParameterList()
-					.then(res => {
-						commit('SET_GLOBAL_CONFIG', res.rows)
-						resolve(res.data)
-					})
-					.catch(() => {
-						reject('获取公共配置错误')
-					})
-			} else {
-				resolve(null)
-			}
-		})
-	},
 }
 
 export default {

+ 4 - 277
src/store/modules/dictionary-define.ts

@@ -1,286 +1,13 @@
 export const dictionaryDefine = {
-	//接口参数 : [ '字典数据list名', '字典数据筛选名' ],
-	car_color: ['carColorList', 'carColorMap'], //  车辆颜色
-	plate_color: ['plateColorList', 'plateColorMap'], //  车牌颜色
-	car_brand: ['carBrandList', 'carBrandMap'], //  车辆品牌
-	pcar_type: ['pcarTypeList', 'pcarTypeMap'], //  车辆类型
-	deploy_car_type: ['deployCarList', 'deployCarMap'], // 布控车辆分类
-	deploy_risk_level: ['deployRiskList', 'deployRiskMap'], // 布控风险等级
-	deploy_scope: ['deployScopeList', 'deployScopeMap'], // 布控范围
-	workflow_control_reason: ['workflowControlResonList', 'workflowControlResonMap'], // 管控原因
-	workflow_car_control_reason: ['workflowCarControlReasonList', 'workflowCarControlReasonMap'], // 车辆管控原因
-	workflow_person_control_reason: ['workflowPersonControlReasonList', 'workflowPersonControlReasonMap'], // 人员管控原因
-	workflow_face_control_reason: ['workflowFaceControlReasonList', 'workflowFaceControlReasonMap'], // 人脸管控原因
-	workflow_efficient_date_type: ['workflowEfficientDateList', 'workflowEfficientDateMap'], // 有效时间
-	deploy_perosn_type: ['deployPerosnList', 'deployPerosnMap'], // 人像布控分类
-	portraint_deploy: ['portraintDeployList', 'portraintDeployMap'], // 人脸管控申请-分类
-	pboat_type: ['pboatTypeList', 'pboatTypeMap'], //  巡逻艇 > 船舶类型
-	pboat_purpose: ['pboatPurposeList', 'pboatPurposeMap'], //  巡逻艇用途
-	partol_way: ['partolWayList', 'partolWayMap'], //  巡逻方式
-	patrol_type: ['patrolTypeList', 'patrolTypeMap'], //  巡逻类型
-	zfzq_security_check_emergency: ['zfzq_security_check_emergencyList', 'zfzq_security_check_emergencyMap'], //  突发事件
-	patrol_category: ['patrolCategoryList', 'patrolCategoryMap'], //  巡逻类别
-	zfdj_record_datasource: ['zfdjRecordDatasourceList', 'zfdjRecordDatasourceMap'], //  巡逻类别
-	zfzq_zfdj_obj_type: ['zfzqZfdjObjTypeList', 'zfzqZfdjObjTypeMap'], //  走访对象类型
-	zfdj_status: ['zfdjStatusList', 'zfdjStatusMap'], //  走访对象类型
-	task_type: ['taskTypeList', 'taskTypeMap'], //  任务类型
-	zfzq_task_type: ['zfzqTaskList', 'zfzqTaskMap'], //  任务类型
-	patrol_action_type: ['patrolActionList', 'patrolActionMap'], //  检查分类 //  巡逻类型
-	zfzq_security_check_classify: ['zfzqSecurityCheckClassifyList', 'zfzqSecurityCheckClassifyMap'], //  治安检查-检查分类 //  巡逻类型
-	zajc_person_relation: ['zajcPersonList', 'zajcPersonMap'], //  人员检查关系
-	zajc_goods_type: ['zajcGoodsTypeList', 'zajcGoodsTypeMap'], //  物品种类
-	zfzq_security_check_ship_name_number: ['zfzqSecurityCheckShipNameNumberList', 'zfzqSecurityCheckShipNameNumberMap'], //  船名船号
-	zfzq_security_check_ship_check_result: ['zfzqSecurityCheckShipCheckResultList', 'zfzqSecurityCheckShipCheckResultMap'], //  船体检查
-	zfzq_security_check_type: ['zfzqSecurityCheckTypeList', 'zfzqSecurityCheckTypeMap'], //  检查类型
-	driver_qualification: ['driverQualificationList', 'driverQualificationMap'], //  驾驶员资质
-	pboat_source: ['pboatSourceList', 'pboatSourceMap'], //  巡逻艇来源
-	boat_materials: ['boatMaterialsList', 'boatMaterialsMap'], //  巡逻艇材料
-	radar_type: ['radarTypeList', 'radarTypeMap'], //  雷达类型
-	radar_transceiver_type: ["radarTransceiverTypeList", "radarTransceiverTypeMap"],  //  雷达厂商
-	radar_shielding_type: ['radarShieldingTypeList', 'radarShieldingTypeMap'], //  雷达屏蔽区
-	monitoring_type: ['monitoringTypeList', 'monitoringTypeMap'], //  视频监控类型
-	police_terminal: ['policeTerminalList', 'policeTerminalMap'], //  警用终端类型
-	shipboard_terminal_type: ['shipboardTerminalTypeList', 'shipboardTerminalTypeMap'], //  船载终端类型
-	shoreline_type: ['shorelineTypeList', 'shorelineTypeMap'], //  岸线港区分类
-	equ_state: ['equStateList', 'equStateMap'], //  设备状态
-	equ_state1: ['equState1List', 'equState1Map'],//智能机箱状态
-	harbourDistrict_type: ['harbourDistrictTypeList', 'harbourDistrictTypeMap'], //  岸线   港区类型
-	shoreline_element_warning_type: ['shoreline_element_warning_type', 'shoreline_element_warning_typeMap'], //  岸线  预警区类型
-	port_element_warning_type: ['port_element_warning_type', 'port_element_warning_typeMap'], //  港区  预警区类型
-	waters_element_warning_type: ['waters_element_warning_type', 'waters_element_warning_typeMap'], //  水域  预警区类型
-	warning_rule_operate_type: ['warningRuleOperateTypeList', 'warningRuleOperateTypeMap'], //  预警规则操作类型
-	target_type: ['targetTypeList', 'targetTypeMap'], //  水域  预警区类型
-	port_function: ['portFunctionList', 'portFunctionMap'], //  岸线   港口功能
-	road_type: ['roadTypeList', 'roadTypeMap'], //  岸线  进出港通道  支路、主路类型
-	road_level: ['roadLevelList', 'roadLevelMap'], //  岸线  进出港通道  支路、主路等级
-	anchorage_ground_type: ['anchorageGroundTypeList', 'anchorageGroundTypeMap'], //  岸线  锚地类型
-	anchorage_ground_area_type: ['anchorageGroundAreaTypeList', 'anchorageGroundAreaTypeMap'], //  岸线  锚地区域类型
-	anchorage_ground_function: ['anchorageGroundFunctionList', 'anchorageGroundFunctionMap'], //  岸线  锚地功能
-	fishing_port_type: ['fishingPortTypeList', 'fishingPortTypeMap'], //  岸线   渔港类型
-	temp_port_type: ['tempPortTypeList', 'tempPortTypeMap'], //  岸线   港岙口类型
-	workZone_type: ['workZoneTypeList', 'workZoneTypeMap'], //  岸线   作业区类型
-	seaArea_type: ['seaAreaTypeList', 'seaAreaTypeMap'], //  岸线   海域类型
-	divisionWarning_type: ['divisionWarningTypeList', 'divisionWarningTypeMap'], //  岸线   预警区域类型
-	ship_warning_level: ['shipWarningTypeList', 'shipWarningTypeMap'], //  岸线   预警级别
-	check_warning_level: ['checkWarningLevelList', 'checkWarningLevelMap', 'checkWarningLevelObjMap'], //  岸线   人车检查记录 是否预警
-	check_warning_level_config: ['checkWarningLevelConfigList', 'checkWarningLevelConfigMap', 'checkWarningLevelConfigObjMap'], //  岸线   人车检查记录 预警等级配置
-	check_warning_disposal_result: ['checkWarningDisposalResultList', 'checkWarningDisposalResultMap'], //  岸线   人车检查记录 处置结果
-	warning_status: ['warningStatusTypeList', 'warningStatusTypeMap'], //  岸线   预警状态
-	warning_type: ['warningTypeTypeList', 'warningTypeTypeMap'], //  岸线   预警类型
-	xqgl_warning_dispose_transmit: ['xqglWarningDisposeTransmitList', 'xqglWarningDisposeTransmitMap'], //  岸线   转发方式
-	warning_process_node: ['warningProcessNodeList', 'warningProcessNodeMap'], //  岸线  流程节点
-	xqgl_warning_accept_source: ['xqglWarningAcceptSourceList', 'xqglWarningAcceptSourceMap'], //  岸线  接收来源
-	xqgl_waring_model_param: ['xqglWaringModelTypeList', 'xqglWaringModelTypeMap'], //  岸线   预警模型参数
-	scope_warning: ['scopeWarningTypeList', 'scopeWarningTypeMap'], //  岸线   预警模型参数
-	customs_pass: ['customsPassList', 'customsPassMap'], //  岸线   卡口作用
-	bayonet_problem_type: ["bayonetProblemTypeList", "bayonetProblemTypeMap"],  //  岸线   问题类型
-	police_district: ['policeDistrictList', 'policeDistrictMap'], //  岸线   警务区作用
-	place_type: ['placeTypeList', 'placeTypeMap'], //  岸线   场所类型
-	island_type: ['islandTypeList', 'islandTypeMap'], //  岸线   岛屿类型
-	organization_type: ['organizationTypeList', 'organizationTypeMap'], //  岸线   政府机构类型
-	pablic_label_type: ['pablicLabelTypeList', 'pablicLabelTypeMap'], //  标签类型
-	sys_emergency_type: ['sysEmergencyTypeList', 'sysEmergencyTypeMap'], //  应急分类
-	docking_site_size: ['dockingSiteSizeList', 'dockingSiteSizeMap'], //  港口 泊位分类
-	port_subjection_type: ['portSubjectionTypeList', 'portSubjectionTypeMap'], //  行业场所、卡口 分类
-	sea_area_scope: ['seaAreaScopeList', 'seaAreaScopeMap'], //  海域 范围
-	gkss_type: ['gkssTypeList', 'gkssTypeMap'], //  海域 范围
-	water_based_facilities: ['water_based_facilities', 'water_based_facilitiesMap'], //  水上设施 类型
-	public_countries: ['publicCountriesList', 'publicCountriesMap'], //  国籍
-	cbgk_ship_shipowner_type: ['shipShipownerList', 'shipShipownerMap'], //  船主职位类型
-	cbgk_ship_person_type: ['shipPersonTypeList', 'shipPersonTypeMap'], //  船主类型
-	certificate_type: ['certificateTypeList', 'certificateTypeMap'], //  证件类型-个人
-	cbgk_shipowner_unit_certificate_type: ['certificateTypeUnitList', 'certificateTypeUnitMap'], //  证件类型-单位
-	cbgk_shipowner_association_certificate_type: ['certificateTypeAssociationList', 'certificateTypeAssociationMap'], //  证件类型-协会
-	public_nation: ['publicNationList', 'publicNationMap'], //  民族
-	culture_degree: ['cultureDegreeList', 'ultureDegreeMap'], //  文化程度
-	politics_status: ['politicsStatusList', 'politicsStatusMap'], //  政治面貌
-	public_relation: ['publicRelationList', 'publicRelationMap'], //  船舶管控 关系
-	sys_user_sex: ['sysUserSexList', 'sysUserSexMap'], //  行业场所 性别
-	cert_type: ['certTypeList', 'certTypeMap'], //  行业场所 证件类型
-	duty_status: ['dutyStatusList', 'dutyStatusMap'], //  值班状态
-	dev_duty_status: ['devDutyStatusList', 'devDutyStatusMap'], //  警车、巡逻艇状态
-	message_type: ['messageTypeList', 'messageTypeMap'], //  消息中心状态
-	message_center_process_notification: ['messageCenterProcessNotificationList', 'messageCenterProcessNotificationMap'],	//消息中心-流程通知
-	message_center_duty_requirements: ['messageCenterDutyRequirementsList', 'messageCenterDutyRequirementsMap'],	//消息中心-流程通知
-	message_center_verification_warning: ['messageCenterVerificationWarningList', 'messageCenterVerificationWarningMap'],	//消息中心-流程通知
-	zfzq_ajjl_data_source: ['dataSourceTypeList', 'dataSourceTypeMap'], //  案件记录数据来源
-	cbgk_is_key: ['cbgkIsKeyList', 'cbgkIsKeyMap'],//船舶管控>是否重点
-	cbgk_change_type: ['cbgkChangeTypeList', 'cbgkChangeTypeMap'],// 船舶变更类型
-	cbgk_is_has_photo: ['cbgkIsHasPhotoList', ' cbgkIsHasPhotoMap'],//船舶管控>是否存在船舶照片
-	cbgk_sea_work_type: ['cbgkSeaWorkTypeList', 'cbgkSeaWorkTypeMap'],//船舶管控>船舶出海作业类型
-	cbgk_to_sea_cause: ['cbgkToSeaCauseList', 'cbgkToSeaCauseMap'],//船舶管控>出海事由
-	cbgk_del_type: ['cbgkDelTypeList', 'cbgkDelTypeMap'], //  船舶管控 > 注销理由
-	ship_audit_status: ['shipAuditStatusList', 'shipAuditStatusMap'], //  船舶管控 > 船舶审核状态
-	cbgk_ship_type: ['cbgkShipTypeList', 'cbgkShipTypeMap'], //  船舶管控 > 船舶类型
-	cbgk_cancel_type: ['cbgkCancelTypeList', 'cbgkCancelTypeMap'],//船舶管控>船舶类型(已注销)
-	cbgk_dismantle_type: ['cbgkDismantleTypeList', 'cbgkDismantleTypeMap'],//拆解类型
-	cbgk_dismantle_cause: ['cbgkDismantleCauseList', 'cbgkDismantleCauseMap'],//报废原因
-	cbgk_ship_nature: ['cbgkShipNatureList', 'cbgkShipNatureMap'], //  船舶管控 > 船舶性质
-	cbgk_ship_purpose: ['cbgkShipPurposeList', 'cbgkShipPurposeMap'], //  船舶管控 > 船舶用途1
-	workflow_state: ['workflowStateList', 'workflowStateMap'], //  船舶管控 > 申请状态字典
-	cbgk_trade_association_type: ['cbgkTradeAssociationTypeList', 'cbgkTradeAssociationTypeMap'], //  船舶管控 > 协会类型
-	cbgk_ship_post: ['cbgkShipPostList', 'cbgkShipPostMap'], //  船舶管控 > 船上职务
-	cbgk_crew_type: ['cbgkCrewTypeList', 'cbgkCrewTypeMap'], //  船舶管控 > 出海人员类型
-	fisherman_type: ['fishermanTypeList', 'fishermanTypeMap'], //  船舶管控 > 出海人员类型
-	cbgk_ship_post_new: ['cbgkShipPostNewList', 'cbgkShipPostNewMap'], //  船舶管控 > 出海人员管理 > 船员信息 > 船上职务
-	cbgk_org_type: ['cbgkOrgTypeList', 'cbgkOrgTypeMap'], //  船舶管控 > 企业类型
-	tb_f_port_temporary: ['tbFPortTemporaryList', 'tbFPortTemporaryMap'], //  船舶管控 > 常驻停泊点
-	home_port_area_type: ['homePortAreaTypeList', 'homePortAreaTypeMap'], //  船舶管控 > 船港籍
-	cbgk_ship_source: ['cbgkShipSourceList', 'cbgkShipSourceMap'], //  船舶管控 > 船舶来源
-	cbgk_ship_certificate_type: ['cbgkShipCertificateTypeList', 'cbgkShipCertificateTypeMap'], //  船舶管控 > 船舶证件类型
-	cbgk_ship_person: ['cbgkShipPersonList', 'cbgkShipPersonMap'], //  船舶管控 > 船舶人员证件类型
-	cbgk_check_status: ['cbgkCheckStatusList', 'cbgkCheckStatusMap'], //  船舶管控 > 船舶核查 > 核查状态
-	cbgk_port_check_status: ['cbgkPortCheckStatusList', 'cbgkPortCheckStatusMap'], // 动态船舶进出港核查状态
-	gak_perception_type: ['gakPerceptionTypeList', 'gakPerceptionTypeMap'],	//感知状态
-	gak_sort_way: ['gakSortWayList', 'gakSortWayMap'],	//进出港排序方式
-	gak_current_position: ['gakCurrentPositionList', 'gakCurrentPositionMap'],	//在港、当前未知
-	report_status: ['reportStatusList', 'reportStatusMap'], //  船舶进出港 > 船舶进出港记录 > 报备状态
-	person_report_status: ['personReportStatusList', 'personReportStatusMap'], //  人员进出港 > 人员报备进出港记录 > 人员报备状态
-	warning_signal_source: ['warningSignalSourceList', 'warningSignalSourceMap'], //  预警信号源
-	inport_signal_source: ['inportSignalSourceList', 'inportSignalSourceMap'], //  预警信号源-在港
-	activity_characteristics: ['activityCharacteristicsList', 'activityCharacteristicsMap'], //  活动特点
-	cbgk_check_type: ['cbgkCheckTypeList', 'cbgkCheckTypeMap'], //  船舶管控 > 船舶核查 > 核查类型
-	cbgk_check_result: ['cbgkCheckResultList', 'cbgkCheckResultMap'], //  船舶管控 > 船舶核查 > 核查结果
-	cbgk_ship_status: ['cbgkShipStatusList', 'cbgkShipStatusMap'], //  船舶管控 > 船舶信息 > 船舶状态
-	port_state: ['portStateList', 'portStateMap'], //  船舶管控 > 港口管理 > 船舶进出港动态
-	departure_reason: ['departureReasonList', 'departureReasonMap'], //  船舶管控 > 港口管理 > 船舶进出港动态
-	cbgk_work_zone: ['cbgkWorkZoneList', 'cbgkWorkZoneMap'], //    出装备管控 > 进出港记录 > 作业区海域
-	shuangLiuReason: ['shuangLiuReasonList', 'shuangLiuReasonMap'], //    出装备管控 > 进出港记录 > 进出港事由
-	intelligence_clue_type: ['intelligenceClueTypeList', 'intelligenceClueTypeMap'],//线索类型
-	sys_user_status: ['sysUserStatusList', 'sysUserStatusMap'], //  用户状态
-	cbgk_data_source: ['cbgkDataStatusList', 'cbgkDataStatusMap'], //  数据报备来源
-	cbgk_key_person: ['cbgkKeyPersonList', 'cbgkKeyPersonMap'],	// 是否布控
-	cbgk_deploy_person: ['cbgkDeployPersonList', 'cbgkDeployPersonMap'],	// 是否重点
-	cbgk_person_region: ['cbgkPersonRegionList', 'cbgkPersonRegionMap'],	// 地区
-	xqgl_warning_source: ['xqgl_warning_source', 'xqgl_warning_source_map'], // 预警来源
-	target_state: ['target_state_list', 'target_state_map'], // 船舶预警目标状态
-	task_jldpjjd: ['taskJldpjjdList', 'taskJldpjjdMap'], // 警力调派紧急度
-	area_type: ['areaTypeList', 'areaTypeMap'], // 警力调派紧急度
-	gzqt_date: ['gzqtDateList', 'gzqtDateMap'],//关注群体-规则配置-有效期
-	follow_rule_property: ['followRulePropertyList', 'followRulePropertyMap'],
-	gzqt_clnx: ['gzqtClnxList', 'gzqtClnxMap'],
-	follow_rule_condition: ['followRuleConditionList', 'followRuleConditionMap'],
-	law_enforcement_type: ['lawEnforcementTypeList', 'lawEnforcementTypeMap'],
-	message_level: ['messageLevelList', 'messageLevelMap'],//信息级别
-	corner_mark: ['cornerMarkList', 'cornerMarkMap'],	//消息中心角标
-	check_car_type: ['checkCarTypeList', 'checkCarTypeMap'],
-	check_person_type: ['checkPersonTypeList', 'checkPersonTypeMap'],	//消息中心角标
-	person_check_type: ['personCheckTypeList', 'personCheckTypeMap'],	//消息中心角标
-	//	预警
-	warning_deal: ['warning_deal', 'warning_dealMap'],		//	处置结论
-	xqgl_person_warning_cause: ['personWarningCauseList', 'personWarningCauseMap'],		//	人员进出港预警原因
-	xqgl_warning_dispose_effectiveness: ['warningDisposeEffectivenessList', 'warningDisposeEffectivenessMap'], //预警处置有效性
-	// 意见反馈
-	ptgl_problem_type: ['ptglProblemTypeList', 'ptglProblemTypeMap'], // 问题类型
-	ptgl_priority: ['ptglPriorityList', 'ptglPriorityMap'], // 问题优先级
-	solve_progress: ['solveProgressList', 'solveProgressMap'], // 解决进度
-
-	// 重点对象
-	risk_level: ['riskLevelList', 'riskLevelMap'], // 风险等级
-	key_car_type: ['keyCarTypeList', 'keyCarTypeMap'], // 重点车辆分类
-	important_car_status: ['importantCarStatusList', 'importantCarStatusListMap'], // 重点车辆分类
-	key_person_type: ['keyPersonTypeList', 'keyPersonTypeListMap'], // 重点人员分类
-	key_ship_type: ['keyShipTypeList', 'keyShipTypeListMap'], // 重点船舶分类warning_person_deploy_type
-	warning_person_deploy_type: ['warningPersonDeployTypeList', 'warningPersonDeployTypeMap'], // 重点船舶分类
-	// 接触警
-	disposal_situation: ['disposalSituationList', 'disposalSituationListMap'], // 处置情况字典
-	feedback_status: ['feedbackStatusList', 'feedbackStatusListMap'], // 反馈情况字典
-	zfzq_police_source: ['zfzqPoliceSourceList', 'zfzqPoliceSourceListMap'],
-	zfzq_launching_type: ['zfzqLaunchingTypeList', 'zfzqLaunchingTypeListMap'],
-	// 灾害事故
-	zfzq_zhsg_type: ['zfzqZhsgTypeList', 'zfzqZhsgTypeListMap'], // 事故类型
-	zfzq_fxsj_type: ['zfzqFxsjTypeList', 'zfzqFxsjTypeMap'], // 事故类型
-	disaster_involved_type: ['disasterInvolvedTypeList', 'disasterInvolvedTypeListMap'], // 涉案类型
-	ajjl_xs_case_status: ['ajjlXsCaseStatusList', 'ajjlXsCaseStatusMap'], // 案件状态  刑事
-	ajjl_xz_case_status: ['ajjlXzCaseStatusList', 'ajjlXzCaseStatusMap'], // 案件状态  行政
-	// 风险事件
-	legal_manage_risk_type: ['legalManageRiskTypeList', 'legalManageRiskTypeListMap'], // 事件类型
-	person_car_relation: ['person_car_relation_list', 'person_car_relation_map'], // 人车关系
-	// 战果记录
-	zggl_zfzq_type: ['zgglZfzqTypeList', 'zgglZfzqTypeMap'],	// 执法执勤
-	// zggl_zfzq_bkbj: ['zgglZfzqBkbjList', 'zgglZfzqBkbjMap'],	// 执法执勤不可编辑
-	zggl_dict_type: ['zgglDictTypeList', 'zgglDictTypeMap'],	// 自定义
-	//执法流程类型
-	zfzq_law_process_type: ['zfzqLawprocessTypeList', 'zfzqLawprocessTypeMap'],	// 自定义
-
-	// 警情类型
-	zfzq_alarm_type: ['zfzqAlarmTypeList', 'zfzqAlarmTypeMap'], // 警情判定
-	zfzq_alarm_alart_level: ['zfzqAlarmLevelList', 'zfzqAlarmLevelListMap'], // 警情级别
-	zfzq_jcj_class: ['zfzqJcjClassList', 'zfzqJcjClassMap'], // 警情大类
-	bigscreen_dept_type: ['zfzqbigscreen_deptList', 'bigscreen_deptMap'], // 部门类型
-	administrative_division: ['administrativeDivisionList', 'administrativeDivisionMap'], // 行政区划
-
-	// 装备设备 警车
-	police_deployment_type: ['policeDeploymentTypeList', 'policeDeploymentTypeMap'], // 调派事由
-	hainan_province_name: ['hainanProvinceNameList', 'hainanProvinceNameMap'], // 出发地目的地
-
-	// 要情报告
-	nbgl_criminal_states: ['nbglCriminalStatesList', 'nbglCriminalStatesMap'], // 刑事案件状态
-	nbgl_criminal_type: ['nbglCriminalTypeList', 'nbglCriminalTypeMap'], // 刑事案件分类
-	nbgl_administrative_states: ['nbglAdministrativeStatesList', 'nbglAdministrativeStatesMap'], // 治安行政案件状态
-	nbgl_administrative_type: ['nbglAdministrativeTypeList', 'nbglAdministrativeTypeMap'],// 治安行政案件分类
-	workflow_focus_classification_type: ['workflow_focus_classification_typeList', 'workflow_focus_classification_typeMap'], // 治安行政案件分类
-	workflow_urgency_type: ['workflow_urgency_typeList', 'workflow_urgency_typeMap'], // 紧急度
-	nbgl_emergency_type: ['nbgl_emergency_type', 'nbgl_emergency_typeMap'], // 紧急度
-	car_deploy: ['car_deploy_type', 'car_deploy_typeMap'], // 车辆管控分类
-	workflow_car_suitability: ['workflow_car_suitability_type', 'workflow_car_suitability_typeMap'], // 车辆管控匹配度
-	workflow_car_area_type: ['workflow_car_area_list', 'workflow_car_area_typeMap'], // 车牌
-	matter_type: ['matter_type_list', 'matter_type_typeMap'], // 事项
-	message_notice_type: ['message_notice_type_list', 'message_notice_type_Map'], // 通知类型
-	equipment_type: ['equipment_type_list', 'equipment_type_Map'], // 通知类型
-	workflow_coordination_task_type: ['workflow_coordination_task_typelist', 'workflow_coordination_task_typeMap'], // 分类任务
-
-	//应急岗位
-
-	emergency_post: ['emergencyPostList', 'emergencyPostMap'],
-
-	zfzq_security_check_ship_person_check: ['ship_person_check_list', 'ship_person_check_Map'],	//治安检查-人员检查
-	zfzq_security_ship_person_check: ['zfzqSecurityShipPersonCheckList', 'zfzqSecurityShipPersonCheckMap'],	//治安检查-检查结果
-
-	cbgk_resolve_way: ['cbgkResolveWayList', 'cbgkResolveWayMap'],	//船舶注销-注销分解方式
-	cbgk_cancel_broken_plan: ['cbgkCancelBrokenPlanList', 'cbgkCancelBrokenPlanMap'],	//船舶注销-注销后置计划
-	cbgk_scrap_reason: ['cbgkScrapReasonList', 'cbgkScrapReasonMap'],	//船舶注销-注销报废原因
-	cbgk_loss_reason: ['cbgkLossReasonList', 'cbgkLossReasonMap'],	//船舶注销-注销灭失原因
-	cbgk_buy_type: ['cbgkBuyTypeList', 'cbgkBuyTypeMap'],	//船舶变更-买方类型
-	cbgk_workflow_state: ['cbgkWorkflowStateList', 'cbgkWorkflowStateMap'],	//船舶流入流出-审批状态
-	cbgk_adjust_audit_result: ['cbgkAdjustAuditResultList', 'cbgkAdjustAuditResultMap'],	//船舶变更申请-核查结果
-	cbgk_cancel_audit_result: ['cbgkCancelAuditResultList', 'cbgkCancelAuditResultMap'],	//船舶注销申请-核查结果
-	cbgk_terminal_install: ['cbgkTerminalInstallList', 'cbgkTerminalInstallMap'],	// 终端安装
-	xqgl_exemption_visa: ['xqglExemptionVisaList', 'xqglExemptionVisaMap'],	// 59国免签人员-签证种类
-	xqgl_exemption_certificate: ['xqglExemptionCertificateList', 'xqglExemptionCertificateMap'],	// 59国免签人员-证件种类
-	xqgl_exemption_port: ['xqglExemptionPortList', 'xqglExemptionPortMap'],	// 59国免签人员-出入境口岸
-	xqgl_exemption_administrative: ['xqglExemptionAdsList', 'xqglExemptionAdsMap'],	// 59国免签人员-行政区划
-	port_is_virtually: ['portIsVirtuallyList', 'portIsVirtuallyMap'],	// 港区-是否为虚拟大港
-
-	xqgl_waring_army_model_type: ['xqglWaringArmyModelTypeList', 'xqglWaringArmyModelTypeMap'], // 军民融合办预警-研判模型类型
-	xqgl_waring_army_dispose_status: ['xqglWaringArmyDisposeStatusList', 'xqglWaringArmyDisposeStatusMap'], // 军民融合办预警-处置状态
-	xqgl_waring_army_ship_type: ['xqglWaringArmyShipTypeList', 'xqglWaringArmyShipTypeMap'], // 军民融合办预警-船舶状态
-	dept_level: ['deptLevelList', 'deptLevelMap'],	//	部门级别
-
-
-
-	//卡口深度字典
-	ageGroup:['ageGroupList','ageGroupMap'], //年龄组
-	human_glass:['humanGlassList','humanGlassMap'], //戴眼镜
-	human_gender:['humanGenderList','humanGenderMap'], //性别
-	vehicle_direction:['vehicleDirectionList','vehicleDirectionMap'], //车辆行驶方向
-	human_smile:['humanSmileList','humanSmileMap'], //微笑
-	plate_location_location:['plateLocationLocationList','plateLocationLocationMap'], //车牌号
-	plate_state:['plateStateList','plateStateMap'], //车牌状态
-	warn_car:['warnCarList','warnCarMap'], //有无预警车辆
-	vehicle_color:['vehicleColorList','vehicleColorMap'], //车辆颜色
-	vehicle_type:['vehicleTypeList','vehicleTypeMap'], //车辆类型
-	plate_type:['plateTypeList','plateTypeMap'], //车牌类型,
-	bs_plate_color:['bsPlateColorList','bsPlateColorMap'], //车牌颜色,
-	plate_forward_side:['plateForwardSideList','plateForwardSideMap'], //拍色角度,
-	human_mask:['humanMaskList','humanMaskMap'], //戴口罩,
-	custom_labels_car_warning_type:['customLabelsCarWarningTypeList','customLabelsCarWarningTypeMap'], //预警车辆
-	custom_labels_person_warning_type:['customLabelsPersonWarningTypeList','customLabelsPersonWarningTypeMap'], //预警人员
+	//接口参数 : [ '字典数据下拉', '字典数据直接翻译', '字典数据翻译对象' ],
+	login_status: ['loginStatusList', 'loginStatusMap', 'loginStatusObjMap'], //	登录日志-登录状态
 }
 
 const stateMap = {}
 Object.keys(dictionaryDefine).map(i => {
 	stateMap[dictionaryDefine[i][0]] = []
 	stateMap[dictionaryDefine[i][1]] = new Map()
+	stateMap[dictionaryDefine[i][2]] = new Map()
 })
+// @ts-ignore
 export const dictionary = stateMap

+ 38 - 335
src/store/modules/dictionary.ts

@@ -1,356 +1,59 @@
-import * as api from '@/api/index'
-import { dictionary, dictionaryDefine } from './dictionary-define.js'
+// import {getDeptList} from "@/api/modules/dept";
+// import {dictDataType} from "@/api/modules/dict";
+import { dictionary, dictionaryDefine } from './dictionary-define'
 
 const state = {
 	...dictionary,
-	caseTypeTree: [],	// 案件类型级联
-	caseTypeTreeMap: new Map(),	// 案件类型级联
-	cbglPersonDictionary: [],	// 船籍港一级
-	cbglPersonDictionaryMap: new Map(), // 船籍港一级
-	portOfRegistryTwoList: [],	// 船籍港二级
-	portOfRegistryTwoMap: new Map(), // 船籍港二级
-	cbglPersonTemporary: [],	// 常驻停泊点一级
-	cbglPersonTemporaryMap: new Map(), // 常驻停泊点一级
-	residentMooringPointTwoList: [],	// 常驻停泊点二级
-	residentMooringPointTwoMap: new Map(), // 常驻停泊点二级
-  ShipData:{
-		ShipId:'',
-		ShipStatus:'',
-		getStatus:false
-	},
-	bayonetDeepCheckList: {
-		all: [],
-		car: [],
-		face: []
-	},	//	卡口深度核查-点位选择-地图框选卡口标点数据
-	bayonetDeepCheckTree: {
-		car: [],
-		face: []
-	},	//	卡口深度核查-点位选择-树弹窗选择数据
-	bayonetDeepCheckTreeMap: {
-		car: new Map(),
-		face: new Map()
-	},	//	卡口深度核查-点位选择-树弹窗选择数据-Map翻译
-	videoList: [],	//	视频监控
-	videoMap: new Map(),	//	视频监控
-	portList: [], //	港口
-	portMap: new Map(),	//	港口
+}
+
+const getters = {
 }
 
 const mutations = {
-	SET_SHIPDATA_ID(state, data){
-         switch (data.type) {
-			 case 'id':
-				state.ShipData.ShipId=data.value
-				state.ShipData.getStatus=false
-				 break
-			 case 'get':
-				state.ShipData.ShipId=data.value
-				state.ShipData.getStatus=true
-				 break
-			 case 'sta':
-				state.ShipData.ShipStatus=data.value
-				 break
-		 }
-	},
 	SET_DICT_LIST(state: any, { listName, mapName, objMapName, data }: any) {
-		const map = new Map()
-		const objMap = new Map()
-		if (data.length > 0) {
-			data.forEach((v: any) => {
-				v.selectLabel = v.dictLabel
-				v.selectValue = v.dictValue
-				map.set(v.dictValue, v.dictLabel)
-				objMap.set(v.dictValue, v)
-			})
-		}
-		state[listName] = data
-		state[mapName] = map
-		state[objMapName] = objMap
-	},
-	SET_CASE_TYPE_TREE(state: any, data: Array<any>) {
-		const map = new Map()
-		const deep = (arr: any) => {
-			arr.forEach((v: any) => {
-				map.set(v.value, v.label)
-				if (v.children?.length > 0) {
-					deep(v.children)
-				}
-			})
-		}
-		deep(data)
-		state.caseTypeTree = data
-		state.caseTypeTreeMap = map
-	},
-	SET_PORT_OF_REGISTRY(state: any, {one, two}: any) {
-		const mapOne = new Map()
-		const mapTwo = new Map()
-		one.forEach((v: any) => {
-			mapOne.set(v.dictType, v.dictName)
-		})
-		two.forEach((v: any) => {
-			mapTwo.set(v.dictValue, v.dictName)
-		})
-		state.cbglPersonDictionary = one
-		state.cbglPersonDictionaryMap = mapOne
-		state.portOfRegistryTwoList = two
-		state.portOfRegistryTwoMap = mapTwo
-	},
-	SET_RESIDENT_MOORING_POINT(state: any, {one, two}: any) {
-		const mapOne = new Map()
-		const mapTwo = new Map()
-		one.forEach((v: any) => {
-			mapOne.set(v.dictType, v.dictName)
-		})
-		two.forEach((v: any) => {
-			mapTwo.set(v.dictValue, v.dictName)
-		})
-		state.cbglPersonTemporary = one
-		state.cbglPersonTemporaryMap = mapOne
-		state.residentMooringPointTwoList = two
-		state.residentMooringPointTwoMap = mapTwo
-	},
-	SET_BAYONET_DEEP_CHECK(state, {carTree, faceTree, bayonetAll, bayonetCar, bayonetFace}) {
-		const carTreeMap = new Map()
-		const faceTreeMap = new Map()
-		const deepTree = (map, arr, pObj: any = []) => {
-			return arr.map(v => {
-				v.cIds = []
-				if (!v.children && v.videos) {
-					v.children = v.videos
-				}
-				v.videoNum = 0
-				if (v.indexCode === undefined) {
-					v.source = 'dept'
-					v.treeName = v.deptName
-					v.treeId = v.deptId + v.deptName
-				} else {
-					v.source = 'video'
-					v.treeName = v.name
-					v.treeId = v.name
-					pObj.forEach((p: any, i) => {
-						p.videoNum++
-						if (i === pObj.length - 1) {
-							p.lastDept = true
-						}
-					})
-				}
-				v.pIds = pObj.map((p: any) => {
-					p.cIds.push(v.treeId)
-					return p.treeId
-				})
-				if (v.children?.length > 0) {
-					v.children = deepTree(map, v.children, [...pObj, v])
-				}
-				map.set(v.treeId, v)
-				return v
-			})
-		}
-		state.bayonetDeepCheckList.all = bayonetAll
-		state.bayonetDeepCheckList.car = bayonetCar
-		state.bayonetDeepCheckList.face = bayonetFace
-		state.bayonetDeepCheckTree.car = deepTree(carTreeMap, carTree)
-		state.bayonetDeepCheckTreeMap.car = carTreeMap
-		state.bayonetDeepCheckTree.face = deepTree(faceTreeMap, faceTree)
-		state.bayonetDeepCheckTreeMap.face = faceTreeMap
-	},
-	SET_VIDEO(state, data) {
-		const map = new Map()
-		data.forEach(v => {
-			if (v.equipmentNumber) {
-				map.set(v.equipmentNumber, v)
-			}
-		})
-		state.videoMap = map
-		state.videoList = data
-	},
-	SET_PORT (state, data) {
-		const map = new Map()
-		data.forEach(v => {
-			map.set(v.id, v)
-		})
-		state.portList = data
-		state.portMap = map
+		// const map = new Map()
+		// const objMap = new Map()
+		// if (data.length > 0) {
+		// 	data.forEach((v: any) => {
+		// 		v.selectLabel = v.dictLabel
+		// 		v.selectValue = v.dictValue
+		// 		map.set(v.dictValue, v.dictLabel)
+		// 		objMap.set(v.dictValue, v)
+		// 	})
+		// }
+		// state[listName] = data
+		// state[mapName] = map
+		// state[objMapName] = objMap
 	},
 }
 
 const actions = {
 	LOAD_DICT_LIST({ commit }: any, type: any) {
-		return new Promise((resolve, reject) => {
-			if (state[dictionaryDefine[type][0]].length === 0) {
-				api.default.dicDeptDictList(type).then((res: any) => {
-					commit('SET_DICT_LIST', {
-						listName: dictionaryDefine[type][0],
-						mapName: dictionaryDefine[type][1],
-						objMapName: dictionaryDefine[type]?.[2],
-						data: res.data
-					})
-					resolve(res.data)
-				}).catch((e: any) => {
-					console.log('e: ', e);
-					reject('获取'+dictionaryDefine[type][0]+'字典错误')
-				})
-			} else {
-				resolve(state[dictionaryDefine[type][0]])
-			}
-		})
-	},
-	LOAD_CASE_TYPE({ commit }: any, refresh = false) {
-		return new Promise((resolve, reject) => {
-			if (state.caseTypeTree?.length > 0 && !refresh) {
-				resolve(state.caseTypeTree)
-			} else {
-				api.default.getCaseTypeTree({
-					caseTypeSource: 'xjz'
-				}).then((res: any) => {
-					if (res.code === 200) {
-						commit('SET_CASE_TYPE_TREE', res.data)
-					} else {
-						reject(null)
-					}
-				}).catch(() => {
-					reject(null)
-				})
-			}
-		})
-	},
-	// 船籍港
-	LOAD_PORT_OF_REGISTRY({ commit }: any, refresh = false) {
-		return new Promise((resolve, reject) => {
-			if (state.cbglPersonDictionary?.length > 0 && !refresh) {
-				resolve(state.cbglPersonDictionary)
-			} else {
-				api.default.cbglPersonDictionary().then((res: any) => {
-					if (res.code === 200) {
-						const one = res.data
-						Promise.all([
-							...one.map((v: any) => api.default.cbglPersonDictionary2(v.dictType))
-						]).then((res) => {
-							const two: any = []
-							res.forEach((v: any, i: number) => {
-								if (v.code === 200) {
-									two.push(...v.data.map((s: any) => {
-										s.parent = one[i].dictType
-										return s
-									}))
-								} else {
-									two.push([])
-								}
-							})
-							commit('SET_PORT_OF_REGISTRY', {one, two})
-							resolve({one, two})
-						}).catch(() => {
-							reject(null)
-						})
-					} else {
-						reject(null)
-					}
-				}).catch(() => {
-					reject(null)
-				})
-			}
-		})
-	},
-	// 常驻停泊点
-	LOAD_RESIDENT_MOORING_POINT({ commit }: any, refresh = false) {
-		return new Promise((resolve, reject) => {
-			if (state.cbglPersonTemporary?.length > 0 && !refresh) {
-				resolve(state.cbglPersonTemporary)
-			} else {
-				api.default.cbglPersonTemporary().then((res: any) => {
-					if (res.code === 200) {
-						const one = res.data
-						Promise.all([
-							...one.map((v: any) => api.default.cbglPersonTemporary2(v.dictType))
-						]).then((res) => {
-							const two: any = []
-							res.forEach((v: any, i: number) => {
-								if (v.code === 200) {
-									two.push(...v.data.map((s: any) => {
-										s.parent = one[i].dictType
-										return s
-									}))
-								} else {
-									two.push([])
-								}
-							})
-							commit('SET_RESIDENT_MOORING_POINT', {one, two})
-							resolve({one, two})
-						}).catch(() => {
-							reject(null)
-						})
-					} else {
-						reject(null)
-					}
-				}).catch(() => {
-					reject(null)
-				})
-			}
-		})
-	},
-	//	卡口深度核查-卡口数据
-	LOAD_BAYONET_DEEP_CHECK({commit}, refresh = false){
-		return new Promise((resolve, reject) => {
-			if (state.bayonetDeepCheckList.all.length === 0 || refresh) {
-				//	api请求数据
-				Promise.all([
-					api.default.getVideoHKTree('car'),
-					api.default.getVideoHKTree('face'),
-					api.default.getVideoMap(),
-					api.default.getVideoMap(`type=car`),
-					api.default.getVideoMap(`type=face`),
-				]).then(([carTreeRes, faceTreeRes, bayonetAllRes, bayonetCarRes, bayonetFaceRes]) => {
-					commit('SET_BAYONET_DEEP_CHECK', {
-						carTree: [carTreeRes.data] || [],
-						faceTree: [faceTreeRes.data] || [],
-						bayonetAll: bayonetAllRes.data || [],
-						bayonetCar: bayonetCarRes.data || [],
-						bayonetFace: bayonetFaceRes.data || []
-					})
-					resolve('')
-				})
-			} else {
-				resolve('')
-			}
-		})
-	},
-	//	视频监控数据
-	LOAD_VIDEO({commit}, deptId, refresh = false){
-		return new Promise((resolve, reject) => {
-			if (state.videoList.length === 0 || refresh) {
-				api.default.monitoringList(`pageNum=1&pageSize=5000&deptId=${deptId}`).then(res => {
-					if (res.code === 200 && res.rows?.length > 0) {
-						commit('SET_VIDEO', res.rows)
-					}
-					resolve(state.videoList)
-				})
-			} else {
-				resolve(state.videoList)
-			}
-		})
+		// return new Promise((resolve, reject) => {
+		// 	if (state[dictionaryDefine[type][0]].length === 0) {
+		// 		dictDataType(type).then((res: any) => {
+		// 			commit('SET_DICT_LIST', {
+		// 				listName: dictionaryDefine[type][0],
+		// 				mapName: dictionaryDefine[type][1],
+		// 				objMapName: dictionaryDefine[type]?.[2],
+		// 				data: res.data
+		// 			})
+		// 			resolve(res.data)
+		// 		}).catch((e: any) => {
+		// 			console.log('e: ', e);
+		// 			reject('获取'+dictionaryDefine[type][0]+'字典错误')
+		// 		})
+		// 	} else {
+		// 		resolve(state[dictionaryDefine[type][0]])
+		// 	}
+		// })
 	},
-	LOAD_PORT ({ commit }, refresh = false) {
-		return new Promise((resolve, reject) => {
-			if (state.portList.length === 0 || refresh) {
-				api.default
-					.portList()
-					.then(res => {
-						commit('SET_PORT', res.rows)
-						resolve(res.rows)
-					})
-					.catch(() => {
-						reject('获取港岙口列表错误')
-					})
-			} else {
-				resolve(null)
-			}
-		})
-	}
 }
 
 export default {
 	namespaced: true,
 	state,
+	getters,
 	mutations,
 	actions
 }

+ 21 - 0
src/utils/permissions.ts

@@ -0,0 +1,21 @@
+import store from '@/store/index'
+
+//跳转登录
+export const toLogin = () => {
+  sessionStorage.clear();
+  window.location.replace("/login");
+}
+
+export const has = (value: any) => {
+  const permissions = store.state.app.permissions;
+  let hasPermissions = null
+  if (value && value instanceof Array && value.length > 0) {
+    hasPermissions = permissions.some((p: string) => value.includes(p));
+  } else {
+    hasPermissions = permissions.includes(value)
+  }
+  if (hasPermissions) {
+    return true
+  }
+  return false
+}

+ 18 - 0
src/utils/util.ts

@@ -392,6 +392,24 @@ export const randomNum = (min = 0, max = 0, decimal=0) => {
   }
 }
 
+export const downloadFile = ({ data, headers }: any, fName: string = '') => {
+  let fileName = /.*filename=(.*)/i.exec(headers["content-disposition"])?.[1] || '下载';
+  if (fName) {
+    fileName = `${fName}${fileName.substring(fileName.indexOf('.'), fileName.length)}`
+  }
+  const a = document.createElement("a");
+  a.style.display = "none";
+  const url = (window.URL || window.webkitURL).createObjectURL(
+      new Blob([data], {
+        type: headers["content-type"]
+      })
+  );
+  a.href = url
+  a.download = decodeURIComponent((fileName));
+  a.dispatchEvent(new MouseEvent("click"));
+  (window.URL || window.webkitURL).revokeObjectURL(url);
+}
+
 /**
  *
  * @param val 处理的数值

+ 40 - 0
src/views/gis/index.vue

@@ -0,0 +1,40 @@
+<template>
+  asdasds
+</template>
+
+<script lang="ts">
+import {
+  defineComponent,
+  computed,
+  onMounted,
+  ref,
+  reactive,
+  watch,
+  getCurrentInstance,
+  ComponentInternalInstance,
+  toRefs,
+  nextTick
+} from 'vue'
+import {useStore} from 'vuex'
+import {useRouter, useRoute} from 'vue-router'
+
+export default defineComponent({
+  name: '',
+  components: {},
+  setup() {
+    const store = useStore();
+    const router = useRouter();
+    const route = useRoute();
+    const that = (getCurrentInstance() as ComponentInternalInstance).appContext.config.globalProperties
+    const state = reactive({
+
+    })
+    return {
+      ...toRefs(state),
+    }
+  },
+})
+</script>
+
+<style scoped lang="scss">
+</style>

+ 0 - 207
src/views/global/head/info.vue

@@ -1,207 +0,0 @@
-<template>
-  <CusDialog
-      title="个人信息"
-      :show="show"
-      @close="$emit('update:show', false)"
-      @submit="onSubmit"
-      width="700px"
-      height="500px"
-      :loading="loading"
-  >
-    <div class="info-main">
-      <CusForm class="form" labelWidth="140px" ref="ref_form">
-        <div class="left">
-          <CusFormColumn
-              :disabled="true"
-              :span="24"
-              required
-              label="警号:"
-              v-model:param="userInfo.alarm"/>
-          <CusFormColumn
-              :disabled="true"
-              :span="24"
-              link="select"
-              label="状态:"
-              v-model:param="userInfo.status"
-              :options="$store.state.dictionary.sysUserStatusList"/>
-          <CusFormColumn
-              :span="24"
-              required
-              label="姓名:"
-              v-model:param="userInfo.nickName"/>
-          <CusFormColumn
-              :span="24"
-              required
-              link="select"
-              label="性别:"
-              v-model:param="userInfo.sex"
-              :options="$store.state.dictionary.sysUserSexList"/>
-          <CusFormColumn
-              :span="24"
-              required
-              label="手机号:"
-              v-model:param="userInfo.phonenumber"
-              :rules="[{
-                handle: (val) => $store.state.regex.phoneCN.test(val),
-                message: '手机号格式错误'
-              }]"
-          />
-          <CusFormColumn
-              :span="24"
-              required
-              label="电子邮件:"
-              v-model:param="userInfo.email"
-              :rules="[{
-                handle: (val) => $store.state.regex.email.test(val),
-                message: '电子邮件格式错误'
-              }]"
-          />
-          <CusFormColumn
-              :disabled="true"
-              :span="24"
-              label="所在单位:"
-              v-model:param="userInfo.deptName"/>
-        </div>
-        <div class="right">
-          <CusFormColumn
-              labelWidth="60px"
-              :span="24"
-              link="upload"
-              layout="card"
-              v-model:param="avatar"
-              :limit="1"
-              type="img"
-              nameKey="fName"
-              urlKey="fUrl"
-              :delRule="(file) => true"
-              limitNoUpload
-          />
-        </div>
-      </CusForm>
-    </div>
-  </CusDialog>
-</template>
-
-<script lang="ts">
-import {
-  defineComponent,
-  computed,
-  onMounted,
-  ref,
-  reactive,
-  watch,
-  getCurrentInstance,
-  ComponentInternalInstance,
-  toRefs,
-  nextTick, onActivated
-} from 'vue'
-import {useStore} from 'vuex'
-import {useRouter, useRoute} from 'vue-router'
-import {ElMessage, ElMessageBox} from 'element-plus';
-import {toLogin} from "@/utils/permissions";
-import {systemUserProfile} from "@/api/modules/global/global";
-
-export default defineComponent({
-  name: '',
-  components: {},
-  props: {
-    show: {}
-  },
-  setup(props, {emit}) {
-    const store = useStore();
-    const router = useRouter();
-    const route = useRoute();
-    const that = (getCurrentInstance() as ComponentInternalInstance).appContext.config.globalProperties
-    const state = reactive({
-      userInfo: <any>{},
-      avatar: <Array<any>>[],
-      loading: false,
-    })
-    const ref_form = ref()
-    watch(() => props.show, () => {
-      state.loading = false
-      state.avatar = []
-      state.userInfo = JSON.parse(JSON.stringify(store.state.app.userInfo)) || {}
-      if (state.userInfo.avatar) {
-        state.avatar = [{
-          fUrl: state.userInfo.avatar,
-          fName: state.userInfo.avatar,
-        }]
-      }
-      nextTick(() => {
-        ref_form.value.reset()
-      })
-    })
-    const initDictionary = () => {
-      store.dispatch("dictionary/LOAD_DICT_LIST", "sys_user_status");
-      store.dispatch("dictionary/LOAD_DICT_LIST", "sys_user_sex");
-    }
-    const onSubmit = () => {
-      ref_form.value.submit().then(() => {
-        ElMessageBox.confirm("是否提交?", "提示", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning",
-        }).then(() => {
-          state.loading = true
-          state.userInfo.avatar = state.avatar?.[0]?.fUrl || ''
-          that.$api.systemUserProfile(state.userInfo).then(res => {
-            if (res.code === 200) {
-              store.dispatch('app/LOAD_USER_INFO', true)
-              ElMessage.success(res.msg)
-              emit('update:show', false)
-            } else {
-              ElMessage.error(res.msg)
-            }
-            state.loading = false
-          }).catch(() => {
-            state.loading = false
-          })
-        }).catch(() => {})
-      }).catch((e) => {
-        ElMessage({
-          message: e[0].message,
-          grouping: true,
-          type: 'warning',
-        })
-      })
-    }
-    onMounted(() => {
-      initDictionary()
-    })
-    return {
-      ...toRefs(state),
-      onSubmit,
-      ref_form
-    }
-  },
-})
-</script>
-
-<style scoped lang="scss">
-.info-main {
-  width: 100%;
-  height: 100%;
-  padding: 20px 0;
-  box-sizing: border-box;
-  .form {
-    width: 100%;
-    height: 100%;
-    :deep(.el-form) {
-      width: 100%;
-      height: 100%;
-      .el-row {
-        width: 100%;
-        height: 100%;
-        .left {
-          width: 60%;
-        }
-        .right {
-          width: 40%;
-          padding-top: 100px;
-        }
-      }
-    }
-  }
-}
-</style>

+ 0 - 173
src/views/global/head/password.vue

@@ -1,173 +0,0 @@
-<template>
-  <CusDialog
-      title="修改密码"
-      :show="show"
-      @close="$emit('update:show', false)"
-      @submit="onSubmit"
-      width="400px"
-      height="300px"
-      :loading="loading"
-  >
-    <div class="password-main">
-      <CusForm class="form" labelWidth="110px" ref="ref_form">
-        <CusFormColumn
-            :span="24"
-            required
-            label="旧密码:"
-            type="password"
-            show-password
-            v-model:param="form.oldPassword"/>
-        <CusFormColumn
-            class="password"
-            :span="24"
-            required
-            label="新密码:"
-            type="password"
-            show-password
-            v-model:param="form.newPassword"
-            :rules="[newPasswordValid()]"
-        />
-        <CusFormColumn
-            :span="24"
-            required
-            label="确认新密码:"
-            type="password"
-            show-password
-            v-model:param="form.confirmPassword"
-            :rules="[{
-              handle: (val) => val === form.newPassword,
-              message: '密码不一致'
-            }]"
-        />
-      </CusForm>
-    </div>
-  </CusDialog>
-</template>
-
-<script lang="ts">
-import {
-  defineComponent,
-  computed,
-  onMounted,
-  ref,
-  reactive,
-  watch,
-  getCurrentInstance,
-  ComponentInternalInstance,
-  toRefs,
-  nextTick, onActivated
-} from 'vue'
-import {useStore} from 'vuex'
-import {useRouter, useRoute} from 'vue-router'
-import {ElMessage, ElMessageBox} from 'element-plus';
-import {toLogin} from "@/utils/permissions";
-
-export default defineComponent({
-  name: '',
-  components: {},
-  props: {
-    show: {}
-  },
-  setup(props, {emit}) {
-    const store = useStore();
-    const router = useRouter();
-    const route = useRoute();
-    const that = (getCurrentInstance() as ComponentInternalInstance).appContext.config.globalProperties
-    const state = reactive({
-      form: {
-        oldPassword: '',
-        newPassword: '',
-        confirmPassword: ''
-      },
-      loading: false,
-    })
-    const ref_form = ref()
-    watch(() => props.show, () => {
-      state.loading = false
-      state.form = {
-        oldPassword: '',
-        newPassword: '',
-        confirmPassword: ''
-      }
-      nextTick(() => {
-        ref_form.value.reset()
-      })
-    })
-    const initDictionary = () => {
-      store.dispatch("app/LOAD_GLOBAL_CONFIG", true);
-    }
-    const onSubmit = () => {
-      ref_form.value.submit().then(() => {
-        ElMessageBox.confirm("是否提交?", "提示", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning",
-        }).then(() => {
-          state.loading = true
-          that.$api.systemUserProfileUpdatePwd(`oldPassword=${state.form.oldPassword}&newPassword=${state.form.newPassword}`).then(res => {
-            if (res.code === 200) {
-              ElMessage.success(res.msg)
-              toLogin()
-            } else {
-              ElMessage.error(res.msg)
-            }
-            state.loading = false
-          }).catch(() => {
-            state.loading = false
-          })
-        }).catch(() => {})
-      }).catch((e) => {
-        ElMessage({
-          message: e[0].message,
-          grouping: true,
-          type: 'warning',
-        })
-      })
-    }
-    const newPasswordValid = () => {
-      const obj: any = {
-        handle: () => {},
-        message: ''
-      }
-      if (store.state.app.globalConfig.passwordLevel === '0') {
-        obj.handle = ((val) => store.state.regex.password0.test(val))
-        obj.message = '请输入8~16位密码'
-      } else if (store.state.app.globalConfig.passwordLevel === '1') {
-        obj.handle = ((val) => store.state.regex.password1.test(val))
-        obj.message = '请输入8~16位密码,要求包含大小写字母、数字'
-      } else if (store.state.app.globalConfig.passwordLevel === '2') {
-        obj.handle = ((val) => store.state.regex.password2.test(val))
-        obj.message = '请输入8~16位密码,要求包含大小写字母、数字、特殊字符'
-      }
-      return obj
-    }
-    onMounted(() => {
-      initDictionary()
-    })
-    return {
-      ...toRefs(state),
-      onSubmit,
-      ref_form,
-      newPasswordValid
-    }
-  },
-})
-</script>
-
-<style scoped lang="scss">
-.password-main {
-  width: 100%;
-  height: 100%;
-  padding: 20px;
-  box-sizing: border-box;
-  .form {
-    width: 100%;
-    height: 100%;
-    :deep(.el-form) {
-      width: 100%;
-      height: 100%;
-
-    }
-  }
-}
-</style>

+ 0 - 158
src/views/global/login.vue

@@ -1,158 +0,0 @@
-<template>
-  <div>
-    <div class="bg">
-      <div class="main">
-        <div class="head_wrap">
-          <!-- <img src="@/assets/images/login/login_title.png" alt /> -->
-        </div>
-        <div class="login-wrap">
-          <el-form :inline="true" :model="formInline" class="demo-form-inline">
-            <el-form-item label>
-              <el-input
-                  v-model="formInline.username"
-                  @keyup.enter="onSubmit"
-                  prefix-icon="user"
-                  class="user-inp input"
-                  placeholder="请输入用户名称"
-              ></el-input>
-            </el-form-item>
-            <el-form-item label>
-              <el-input
-                  v-model="formInline.password"
-                  @keyup.enter="onSubmit"
-                  prefix-icon="password"
-                  class="password-inp input"
-                  placeholder="请输入密码"
-              ></el-input>
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" class="btn" @click="onSubmit">登录</el-button>
-            </el-form-item>
-          </el-form>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-import {
-  defineComponent,
-  computed,
-  onMounted,
-  ref,
-  reactive,
-  watch,
-  getCurrentInstance,
-  ComponentInternalInstance,
-  toRefs,
-  nextTick
-} from 'vue'
-import {useStore} from 'vuex'
-import {useRouter, useRoute} from 'vue-router'
-import {ElMessage} from "element-plus";
-
-export default defineComponent({
-  name: '',
-  components: {},
-  setup() {
-    const store = useStore();
-    const router = useRouter();
-    const route = useRoute();
-    const that = (getCurrentInstance() as ComponentInternalInstance).appContext.config.globalProperties
-    const state = reactive({
-      formInline: {
-        // code: '1212',
-        username: 'admin',
-        password: 'admin123',
-        uuid: ''
-      },
-    })
-    const onSubmit = () => {
-      that.$api.login(state.formInline).then((res: { token: string; }) => {
-        ElMessage.success({
-          message: '登录成功',
-          type: 'success'
-        })
-        sessionStorage.setItem('ax_token', res.token)
-        location.replace('/')
-      }).catch(() => {
-        // ElMessage.warning('获取菜单错误,请检查网络返回!')
-      })
-    }
-    onMounted(() => {
-      sessionStorage.clear()
-    })
-    return {
-      ...toRefs(state),
-      onSubmit
-    }
-  },
-})
-</script>
-
-<style scoped lang="scss">
-.bg {
-  width: 100vw;
-  height: 100vh;
-  background: url("@/assets/images/global/login_bg.jpeg") no-repeat;
-  background-size: cover;
-  .main {
-    width: 800px;
-    margin: auto;
-    .head_wrap {
-      padding-top: 30vh;
-      padding-bottom: 8vh;
-      img {
-        width: 450px;
-        display: block;
-        margin: auto;
-      }
-    }
-    .login-wrap {
-      display: flex;
-      justify-content: center;
-      .input {
-        width: 300px;
-        box-shadow: 2px 5px 10px 0 rgba(0, 0, 0, 0.25);
-      }
-      .btn {
-        background-color: #2655ef;
-        border-color: #2655ef;
-        width: 110px;
-        box-shadow: 2px 5px 10px 0 rgba(0, 0, 0, 0.25);
-      }
-    }
-  }
-}
-:deep(.el-input__inner) {
-  height: 40px;
-  line-height: 40px;
-}
-:deep(.user-inp .el-input__prefix) {
-  height: 34px;
-  width: 34px;
-  top: 3px;
-  left: 0;
-  background-image: url("@/assets/images/global/user.png");
-  background-repeat: no-repeat;
-  background-size: 60%;
-  background-position: center;
-}
-:deep(.password-inp .el-input__prefix) {
-  height: 34px;
-  width: 34px;
-  top: 3px;
-  left: 0;
-  background-image: url("@/assets/images/global/password.png");
-  background-repeat:  no-repeat;
-  background-size: 60%;
-  background-position: center;
-}
-:deep(.el-form-item) {
-  margin-right: 15px;
-}
-:deep(.el-form-item:nth-child(3)) {
-  margin-right: 0;
-}
-</style>

+ 8 - 191
vite.config.ts

@@ -8,8 +8,6 @@ import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' // 【svg-icons相
 import VitePluginHtmlEnv from 'vite-plugin-html-env'
 const time = new Date().getTime()
 // @ts-ignore
-import {getApiProxy} from './apiProxy'
-const apiProxyVersion = 'local'
 
 // https://vitejs.dev/config/
 export default defineConfig({
@@ -35,212 +33,31 @@ export default defineConfig({
     },
   },
   server: {
-    port: 8090,
+    port: 6969,
     // open: true,
     https: false,
     host: '0.0.0.0',
     strictPort: false,
     proxy: {
-      '/mock-api': {
-        target: 'https://www.fastmock.site/mock/002bd20e30dcef8f255675f80a50382c/mock',
+      '/api-ztpt/': {
+        target: 'http://127.0.0.1:3001/',
+        // target: 'http://10.110.35.47/',
         changeOrigin: true,
         rewrite: path => {
-          return path.replace(/^\/mock-api/, '')
+          return path.replace(/^\/api-ztpt/, '')
         }
       },
-      '/api': {
-        target: getApiProxy('api', apiProxyVersion),
+      '/api/': {
+        target: 'http://8.140.240.182:18091/',
         changeOrigin: true,
         rewrite: path => {
           return path.replace(/^\/api/, '')
         }
       },
-      '/img-api': {
-        target: getApiProxy('img-api'),
-        changeOrigin: true
-      },
-      '/geoserver-api': {
-        target: getApiProxy('geoserver-api'),
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/geoserver-api/, '')
-        }
-      },
-      '/hlx-firstly': {
-        target: 'http://74.10.30.38:30944/',
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/hlx-firstly/, '')
-        }
-      },
-      '/hlx-second': {
-        target: 'http://74.10.28.119:30944/',
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/hlx-second/, '')
-        }
-      },
-      '/hlx-thirdly': {
-        target: 'http://74.10.30.39:30944/',
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/hlx-thirdly/, '')
-        }
-      },
-      '/EzServer6-api': {
-        target: getApiProxy('EzServer6-api'),
-        changeOrigin: true,
-        rewrite: path => {
-          return path
-        }
-      },
-      '/rh-find-ship-api': {
-        target: getApiProxy('rh-find-ship-api', apiProxyVersion),
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/rh-find-ship-api/, '')
-        }
-      },
-      '/history-track-ws-api': {
-        target: getApiProxy('history-track-ws-api', apiProxyVersion),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/history-track-ws-api/, '')
-        }
-      },
-      '/rh-ws-api': {
-        target: getApiProxy('rh-ws-api', apiProxyVersion), // fk
-        // target: 'ws://74.10.28.38:8015/', // fk117
-        // target: 'ws://74.10.28.28:6990/', // hlx
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/rh-ws-api/, '')
-        }
-      },
-      '/ais-ws-api': {
-        target: getApiProxy('ais-ws-api'),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/ais-ws-api/, '')
-        }
-      },
-      '/dc-ws-api': {
-        target: getApiProxy('dc-ws-api', apiProxyVersion),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/dc-ws-api/, '')
-        }
-      },
-      '/kx-ws-api': {
-        target: getApiProxy('kx-ws-api', apiProxyVersion),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/kx-ws-api/, '')
-        }
-      },
-      '/bd-ws-api': {
-        target: getApiProxy('bd-ws-api'),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/bd-ws-api/, '')
-        }
-      },
-      '/xmb-ws-api': {
-        target: getApiProxy('xmb-ws-api'),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/xmb-ws-api/, '')
-        }
-      },
-      '/zyh-ws-api': {
-        target: getApiProxy('zyh-ws-api'),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/zyh-ws-api/, '')
-        }
-      },
-      '/hlx-ws-api': {
-        target: getApiProxy('hlx-ws-api'),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/hlx-ws-api/, '')
-        }
-      },
-      '/hlx-radar-ws-api': {
-        target: getApiProxy('geoserver-api', apiProxyVersion),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/hlx-radar-ws-api/, '')
-        }
-      },
-      '/warning-ws-api': {
-        target: getApiProxy('warning-ws-api', apiProxyVersion),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/warning-ws-api/, '')
-        }
-      },
-      '/info-center-ws-api': {
-        target: getApiProxy('info-center-ws-api', apiProxyVersion),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/info-center-ws-api/, '')
-        }
-      },
-      '/police-man-ws-api': {
-        target: getApiProxy('police-man-ws-api'),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/police-man-ws-api/, '')
-        }
-      },
-      '/police-boat-ws-api': {
-        target: getApiProxy('police-boat-ws-api'),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/police-boat-ws-api/, '')
-        }
-      },
-      '/pdt-ws-api': {
-        target: getApiProxy('pdt-ws-api'),
-        ws: true,
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/pdt-ws-api/, '')
-        }
-      },
-      '/speed-analysis-api': {
-        target: getApiProxy('speed-analysis-api'),
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/speed-analysis-api/, '')
-        }
-      },
-      '/s3-api': {
-        target: 'http://74.10.28.116:8090/',
-        changeOrigin: true,
-        rewrite: path => {
-          return path.replace(/^\/s3-api/, 's3-api')
-        }
-      },
     }
   },
   build: {
-    outDir: "seat",
+    outDir: "gis-web",
     rollupOptions: {//分包优化
       output: {
         manualChunks(id) {