zhaobao 2 年之前
父节点
当前提交
1811a1f223
共有 100 个文件被更改,包括 7055 次插入0 次删除
  1. 1 0
      .gitignore
  2. 26 0
      .hbuilderx/launch.json
  3. 23 0
      App.vue
  4. 112 0
      api/aqpt/alertApi.js
  5. 131 0
      api/aqpt/checkTaskApi.js
  6. 79 0
      api/aqpt/checklistHazardRecordApi.js
  7. 70 0
      api/aqpt/checklistPoint.js
  8. 60 0
      api/aqpt/checklistScore.js
  9. 90 0
      api/aqpt/dangerApi.js
  10. 113 0
      api/aqpt/snapshotApi.js
  11. 43 0
      api/aqpt/task.js
  12. 139 0
      api/aqpt/taskApi.js
  13. 20 0
      api/aqpt/warning.js
  14. 103 0
      api/aqpt/warningApi.js
  15. 55 0
      api/checkRecord.js
  16. 90 0
      api/danger.js
  17. 42 0
      api/entRiskPoint.js
  18. 31 0
      api/index.js
  19. 19 0
      api/system/app.js
  20. 82 0
      api/system/art.js
  21. 64 0
      api/system/dangerApi.js
  22. 73 0
      api/system/groupApi.js
  23. 98 0
      api/system/msgApi.js
  24. 19 0
      api/system/scan.js
  25. 65 0
      api/system/taskEventApi.js
  26. 38 0
      api/system/upload.js
  27. 83 0
      api/system/user.js
  28. 73 0
      api/system/wfApi.js
  29. 84 0
      api/task.js
  30. 91 0
      api/warning.js
  31. 13 0
      config/index.js
  32. 20 0
      index.html
  33. 114 0
      libs/EPlatform.js
  34. 15 0
      libs/auth.js
  35. 201 0
      libs/enum.js
  36. 97 0
      libs/graceChecker.js
  37. 500 0
      libs/index.js
  38. 64 0
      libs/permission.js
  39. 99 0
      libs/request.js
  40. 21 0
      libs/router.js
  41. 40 0
      libs/tool.js
  42. 22 0
      main.js
  43. 119 0
      manifest.json
  44. 170 0
      pages.json
  45. 199 0
      pages/applicationCenter/applicationCenter.vue
  46. 209 0
      pages/history/history.vue
  47. 423 0
      pages/index/detail/detail.vue
  48. 22 0
      pages/index/handle/alert/alert.vue
  49. 326 0
      pages/index/handle/danger/index/index.vue
  50. 132 0
      pages/index/handle/task/checkList/detail/detail.vue
  51. 133 0
      pages/index/handle/task/checkList/form/form.vue
  52. 213 0
      pages/index/handle/task/task.vue
  53. 202 0
      pages/index/handle/warning/warning.vue
  54. 623 0
      pages/index/index.vue
  55. 157 0
      pages/login/index.vue
  56. 199 0
      pages/message/message.vue
  57. 271 0
      pages/myCenter/myCenter.vue
  58. 244 0
      pages/myCenter/personalData/personalData.vue
  59. 124 0
      pages/myCenter/updatePassword/updatePassword.vue
  60. 42 0
      pages/webview/webview.vue
  61. 2 0
      remark.md
  62. 二进制
      static/app/tab-1.png
  63. 二进制
      static/app/tab-2.png
  64. 二进制
      static/app/tab-3.png
  65. 二进制
      static/app/tab-4.png
  66. 二进制
      static/center/archive-tick.png
  67. 二进制
      static/center/bg.png
  68. 二进制
      static/center/dollar-circle.png
  69. 二进制
      static/center/heart.png
  70. 二进制
      static/center/setting.png
  71. 二进制
      static/center/timer.png
  72. 二进制
      static/components/avatar.png
  73. 二进制
      static/history/camera.png
  74. 二进制
      static/index/bg-bottom.png
  75. 二进制
      static/index/bg.png
  76. 二进制
      static/index/company.png
  77. 二进制
      static/index/message.png
  78. 二进制
      static/index/notice.png
  79. 二进制
      static/index/scanner.png
  80. 二进制
      static/index/tab1.png
  81. 二进制
      static/index/tab2.png
  82. 二进制
      static/index/tab3.png
  83. 二进制
      static/index/tab_alert.png
  84. 二进制
      static/index/user.png
  85. 二进制
      static/login/phone.png
  86. 二进制
      static/login/pwd.png
  87. 二进制
      static/logo.png
  88. 二进制
      static/message/nav1.png
  89. 二进制
      static/message/nav2.png
  90. 二进制
      static/tabbar/app.png
  91. 二进制
      static/tabbar/appEd.png
  92. 二进制
      static/tabbar/index.png
  93. 二进制
      static/tabbar/indexEd.png
  94. 二进制
      static/tabbar/info.png
  95. 二进制
      static/tabbar/infoEd.png
  96. 二进制
      static/tabbar/myCenter.png
  97. 二进制
      static/tabbar/myCenterEd.png
  98. 二进制
      static/tree_more.png
  99. 二进制
      static/tree_more_def.png
  100. 22 0
      store/index.js

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+unpackage/

+ 26 - 0
.hbuilderx/launch.json

@@ -0,0 +1,26 @@
+{
+    // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+    // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version" : "0.0",
+    "configurations" : [
+        {
+        	"app-plus" : 
+        	{
+        		"launchtype" : "local"
+        	},
+        	"default" : 
+        	{
+        		"launchtype" : "local"
+        	},
+        	"mp-weixin" : 
+        	{
+        		"launchtype" : "local"
+        	},
+        	"type" : "uniCloud"
+        },
+        {
+            "playground" : "custom",
+            "type" : "uni-app:app-android"
+        }
+    ]
+}

+ 23 - 0
App.vue

@@ -0,0 +1,23 @@
+<script>
+	export default {
+		onLaunch: function() {
+			console.log('App Launch')
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+<style>
+	/*每个页面公共css */
+	    .custom_status_bar::before {
+			content: "";
+			display: block;
+			width: 100%;
+	        height: var(--status-bar-height);
+	    }
+</style>

+ 112 - 0
api/aqpt/alertApi.js

@@ -0,0 +1,112 @@
+import {request} from '@/libs/request.js'
+/**
+ * 分页查询
+ */
+export function getAlertByPage(data) {
+  return request({
+    url: '/alert/page',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 列表查询
+ */
+export function getAlertByList(data) {
+  return request({
+    url: '/alert',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 列表查询待处理告警
+ */
+export function getAlertWaitingByList(data) {
+  return request({
+    url: '/alert/waiting',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 基于ID查询Alert
+ */
+export function getAlertById(alertId) {
+  return request({
+    url: `/alert/${alertId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 完成处理
+ * @param data
+ * @returns
+ */
+export function completeAlert(data) {
+  return request({
+    url: `/alert/complete`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 转交他人
+ * @param alertId
+ * @param data
+ * @returns
+ */
+export function transferAlert(alertId, data) {
+  return request({
+    url: `/alert/transfer/${alertId}`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 撤消
+ * @param alertId
+ * @returns
+ */
+export function cancelAlert(alertId) {
+  return request({
+    url: `/alert/cancel/${alertId}`,
+    method: 'GET'
+  })
+}
+/**
+ * 删除
+ */
+export function deleteAlertById(alertId) {
+  return request({
+    url: `/alert/${alertId}`,
+    method: 'DELETE'
+  })
+}
+
+/**
+ * 查询统计结果
+ */
+export function counterByStatus(data) {
+  return request({
+    url: '/alert/statis/counterByStatus',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 查询统计结果
+ */
+export function getAlertCounter() {
+  return request({
+    url: '/alert/statis/getCounter',
+    method: 'GET'
+  })
+}

+ 131 - 0
api/aqpt/checkTaskApi.js

@@ -0,0 +1,131 @@
+import { request } from '@/libs/request.js'
+
+/**
+ * 分页查询CheckTask
+ * @param data
+
+ */
+export function getCheckTaskByPage(data) {
+  return request({
+    url: '/check/task/page',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 列表查询CheckTask
+ * @param data
+ */
+export function getCheckTaskByList(data) {
+  return request({
+    url: '/check/task',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * @param checkTaskId
+
+ */
+export function getCheckTaskById(checkTaskId) {
+  return request({
+    url: `/check/task/${checkTaskId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 获取任务视图
+ * @param taskId
+ */
+export function getCheckTaskViewById(taskId) {
+  return request({
+    url: `/check/task/view/${taskId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 添加一次性临时CheckTask
+ * @param data
+
+ */
+export function createCheckTask(data) {
+  return request({
+    url: `/check/task/once/add`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 更新CheckTask
+ * @param data
+
+ */
+export function updateCheckTask(data) {
+  return request({
+    url: `/check/task/update`,
+    method: 'PUT',
+    data
+  })
+}
+
+/**
+ * 删除CheckTask
+ * @param taskId
+ */
+export function deleteCheckTaskById(taskId) {
+  return request({
+    url: `/check/task/${taskId}`,
+    method: 'DELETE'
+  })
+}
+
+/**
+ * Handle CheckTask
+ * @param taskId
+ */
+export function handleCheckTask(taskId) {
+  return request({
+    url: `/check/task/handle/${taskId}`,
+    method: 'PUT'
+  })
+}
+
+/**
+ * Transfer CheckTask
+ * @param data
+ */
+export function transferCheckTask(data) {
+  return request({
+    url: `/check/task/transfer`,
+    method: 'PUT',
+    data
+  })
+}
+
+/**
+ * Cancel CheckTask
+
+ * @param taskId
+ */
+export function cancelCheckTask(taskId) {
+  return request({
+    url: `/check/task/cancel/${taskId}`,
+    method: 'PUT'
+  })
+}
+
+/**
+ * Complete CheckTask
+ * @param taskId
+ */
+export function completeCheckTask(taskId) {
+  return request({
+    url: `/check/task/complete/${taskId}`,
+    method: 'PUT'
+  })
+}

+ 79 - 0
api/aqpt/checklistHazardRecordApi.js

@@ -0,0 +1,79 @@
+import { request } from '@/libs/request.js'
+
+/**
+ * 根据Id获取Checklist Score Record Data
+ * @param recordId
+ * @param checklistId
+ * @returns
+ */
+export function getChecklistHazardRecordViewById(recordId, checklistId) {
+  return request({
+    url: `/checklist/hazard/record/view/${recordId}/${checklistId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 初始化
+ * @returns
+ * @param data
+ */
+export function initChecklistHazardRecord(data) {
+  return request({
+    url: `/checklist/hazard/record/init`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 根据Id获取Checklist Score Record Data
+ * @param recordId
+ * @param checklistId
+ * @returns
+ */
+export function completeChecklistDoing(recordId) {
+  return request({
+    url: `/checklist/hazard/record/complete/${recordId}`,
+    method: 'PUT'
+  })
+}
+
+/**
+ * 根据Id获取Checklist Score Record Data
+ * @param recordId
+ * @returns
+ */
+export function cancelChecklistDoing(recordId) {
+  return request({
+    url: `/checklist/point/record/complete/${recordId}`,
+    method: 'PUT'
+  })
+}
+
+/**
+ * 更新CheckTaskDoing Item
+ * @param data
+ * @returns
+ */
+export function updateChecklistHazardRecordDoing(data) {
+  return request({
+    url: `/checklist/hazard/record/doing/update`,
+    method: 'PUT',
+    data
+  })
+}
+
+/**
+ * 批量更新CheckTaskDoing Item
+ * @returns
+ * @param recordId
+ * @param checkResult
+ */
+export function batchUpdateChecklistHazardRecordDoing(recordId, checkResult) {
+  return request({
+    url: `/checklist/hazard/record/doing/batchUpdate/${recordId}/${checkResult}`,
+    method: 'PUT'
+  })
+}
+

+ 70 - 0
api/aqpt/checklistPoint.js

@@ -0,0 +1,70 @@
+import { request } from '@/libs/request.js'
+
+
+/**
+ * 清单初始化
+ * ocId
+ * targetId ,targetType,targetTitle,targetGroupId,,targetGroupName
+ * checklistId
+ */
+export function checklistInit(data) {
+  return request({
+    url: "/checklist/point/record/init",
+    method: 'POST',
+	data
+  })
+}
+
+export function updateChecklistPoint(data) {
+  return request({
+    url: "/checklist/point/record/doing/update",
+    method: 'PUT',
+    data
+  })
+}
+export function getchecklistRecord(checklistId,recordId) {
+  return request({
+    url: `/checklist/point/record/view/${recordId}/${checklistId}`,
+    method: 'GET'
+  })
+}
+export function getchecklistByPage(data) {
+  return request({
+    url: "/checklist/record/page",
+    method: 'GET',
+	data
+  })
+}
+// 巡检完成
+export function checklistComplete(recordId) {
+  return request({
+    url: `/checklist/point/record/complete/${recordId}`,
+    method: 'PUT'
+  })
+}
+// 巡检放弃
+export function checklistCancel(recordId) {
+  return request({
+    url: `/checklist/point/record/cancel/${recordId}`,
+    method: 'PUT'
+  })
+}
+// 批量操作
+export function checklistBatchUpdate(recordId,checkResult) {
+  return request({
+    url: `/checklist/point/record/doing/batchUpdate/${recordId}/${checkResult}`,
+    method: 'PUT'
+  })
+} 
+
+// 批量操作
+export function getDoingPoint(checklistId,itemId,recordId,pointId) {
+  return request({
+    url: `/checklist/point/record/doing/${recordId}/${checklistId}/${itemId}/${pointId}`,
+  })
+} 
+export function getPoint(checklistId,itemId,recordId,pointId) {
+  return request({
+    url: `/checklist/point/record/${recordId}/${checklistId}/${itemId}/${pointId}`,
+  })
+} 

+ 60 - 0
api/aqpt/checklistScore.js

@@ -0,0 +1,60 @@
+import { request } from '@/libs/request.js'
+
+/**
+ * 获取评分清单视图
+ * @param data
+ * 
+ * @returns
+ */
+export function getScoreView(checklistId) {
+  return request({
+    url: `/checklist/view/${checklistId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 获取评分清单记录视图
+ * @param data
+ * 
+ * @returns
+ */
+export function getScoreRecordView(recordId,checklistId) {
+  return request({
+    url: `/checklist/score/record/view/${recordId}/${checklistId}`,
+    method: 'GET'
+  })
+}
+
+// 2. 一次批量提交
+export function batchSatisfactionChecklist(data) {
+  return request({
+    url:"/checklist/score/record/batch",
+    method: 'POST',
+	data
+  })
+}
+/**
+ * 获取Checklist列表
+ * @param data
+ * @returns
+ */
+export function getChecklistScoreRecordByList(data) {
+  return request({
+    url: '/checklist/score/record',
+    method: 'GET',
+    data
+  })
+}
+/**
+ * 获取Checklist列表
+ * @param data
+ * @returns
+ */
+export function getChecklistScoreRecordByPage(data) {
+  return request({
+    url: '/checklist/score/record/page',
+    method: 'GET',
+    data
+  })
+}

+ 90 - 0
api/aqpt/dangerApi.js

@@ -0,0 +1,90 @@
+import {request} from '@/libs/request.js'
+
+/**
+ * 获取Danger列表
+ * @param data
+ * @returns
+ */
+export function getDangerByList(data) {
+  return request({
+    url: '/danger',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 获取Danger列表
+ * @param data
+ * @returns
+ */
+export function getRecentDangerByList(data) {
+  return request({
+    url: '/danger/recent',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 查询待处理Danger列表
+ * @param data
+ * @returns
+ */
+export function getDangerWaitingByList(data) {
+  return request({
+    url: '/danger/waiting',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 获取Danger分页
+ * @param data
+ * @returns
+ */
+export function getDangerByPage(data) {
+  return request({
+    url: '/danger/page',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 根据Id获取Danger
+ * @param dangerId
+ * @returns
+ */
+export function getDangerById(dangerId) {
+  return request({
+    url: `/danger/${dangerId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 删除Danger
+ * @param dangerId
+ * @returns
+ */
+export function deleteDangerById(dangerId) {
+  return request({
+    url: `/danger/${dangerId}`,
+    method: 'DELETE'
+  })
+}
+
+/**
+ * 处理Danger
+ * @param data
+ * @returns
+ */
+export function handleDanger(data) {
+  return request({
+    url: `/danger/handle`,
+    method: 'POST',
+    data
+  })
+}

+ 113 - 0
api/aqpt/snapshotApi.js

@@ -0,0 +1,113 @@
+import { request } from '@/libs/request.js'
+
+/**
+ * 问题反馈列表
+ * @param data
+ * @returns
+ */
+export function getSnapshotByList(data) {
+  return request({
+    url: '/snapshot',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 问题反馈列表
+ * @param data
+ * @returns
+ */
+export function getSnapshotByPage(data) {
+  return request({
+    url: '/snapshot/page',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 获取问题反馈详情
+ * @param snapshotId
+ * @returns
+ */
+export function getSnapshotById(snapshotId) {
+  return request({
+    url: `/snapshot/${snapshotId}`,
+    method: 'GET'
+  })
+}
+/**
+ * 添加问题反馈
+ * @param data
+ * @returns
+ */
+export function createSnapshot(data) {
+  return request({
+    url: `/snapshot/add`,
+    method: 'POST',
+    data
+  })
+}
+/**
+ * 完成处理
+ * @param snapshotId
+ * @param data
+ * @returns
+ */
+export function completeSnapshot(snapshotId, data) {
+  return request({
+    url: "/snapshot/complete",
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 转交他人
+ * @param snapshotId
+ * @param data
+ * @returns
+ */
+export function transferSnapshot(snapshotId, data) {
+  return request({
+    url: `/snapshot/transfer/${snapshotId}`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 撤消
+ * @param snapshotId
+ * @returns
+ */
+export function cancelSnapshot(snapshotId) {
+  return request({
+    url: `/snapshot/cancel/${snapshotId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 基于ID删除
+ * @param snapshotId
+ * @returns
+ */
+export function deleteSnapshotById(snapshotId) {
+  return request({
+    url: `/snapshot/${snapshotId}`,
+    method: 'DELETE'
+  })
+}
+
+/**
+ * 查询统计结果
+ */
+export function getSnapshotCounter() {
+  return request({
+    url: '/snapshot/statis/counterByStatus',
+    method: 'GET'
+  })
+}
+

+ 43 - 0
api/aqpt/task.js

@@ -0,0 +1,43 @@
+import { request } from '@/libs/request.js'
+/**
+ * 列表查询Danger Category
+ * @returns
+ */
+export function getTaskMyHandlingByList(data) {
+  return request({
+    url: '/task/myHandling/page',
+    method: 'GET',
+	data
+  })
+}
+/**
+ * Handle CheckTask
+ * @param taskId
+ */
+export function handleCheckTask(taskId) {
+  return request({
+    url: `/check/task/handle/${taskId}`,
+    method: 'PUT'
+  })
+}
+
+/**
+ * Handle CheckTask
+ * @param taskId
+ */
+export function waitHandleStatistics() {
+  return request({
+    url: "/myCounter"
+  })
+}
+/**
+ * 列表查询我的待办Task:
+ * @param limit待办数目
+ * @returns
+ */
+export function getMyWaitingTaskTop(limit) {
+  return request({
+    url: `/task/myWaiting/top/${limit}`,
+    method: 'GET'
+  })
+}

+ 139 - 0
api/aqpt/taskApi.js

@@ -0,0 +1,139 @@
+import {request} from '@/libs/request.js'
+
+/**
+ * 分页查询Task
+ * @param data
+ * @returns
+ */
+export function getTaskByPage(data) {
+  return request({
+    url: '/task/page',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 列表查询Task
+ * @param data
+ * @returns
+ */
+export function getTaskByList(data) {
+  return request({
+    url: '/task',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 列表查询未执行Task
+ * @param data
+ * @returns
+ */
+export function getWaitingTaskByList(data) {
+  return request({
+    url: '/task/waiting',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 列表查询Task: 50笔
+ * @param data
+ * @returns
+ */
+export function getRecentTaskByList(data) {
+  return request({
+    url: '/task/recent',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * @param taskId
+ * @returns
+ */
+export function getTaskById(taskId) {
+  return request({
+    url: `/task/${taskId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 添加Task
+ * @param data
+ * @returns
+ */
+export function createTask(data) {
+  return request({
+    url: `/task/add`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 更新Task
+ * @param data
+ * @returns
+ */
+export function updateTask(data) {
+  return request({
+    url: `/task/update`,
+    method: 'PUT',
+    data
+  })
+}
+
+/**
+ * 删除Task
+ * @param taskId
+ * @returns
+ */
+export function deleteTaskById(taskId) {
+  return request({
+    url: `/task/${taskId}`,
+    method: 'DELETE'
+  })
+}
+
+/**
+ * Handle Task
+ * @param taskId
+ * @returns
+ */
+export function handleTask(taskId) {
+  return request({
+    url: `/task/handle/${taskId}`,
+    method: 'PUT'
+  })
+}
+
+/**
+ * Transfer Task
+ * @param data
+ * @returns
+ */
+export function transferTask(data) {
+  return request({
+    url: `/task/transfer`,
+    method: 'PUT',
+    data
+  })
+}
+
+/**
+ * Cancel Task
+ * @param taskId
+ * @returns
+ */
+export function cancelTask(taskId) {
+  return request({
+    url: `/task/cancel/${taskId}`,
+    method: 'PUT'
+  })
+}

+ 20 - 0
api/aqpt/warning.js

@@ -0,0 +1,20 @@
+import {request} from '@/libs/request.js'
+/**
+ * 我的待处理告警TOP
+ */
+export function getMyWarningWaitingTop(limit) {
+  return request({
+    url: `/warning/myWaiting/top/${limit}`,
+    method: 'GET'
+  })
+}
+/**
+ * 分页查询告警
+ */
+export function getWarningByPage(data) {
+  return request({
+    url: '/warning/page',
+    method: 'GET',
+    data
+  })
+}

+ 103 - 0
api/aqpt/warningApi.js

@@ -0,0 +1,103 @@
+import {request} from '@/libs/request.js'
+
+/**
+ * 分页查询告警
+ */
+export function getWarningByPage(data) {
+  return request({
+    url: '/warning/page',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 列表查询告警
+ */
+export function getWarningByList(data) {
+  return request({
+    url: '/warning',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 列表查询待处理告警
+ */
+export function getWarningWaitingByList(data) {
+  return request({
+    url: '/warning/waiting',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 我的待处理告警TOP
+ */
+export function getMyWarningWaitingTop(limit) {
+  return request({
+    url: `/warning/myWaiting/top/${limit}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 基于ID查询告警
+ */
+export function getWarningById(warnId) {
+  return request({
+    url: `/warning/${warnId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 完成处理
+ * @param data
+ * @returns
+ */
+export function completeWarning(data) {
+  return request({
+    url: `/warning/complete`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 转交他人
+ * @param warnId
+ * @param data
+ * @returns
+ */
+export function transferWarning(warnId, data) {
+  return request({
+    url: `/warning/transfer/${warnId}`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 撤消
+ * @param warnId
+ * @returns
+ */
+export function cancelWarning(warnId) {
+  return request({
+    url: `/warning/cancel/${warnId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 删除
+ */
+export function deleteWarningById(warnId) {
+  return request({
+    url: `/warning/${warnId}`,
+    method: 'DELETE'
+  })
+}

+ 55 - 0
api/checkRecord.js

@@ -0,0 +1,55 @@
+import {
+	request
+} from '../libs/request.js'
+
+// 保存单个管控措施巡检记录
+export function updateCheckTaskDoingRecord(data) {
+	return request({
+		url: '/check/task/doing/item/update',
+		method: 'PUT',
+		data
+	})
+}
+/**
+ * 添加CheckTask
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function createCheckTask(data) {
+	return request({
+		url: `/check/task/quick/add`,
+		method: 'POST',
+		data
+	})
+}
+
+/**
+ * 校验当前任务是否全部巡检完成
+ */
+export function verifyCheckTaskDoingIsComplete(taskId) {
+	return request({
+		url: `/check/task/doing/item/verifyCheckTaskDoingIsComplete/` + taskId
+	})
+}
+
+//检查表全部通过
+export function batchUpdateCheckTaskDoingRecord(taskId) {
+	return request({
+		url: '/check/task/doing/item/batchUpdate/' + taskId + "/1",
+		method: 'PUT'
+	})
+}
+//完成任务
+export function completeCheckTaskDoingRecord(taskId) {
+	return request({
+		url: '/check/task/complete/' + taskId,
+		method: 'PUT'
+	})
+}
+//获取检查记录分页列表
+export function getCheckRecordByPage(data) {
+	return request({
+		url: '/check/record/page/',
+		data
+	})
+}

+ 90 - 0
api/danger.js

@@ -0,0 +1,90 @@
+import { request } from '../libs/request.js'
+
+//获取组织架构
+export function getGroupTree() {
+	return request({
+		url: '/group/treeView'
+	})
+}
+//获取隐患类别
+export function getDangerCatList() {
+	return request({
+		url: '/ent/danger/cat'
+	})
+}
+
+/**
+ * 获取用户列表
+ */
+export function getUserList() {
+	return request({
+		url: '/user/selectUserByOcId'
+	})
+}
+
+/**
+ * 添加隐患
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function add(data) {
+	return request({
+		url: `/ent/danger/trigger`,
+		method: 'PUT',
+		data
+	})
+}
+
+/**
+ * 创建Danger Ins
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function createDangerIns(wfDefId) {
+	return request({
+		url: `/ent/danger/create/` + wfDefId,
+		method: 'POST'
+	})
+}
+/**
+ * 我处理的隐患分页列表
+ * @param {Object} data
+ */
+export function getMyHandlingDangerInsByPage(data) {
+	return request({
+		// url: `/ent/danger/myHandling/page`,
+		url: "/ent/danger/page",
+		data
+	})
+}
+/**
+ * 获取详细流程信息
+ * @param {Object} dangerId
+ * 废弃
+ */
+export function getDangerInsById(dangerId) {
+	return request({
+		// url: `/ent/danger/ins/` + dangerId,
+		url: "/ent/danger/" + dangerId,
+	})
+}
+/**
+ * 创建Danger Ins
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function triggerDangerIns(data) {
+	return request({
+		url: `/ent/danger/trigger`,
+		method: 'PUT',
+		data
+	})
+}
+/*
+	获取隐患详情
+*/
+export function getDangerDetailsById(dangerId) {
+	return request({
+		url: `/ent/danger/${dangerId}` ,
+	})
+}

+ 42 - 0
api/entRiskPoint.js

@@ -0,0 +1,42 @@
+import {
+	request
+} from '../libs/request.js'
+
+export function getEntRiskPointInfo(data) {
+	return request({
+		url: '/ent/riskPoint/page',
+		data
+	})
+}
+//获取风险点详情基本信息
+export function getEntRiskPointDetails(riskPointId) {
+	return request({
+		url: '/ent/riskPoint/' + riskPointId
+	})
+}
+// 获取风险点危险源
+export function getEntRiskPointHazard(riskPointId) {
+	
+	// return request({
+	// 	url: '/entRiskPointHazard/getRpHazard?riskPointId=' + riskPointId
+	// })
+	return request({
+		url: '/ent/riskPoint/hazard/view?riskPointId=' + riskPointId
+	})	
+}
+// 根据风险点ID获取检查清单分页列表
+export function getCheckList(data) {
+	return request({
+		url: '/ent/riskPoint/checklist/page',
+		header: {
+			'content-type': "application/x-www-form-urlencoded"
+		},
+		data
+	})
+}
+// 根据风险点ID获取检查清单分页列表
+export function getCheckTaskView(taskId) {
+	return request({
+		url: '/check/task/view/' + taskId
+	})
+}

+ 31 - 0
api/index.js

@@ -0,0 +1,31 @@
+import {getToken} from '@/libs/auth.js';
+import config from "@/config/index.js"
+const baseUrl = process.env.NODE_ENV === 'development' ? config.uploadFile.dev : config.uploadFile.pro;	
+/*
+opCode	
+0 上传
+1删除
+*/
+export const upload=({formData,filePath,callback})=>{
+	return new Promise(function(resolve,reject){
+		const uploadTask=uni.uploadFile({
+			url: baseUrl+'/admin/uploadFile',
+			filePath,
+			header:{
+				[config.TokenKey]:getToken()
+			},
+			name: 'file',
+			formData,
+			success: (uploadFileRes) => {
+				resolve(uploadFileRes.data)
+			},
+			fail({errMsg}){
+				reject(errMsg)
+			}
+		});	
+		if(callback){
+			callback(uploadTask);
+		}
+				
+	})
+}	

+ 19 - 0
api/system/app.js

@@ -0,0 +1,19 @@
+
+import {request} from '@/libs/request.js'
+
+export function getAppList() {
+	return request({
+		url: "/mini/store"
+	})
+}
+export function getQuickList() {
+	return request({
+		url: "/mini/quick"
+	})
+}
+
+export function getAppVersion() {
+	return request({
+		url: "/setting/get/appVersion"
+	})
+}

+ 82 - 0
api/system/art.js

@@ -0,0 +1,82 @@
+
+import {request} from '@/libs/request.js'
+
+export function getNotices(data) {
+	return request({
+		url: "/art/page",
+		data
+	})
+}
+/**
+ * 最近文章列表:50笔
+ * @param data
+
+ */
+export function getRecentArtByList(data) {
+  return request({
+    url: '/art/recent',
+    method: 'GET',
+    data
+  })
+}
+/**
+ * 获取获取第1层文章分类
+ * @param data
+ * @returns
+ */
+export function getArtCatTop(data) {
+  return request({
+    url: '/art/cat/top',
+    method: 'GET',
+    data
+  })
+}
+/**
+ * 文章列表
+ * @param data
+
+ */
+export function getArtByList(data) {
+  return request({
+    url: '/art',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 文章列表
+ * @param data
+ */
+export function getArtByPage(data) {
+  return request({
+    url: '/art/page',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 最近文章列表
+ * @param limit 限制笔数
+
+ */
+export function getRecentListByLimit(limit) {
+  return request({
+    url: `/art/recent/${limit}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 某个类别下的最近文章列表
+ * @param artCatId 分类
+ * @param limit 限制笔数
+
+ */
+export function getRecentListByArtCatAndLimit(artCatId, limit) {
+  return request({
+    url: `/art/recent/${artCatId}/${limit}`,
+    method: 'GET'
+  })
+}

+ 64 - 0
api/system/dangerApi.js

@@ -0,0 +1,64 @@
+import { request } from '@/libs/request.js'
+
+/**
+ * 获取Danger列表
+ * @param data
+ * @returns
+ */
+export function getDangerByList(data) {
+  return request({
+    url: '/danger',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 获取Danger分页
+ * @param data
+ * @returns
+ */
+export function getDangerByPage(data) {
+  return request({
+    url: '/danger/page',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 根据Id获取Danger
+ * @param dangerId
+ * @returns
+ */
+export function getDangerById(dangerId) {
+  return request({
+    url: `/danger/${dangerId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 删除Danger
+ * @param dangerId
+ * @returns
+ */
+export function deleteDangerById(dangerId) {
+  return request({
+    url: `/danger/${dangerId}`,
+    method: 'DELETE'
+  })
+}
+
+/**
+ * 处理Danger
+ * @param data
+ * @returns
+ */
+export function handleDanger(data) {
+  return request({
+    url: `/danger/handle`,
+    method: 'POST',
+    data
+  })
+}

+ 73 - 0
api/system/groupApi.js

@@ -0,0 +1,73 @@
+import { request } from '@/libs/request.js'
+
+/**
+ * 获取部门列表
+ * @returns
+ */
+export function getGroupByList() {
+  return request({
+    url: '/group',
+    method: 'GET'
+  })
+}
+
+/**
+ * 根据ID获取
+ * @returns
+ * @param groupId
+ */
+export function getGroupById(groupId) {
+  return request({
+    url: `/group/${groupId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 添加部门
+ * @param data
+ * @returns
+ */
+export function createGroup(data) {
+  return request({
+    url: `/group/add`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 更新部门
+ * @param data
+ * @returns
+ */
+export function updateGroup(data) {
+  return request({
+    url: `/group/update`,
+    method: 'PUT',
+    data
+  })
+}
+
+/**
+ * 删除部门
+ * @returns
+ * @param groupId
+ */
+export function deleteGroupById(groupId) {
+  return request({
+    url: `/group/${groupId}`,
+    method: 'DELETE'
+  })
+}
+
+/**
+ * 获取部门列表
+ * @returns
+ */
+export function getGroupView() {
+  return request({
+    url: '/group/view',
+    method: 'GET'
+  })
+}

+ 98 - 0
api/system/msgApi.js

@@ -0,0 +1,98 @@
+import { request } from '@/libs/request.js'
+
+/**
+ * 分页查询发送消息
+ * @param data
+ * @returns
+ */
+export function getMsgSentByPage(data) {
+  return request({
+    url: '/msg/sent/page',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 分页查询接收消息
+ * @param data
+ * @returns
+ */
+export function getMsgReceivedByPage(data) {
+  return request({
+    url: '/msg/received/page',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 基于ID获取消息详情
+ * @param msgId
+ * @returns
+ */
+export function getMsgById(msgId) {
+  return request({
+    url: `/msg/${msgId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 基于ID置已读状态
+ * @param msgId
+ * @returns
+ */
+export function putReadStatus(msgId) {
+  return request({
+    url: `/msg/read/${msgId}`,
+    method: 'PUT'
+  })
+}
+
+/**
+ * 获取未读消息数目
+ * @returns
+ */
+export function getUnReadCounter() {
+  return request({
+    url: `/msg/unread/count`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 发送消息
+ * @param data
+ * @returns
+ */
+export function sendMsg(data) {
+  return request({
+    url: `/msg/send`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 删除消息
+ * @param msgId
+ * @returns
+ */
+export function deleteMsgById(msgId) {
+  return request({
+    url: `/msg/${msgId}`,
+    method: 'DELETE'
+  })
+}
+/**
+ * 全部已读
+ * @param msgId
+ * @returns
+ */
+export function putAllReadStatus() {
+  return request({
+    url: "/msg/all/read",
+    method: 'PUT'
+  })
+}

+ 19 - 0
api/system/scan.js

@@ -0,0 +1,19 @@
+import { request } from '@/libs/request.js'
+/**
+ * 扫码请求
+ * @param ocId   单位ID
+ * @param qrCode 二维码
+ * @returns
+ */
+export function getByQr(ocId, qrCode) {
+  return request({
+    url: `/qr/request/${ocId}/${qrCode}`,
+    method: 'GET'
+  })
+}
+export function getApps(targetId) {
+  return request({
+    url:`/mini/permitted/${targetId} `,
+    method: 'GET'
+  })
+}

+ 65 - 0
api/system/taskEventApi.js

@@ -0,0 +1,65 @@
+import { request } from '@/libs/request.js'
+
+/**
+ * 获取Task Event分页
+ * @param data
+ * @returns
+ */
+export function getTaskEventByPage(data) {
+  return request({
+    url: '/task/event/page',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 获取Task Event列表
+ * @param data
+ * @returns
+ */
+export function getTaskEventByList(data) {
+  return request({
+    url: '/task/event',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 根据Id获取Task Event
+ * @param data
+ * @returns
+ */
+export function getTaskEventByTaskId(taskId) {
+  return request({
+    url: `/task/event/${taskId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 添加Task Event
+ * @param data
+ * @returns
+ */
+export function createTaskEvent(data) {
+  return request({
+    url: `/task/event/add`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 删除Task Event
+ * @param data
+ * @returns
+ */
+export function deleteTaskEvent(taskId) {
+  return request({
+    url: `/task/event/${taskId}`,
+    method: 'DELETE'
+  })
+}
+

+ 38 - 0
api/system/upload.js

@@ -0,0 +1,38 @@
+import {getToken} from '@/libs/auth.js';
+import config from "@/config/index.js"
+const baseUrl = process.env.NODE_ENV === 'development' ? config.base.dev : config.base.pro;
+export const upload=({formData,filePath,callback})=>{
+	uni.showLoading({
+		mask:true,
+		title:"上传中"
+	})
+	return new Promise(function(resolve,reject){
+		const uploadTask=uni.uploadFile({
+			url: baseUrl+'/upload/file',
+			filePath,
+			header:{
+				[config.TokenKey]:getToken(),
+				AppID:config.appID,
+				AppKey:config.appKey,
+				AppSecret: config.appSecret
+			},
+			name: 'file',
+			formData,
+			success: (uploadFileRes) => {
+				uni.hideLoading()
+				resolve(uploadFileRes.data)
+			},
+			fail({errMsg}){
+				uni.hideLoading({
+					mask:true,
+					title:"上传失败"
+				})
+				reject(errMsg)
+			}
+		});	
+		if(callback){
+			callback(uploadTask);
+		}
+				
+	})
+}	

+ 83 - 0
api/system/user.js

@@ -0,0 +1,83 @@
+import {
+	request
+} from '@/libs/request.js'
+
+export function login(data) {
+	return request({
+		url: '/login',
+		method: 'post',
+		header:{
+			'content-type':"application/x-www-form-urlencoded"
+		},
+		data
+	})
+}
+
+// 获取用户基本信息
+export function getUserProfile() {
+  return request({
+    url: '/user/profile',
+    method: 'GET'
+  })
+}
+
+// 更新用户基本信息
+export function updateUserProfile(data) {
+  return request({
+    url: '/user/profile/update',
+    method: 'PUT',
+    data
+  })
+}
+
+export function getUserInfo() {
+	return request({
+		url: '/user/profile'
+	})
+}
+
+export function logout() {
+	return request({
+		url: '/logout',
+		method: 'GET'
+	})
+}
+export function register(data) {
+	return request({
+		url: '/user/register',
+		method: 'post',
+		data: data
+	})
+}
+/**公用上传接口 */
+export function uploadFile(data) {
+	return request({
+		url: '/upload/file',
+		method: "post",
+		headers: {
+			'Content-Type': 'multipart/form-data'
+		},
+		data
+	})
+}
+export function updatePwd(data) {
+	return request({
+		url: '/user/updatePassword',
+		method: "PUT",
+		data
+	})
+}
+//查询用户的带岗位
+export function getUserList() {
+  return request({
+    url: '/user/select',
+    method: 'get'
+  })
+}
+//企业微信登录
+export function wxWorkLogin({userId,code}) {
+  return request({
+    url: `/user/updateWxUserId/${userId}/${code}`,
+    method: 'post'
+  })
+}

+ 73 - 0
api/system/wfApi.js

@@ -0,0 +1,73 @@
+import { request } from '@/libs/request.js'
+
+/**
+ * 启动Workflow
+ * @param wfDefId
+ * @returns
+ */
+export function startWorkflow(wfDefId) {
+  return request({
+    url: `/wf/start/${wfDefId}`,
+    method: 'GET'
+  })
+}
+
+export function getWorkflowById(wfInsId) {
+  return request({
+    url: `/wf/getIns/${wfInsId}`,
+    method: 'GET'
+  })
+}
+
+export function getWorkflowById2(wfInsId, activityInsId) {
+  return request({
+    url: `/wf/getIns/${wfInsId}/${activityInsId}`,
+    method: 'GET'
+  })
+}
+
+export function getWorkflowById3(wfInsId, activityInsId, actionInsId) {
+  return request({
+    url: `/wf/getIns/${wfInsId}/${activityInsId}/${actionInsId}`,
+    method: 'GET'
+  })
+}
+
+export function getWorkflowDetailsById(wfInsId) {
+  return request({
+    url: `/wf/details/${wfInsId}`,
+    method: 'GET'
+  })
+}
+
+export function getWorkflowRecordById(wfInsId) {
+  return request({
+    url: `/wf/record/${wfInsId}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 处理
+ * @param data
+ * @returns
+ */
+export function handleWorkflow(data) {
+  return request({
+    url: `/wf/handle`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 撤消
+ * @param wfInsId
+ * @returns
+ */
+export function cancelWorkflow(wfInsId) {
+  return request({
+    url: `/wf/cancel/${wfInsId}`,
+    method: 'GET'
+  })
+}

+ 84 - 0
api/task.js

@@ -0,0 +1,84 @@
+import { request } from '../libs/request.js'
+/**
+ * 获取分页任务列表
+ * @param {Object} data
+ */
+export function getCheckTaskByPage(data) {
+	return request({
+		url: '/check/task/page',
+		header: {
+			'content-type': "application/x-www-form-urlencoded"
+		},
+		data
+	})
+}
+/**
+ * 通过id获取详情
+ * @param id
+ */
+export function getTaskDetailById(id) {
+	return request({
+		url: '/check/task/view/'+id
+	})
+}
+/**
+ * 通过id进行任务的处理操作
+ * @param id
+ */
+export function manageTaskById(id) {
+	return request({
+		url: '/check/task/handle/'+id,
+		method: 'PUT'
+	})
+}
+
+/**
+ * Transfer CheckTask
+ * 转交任务
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function transferCheckTask(data) {
+  return request({
+    url: `/check/task/transfer`,
+    method: 'PUT',
+    data
+  })
+}
+
+/**
+ * Cancel CheckTask
+ *  取消任务
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function cancelCheckTask(checkTaskId) {
+  return request({
+    url: `/check/task/cancel/${checkTaskId}`,
+    method: 'PUT'
+  })
+}
+
+/**
+ * Complete CheckTask
+ * @param data
+ * @returns {AxiosPromise}
+ *  完成任务
+ */
+export function completeCheckTask(checkTaskId) {
+  return request({
+    url: `/check/task/complete/${checkTaskId}`,
+    method: 'PUT'
+  })
+}
+/**
+ * 批量更新CheckTaskDoing Item
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function batchUpdateCheckTaskDoingItem(taskId, checkResult) {
+  return request({
+    url: `/check/task/doing/item/batchUpdate/${taskId}/${checkResult}`,
+    method: 'PUT'
+  })
+}

+ 91 - 0
api/warning.js

@@ -0,0 +1,91 @@
+import {
+	request
+} from '../libs/request.js'
+
+/**
+ * 获取分页
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function getAlertByPage(data) {
+  return request({
+    url: '/alert/page',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 获取列表
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function getAlertByList(data) {
+  return request({
+    url: '/alert',
+    method: 'GET',
+    data
+  })
+}
+
+/**
+ * 根据Id获取
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function getAlertById(id) {
+  return request({
+    url: `/alert/${id}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 开始
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function startAlert(data) {
+  return request({
+    url: `/alert/start`,
+    method: 'post',
+    data
+  })
+}
+
+/**
+ * 处理
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function handleAlert(data) {
+  return request({
+    url: `/alert/handle`,
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 删除
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function deleteAlertById(id) {
+  return request({
+    url: `/alert/${id}`,
+    method: 'DELETE'
+  })
+}
+
+/**
+ * 查询统计结果
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function getAlertCounter() {
+  return request({
+    url: '/alert/statis/getCounter',
+    method: 'GET'
+  })
+}

+ 13 - 0
config/index.js

@@ -0,0 +1,13 @@
+export default {
+    base: {
+      // dev: 'http://1.15.92.205:7001',		
+      dev: 'https://api.xazhyc.com',
+	  // dev: 'http://192.168.3.253:7001',	
+      pro: 'https://api.xazhyc.com'
+    },
+	appID: '10007',
+	appKey: '82a8bf439373e311',
+	appSecret: '82a8bf439373e311',
+	permitTplId: 7,
+	TokenKey:"Authorization"
+}

+ 20 - 0
index.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 114 - 0
libs/EPlatform.js

@@ -0,0 +1,114 @@
+/**枚举EPlatform*/
+export enum EPlatform {
+  /**App*/
+  AppPlus = 'APP-PLUS',
+  /**App nvue*/
+  AppPlusNvue = 'APP-PLUS-NVUE',
+  /**H5*/
+  H5 = 'H5',
+  /**微信小程序*/
+  MpWeixin = 'MP-WEIXIN',
+  /**支付宝小程序*/
+  MpAlipay = 'MP-ALIPAY',
+  /**百度小程序*/
+  MpBaidu = 'MP-BAIDU',
+  /**字节跳动小程序*/
+  MpToutiao = 'MP-TOUTIAO',
+  /**QQ小程序*/
+  MpQq = 'MP-QQ',
+  /**360小程序*/
+  Mp360 = 'MP-360',
+  /**微信小程序/支付宝小程序/百度小程序/字节跳动小程序/QQ小程序/360小程序*/
+  Mp = 'MP',
+  /**快应用通用(包含联盟、华为)*/
+  QuickappWebview = 'quickapp-webview',
+  /**快应用联盟*/
+  QuickappWebviewUnion = 'quickapp-webview-union',
+  /**快应用华为*/
+  QuickappWebviewHuawei = 'quickapp-webview-huawei',
+}
+
+/**使用条件编译获取平台信息*/
+export function ifDefPlatform(): EPlatform {
+  let platform: EPlatform
+  //#ifdef APP-PLUS
+  platform = EPlatform.AppPlus;
+  //#endif
+  //#ifdef APP-PLUS-NVUE
+  platform = EPlatform.AppPlusNvue;
+  //#endif
+  //#ifdef H5
+  platform = EPlatform.H5;
+  //#endif
+  //#ifdef MP-WEIXIN
+  platform = EPlatform.MpWeixin;
+  //#endif
+  //#ifdef MP-ALIPAY
+  platform = EPlatform.MpAlipay;
+  //#endif
+  //#ifdef MP-BAIDU
+  platform = EPlatform.MpBaidu;
+  //#endif
+  //#ifdef MP-TOUTIAO
+  platform = EPlatform.MpToutiao;
+  //#endif
+  //#ifdef MP-QQ
+  platform = EPlatform.MpQq;
+  //#endif
+  //#ifdef MP-360
+  platform = EPlatform.Mp360;
+  //#endif
+  //#ifdef MP
+  platform = EPlatform.Mp;
+  //#endif
+  //#ifdef quickapp-webview
+  platform = EPlatform.QuickappWebview;
+  //#endif
+  //#ifdef quickapp-webview-union
+  platform = EPlatform.QuickappWebviewUnion;
+  //#endif
+  //#ifdef quickapp-webview-huawei
+  platform = EPlatform.QuickappWebviewHuawei;
+  //#endif
+  return platform
+}
+
+/**平台类型*/
+export const Platform: EPlatform = ifDefPlatform()
+/**默认导出平台类型*/
+export default Platform
+
+/**App*/
+export const isAppPlus = Platform == EPlatform.AppPlus
+/**App nvue*/
+export const isAppPlusNvue = Platform == EPlatform.AppPlusNvue
+/**H5*/
+export const isH5 = Platform == EPlatform.H5
+/**微信小程序*/
+export const isMpWeixin = Platform == EPlatform.MpWeixin
+/**支付宝小程序*/
+export const isMpAlipay = Platform == EPlatform.MpAlipay
+/**百度小程序*/
+export const isMpBaidu = Platform == EPlatform.MpBaidu
+/**字节跳动小程序*/
+export const isMpToutiao = Platform == EPlatform.MpToutiao
+/**QQ小程序*/
+export const isMpQq = Platform == EPlatform.MpQq
+/**360小程序*/
+export const isMp360 = Platform == EPlatform.Mp360
+/**微信小程序/支付宝小程序/百度小程序/字节跳动小程序/QQ小程序/360小程序*/
+export const isMp = Platform == EPlatform.Mp
+/**快应用通用(包含联盟、华为)*/
+export const isQuickappWebview = Platform == EPlatform.QuickappWebview
+/**快应用联盟*/
+export const isQuickappWebviewUnion = Platform == EPlatform.QuickappWebviewUnion
+/**快应用华为*/
+export const isQuickappWebviewHuawei = Platform == EPlatform.QuickappWebviewHuawei
+/**是否开发环境*/
+export const isDevelopment = process.env.NODE_ENV == 'development'
+/**是否线上环境*/
+export const isProduction = process.env.NODE_ENV == 'production'
+/**抖音小程序*/
+export const isMpDouyinApp = uni.getSystemInfoSync().appName == 'Douyin'
+/**头条小程序*/
+export const isMpToutiaoApp = uni.getSystemInfoSync().appName == 'Toutiao'

+ 15 - 0
libs/auth.js

@@ -0,0 +1,15 @@
+
+import config from "../config/index.js"
+const TokenKey = config.TokenKey;
+
+export function getToken() {
+  return uni.getStorageSync(TokenKey);
+}
+
+export function setToken(token) {
+  return uni.setStorageSync(TokenKey, token);
+}
+
+export function removeToken() {
+  return uni.removeStorageSync(TokenKey);
+}

+ 201 - 0
libs/enum.js

@@ -0,0 +1,201 @@
+// 风险类型
+export function riskType(val) {
+  const strs = [
+    '默认',
+    '人',
+    '物',
+    '管'
+  ]
+  return strs[val]
+}
+
+// 风险等级
+export function riskLevel(val) {
+  const strs = [
+    '默认',
+    '重大',
+    '较大',
+    '一般',
+    '较小'
+  ]
+  return strs[val]
+}
+
+// 风险等级
+export function riskPointStatus(val) {
+  const strs = [
+    '未知',
+    '安全受控',
+    '失控'
+  ]
+  return strs[val]
+}
+
+// 风险点等级
+export function riskPointLevel(val) {
+  const strs = [
+    '默认',
+    '重大',
+    '较大',
+    '一般',
+    '较小'
+  ]
+  return strs[val]
+}
+
+export function taskPriority(i) {
+  const strs = [
+    '未知',
+    '较低',
+    '普通',
+    '紧急',
+    '非常紧急'
+  ]
+  return strs[i]
+}
+
+export function taskType(i) {
+  const strs = [
+    '未知',
+    '常规',
+    '审批任务',
+    '巡检任务'
+  ]
+  return strs[i]
+}
+
+export function taskStatus(i) {
+  const strs = [
+    '待处理',
+    '已完成'
+  ]
+  if (i === -1) {
+    return '已撤消'
+  } else {
+    return strs[i]
+  }
+}
+
+export function checkResult(i) {
+  const strs = [
+    '没执行',
+    '通过',
+    '没通过',
+    '有隐患',
+    '已完成'
+  ]
+  return strs[i]
+}
+
+export function dangerStatus(i) {
+  if (i >= 0) {
+    const strs = [
+      '待提交',
+      '待评审',
+      '待整改',
+      '待验收',
+      '已整改'
+    ]
+    return strs[i]
+  } else {
+    return '已撤销'
+  }
+}
+
+export function dangerLevel(i) {
+  const strs = [
+    '未知',
+    '重大',
+    '较大',
+    '严重',
+    '一般'
+  ]
+  return strs[i]
+}
+
+export function dangerSource(i) {
+  const strs = [
+    '自查',
+    '内部反馈',
+    '上级抽查',
+    '政府执法'
+  ]
+  return strs[i]
+}
+
+export function rectifyCat(i) {
+  const strs = [
+    '自行整改',
+    '外协整改'
+  ]
+  return strs[i]
+}
+
+export function wfInsStatus(i) {
+  if (i >= 0) {
+    const strs = [
+      '未开始',
+      '执行中',
+      '已完成'
+    ]
+    return strs[i]
+  } else {
+    return '已撤销'
+  }
+}
+
+export function wfTaskInsStatus(i) {
+  const strs = [
+    '未开始',
+    '已完成'
+  ]
+  return strs[i]
+}
+
+export function dangerRectifyCat(i) {
+  const strs = [
+    '自行整改',
+    '外协整改'
+  ]
+  return strs[i]
+}
+
+export function alertLevel(i) {
+  const strs = [
+    '未知',
+    '1级',
+    '2级',
+    '3级',
+    '4级',
+    '5级',
+    '6级'
+  ]
+  return strs[i]
+}
+
+export function alertStatus(i) {
+  if (i >= 0) {
+    const strs = [
+      '活动',
+      '已解除'
+    ]
+    return strs[i]
+  } else {
+    return '已撤销'
+  }
+}
+export function warningLevel(val) {
+  const enums = { 1: 'Ⅰ级', 2: 'Ⅱ级', 3: 'Ⅲ级', 4: 'Ⅳ级' }
+  return enums[val]
+}
+export function warningStatus(i) {
+  if (i >= 0) {
+    const strs = [
+      '待处理',
+      '已处理'
+    ]
+    return strs[i]
+  } else {
+    return '已撤销'
+  }
+}

+ 97 - 0
libs/graceChecker.js

@@ -0,0 +1,97 @@
+/**
+数据验证(表单验证)
+来自 grace.hcoder.net 
+作者 hcoder 深海
+*/
+export default {
+	error:'',
+	check : function (data, rule){
+		for(var i = 0; i < rule.length; i++){
+			if (!rule[i].checkType){return true;}
+			if (!rule[i].name) {return true;}
+			if (!rule[i].errorMsg) {return true;}
+			if (!data[rule[i].name]) {this.error = rule[i].errorMsg; return false;}
+			switch (rule[i].checkType){
+				case 'string':
+					var reg = new RegExp('^.{' + rule[i].checkRule + '}$');
+					if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
+				break;
+				case 'int':
+					var reg = new RegExp('^(-[1-9]|[1-9])[0-9]{' + rule[i].checkRule + '}$');
+					if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
+					break;
+				break;
+				case 'between':
+					if (!this.isNumber(data[rule[i].name])){
+						this.error = rule[i].errorMsg;
+						return false;
+					}
+					var minMax = rule[i].checkRule.split(',');
+					minMax[0] = Number(minMax[0]);
+					minMax[1] = Number(minMax[1]);
+					if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
+						this.error = rule[i].errorMsg;
+						return false;
+					}
+				break;
+				case 'betweenD':
+					var reg = /^-?[1-9][0-9]?$/;
+					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+					var minMax = rule[i].checkRule.split(',');
+					minMax[0] = Number(minMax[0]);
+					minMax[1] = Number(minMax[1]);
+					if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
+						this.error = rule[i].errorMsg;
+						return false;
+					}
+				break;
+				case 'betweenF': 
+					var reg = /^-?[0-9][0-9]?.+[0-9]+$/;
+					if (!reg.test(data[rule[i].name])){this.error = rule[i].errorMsg; return false;}
+					var minMax = rule[i].checkRule.split(',');
+					minMax[0] = Number(minMax[0]);
+					minMax[1] = Number(minMax[1]);
+					if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
+						this.error = rule[i].errorMsg;
+						return false;
+					}
+				break;
+				case 'same':
+					if (data[rule[i].name] != rule[i].checkRule) { this.error = rule[i].errorMsg; return false;}
+				break;
+				case 'notsame':
+					if (data[rule[i].name] == rule[i].checkRule) { this.error = rule[i].errorMsg; return false; }
+				break;
+				case 'email':
+					var reg = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
+					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+				break;
+				case 'phoneno':
+					var reg = /^1[0-9]{10,10}$/;
+					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+				break;
+				case 'zipcode':
+					var reg = /^[0-9]{6}$/;
+					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+				break;
+				case 'reg':
+					var reg = new RegExp(rule[i].checkRule);
+					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+				break;
+				case 'in':
+					if(rule[i].checkRule.indexOf(data[rule[i].name]) == -1){
+						this.error = rule[i].errorMsg; return false;
+					}
+				break;
+				case 'notnull':
+					if(data[rule[i].name] == null || data[rule[i].name].length < 1){this.error = rule[i].errorMsg; return false;}
+				break;
+			}
+		}
+		return true;
+	},
+	isNumber : function (checkVal){
+		var reg = /^-?[1-9][0-9]?.?[0-9]*$/;
+		return reg.test(checkVal);
+	}
+}

+ 500 - 0
libs/index.js

@@ -0,0 +1,500 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * Parse the time to string
+ * @param {(Object|string|number)} time
+ * @param {string} cFormat
+ * @returns {string | null}
+ */
+export function parseTime(time, cFormat) {
+  if (arguments.length === 0 || !time) {
+    return null
+  }
+  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+  let date
+  if (typeof time === 'object') {
+    date = time
+  } else {
+    if ((typeof time === 'string')) {
+      if ((/^[0-9]+$/.test(time))) {
+        // support "1548221490638"
+        time = parseInt(time)
+      } else {
+        // support safari
+        // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
+        time = time.replace(new RegExp(/-/gm), '/')
+      }
+    }
+
+    if ((typeof time === 'number') && (time.toString().length === 10)) {
+      time = time * 1000
+    }
+    date = new Date(time)
+  }
+  const formatObj = {
+    y: date.getFullYear(),
+    m: date.getMonth() + 1,
+    d: date.getDate(),
+    h: date.getHours(),
+    i: date.getMinutes(),
+    s: date.getSeconds(),
+    a: date.getDay()
+  }
+  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
+    const value = formatObj[key]
+    // Note: getDay() returns 0 on Sunday
+    if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
+    return value.toString().padStart(2, '0')
+  })
+  return time_str
+}
+
+/**
+ * @param {number} time
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+  if (('' + time).length === 10) {
+    time = parseInt(time) * 1000
+  } else {
+    time = +time
+  }
+  const d = new Date(time)
+  const now = Date.now()
+
+  const diff = (now - d) / 1000
+
+  if (diff < 30) {
+    return '刚刚'
+  } else if (diff < 3600) {
+    // less 1 hour
+    return Math.ceil(diff / 60) + '分钟前'
+  } else if (diff < 3600 * 24) {
+    return Math.ceil(diff / 3600) + '小时前'
+  } else if (diff < 3600 * 24 * 2) {
+    return '1天前'
+  }
+  if (option) {
+    return parseTime(time, option)
+  } else {
+    return (
+      d.getMonth() +
+      1 +
+      '月' +
+      d.getDate() +
+      '日' +
+      d.getHours() +
+      '时' +
+      d.getMinutes() +
+      '分'
+    )
+  }
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function getQueryObject(url) {
+  url = url == null ? window.location.href : url
+  const search = url.substring(url.lastIndexOf('?') + 1)
+  const obj = {}
+  const reg = /([^?&=]+)=([^?&=]*)/g
+  search.replace(reg, (rs, $1, $2) => {
+    const name = decodeURIComponent($1)
+    let val = decodeURIComponent($2)
+    val = String(val)
+    obj[name] = val
+    return rs
+  })
+  return obj
+}
+
+/**
+ * @param {string} input value
+ * @returns {number} output value
+ */
+export function byteLength(str) {
+  // returns the byte length of an utf8 string
+  let s = str.length
+  for (var i = str.length - 1; i >= 0; i--) {
+    const code = str.charCodeAt(i)
+    if (code > 0x7f && code <= 0x7ff) s++
+    else if (code > 0x7ff && code <= 0xffff) s += 2
+    if (code >= 0xDC00 && code <= 0xDFFF) i--
+  }
+  return s
+}
+
+/**
+ * @param {Array} actual
+ * @returns {Array}
+ */
+export function cleanArray(actual) {
+  const newArray = []
+  for (let i = 0; i < actual.length; i++) {
+    if (actual[i]) {
+      newArray.push(actual[i])
+    }
+  }
+  return newArray
+}
+
+/**
+ * @param {Object} json
+ * @returns {Array}
+ */
+export function param(json) {
+  if (!json) return ''
+  return cleanArray(
+    Object.keys(json).map(key => {
+      if (json[key] === undefined) return ''
+      return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+    })
+  ).join('&')
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function param2Obj(url) {
+  const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
+  if (!search) {
+    return {}
+  }
+  const obj = {}
+  const searchArr = search.split('&')
+  searchArr.forEach(v => {
+    const index = v.indexOf('=')
+    if (index !== -1) {
+      const name = v.substring(0, index)
+      const val = v.substring(index + 1, v.length)
+      obj[name] = val
+    }
+  })
+  return obj
+}
+
+/**
+ * @param {string} val
+ * @returns {string}
+ */
+export function html2Text(val) {
+  const div = document.createElement('div')
+  div.innerHTML = val
+  return div.textContent || div.innerText
+}
+
+/**
+ * Merges two objects, giving the last one precedence
+ * @param {Object} target
+ * @param {(Object|Array)} source
+ * @returns {Object}
+ */
+export function objectMerge(target, source) {
+  if (typeof target !== 'object') {
+    target = {}
+  }
+  if (Array.isArray(source)) {
+    return source.slice()
+  }
+  Object.keys(source).forEach(property => {
+    const sourceProperty = source[property]
+    if (typeof sourceProperty === 'object') {
+      target[property] = objectMerge(target[property], sourceProperty)
+    } else {
+      target[property] = sourceProperty
+    }
+  })
+  return target
+}
+
+/**
+ * @param {HTMLElement} element
+ * @param {string} className
+ */
+export function toggleClass(element, className) {
+  if (!element || !className) {
+    return
+  }
+  let classString = element.className
+  const nameIndex = classString.indexOf(className)
+  if (nameIndex === -1) {
+    classString += '' + className
+  } else {
+    classString =
+      classString.substr(0, nameIndex) +
+      classString.substr(nameIndex + className.length)
+  }
+  element.className = classString
+}
+
+/**
+ * @param {string} type
+ * @returns {Date}
+ */
+export function getTime(type) {
+  if (type === 'start') {
+    return new Date().getTime() - 3600 * 1000 * 24 * 90
+  } else {
+    return new Date(new Date().toDateString())
+  }
+}
+
+/**
+ * @param {Function} func
+ * @param {number} wait
+ * @param {boolean} immediate
+ * @return {*}
+ */
+export function debounce(func, wait, immediate) {
+  let timeout, args, context, timestamp, result
+
+  const later = function() {
+    // 据上一次触发时间间隔
+    const last = +new Date() - timestamp
+
+    // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
+    if (last < wait && last > 0) {
+      timeout = setTimeout(later, wait - last)
+    } else {
+      timeout = null
+      // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
+      if (!immediate) {
+        result = func.apply(context, args)
+        if (!timeout) context = args = null
+      }
+    }
+  }
+
+  return function(...args) {
+    context = this
+    timestamp = +new Date()
+    const callNow = immediate && !timeout
+    // 如果延时不存在,重新设定延时
+    if (!timeout) timeout = setTimeout(later, wait)
+    if (callNow) {
+      result = func.apply(context, args)
+      context = args = null
+    }
+
+    return result
+  }
+}
+
+/**
+ * This is just a simple version of deep copy
+ * Has a lot of edge cases bug
+ * If you want to use a perfect deep copy, use lodash's _.cloneDeep
+ * @param {Object} source
+ * @returns {Object}
+ */
+export function deepClone(source) {
+  if (!source && typeof source !== 'object') {
+    throw new Error('error arguments', 'deepClone')
+  }
+  const targetObj = source.constructor === Array ? [] : {}
+  Object.keys(source).forEach(keys => {
+    if (source[keys] && typeof source[keys] === 'object') {
+      targetObj[keys] = deepClone(source[keys])
+    } else {
+      targetObj[keys] = source[keys]
+    }
+  })
+  return targetObj
+}
+
+/**
+ * @param {Array} arr
+ * @returns {Array}
+ */
+export function uniqueArr(arr) {
+  return Array.from(new Set(arr))
+}
+
+/**
+ * @returns {string}
+ */
+export function createUniqueString() {
+  const timestamp = +new Date() + ''
+  const randomNum = parseInt((1 + Math.random()) * 65536) + ''
+  return (+(randomNum + timestamp)).toString(32)
+}
+
+/**
+ * Check if an element has a class
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ * @returns {boolean}
+ */
+export function hasClass(ele, cls) {
+  return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+}
+
+/**
+ * Add class to element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function addClass(ele, cls) {
+  if (!hasClass(ele, cls)) ele.className += ' ' + cls
+}
+
+/**
+ * Remove class from element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function removeClass(ele, cls) {
+  if (hasClass(ele, cls)) {
+    const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
+    ele.className = ele.className.replace(reg, ' ')
+  }
+}
+ export function distanceTime(time) {
+		//获取当前时间   
+		var date = new Date();
+		var now = date.getTime();
+	   //设置截止时间
+	   var endDate = new Date();
+	   if(time)
+	   {
+		  endDate = new Date(time);
+	   }            
+		var end = endDate.getTime();
+		//获取截止时间和当前时间的时间差
+		if(now>=end){
+			return '已过期';
+		}
+		var leftTime = end-now;
+		//定义变量 d,h,m,s分别保存天数,小时,分钟,秒
+		var d,h,m,s;
+		//判断剩余天数,时,分,秒
+		if (leftTime>=0) {
+			d = Math.floor(leftTime/1000/60/60/24);
+			h = Math.floor(leftTime/1000/60/60%24);
+			m = Math.floor(leftTime/1000/60%60);
+			s = Math.floor(leftTime/1000%60);                  
+		}
+		if(d>0){
+			return `${d}天${h}小时${m}分钟`;
+		}else {
+			if(h>0){
+				return `${h}小时${m}分钟`;
+			}else{
+				return `${m}分钟`;
+			}
+		}	
+}
+export function isEmpty(value){
+	if(value===undefined||value==="undefined"||value===""||value===null){
+		return true;
+	}
+	return false;
+}
+export function MessageTimeFormat(d) {
+  var unix_stamp = ''
+  if (!d) return
+  if (typeof (d) === 'object') {
+    unix_stamp = d.getTime()
+  } else {
+    unix_stamp = (new Date(d)).getTime()
+  }
+  var _today_obj = new Date()
+  var _today_date = {
+    y: _today_obj.getFullYear(),
+    m: (_today_obj.getMonth() + 1 < 10 ? '0' + (_today_obj.getMonth() - -1) : (_today_obj.getMonth() - -1)),
+    d: (_today_obj.getDate() < 10 ? '0' + _today_obj.getDate() : _today_obj.getDate())
+  }
+
+  var _today_stamp = Date.parse(_today_date.y + '/' + _today_date.m + '/' + _today_date.d + ' 00:00:00')
+
+  var stamp = []
+  stamp[0] = _today_stamp + 86400000
+  stamp[1] = _today_stamp
+  stamp[2] = _today_stamp - 86400000
+  stamp[3] = _today_stamp - 172800000
+
+  stamp[4] = _today_stamp - 518400000 // 7天
+
+  stamp[5] = _today_stamp - 31536000000 // 365天
+
+  var _compare_obj = new Date()
+  _compare_obj.setTime(unix_stamp)
+
+  var return_str
+
+  if (unix_stamp >= stamp[1] && unix_stamp < stamp[0]) {
+    return_str = _compare_obj.getHours() + ':' + (_compare_obj.getMinutes() < 10 ? '0' + _compare_obj
+      .getMinutes() : _compare_obj.getMinutes())
+  } else if (unix_stamp >= stamp[2] && unix_stamp < stamp[1]) {
+    var yesterdayText = '昨天'
+    return_str = yesterdayText + ' ' + _compare_obj.getHours() + ':' +
+            (_compare_obj.getMinutes() < 10 ? '0' + _compare_obj.getMinutes() : _compare_obj.getMinutes())
+  } else if (unix_stamp >= stamp[3] && unix_stamp < stamp[2]) {
+    var theDayBeforeYesterdayText = '前天'
+    return_str = theDayBeforeYesterdayText + ' ' + _compare_obj.getHours() + ':' +
+            (_compare_obj.getMinutes() < 10 ? '0' + _compare_obj.getMinutes() : _compare_obj.getMinutes())
+  } else if (unix_stamp >= stamp[4] && unix_stamp < stamp[3]) { // 7天内
+    var daynames = ['天', '一', '二', '三', '四', '五', '六']
+    var dathStr = '星期' + daynames[_compare_obj.getDay()]
+
+    var SundayText = '星期天'
+    var MondayText = '星期一'
+    var TuesdayText = '星期二'
+    var WednesdayText = '星期三'
+    var ThursdayText = '星期四'
+    var FridayText = '星期五'
+    var SaturdayText = '星期六'
+
+    var dathStr2
+
+    switch (dathStr) {
+      case '星期天':
+        dathStr2 = SundayText
+        break
+      case '星期一':
+        dathStr2 = MondayText
+        break
+      case '星期二':
+        dathStr2 = TuesdayText
+        break
+      case '星期三':
+        dathStr2 = WednesdayText
+        break
+      case '星期四':
+        dathStr2 = ThursdayText
+        break
+      case '星期五':
+        dathStr2 = FridayText
+        break
+      case '星期六':
+        dathStr2 = SaturdayText
+        break
+      default:
+        dathStr2 = dathStr
+        break
+    }
+
+    return_str = dathStr2 + ' ' + _compare_obj.getHours() + ':' +
+            (_compare_obj.getMinutes() < 10 ? '0' + _compare_obj.getMinutes() : _compare_obj.getMinutes())
+  } else if (unix_stamp >= stamp[5] && unix_stamp < stamp[4]) { // 365天内
+    var monthText = '月'
+    var dayText = '日'
+    return_str = (_compare_obj.getMonth() - (-1)) + monthText + _compare_obj.getDate() + dayText + ' ' +
+            _compare_obj.getHours() + ':' + (_compare_obj.getMinutes() < 10 ? '0' + _compare_obj.getMinutes()
+      : _compare_obj.getMinutes())
+  } else {
+    var yearText = '年'
+    const monthText = '月'
+    const dayText = '日'
+    return_str = _compare_obj.getFullYear() + yearText + (_compare_obj.getMonth() - (-1)) +
+            monthText + _compare_obj.getDate() + dayText + ' ' + _compare_obj.getHours() + ':' +
+            (_compare_obj.getMinutes() < 10 ? '0' + _compare_obj.getMinutes() : _compare_obj.getMinutes())
+  }
+  return return_str
+}

+ 64 - 0
libs/permission.js

@@ -0,0 +1,64 @@
+import store from '@/store/index.js';
+import {Router} from '@/libs/router';
+
+// 页面白名单
+const whiteList = [
+    '/pages/login/index',
+    '/pages/index/index'
+];
+/*设置白名单后台可以返回权限,然后再匹配路由地址*/
+let permission=['icon'];//权限数组示例---可以通过store登录的时候缓存
+	for(let i=0;i<permission.length;i++){
+		let permitName=permission[i];
+		let path=Router[permitName].path;
+		if(path){
+			if(!whiteList.includes(path)){
+				whiteList.push(path)
+			}
+		}
+	}
+function hasPermission (url) {
+    // 在白名单中或有token,直接跳转
+	//whiteList.indexOf(url) !== -1 //使用白名单校验页面的时候使用
+    if(store.state.access_token) {
+        return true
+    }
+    return false
+}
+ 
+uni.addInterceptor('navigateTo', {
+    // 页面跳转前进行拦截, invoke根据返回值进行判断是否继续执行跳转
+    invoke (e) {
+        if(!hasPermission(e.url)){
+            uni.reLaunch({
+                url: '/pages/login/index'
+            })
+            return false
+        }
+		return true
+    },
+    success (e) {
+        console.log(e)
+    },
+	fail(e) {
+		 console.log(e)
+	}
+}) 
+uni.addInterceptor('switchTab', {
+    // tabbar页面跳转前进行拦截
+    invoke (e) {
+        if(!hasPermission(e.url)){
+            uni.reLaunch({
+                url: '/pages/login/index'
+            })
+            return false
+        }
+		return true
+    },
+    success (e) {
+         console.log(e)
+    },
+	fail(e) {
+		 console.log(e)
+	}	
+})

+ 99 - 0
libs/request.js

@@ -0,0 +1,99 @@
+import config from "@/config/index.js"
+const baseUrl = process.env.NODE_ENV === 'development' ? config.base.dev : config.base.pro;
+import {
+	getToken
+} from '@/libs/auth.js';
+export async function request(params) {
+	return new Promise(function(resolve, reject) {
+		try {
+			uni.showLoading({
+				title: '加载中',
+				mask: true
+			});
+			uni.request({
+				...formatRequestBody(params),
+				success(response) {
+					let data = response.data;
+					let code = data.code;
+					let msg = data.msg
+					if (code === 200) {
+						resolve(data)
+					} else {
+						if (code === 401) {
+							uni.showToast({
+								title: "登录失效!",
+								mask: true,
+								icon: "none",
+								duration:3000,
+								complete() {
+									// let pages=getCurrentPages()
+									// console.log({
+									// 	page:pages[pages.length-1].$route.fullPath
+									// })
+									// let qrcode=uni.getStorageSync('qrcode')
+									// if(qrcode){uni.setStorageSync('qrcode',qrcode)}
+									uni.clearStorageSync()
+									setTimeout(()=>{
+										uni.reLaunch({
+											url: '/pages/login/index'
+										})
+									},3000)
+								}
+							})
+
+						} else {
+							reject(data)							
+							uni.showToast({
+								title: msg,
+								mask: true,
+								duration:3000,
+								icon: "none"
+							})
+						}
+					}
+				},
+				fail(res) {
+					uni.showToast({
+						title: res,
+						mask: true,
+						icon: "none"
+					})
+					reject(res)
+				},
+				complete(res) {
+					uni.hideLoading();
+				}
+			})
+		} catch (err) {
+			console.log(err)
+			reject(err)
+		}
+	})
+}
+
+function formatRequestBody(params) {
+	let url = params.url;
+	url = baseUrl + url;
+	let data = {
+		...params.data
+	};
+	let header = {
+		...params.header,
+		AppID:config.appID,
+		AppKey:config.appKey,
+		AppSecret:config.appSecret
+	};
+	if(getToken()){
+		header[config.TokenKey]=getToken();
+	}
+	let method = params.method || "get";
+	let dataType = params.dataType || "json";
+	let requestBody = {
+		url,
+		data,
+		header,
+		method,
+		dataType
+	};
+	return requestBody;
+};

+ 21 - 0
libs/router.js

@@ -0,0 +1,21 @@
+/*根路径写法*/
+export const Router={
+	"login":{
+		"path": "/pages/login/index"
+	},		
+	"index":{
+		"path": "/pages/index/index"
+	},
+	"record":{
+		"path" : "/views/record/index",	
+	},
+	"myCenter":{
+		"path" : "/pages/myCenter/index" 
+	},
+	"views-login":{
+		"path": "/views/login/index"
+	},
+	"icon":{
+		"path": "/pages/icon/index"
+	}		
+}

+ 40 - 0
libs/tool.js

@@ -0,0 +1,40 @@
+/**
+ * 隐患等级、风险等级、风险点等级、危险源等级、级别转换
+ */
+export function levelConversion(level) {
+	let levelStr;
+	if (level == 1) {
+		levelStr = '重大'
+	} else if (level == 2) {
+		levelStr = '较大'
+	} else if (level == 3) {
+		levelStr = '一般'
+	} else if (level == 4) {
+		levelStr = '低'
+	} else {
+		levelStr = '暂无'
+	}
+	return levelStr;
+}
+
+/**
+ * 构建树JS
+ * @param {Object} data
+ */
+export function toTreeText(data) {
+	var val = []
+	data.forEach(function(item) {
+		var items = {}
+		items.value = item.groupId
+		items.text = item.groupName
+		if (item.children) {
+			items.children = toTreeText(item.children)
+			val.push(items)
+		} else {
+			val.push(items)
+		}
+	})
+	return val
+}
+
+

+ 22 - 0
main.js

@@ -0,0 +1,22 @@
+import App from './App'
+
+// #ifndef VUE3
+import Vue from 'vue'
+import './uni.promisify.adaptor'
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+  ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  return {
+    app
+  }
+}
+// #endif

+ 119 - 0
manifest.json

@@ -0,0 +1,119 @@
+{
+    "name" : "六院联创",
+    "appid" : "__UNI__73F6024",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {
+            "Barcode" : {},
+            "Maps" : {},
+            "Camera" : {}
+        },
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {
+                "dSYMs" : false
+            },
+            /* SDK配置 */
+            "sdkConfigs" : {
+                "ad" : {},
+                "maps" : {}
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "unpackage/res/icons/72x72.png",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
+                    "xxhdpi" : "unpackage/res/icons/144x144.png",
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
+                },
+                "ios" : {
+                    "appstore" : "unpackage/res/icons/1024x1024.png",
+                    "ipad" : {
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
+                    },
+                    "iphone" : {
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
+                    }
+                }
+            }
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2",
+    "fallbackLocale" : "zh-Hans",
+    "locale" : "zh-Hans"
+}

+ 170 - 0
pages.json

@@ -0,0 +1,170 @@
+{
+	"pages": [
+		{
+			"path": "pages/login/index",
+			"style": {
+				"navigationBarTitleText": "登录"
+			}
+		},
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "首页",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": true
+			}
+		},
+		{
+            "path" : "pages/myCenter/myCenter",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "我的",
+				"navigationBarBackgroundColor":"#3D90F4",
+                "enablePullDownRefresh": false,
+				"navigationStyle": "custom"
+            }
+            
+        },
+		{
+			"path" : "pages/myCenter/personalData/personalData",
+			"style" :                                                                                    
+			{
+				"navigationBarTitleText": "个人资料",
+				"enablePullDownRefresh": false
+			}
+			
+		}
+		,{
+			"path" : "pages/myCenter/updatePassword/updatePassword",
+			"style" :                                                                                    
+			{
+				"navigationBarTitleText": "修改密码",
+				"enablePullDownRefresh": false
+			}
+			
+		}
+	    ,{
+            "path" : "pages/webview/webview",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": true
+            }
+            
+        }
+        ,{
+            "path" : "pages/history/history",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "信息中心",
+                "enablePullDownRefresh": true
+            }
+            
+        }
+        ,{
+            "path" : "pages/applicationCenter/applicationCenter",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "应用中心",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "pages/message/message",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "消息",
+                "enablePullDownRefresh": false,
+				"navigationStyle": "custom"
+            }
+            
+        }
+        ,{
+            "path" : "pages/index/detail/detail",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "详情",
+                "enablePullDownRefresh": true
+            }
+            
+        },
+        {
+        	"path" : "pages/index/handle/danger/index/index",
+        	"style" : 
+        	{
+        		"navigationBarTitleText" : "隐患处理",
+        		"enablePullDownRefresh" : false
+        	}
+        },
+        {
+        	"path" : "pages/index/handle/task/task",
+        	"style" : 
+        	{
+        		"navigationBarTitleText" : "任务处理",
+        		"enablePullDownRefresh" : false
+        	}
+        },
+		{
+			"path" : "pages/index/handle/task/checkList/form/form",
+			"style" : 
+			{
+				"navigationBarTitleText" : "任务检查表处理",
+				"enablePullDownRefresh" : false
+			}
+		},
+		{
+			"path" : "pages/index/handle/alert/alert",
+			"style" : 
+			{
+				"navigationBarTitleText" : "预警处理",
+				"enablePullDownRefresh" : false
+			}
+		},
+		{
+			"path" : "pages/index/handle/warning/warning",
+			"style" : 
+			{
+				"navigationBarTitleText" : "告警处理",
+				"enablePullDownRefresh" : false
+			}
+		}
+    ],
+	"tabBar": {
+		"color": "#7A7E83",
+		"selectedColor": "#1296db",
+		"borderStyle": "black",
+		"backgroundColor": "#ffffff",
+		"iconWidth": "24px",
+		"list": [{
+			"pagePath": "pages/index/index",
+			"iconPath": "static/tabbar/index.png",
+			"selectedIconPath": "static/tabbar/indexEd.png",
+			"text": "首页"
+		}, 
+		{
+			"pagePath": "pages/applicationCenter/applicationCenter",
+			"iconPath": "static/tabbar/app.png",
+			"selectedIconPath": "static/tabbar/appEd.png",
+			"text": "应用中心"
+		},
+		{
+			"pagePath": "pages/history/history",
+			"iconPath": "static/tabbar/info.png",
+			"selectedIconPath": "static/tabbar/infoEd.png",
+			"text": "信息中心"
+		}, {
+			"pagePath": "pages/myCenter/myCenter",
+			"iconPath": "static/tabbar/myCenter.png",
+			"selectedIconPath": "static/tabbar/myCenterEd.png",
+			"text": "我的"
+		}]
+	},
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "智慧创新",
+		"navigationBarBackgroundColor": "#F8F8F8",
+		"backgroundColor": "#F8F8F8"
+	},
+	"uniIdRouter": {}
+}

+ 199 - 0
pages/applicationCenter/applicationCenter.vue

@@ -0,0 +1,199 @@
+<template>
+	<view class="app-page">
+		<view class="handle-wrap">
+			<view class="title">常用操作</view>
+			<view class="tabs">
+				<view class="tab-item" v-for="(item,quickIdx) in quickList" :key="quickIdx" @click="linkTo(item)">
+					<div class="icon-box">
+						<image class="icon" :src="item.miniLogo" mode="widthFix"></image>
+					</div>
+					<view class="name">{{item.miniTitle}}</view>
+				</view>
+			</view>				
+		</view>
+		<view class="app-category" v-for="(appList,appIdx) in items" :key="appIdx">
+			<view class="title">{{appList.miniCatTitle}}</view>
+			<view class="applist">
+				<view class="app" v-for="(app,index) in appList.miniList" :key="index" @click="linkTo(app)">
+					<image class="icon" :src="app.miniLogo"></image>
+					<view class="info">
+						<view class="app-title">{{app.miniTitle}}</view>
+						<view class="tag" v-if="app.miniDesc">{{app.miniDesc}}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getAppList,getQuickList} from '@/api/system/app.js'
+	export default {
+		data() {
+			return {
+				items:[],
+				quickList:[]
+			}
+		},
+		onShow() {
+			this.getData()
+		},
+		methods: {
+			getData(){
+				getAppList().then((res)=>{
+					this.items=res.data
+				})
+				getQuickList().then((res)=>{
+					this.quickList=res.data
+				})				
+			},
+			linkToTab(id,name){
+				let href=""
+				if(id===1){href="http://h5.xazhyc.com/danger/index.html"}
+				if(id===2){href="http://h5.xazhyc.com/task/index.html"}
+				if(id===3){href="http://h5.xazhyc.com/checkRecord/index.html"}
+				if(id===4){href="http://h5.xazhyc.com/problem_feedback/problem_feedback.html"}
+				uni.navigateTo({
+					url:`/pages/webview/webview?href=${href}&name=${name}`
+				})	
+			},
+			linkTo(app){
+				if(app.miniUrl===""||app.miniUrl==undefined||app.miniUrl===null){
+					uni.showToast({
+						icon:"none",
+						title:"请联系管理员开放应用地址"
+					})
+					return
+				}
+				if(app.miniUrl.includes('http')){
+					uni.navigateTo({
+						url:`/pages/webview/webview?href=${app.miniUrl}&name=${app.miniTitle}`
+					})					
+				}else{
+					uni.showToast({
+						icon:"none",
+						title:"请联系管理员配置应用地址"
+					})					
+				}
+
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.app-page{
+	padding: 32rpx;
+	background-color: rgba(243, 244, 247, 1);
+	box-sizing: border-box;
+	min-height: 100vh;
+	.handle-wrap{
+		background: linear-gradient(159.65deg, #FFF8E8 11.95%, #FFFFFF 20.49%, #FFFFFF 86.47%),
+		linear-gradient(0deg, #FFFFFF, #FFFFFF);
+		border-radius: 12rpx;
+		padding: 32rpx 0;
+		.title{
+			color: #000;
+			font-size: 32rpx;	
+			padding-left:24rpx;
+		}
+		.tabs{
+			display: flex;
+			justify-content: space-around;
+			align-items: center;
+			padding:0 32rpx;
+			margin-top: 32rpx;
+			.tab-item{
+				width: 112rpx;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				flex-direction: column;
+				.icon-box{
+					width: 96rpx;
+					height: 96rpx;
+					border-radius: 26rpx;
+					background-color: #2a60f3;
+					.icon{
+						width: 96rpx;
+						height: 96rpx;
+					}					
+				}
+
+				.name{
+					width: 100%;
+					padding-top: 12rpx;
+					color: rgba(0, 0, 0, 0.9);
+					font-size: 28rpx;
+					overflow: hidden;
+					text-overflow: ellipsis;
+					white-space: nowrap;
+					word-break: break-all;
+				}
+			}
+		}
+	}	
+	.app-category{
+		.title{
+			color: #000;
+			font-size: 32rpx;
+			line-height: 1;
+			padding: 48rpx 24rpx 32rpx 24rpx;
+		}
+		.applist{
+			display: flex;
+			flex-wrap: wrap;
+			.app{
+				width: 330rpx;
+				height: 160rpx;
+				background-color: #fff;
+				border-radius: 16rpx;
+				margin-bottom: 20rpx;
+				display: flex;
+				padding: 32rpx 0 0 28rpx;
+				box-sizing: border-box;
+				&:nth-child(2n){
+					margin-left: 18rpx;
+				}
+				.icon{
+					width: 66rpx;
+					height: 66rpx;
+					border-radius: 50%;
+					background-color:rgba(151, 179, 255, 1);
+					img{
+						border: 1px solid red;
+					}
+				}
+				.info{
+					padding-left: 20rpx;
+					padding-top: 4rpx;
+					.app-title{
+						width: 200rpx;
+						color: rgba(34, 34, 34, 1);
+						font-size: 32rpx;
+						overflow: hidden;
+						text-overflow: ellipsis;
+						white-space: nowrap;
+					}
+					.tag{
+						max-width: 202rpx;
+						height: 48rpx;
+						display:inline-block;
+						margin-top: 6rpx;
+						color: rgba(255, 171, 8, 1);
+						font-size:24rpx;
+						background: rgba(255, 171, 8, 0.1);
+						border-radius: 12rpx;
+						padding: 4rpx 10rpx;
+						box-sizing: border-box;
+						text-overflow: ellipsis;
+						overflow: hidden;
+						white-space: nowrap;
+					}
+				}
+			}
+		}
+	}
+}
+
+</style>

+ 209 - 0
pages/history/history.vue

@@ -0,0 +1,209 @@
+<template>
+	<view class="art-wrap">
+		<view class="tabs">
+			<view class="tab"  v-for="(tab,index) in tabs" :key="index" @click="changeTab(tab)" :class="tab.artCatId===artCatId?'active':''">{{tab.artCatTitle}}</view>
+		</view>
+		<view class="tab-container">
+		  <view class="item" v-for="(item,idx) in artList" :key="idx">
+			<view class="content card" @click="showDetail(item)">
+			  <view class="top"> 
+				<view class="lf">
+				  <view class="tag">{{item.artCatTitle}}</view>
+				  <view class="author" v-if="item.editorName">{{item.editorName}}</view>
+				</view>
+				<view class="rt"><span>{{MessageTimeFormat(item.issuedAt)}}</span></view>
+			  </view>
+			  <view class="info">
+				<view class="title" v-if="item.artTitle">{{item.artTitle}}</view>
+				<view class="footer">
+				  <view class="author">{{item.artAuthor?item.artAuthor:'未知'}}</view>
+				  <view class="time">{{item.issuedAt}}</view>
+				</view>
+			  </view>
+			</view>
+		  </view>
+		</view>
+	</view>
+</template>
+<script>
+	import {getToken}  from '@/libs/auth.js';
+	import {MessageTimeFormat} from '@/libs/index.js';
+	import {getArtCatTop,getArtByPage} from '@/api/system/art.js'
+	export default {
+		data() {
+			return {
+				artCatId:"",
+				tabs:[],
+				artList:[],
+				conditions: {
+					page: 1,
+					limit: 10
+				},
+				total:0
+			}
+		},
+		onShow() {
+			this.conditions={
+				page: 1,
+				limit: 10					
+			}
+			this.artList=[]
+			this.getArtCatTop()
+		},
+		methods:{
+			MessageTimeFormat,
+			changeTab(item){
+				this.artCatId=item.artCatId
+				this.conditions={
+					page: 1,
+					limit: 10					
+				}
+			    this.artList=[]				
+				this.getArtByPage()
+			},
+			getArtCatTop(){
+				getArtCatTop().then((res)=>{
+					this.tabs=res.data
+					if(res.data.length>0){
+						this.artCatId=res.data[0].artCatId	
+						this.getArtByPage()
+					}
+				})				
+			},
+			getArtByPage(){
+				let items=JSON.parse(JSON.stringify(this.artList))
+				getArtByPage({
+				  ...this.conditions,
+				  artCatId:this.artCatId
+				}).then((res)=>{
+					this.artList=items.concat(res.data)
+					this.total=res.total
+				})  				
+			},
+			showDetail(){
+				let baseUrl="http://h5.xazhyc.com"
+				uni.navigateTo({
+					url:`/pages/webview/webview?href=${baseUrl}/art/views/detail.html&artId=473700&name=通讯录`
+				})		
+			}
+		},
+		onReachBottom() {			
+			if(this.total>=this.conditions.page*this.conditions.limit){
+				this.conditions.page++
+				this.getArtByPage()
+			}
+		},
+		onPullDownRefresh() {
+			this.conditions={
+				page: 1,
+				limit: 10					
+			}
+			this.artList=[]			
+			this.getArtCatTop()
+			uni.stopPullDownRefresh()
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.art-wrap{
+		padding: 24rpx;
+	    background-color: #f2f2f2;
+		.tabs{
+			overflow-x: auto;
+			overflow-y: hidden;
+			display: flex;
+			background-color: #fff;	
+			border-radius: 16rpx;
+			.tab{
+				height: 88rpx;
+				line-height: 88rpx;
+				display: inline-block;
+				padding: 0 32rpx;
+				flex: 1 0 auto;
+				font-size: 28rpx;
+				color: #35364F;
+				position: relative;
+				text-align: center;
+				&::after{
+					display: block;
+					width: 50%;
+					border-bottom: 2px solid transparent;
+					position: absolute;
+					bottom: 0;
+					left: 50%;
+					transform: translateX(-50%);
+					content: "";
+				}
+				&.active{
+					font-size: 34rpx;
+					font-weight: 700;
+					&::after{
+						border-bottom: 2px solid #15CD85;					
+					}
+				}
+			}
+		}
+	  .tab-container{
+		background-color: #f2f2f2;
+		.item{
+		  margin-top: 20rpx;
+		  .card{
+			background: #FFFFFF;
+			border-radius: 10rpx;  
+			padding: 24rpx;
+			.top{
+			  display: flex;
+			  justify-content: space-between;
+			  align-items: center;
+			  padding-bottom: 20rpx;
+			  .lf{
+				flex: 1;
+				display: flex;
+				align-items: center;
+				.tag{
+				  font-size: 20rpx;
+				  display: inline-block;
+				  padding:4rpx 6rpx;
+				  border: 1px solid #15CD85;
+				  line-height: 1;
+				  color: #15CD85;
+				  border-radius: 4rpx;
+				} 
+				.author{
+				  display: inline-block;
+				  padding-left: 5px;
+				  line-height: 1;
+				  color: #666;
+				}
+			  }
+			}
+			.info{
+			  font-size: 24rpx;
+			  font-weight: 500;
+			  color: #B0B0B0;
+			  line-height:1;  
+			  padding-top: 0.22rem;  
+			  .title{
+				  font-size:32rpx;
+				  font-family: PingFang SC;
+				  font-weight: bold;
+				  color: #000000;
+				  line-height:48rpx;
+				  text-overflow: ellipsis;
+				  overflow: hidden;
+				  -webkit-line-clamp: 2;
+				  display: -webkit-box;
+				  -webkit-box-orient: vertical;
+			  }
+			  .footer{
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding-top: 10rpx;
+			  }
+			}				
+		  }
+		}
+	  }			
+    }
+</style>

+ 423 - 0
pages/index/detail/detail.vue

@@ -0,0 +1,423 @@
+<template>
+	
+	<view class="index-detail-page">
+		<view class="container">
+			<view class="tab-cont">
+				<view class="part" v-if="type==='task'">
+					<view class="tab">
+						<view class="tab-item" :class="activeTab===1?'active':''" @click="tabChange(0,1)">待处理</view>
+						<view class="tab-item" :class="activeTab===2?'active':''" @click="tabChange(1,2)">已完成</view>
+						<view class="tab-item" :class="activeTab===3?'active':''" @click="tabChange(-1,3)">已撤销</view>
+					</view>
+					<view class="part-cont">
+						<view class="item" v-for="item in items" :key="item.taskId" @click="handle('task',item)">
+							<view class="title">
+								<view class="name">{{item.taskTitle}}</view>
+								<view class="state">{{taskStatus(item.status)}}</view>
+							</view>
+							<view class="tags">
+								<text class="tag">{{taskPriority(item.taskPriority)}}</text>
+								<text class="tag">{{item.taskCatTitle}}</text>
+								<text class="tag">{{taskType(item.taskTypeId)}}</text>
+							</view>
+							<view class="time">
+								预期结束时间:{{item.expectedEndTime}}
+							</view>
+							<view class="bottom">
+								<view class="user">
+									<image class="avatar" src="/static/index/user.png" mode="widthFix"></image>
+									处理人:{{item.handleAccountName}}
+								</view>		
+								<view class="hand-time">
+									{{item.launchTime}}
+								</view>																
+							</view>
+						</view>
+					</view>
+				</view>
+				<view class="part" v-if="type==='warn'">
+					<view class="tab">
+						<view class="tab-item" :class="activeTab===1?'active':''" @click="tabChange(0,1)">待处理</view>
+						<view class="tab-item" :class="activeTab===2?'active':''" @click="tabChange(1,2)">已处理</view>
+						<view class="tab-item" :class="activeTab===3?'active':''" @click="tabChange(-1,3)">已撤销</view>
+					</view>
+					<view class="part-cont">
+						<view class="item" v-for="item in items" :key="item.warnId" @click="handle('warn',item)">
+							<view class="title">
+								<view class="name">{{item.warnTitle}}</view>
+								<view class="state">{{warningStatus(item.status)}}</view>
+							</view>
+							<view class="tags">
+								<text class="tag">{{alertLevel(item.warnLevel)}}</text>
+							</view>
+							<view class="time">
+								发生时间:{{item.warnTime}}
+							</view>
+							<view class="bottom" v-if="item.handleAccountName">
+								<view class="user">
+									<image class="avatar" src="/static/index/user.png" mode="widthFix"></image>
+									处理人:{{item.handleAccountName}}
+								</view>		
+								<view class="hand-time">
+									{{item.handleTime}}
+								</view>																
+							</view>
+						</view>
+					</view>
+				</view>
+				<view class="part" v-if="type==='alert'">
+					<view class="tab">
+						<view class="tab-item" :class="activeTab===1?'active':''" @click="tabChange(0,1)">活动</view>
+						<view class="tab-item" :class="activeTab===2?'active':''" @click="tabChange(1,2)">已解除</view>
+						<view class="tab-item" :class="activeTab===3?'active':''" @click="tabChange(-1,3)">已撤销</view>
+					</view>
+					<view class="part-cont">
+						<view class="item" v-for="item in items" :key="item.alertId">
+							<view class="title">
+								<view class="name">{{item.alertTitle}}</view>
+								<view class="state">{{alertStatus(item.status)}}</view>
+							</view>
+							<view class="tags">
+								<text class="tag">{{alertLevel(item.alertLevel)}}</text>
+							</view>
+							<view class="time">
+								发生时间:{{item.alertTime}}
+							</view>
+							<view class="bottom" v-if="item.clearTime">		
+								<view class="hand-time">
+									解除时间:{{item.clearTime}}
+								</view>																
+							</view>
+							<view class="bottom" v-if="item.alertContent">
+								<view class="alertContent">
+									内容:{{item.alertContent}}
+								</view>																
+							</view>
+						</view>
+					</view>
+				</view>
+				<view class="part" v-if="type==='danger'">
+					<view class="tab">
+						<view class="tab-item" :class="activeTab===1?'active':''" @click="tabChange(0,1)">待处理</view>
+						<view class="tab-item" :class="activeTab===2?'active':''" @click="tabChange(1,2)">我提交</view>
+						<view class="tab-item" :class="activeTab===3?'active':''" @click="tabChange(2,3)">我处理</view>
+						<view class="tab-item" :class="activeTab===4?'active':''" @click="tabChange(-1,4)">我撤销</view>
+					</view>
+					<view class="part-cont">
+						<view class="item" v-for="item in items" :key="item.dangerId" @click="handle('danger',item)">
+							<view class="title">
+								<view class="name">{{item.dangerTitle}}</view>
+								<view class="state">{{dangerStatus(item.status)}}</view>
+							</view>
+							<view class="tags">
+								<text class="tag">{{dangerLevel(item.dangerLevel)}}</text>
+								<text class="tag">{{item.dangerCatTitle}}</text>
+							</view>
+							<view class="time">
+								预期结束时间:{{item.dangerDeadLine}}
+							</view>
+							<view class="bottom">
+								<view class="user">
+									<image class="avatar" src="/static/index/user.png" mode="widthFix"></image>
+									处理人:{{item.curAccountName}}
+								</view>		
+								<view class="hand-time">
+									{{item.submitTime}}
+								</view>																
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>										
+		</view>
+		<template v-if="total<1">
+			<view class="isEmpty" >
+				<p class="word">没有数据 ^_^ </p>
+			</view>
+		</template>
+	</view>
+</template>
+
+<script>
+	import { getAlertByPage } from '@/api/aqpt/alertApi.js';
+	import { getDangerByPage } from '@/api/aqpt/dangerApi.js';
+	import { getTaskByPage } from '@/api/aqpt/taskApi.js';
+	import { getWarningByPage } from '@/api/aqpt/warning.js';	
+	import { handleCheckTask } from '@/api/aqpt/checkTaskApi'
+	import{
+		taskStatus,taskPriority,taskType,
+		alertLevel,alertStatus,
+		dangerStatus,dangerLevel,
+		warningLevel,warningStatus
+	} from '@/libs/enum.js';	
+	export default {
+		data() {
+			return {
+				type:undefined,
+				activeTab:1,
+				user:{},
+			    conditions: {
+					page: 1,
+					limit: 10,
+					status:0
+			    },
+				total:0,
+				items:[]		
+			}
+		},
+		onLoad({type,name}) {
+			this.type=type
+			let user=uni.getStorageSync('accountInfo');
+			this.user=user
+			uni.setNavigationBarTitle({
+				title:`${name||'详情'}`
+			})
+			this.tabChange(0,1)
+		},
+		methods: {
+			taskStatus,taskPriority,taskType,
+			alertLevel,alertStatus,
+			dangerStatus,dangerLevel,
+			warningLevel,warningStatus,
+			getData(){
+				if(this.type==='task'){
+					this.getTaskByPage()
+				}
+				if(this.type==='danger'){
+					delete this.conditions.status
+					this.getDangerByPage()
+				}				
+				if(this.type==='alert'){
+					this.getAlertByPage()
+				}
+				if(this.type==='warn'){
+					this.getWarningByPage()
+				}
+				
+			},
+			getWarningByPage(){
+				let items=JSON.parse(JSON.stringify(this.items))
+				getWarningByPage(this.conditions).then((res)=>{
+					this.items=items.concat(res.data)
+					this.total=res.total
+				})				
+			},
+			getAlertByPage(){
+				let items=JSON.parse(JSON.stringify(this.items))
+				getAlertByPage(this.conditions).then((res)=>{
+					this.items=items.concat(res.data)
+					this.total=res.total
+				})				
+			},
+			getDangerByPage(){
+				let items=JSON.parse(JSON.stringify(this.items))
+				getDangerByPage(this.conditions).then((res)=>{
+					this.items=items.concat(res.data)
+					this.total=res.total
+				})				
+			},
+			getTaskByPage(){
+				let items=JSON.parse(JSON.stringify(this.items))
+				getTaskByPage(this.conditions).then((res)=>{
+					this.items=items.concat(res.data)
+					this.total=res.total
+				})				
+			},
+			tabChange(value,index){
+				this.activeTab=index
+				this.total=0,
+				this.items=[]
+				this.conditions= {page: 1,limit: 10}
+				if(this.type==='task'||this.type==='alert'||this.type==='warn'){
+					this.conditions.status=value
+				}
+				if(this.type==='danger'){
+					  if (index === 1) {
+						this.conditions.curAccountId = this.user.userId
+					  } else if (index === 2) {
+						this.conditions.submitAccountId = this.user.userId
+					  } else if (index === 3) {
+						this.conditions.handleAccountId = this.user.userId
+					  } else if (index === 4) {
+						this.conditions.submitAccountId = this.user.userId
+						this.conditions.status = -1
+					  }
+				}					
+				this.getData()
+			},
+			handle(type,item){			
+				let url=""
+				if(type==='danger'){
+					if(item.curAccountId!==this.user.userId) return;
+					url=`/pages/index/handle/danger/index/index?type=${type}&id=${item.dangerId}`
+				}
+				if(type==='task'){this.handTask(item);return};
+				if(type==='warn'){	
+					if(this.conditions.status!==0) return;
+					if(item.handleAccountId!==this.user.userId) return;
+					url=`/pages/index/handle/warning/warning?id=${item.warnId}`
+				}				
+				uni.navigateTo({
+					url
+				})				
+			},
+			handTask(item){
+				if(item.handleAccountId!==this.user.userId) return;
+				if(this.conditions.status!==0) return;				
+				handleCheckTask(item.taskId).then((res)=>{
+					const { checklistId, checklistTypeId } = res.data //recordId-taskId
+					// if (checklistTypeId === 1) {// HazardRecordView											  
+					// } else if (checklistTypeId === 2) {// PointRecordView											  
+					// } else if (checklistTypeId === 3) {// ScoreRecordView											  
+					// }
+					uni.navigateTo({
+						url:`/pages/index/handle/task/task?rid=${item.taskId}&cid=${checklistId}`
+					})	
+				})
+			
+			},
+			onPullDownRefresh() {					
+				this.tabChange(this.conditions.status||0,this.activeTab)
+				uni.stopPullDownRefresh()
+			},
+			onReachBottom() {
+				if(this.total>=this.conditions.page*this.conditions.limit){
+					this.conditions.page++
+					this.getData()
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.index-detail-page {
+		min-height: 100vh;
+		padding-bottom: 100rpx;
+		background-color: rgba(245, 246, 248, 1);
+		.container{	
+			padding: 0 32rpx;
+			.tab-cont{				
+				.part{
+					.tab{
+						display: flex;
+						align-items: center;
+						padding-bottom: 10rpx;
+						overflow-x: auto;
+						.tab-item{
+							display: inline-block;
+							padding: 16rpx 20rpx;
+							background-color: #fff;
+							text-align: center;      
+							flex-shrink: 0;
+							line-height: 1;
+							font-size: 32rpx;
+							color: #333;
+							border: 1px solid #eaeaea;
+							box-sizing: border-box;
+							border-left: 0;
+							&.active{
+								background-color: #1e80ff;
+								color: #fff;
+								border-color: #1e80ff;
+							}
+						}
+					}
+					.part-cont{
+						.item{
+							background-color: #fff;
+							border-radius: 12rpx;
+							margin-top: 16rpx;
+							padding: 24rpx 20rpx;
+							.title{
+								display: flex;
+								justify-content: space-between;
+								align-items: center;
+								.name{
+									font-size: 36rpx;
+									color: rgba(0, 0, 0, 0.8);
+								}
+								.state{
+									font-size: 32rpx;
+									color: rgba(250, 139, 55, 1);
+								}
+							}
+							.tags{
+								padding-top: 24rpx;
+								.tag{
+									background: rgba(245, 246, 248, 1);	
+									font-size: 20rpx;
+									margin-left: 10rpx;
+									padding: 10rpx 20rpx;
+									&:nth-child(1){
+										color: rgba(234, 130, 89, 1);
+										background: rgba(251, 241, 237, 1);
+									}
+								}
+							}
+							.time{
+								padding-top: 20rpx;
+								font-size: 28rpx;									
+								color:rgba(241, 57, 57, 0.8);
+							}
+							.bottom{
+								display: flex;
+								justify-content: space-between;
+								align-items: center;
+								padding-top: 20rpx;
+								.user{
+									display: flex;
+									align-items: center;
+									font-size: 24rpx;
+									color: rgba(0, 0, 0, 1);
+									.avatar{
+										width: 44rpx;
+										margin-right: 10rpx;
+									}
+								}
+								.hand-time{
+									font-size: 24rpx;
+									color: rgba(0, 0, 0, 1);
+								}
+							}
+							.alertContent{
+								font-size: 26rpx;
+								color: #666;
+								line-height: 1.5;
+								text-overflow: ellipsis;
+								overflow: hidden;
+								word-break: break-all;
+								display: -webkit-box;
+								-webkit-box-orient: vertical;
+								-webkit-line-clamp: 2;
+							}
+						}
+					}
+				}
+			}
+		}
+		.isEmpty{
+			width: 100%;
+			height: 100vh;
+			background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNzkgODYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjM4Ljg1JSIgeTE9IjAlIiB4Mj0iNjEuMTUlIiB5Mj0iMTAwJSI+PHN0b3Agc3RvcC1jb2xvcj0iI0ZDRkNGRCIgb2Zmc2V0PSIwJSIvPjxzdG9wIHN0b3AtY29sb3I9IiNFRUVGRjMiIG9mZnNldD0iMTAwJSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMCUiIHkxPSI5LjUlIiB5Mj0iOTAuNSUiPjxzdG9wIHN0b3AtY29sb3I9IiNGQ0ZDRkQiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjRTlFQkVGIiBvZmZzZXQ9IjEwMCUiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJjIiBkPSJNMCAwaDE3djM2SDB6Ii8+PC9kZWZzPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PHBhdGggZD0iTTM5LjUgODZDNjEuMzE1IDg2IDc5IDgzLjkxIDc5IDgxLjMzM1M1Ny4zMTUgNzggMzUuNSA3OCAwIDc4Ljc1NiAwIDgxLjMzM0MwIDgzLjkxMSAxNy42ODUgODYgMzkuNSA4NnoiIGZpbGw9IiNGN0Y4RkMiLz48cGF0aCBmaWxsPSIjRTVFN0U5IiBkPSJNMTMgNDVoNDBMNDIgNThIMnpNNjUuNTUxIDI5Ljk4bC0xNi4zMTMtNy42MDctMi44NDEtNS43MzggMTYuMzEzIDcuNjA3eiIvPjxwYXRoIGZpbGw9IiNFREVFRjIiIGQ9Ik02NS41NTEgMjkuOThsLTM0LjQ0LTE2LjA1OS0xNS4yMTQgMzIuNjI3IDM0LjQ0IDE2LjA2eiIvPjxwYXRoIGZpbGw9InVybCgjYSkiIHRyYW5zZm9ybT0icm90YXRlKDI1IDI3LjQ0NiAtNDMuNDE2KSIgZD0iTTM4IDdoMTd2MzZIMzh6Ii8+PHBhdGggZmlsbD0iI0Y4RjlGQiIgZD0iTTE1LjcwNSA2LjczN2wxNS40MDcgNy4xODQgMTUuNjQ2LS40MjctMTUuNDA3LTcuMTg1eiIvPjxwYXRoIGZpbGw9InVybCgjYikiIGQ9Ik0xMyA0NWg0MHYzNkgxM3oiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MyA0NSkiPjxtYXNrIGlkPSJkIiBmaWxsPSIjZmZmIj48dXNlIHhsaW5rOmhyZWY9IiNjIi8+PC9tYXNrPjx1c2UgZmlsbD0iI0UwRTNFOSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTcgMCkiIHhsaW5rOmhyZWY9IiNjIi8+PHBhdGggZmlsbD0iI0Q1RDdERSIgbWFzaz0idXJsKCNkKSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjQgMCkiIGQ9Ik03IDBoMTdsLTQgMTgtMjAtMnoiLz48L2c+PHBhdGggZmlsbD0iI0Y4RjlGQiIgZD0iTTcwIDQ1SDUzbDkgMTNoMTd6Ii8+PC9nPjwvc3ZnPg==);
+			background-size: contain;
+			background-repeat: no-repeat;
+			position: relative;
+			background-color: #fff;
+			/* #ifndef MP-WEIXIN */
+				height: calc( 100vh - 100px);	
+			/* #endif */
+			.word{
+				width: 100%;
+				text-align: center;
+				position: absolute;
+				top: 80vh;
+				left: 0;
+				color: #999;
+				font-size: 28rpx;
+				letter-spacing: 2rpx;
+			}
+		}		
+	}
+
+</style>

+ 22 - 0
pages/index/handle/alert/alert.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 326 - 0
pages/index/handle/danger/index/index.vue

@@ -0,0 +1,326 @@
+<template>
+	<view class="danger-form">
+		<uni-collapse>
+			<uni-collapse-item :title="baseInfo.dangerTitle">
+				<view class="content">
+					<uni-list-item title="隐患编码" :rightText="baseInfo.dangerCode" ></uni-list-item>					
+					<uni-list-item title="隐患状态" :rightText="dangerStatus(baseInfo.status)" ></uni-list-item>
+					<uni-list-item title="隐患类别" :rightText="baseInfo.dangerCatTitle" ></uni-list-item>
+					<uni-list-item title="隐患等级" :rightText="baseInfo.dangerLevel===1?'一般':'重大'" ></uni-list-item>
+					<uni-list-item title="所在位置" :rightText="baseInfo.dangerLocation" v-if="baseInfo.dangerLocation"></uni-list-item>
+					<uni-list-item title="描述" :rightText="baseInfo.dangerDesc" ></uni-list-item>
+					<uni-list-item title="所在部门" :rightText="baseInfo.curGroupName" v-if="baseInfo.curGroupName"></uni-list-item>
+					<uni-list-item title="整改人员" :rightText="baseInfo.curAccountName"  v-if="baseInfo.curAccountName"></uni-list-item>
+<!-- 					<uni-list-item title="所在部门" :rightText="baseInfo.submitGroupName" v-if="baseInfo.submitGroupName"></uni-list-item>
+					<uni-list-item title="整改人员" :rightText="baseInfo.submitAccountName"  v-if="baseInfo.submitAccountName"></uni-list-item>
+					<uni-list-item title="所在部门" :rightText="baseInfo.rectifyGroupName" v-if="baseInfo.rectifyGroupName"></uni-list-item>
+					<uni-list-item title="整改人员" :rightText="baseInfo.rectifyAccountName"  v-if="baseInfo.rectifyAccountName"></uni-list-item> -->
+					<uni-list-item title="整改措施" :rightText="baseInfo.rectifyMeasure" v-if="baseInfo.rectifyMeasure"></uni-list-item>
+					<uni-list-item title="整改说明" :rightText="baseInfo.rectifyRemark" v-if="baseInfo.rectifyRemark"></uni-list-item>
+				</view>
+				<uni-section title="附件" type="line">
+					<div class="attach-wrap">
+						<image @click="showImage(attachindex)" class="attach" :src="attach.fileUrl" v-for="(attach,attachindex) in baseInfo.attachList" :key="attachindex"></image>						
+					</div>
+				</uni-section>
+			</uni-collapse-item>
+		</uni-collapse>
+		<div class="form-container">
+			<uni-forms ref="form" :modelValue="formData" :rules="rules" :label-width="300" label-position="top">
+				<uni-forms-item label="处理动作" name="actionDefId" required v-if="actionDefList&&actionDefList.length>0">
+					<div class="uni-data-checkbox-wrap">
+						 <view class="action" v-for="(action,index) in actionDefList" :key="index" 
+							  :class="formData.actionDefId===action.value?'active':''"
+							  @click="changeAction(action)">
+						 	<text>{{action.text}}</text>
+						 </view>
+					</div>
+				</uni-forms-item>
+				<uni-forms-item label="描述建议" name="dangerDesc">
+				  <uni-easyinput v-model="formData.dangerDesc" type="textarea" :maxlength="-1" autoHeight placeholder="描述" />
+				</uni-forms-item>
+				<uni-forms-item label="执行人" name="accountId" required>
+				  <uni-data-select v-model="formData.accountId" :localdata="userList"></uni-data-select>
+				</uni-forms-item>	
+			</uni-forms>
+			<uni-section title="上传附件" type="line">
+				<view class="example-body">
+					<uni-file-picker  v-model="formData.attachList" 
+					 fileMediatype="image" 
+					 title="请上传附件"
+					 limit="1"
+					 @select="uploadSuccess"
+					 @delete="deleteFile"></uni-file-picker>
+				</view>
+			</uni-section>
+		</div>
+		<view class="button-container" @click="onSubmit" v-if="flowData.activityInsTitle">
+			<text>{{flowData.activityInsTitle}}</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getDangerById} from '@/api/aqpt/dangerApi.js'
+	import {getWorkflowById,handleWorkflow} from '@/api/system/wfApi.js'
+	import {getUserList,} from '@/api/system/user.js'
+	import { handleDanger } from '@/api/system/dangerApi.js'
+	import {upload} from '@/api/system/upload.js'
+	export default {
+		data() {
+			return {
+				dangerId:undefined,
+				baseInfo:{
+					
+				},
+				actionDefList:[],
+				userList:[],
+				flowData:{},
+				formData:{
+					dangerDesc:"",
+					accountId:"",
+					actionDefId:"",
+					attachList:[]
+				},
+				rules:{
+					
+				}
+			}
+		},
+		onLoad(options) {
+			this.init(options.id)
+		},
+		methods: {
+			dangerStatus(i) {
+			  if (i >= 0) {
+			    const strs = ['提交','评审','整改','验收','已完成']
+			    return strs[i]
+			  } else {
+			    return '已撤销'
+			  }
+			},
+			init(dangerId){
+				this.dangerId=dangerId
+				getDangerById(dangerId).then((res)=>{
+					this.baseInfo=res.data
+				})
+				this.getUserList()
+				this.get(dangerId)
+			},
+			// 获取流程
+			get(wfInsId) {
+				getWorkflowById(wfInsId).then((resp) => {
+				  const { data } = resp
+				  this.flowData = data
+				  this.formData.wfDefId = data.wfDefId
+				  this.formData.wfInsId = data.wfInsId
+				  this.formData.activityDefId = data.activityDefId
+				  this.formData.activityInsId = data.activityInsId
+				  this.formData.activityCode = data.activityCode
+				  this.formData.actionInsId = data.actionInsId
+				  if(data.wfInsTitle){
+					  uni.setNavigationBarTitle({
+						  title:`${data.activityInsTitle}流程`
+					  })
+				  }
+				  this.actionDefList=this.flowData.actionDefList.map(item=>{
+					  return{
+						  ...item,
+						  text:item.actionTitle,
+						  value:item.actionDefId
+					  }
+				  })
+				  if(this.actionDefList.length>0){
+					  this.formData.actionDefId=this.actionDefList[0].actionDefId
+				  }				  
+				}).catch(()=>{
+					uni.showToast({
+						icon:"none",
+						title:"流程初始化失败"
+					})
+				})
+			},	
+			getUserList(){
+				getUserList().then((res)=>{
+					var userList=[]
+					for (var i = 0; i < res.data.length; i++) {
+						userList.push({
+								value: -i, 
+								text: res.data[i].name,
+								disable:true
+						})
+						for(let j = 0; j < res.data[i].children.length; j++){
+							userList.push({
+								...res.data[i].children[j],
+								value: res.data[i].children[j].accountId, 
+								text: res.data[i].children[j].accountName
+							})							
+						}
+					}
+					this.userList=userList
+				})
+			},
+			showImage(index){
+				uni.previewImage({
+					urls:this.baseInfo.attachList.map(item=>item.fileUrl),
+					current:index
+				})
+			},
+			onSubmit(){
+				let dangerId=this.dangerId
+				let action=this.actionDefList.filter(item=>item.actionDefId===this.formData.actionDefId)[0]
+				let user=this.userList.filter(item=>this.formData.accountId===item.accountId)[0]
+				let activityCode=this.formData.activityCode
+				let res={
+					...this.flowData,
+					"formCode": activityCode,
+					"dangerId": dangerId,
+					[activityCode+"Remark"]: this.formData.dangerDesc
+				}
+				let workflowForm={				
+					"wfDefId": 1,
+					"wfInsId": dangerId,
+					"activityDefId": this.formData.activityDefId,
+					"activityInsId": this.formData.activityInsId,
+					"activityCode": activityCode,
+					"actionId": 1,
+					"actionCode": action.actionCode,
+					"actionInsId": this.formData.actionInsId,
+					"actionDefId": action.actionDefId,					
+					"actionRemark": this.formData.dangerDesc,
+					"groupIdTo": user.groupId,
+					"positionIdTo": user.positionId,
+					"accountIdTo": user.accountId,
+					"accountNameTo": user.accountName,
+					"groupNameTo": user.groupName,
+					"positionNameTo": user.positionName
+				}
+				this.handleSubmit({res,workflowForm})
+			},
+			async handleSubmit({res,workflowForm}) {
+				let attachList=[]
+				for(let i=0;i<this.formData.attachList.length;i++){
+					let filePath=this.formData.attachList[i].url
+					let fileresq=await upload({filePath})
+					fileresq=JSON.parse(fileresq)
+					attachList.push(fileresq.data)
+				}
+				let {data}=await handleWorkflow({...workflowForm,attachList}).catch(()=>{uni.showToast({icon:'none',title:"提交失败!"})})
+				let status=this.getStatusByActivityCode(data.activityCode,data.status)
+				let resq=await handleDanger({...res,attachList,status}).catch(()=>{uni.showToast({icon:'none',title:"提交失败!"})})
+				uni.showToast({
+					icon:'none',
+					title:"提交成功!",
+					complete() {
+						uni.navigateBack()
+					}
+				})
+			},	
+			getStatusByActivityCode(activityCode, wfStatus) {
+			  let iRet = 0
+			  if (wfStatus === 0) {
+				if (activityCode === 'submit') {
+				  iRet = 0
+				} else if (activityCode === 'review') {
+				  iRet = 1
+				} else if (activityCode === 'rectify') {
+				  iRet = 2
+				} else if (activityCode === 'accept') {
+				  iRet = 3
+				}
+			  } else if (wfStatus === 1) {
+				iRet = 4
+			  } else {
+				iRet = -1
+			  }
+			  return iRet
+			},
+			changeAction(item){
+				this.formData.actionDefId=item.value
+			},
+			uploadSuccess(e){
+				let attachList=JSON.parse(JSON.stringify(this.formData.attachList))
+				attachList.push(e.tempFiles[0])
+				this.formData.attachList=attachList
+			},
+			deleteFile(e){							
+				let attachList=JSON.parse(JSON.stringify(this.formData.attachList))
+				attachList.filter(item=>item.uuid!==e.tempFile.uuid)
+				this.formData.attachList=attachList
+			},			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.danger-form{
+		padding: 20rpx 20rpx 160rpx 20rpx;
+		margin-bottom: 120rpx;
+		 .attach-wrap{
+			display: flex;
+			flex-wrap: wrap;
+			.attach{
+				display: block;
+				width: 100rpx;
+				height: 100rpx;
+				margin: 10rpx;
+				border: 1px solid #ccc;
+			}
+		}
+		.form-container{
+			padding: 10rpx;
+			// box-shadow: 0px 0px 3px 1px rgba(0, 0, 0, 0.08);
+			margin-top: 20rpx;
+		}
+		.submit_bt{
+			width: 600rpx;
+			height: 72rpx;
+			line-height: 72rpx;
+			box-sizing: border-box;
+			border-radius: 16upx;
+			margin-top: 50upx;
+			background-color:#3384FF;
+			font-size: 32rpx;
+			color: #fff;
+		}
+		.button-container{
+			width: 750rpx;
+			height:88rpx;
+			line-height:88rpx;
+			color: #4D73FF;
+			text-align: center;
+			font-size: 32rpx;
+			padding-bottom: 68rpx;
+			background-color: #fff;
+			position: fixed;
+			left: 0;
+			bottom: 0;
+			z-index: 2;
+			box-shadow: 0px 0px 12px 0px #0000000A;
+			border-radius: 8px 8px 0px 0px
+		}
+		::v-deep .uni-forms-item{
+			.uni-forms-item__content{
+				.uni-data-checkbox-wrap{
+					height: 100%;
+					display: flex;
+					align-items: center;
+					.action{
+						padding: 22rpx 32rpx;
+						background-color: #fff;
+						border-radius: 2px;
+						margin-right: 20rpx;
+						font-size: 28rpx;
+						line-height: 1;
+						&.active{
+							background: rgba(77, 115, 255, 0.16);
+							color: #4D73FF;
+						}
+					}
+				}
+
+			}		
+		}
+	}
+
+</style>

+ 132 - 0
pages/index/handle/task/checkList/detail/detail.vue

@@ -0,0 +1,132 @@
+<template>
+	<view class="wrap">
+		<uni-section :title="point.pointContent" type="line">
+			<uni-forms ref="form" :modelValue="formData" :rules="rules" :label-width="300" label-position="top">
+				<uni-forms-item label="检查结果" name="checkResult" required>
+					<view class="uni-data-checkbox-wrap">
+						{{checkResult}}
+						<!-- <uni-data-checkbox  v-model="formData.checkResult" :localdata="checkResults" />		 -->		
+					</view>
+				</uni-forms-item>	
+				<uni-forms-item label="备注" name="remark">
+				  <uni-easyinput disabled v-model="formData.remark" type="textarea" :maxlength="-1" autoHeight placeholder="备注" />
+				</uni-forms-item>
+				<template v-if="formData.attachList.length>0">
+					<view class="attach-box" @click="preview(attach,index)" v-for="(attach,index) in formData.attachList" :key="index">	
+						<image class="attach" :src="attach.fileUrl" mode="widthFix"></image>					 
+					</view>
+				</template>
+			</uni-forms>
+		</uni-section>
+	</view>
+</template>
+
+<script>
+	import {upload} from '@/api/system/upload.js'	
+	import {updateChecklistPoint,getPoint} from '@/api/aqpt/checklistPoint.js'
+	export default {
+		data() {
+			return {
+				checkResults:[
+					{text:"通过",value:1},
+					{text:"不通过",value:-1},
+				],
+				checkResult:"",
+				formData:{
+					checkResult:1,	
+					remark:"",
+					attachList:[]
+				},
+				rules:{},
+				point:{}
+			}
+		},
+		onBackPress() {
+
+		},
+		onLoad() {
+			this.init()
+		},
+		methods: {
+			init(){
+				let point=uni.getStorageSync('point');
+				this.point=point;
+				this.getPoint()
+			},
+			getPoint(){
+				let point=uni.getStorageSync('point');
+				let checklistId=point.checklistId;
+				let itemId=point.itemId;
+				let recordId=point.recordId;
+				let pointId=point.pointId;
+				getPoint(checklistId,itemId,recordId,pointId).then((res)=>{
+					this.formData=res.data
+					for(let i=0;i<this.checkResults.length;i++){
+						if(this.checkResults[i].value===res.data.checkResult){
+							this.checkResult=this.checkResults[i].text
+						}
+					}
+				})
+			},
+		    preview(attach,index){
+				uni.previewImage({
+					urls:[attach.fileUrl],
+					current:index
+				})
+			}
+		},
+		onUnload() {			
+			uni.removeStorageSync('point')
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.wrap{
+	padding: 20rpx;
+	position: relative;
+	// &::after{
+	// 	content: "";
+	// 	width: 100%;
+	// 	height: 100vh;
+	// 	position: fixed;
+	// 	left: 0;
+	// 	top: 0;
+	// 	background-color: rgba(0,0,0,0);
+	// 	z-index: 999;
+	// }
+	.submit-BT {
+		width: 750rpx;
+		color: #4D73FF;
+		text-align: center;
+		font-size: 32rpx;
+		padding-bottom: 68rpx;
+		background-color: #fff;
+		position: fixed;
+		left: 0;
+		bottom: 0;
+		z-index: 99;
+		box-shadow: 0px 0px 12px 0px #0000000A;
+		border-radius: 8px 8px 0px 0px
+	}
+	::v-deep .uni-forms-item{
+		.uni-forms-item__content{
+			.uni-data-checkbox-wrap{
+				height: 100%;
+				display: flex;
+				align-items: center;					
+			}
+	
+		}		
+	}
+	.attach-box{
+		&,.attach{
+			width: 200rpx;
+			height: 200rpx;
+			margin-right: 10rpx;
+			border: 1px solid #333;			
+		}
+
+	}
+}
+</style>

+ 133 - 0
pages/index/handle/task/checkList/form/form.vue

@@ -0,0 +1,133 @@
+<template>
+	<view class="wrap">
+		<uni-section :title="point.pointContent" type="line">
+			<uni-forms ref="form" :modelValue="formData" :rules="rules" :label-width="300" label-position="top">
+				<uni-forms-item label="检查结果" name="checkResult" required>
+					<view class="uni-data-checkbox-wrap">
+						<uni-data-checkbox v-model="formData.checkResult" :localdata="checkResults" />				
+					</view>
+				</uni-forms-item>	
+				<uni-forms-item label="备注" name="remark">
+				  <uni-easyinput v-model="formData.remark" type="textarea" :maxlength="-1" autoHeight placeholder="备注" />
+				</uni-forms-item>
+				<uni-file-picker  v-model="formData.attachList" 
+				 fileMediatype="image" 
+				 title="请上传附件"
+				 limit="1"
+				 @select="uploadSuccess"
+				 @delete="deleteFile"></uni-file-picker>	
+			</uni-forms>
+		</uni-section>
+		<button type="primary" @click="onSubmit" class="submit-BT">提交</button>		
+	</view>
+</template>
+
+<script>
+	import {upload} from '@/api/system/upload.js'	
+	import {updateChecklistPoint} from '@/api/aqpt/checklistPoint.js'
+	export default {
+		data() {
+			return {
+				checkResults:[
+					{text:"通过",value:1},
+					{text:"不通过",value:-1},
+				],
+				formData:{
+					checkResult:1,	
+					remark:"",
+					attachList:[]
+				},
+				rules:{},
+				point:{}
+			}
+		},
+		onBackPress() {
+
+		},
+		onLoad() {
+			this.init()
+		},
+		methods: {
+			init(){
+				let point=uni.getStorageSync('point');
+				this.point=point;
+			},
+			async onSubmit() {
+				let point=uni.getStorageSync('point')
+				let attachList=[]
+				for(let i=0;i<this.formData.attachList.length;i++){
+					let filePath=this.formData.attachList[i].url
+					let fileresq=await upload({filePath})
+					fileresq=JSON.parse(fileresq)
+					attachList.push(fileresq.data)
+				}
+				await updateChecklistPoint({
+					recordId:point.recordId,
+					checklistId:point.checklistId,
+					itemId:point.itemId,
+					pointId:point.pointId,
+					checkResult:this.formData.checkResult,
+					remark:this.formData.remark,
+					attachList,
+				}).catch(()=>{
+					uni.showToast({
+						icon:'none',
+						title:"提交失败!"
+					})				
+				})
+				uni.showToast({
+					icon:'none',
+					title:"提交成功!",
+					complete() {
+						uni.redirectTo({
+							url:`/pages/index/handle/task/task?rid=${point.recordId}&cid=${point.checklistId}`
+						})
+					}
+				})
+			},
+			uploadSuccess(e){
+				let attachList=JSON.parse(JSON.stringify(this.formData.attachList))
+				attachList.push(e.tempFiles[0])
+				this.formData.attachList=attachList
+			},
+			deleteFile(e){							
+				let attachList=JSON.parse(JSON.stringify(this.formData.attachList))
+				attachList.filter(item=>item.uuid!==e.tempFile.uuid)
+				this.formData.attachList=attachList
+			},			
+		},
+		onUnload() {			
+			uni.removeStorageSync('point')
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.wrap{
+	padding: 20rpx;
+	.submit-BT {
+		width: 750rpx;
+		color: #4D73FF;
+		text-align: center;
+		font-size: 32rpx;
+		padding-bottom: 68rpx;
+		background-color: #fff;
+		position: fixed;
+		left: 0;
+		bottom: 0;
+		z-index: 99;
+		box-shadow: 0px 0px 12px 0px #0000000A;
+		border-radius: 8px 8px 0px 0px
+	}
+	::v-deep .uni-forms-item{
+		.uni-forms-item__content{
+			.uni-data-checkbox-wrap{
+				height: 100%;
+				display: flex;
+				align-items: center;					
+			}
+	
+		}		
+	}
+}
+</style>

+ 213 - 0
pages/index/handle/task/task.vue

@@ -0,0 +1,213 @@
+<template>
+	<view class="page">
+		<view class="wrap">
+			<template v-if="itemList.length>0">
+				<view class="checklist" v-for="(checklist,idx) in itemList" :key="idx">
+					<view class="title more">{{checklist.itemTitle}}</view>
+					<view class="item-cont" v-if="checklist.children&&checklist.children.length>0">
+						<view class="checklistItem" v-for="(checklistItem,itemIdx) in checklist.children" :key="itemIdx">
+							<view class="itemTitle more">{{checklistItem.itemTitle}}</view>
+							<view  class="point-cont" v-if="checklistItem.recordList&&checklistItem.recordList.length>0">
+								<view class="point" v-for="(point,pointIdx) in checklistItem.recordList" :key="pointIdx" @click="check(point)">
+									<view class="pointContent">{{point.pointContent}}</view>
+									<view class="status" v-if="point.checkResult===1">【通过】</view>
+									<view class="status" v-if="point.checkResult===-1">【不通过】</view>
+								</view>
+							</view>
+						</view>				
+					</view>
+					<view class="item-cont" v-if="checklist.recordList&&checklist.recordList.length>0">
+						<view class="checklistItem" v-for="(checklistItem,itemIdx) in checklist.recordList" :key="itemIdx">
+							<view  class="point-cont">
+								<view class="point" @click="check(checklistItem)">
+									<view class="pointContent">{{checklistItem.pointContent}}</view>
+									<view class="status" v-if="checklistItem.checkResult===1">【通过】</view>
+									<view class="status" v-if="checklistItem.checkResult===-1">【不通过】</view>
+								</view>
+							</view>
+						</view>				
+					</view>					
+				</view>
+				<view class="handle-container" v-if="handleVisiable">
+					<view class="handle" @click="handleSubmit(3)">全部通过</view>
+					<view class="handle" @click="handleSubmit(4)">全不通过</view>				
+					<view class="handle" @click="handleSubmit(1)">提交</view>
+					<view class="handle" @click="handleSubmit(2)">撤销</view>				
+				</view>
+			</template>
+			<template v-else>没有可处理的清单^-_-^</template>
+		</view>		
+	</view>
+</template>
+<script>
+	import {
+		getchecklistRecord,
+		checklistComplete,
+		checklistCancel,
+		checklistBatchUpdate,
+	} from '@/api/aqpt/checklistPoint.js'
+	export default {
+		data() {
+			return {
+				defaultProps: {
+					id: 'itemId', 
+					children: 'children',
+					label: 'itemTitle'
+				},
+				accountInfo:{},
+				divider: false,
+				edit: true,
+				itemList:[],
+				recordId:undefined,
+				checklistId:undefined,
+				handleVisiable:false,
+				type:undefined,
+				status:undefined
+			}
+		},
+		onLoad({rid,cid}) {
+			this.checklistId=cid	
+			this.recordId=rid	
+			let accountInfo=uni.getStorageSync('accountInfo')
+			this.accountInfo=accountInfo
+			this.getchecklistRecord(cid,rid)
+		},
+		methods: {
+			getchecklistRecord(checklistId,recordId){
+				getchecklistRecord(checklistId,recordId).then((res)=>{
+					this.itemList=res.data.itemList
+					this.status=res.data.status
+					this.handleVisiable=(res.data.status===0||res.data.status===1)&&(res.data.accountId===this.accountInfo.userId)
+				})
+			},
+			check(point){		
+				if(!this.handleVisiable) return	
+				uni.setStorageSync("point",point)
+				uni.navigateTo({
+					url:"/pages/index/handle/task/checkList/form/form"
+				})								
+			},
+			handleSubmit(type){
+				let recordId=this.recordId;
+				let checklistId=this.checklistId;
+				if(type===1){//完成
+					checklistComplete(recordId,checklistId).then(()=>{
+						uni.$emit('type',1)						
+						uni.switchTab({
+							url:'/pages/history/history'
+						})
+					}).catch(()=>{
+						uni.showToast({
+							icon:"none",
+							title:"操作失败"
+						})
+					})
+				}
+				if(type===2){//放弃
+					checklistCancel(recordId).then(()=>{
+						uni.switchTab({
+							url:'/pages/history/history'
+						})
+					}).catch(()=>{
+						uni.showToast({
+							icon:"none",
+							title:"操作失败"
+						})
+					})
+				}
+				if(type===3){
+					checklistBatchUpdate(recordId,1).then(()=>{
+						this.getchecklistRecord(checklistId,recordId)
+					})
+				}
+				if(type===4){
+					checklistBatchUpdate(recordId,-1).then(()=>{
+						this.getchecklistRecord(checklistId,recordId)
+					})
+				}			
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.page{
+		background-color: #F5F6F8;
+		padding: 20rpx;
+		min-height: 100vh;
+		box-sizing: border-box;
+		margin-bottom: 100rpx;
+	}	
+	.wrap{
+		padding: 20rpx;
+		background-color: #fff;
+		.checklist{
+			.title{
+				color: #222222;
+				font-size: 32rpx;
+				height: 98rpx;
+				line-height: 98rpx;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				border-bottom: 1px dashed #E8E8E8;				
+			}
+			.more{
+				background-image: url('/static/tree_more.png');
+				background-size: 30rpx 30rpx;
+				padding-left: 40rpx;
+				background-position: center left;
+				background-repeat: no-repeat;
+			}
+			.item-cont{
+				padding-left: 20rpx;
+				border-bottom: 1px dashed #E8E8E8;	
+				.checklistItem{
+					.itemTitle{
+						color: #222222;
+						font-size: 32rpx;	
+						height: 98rpx;
+						line-height: 98rpx;
+					}
+				}
+				.point-cont{
+					padding-left: 30rpx;
+					.point{
+						display: flex;						
+						color: #666;
+						font-size: 28rpx;	
+						height: 98rpx;
+						line-height: 98rpx;
+						.pointContent{
+							flex: 1;
+						}
+					}
+				}
+			}
+		}
+		.handle-container{
+			position: fixed;
+			width: 100%;
+			left: 0;
+			bottom: 0;
+			background-color: #fff;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			border-top: 1rpx solid #eaeaea;
+			.handle{
+				display: inline-block;
+				background-color: #3384FF;
+				color: #fff;
+				padding: 15rpx 20rpx;
+				width: 25%;
+				box-sizing: border-box;
+				border-right: 1rpx solid #eaeaea;
+				font-size: 30rpx;
+				text-align: center;
+				&:nth-child(4){
+					border: 0;
+				}
+			}
+		}
+	}
+</style>

+ 202 - 0
pages/index/handle/warning/warning.vue

@@ -0,0 +1,202 @@
+<template>
+	<view class="warning-handle-page">
+	  <uni-forms ref="form" :modelValue="formData" :rules="rules" :label-width="300" label-position="top">
+		<uni-forms-item label="处理动作"  required >
+			<div class="uni-data-checkbox-wrap">
+				 <view class="action":class="action===1?'active':''" @click="changeAction(1)">  
+					<text>完成处理</text>
+				 </view>
+				 <view class="action":class="action===2?'active':''" @click="changeAction(2)">  
+					<text>转交</text>
+				 </view>
+			</div>
+		</uni-forms-item>
+		<uni-forms-item v-if="handleRemarkVisible" label="原因分析" prop="actionRemark">
+		  <uni-easyinput v-model="formData.warnReason" type="textarea" :maxlength="-1" autoHeight placeholder="原因分析" />
+		</uni-forms-item>
+
+		<uni-forms-item v-if="handleRemarkVisible" label="处理措施" prop="actionRemark">
+		  <uni-easyinput v-model="formData.handleMeasure" type="textarea" :maxlength="-1" autoHeight placeholder="处理说明" />
+		</uni-forms-item>
+
+		<uni-forms-item v-if="handlerVisible" label="执行人" prop="accountIdTo">
+		  <uni-data-select v-model="formData.accountId" :localdata="userList"></uni-data-select>
+		</uni-forms-item>
+
+		<uni-forms-item v-if="handlerVisible" label="备注" prop="remark">
+			<uni-easyinput v-model="transferData.remark" type="textarea" :maxlength="-1" autoHeight placeholder="请输入备注" />
+		</uni-forms-item>
+		<uni-file-picker  v-model="formData.attachList"
+			fileMediatype="image" 
+			title="请上传附件"
+			limit="1"
+			@select="uploadSuccess"
+			@delete="deleteFile">
+		 </uni-file-picker>	
+		<view class="btn-group">
+		  <uni-button type="primary" @click="handleSubmit">提交</uni-button>
+		</view>
+	  </uni-forms>		
+	</view>
+</template>
+
+<script>
+	import {upload} from '@/api/system/upload.js'		
+	import {getUserList} from '@/api/system/user.js'
+	import { getWarningById, completeWarning, transferWarning } from '@/api/aqpt/warningApi'
+	export default {
+		data() {
+			return {
+				formData:{
+					warnId: undefined,
+					attachList: []					
+				},
+				transferData:{
+					
+				},
+				viewData:{},
+				rules:{},
+				userList:[],
+				action:1,
+				warnId:undefined,
+				handleRemarkVisible:false,
+				handlerVisible:false
+			}
+		},
+		created() {
+			this.changeAction(1)
+			this.getUserList()
+		},
+		onLoad({id}) {
+			this.warnId=id	
+			this.formData.warnId = id			
+			this.getData()
+		},
+		methods: {
+			// Fetch Data
+			getData() {
+			  const warnId = this.warnId
+			  getWarningById(warnId).then((resp) => {
+				const { data } = resp
+				this.viewData = data
+			  })
+			},			
+			changeAction(iMode){
+			  this.action=iMode;
+			  if (iMode === 1) {
+				this.handleRemarkVisible = true
+				this.handlerVisible = false
+			  } else if (iMode === 2) {
+				this.handleRemarkVisible = false
+				this.handlerVisible = true
+			  }				
+			},
+			getUserList(){
+				getUserList().then((res)=>{
+					var userList=[]
+					for (var i = 0; i < res.data.length; i++) {
+						userList.push({
+							value: -i, 
+							text: res.data[i].name,
+							disable:true
+						})
+						for(let j = 0; j < res.data[i].children.length; j++){
+							userList.push({
+								...res.data[i].children[j],
+								value: res.data[i].children[j].accountId, 
+								text: res.data[i].children[j].accountName
+							})							
+						}
+					}
+					this.userList=userList
+				})
+			},	
+			// 提交
+			async handleSubmit() {
+				  const action = this.action
+				  if (action === 1) {
+					  let attachList=[]
+					  for(let i=0;i<this.formData.attachList.length;i++){
+						let filePath=this.formData.attachList[i].url
+						let fileresq=await upload({filePath})
+						fileresq=JSON.parse(fileresq)
+						attachList.push(fileresq.data)
+					  }
+					this.formData.attachList=attachList
+					await completeWarning(this.formData).then((resp) => {
+					  const { msg } = resp
+					  uni.showToast({
+						icon:"none",
+						title:msg||'处理成功!'
+					  })
+					  setTimeout(()=>{
+					  	uni.navigateBack()  
+					  },1000)
+					})
+				  } else {
+					let user=this.userList.filter(item=>this.formData.accountId===item.accountId)[0]
+					this.handleSelectUser(user)
+					transferWarning(this.warnId, this.transferData).then((resp) => {
+					  const { msg } = resp
+					  uni.showToast({
+						icon:"none",
+						title:msg||'处理成功!'
+					  })
+					  setTimeout(()=>{
+						uni.navigateBack()  
+					  },1000)
+					})
+				}
+			},
+			handleSelectUser(obj) {
+			  this.transferData.accountIdTo = obj.accountId
+			  this.transferData.groupIdTo = obj.groupId
+			  this.transferData.positionIdTo = obj.positionId
+			  this.transferData.accountNameTo = obj.accountName
+			  this.transferData.groupNameTo = obj.groupName
+			  this.transferData.positionNameTo = obj.positionName
+			},	
+			uploadSuccess(e){
+				let attachList=JSON.parse(JSON.stringify(this.formData.attachList))
+				attachList.push(e.tempFiles[0])
+				this.formData.attachList=attachList
+			},
+			deleteFile(e){							
+				let attachList=JSON.parse(JSON.stringify(this.formData.attachList))
+				attachList.filter(item=>item.uuid!==e.tempFile.uuid)
+				this.formData.attachList=attachList
+			},	
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.warning-handle-page{
+	padding: 32rpx;
+	::v-deep .uni-forms-item{
+		.uni-forms-item__content{
+			.uni-data-checkbox-wrap{
+				height: 100%;
+				display: flex;
+				align-items: center;
+				.action{
+					padding: 22rpx 32rpx;
+					background-color: #fff;
+					border-radius: 2px;
+					margin-right: 20rpx;
+					font-size: 28rpx;
+					line-height: 1;
+					&.active{
+						background: rgba(77, 115, 255, 0.16);
+						color: #4D73FF;
+					}
+				}
+			}
+	
+		}		
+	}
+	.btn-group{
+		margin-top: 100rpx;
+	}
+}
+</style>

+ 623 - 0
pages/index/index.vue

@@ -0,0 +1,623 @@
+<template>
+	<view class="index-page ">
+		<view class="header custom_status_bar">
+			<view class="status_bar">
+				 <div class="name">工作台</div>
+				 <div class="actions">
+					 <div class="message" @click="linkToMessage">
+						 <image v-if="user.userAvatar" class="icon" src="/static/index/message.png" mode="widthFix"></image>
+					 </div>
+					 <div class="scan" @click="scanQrcode">
+						 <image class="icon" src="/static/index/scanner.png" mode="widthFix"></image>
+						 <text class="icon-name">扫一扫</text>
+					</div>
+				 </div>
+			</view>		
+			<view class="user-info">
+				<div class="company">
+					<text class="company-name">{{user.ocName}}</text>
+					<image class="icon" src="/static/index/company.png" mode="widthFix"></image>
+				</div>
+				<div class="user">
+					<view class="avatar-box">
+						<image v-if="user.userAvatar" class="avatar" :src="user.userAvatar" mode="widthFix" @error="userAvatar=defaultAvatar"></image>
+						<image v-else class="avatar" :src="defaultAvatar" mode="widthFix"></image>
+					</view>
+					<view class="info">
+						<view class="user-name">
+							{{user.userName}}
+						</view>
+						<view class="user-position">
+							{{user.positionName}}
+						</view>
+					</view>
+				</div>
+			</view>
+		</view>
+		<view class="container">
+			<view class="cont">
+				<div class="container-wrap">
+					<div class="notice">
+						<div class="notice-name">
+							<image class="icon" src="/static/index/notice.png" mode="widthFix"></image>
+							<text>最近动态</text>
+						</div>
+						<div class="notice-cont" v-if="showNotice">
+							<uni-notice-bar
+								scrollable :text="notice" 
+								background-color="#fff0"
+								:speed="50"
+								ref="uni-notice-bar"							
+								color="#333" />
+						</div>
+					</div>
+					<view class="tab">
+						<div class="tab-item" @click="linkTo('task','待办任务')">
+							<image class="icon" src="/static/index/tab1.png" mode="widthFix"></image>
+							<view class="tab-name">待办任务</view>
+							<view class="number">{{taskTotal>99?'99+':taskTotal}}</view>
+						</div>
+						<div class="tab-item" @click="linkTo('alert','预警事件')">
+							<image class="icon" src="/static/index/tab_alert.png" mode="widthFix"></image>
+							<view class="tab-name">预警提醒</view>
+							<view class="number">{{alertTotal>99?'99+':alertTotal}}</view>
+						</div>
+						<div class="tab-item" @click="linkTo('warn','告警事件')">
+							<image class="icon" src="/static/index/tab2.png" mode="widthFix"></image>
+							<view class="tab-name">告警事件  </view>
+							<view class="number">{{warnTotal>99?'99+':warnTotal}}</view>
+						</div>
+						<div class="tab-item" @click="linkTo('danger','待处理隐患')">
+							<image class="icon" src="/static/index/tab3.png" mode="widthFix"></image>
+							<view class="tab-name">待处理隐患</view>
+							<view class="number">{{dangerTotal>99?'99+':dangerTotal}}</view>
+						</div>
+					</view>
+					<view class="tab-cont">
+						<div class="part" v-if="taskList.length>0">
+							<div class="head">
+								<text class="head-name">待办任务</text>
+								<view class="more" @click="linkTo('task','待办任务')">更多</view>
+							</div>
+							<div class="part-cont">
+								<div class="item" v-for="item in taskList" :key="item.taskId" @click="handle('task',item)">
+									<div class="title">
+										<div class="name">{{item.taskTitle}}</div>
+										<view class="state">{{taskStatus(item.status)}}</view>
+									</div>
+									<div class="tags">
+										<text class="tag">{{taskPriority(item.taskPriority)}}</text>
+										<text class="tag">{{item.taskCatTitle}}</text>
+										<text class="tag">{{taskType(item.taskTypeId)}}</text>
+									</div>
+									<view class="time">
+										预期结束时间:{{item.expectedEndTime}}
+									</view>
+									<div class="bottom">
+										<view class="user">
+											<image class="avatar" src="/static/index/user.png" mode="widthFix"></image>
+											处理人:{{item.handleAccountName}}
+										</view>		
+										<view class="hand-time">
+											{{item.launchTime}}
+										</view>																
+									</div>
+								</div>
+							</div>
+						</div>
+						<div class="part" v-if="warnList.length>0">
+							<div class="head">
+								<text class="head-name">告警事件</text>
+								<view class="more" @click="linkTo('warn','告警事件')">更多</view>
+							</div>
+							<div class="part-cont">
+								<div class="item" v-for="item in warnList" :key="item.warnId" @click="handle('warn',item)">
+									<div class="title">
+										<div class="name">{{item.warnTitle}}</div>
+										<view class="state">{{alertStatus(item.status)}}</view>
+									</div>
+									<div class="tags">
+										<text class="tag">{{warningLevelFilter(item.warnLevel)}}</text>
+									</div>
+<!-- 									<view class="time">
+										发生时间:{{item.warnTime}}
+									</view> -->
+									<div class="bottom">
+										<view class="user">
+											<image class="avatar" src="/static/index/user.png" mode="widthFix"></image>
+											处理人:{{item.handleAccountName}}
+										</view>		
+										<view class="hand-time">
+											{{item.warnTime}}
+										</view>																
+									</div>
+<!-- 									<view class="desc" style="padding-top: 5px;">
+										{{item.warnDesc}}
+									</view> -->
+								</div>
+							</div>
+						</div>
+						<div class="part" v-if="alertList.length>0">
+							<div class="head">
+								<text class="head-name">预警事件</text>
+								<view class="more" @click="linkTo('alert','预警事件')">更多</view>
+							</div>
+							<div class="part-cont">
+								<div class="item" v-for="item in alertList" :key="item.alertId">
+									<div class="title">
+										<div class="name">{{item.alertTitle}}</div>
+										<view class="state">{{alertStatus(item.status)}}</view>
+									</div>
+									<div class="tags">
+										<text class="tag">{{alertLevel(item.alertLevel)}}</text>
+									</div>
+									<view class="time">
+										发生时间:{{item.alertTime}}
+									</view>
+									<div class="bottom" v-if="item.handleAccountName">
+										<view class="user">
+											<image class="avatar" src="/static/index/user.png" mode="widthFix"></image>
+											处理人:{{item.handleAccountName}}
+										</view>		
+										<view class="hand-time">
+											{{item.handleTime}}
+										</view>																
+									</div>
+								</div>
+							</div>
+						</div>
+						<div class="part" v-if="dangerList.length>0">
+							<div class="head">
+								<text class="head-name">待处理隐患</text>
+								<view class="more" @click="linkTo('danger','待处理隐患')">更多</view>
+							</div>
+							<div class="part-cont">
+								<div class="item" v-for="item in dangerList" :key="item.dangerId" @click="handle('danger',item)">
+									<div class="title">
+										<div class="name">{{item.dangerTitle}}</div>
+										<view class="state">{{dangerStatus(item.status)}}</view>
+									</div>
+									<div class="tags">
+										<text class="tag">{{dangerLevel(item.dangerLevel)}}</text>
+										<text class="tag">{{item.dangerCatTitle}}</text>
+									</div>
+									<view class="time">
+										预期结束时间:{{item.dangerDeadLine}}
+									</view>
+									<div class="bottom">
+										<view class="user">
+											<image class="avatar" src="/static/index/user.png" mode="widthFix"></image>
+											处理人:{{item.curAccountName}}
+										</view>		
+										<view class="hand-time">
+											{{item.submitTime}}
+										</view>																
+									</div>
+								</div>
+							</div>
+						</div>
+					</view>										
+				</div>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getRecentListByLimit,getArtByList} from '@/api/system/art.js'
+	import { getAlertByPage } from '@/api/aqpt/alertApi.js';
+	import { getDangerByPage } from '@/api/aqpt/dangerApi.js';
+	import { getTaskByPage } from '@/api/aqpt/taskApi.js';
+	import { getMyWarningWaitingTop } from '@/api/aqpt/warning.js';	
+	import { handleCheckTask } from '@/api/aqpt/checkTaskApi'
+	import{
+		taskStatus,taskPriority,taskType,
+		alertLevel,alertStatus,
+		dangerStatus,dangerLevel,
+	} from '@/libs/enum.js';
+	export default {
+		data() {
+			return {
+				applist: [],
+				defaultAvatar:"/static/components/avatar.png",
+				showNotice:false,
+				notice:"",
+				user:{
+					groupName: "",
+					ocName: "",
+					positionName: "",
+					roleName: "",
+					userAvatar: "",
+					userIntro: "",
+					userName: "",
+					userPhone: "",
+					userPhoto: "",
+					userRealName: ""					
+			    },
+				alertList:[],
+				dangerList:[],
+				taskList:[],
+				warnList:[],
+				alertTotal:0,
+				dangerTotal:0,
+				taskTotal:0,
+				warnTotal:0
+			}
+		},
+		created() {
+			this.getData()
+		},
+		onPullDownRefresh() {
+			this.getData()
+			uni.stopPullDownRefresh()
+		},
+		methods: {
+			taskStatus,taskPriority,taskType,
+			alertLevel,alertStatus,
+			dangerStatus,dangerLevel,
+			warningLevelFilter(val) {
+			  const enums = { 1: 'Ⅰ级', 2: 'Ⅱ级', 3: 'Ⅲ级', 4: 'Ⅳ级' }
+			  return enums[val]
+			},
+			scanQrcode(){
+				uni.scanCode({
+					onlyFromCamera: true,
+					success: function (res) {
+						let qrcode=uni.setStorageSync('qrcode',res.result)
+						uni.navigateTo({
+							url:`/pages/webview/webview?type=scan&name=扫码处理`
+						})
+					},
+					fail(res) {
+						uni.showToast({
+							icon:'none',
+							title:"扫码失败"
+						})
+					}
+				});
+			},
+			linkToMessage(){
+				uni.navigateTo({
+					url:"/pages/message/message"
+				})
+			},
+			getData(){
+				let user=uni.getStorageSync('accountInfo');
+				if(user){this.user=user}
+				let notice=""
+				getArtByList(3).then((res)=>{
+					for(let i=0;i<res.data.length;i++){
+						notice+=`${res.data[i].artTitle} 发布时间:${res.data[i].issuedAt};`
+					}
+					this.notice=notice
+					this.showNotice=true
+					this.$nextTick(()=>{
+						this.$refs['uni-notice-bar'].initSize()
+					})
+				})
+				let params={
+					page: 1,
+					limit: 5,
+					status: 0,
+					handleAccountId: user.userId							
+				}
+				getMyWarningWaitingTop(5).then((res)=>{
+					this.warnList=res.data
+					this.warnTotal=res.total
+				})
+				getAlertByPage(params).then((res)=>{
+					this.alertList=res.data
+					this.alertTotal=res.total
+				})
+				getDangerByPage({
+					page: 1,
+					limit: 5,
+					curAccountId: user.userId
+				}).then((res)=>{
+					this.dangerList=res.data
+					this.dangerTotal=res.total
+				})
+				getTaskByPage(params).then((res)=>{
+					this.taskList=res.data
+					this.taskTotal=res.total
+				})				
+			},
+			linkTo(type,name){
+				uni.navigateTo({
+					url:`/pages/index/detail/detail?type=${type}&name=${name}`
+				})
+			},
+			handle(type,item){
+				let url=""
+				if(type==='danger'){
+					url=`/pages/index/handle/danger/index/index?type=${type}&id=${item.dangerId}`
+				}
+				if(type==='task'){this.handTask(item);return};
+				if(type==='warn'){
+					url=`/pages/index/handle/warning/warning?id=${item.warnId}`
+				}				
+				uni.navigateTo({
+					url
+				})				
+			},
+			handTask(item){
+				handleCheckTask(item.taskId).then((res)=>{
+					const { checklistId, checklistTypeId } = res.data //recordId-taskId
+					// if (checklistTypeId === 1) {// HazardRecordView
+											  
+					// } else if (checklistTypeId === 2) {// PointRecordView
+											  
+					// } else if (checklistTypeId === 3) {// ScoreRecordView
+											  
+					// }					
+					uni.navigateTo({
+						url:`/pages/index/handle/task/task?rid=${item.taskId}&cid=${checklistId}`
+					})	
+				})
+
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.index-page {
+		min-height: 100vh;
+		background-color: rgba(245, 246, 248, 1);
+		.header{
+			height: 400rpx;
+			background-image: url('/static/index/bg.png');
+			background-repeat: no-repeat;
+			background-size: 100% 100%;
+			/* #ifdef MP-WEIXIN */
+				padding-top: 28px;
+			/* #endif */
+			.status_bar{
+				padding: 0 32rpx;
+				height: 88rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				.name{
+					font-size: 40rpx;
+					font-weight: 600;
+					color: #000;
+				}
+				.actions{
+					display: flex;
+					align-items: center;
+					.message{
+						.icon{
+							display: inline-block;
+							width: 32rpx;
+						}
+					}
+					.scan{
+						width: 144rpx;
+						height: 48rpx;
+						border-radius: 20rpx;
+						background-color: #fff;
+						display: flex;
+						justify-content: center;
+						align-items: center;
+						margin-left: 32rpx;
+						.icon{
+							display: inline-block;
+							width: 28rpx;					
+						}		
+						.icon-name{
+							font-size: 24rpx;
+							color: #000;
+							padding-left: 10rpx;
+						}
+					}				
+				}
+			}	
+			.user-info{
+				width: 686rpx;
+				height: 228rpx;
+				background: linear-gradient(180deg, #7AB2FF 0%, #808EFF 100%);
+				margin: 0 auto;
+				border-radius: 16px;
+				margin-top: 24rpx;
+				padding: 24px 22rpx 0 30rpx;
+				box-sizing: border-box;
+				.company{
+					display: flex;
+					justify-content: flex-end;
+					align-items: center;
+					.company-name{
+						padding-right: 10rpx;
+						font-size: 28rpx;
+						color: #fff;
+					}
+					.icon{
+						display: block;
+						width: 40rpx;
+						height: 40rpx;
+					}
+				}
+				.user{
+					display: flex;
+					align-items: center;
+					.avatar-box{
+						width: 72rpx;
+						height: 72rpx;	
+						border-radius: 50%;
+						.avatar{
+							display: block;
+							width: 72rpx;
+							height: 72rpx;	
+							border-radius: 50%;
+						}					
+					}
+					.info{
+						padding-left: 24rpx;
+						.user-name{
+							font-size: 32rpx;
+							color: #fff;
+						}
+						.user-position{
+							font-size: 24rpx;
+							color: #fff;
+							opacity: 0.6;
+							padding-top: 8rpx;
+						}						
+					}
+				}
+			}		
+		}
+		.container{
+			position: relative;
+			width: 750rpx;			
+			.cont{
+				width: 750rpx;
+				max-height: 1200px;	
+				position: absolute;
+				overflow: auto;
+				background-image: url('/static/index/bg-bottom.png');
+				background-repeat: no-repeat;
+				background-size: 100% 1200px;
+				background-position: 0 0; 				
+				box-sizing: border-box;
+				top: -45px;
+				margin-top: var(--status-bar-height);
+				left: 0;
+				.container-wrap{
+					padding: 0 32rpx;	
+					background-color: rgba(245, 246, 248, 1);	
+					padding-bottom: 180rpx;								
+				}
+				.notice{
+					height: 84rpx;
+					background-color:rgba(245, 246, 248, 1);
+					margin-top: 48rpx;
+					border-radius: 8rpx;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;					
+					box-shadow: 0px 10px 10px -4px rgba(45, 54, 67, 0.2);
+					padding: 0 32rpx;
+					.notice-name{
+						font-weight: 600;
+						font-size: 24rpx;
+						color: rgba(0, 0, 0, 0.9);
+						.icon{
+							width: 22rpx;
+							margin-right: 8rpx;
+						}
+					}
+					.notice-cont{
+						width: 500rpx;
+						height: 80rpx;
+						flex: 1;
+						font-size: 28rpx;
+						color: rgba(0, 0, 0, 0.9);
+						// background-color: #fff;
+					}
+				}
+				.tab{
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					padding: 40rpx 0 20rpx 0;
+					.tab-item{
+						width: 25%;
+						// height: 150rpx;
+						display: flex;
+						justify-content: center;
+						align-items: center;	
+						flex-direction: column;
+						.icon{
+							width: 96rpx;
+						}
+						.tab-name{
+							font-size: 28rpx;
+							color: rgba(0, 0, 0, 0.9);
+							padding-top: 12rpx;
+						}
+					}
+				}
+				.tab-cont{				
+					.part{
+						.head{
+							padding-top: 20rpx;
+							display: flex;
+							justify-content: space-between;
+							align-items: center;
+							.head-name{
+								font-size: 32rpx;
+								font-weight: 600;
+								color: rgba(0, 0, 0, 0.9);
+							}
+							.more{
+								font-size: 24rpx;
+								color: rgba(110, 116, 128, 1);								
+							}
+					    }
+						.part-cont{
+							.item{
+								background-color: #fff;
+								border-radius: 12rpx;
+								margin-top: 16rpx;
+								padding: 24rpx 20rpx;
+								.title{
+									display: flex;
+									justify-content: space-between;
+									align-items: center;
+									.name{
+										font-size: 36rpx;
+										color: rgba(0, 0, 0, 0.8);
+									}
+									.state{
+										font-size: 32rpx;
+										color: rgba(250, 139, 55, 1);
+									}
+								}
+								.tags{
+									padding-top: 24rpx;
+									.tag{
+										background: rgba(245, 246, 248, 1);	
+										font-size: 20rpx;
+										margin-left: 10rpx;
+										padding: 10rpx 20rpx;
+										&:nth-child(1){
+											color: rgba(234, 130, 89, 1);
+											background: rgba(251, 241, 237, 1);
+										}
+									}
+								}
+								.time{
+																	padding-top: 20rpx;
+									font-size: 28rpx;									
+									color:rgba(241, 57, 57, 0.8);
+								}
+								.bottom{
+									display: flex;
+									justify-content: space-between;
+									align-items: center;
+									padding-top: 20rpx;
+									.user{
+										display: flex;
+										align-items: center;
+										font-size: 24rpx;
+										color: rgba(0, 0, 0, 1);
+										.avatar{
+											width: 44rpx;
+											margin-right: 10rpx;
+										}
+									}
+									.hand-time{
+										font-size: 24rpx;
+										color: rgba(0, 0, 0, 1);
+									}
+								}							
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+</style>

+ 157 - 0
pages/login/index.vue

@@ -0,0 +1,157 @@
+<template>
+	<view class="content">
+		<view class="head">
+			<text>登录</text>
+		</view>
+		<view class="login-wrap">
+			<view class="username item">
+<!-- 				<text>账号:</text> -->
+				<image class="icon" src="/static/login/phone.png" mode="widthFix"></image>
+				<uni-easyinput :inputBorder="false" class="login_input" type="text" v-model="username" placeholder="请输入账号" />
+			</view>
+			<view class="password item">
+				<image class="icon" src="/static/login/pwd.png" mode="widthFix"></image>
+				<!-- <text>密码:</text> -->
+				<uni-easyinput :inputBorder="false" class="login_input" type="password" v-model="password" placeholder="请输入密码">
+				</uni-easyinput>
+			</view>
+			<view class="tip">
+				<label>
+					<checkbox style="transform:scale(0.7)" class="check" value="cb" checked="true" />
+					<text>我已阅读并同意《用户协议》和《隐私政策》,且已明确知晓平台仅限企业内部用户使用。			</text>
+				</label>
+			</view>
+			<button type="primary" @click="loginSubmit" class="submit-BT">登录</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import store from '@/store/index.js'
+	import { login } from '@/api/system/user.js';
+	import { setToken ,getToken} from '@/libs/auth.js';	
+	export default {
+		data() {
+			return {
+				username: "",
+				password: "",
+			}
+		},
+		onLoad({username,password}) {
+			if(username){
+				this.username=username;
+				this.password=password;
+			}
+			if(getToken()){
+				uni.reLaunch({
+					url: '/pages/index/index'
+				})				
+			}
+		},
+		methods: {		
+			loginSubmit() {	
+				let username = (this.username).trim();
+				let password = (this.password).trim();
+				if (username.length < 1) {
+					uni.showToast({
+						title: '请填写账号',
+						icon: "error"
+					})
+					return;
+				}
+				if (password.length < 1) {
+					uni.showToast({
+						title: '请填写密码',
+						icon: "error"
+					})
+					return;
+				}
+				login({
+					username,
+					password
+				}).then((res) => {
+					let token = res.data.accessToken;
+					setToken(token);
+					uni.setStorageSync('accountInfo', res.data.user);
+					uni.setStorageSync('isLogin', true);
+					store.commit('setToken', token);
+					uni.reLaunch({
+						url: '/pages/index/index'
+					})				
+				}).catch((res)=>{
+					uni.showToast({
+						icon:'none',
+						title:res.msg||"登录失败!"
+					})
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		height: 100vh;
+		background-color: #F5F6F8;
+		.head {
+			font-size: 50upx;
+			text-align: center;
+			padding: 40upx 0;
+			letter-spacing: 2upx;
+		}
+
+		.login-wrap {
+			width: 90%;
+			margin: 50upx auto 0;
+			box-sizing: border-box;
+			padding: 20upx;
+			border-radius: 8upx;
+			.item {
+				display: flex;
+				justify-content: flex-start;
+				align-items: center;
+				height: 100upx;
+				font-size: 32upx;
+				line-height: 100upx;
+				background-color: #fff;
+				border-radius: 60rpx;
+				margin-top: 40rpx;
+				padding-left: 30rpx;
+				box-sizing: border-box;
+				.icon{
+					width: 48rpx;
+				}
+				input {
+					font-size: 32upx;
+					height: 100upx;
+					border: 0;
+				}
+
+				.login_input {
+					width: 580upx;
+					border: none;
+				}
+			}
+			.tip {
+				padding: 48rpx 0 0 56rpx;
+				font-size: 28upx;
+				color: #323233;
+				position: relative;
+				.check{
+					position: absolute;
+					left: 8rpx;
+					top: 44rpx;
+				}
+			}
+
+			.submit-BT {
+				height: 88rpx;	
+				line-height: 88rpx;
+				border-radius: 50rpx;
+				margin-top: 50upx;
+				background-color:#2A5BEE;
+				padding: 0;
+			}
+		}
+	}
+</style>

+ 199 - 0
pages/message/message.vue

@@ -0,0 +1,199 @@
+<template>
+	<view class="message-page custom_status_bar">
+		<view class="nav">
+			<view class="back" @click="back">
+				<uni-icons type="back" size="20"></uni-icons>				
+			</view>
+			<view class="title">消息</view>
+			<template>
+				<view @click="clickRight" class="nav-right" v-if="status===0">
+					<image class="icon" src="/static/message/nav1.png" mode="widthFix"></image>
+					<text>清除未读</text>
+				</view> 
+				<view class="nav-right read" v-else>
+					<image class="icon" src="/static/message/nav2.png" mode="widthFix"></image>
+					<text>全部已读</text>
+				</view> 
+			</template>
+		</view>	
+		<view class="container">
+			<view class="message-box" v-for="(item,index) in items" :key="index">
+				<uni-swipe-action>
+					<uni-swipe-action-item :right-options="options" 
+						:left-options="options"
+						 @click="onClick($event,item)" 
+						 @change="swipeChange">
+							<uni-list-chat 
+							:avatar-circle="true" 
+							:title="item.msgFrName||'发件人'"
+							:avatar="item.msgFrAvatar||defaultAvatar" 
+							badge-positon="left" :badge-text="item.isRead===0?'dot':''"
+							:note="item.msgContent"
+							:clickable="true"
+							@click="handleMessage(item)"
+							>
+								<view class="chat-custom-right">
+									<text class="chat-custom-text">{{formateDate(item.msgTime)}}</text>
+				<!-- 					<view class="badge-box">
+										<uni-badge class="uni-badge-left-margin" :text="1" />
+									</view> -->
+								</view>			
+							</uni-list-chat>					
+					</uni-swipe-action-item>
+				</uni-swipe-action>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	
+	import{
+		parseTime,
+		MessageTimeFormat
+	} from '@/libs/index.js'
+	import { putAllReadStatus, getMsgReceivedByPage, deleteMsgById, putReadStatus, getMsgById } from '@/api/system/msgApi'
+	export default {
+		data() {
+			return {
+				status:0,
+				conditions: {
+					page: 1,
+					limit: 10
+				},
+				total:0,
+				defaultAvatar:"/static/components/avatar.png",
+				items:[],
+				options:[
+					{
+						id:"1",	
+						text: '取消',
+						style: {
+							backgroundColor: '#007aff'
+						}
+					}, {
+						id:"2",
+						text: '删除',
+						style: {
+							backgroundColor: '#dd524d'
+						}
+					}
+				]
+			}
+		},
+		onShow() {
+			this.getData()
+		},
+		methods: {
+			back(){
+				uni.navigateBack()
+			},
+			clickRight(){
+				putAllReadStatus().then(() => {
+				  this.status=1	
+				  this.conditions.page=1
+				  this.conditions.limit=10
+				  this.total=0
+				  this.items=[]
+				  this.getData()
+				})
+			},
+			getData(){
+				let items=JSON.parse(JSON.stringify(this.items))
+				getMsgReceivedByPage(this.conditions).then((res)=>{
+					this.items=items.concat(res.data)
+					this.total=res.total
+				})
+			},
+			handleMessage(item){
+			  if (item.isRead === 0) {
+				putReadStatus(item.msgId).then(() => {
+					item.isRead=1
+					uni.showToast({
+						icon:"none",
+						title:"已读"
+					})
+				})
+			  }
+			},
+			onClick(e,data){
+			  deleteMsgById(data.msgId).then(() => {
+				  this.conditions.page=1
+				  this.conditions.limit=10
+				  this.total=0
+				  this.items=[]
+				  this.getData()
+			  })
+			},
+			// swipeChange(e,index){
+			//   console.log('当前状态:'+ e +',下标:' + index)
+			// },
+			formateDate(val){
+				return MessageTimeFormat(parseTime(val))
+			}
+		},
+		onReachBottom() {
+			if(this.total>=this.conditions.page*this.conditions.limit){
+				this.conditions.page++
+				this.getData()
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.message-page{
+	/* #ifdef MP-WEIXIN */
+	padding-top: 30px;
+	/* #endif */
+	background-color: rgba(243, 244, 247, 1);
+	box-sizing: border-box;
+	min-height: 100vh;
+	padding-bottom: 50rpx;
+	box-sizing: border-box;
+	.nav{
+		height: 44px;		
+	    display: flex;	
+		align-items: center;
+	    padding: 0 10px;
+	    height: 44px;
+	    font-size: 12px;	
+		color: rgb(51, 51, 51);
+		background-color: rgb(255, 255, 255);
+		.back{
+			width: 140rpx;
+		}
+		.title{
+			flex: 1;
+			text-align: center;
+			font-size: 14px;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+		}
+		.nav-right{
+			display: flex;
+			justify-items: center;
+			align-items: center;
+			color: rgba(151, 151, 151, 1);
+			&.read{
+				color: rgba(42, 91, 238, 1);
+			}
+			.icon{
+				width: 44rpx;
+			}
+		}
+	}	
+	.container{
+		margin-top: 16rpx;
+		.chat-custom-text{
+			font-size: 26rpx;
+			color: rgba(151, 151, 151, 1);
+		}
+		.badge-box{
+			text-align: right;
+		}
+	}
+}
+
+</style>

文件差异内容过多而无法显示
+ 271 - 0
pages/myCenter/myCenter.vue


+ 244 - 0
pages/myCenter/personalData/personalData.vue

@@ -0,0 +1,244 @@
+<template>
+	<view class="wrap">
+		<view class="info-wrap">
+			<view class="avatar-container" @click="editAvart">
+				<template>
+					<image v-if="form.accountAvatar" class="avatar" :src="form.accountAvatar" mode="widthFix" @error="ImageError"></image>
+					<image v-else class="avatar" :src="defaultAvatar" mode="widthFix"></image>
+				</template>
+				<view class="edit">编辑</view>
+			</view>			
+			<uni-list>
+				<uni-list-item title="帐号名称" :rightText="form.accountName" clickable  @click="handle('accountName')" showArrow></uni-list-item>
+				<uni-list-item title="手机号码" :rightText="form.accountPhone" clickable  @click="handle('accountPhone')" showArrow></uni-list-item>
+				<uni-list-item title="个人姓名" :rightText="form.accountRealName" clickable  @click="handle('accountRealName')" showArrow></uni-list-item>
+				<uni-list-item title="工    号" :rightText="form.accountStaffNo" clickable  @click="handle('accountStaffNo')" showArrow></uni-list-item>
+				<uni-list-item title="介    绍" :rightText="form.accountIntro" clickable   @click="handle('accountIntro')" showArrow></uni-list-item>
+			</uni-list>				
+			<div class="submit-BT" @click="submit">保存</div>
+		</view>		
+		<uni-popup ref="popup" type="dialog" style="top">
+			<div class="uni-popup-modal">
+				<view class="uni-popup-title">请输入修改内容</view>
+				<div class="uni-popup-content">
+					<uni-easyinput type="text" v-model="updateValue" trim 
+					@confirm="confirm(updateValue)"
+					placeholder="请输入内容"></uni-easyinput>					
+				</div>
+				<div class="handle-wrap">
+					<div class="cancel bt" @click="close">取消</div>
+					<div class="confirm bt" @click="confirm(updateValue)">确认</div>
+				</div>
+			</div>
+		</uni-popup>				
+	</view>
+</template>
+
+<script>	
+	import {isEmpty} from '@/libs';
+	import { getUserProfile, updateUserProfile } from '@/api/system/user.js'
+	import { upload } from '@/api/system/upload.js'
+	export default {
+		data() {
+			return {
+				defaultAvatar:require("@/static/components/avatar.png"),
+				avatar:"",
+				updateValue:"",
+				form:{
+					accountId: undefined,
+					accountName: '',
+					accountRealName: '',
+					accountAvatar: '',
+					accountPhone: '',
+					accountStaffNo: '',
+					accountIntro: ''				
+				}
+			}
+		},
+		onShow() {
+			this.init();
+		},
+		methods: {
+			init(){
+				this.getUserProfile();
+			},
+			getUserProfile(){
+				getUserProfile().then((res)=>{
+					this.form=res.data
+				})
+			},
+			handle(type){
+				if(type==='avatar'){
+					this.updateAvatar();
+				}else{
+					this.updateValue=this.isEmpty(this.form[type])?'':this.form[type];
+					this.type=type;
+					this.open();
+				}
+			},
+			open() {
+				this.$refs.popup.open();
+			},
+			close() {
+				this.$refs.popup.close()
+			},
+			ImageError(){
+				this.avatar=this.defaultAvatar
+			},
+			editAvart(){
+				const self=this;
+				uni.chooseImage({
+					count: 1,
+					sizeType: ['original', 'compressed'],
+					sourceType: ['album',"camera"], //从相册选择
+					success:(res)=>{
+						let filePath=res.tempFilePaths[0]
+						upload({filePath}).then((resq)=>{
+							var fileResq=JSON.parse(resq)
+							self.form.accountAvatar=fileResq.data.fileUrl;
+						})
+					}
+				});		
+			},
+			confirm(value) {
+				if(isEmpty(value)){
+					uni.showToast({
+						icon:"none",
+						title:'请填写修改内容'
+					})
+					return;
+				}
+				this.form[this.type]=value
+				this.updateValue=""
+				this.close();		
+			},
+			submit(){
+				updateUserProfile(this.form).then(()=>{
+					uni.showToast({
+						title:"修改成功!",
+						icon:"none",
+						duration:1000
+					})				
+					setTimeout(()=>{
+						uni.hideToast()
+						uni.reLaunch({
+							url:'/pages/myCenter/myCenter'
+						})	
+					},1000)
+				})
+			},
+			isEmpty(val){
+				if(val!=="undefined"&&val!==undefined&&val!==""&&val!==null){
+					return false
+				}
+				return true
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.wrap{
+		.info-wrap{
+			background-color: #f8f8f8;
+			padding-top: 36rpx;			
+			.avatar-container{
+				&{
+					margin: 0 auto;
+					width: 156rpx;
+					height: 156rpx;
+					background: rgba(255,255,255,0.39);
+					border: 2rpx solid #707070;
+					border-radius: 50%;	
+					position: relative;
+					overflow: hidden;
+					margin-bottom: 36rpx;
+				}
+				.avatar{
+					width: 156rpx;
+					height: 156rpx;
+					border-radius: 50%;	
+					display: block;
+				}
+				.edit{
+					width: 100%;
+					height: 42rpx;
+					line-height: 42rpx;
+					text-align: center;
+					position: absolute;
+					bottom: 0;
+					left: 50%;
+					transform: translateX(-50%);
+					font-size: 26rpx;
+					font-family: PingFang SC;
+					font-weight: 400;
+					color: #FFFFFF;
+					background: rgba(0,0,0,0.6);
+				}
+			}
+			.uni-list-item-custom{
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 12rpx 15px;
+				padding-left: 15px;	
+				border-bottom: 1px solid #e7e7e7;
+				.headline{
+					font-size: 14px;
+					color: #3b4144;
+					overflow: hidden;					
+				}
+			}
+		}
+		.uni-popup-dialog-wrap{
+			margin-top: -180upx;
+		}
+		.submit-BT{
+			width: 424rpx;
+			height: 72rpx;
+			line-height: 72rpx;	
+			text-align: center;			
+			position: fixed;
+			bottom: 120rpx;
+			left: 50%;
+			transform: translateX(-50%);					
+			background:#3D90F4;
+			border-radius: 42rpx;	
+			font-size: 32rpx;
+			font-family: PingFang SC;
+			font-weight: 400;
+			color: #FFFFFF;
+			z-index: 999;			
+		}
+		.uni-popup-modal{
+			width: 500rpx;
+			background-color: #fff;
+			box-shadow: 0 0 6rpx rgba(0,0,0,0.6);
+			border-radius: 16rpx;
+			.uni-popup-title{
+				color: #000;
+				font-size: 32rpx;
+				line-height: 1;
+				text-align: center;
+				padding: 30rpx 0;
+			}
+			.uni-popup-content{
+				padding: 20rpx 20rpx 80rpx;			
+			}
+			.handle-wrap{
+				.bt{
+					display: inline-block;
+					width: 50%;
+					height: 80rpx;
+					line-height: 60rpx;
+					color: #333;
+					font-size: 32rpx;
+					text-align: center;
+					&.confirm{
+						color:#007aff;
+					}
+				}				
+			}
+		}
+	}
+</style>

+ 124 - 0
pages/myCenter/updatePassword/updatePassword.vue

@@ -0,0 +1,124 @@
+<template>
+	<view class="content">
+		<view class="updatePassword-wrap">
+			<view class="username item">
+				<text>新密码:</text>
+				<uni-easyinput :inputBorder="false" v-model="password"
+					class="input" 
+					type="text"  
+					placeholder="请输入新密码" />
+			</view>
+			<view class="password item">
+				<text>确认密码:</text>
+				<uni-easyinput v-model="rePassword"
+				 :inputBorder="false" 
+				 class="input"
+				 type="text"  placeholder="请确认密码">
+				</uni-easyinput>
+			</view>
+			<button type="primary" @click="submit" class="submit-BT">提交</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {updatePwd} from '@/api/system/user.js'
+	export default {
+		data() {
+			return {
+				password: "",
+				rePassword: "",
+			}
+		},
+		methods: {		
+			submit() {		
+				let rePassword = (this.rePassword).trim();
+				let password = (this.password).trim();
+
+				if (password.length < 1) {
+					uni.showToast({
+						title: '请填写新密码',
+						icon: "error"
+					})
+					return;
+				}
+				if (rePassword!==password) {
+					uni.showToast({
+						title: '两次密码不一致',
+						icon: "error"
+					})					
+					return;
+				}
+				updatePwd({
+					password,
+					rePassword
+				}).then(()=>{
+					uni.showToast({
+						title:'修改成功',
+						duration:2000,
+						complete() {
+							uni.reLaunch({
+								url:'/pages/login/index'
+							})
+						}
+					})					
+				})
+
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		.head {
+			font-size: 50upx;
+			text-align: center;
+			padding: 40upx 0;
+			letter-spacing: 2upx;
+		}
+		.updatePassword-wrap {
+			margin: 100upx auto 0;
+			box-sizing: border-box;
+			padding: 20upx 30upx;
+			border-radius: 8upx;
+			.item {
+				display: flex;
+				justify-content: flex-start;
+				align-items: center;
+				height: 90upx;
+				font-size: 32upx;
+				line-height: 90upx;
+				background-color: #fff;
+				border-radius: 50upx;
+				padding: 0 20upx;
+				.input{
+					width: 520upx;
+					border: none;
+				}
+				&.password {
+					margin-top: 40upx;
+				}
+			}
+			.tip {
+				text-align: right;
+				padding: 18upx 0;
+				font-size: 28upx;
+			}
+			.submit-BT {
+				width: 600rpx;
+				height: 72rpx;
+				line-height: 72rpx;	
+				text-align: center;							
+				background:#3D90F4;
+				border-radius: 42rpx;	
+				font-size: 32rpx;
+				font-family: PingFang SC;
+				font-weight: 400;
+				color: #FFFFFF;
+				z-index: 999;
+				margin: 100rpx auto;
+			}
+		}
+	}
+</style>

+ 42 - 0
pages/webview/webview.vue

@@ -0,0 +1,42 @@
+<template>
+	<web-view :src="webViewSrc"></web-view>
+</template>
+
+<script>
+	import {getToken} from '@/libs/auth.js';
+	export default {
+		data() {
+			return {
+				webViewSrc:""
+			}
+		},
+		onLoad(options) {
+			this.init(options)
+		},
+		methods: {
+			init(options){
+				let t=new Date().getTime()
+				if(options.type==='scan'){
+					let href="http://h5.xazhyc.com/scanApp/#/pages/index/index"
+					let qrcode=uni.getStorageSync('qrcode')
+					qrcode=qrcode.split('?')[1]
+					this.webViewSrc=`${href}?token=${getToken()}&${qrcode}&v=${t}`
+					uni.setNavigationBarTitle({
+						title:"扫码操作"
+					})										
+				}else{
+					let other=""
+					for(let key in options){
+						if(key!=='href'&&key!=='name'){
+							other+=`${key}=${options[key]}&`
+						}
+					}
+					this.webViewSrc=`${options.href}?token=${getToken()}&${other}v=${t}`	
+					uni.setNavigationBarTitle({
+						title:`${options.name}`
+					})									
+				}
+			}
+		}
+	}
+</script>

+ 2 - 0
remark.md

@@ -0,0 +1,2 @@
+### 设计图地址
+### [设计图地址](https://www.figma.com/file/SbKMCyiaBZyDd7tRFc4VTI/%E6%99%BA%E6%85%A7%E5%88%9B%E6%96%B0%E9%A1%B9%E7%9B%AE?type=design&node-id=555-2423&mode=design&t=VSCwViAxKl4iinhn-0)

二进制
static/app/tab-1.png


二进制
static/app/tab-2.png


二进制
static/app/tab-3.png


二进制
static/app/tab-4.png


二进制
static/center/archive-tick.png


二进制
static/center/bg.png


二进制
static/center/dollar-circle.png


二进制
static/center/heart.png


二进制
static/center/setting.png


二进制
static/center/timer.png


二进制
static/components/avatar.png


二进制
static/history/camera.png


二进制
static/index/bg-bottom.png


二进制
static/index/bg.png


二进制
static/index/company.png


二进制
static/index/message.png


二进制
static/index/notice.png


二进制
static/index/scanner.png


二进制
static/index/tab1.png


二进制
static/index/tab2.png


二进制
static/index/tab3.png


二进制
static/index/tab_alert.png


二进制
static/index/user.png


二进制
static/login/phone.png


二进制
static/login/pwd.png


二进制
static/logo.png


二进制
static/message/nav1.png


二进制
static/message/nav2.png


二进制
static/tabbar/app.png


二进制
static/tabbar/appEd.png


二进制
static/tabbar/index.png


二进制
static/tabbar/indexEd.png


二进制
static/tabbar/info.png


二进制
static/tabbar/infoEd.png


二进制
static/tabbar/myCenter.png


二进制
static/tabbar/myCenterEd.png


二进制
static/tree_more.png


二进制
static/tree_more_def.png


+ 22 - 0
store/index.js

@@ -0,0 +1,22 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+Vue.use(Vuex)
+
+//实例store对象
+const store = new Vuex.Store({
+	state: {
+		access_token:"",
+		jpush:null
+	},
+	mutations: {
+		setToken(state,token){
+			state.access_token=token;
+		},
+		initJpush(state,jpush){
+			state.jpush=jpush;
+		}
+	}
+})
+
+//导出store对象
+export default store

部分文件因为文件数量过多而无法显示