From db0448b468118790f29405e5e6f3bfc0e98e2b01 Mon Sep 17 00:00:00 2001 From: zhangqi <727393967@qq.com> Date: Fri, 31 Oct 2025 16:15:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=BB=9F=E8=AE=A1=E5=88=86?= =?UTF-8?q?=E6=9E=90=E6=9D=BF=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/dev.env.js | 2 +- config/index.js | 2 +- src/api/statistics.js | 111 ++ src/api/sysManage.js | 87 ++ src/components/public/Header.vue | 20 +- src/router/index.js | 10 + src/utils/index.js | 27 + src/views/aboutUs.vue | 2 +- src/views/dataSearch.vue | 60 +- .../sampleViews/formViews/SampleList.vue | 16 +- src/views/dataTransfer/voyageReg.vue | 7 +- src/views/dicManage/visitorUnit.vue | 8 + src/views/home.vue | 2 +- src/views/personalCenter.vue | 6 +- src/views/statistics/HovStatistics.vue | 489 ++++++++ src/views/statistics/ShipStatistics.vue | 1018 +++++++---------- src/views/statistics/components/BarChart.vue | 435 +++++++ src/views/statistics/components/PieChart.vue | 178 +++ src/views/statistics/index.vue | 38 +- src/views/sysManage/roleManage.vue | 375 +----- src/views/sysManage/userManage.vue | 610 +++++----- static/img/01.png | Bin 3666 -> 1345 bytes static/img/011.png | Bin 5252 -> 2178 bytes 23 files changed, 2162 insertions(+), 1341 deletions(-) create mode 100644 src/api/statistics.js create mode 100644 src/api/sysManage.js create mode 100644 src/utils/index.js create mode 100644 src/views/statistics/HovStatistics.vue create mode 100644 src/views/statistics/components/BarChart.vue create mode 100644 src/views/statistics/components/PieChart.vue diff --git a/config/dev.env.js b/config/dev.env.js index 57c3f9a..f9fae85 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -18,7 +18,7 @@ module.exports = merge(prodEnv, { VUE_APP_BASE_API: '"/api"', // VUE_APP_BASE_APIURL: '"http://ds2.hzzxq.com/api2"', - VUE_APP_BASE_APIURL: '"http://crm.hzzxq.com/ds"', + VUE_APP_BASE_APIURL: '"http://test.gopmas.com/ds"', VUE_APP_FULL_API: '"http://10.10.151.5:5555"', VUE_APP_BASE_API_FRONT: '"http://10.10.150.128:8080/satellitePub/pub/index.html"', VUE_APP_FILE_API: '"http://10.10.151.5:5555/archives"', diff --git a/config/index.js b/config/index.js index 2261511..9494e60 100644 --- a/config/index.js +++ b/config/index.js @@ -17,7 +17,7 @@ module.exports = { // target: 'http://10.0.90.70', // 测试环境 // target: 'http://1.95.42.191:8080', // 测试环境 // target: 'http://ds2.hzzxq.com/api2', // 测试环境 - target: 'http://crm.hzzxq.com/ds', // 测试环境 + target: 'http://test.gopmas.com/ds', // 测试环境 changeOrigin: true, // 是否跨域 secure: false, // 是否使用https pathRewrite: { diff --git a/src/api/statistics.js b/src/api/statistics.js new file mode 100644 index 0000000..a8901ad --- /dev/null +++ b/src/api/statistics.js @@ -0,0 +1,111 @@ +import request from '@/utils/request' + +// 报表配置查询接口 +export function reportList(data) { + return request({ + url: '/report/type/list.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 科考船汇总统计属性 +export function shipTotal(data) { + return request({ + url: '/report/ship/total.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 科考船航次统计 +export function shipVoyage(data) { + return request({ + url: '/report/ship/voyage.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 科考船参航单位统计 +export function shipUnit(data) { + return request({ + url: '/report/ship/unit.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 科考船参航单位统计(年度) +export function shipUnitYear(data) { + return request({ + url: '/report/ship/unit/year.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 载人潜水器汇总统计属性 +export function platformHov(data) { + return request({ + url: '/report/platform/hov.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 载人潜水器潜次统计 +export function hovDiving(data) { + return request({ + url: '/report/platform/hov/diving.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 载人潜水器参航单位统计 +export function hovUnit(data) { + return request({ + url: '/report/platform/hov/unit.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 载人潜水器参航单位统计(年度) +export function hovUnitYear(data) { + return request({ + url: '/report/platform/hov/unit/year.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 无人航行潜水器统计 +export function platformAuv(data) { + return request({ + url: '/report/platform/auv.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 遥控潜水器潜水器统计 +export function platformRov(data) { + return request({ + url: '/report/platform/rov.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} diff --git a/src/api/sysManage.js b/src/api/sysManage.js new file mode 100644 index 0000000..e1e5a6e --- /dev/null +++ b/src/api/sysManage.js @@ -0,0 +1,87 @@ +import request from '@/utils/request' + +/* ********************************* 角色列表 **************************************/ + +// 角色列表 +export function roleList(data) { + return request({ + url: '/frame/role/page.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +/* ********************************* 用户列表 **************************************/ + +// 用户列表 +export function optrList(data) { + return request({ + url: '/frame/optr/page.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 用户新增 +export function optrAdd(data) { + return request({ + url: '/frame/optr/add.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 用户编辑 +export function optrEdit(data) { + return request({ + url: '/frame/optr/edit.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 用户删除 +export function optrDelete(data) { + return request({ + url: '/frame/optr/delete.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +/* ********************************* 航次管理 **************************************/ +// 航次列表 +export function regList(data) { + return request({ + url: '/voyage/reg/list.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 分配航次 +export function regGrant(data) { + return request({ + url: '/voyage/reg/optr/grant.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + +// 清除航次 +export function regClear(data) { + return request({ + url: '/voyage/reg/optr/clear.htm', + method: 'post', + type: 'application/x-www-form-urlencoded', + data + }) +} + diff --git a/src/components/public/Header.vue b/src/components/public/Header.vue index 034c657..1fc56e7 100644 --- a/src/components/public/Header.vue +++ b/src/components/public/Header.vue @@ -170,11 +170,11 @@ export default { path:"visitorUnit", children:[] }, - { - name:"共享单位", - path:"sharedUnit", - children:[] - }, + // { + // name:"共享单位", + // path:"sharedUnit", + // children:[] + // }, { name:"资助机构", path:"fundingAgencies", @@ -195,11 +195,11 @@ export default { path:"roleManage", children:[] }, - { - name:"单位管理", - path:"unitManage", - children:[] - } + // { + // name:"单位管理", + // path:"unitManage", + // children:[] + // } ] }, ], diff --git a/src/router/index.js b/src/router/index.js index cc44b4a..4219a69 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -358,6 +358,16 @@ export const constantRoutes = [ loginAuthority: true } }, + { + path: 'hov', + name: 'hov', + component: () => import('@/views/statistics/HovStatistics.vue'), + meta: { + title: '载人潜水器汇总统计', + icon: 'peoples', + loginAuthority: true + } + }, { path: 'AboutUs', name: 'AboutUs', diff --git a/src/utils/index.js b/src/utils/index.js new file mode 100644 index 0000000..a5b0ab4 --- /dev/null +++ b/src/utils/index.js @@ -0,0 +1,27 @@ +export function getYearRange(date) { + // 获取传入日期的年份 + const year = date.getFullYear() + + // 创建年份开始日期 (当年1月1日) + const startOfYear = new Date(year, 0, 1) + + // 创建年份结束日期 (当年12月31日) + const endOfYear = new Date(year, 11, 31) + + // 格式化日期为 YYYY-MM-DD + function formatDate(dateObj) { + const y = dateObj.getFullYear() + const m = String(dateObj.getMonth() + 1).padStart(2, '0') // 月份从0开始,需要+1 + const d = String(dateObj.getDate()).padStart(2, '0') + return `${y}-${m}-${d}` + } + + return { + start: formatDate(startOfYear), + end: formatDate(endOfYear) + } +} + +export function filterDictItems(data, dictName) { + return data.filter(item => item.report_type === dictName) +} diff --git a/src/views/aboutUs.vue b/src/views/aboutUs.vue index aca35bd..bad55f5 100644 --- a/src/views/aboutUs.vue +++ b/src/views/aboutUs.vue @@ -2,7 +2,7 @@
- +
+

{{ item.dataset_name }} {{ item.file_total }}

+ {{ item.create_time }} +
+
    +
  • {{ sample.sample_name }} +
  • +

航次:

- {{ item.voyage_name }} + {{ item.voyage_name }}

平台类型:

@@ -65,24 +73,15 @@
-
-

{{ item.dataset_name }} {{ item.file_total }}

- {{ item.create_time }} -
-
    -
  • {{ sample.sample_name }} -
  • -
-
-
+
-

{{ item.voyage_name }} {{ item.voyage_mileage }}海里

+

+ {{ item.voyage_name }} + {{ item.voyage_mileage }}海里

{{ item.funding_org }}
@@ -271,9 +270,6 @@ export default { rendered: [] } }, - created() { - this.getParams() - }, watch: { radio(val) { this.dataList = [] @@ -314,23 +310,11 @@ export default { } }, }, + mounted() { + this.imageryViewModels = setImageryViewModels(this.CesiumHostAddr) + this.initCesium() + }, methods: { - // 获取从参数列表 - getParams() { - getParamsList().then(res => { - const arr = res.array - if (arr.length) { - arr.forEach(item => { - if (item.param_name === 'CesiumHostAddr') { - // this.CesiumHostAddr = item.param_value - this.CesiumHostAddr = `${window.location.protocol}//${window.location.hostname}:${window.location.port}/tiles/` - this.imageryViewModels = setImageryViewModels(this.CesiumHostAddr) - this.initCesium() - } - }) - } - }) - }, // 获取菜单 handleMenu() { this.dataList = [] @@ -642,12 +626,13 @@ export default { this.viewer.imageryLayers.addImageryProvider(contour6000) }, turnDeatilPage(item) { - this.$router.push({ + const routeData = this.$router.resolve({ name: 'dataDetail', query: { voyage_name: item.voyage_name } }) + window.open(routeData.href, '_blank') }, shousuo() { this.show = true @@ -807,12 +792,13 @@ export default { font-size: 16px; color: #212121; font-weight: bold; - display: flex; - justify-content: space-between; + //display: flex; + //justify-content: space-between; .mileage { font-size: 12px; color: #909fa7; + float: right; } } diff --git a/src/views/dataTransfer/sampleViews/formViews/SampleList.vue b/src/views/dataTransfer/sampleViews/formViews/SampleList.vue index 9ec3637..7267242 100644 --- a/src/views/dataTransfer/sampleViews/formViews/SampleList.vue +++ b/src/views/dataTransfer/sampleViews/formViews/SampleList.vue @@ -172,6 +172,13 @@ + + + + + + + @@ -264,7 +271,8 @@ export default { start_lat: '', end_lon: '', end_lat: '', - line_deep: '' + line_deep: '', + conver_width: '' }, rules: { publish_rule: [ @@ -308,6 +316,9 @@ export default { ], line_deep: [ { required: true, message: '此处为必填项', trigger: 'blur' } + ], + conver_width: [ + { required: true, message: '此处为必填项', trigger: 'blur' } ] }, // 公开期限下拉数据 @@ -445,7 +456,8 @@ export default { start_lat: '', end_lon: '', end_lat: '', - line_deep: '' + line_deep: '', + conver_width: '' } this.dynamicTags = [] this.$refs['form'].resetFields() diff --git a/src/views/dataTransfer/voyageReg.vue b/src/views/dataTransfer/voyageReg.vue index e57e550..f127969 100644 --- a/src/views/dataTransfer/voyageReg.vue +++ b/src/views/dataTransfer/voyageReg.vue @@ -365,8 +365,11 @@ import { voyageRegNav, uploadNavigation, voyageRegPeople, - voyageRegPeopleDelete, voyageRegPeopleEdit, voyageRegPeopleUpload, voyageRegImport -} from '@/api/dataTransfer' + voyageRegPeopleDelete, + voyageRegPeopleEdit, + voyageRegPeopleUpload, + voyageRegImport +} from '../../api/dataTransfer' import { time } from '@/utils/validate' import { fundingAll } from '@/api/dicManage' diff --git a/src/views/dicManage/visitorUnit.vue b/src/views/dicManage/visitorUnit.vue index 933d51f..261a9e8 100644 --- a/src/views/dicManage/visitorUnit.vue +++ b/src/views/dicManage/visitorUnit.vue @@ -21,6 +21,7 @@ + @@ -61,6 +62,9 @@ + + + @@ -99,6 +103,7 @@ export default { unit_addr: '', unit_lon: '', unit_lat: '', + unit_type: '', unit_remark: '' }, rules: { @@ -110,6 +115,9 @@ export default { ], unit_lat: [ { required: true, message: '此处为必填项', trigger: 'blur' } + ], + unit_type: [ + { required: true, message: '此处为必填项', trigger: 'blur' } ] } } diff --git a/src/views/home.vue b/src/views/home.vue index 32462ba..e62f235 100644 --- a/src/views/home.vue +++ b/src/views/home.vue @@ -284,7 +284,7 @@ export default { }, { pic: require('../../static/images/shuju2_bg3.png'), - title: '支撑大科学计划', + title: '构建应急搜寻处置快速响应能力', des: '应急搜捞应用', routerName: 'SalvageHome' } diff --git a/src/views/personalCenter.vue b/src/views/personalCenter.vue index 2dc503b..ab3e01d 100644 --- a/src/views/personalCenter.vue +++ b/src/views/personalCenter.vue @@ -281,7 +281,7 @@ export default { }, updateInfoVisible: false, updateInfoForm: { - tsy_id: '', + optr_id: '', optr_name: '', optr_sex: '', optr_status: '', @@ -310,7 +310,7 @@ export default { this.info = data - this.updateInfoForm.tsy_id = data.tsy_id + this.updateInfoForm.optr_id = data.optr_id this.updateInfoForm.optr_name = data.optr_name this.updateInfoForm.optr_sex = data.optr_sex this.updateInfoForm.optr_status = data.optr_status @@ -337,7 +337,7 @@ export default { this.$refs[formName].validate((valid) => { if (valid) { updatePassword({ - tsy_id: this.info.tsy_id, + optr_id: this.info.optr_id, old_password: this.updatePwdForm.old_password, new_pass: this.updatePwdForm.new_pass }).then(res => { diff --git a/src/views/statistics/HovStatistics.vue b/src/views/statistics/HovStatistics.vue new file mode 100644 index 0000000..6c3fcb1 --- /dev/null +++ b/src/views/statistics/HovStatistics.vue @@ -0,0 +1,489 @@ + + + + + + + diff --git a/src/views/statistics/ShipStatistics.vue b/src/views/statistics/ShipStatistics.vue index 34ea8fc..eb1d54d 100644 --- a/src/views/statistics/ShipStatistics.vue +++ b/src/views/statistics/ShipStatistics.vue @@ -1,681 +1,505 @@ + diff --git a/src/views/statistics/components/BarChart.vue b/src/views/statistics/components/BarChart.vue new file mode 100644 index 0000000..4de1168 --- /dev/null +++ b/src/views/statistics/components/BarChart.vue @@ -0,0 +1,435 @@ + + + diff --git a/src/views/statistics/components/PieChart.vue b/src/views/statistics/components/PieChart.vue new file mode 100644 index 0000000..9dfc1b7 --- /dev/null +++ b/src/views/statistics/components/PieChart.vue @@ -0,0 +1,178 @@ + + + diff --git a/src/views/statistics/index.vue b/src/views/statistics/index.vue index 14e0077..5ca244e 100644 --- a/src/views/statistics/index.vue +++ b/src/views/statistics/index.vue @@ -19,8 +19,8 @@

科考船汇总统计

-

4艘

-

探索一号、探索二号、探索三号、海警101船

+

{{ ship.length }}艘

+

{{ item.report_name }}

@@ -39,8 +39,8 @@

载人潜水器汇总统计

-

2型

-

深海勇士、奋斗者等

+

{{ hov.length }}艘

+

{{ item.report_name }}

@@ -59,8 +59,8 @@

遥控潜水器汇总统计

-

数据加载中

-

+

{{ rov.length }}艘

+

{{ item.report_name }}

@@ -79,8 +79,8 @@

无人航行潜水器汇总统计

-

数据加载中

-

+

{{ uuv.length }}艘

+

{{ item.report_name }}

@@ -100,7 +100,6 @@

基站汇总统计

暂无数据

-

深海站、深渊站、国际站

@@ -130,17 +129,34 @@ diff --git a/src/views/sysManage/roleManage.vue b/src/views/sysManage/roleManage.vue index a2c8b79..762dc86 100644 --- a/src/views/sysManage/roleManage.vue +++ b/src/views/sysManage/roleManage.vue @@ -8,380 +8,71 @@ 角色管理 -
-
- 添加角色 -
-
- + - - - - - - + +
- diff --git a/src/views/sysManage/userManage.vue b/src/views/sysManage/userManage.vue index 62487df..ba52908 100644 --- a/src/views/sysManage/userManage.vue +++ b/src/views/sysManage/userManage.vue @@ -10,31 +10,33 @@
- 添加用户 + 添加用户
- + - - - - - - - + + + + + + + + + @@ -42,54 +44,64 @@
+ + diff --git a/static/img/01.png b/static/img/01.png index 28958f99261caf2a58ef1cd0561121db8f9ec31b..fad134069e7836431bbbf93f9edda20717fa3c9a 100644 GIT binary patch literal 1345 zcmV-H1-|-;P)6@q_#kVc4qf%=lo z#t@4j)RqQCeevg^5urlCP{Cr@Y^;5dS|qy(5lXSyx&6+}?CwlvlHJYaesj+K&bep4 znY(jm)E0&)OeyGrxD2tG98>{qC-9HB89IiPcroXf$Q zeN6$0(fptR-mg`Vp;9KbiFmS@P90rHZ$GV2UpZnEAVct*&eaY@ zS<{xiVRI?d^^QMY)o709GGUs4)^KYfzQqbij{o&A)6Wp#ReWB`q0I}`e8Zidnl+vjm)DI$=&F?Wrz9TmP znCCoTKsk+(4|T0!SWC%DZS^aN2;kN4af5l#%l;UU1c3jTd&-6SrpmN8!KKr|#^V|FIVSO>uivwnAN;9!{+{x(b}sf*mgc9#0PUr?y;axk4<4oAUm zs?o#w!1$Hi!yW$qB|B$MJVaz_vHE24f)si~ZfdF}O&ej9VU18-xhH z)v*{W@@Q7LN{;4Lu>p@%{8oE$rsAs&2~ffSKf6{WA^?I(jS)|@^NrXxQs`BvuN;9u z4yw&@Tmb@HxN@-PT9v005g^97K%U(^&O@l{BSqo_!SkTkvN5F)pt9~K{2T4TWlXsc$mKaNEc`o)5>X#<4{jzXCLET-QkhTUwO86 zj0kXl(eQ4y)gqC#)~UrzYLqAIArd}%l+#!QmOSrsXG{I}{o?yo6A|D?ytOvwmAJd$ z=hQWA+1Xu8^0s2&6#Yn#6~L>Sgm^zjv2iRit3krDM3)L$i#0z*Op6uZ<~evzE!VcU z-baPztwb_gc$VB=0x-zBHs-LZfKq?zN9J?i=aC;KO)bUXREx3jHfQox!IxSlHK~3a zRu!Ph%h&(cyKqtcW|ks(*A_kbPR_e#JLT#p8pn~orhuh^`%6YdMQ|C>&{DLG6?X7> zR{=U_X#UlE`9T{wZD9hpmxkmxHYTMSEXrMJDV5x6wNgSi!0wqAU zL!4o(Xo=h$IoYQ)pPcmkp?lW6^_r(>NPs354|kvE@8O90fb44@ovmIWPtHFr<_)lM z3qMlKbbU>?q290nt+tR(orGWzY$Ebe``DjPw|#PH7a#O-u#p=sX1Yh{Hr$&MpjG*{ zdshrjs?Rs)xK%FuFE4yiOn1Gdd^2cTfEF+Ir(Oc&GQdwb!QG%=%%on#I@-Df=y^(+ zu5GmXN}l$84x_yua}xjn|Nqj_2nhfH00v1!K~w_(&|tvsRH*^x00000NkvXXu0mjf D!>EYG literal 3666 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 Eg75efIRF3v literal 5252 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