zouling 3 місяців тому
коміт
2b30458296
100 змінених файлів з 12786 додано та 0 видалено
  1. 16 0
      bureau-of-education/.gitignore
  2. 12 0
      bureau-of-education/1.txt
  3. BIN
      bureau-of-education/6110cd567c430.keystore
  4. 32 0
      bureau-of-education/App.vue
  5. 21 0
      bureau-of-education/LICENSE
  6. BIN
      bureau-of-education/bureau-of-education.7z
  7. 1087 0
      bureau-of-education/common/classify.data.js
  8. 100 0
      bureau-of-education/common/demo.scss
  9. 22 0
      bureau-of-education/common/http.api.js
  10. 62 0
      bureau-of-education/common/http.interceptor.js
  11. 585 0
      bureau-of-education/common/index.list.js
  12. 21 0
      bureau-of-education/common/locales/en.js
  13. 21 0
      bureau-of-education/common/locales/zh.js
  14. 5 0
      bureau-of-education/common/vue-i18n.min.js
  15. BIN
      bureau-of-education/components/.DS_Store
  16. 3 0
      bureau-of-education/components/pretty-uploadFile/pretty-uploadFile.css
  17. 172 0
      bureau-of-education/components/pretty-uploadFile/pretty-uploadFile.vue
  18. 54 0
      bureau-of-education/components/pretty-uploadFile/utils/openpdf.js
  19. 101 0
      bureau-of-education/components/pretty-uploadFile/utils/request.js
  20. 146 0
      bureau-of-education/components/pretty-uploadFile/utils/uploadimage.js
  21. 142 0
      bureau-of-education/components/uni-file-picker/choose-and-upload-file.js
  22. 743 0
      bureau-of-education/components/uni-file-picker/uni-file-picker.vue
  23. 325 0
      bureau-of-education/components/uni-file-picker/upload-file.vue
  24. 289 0
      bureau-of-education/components/uni-file-picker/upload-image.vue
  25. 12 0
      bureau-of-education/components/xl-slider-verify/new_file.md
  26. 126 0
      bureau-of-education/components/xl-slider-verify/xl-slider-verify.vue
  27. BIN
      bureau-of-education/education.keystore
  28. 64 0
      bureau-of-education/main.js
  29. 142 0
      bureau-of-education/manifest.json
  30. 23 0
      bureau-of-education/package.json
  31. 203 0
      bureau-of-education/pages.json
  32. 129 0
      bureau-of-education/pages/centerView/changPwd/index.vue
  33. 334 0
      bureau-of-education/pages/centerView/collection/collector.vue
  34. 366 0
      bureau-of-education/pages/centerView/collection/details.vue
  35. 150 0
      bureau-of-education/pages/centerView/collection/index.vue
  36. 301 0
      bureau-of-education/pages/centerView/filed/index.vue
  37. 386 0
      bureau-of-education/pages/centerView/schedule/details.vue
  38. 145 0
      bureau-of-education/pages/centerView/schedule/index.vue
  39. 444 0
      bureau-of-education/pages/centerView/toExamine/auditDetails.vue
  40. 254 0
      bureau-of-education/pages/centerView/toExamine/index.vue
  41. 803 0
      bureau-of-education/pages/indexView/addPost/index.vue
  42. 388 0
      bureau-of-education/pages/indexView/addressee/details.vue
  43. 562 0
      bureau-of-education/pages/indexView/addressee/index.vue
  44. 307 0
      bureau-of-education/pages/indexView/archive/index.vue
  45. 11 0
      bureau-of-education/pages/indexView/postList/index.vue
  46. 138 0
      bureau-of-education/pages/postView/approvalProcess/index.vue
  47. 374 0
      bureau-of-education/pages/postView/postDetails/index.vue
  48. 359 0
      bureau-of-education/pages/postView/selectPeople/index.vue
  49. 306 0
      bureau-of-education/pages/postView/viewProgress/index.vue
  50. 576 0
      bureau-of-education/pages/tabbar/addressee/index.vue
  51. 347 0
      bureau-of-education/pages/tabbar/center/index.vue
  52. 356 0
      bureau-of-education/pages/tabbar/index/index.vue
  53. 303 0
      bureau-of-education/pages/tabbar/login/index.vue
  54. 555 0
      bureau-of-education/pages/tabbar/post/index.vue
  55. 363 0
      bureau-of-education/static/common/js/touch-emulator.js
  56. BIN
      bureau-of-education/static/e69520e1b75f2a99a4c9a142da9446d.png
  57. BIN
      bureau-of-education/static/img/black.png
  58. BIN
      bureau-of-education/static/img/icon_1.png
  59. BIN
      bureau-of-education/static/img/icon_black_enter.png
  60. BIN
      bureau-of-education/static/img/icon_dlhk.png
  61. BIN
      bureau-of-education/static/img/icon_hp_dgd.png
  62. BIN
      bureau-of-education/static/img/icon_hp_hp.png
  63. BIN
      bureau-of-education/static/img/icon_hp_sw.png
  64. BIN
      bureau-of-education/static/img/icon_hp_xzfw.png
  65. BIN
      bureau-of-education/static/img/icon_mine_csw.png
  66. BIN
      bureau-of-education/static/img/icon_mine_sh.png
  67. BIN
      bureau-of-education/static/img/icon_mine_tcdl.png
  68. BIN
      bureau-of-education/static/img/icon_mine_tel.png
  69. BIN
      bureau-of-education/static/img/icon_mine_white_enter.png
  70. BIN
      bureau-of-education/static/img/icon_plsc.png
  71. BIN
      bureau-of-education/static/img/icon_qx_normal.png
  72. BIN
      bureau-of-education/static/img/icon_qx_selected.png
  73. BIN
      bureau-of-education/static/img/icon_sc_close.png
  74. BIN
      bureau-of-education/static/img/icon_sc_wj.png
  75. BIN
      bureau-of-education/static/img/icon_tc_close.png
  76. BIN
      bureau-of-education/static/img/icon_xzrq.png
  77. BIN
      bureau-of-education/static/img/icon_xzrq_xl.png
  78. BIN
      bureau-of-education/static/img/icon_xzry_close.png
  79. BIN
      bureau-of-education/static/img/icon_xzry_sl.png
  80. BIN
      bureau-of-education/static/img/icon_xzry_xl.png
  81. BIN
      bureau-of-education/static/img/icon_yjyd.png
  82. BIN
      bureau-of-education/static/img/ipc_yz_ybh.png
  83. BIN
      bureau-of-education/static/img/ipc_yz_ysh.png
  84. BIN
      bureau-of-education/static/img/ipc_yz_ywc.png
  85. BIN
      bureau-of-education/static/img/pic_dl_hum.png
  86. BIN
      bureau-of-education/static/img/pic_dlbg.png
  87. BIN
      bureau-of-education/static/img/pic_hp_bgdgd.png
  88. BIN
      bureau-of-education/static/img/pic_hp_bgsw.png
  89. BIN
      bureau-of-education/static/img/pic_hp_bgxzfw.png
  90. BIN
      bureau-of-education/static/img/pic_hp_tbbg@2x.png
  91. BIN
      bureau-of-education/static/img/pic_mine_tbbg.png
  92. BIN
      bureau-of-education/static/img/pic_yz_wwc.png
  93. BIN
      bureau-of-education/static/img/pic_yz_wwc_1.png
  94. BIN
      bureau-of-education/static/logo.png
  95. BIN
      bureau-of-education/static/tabbar/1.png
  96. BIN
      bureau-of-education/static/tabbar/11.png
  97. BIN
      bureau-of-education/static/tabbar/2.png
  98. BIN
      bureau-of-education/static/tabbar/22.png
  99. BIN
      bureau-of-education/static/tabbar/3.png
  100. BIN
      bureau-of-education/static/tabbar/33.png

+ 16 - 0
bureau-of-education/.gitignore

@@ -0,0 +1,16 @@
+######################################################################
+# Build Tools
+
+/unpackage/*
+/node_modules/*
+
+######################################################################
+# Development Tools
+
+/.idea/*
+/.vscode/*
+/.hbuilderx/*
+
+package-lock.json
+yarn.lock
+

+ 12 - 0
bureau-of-education/1.txt

@@ -0,0 +1,12 @@
+包名:zs.education.app
+
+
+证书别名:__uni__c111cd4
+证书私钥密码:a2C81Btf
+
+MD5: F8:05:70:0D:B3:1F:3B:9D:7C:78:F9:BD:3C:FF:93:09
+SHA1: 0B:11:D9:61:59:C7:80:4B:37:57:18:2E:28:CC:4E:0D:42:DB:8D:C9
+
+高德key:
+
+极光appkey:

BIN
bureau-of-education/6110cd567c430.keystore


+ 32 - 0
bureau-of-education/App.vue

@@ -0,0 +1,32 @@
+<script>
+	export default {
+		// 此处globalData为了演示其作用,不是uView框架的一部分
+		globalData: {
+			username: ''
+		},
+		onLaunch() {
+			// 1.1.0版本之前关于http拦截器代码,已平滑移动到/common/http.interceptor.js中
+			// 注意,需要在/main.js中实例化Vue之后引入如下(详见文档说明):
+			// import httpInterceptor from '@/common/http.interceptor.js'
+			// Vue.use(httpInterceptor, app)
+			// process.env.VUE_APP_PLATFORM 为通过js判断平台名称的方法,结果分别如下:
+			/**
+			 * h5,app-plus(nvue下也为app-plus),mp-weixin,mp-alipay......
+			 */
+		},
+	}
+</script>
+
+<style lang="scss">
+	@import "uview-ui/index.scss";
+	@import "common/demo.scss";
+	page{
+		background: #f3f3f3;
+	}
+	.u-loadmore{
+		padding: 30rpx;
+	}
+	image{
+		display: block;
+	}
+</style>

+ 21 - 0
bureau-of-education/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 www.uviewui.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

BIN
bureau-of-education/bureau-of-education.7z


+ 1087 - 0
bureau-of-education/common/classify.data.js

@@ -0,0 +1,1087 @@
+export default[
+   {
+      "name": "女装",
+      "foods": [
+          {
+            "name": "A字裙",
+            "key": "A字裙",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/1.jpg",
+            "cat": 10
+          },
+          {
+            "name": "T恤",
+            "key": "T恤",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/2.jpg",
+            "cat": 10
+          },
+          {
+            "name": "半身裙",
+            "key": "半身裙",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/3.jpg",
+            "cat": 10
+          },
+          {
+            "name": "衬衫",
+            "key": "衬衫",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/4.jpg",
+            "cat": 10
+          },
+          {
+            "name": "短裙",
+            "key": "短裙",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/5.jpg",
+            "cat": 10
+          },
+          {
+            "name": "阔腿裤",
+            "key": "阔腿裤",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/6.jpg",
+            "cat": 10
+          },
+          {
+            "name": "连衣裙",
+            "key": "连衣裙",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/7.jpg",
+            "cat": 10
+          },
+          {
+            "name": "妈妈装",
+            "key": "妈妈装",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/8.jpg",
+            "cat": 10
+          },
+          {
+            "name": "牛仔裤",
+            "key": "牛仔裤",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/9.jpg",
+            "cat": 10
+          },
+          {
+            "name": "情侣装",
+            "key": "情侣装",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/10.jpg",
+            "cat": 10
+          },
+          {
+            "name": "休闲裤",
+            "key": "休闲裤",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/11.jpg",
+            "cat": 10
+          },
+          {
+            "name": "雪纺衫",
+            "key": "雪纺衫",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/12.jpg",
+            "cat": 10
+          },
+          {
+            "name": "防晒衣",
+            "key": "防晒衣",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/13.jpg",
+            "cat": 10
+          },
+          {
+            "name": "礼服/婚纱",
+            "key": "礼服婚纱",
+            "icon": "https://cdn.uviewui.com/uview/common/classify/1/14.jpg",
+            "cat": 10
+          }
+      ]
+   },
+   {
+    "name": "美食",
+    "foods": [
+        {
+          "name": "火锅",
+          "key": "火锅",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/1.jpg",
+          "cat": 6
+        },
+        {
+          "name": "糕点饼干",
+          "key": "糕点饼干",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/2.jpg",
+          "cat": 6
+        },
+        {
+          "name": "坚果果干",
+          "key": "坚果果干",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/3.jpg",
+          "cat": 6
+        },
+        {
+          "name": "酒类",
+          "key": "酒类",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/4.jpg",
+          "cat": 6
+        },
+        {
+          "name": "辣条",
+          "key": "辣条",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/5.jpg",
+          "cat": 6
+        },
+        {
+          "name": "大礼包",
+          "key": "大礼包",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/6.jpg",
+          "cat": 6
+        },
+        {
+          "name": "精品茗茶",
+          "key": "茶",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/7.jpg",
+          "cat": 6
+        },
+        {
+          "name": "休闲食品",
+          "key": "休闲食品",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/8.jpg",
+          "cat": 6
+        },
+        {
+          "name": "糖果巧克力",
+          "key": "糖果巧克力",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/9.jpg",
+          "cat": 6
+        },
+        {
+          "name": "方便速食",
+          "key": "方便速食",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/10.jpg",
+          "cat": 6
+        },
+        {
+          "name": "营养代餐",
+          "key": "营养代餐",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/11.jpg",
+          "cat": 6
+        },
+        {
+          "name": "粮油副食",
+          "key": "粮油",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/12.jpg",
+          "cat": 6
+        },
+        {
+          "name": "生鲜水果",
+          "key": "水果",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/13.jpg",
+          "cat": 6
+        },
+        {
+          "name": "饮品",
+          "key": "饮品",
+          "icon": "https://cdn.uviewui.com/uview/common/classify/2/14.jpg",
+          "cat": 6
+        }
+        ]
+    },
+    {
+        "name": "美妆",
+        "foods": [
+            {
+                "name": "化妆刷",
+                "key": "化妆刷",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/1.jpg",
+                "cat": 3
+            },
+            {
+                "name": "粉底",
+                "key": "粉底",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/2.jpg",
+                "cat": 3
+            },
+            {
+                "name": "洗发护发",
+                "key": "洗发护发",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/3.jpg",
+                "cat": 3
+            },
+            {
+                "name": "美容工具",
+                "key": "美容工具",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/4.jpg",
+                "cat": 3
+            },
+            {
+                "name": "眼部护理",
+                "key": "眼部护理",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/5.jpg",
+                "cat": 3
+            },
+            {
+                "name": "眉妆",
+                "key": "眉妆",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/6.jpg",
+                "cat": 3
+            },
+            {
+                "name": "卸妆品",
+                "key": "卸妆品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/7.jpg",
+                "cat": 3
+            },
+            {
+                "name": "基础护肤",
+                "key": "基础护肤",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/8.jpg",
+                "cat": 3
+            },
+            {
+                "name": "眼妆",
+                "key": "眼妆",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/9.jpg",
+                "cat": 3
+            },
+            {
+                "name": "唇妆",
+                "key": "唇妆",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/10.jpg",
+                "cat": 3
+            },
+            {
+                "name": "面膜",
+                "key": "面膜",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/11.jpg",
+                "cat": 3
+            },
+            {
+                "name": "沐浴用品",
+                "key": "沐浴用品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/12.jpg",
+                "cat": 3
+            },
+            {
+                "name": "护肤套装",
+                "key": "护肤套装",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/13.jpg",
+                "cat": 3
+            },
+            {
+                "name": "防晒品",
+                "key": "防晒品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/14.jpg",
+                "cat": 3
+            },
+            {
+                "name": "美甲",
+                "key": "美甲",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/3/15.jpg",
+                "cat": 3
+            }
+
+        ]
+    },
+    {
+        "name": "居家日用",
+        "foods": [
+            {
+              "name": "垃圾袋",
+              "key": "垃圾袋",
+              "icon": "https://cdn.uviewui.com/uview/common/classify/4/1.jpg",
+              "cat": 4
+            },
+            {
+                "name": "纸巾",
+                "key": "纸巾",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/2.jpg",
+                "cat": 4
+            },
+            {
+                "name": "驱蚊用品",
+                "key": "驱蚊用品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/3.jpg",
+                "cat": 4
+            },
+            {
+                "name": "收纳神器",
+                "key": "收纳神器",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/4.jpg",
+                "cat": 4
+            },
+            {
+                "name": "厨房用品",
+                "key": "厨房用品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/5.jpg",
+                "cat": 4
+            },
+            {
+                "name": "厨房烹饪",
+                "key": "烹饪",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/6.jpg",
+                "cat": 4
+            },
+            {
+                "name": "衣物晾晒",
+                "key": "衣物晾晒",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/7.jpg",
+                "cat": 4
+            },
+            {
+                "name": "衣物护理",
+                "key": "衣物护理",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/8.jpg",
+                "cat": 4
+            },
+            {
+                "name": "宠物用品",
+                "key": "宠物用品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/9.jpg",
+                "cat": 4
+            },
+            {
+                "name": "医药保健",
+                "key": "医药",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/10.jpg",
+                "cat": 4
+            },
+            {
+                "name": "日用百货",
+                "key": "百货",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/11.jpg",
+                "cat": 4
+            },
+            {
+                "name": "清洁用品",
+                "key": "清洁",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/12.jpg",
+                "cat": 4
+            },
+            {
+                "name": "绿植园艺",
+                "key": "绿植",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/4/13.jpg",
+                "cat": 4
+            }
+        ]
+    },
+    {
+        "name": "男装",
+        "foods": [
+            {
+                "name": "爸爸装",
+                "key": "爸爸装",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/5/1.jpg",
+                "cat": 12
+            },
+            {
+                "name": "牛仔裤",
+                "key": "牛仔裤",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/5/2.jpg",
+                "cat": 12
+            },
+            {
+                "name": "衬衫",
+                "key": "衬衫",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/5/3.jpg",
+                "cat": 12
+            },
+            {
+                "name": "休闲裤",
+                "key": "休闲裤",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/5/4.jpg",
+                "cat": 12
+            },
+            {
+                "name": "外套",
+                "key": "外套",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/5/5.jpg",
+                "cat": 12
+            },
+            {
+                "name": "T恤",
+                "key": "T恤",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/5/6.jpg",
+                "cat": 12
+            },
+            {
+                "name": "套装",
+                "key": "套装",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/5/7.jpg",
+                "cat": 12
+            },
+            {
+                "name": "运动裤",
+                "key": "运动裤",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/5/8.jpg",
+                "cat": 12
+            },
+            {
+                "name": "马甲/背心",
+                "key": "马甲背心",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/5/9.jpg",
+                "cat": 12
+            },
+            {
+                "name": "POLO衫",
+                "key": "POLO衫",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/5/10.jpg",
+                "cat": 12
+            },
+            {
+                "name": "商务装",
+                "key": "商务装",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/5/11.jpg",
+                "cat": 12
+            }
+        ]
+    },
+    {
+        "name": "鞋品",
+        "foods": [
+            {
+                "name": "单鞋",
+                "key": "单鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/6/1.jpg",
+                "cat": 5
+            },
+            {
+                "name": "皮鞋",
+                "key": "皮鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/6/2.jpg",
+                "cat": 5
+            },
+            {
+                "name": "帆布鞋",
+                "key": "帆布鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/6/3.jpg",
+                "cat": 5
+            },
+            {
+                "name": "北京老布鞋",
+                "key": "北京老布鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/6/4.jpg",
+                "cat": 5
+            },
+            {
+                "name": "运动鞋",
+                "key": "运动鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/6/5.jpg",
+                "cat": 5
+            },
+            {
+                "name": "拖鞋",
+                "key": "拖鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/6/6.jpg",
+                "cat": 5
+            },
+            {
+                "name": "凉鞋",
+                "key": "凉鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/6/7.jpg",
+                "cat": 5
+            },
+            {
+                "name": "休闲鞋",
+                "key": "休闲鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/6/8.jpg",
+                "cat": 5
+            },
+            {
+                "name": "高跟鞋",
+                "key": "高跟鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/6/9.jpg",
+                "cat": 5
+            },
+            {
+                "name": "老人鞋",
+                "key": "老人鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/6/10.jpg",
+                "cat": 5
+            },
+            {
+                "name": "懒人鞋",
+                "key": "懒人鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/6/11.jpg",
+                "cat": 5
+            }
+        ]
+    },
+    {
+        "name": "数码家电",
+        "foods": [
+            {
+                "name": "数据线",
+                "key": "数据线",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/1.jpg",
+                "cat": 8
+            },
+            {
+                "name": "耳机",
+                "key": "耳机",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/2.jpg",
+                "cat": 8
+            },
+            {
+                "name": "生活家电",
+                "key": "家电",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/3.jpg",
+                "cat": 8
+            },
+            {
+                "name": "电风扇",
+                "key": "电风扇",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/4.jpg",
+                "cat": 8
+            },
+            {
+                "name": "电吹风",
+                "key": "电吹风",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/5.jpg",
+                "cat": 8
+            },
+            {
+                "name": "手机壳",
+                "key": "手机壳",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/6.jpg",
+                "cat": 8
+            },
+            {
+                "name": "榨汁机",
+                "key": "榨汁机",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/7.jpg",
+                "cat": 8
+            },
+            {
+                "name": "小家电",
+                "key": "小家电",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/8.jpg",
+                "cat": 8
+            },
+            {
+                "name": "数码电子",
+                "key": "数码",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/9.jpg",
+                "cat": 8
+            },
+            {
+                "name": "电饭锅",
+                "key": "电饭锅",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/10.jpg",
+                "cat": 8
+            },
+            {
+                "name": "手机支架",
+                "key": "手机支架",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/11.jpg",
+                "cat": 8
+            },
+            {
+                "name": "剃须刀",
+                "key": "剃须刀",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/12.jpg",
+                "cat": 8
+            },
+            {
+                "name": "充电宝",
+                "key": "充电宝",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/13.jpg",
+                "cat": 8
+            },
+            {
+                "name": "手机配件",
+                "key": "手机配件",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/7/14.jpg",
+                "cat": 8
+            }
+        ]
+    },
+    {
+        "name": "母婴",
+        "foods": [
+            {
+              "name": "婴童服饰",
+              "key": "衣服",
+              "icon": "https://cdn.uviewui.com/uview/common/classify/8/1.jpg",
+              "cat": 2  
+            },
+            {
+                "name": "玩具乐器",
+                "key": "玩具乐器",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/2.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "尿不湿",
+                "key": "尿不湿",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/3.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "安抚牙胶",
+                "key": "安抚牙胶",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/4.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "奶瓶奶嘴",
+                "key": "奶瓶奶嘴",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/5.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "孕妈用品",
+                "key": "孕妈用品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/6.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "宝宝用品",
+                "key": "宝宝用品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/7.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "婴童湿巾",
+                "key": "湿巾",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/8.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "喂养洗护",
+                "key": "洗护",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/9.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "婴童鞋靴",
+                "key": "童鞋",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/10.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "口水巾",
+                "key": "口水巾",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/11.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "营养辅食",
+                "key": "营养",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/12.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "婴幼书籍",
+                "key": "书籍",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/13.jpg",
+                "cat": 2  
+            },
+            {
+                "name": "婴儿车",
+                "key": "婴儿车",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/8/14.jpg",
+                "cat": 2  
+            }
+        ]
+    },
+    {
+        "name": "箱包",
+        "foods": [
+            {
+                "name": "单肩包",
+                "key": "单肩包",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/9/1.jpg",
+                "cat": 0
+            },
+            {
+                "name": "斜挎包",
+                "key": "斜挎包",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/9/2.jpg",
+                "cat": 0
+            },
+            {
+                "name": "女包",
+                "key": "女包",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/9/3.jpg",
+                "cat": 0
+            },
+            {
+                "name": "男包",
+                "key": "男包",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/9/4.jpg",
+                "cat": 0
+            },
+            {
+                "name": "双肩包",
+                "key": "双肩包",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/9/5.jpg",
+                "cat": 0
+            },
+            {
+                "name": "小方包",
+                "key": "小方包",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/9/6.jpg",
+                "cat": 0
+            },
+            {
+                "name": "钱包",
+                "key": "钱包",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/9/7.jpg",
+                "cat": 0
+            },
+            {
+                "name": "旅行箱包",
+                "key": "旅行箱包",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/9/8.jpg",
+                "cat": 0
+            },
+            {
+                "name": "零钱包",
+                "key": "零钱包",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/9/9.jpg",
+                "cat": 0
+            },
+            {
+                "name": "手提包",
+                "key": "手提包",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/9/10.jpg",
+                "cat": 0
+            },
+            {
+                "name": "胸包",
+                "key": "胸包",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/9/11.jpg",
+                "cat": 0
+            }
+        ]
+    },
+    {
+        "name": "内衣",
+        "foods": [
+            {
+                "name": "袜子",
+                "key": "袜子",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/10/1.jpg",
+                "cat": 11
+            },
+            {
+                "name": "吊带背心",
+                "key": "吊带背心",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/10/2.jpg",
+                "cat": 11
+            },
+            {
+                "name": "抹胸",
+                "key": "抹胸",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/10/3.jpg",
+                "cat": 11
+            },
+            {
+                "name": "内裤",
+                "key": "内裤",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/10/4.jpg",
+                "cat": 11
+            },
+            {
+                "name": "文胸",
+                "key": "文胸",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/10/5.jpg",
+                "cat": 11
+            },
+            {
+                "name": "文胸套装",
+                "key": "文胸套装",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/10/6.jpg",
+                "cat": 11
+            },
+            {
+                "name": "打底塑身",
+                "key": "打底塑身",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/10/7.jpg",
+                "cat": 11
+            },
+            {
+                "name": "家居服",
+                "key": "家居服",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/10/8.jpg",
+                "cat": 11
+            },
+            {
+                "name": "船袜",
+                "key": "船袜",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/10/9.jpg",
+                "cat": 11
+            },
+            {
+                "name": "情侣睡衣",
+                "key": "情侣睡衣",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/10/10.jpg",
+                "cat": 11
+            },
+            {
+                "name": "丝袜",
+                "key": "丝袜",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/10/11.jpg",
+                "cat": 11
+            }
+        ]
+    },
+    {
+        "name": "文娱车品",
+        "foods": [
+            {
+                "name": "车市车品",
+                "key": "车市车品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/11/1.jpg",
+                "cat": 7
+            },
+            {
+                "name": "办公文具",
+                "key": "办公文具",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/11/2.jpg",
+                "cat": 7
+            },
+            {
+                "name": "考试必备",
+                "key": "考试必备",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/11/3.jpg",
+                "cat": 7
+            },
+            {
+                "name": "笔记本",
+                "key": "笔记本",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/11/4.jpg",
+                "cat": 7
+            },
+            {
+                "name": "艺术礼品",
+                "key": "礼品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/11/5.jpg",
+                "cat": 7
+            },
+            {
+                "name": "书写工具",
+                "key": "书写工具",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/11/6.jpg",
+                "cat": 7
+            },
+            {
+                "name": "车载电器",
+                "key": "车载电器",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/11/7.jpg",
+                "cat": 7
+            },
+            {
+                "name": "图书音像",
+                "key": "图书音像",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/11/8.jpg",
+                "cat": 7
+            },
+            {
+                "name": "画具画材",
+                "key": "画具画材",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/11/9.jpg",
+                "cat": 7
+            }
+        ]
+    },
+    {
+        "name": "配饰",
+        "foods": [
+            {
+                "name": "太阳镜",
+                "key": "太阳镜",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/12/1.jpg",
+                "cat": 0
+            },
+            {
+                "name": "皮带",
+                "key": "皮带",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/12/2.jpg",
+                "cat": 0
+            },
+            {
+                "name": "棒球帽",
+                "key": "棒球帽",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/12/3.jpg",
+                "cat": 0
+            },
+            {
+                "name": "手表",
+                "key": "手表",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/12/4.jpg",
+                "cat": 0
+            },
+            {
+                "name": "发饰",
+                "key": "发饰",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/12/5.jpg",
+                "cat": 0
+            },
+            {
+                "name": "项链",
+                "key": "项链",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/12/6.jpg",
+                "cat": 0
+            },
+            {
+                "name": "手饰",
+                "key": "手饰",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/12/7.jpg",
+                "cat": 0
+            },
+            {
+                "name": "耳环",
+                "key": "耳环",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/12/8.jpg",
+                "cat": 0
+            },
+            {
+                "name": "帽子丝巾",
+                "key": "帽子丝巾",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/12/9.jpg",
+                "cat": 0
+            },
+            {
+                "name": "眼镜墨镜",
+                "key": "眼镜墨镜",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/12/10.jpg",
+                "cat": 0
+            },
+            {
+                "name": "发带发箍",
+                "key": "发带发箍",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/12/11.jpg",
+                "cat": 0
+            }
+        ]
+    },
+    {
+        "name": "家装家纺",
+        "foods": [
+            {
+                "name": "家居饰品",
+                "key": "家居饰品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/1.jpg",
+                "cat": 0
+            },
+            {
+                "name": "凉席",
+                "key": "凉席",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/2.jpg",
+                "cat": 0
+            },
+            {
+                "name": "背枕靠枕",
+                "key": "靠枕",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/3.jpg",
+                "cat": 0
+            },
+            {
+                "name": "床上用品",
+                "key": "床上用品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/4.jpg",
+                "cat": 0
+            },
+            {
+                "name": "摆件",
+                "key": "摆件",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/5.jpg",
+                "cat": 0
+            },
+            {
+                "name": "四件套",
+                "key": "四件套",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/6.jpg",
+                "cat": 0
+            },
+            {
+                "name": "装饰品",
+                "key": "装饰品",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/7.jpg",
+                "cat": 0
+            },
+            {
+                "name": "卫浴用品",
+                "key": "卫浴",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/8.jpg",
+                "cat": 0
+            },
+            {
+                "name": "家居家装",
+                "key": "家具",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/9.jpg",
+                "cat": 0
+            },
+            {
+                "name": "蚊帐",
+                "key": "蚊帐",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/10.jpg",
+                "cat": 0
+            },
+            {
+                "name": "墙纸贴纸",
+                "key": "墙纸",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/11.jpg",
+                "cat": 0
+            },
+            {
+                "name": "空调被",
+                "key": "空调被",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/13/12.jpg",
+                "cat": 0
+            }
+        ]
+    },
+    {
+        "name": "户外运动",
+        "foods": [
+            {
+                "name": "游泳装备",
+                "key": "游泳",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/14/1.jpg",
+                "cat": 0
+            },
+            {
+                "name": "泳镜",
+                "key": "泳镜",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/14/2.jpg",
+                "cat": 0
+            },
+            {
+                "name": "户外装备",
+                "key": "户外",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/14/3.jpg",
+                "cat": 0
+            },
+            {
+                "name": "健身服饰",
+                "key": "健身",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/14/4.jpg",
+                "cat": 0
+            },
+            {
+                "name": "泳衣",
+                "key": "泳衣",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/14/5.jpg",
+                "cat": 0
+            },
+            {
+                "name": "瑜伽垫",
+                "key": "瑜伽垫",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/14/6.jpg",
+                "cat": 0
+            },
+            {
+                "name": "瑜伽用品",
+                "key": "瑜伽",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/14/7.jpg",
+                "cat": 0
+            },
+            {
+                "name": "健身装备",
+                "key": "健身",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/14/8.jpg",
+                "cat": 0
+            },
+            {
+                "name": "球迷用品",
+                "key": "球迷",
+                "icon": "https://cdn.uviewui.com/uview/common/classify/14/9.jpg",
+                "cat": 0
+            }
+        ]
+    }
+]

+ 100 - 0
bureau-of-education/common/demo.scss

@@ -0,0 +1,100 @@
+/* #ifndef APP-NVUE */
+view,
+text {
+	box-sizing: border-box;
+}
+/* #endif */
+
+/* start--演示页面使用的统一样式--start */
+
+uni-page-body {
+	height: 100%;
+}
+page {
+	height: calc(100% - var(--status-bar-height));
+	background: #fff !important;
+}
+
+.u-demo {
+	padding: 25px 20px;
+}
+
+.u-demo-wrap {
+	border-width: 1px;
+	border-color: #ddd;
+	border-style: dashed;
+	background-color: rgb(250, 250, 250);
+	padding: 20px 10px;
+	border-radius: 3px;
+}
+
+.u-demo-area {
+	text-align: center;
+}
+
+.u-no-demo-here {
+	color: $u-tips-color;
+	font-size: 13px;
+}
+
+.u-demo-result-line {
+	border-width: 1px;
+	border-color: #ddd;
+	border-style: dashed;
+	padding: 5px 20px;
+	margin-top: 30px;
+	border-radius: 5px;
+	background-color: rgb(240, 240, 240);
+	color: $u-content-color;
+	font-size: 16px;
+	/* #ifndef APP-NVUE */
+	word-break: break-word;
+	display: inline-block;
+	/* #endif */
+	text-align: left;
+	
+}
+
+.u-demo-title,
+.u-config-title {
+	text-align: center;
+	font-size: 16px;
+	font-weight: bold;
+	margin-bottom: 20px;
+}
+
+.u-config-item {
+	margin-top: 25px;
+}
+
+.u-config-title {
+	margin-top: 20px;
+	padding-bottom: 5px;
+}
+
+.u-item-title {
+	position: relative;
+	font-size: 15px;
+	padding-left: 8px;
+	line-height: 1;
+	margin-bottom: 11px;
+}
+
+.u-item-title:after {
+	position: absolute;
+	width: 4px;
+	top: -1px;
+	height: 16px;
+	/* #ifndef APP-NVUE */
+	content: '';
+	/* #endif */
+	left: 0;
+	border-radius: 10px;
+	background-color: $u-content-color;
+}
+/* end--演示页面使用的统一样式--end */
+
+.no-data {
+		text-align: center;
+		padding: 40rpx 0;
+	}

+ 22 - 0
bureau-of-education/common/http.api.js

@@ -0,0 +1,22 @@
+// 如果没有通过拦截器配置域名的话,可以在这里写上完整的URL(加上域名部分)
+let hotSearchUrl = '/ebapi/store_api/hot_search';
+let indexUrl = '/ebapi/public_api/index';
+
+// 此处第二个参数vm,就是我们在页面使用的this,你可以通过vm获取vuex等操作,更多内容详见uView对拦截器的介绍部分:
+// https://uviewui.com/js/http.html#%E4%BD%95%E8%B0%93%E8%AF%B7%E6%B1%82%E6%8B%A6%E6%88%AA%EF%BC%9F
+const install = (Vue, vm) => {
+	// 此处没有使用传入的params参数
+	let getSearch = (params = {}) => vm.$u.get(hotSearchUrl, {
+		id: 2
+	});
+	
+	// 此处使用了传入的params参数,一切自定义即可
+	let getInfo = (params = {}) => vm.$u.post(indexUrl, params);
+	
+	// 将各个定义的接口名称,统一放进对象挂载到vm.$u.api(因为vm就是this,也即this.$u.api)下
+	vm.$u.api = {getSearch, getInfo};
+}
+
+export default {
+	install
+}

+ 62 - 0
bureau-of-education/common/http.interceptor.js

@@ -0,0 +1,62 @@
+// 这里的vm,就是我们在vue文件里面的this,所以我们能在这里获取vuex的变量,比如存放在里面的token
+// 同时,我们也可以在此使用getApp().globalData,如果你把token放在getApp().globalData的话,也是可以使用的
+const install = (Vue, vm) => {
+	Vue.prototype.$u.http.setConfig({
+		// baseUrl: 'http://192.168.101.110:8090',
+		baseUrl: 'https://qsjyoa.qs163.cn/prod-api',
+		// baseUrl: 'http://118.178.139.79:5000/prod-api',
+		// baseUrl: 'https://test.xinxiny.com:8100',
+		// 如果将此值设置为true,拦截回调中将会返回服务端返回的所有数据response,而不是response.data
+		// 设置为true后,就需要在this.$u.http.interceptor.response进行多一次的判断,请打印查看具体值
+		// originalData: true, 
+		// 设置自定义头部content-type
+		// header: {
+		// 	'content-type': 'xxx'
+		// }
+	});
+	// 请求拦截,配置Token等参数
+	Vue.prototype.$u.http.interceptor.request = (config) => {
+		config.header.Authorization = uni.getStorageSync('authToken')
+		
+		// 方式一,存放在vuex的token,假设使用了uView封装的vuex方式,见:https://uviewui.com/components/globalVariable.html
+		// config.header.token = vm.token;
+		
+		// 方式二,如果没有使用uView封装的vuex方法,那么需要使用$store.state获取
+		// config.header.token = vm.$store.state.token;
+		
+		// 方式三,如果token放在了globalData,通过getApp().globalData获取
+		// config.header.token = getApp().globalData.username;
+		
+		// 方式四,如果token放在了Storage本地存储中,拦截是每次请求都执行的,所以哪怕您重新登录修改了Storage,下一次的请求将会是最新值
+		// const token = uni.getStorageSync('token');
+		// config.header.token = token;
+		
+		return config; 
+	}
+	// 响应拦截,判断状态码是否通过
+	Vue.prototype.$u.http.interceptor.response = (res) => {
+		// 如果把originalData设置为了true,这里得到将会是服务器返回的所有的原始数据
+		// 判断可能变成了res.statueCode,或者res.data.code之类的,请打印查看结果
+		if(res.code == 200) {
+			// 如果把originalData设置为了true,这里return回什么,this.$u.post的then回调中就会得到什么
+			return res
+		} else if (res.code == 401) {
+			uni.reLaunch({
+				url: '/pages/tabbar/login/index'
+			})
+			return false
+		} else if (res.code == 500) {
+			uni.showToast({
+				icon: 'none',
+				title: res.msg
+			})
+			return res
+		} else {
+			return res
+		}
+	}
+}
+
+export default {
+	install
+}

+ 585 - 0
bureau-of-education/common/index.list.js

@@ -0,0 +1,585 @@
+module.exports = {
+	list: [{
+			"letter": "A",
+			"data": [{
+					"name": "阿拉斯加",
+					"mobile": "13588889999",
+					"keyword": "阿拉斯加ABA13588889999"
+				},
+				{
+					"name": "阿克苏",
+					"mobile": "0551-4386721",
+					"keyword": "阿克苏AKESU0551-4386721"
+				},
+				{
+					"name": "阿拉善",
+					"mobile": "4008009100",
+					"keyword": "阿拉善ALASHAN4008009100"
+				},
+				{
+					"name": "阿勒泰",
+					"mobile": "13588889999",
+					"keyword": "阿勒泰ALETAI13588889999"
+				},
+				{
+					"name": "阿里",
+					"mobile": "13588889999",
+					"keyword": "阿里ALI13588889999"
+				},
+				{
+					"name": "安阳",
+					"mobile": "13588889999",
+					"keyword": "13588889999安阳ANYANG"
+				}
+			]
+		},
+		{
+			"letter": "B",
+			"data": [{
+					"name": "白城",
+					"mobile": "该主子没有留电话~",
+					"keyword": "白城BAICHENG"
+				},
+				{
+					"name": "白山",
+					"mobile": "13588889999",
+					"keyword": "白山BAISHAN13588889999"
+				},
+				{
+					"name": "白银",
+					"mobile": "13588889999",
+					"keyword": "白银BAIYIN13588889999"
+				},
+				{
+					"name": "保定",
+					"mobile": "13588889999",
+					"keyword": "保定BAODING13588889999"
+				}
+			]
+		},
+		{
+			"letter": "C",
+			"data": [{
+					"name": "沧州",
+					"mobile": "13588889999",
+					"keyword": "沧州CANGZHOU13588889999"
+				},
+				{
+					"name": "长春",
+					"mobile": "13588889999",
+					"keyword": "长春CHANGCHUN13588889999"
+				}
+			]
+		},
+		{
+			"letter": "D",
+			"data": [{
+					"name": "大理",
+					"mobile": "13588889999",
+					"keyword": "大理DALI13588889999"
+				},
+				{
+					"name": "大连",
+					"mobile": "13588889999",
+					"keyword": "大连DALIAN13588889999"
+				}
+			]
+		},
+		{
+			"letter": "E",
+			"data": [{
+					"name": "鄂尔多斯",
+					"mobile": "13588889999",
+					"keyword": "鄂尔多斯EERDUOSI13588889999"
+				},
+				{
+					"name": "恩施",
+					"mobile": "13588889999",
+					"keyword": "恩施ENSHI13588889999"
+				},
+				{
+					"name": "鄂州",
+					"mobile": "13588889999",
+					"keyword": "鄂州EZHOU13588889999"
+				}
+			]
+		},
+		{
+			"letter": "F",
+			"data": [{
+					"name": "防城港",
+					"mobile": "该主子没有留电话~",
+					"keyword": "防城港FANGCHENGGANG"
+				},
+				{
+					"name": "抚顺",
+					"mobile": "13588889999",
+					"keyword": "抚顺FUSHUN13588889999"
+				},
+				{
+					"name": "阜新",
+					"mobile": "13588889999",
+					"keyword": "阜新FUXIN13588889999"
+				},
+				{
+					"name": "阜阳",
+					"mobile": "13588889999",
+					"keyword": "阜阳FUYANG13588889999"
+				},
+				{
+					"name": "抚州",
+					"mobile": "13588889999",
+					"keyword": "抚州FUZHOU13588889999"
+				},
+				{
+					"name": "福州",
+					"mobile": "13588889999",
+					"keyword": "福州FUZHOU13588889999"
+				}
+			]
+		},
+		{
+			"letter": "G",
+			"data": [{
+					"name": "甘南",
+					"mobile": "13588889999",
+					"keyword": "甘南GANNAN13588889999"
+				},
+				{
+					"name": "赣州",
+					"mobile": "13588889999",
+					"keyword": "赣州GANZHOU13588889999"
+				},
+				{
+					"name": "甘孜",
+					"mobile": "13588889999",
+					"keyword": "甘孜GANZI13588889999"
+				}
+			]
+		},
+		{
+			"letter": "H",
+			"data": [{
+					"name": "哈尔滨",
+					"mobile": "13588889999",
+					"keyword": "哈尔滨HAERBIN13588889999"
+				},
+				{
+					"name": "海北",
+					"mobile": "13588889999",
+					"keyword": "海北HAIBEI13588889999"
+				},
+				{
+					"name": "海东",
+					"mobile": "13588889999",
+					"keyword": "海东HAIDONG13588889999"
+				},
+				{
+					"name": "海口",
+					"mobile": "13588889999",
+					"keyword": "海口HAIKOU13588889999"
+				}
+			]
+		},
+		{
+			"letter": "I",
+			"data": [{
+				"name": "ice",
+				"mobile": "13588889999",
+				"keyword": "佳木斯JIAMUSI13588889999"
+			}]
+		},
+		{
+			"letter": "J",
+			"data": [{
+					"name": "佳木斯",
+					"mobile": "13588889999",
+					"keyword": "佳木斯JIAMUSI13588889999"
+				},
+				{
+					"name": "吉安",
+					"mobile": "13588889999",
+					"keyword": "吉安JIAN13588889999"
+				},
+				{
+					"name": "江门",
+					"mobile": "13588889999",
+					"keyword": "江门JIANGMEN13588889999"
+				}
+			]
+		},
+		{
+			"letter": "K",
+			"data": [{
+					"name": "开封",
+					"mobile": "13588889999",
+					"keyword": "开封KAIFENG13588889999"
+				},
+				{
+					"name": "喀什",
+					"mobile": "13588889999",
+					"keyword": "喀什KASHI13588889999"
+				},
+				{
+					"name": "克拉玛依",
+					"mobile": "13588889999",
+					"keyword": "克拉玛依KELAMAYI13588889999"
+				}
+			]
+		},
+		{
+			"letter": "L",
+			"data": [{
+					"name": "来宾",
+					"mobile": "13588889999",
+					"keyword": "来宾LAIBIN13588889999"
+				},
+				{
+					"name": "兰州",
+					"mobile": "13588889999",
+					"keyword": "兰州LANZHOU13588889999"
+				},
+				{
+					"name": "拉萨",
+					"mobile": "13588889999",
+					"keyword": "拉萨LASA13588889999"
+				},
+				{
+					"name": "乐山",
+					"mobile": "13588889999",
+					"keyword": "乐山LESHAN13588889999"
+				},
+				{
+					"name": "凉山",
+					"mobile": "13588889999",
+					"keyword": "凉山LIANGSHAN13588889999"
+				},
+				{
+					"name": "连云港",
+					"mobile": "13588889999",
+					"keyword": "连云港LIANYUNGANG13588889999"
+				},
+				{
+					"name": "聊城",
+					"mobile": "18322223333",
+					"keyword": "聊城LIAOCHENG18322223333"
+				},
+				{
+					"name": "辽阳",
+					"mobile": "18322223333",
+					"keyword": "辽阳LIAOYANG18322223333"
+				},
+				{
+					"name": "辽源",
+					"mobile": "18322223333",
+					"keyword": "辽源LIAOYUAN18322223333"
+				},
+				{
+					"name": "丽江",
+					"mobile": "18322223333",
+					"keyword": "丽江LIJIANG18322223333"
+				},
+				{
+					"name": "临沧",
+					"mobile": "18322223333",
+					"keyword": "临沧LINCANG18322223333"
+				},
+				{
+					"name": "临汾",
+					"mobile": "18322223333",
+					"keyword": "临汾LINFEN18322223333"
+				},
+				{
+					"name": "临夏",
+					"mobile": "18322223333",
+					"keyword": "临夏LINXIA18322223333"
+				},
+				{
+					"name": "临沂",
+					"mobile": "18322223333",
+					"keyword": "临沂LINYI18322223333"
+				},
+				{
+					"name": "林芝",
+					"mobile": "18322223333",
+					"keyword": "林芝LINZHI18322223333"
+				},
+				{
+					"name": "丽水",
+					"mobile": "18322223333",
+					"keyword": "丽水LISHUI18322223333"
+				}
+			]
+		},
+		{
+			"letter": "M",
+			"data": [{
+					"name": "眉山",
+					"mobile": "15544448888",
+					"keyword": "眉山MEISHAN15544448888"
+				},
+				{
+					"name": "梅州",
+					"mobile": "15544448888",
+					"keyword": "梅州MEIZHOU15544448888"
+				},
+				{
+					"name": "绵阳",
+					"mobile": "15544448888",
+					"keyword": "绵阳MIANYANG15544448888"
+				},
+				{
+					"name": "牡丹江",
+					"mobile": "15544448888",
+					"keyword": "牡丹江MUDANJIANG15544448888"
+				}
+			]
+		},
+		{
+			"letter": "N",
+			"data": [{
+					"name": "南昌",
+					"mobile": "15544448888",
+					"keyword": "南昌NANCHANG15544448888"
+				},
+				{
+					"name": "南充",
+					"mobile": "15544448888",
+					"keyword": "南充NANCHONG15544448888"
+				},
+				{
+					"name": "南京",
+					"mobile": "15544448888",
+					"keyword": "南京NANJING15544448888"
+				},
+				{
+					"name": "南宁",
+					"mobile": "15544448888",
+					"keyword": "南宁NANNING15544448888"
+				},
+				{
+					"name": "南平",
+					"mobile": "15544448888",
+					"keyword": "南平NANPING15544448888"
+				}
+			]
+		},
+		{
+			"letter": "O",
+			"data": [{
+				"name": "欧阳",
+				"mobile": "15544448888",
+				"keyword": "欧阳ouyang15544448888"
+			}]
+		},
+		{
+			"letter": "P",
+			"data": [{
+					"name": "盘锦",
+					"mobile": "15544448888",
+					"keyword": "盘锦PANJIN15544448888"
+				},
+				{
+					"name": "攀枝花",
+					"mobile": "15544448888",
+					"keyword": "攀枝花PANZHIHUA15544448888"
+				},
+				{
+					"name": "平顶山",
+					"mobile": "15544448888",
+					"keyword": "平顶山PINGDINGSHAN15544448888"
+				},
+				{
+					"name": "平凉",
+					"mobile": "15544448888",
+					"keyword": "平凉PINGLIANG15544448888"
+				},
+				{
+					"name": "萍乡",
+					"mobile": "15544448888",
+					"keyword": "萍乡PINGXIANG15544448888"
+				},
+				{
+					"name": "普洱",
+					"mobile": "15544448888",
+					"keyword": "普洱PUER15544448888"
+				},
+				{
+					"name": "莆田",
+					"mobile": "15544448888",
+					"keyword": "莆田PUTIAN15544448888"
+				},
+				{
+					"name": "濮阳",
+					"mobile": "15544448888",
+					"keyword": "濮阳PUYANG15544448888"
+				}
+			]
+		},
+		{
+			"letter": "Q",
+			"data": [{
+					"name": "黔东南",
+					"mobile": "15544448888",
+					"keyword": "黔东南QIANDONGNAN15544448888"
+				},
+				{
+					"name": "黔南",
+					"mobile": "15544448888",
+					"keyword": "黔南QIANNAN15544448888"
+				},
+				{
+					"name": "黔西南",
+					"mobile": "15544448888",
+					"keyword": "黔西南QIANXINAN15544448888"
+				}
+			]
+		},
+		{
+			"letter": "R",
+			"data": [{
+					"name": "日喀则",
+					"mobile": "15544448888",
+					"keyword": "日喀则RIKAZE15544448888"
+				},
+				{
+					"name": "日照",
+					"mobile": "15544448888",
+					"keyword": "日照RIZHAO15544448888"
+				}
+			]
+		},
+		{
+			"letter": "S",
+			"data": [{
+					"name": "三门峡",
+					"mobile": "15544448888",
+					"keyword": "三门峡SANMENXIA15544448888"
+				},
+				{
+					"name": "三明",
+					"mobile": "15544448888",
+					"keyword": "三明SANMING15544448888"
+				},
+				{
+					"name": "三沙",
+					"mobile": "15544448888",
+					"keyword": "三沙SANSHA15544448888"
+				}
+			]
+		},
+		{
+			"letter": "T",
+			"data": [{
+					"name": "塔城",
+					"mobile": "15544448888",
+					"keyword": "塔城TACHENG15544448888"
+				},
+				{
+					"name": "漯河",
+					"mobile": "15544448888",
+					"keyword": "漯河TAHE15544448888"
+				},
+				{
+					"name": "泰安",
+					"mobile": "15544448888",
+					"keyword": "泰安TAIAN15544448888"
+				}
+			]
+		},
+		{
+			"letter": "W",
+			"data": [{
+					"name": "潍坊",
+					"mobile": "15544448888",
+					"keyword": "潍坊WEIFANG15544448888"
+				},
+				{
+					"name": "威海",
+					"mobile": "15544448888",
+					"keyword": "威海WEIHAI15544448888"
+				},
+				{
+					"name": "渭南",
+					"mobile": "15544448888",
+					"keyword": "渭南WEINAN15544448888"
+				},
+				{
+					"name": "文山",
+					"mobile": "15544448888",
+					"keyword": "文山WENSHAN15544448888"
+				}
+			]
+		},
+		{
+			"letter": "X",
+			"data": [{
+					"name": "厦门",
+					"mobile": "15544448888",
+					"keyword": "厦门XIAMEN15544448888"
+				},
+				{
+					"name": "西安",
+					"mobile": "15544448888",
+					"keyword": "西安XIAN15544448888"
+				},
+				{
+					"name": "湘潭",
+					"mobile": "15544448888",
+					"keyword": "湘潭XIANGTAN15544448888"
+				}
+			]
+		},
+		{
+			"letter": "Y",
+			"data": [{
+					"name": "雅安",
+					"mobile": "15544448888",
+					"keyword": "雅安YAAN15544448888"
+				},
+				{
+					"name": "延安",
+					"mobile": "15544448888",
+					"keyword": "延安YANAN15544448888"
+				},
+				{
+					"name": "延边",
+					"mobile": "15544448888",
+					"keyword": "延边YANBIAN15544448888"
+				},
+				{
+					"name": "盐城",
+					"mobile": "15544448888",
+					"keyword": "盐城YANCHENG15544448888"
+				}
+			]
+		},
+		{
+			"letter": "Z",
+			"data": [{
+					"name": "枣庄",
+					"mobile": "15544448888",
+					"keyword": "枣庄ZAOZHUANG15544448888"
+				},
+				{
+					"name": "张家界",
+					"mobile": "15544448888",
+					"keyword": "张家界ZHANGJIAJIE15544448888"
+				},
+				{
+					"name": "张家口",
+					"mobile": "15544448888",
+					"keyword": "张家口ZHANGJIAKOU15544448888"
+				}
+			]
+		},
+		{
+			"letter": "#",
+			"data": [{
+				"name": "其他.",
+				"mobile": "16666666666",
+				"keyword": "echo16666666666"
+			}]
+		}
+	]
+}

+ 21 - 0
bureau-of-education/common/locales/en.js

@@ -0,0 +1,21 @@
+export default {
+	// 可以以页面为单位来写,比如首页的内容,写在index字段,个人中心写在center,共同部分写在common部分
+	components: {
+		desc: 'Numerous components cover the various requirements of the development process, and the components are rich in functions and compatible with multiple terminals. Let you integrate quickly, out of the box'
+	},
+	js: {
+		desc: 'Numerous intimate gadgets are a weapon that you can call upon during the development process, allowing you to dart in your hand and pierce the Yang with a hundred steps'
+	},
+	template: {
+		desc: 'Collection of many commonly used pages and layouts, reducing the repetitive work of developers, allowing you to focus on logic and get twice the result with half the effort'
+	},
+	nav: {
+		components: 'Components',
+		js: 'JS',
+		template: 'Template'
+	},
+	common: {
+		intro: 'UI framework for rapid development of multiple platforms',
+		title: 'uView UI',
+	},
+}

+ 21 - 0
bureau-of-education/common/locales/zh.js

@@ -0,0 +1,21 @@
+export default {
+	// 可以以页面为单位来写,比如首页的内容,写在index字段,个人中心写在center,共同部分写在common部分
+	components: {
+		desc: '众多组件覆盖开发过程的各个需求,组件功能丰富,多端兼容。让你快速集成,开箱即用'
+	},
+	js: {
+		desc: '众多的贴心小工具,是你开发过程中召之即来的利器,让你飞镖在手,百步穿杨'
+	},
+	template: {
+		desc: '收集众多的常用页面和布局,减少开发者的重复工作,让你专注逻辑,事半功倍'
+	},
+	nav: {
+		components: '组件',
+		js: '工具',
+		template: '模板'
+	},
+	common: {
+		intro: '多平台快速开发的UI框架',
+		title: 'uView UI',
+	},
+}

Різницю між файлами не показано, бо вона завелика
+ 5 - 0
bureau-of-education/common/vue-i18n.min.js


BIN
bureau-of-education/components/.DS_Store


Різницю між файлами не показано, бо вона завелика
+ 3 - 0
bureau-of-education/components/pretty-uploadFile/pretty-uploadFile.css


+ 172 - 0
bureau-of-education/components/pretty-uploadFile/pretty-uploadFile.vue

@@ -0,0 +1,172 @@
+<template>
+	<view>
+		<!-- 上传文件 begin -->
+		<view class="display_flex">
+			<view class="img_list" v-for="(item,index) in fileList" :key="index">
+				<image class="img_item" :src="item.url" @click="preview(item.url)" mode="aspectFill" v-if="item.book == 'img'"></image>
+				<view class="upload" @click="prePdf(item.id)" v-else>
+					<text class="iconfont iconpdf" style="color:#FF6969;font-size:44px"></text>
+				</view>
+				<view class="iconfont deleteicon iconshanchu2" @click.stop="delteFile(index)"></view>
+			</view>
+			<view class="upload img_list" @click="upload('img')">
+				<view class="iconfont iconziyuan" style="font-size:20px;"></view>
+				上传照片
+			</view>
+			<view class="upload img_list" @click="upload('file')">
+				<view class="iconfont iconshangchuanwenjian fileicon"></view>
+				上传文件
+			</view>
+		</view>
+		<!-- 上传文件 end -->
+	</view>
+</template>
+
+<script>
+	import {
+		get,
+		post
+	} from './utils/request.js'
+	import {
+		uploadImage,
+		uploadPdf
+	} from './utils/uploadimage.js'
+	import {
+		previepdf
+	} from './utils/openpdf.js'
+	export default {
+		name: 'upload',
+		model: {
+			prop: "showPop",
+			event: "change"
+		},
+		props: {
+			limitnumber: {
+				type: Number,
+				default: 10
+			},
+		},
+		data() {
+			return {
+				fileList: []
+			}
+		},
+		methods: {
+			/**
+			 * @description 上传文件
+			 */
+			upload(book) {
+				if (this.fileList.length == this.$props.limitnumber) {
+					uni.showToast({
+						title: '文件上传已上限',
+						icon: 'none'
+					})
+					return
+				}
+				if (book == 'img') {
+					uploadImage().then(res => {
+						this.fileList.push({
+							url: res.imageurl,
+							id: res.uploadId,
+							book: 'img'
+						})
+						this.$emit('upload',this.fileList)
+					})
+				} else {
+					uploadPdf().then(res => {
+						this.fileList.push({
+							id: res.uploadId,
+							book: 'file'
+						})
+					})
+					this.$emit('upload',this.fileList)
+				}
+			},
+
+			/**
+			 * @description 预览图片
+			 */
+			preview(url) {
+				uni.previewImage({
+					urls: [url],
+					current: url
+				})
+			},
+			/**
+			 * @description 预览pdf
+			 */
+			
+			prePdf(e) {
+					let id = `/api/v1/consumer/download/${e}` // 下载pdf文件的借口地址
+					previepdf(id)
+				},
+			/**
+			 * @description 删除上传的文件
+			 */
+			delteFile(index) {
+				this.fileList.splice(index, 1)
+				this.$emit('upload',this.fileList)
+			},
+		}
+	}
+</script>
+
+<style>
+	@import "./pretty-uploadFile.css";
+
+	.display_flex {
+		display: flex;
+		flex-wrap: wrap;
+		width: 100%;
+	}
+
+	.fileicon {
+		font-size: 25px;
+	}
+
+	/* 上传图片 */
+	.img_list {
+		width: 70px;
+		height: 70px;
+		border-radius: 5px;
+		margin: 10px 5px;
+		position: relative;
+	}
+
+	.img>image {
+		width: 70px;
+		height: 70px;
+		border-radius: 5px;
+	}
+
+	.img_item {
+		width: 70px;
+		height: 70px;
+		border-radius: 5px;
+	}
+
+	.upload {
+		height: 70px;
+		width: 70px;
+		background-color: #f7f7f7;
+		border: 1px dashed rgb(224, 223, 223);
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		font-size: 14px;
+		color: #aaa;
+		word-break: break-all;
+		overflow: hidden;
+	}
+
+	.deleteicon {
+		position: absolute;
+		font-size: 20px;
+		color: #F93313;
+		top: -10px;
+		right: -6px;
+		background-color: #fff;
+		border-radius: 50%;
+	}
+</style>

+ 54 - 0
bureau-of-education/components/pretty-uploadFile/utils/openpdf.js

@@ -0,0 +1,54 @@
+//#ifdef H5
+const BASEURL = ''
+//#endif
+
+//#ifndef H5
+const BASEURL = getApp().globalData.url
+ //#endif
+ 
+function previepdf(url) {
+  uni.showLoading({
+    title: '加载中'
+  });
+	const manage = uni.getFileSystemManager();
+  uni.downloadFile({
+    url: BASEURL + url,
+
+    success(res) {
+      let path = res.tempFilePath;
+	  // #ifdef MP-WEIXIN
+			var savePath = uni.env.USER_DATA_PATH + "/" + fileName
+			if (res.statusCode == 200) {
+				manage.saveFile({
+					tempFilePath: res.tempFilePath,
+					filePath: savePath+'.pdf',
+					success:function(res){
+						uni.openDocument({
+							 filePath: res.savedFilePath,
+							 fileType: "pdf",
+							 success: function (res) {
+								uni.hideLoading()
+							 }
+						 })
+					}
+				})
+			}
+	  // #endif
+	  // #ifndef MP-WEIXIN
+		uni.openDocument({
+		  filePath: path,
+		  showMenu: true,
+		  success: function (res) {
+		    // console.log('打开文档成功');
+		  }
+		});
+	  // #endif
+			
+    }
+
+  });
+}
+
+module.exports = {
+  previepdf
+};

+ 101 - 0
bureau-of-education/components/pretty-uploadFile/utils/request.js

@@ -0,0 +1,101 @@
+/**
+ * GET请求封装
+ */
+function get(url, data = {}) {
+	return request(url, data, 'GET');
+}
+
+function put(url, data = {}) {
+	return request(url, data, 'put');
+}
+
+function deletes(url, data = {}) {
+	return request(url, data, 'delete');
+}
+/**
+ * POST请求封装
+ */
+
+function post(url, data = {}) {
+	return request(url, data, 'POST');
+}
+/**
+ * 微信的request
+ */
+//#ifdef H5
+const BASEURL = ''
+//#endif
+
+//#ifndef H5
+const BASEURL = getApp().globalData.url
+//#endif
+
+function request(url, data = {}, method = "GET") {
+	return new Promise(function(resolve, reject) {
+		uni.showLoading({
+			title: "加载中"
+		});
+		uni.request({
+			url: BASEURL + url,
+			method: method,
+			data: data,
+			header: {
+				'mini-session': uni.getStorageSync('session') || '',
+				'Accept': 'application/json',
+				'X-Requested-With': 'XMLHttpRequest',
+				'Content-Type': 'application/json'
+			},
+
+			success(res) {
+				if (res.data) {
+					if (res.data.error) {
+						if (res.data.error.code != 404) {
+							uni.showToast({
+								title: res.data.error.message,
+								icon: 'none'
+							});
+						}
+
+						if (res.data.error.code == 9999) {
+							uni.clearStorageSync('session');
+							uni.showToast({
+								title: '登录失效,请重新登录',
+								icon: 'none'
+							});
+							setTimeout(() => {
+								uni.reLaunch({
+									url: '/pages/login/login'
+								});
+							}, 1000);
+						}
+
+						reject(res.data.error.message);
+					} else {
+						resolve(res.data);
+					}
+				} else {
+					resolve(null);
+					uni.hideLoading();
+				}
+			},
+
+			fail(res) {
+				console.log(res);
+				uni.showToast({
+					title: '请求超时,请重试',
+					icon: 'none'
+				}); // wx.hideLoading()
+			}
+
+		});
+	});
+}
+
+
+
+module.exports = {
+	get,
+	post,
+	put,
+	deletes,
+};

+ 146 - 0
bureau-of-education/components/pretty-uploadFile/utils/uploadimage.js

@@ -0,0 +1,146 @@
+//#ifdef H5
+const BASEURL = ''
+//#endif
+
+//#ifndef H5
+const BASEURL = getApp().globalData.url
+//#endif
+
+function uploadImage() {
+	return new Promise((resolve, reject) => {
+		
+		uni.chooseImage({
+			count: 1,
+			sizeType: ['original', 'compressed'],
+			sourceType: ['album', 'camera'],
+			success(ress) {
+				if (ress.tempFiles.length > 0) {
+					const tempFilePaths = ress.tempFiles[0].path
+					const size = ress.tempFiles[0].size
+					if (size < 8388608) {
+						uni.showLoading({
+							title:'上传中'
+						})
+						let imageurl = tempFilePaths
+						let pdfurl = ""
+						uni.uploadFile({
+							url: BASEURL + '/api/v1/enterprise/upload/image', //仅为示例,非真实的接口地址
+							filePath: tempFilePaths,
+							header: {
+								"mini-session": uni.getStorageSync('session'),
+								"Content-Type": "multipart/form-data;boundary=----WebKitFormBoundaryi8lPVoSysovJLNqi",
+								"Accept": "application/json"
+							},
+							name: 'file',
+							formData: {
+								'user': 'test'
+							},
+							success(res) {
+								if (res.statusCode == 500) {
+									uni.showToast({
+										title: '图片上传失败',
+										icon: 'none'
+									})
+									reject('失败')
+								} else {
+									uni.showToast({
+										title: '图片上传成功',
+										icon: 'success'
+									})
+									if (res.data) {
+										let uploadId = JSON.parse(res.data).id
+										resolve({
+											imageurl, // 图片地址
+											uploadId // 后台返回的文件id
+										})
+									}
+
+								}
+							}
+						})
+					} else {
+						uni.showToast({
+							title: '超出限制大小',
+							icon: "none"
+						})
+					}
+				} else {
+					uni.showToast({
+						title: '文件不存在',
+						icon: "none"
+					})
+				}
+			}
+		})
+	})
+}
+
+function uploadPdf() {
+	return new Promise((resolve, reject) => {
+		uni.chooseMessageFile({
+			count: 1,
+			type: 'all',
+			success(ress) {
+				if (ress.tempFiles.length > 0) {
+					if (ress.tempFiles[0].size < 8388608) {
+						uni.showLoading({
+							title:'上传中'
+						})
+						let pdfurl = ress.tempFiles[0].name
+						uni.uploadFile({
+							url: BASEURL + '/api/v1/enterprise/upload/file', //仅为示例,非真实的接口地址
+							filePath: ress.tempFiles[0].path,
+							name: 'file',
+							header: {
+								"mini-session": uni.getStorageSync('session'),
+								"Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryi8lPVoSysovJLNqi",
+								"Accept": "application/json"
+							},
+							formData: {
+								'user': 'test'
+							},
+							success(res) {
+								if (res.statusCode != 500) {
+									uni.showToast({
+										title: '文件上传成功',
+										icon: 'success'
+									})
+									if (res.data) {
+										let uploadId = JSON.parse(res.data).id
+										resolve({
+											uploadId // 后台返回的文件Id
+										})
+									} else {
+										reject('失败')
+									}
+
+								} else {
+									uni.showToast({
+										title: '服务器错误',
+										icon: 'none'
+									})
+								}
+							}
+						})
+					} else {
+						uni.showToast({
+							title: '超出限制大小',
+							icon: "none"
+						})
+						return
+					}
+				} else {
+					uni.showToast({
+						title: '文件不存在',
+						icon: "none"
+					})
+				}
+
+			}
+		})
+	})
+}
+module.exports = {
+	uploadImage,
+	uploadPdf
+}

+ 142 - 0
bureau-of-education/components/uni-file-picker/choose-and-upload-file.js

@@ -0,0 +1,142 @@
+'use strict';
+
+// Object.defineProperty(exports, '__esModule', { value: true });
+
+const ERR_MSG_OK = 'chooseAndUploadFile:ok';
+const ERR_MSG_FAIL = 'chooseAndUploadFile:fail';
+function chooseImage(opts) {
+		const { count, sizeType, sourceType = ['album', 'camera'], extension } = opts
+    return new Promise((resolve, reject) => {
+        uni.chooseImage({
+            count,
+            sizeType,
+            sourceType,
+            extension,
+            success(res) {
+                resolve(normalizeChooseAndUploadFileRes(res, 'image'));
+            },
+            fail(res) {
+                reject({
+                    errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL),
+                });
+            },
+        });
+    });
+}
+function chooseVideo(opts) {
+    const { camera, compressed, maxDuration, sourceType = ['album', 'camera'], extension } = opts;
+    return new Promise((resolve, reject) => {
+        uni.chooseVideo({
+            camera,
+            compressed,
+            maxDuration,
+            sourceType,
+            extension,
+            success(res) {
+                const { tempFilePath, duration, size, height, width } = res;
+                resolve(normalizeChooseAndUploadFileRes({
+                    errMsg: 'chooseVideo:ok',
+                    tempFilePaths: [tempFilePath],
+                    tempFiles: [
+                        {
+                            name: (res.tempFile && res.tempFile.name) || '',
+                            path: tempFilePath,
+                            size,
+                            type: (res.tempFile && res.tempFile.type) || '',
+                            width,
+                            height,
+                            duration,
+                            fileType: 'video',
+                            cloudPath: '',
+                        },
+                    ],
+                }, 'video'));
+            },
+            fail(res) {
+                reject({
+                    errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL),
+                });
+            },
+        });
+    });
+}
+function chooseAll(opts) {
+    const { count, extension } = opts;
+    return new Promise((resolve, reject) => {
+        let chooseFile = uni.chooseFile;
+        if (typeof wx !== 'undefined' &&
+            typeof wx.chooseMessageFile === 'function') {
+            chooseFile = wx.chooseMessageFile;
+        }
+        if (typeof chooseFile !== 'function') {
+            return reject({
+                errMsg: ERR_MSG_FAIL + ' 请指定 type 类型,该平台仅支持选择 image 或 video。',
+            });
+        }
+        chooseFile({
+            type: 'all',
+            count,
+            extension,
+            success(res) {
+                resolve(normalizeChooseAndUploadFileRes(res));
+            },
+            fail(res) {
+                reject({
+                    errMsg: res.errMsg.replace('chooseFile:fail', ERR_MSG_FAIL),
+                });
+            },
+        });
+    });
+}
+function normalizeChooseAndUploadFileRes(res, fileType) {
+    res.tempFiles.forEach((item, index) => {
+        if (!item.name) {
+            item.name = item.path.substring(item.path.lastIndexOf('/') + 1);
+        }
+        if (fileType) {
+            item.fileType = fileType;
+        }
+        item.cloudPath =
+            Date.now() + '_' + index + item.name.substring(item.name.lastIndexOf('.'));
+    });
+    // wx.chooseMessageFile
+    if (!res.tempFilePaths) {
+        res.tempFilePaths = res.tempFiles.map((file) => file.path);
+    }
+    return res;
+}
+function uploadCloudFiles(res, max = 5, onUploadProgress) {}
+function uploadFiles(choosePromise, { onChooseFile, onUploadProgress }) {
+    return choosePromise
+        .then((res) => {
+        if (onChooseFile) {
+            const customChooseRes = onChooseFile(res);
+            if (typeof customChooseRes !== 'undefined') {
+                return Promise.resolve(customChooseRes).then((chooseRes) => typeof chooseRes === 'undefined' ? res : chooseRes);
+            }
+        }
+        return res;
+    })
+        .then((res) => {
+        if (res === false) {
+            return {
+                errMsg: ERR_MSG_OK,
+                tempFilePaths: [],
+                tempFiles: [],
+            };
+        }
+		return res
+        // return uploadCloudFiles(res, 5, onUploadProgress);
+    })
+}
+function chooseAndUploadFile(opts = { type: 'all' }) {
+    if (opts.type === 'image') {
+        return uploadFiles(chooseImage(opts), opts);
+    }
+    else if (opts.type === 'video') {
+        return uploadFiles(chooseVideo(opts), opts);
+    }
+    return uploadFiles(chooseAll(opts), opts);
+}
+
+export {chooseAndUploadFile};

+ 743 - 0
bureau-of-education/components/uni-file-picker/uni-file-picker.vue

@@ -0,0 +1,743 @@
+<template>
+	<view class="uni-file-picker">
+		<view v-if="title" class="uni-file-picker__header">
+			<text class="file-title">{{ title }}</text>
+			<text class="file-count">{{ filesList.length }}/{{ limitLength }}</text>
+		</view>
+		<upload-image
+			v-if="fileMediatype === 'image' && showType === 'grid'"
+			:readonly="readonly"
+			:image-styles="imageStyles"
+			:files-list="filesList"
+			:limit="limitLength"
+			:disablePreview="disablePreview"
+			:delIcon="delIcon"
+			@uploadFiles="uploadFiles"
+			@choose="choose"
+			@delFile="delFile"
+		>
+			<slot>
+				<view class="is-add">
+					<view class="icon-add"></view>
+					<view class="icon-add rotate"></view>
+				</view>
+			</slot>
+		</upload-image>
+		<upload-file
+			v-if="fileMediatype !== 'image' || showType !== 'grid'"
+			:readonly="readonly"
+			:list-styles="listStyles"
+			:files-list="filesList"
+			:showType="showType"
+			:delIcon="delIcon"
+			@uploadFiles="uploadFiles"
+			@choose="choose"
+			@delFile="delFile"
+		>
+			<slot>
+				<view class="title">
+					<view class="select">请选择pdf格式文件上传</view>
+					<image class="black" src="/static/img/black.png" mode=""></image>
+				</view>
+			</slot>
+		</upload-file>
+	</view>
+</template>
+
+<script>
+	import {chooseAndUploadFile} from './choose-and-upload-file.js'
+	import uploadImage from './upload-image.vue'
+	import uploadFile from './upload-file.vue'
+	let fileInput = null
+/**
+ * FilePicker 文件选择上传
+ * @description 文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=4079
+ * @property {Object|Array}	value	组件数据,通常用来回显 ,类型由return-type属性决定
+ * @property {Boolean}	disabled=[true|false]	组件禁用
+ * 	@value true 	禁用
+ * 	@value false 	取消禁用
+ * @property {Boolean}	readonly=[true|false]	组件只读,不可选择,不显示进度,不显示删除按钮
+ * 	@value true 	只读
+ * 	@value false 	取消只读
+ * @property {String}	return-type=[array|object]	限制 value 格式,当为 object 时 ,组件只能单选,且会覆盖
+ * 	@value array	规定 value 属性的类型为数组
+ * 	@value object	规定 value 属性的类型为对象
+ * @property {Boolean}	disable-preview=[true|false]	禁用图片预览,仅 mode:grid 时生效
+ * 	@value true 	禁用图片预览
+ * 	@value false 	取消禁用图片预览
+ * @property {Boolean}	del-icon=[true|false]	是否显示删除按钮
+ * 	@value true 	显示删除按钮
+ * 	@value false 	不显示删除按钮
+ * @property {Boolean}	auto-upload=[true|false]	是否自动上传,值为true则只触发@select,可自行上传
+ * 	@value true 	自动上传
+ * 	@value false 	取消自动上传
+ * @property {Number|String}	limit	最大选择个数 ,h5 会自动忽略多选的部分
+ * @property {String}	title	组件标题,右侧显示上传计数
+ * @property {String}	mode=[list|grid]	选择文件后的文件列表样式
+ * 	@value list 	列表显示
+ * 	@value grid 	宫格显示
+ * @property {String}	file-mediatype=[image|video|all]	选择文件类型
+ * 	@value image	只选择图片
+ * 	@value video	只选择视频
+ * 	@value all		选择所有文件
+ * @property {Array}	file-extname	选择文件后缀,根据 file-mediatype 属性而不同
+ * @property {Object}	list-style	mode:list 时的样式
+ * @property {Object}	image-styles	选择文件后缀,根据 file-mediatype 属性而不同
+ * @event {Function} select 	选择文件后触发
+ * @event {Function} progress 文件上传时触发
+ * @event {Function} success 	上传成功触发
+ * @event {Function} fail 		上传失败触发
+ * @event {Function} delete 	文件从列表移除时触发
+ */
+export default {
+	name: 'uniFilePicker',
+	components: {
+		uploadImage,
+		uploadFile
+	},
+	props: {
+		value: {
+			type: [Array, Object],
+			default() {
+				return []
+			}
+		},
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		disablePreview: {
+			type: Boolean,
+			default: false
+		},
+		delIcon: {
+			type: Boolean,
+			default: true
+		},
+		// 自动上传
+		autoUpload: {
+			type: Boolean,
+			default: true
+		},
+		// 最大选择个数 ,h5只能限制单选或是多选
+		limit: {
+			type: [Number, String],
+			default: 9
+		},
+		// 列表样式 grid | list | list-card
+		mode: {
+			type: String,
+			default: 'grid'
+		},
+		// inputUrl: {
+		// 	type: Boolean,
+		// 	default: false
+		// },
+		// 选择文件类型  image/video/all
+		fileMediatype: {
+			type: String,
+			default: 'image'
+		},
+		// 文件类型筛选
+		fileExtname: {
+			type: [Array, String],
+			default() {
+				return []
+			}
+		},
+		title: {
+			type: String,
+			default: ''
+		},
+		listStyles: {
+			type: Object,
+			default() {
+				return {
+					// 是否显示边框
+					border: true,
+					// 是否显示分隔线
+					dividline: true,
+					// 线条样式
+					borderStyle: {}
+				}
+			}
+		},
+		imageStyles: {
+			type: Object,
+			default() {
+				return {
+					width: 'auto',
+					height: 'auto'
+				}
+			}
+		},
+		readonly: {
+			type: Boolean,
+			default: false
+		},
+		returnType: {
+			type: String,
+			default: 'array'
+		}
+	},
+	watch: {
+		value: {
+			handler(newVal) {
+				let newFils = []
+				let newData = [].concat(newVal || [])
+				newData.forEach(v => {
+					const files = this.files.find(i => i.url === v.url)
+					const reg = /cloud:\/\/([\w.]+\/?)\S*/
+					if (!v.path) {
+						v.path = v.url
+					}
+					if (reg.test(v.url)) {
+						this.getTempFileURL(v, v.url)
+					}
+					newFils.push(files ? files : v)
+				})
+				let data  = null
+				if (this.returnType === 'object') {
+					data = this.backObject(newFils)[0]
+				} else {
+					data = this.backObject(newFils)
+				}
+				this.formItem && this.formItem.setValue(data)
+				this.files = newFils
+			},
+			immediate: true
+		}
+	},
+	data() {
+		return {
+			files: [],
+		}
+	},
+	computed: {
+		filesList() {
+			let files = []
+			this.files.forEach(v => {
+				files.push(v)
+			})
+			return files
+		},
+		showType() {
+			if (this.fileMediatype === 'image') {
+				return this.mode
+			}
+			return 'list'
+		},
+		limitLength() {
+			if (this.returnType === 'object') {
+				return 1
+			}
+			if (!this.limit) {
+				return 1
+			}
+			if (this.limit >= 9) {
+				return 9
+			}
+			return this.limit
+		},
+		extname(){
+			if (!Array.isArray(this.fileExtname)) {
+				let extname = this.fileExtname.replace(/(\[|\])/g,'')
+				return extname.split(',')
+			} else {
+				return this.fileExtname
+			}
+			return []
+		}
+	},
+	created() {
+		// TODO 兼容不开通服务空间的情况
+		if(!(uniCloud.config && uniCloud.config.provider)){
+			this.noSpace = true
+			uniCloud.chooseAndUploadFile = chooseAndUploadFile
+		}
+		this.tempData = {}
+		this.form = this.getForm('uniForms')
+		this.formItem = this.getForm('uniFormsItem')
+		if (this.form && this.formItem) {
+			if (this.formItem.name) {
+				this.rename = this.formItem.name
+				this.form.inputChildrens.push(this)
+			}
+		}
+	},
+	methods: {
+		/**
+		 * 获取父元素实例
+		 */
+		getForm(name = 'uniForms') {
+			let parent = this.$parent;
+			let parentName = parent.$options.name;
+			while (parentName !== name) {
+				parent = parent.$parent;
+				if (!parent) return false;
+				parentName = parent.$options.name;
+			}
+			return parent;
+		},
+		/**
+		 * 继续上传
+		 */
+		upload() {
+			// TODO 先放弃这个实现 ,不能全部上传
+			// if (this.$uploadFiles) {
+			// 	this.$uploadFiles()
+			// } else {
+			// 	uni.showToast({
+			// 		title: '请先选择文件',
+			// 		icon: 'none'
+			// 	})
+			// }
+			let files = []
+			this.files.forEach((v, index) => {
+				if (v.status === 'ready' || v.status === 'error') {
+					files.push(Object.assign({}, v))
+				}
+			})
+
+			this.uploadFiles(files)
+		},
+		/**
+		 * 选择文件
+		 */
+		choose() {
+			
+			if (this.disabled) return
+			if (this.files.length >= Number(this.limitLength) && this.showType !== 'grid' && this.returnType === 'array') {
+				uni.showToast({
+					title: `您最多选择 ${this.limitLength} 个文件`,
+					icon: 'none'
+				})
+				return
+			}
+			// uni.showActionSheet({
+			// 	itemList: ['填写 url 地址', '选择文件'],
+			// 	success: (res) => {
+			// 		if (res.tapIndex === 1) {
+			// 			this.chooseFiles()
+			// 		}
+			// 	},
+			// 	fail: function(res) {}
+			// });
+			this.chooseFiles()
+		},
+
+		/**
+		 * 选择文件并上传
+		 */
+		chooseFiles() {
+
+			uniCloud
+				.chooseAndUploadFile({
+					type: this.fileMediatype,
+					compressed: false,
+					// TODO 如果为空,video 有问题
+					extension: this.extname.length > 0 ? this.extname : undefined,
+					count: this.limitLength - this.files.length, //默认9
+					onChooseFile: async res => {
+						if ((Number(this.limitLength) === 1 && this.disablePreview && !this.disabled) || this.returnType === 'object') {
+							this.files = []
+						}
+						let filePaths = []
+						let files = []
+						if (this.extname && this.extname.length > 0) {
+							res.tempFiles.forEach(v => {
+								let fileFullName = this.getFileExt(v.name)
+								const extname = fileFullName.ext.toLowerCase()
+								if (this.extname.indexOf(extname) !== -1) {
+									files.push(v)
+									filePaths.push(v.path)
+								}
+							})
+							if (files.length !== res.tempFiles.length) {
+								uni.showToast({
+									title: `当前选择了${res.tempFiles.length}个文件 ,${res.tempFiles.length - files.length} 个文件格式不正确`,
+									icon: 'none',
+									duration: 5000
+								})
+							}
+						} else {
+							filePaths = res.tempFilePaths
+							files = res.tempFiles
+						}
+
+						let currentData = []
+						for (let i = 0; i < files.length; i++) {
+							if (this.limitLength - this.files.length <= 0) break
+							files[i].uuid = Date.now()
+							let filedata = await this.getFileData(files[i], this.fileMediatype)
+							filedata.file = files[i]
+							filedata.progress = 0
+							filedata.status = 'ready'
+							this.files.push(filedata)
+							currentData.push(filedata)
+						}
+						this.$emit('select', {
+							tempFiles: currentData,
+							tempFilePaths: filePaths
+						})
+						res.tempFiles = files
+						// 停止自动上传
+						if (!this.autoUpload || this.noSpace) {
+							res.tempFiles = []
+							// TODO 先放弃这个实现 ,不能全部上传
+							// return new Promise((resolve) => {
+							// 	this.$uploadFiles = () => {
+							// 		// this._is_uploading = true
+							// 		resolve(res)
+							// 	}
+							// })
+						} else {
+							// this.upload()
+						}
+					},
+					onUploadProgress: progressEvent => {
+						this.setProgress(progressEvent, progressEvent.index)
+					}
+				})
+				.then(result => {
+					console.log(2)
+					this.upload()
+					// this.setSuccessAndError(result.tempFiles)
+				})
+				.catch(err => {
+					console.log('选择失败', err)
+				})
+		},
+
+		/**
+		 * 批传
+		 * @param {Object} e
+		 */
+		uploadFiles(files) {
+			files = [].concat(files)
+			this.uploadCloudFiles(files, 5, res => {
+				this.setProgress(res, res.index, true)
+			})
+				.then(result => {
+					this.setSuccessAndError(result)
+				})
+				.catch(err => {
+					console.log('err', err)
+				})
+		},
+
+		/**
+		 * 成功或失败
+		 */
+		async setSuccessAndError(res, fn) {
+			let successData = []
+			let errorData = []
+			let tempFilePath = []
+			let errorTempFilePath = []
+			for (let i = 0; i < res.length; i++) {
+				// const index  = item.index
+				const item = res[i]
+				const index = item.uuid ? this.files.findIndex(p => p.uuid === item.uuid) : item.index
+				if (index === -1 || !this.files) break
+				if (item.errMsg === 'request:fail') {
+					this.files[index].url = item.path
+					this.files[index].status = 'error'
+					this.files[index].errMsg = item.errMsg
+					// this.files[index].progress = -1
+					errorData.push(this.files[index])
+					errorTempFilePath.push(this.files[index].url)
+				} else {
+					this.files[index].errMsg = ''
+					this.files[index].url = item.url
+					this.files[index].status = 'success'
+					this.files[index].progress += 1
+					successData.push(this.files[index])
+					tempFilePath.push(this.files[index].url)
+				}
+			}
+
+			if (successData.length > 0) {
+				this.setEmit()
+				// 状态改变返回
+				this.$emit('success', {
+					tempFiles: this.backObject(successData),
+					tempFilePaths: tempFilePath
+				})
+			}
+
+			if (errorData.length > 0) {
+				this.$emit('fail', {
+					tempFiles: this.backObject(errorData),
+					tempFilePaths: errorTempFilePath
+				})
+			}
+		},
+
+		/**
+		 * 获取进度
+		 * @param {Object} progressEvent
+		 * @param {Object} index
+		 * @param {Object} type
+		 */
+		setProgress(progressEvent, index, type) {
+			const fileLenth = this.files.length
+			const percentNum = (index / fileLenth) * 100
+			const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total)
+			let idx = index
+			if (!type) {
+				idx = this.files.findIndex(p => p.uuid === progressEvent.tempFile.uuid)
+			}
+			if (idx === -1 || !this.files[idx]) return
+			// fix by mehaotian 100 就会消失,-1 是为了让进度条消失
+			this.files[idx].progress = percentCompleted - 1
+			// 上传中
+			this.$emit('progress', {
+				index: idx,
+				progress: parseInt(percentCompleted),
+				tempFile: this.files[idx]
+			})
+		},
+
+		/**
+		 * 删除
+		 * @param {Object} index
+		 */
+		delFile(index) {
+			this.$emit('delete', {
+				tempFile: this.files[index],
+				tempFilePath: this.files[index].url
+			})
+			this.files.splice(index, 1)
+			this.$nextTick(()=>{
+				this.setEmit()
+			})
+		},
+
+		/**
+		 * 获取文件名和后缀
+		 * @param {Object} name
+		 */
+		getFileExt(name) {
+			const last_len = name.lastIndexOf('.')
+			const len = name.length
+			return {
+				name: name.substring(0, last_len),
+				ext: name.substring(last_len + 1, len)
+			}
+		},
+
+		/**
+		 * 获取图片信息
+		 * @param {Object} filepath
+		 */
+		getFileInfo(filepath) {
+			return new Promise((resolve, reject) => {
+				uni.getImageInfo({
+					src: filepath,
+					success(res) {
+						resolve(res)
+					},
+					fail(err) {
+						reject(err)
+					}
+				})
+			})
+		},
+
+		/**
+		 * 获取封装数据
+		 */
+		async getFileData(files, type = 'image') {
+			// 最终需要上传数据库的数据
+			let fileFullName = this.getFileExt(files.name)
+			const extname = fileFullName.ext.toLowerCase()
+			let filedata = {
+				name: files.name,
+				uuid: files.uuid,
+				extname: extname || '',
+				cloudPath: files.cloudPath,
+				file:files.file,
+				fileType: files.fileType,
+				url: files.path || files.path,
+				size: files.size, //单位是字节
+				image: {},
+				path: files.path,
+				video: {}
+			}
+			if (type === 'image') {
+				const imageinfo = await this.getFileInfo(files.path)
+				delete filedata.video
+				filedata.image.width = imageinfo.width
+				filedata.image.height = imageinfo.height
+				filedata.image.location = imageinfo.path
+			}else{
+				delete filedata.image
+			}
+			return filedata
+		},
+
+		/**
+		 * 批量上传
+		 */
+		uploadCloudFiles(files, max = 5, onUploadProgress) {
+			files = JSON.parse(JSON.stringify(files))
+			const len = files.length
+			let count = 0
+			let self = this
+			console.log(1)
+			return new Promise(resolve => {
+				while (count < max) {
+					next()
+				}
+
+				function next() {
+					let cur = count++
+					if (cur >= len) {
+						!files.find(item => !item.url && !item.errMsg) && resolve(files)
+						return
+					}
+					const fileItem = files[cur]
+					const index = self.files.findIndex(v => v.uuid === fileItem.uuid)
+					fileItem.url = ''
+					delete fileItem.errMsg
+					 uni.uploadFile({
+							filePath: fileItem.path,
+							cloudPath: fileItem.cloudPath,
+							fileType: fileItem.fileType,
+							onUploadProgress: res => {
+								res.index = index
+								onUploadProgress && onUploadProgress(res)
+							}
+						})
+						.then(res => {
+							fileItem.url = res.fileID
+							fileItem.index = index
+							if (cur < len) {
+								next()
+							}
+						})
+						.catch(res => {
+							fileItem.errMsg = res.errMsg || res.message
+							fileItem.index = index
+							if (cur < len) {
+								next()
+							}
+						})
+				}
+			})
+		},
+		setEmit() {
+			let data = []
+			if (this.returnType === 'object') {
+				data = this.backObject(this.files)[0]
+			} else {
+				data = this.backObject(this.files)
+			}
+			this.$emit('input', data)
+		},
+		backObject(files) {
+			let newFilesData = JSON.parse(JSON.stringify(files))
+			newFilesData.map(v => {
+				delete v.path
+				delete v.uuid
+				delete v.video
+				delete v.progress
+				delete v.errMsg
+				delete v.status
+				delete v.cloudPath
+				return v
+			})
+			return newFilesData
+		},
+		async getTempFileURL(file, fileList) {
+			fileList = {
+				fileList: [].concat(fileList)
+			}
+			const urls = await uniCloud.getTempFileURL(fileList)
+			file.path = urls.fileList[0].tempFileURL || ''
+			const index = this.files.findIndex(v => v.path === file.path)
+			if (index !== -1) {
+				this.$set(this.files, index, file)
+			}
+		}
+	}
+}
+</script>
+<style lang="scss">
+	.title{
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		font-weight: 500;
+		.lable{
+			font-size: 28rpx;
+			color: #343434;
+		}
+		.text{
+			font-size: 26rpx;
+			color: #0099FF;
+		}
+		.input{
+			font-size: 28rpx;
+		}
+		.select {
+			color: #aaa;
+			font-size: 28rpx;
+			flex: 1;
+			text-align: right;
+		}
+		.black{
+			width: 15rpx;
+			height: 26rpx;
+			margin-left: 20rpx;
+		}
+	}
+</style>
+<style>
+.uni-file-picker {
+	/* #ifndef APP-NVUE */
+	box-sizing: border-box;
+	overflow: hidden;
+	/* #endif */
+}
+
+.uni-file-picker__header {
+	padding-top: 5px;
+	padding-bottom: 10px;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	justify-content: space-between;
+}
+
+.file-title {
+	font-size: 14px;
+	color: #333;
+}
+
+.file-count {
+	font-size: 14px;
+	color: #999;
+}
+
+.is-add {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	align-items: center;
+	justify-content: center;
+}
+
+.icon-add {
+	width: 50px;
+	height: 5px;
+	background-color: #f1f1f1;
+	border-radius: 2px;
+}
+
+.rotate {
+	position: absolute;
+	transform: rotate(90deg);
+}
+</style>

+ 325 - 0
bureau-of-education/components/uni-file-picker/upload-file.vue

@@ -0,0 +1,325 @@
+<template>
+	<view class="uni-file-picker__files">
+		<view v-if="!readonly" class="files-button" @click="choose">
+			<slot></slot>
+		</view>
+		<!-- :class="{'is-text-box':showType === 'list'}" -->
+		<!-- <view v-if="list.length > 0" class="uni-file-picker__lists is-text-box" :style="borderStyle"> -->
+			<!-- ,'is-list-card':showType === 'list-card' -->
+
+			<!-- <view class="uni-file-picker__lists-box" v-for="(item ,index) in list" :key="index" :class="{ -->
+				<!-- 'files-border':index !== 0 && styles.dividline}" -->
+			 <!-- :style="index !== 0 && styles.dividline &&borderLineStyle"> -->
+				<!-- <view class="uni-file-picker__item"> -->
+					<!-- :class="{'is-text-image':showType === 'list'}" -->
+					<!-- 	<view class="files__image is-text-image">
+						<image class="header-image" :src="item.logo" mode="aspectFit"></image>
+					</view> -->
+					<!-- <view class="files__name">{{item.name}}</view> -->
+					<!-- <view v-if="delIcon&&!readonly" class="icon-del-box icon-files" @click="delFile(index)"> -->
+						<!-- <view class="icon-del icon-files"></view> -->
+						<!-- <view class="icon-del rotate"></view> -->
+					<!-- </view> -->
+				<!-- </view> -->
+				<!-- <view v-if="(item.progress && item.progress !== 100) ||item.progress===0 " class="file-picker__progress"> -->
+					<!-- <progress class="file-picker__progress-item" :percent="item.progress === -1?0:item.progress" stroke-width="4" -->
+					 <!-- :backgroundColor="item.errMsg?'#ff5a5f':'#EBEBEB'" /> -->
+				<!-- </view> -->
+				<!-- <view v-if="item.status === 'error'" class="file-picker__mask" @click.stop="uploadFiles(item,index)"> -->
+					<!-- 点击重试 -->
+				<!-- </view> -->
+			<!-- </view> -->
+
+		<!-- </view> -->
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "uploadFile",
+		props: {
+			filesList: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			delIcon: {
+				type: Boolean,
+				default: true
+			},
+			limit: {
+				type: [Number, String],
+				default: 9
+			},
+			showType: {
+				type: String,
+				default: ''
+			},
+			listStyles: {
+				type: Object,
+				default () {
+					return {
+						// 是否显示边框
+						border: true,
+						// 是否显示分隔线
+						dividline: true,
+						// 线条样式
+						borderStyle: {}
+					}
+				}
+			},
+			readonly:{
+				type:Boolean,
+				default:false
+			}
+		},
+		computed: {
+			list() {
+				let files = []
+				this.filesList.forEach(v => {
+					files.push(v)
+				})
+				return files
+			},
+			styles() {
+				let styles = {
+					border: true,
+					dividline: true,
+					'border-style': {}
+				}
+				return Object.assign(styles, this.listStyles)
+			},
+			borderStyle() {
+				let {
+					borderStyle,
+					border
+				} = this.styles
+				let obj = {}
+				if (!border) {
+					obj.border = 'none'
+				} else {
+					let width = (borderStyle && borderStyle.width) || 1
+					width = this.value2px(width)
+					let radius = (borderStyle && borderStyle.radius) || 5
+					radius = this.value2px(radius)
+					obj = {
+						'border-width': width,
+						'border-style': (borderStyle && borderStyle.style) || 'solid',
+						'border-color': (borderStyle && borderStyle.color) || '#eee',
+						'border-radius': radius
+					}
+				}
+				let classles = ''
+				for (let i in obj) {
+					classles += `${i}:${obj[i]};`
+				}
+				return classles
+			},
+			borderLineStyle() {
+				let obj = {}
+				let {
+					borderStyle
+				} = this.styles
+				if (borderStyle && borderStyle.color) {
+					obj['border-color'] = borderStyle.color
+				}
+				if (borderStyle && borderStyle.width) {
+					let width = borderStyle && borderStyle.width || 1
+					let style = borderStyle && borderStyle.style || 0
+					if (typeof width === 'number') {
+						width += 'px'
+					} else {
+						width = width.indexOf('px') ? width : width + 'px'
+					}
+					obj['border-width'] = width
+
+					if (typeof style === 'number') {
+						style += 'px'
+					} else {
+						style = style.indexOf('px') ? style : style + 'px'
+					}
+					obj['border-top-style'] = style
+				}
+				let classles = ''
+				for (let i in obj) {
+					classles += `${i}:${obj[i]};`
+				}
+				return classles
+			}
+		},
+
+		methods: {
+			uploadFiles(item, index) {
+				console.log(item)
+				this.$emit("uploadFiles", {
+					item,
+					index
+				})
+			},
+			choose() {
+				this.$emit("choose")
+			},
+			delFile(index) {
+				this.$emit('delFile', index)
+			},
+			value2px(value) {
+				if (typeof value === 'number') {
+					value += 'px'
+				} else {
+					value = value.indexOf('px') !== -1 ? value : value + 'px'
+				}
+				return value
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.uni-file-picker__files {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: flex-start;
+	}
+
+	.files-button {
+		// border: 1px red solid;
+	}
+
+	.uni-file-picker__lists {
+		position: relative;
+		margin-top: 5px;
+		overflow: hidden;
+	}
+
+	.file-picker__mask {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		position: absolute;
+		right: 0;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		color: #fff;
+		font-size: 14px;
+		background-color: rgba(0, 0, 0, 0.4);
+	}
+
+	.uni-file-picker__lists-box {
+		position: relative;
+	}
+
+	.uni-file-picker__item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+		padding: 8px 10px;
+		padding-right: 5px;
+		padding-left: 10px;
+	}
+
+	.files-border {
+		border-top: 1px #eee solid;
+	}
+
+	.files__name {
+		flex: 1;
+		font-size: 14px;
+		color: #666;
+		margin-right: 25px;
+		/* #ifndef APP-NVUE */
+		word-break: break-all;
+		word-wrap: break-word;
+		/* #endif */
+	}
+
+	.icon-files {
+		/* #ifndef APP-NVUE */
+		position: static;
+		background-color: initial;
+		/* #endif */
+	}
+
+	// .icon-files .icon-del {
+	// 	background-color: #333;
+	// 	width: 12px;
+	// 	height: 1px;
+	// }
+
+
+	.is-list-card {
+		border: 1px #eee solid;
+		margin-bottom: 5px;
+		border-radius: 5px;
+		box-shadow: 0 0 2px 0px rgba(0, 0, 0, 0.1);
+		padding: 5px;
+	}
+
+	.files__image {
+		width: 40px;
+		height: 40px;
+		margin-right: 10px;
+	}
+
+	.header-image {
+		width: 100%;
+		height: 100%;
+	}
+
+	.is-text-box {
+		border: 1px #eee solid;
+		border-radius: 5px;
+	}
+
+	.is-text-image {
+		width: 25px;
+		height: 25px;
+		margin-left: 5px;
+	}
+
+	.rotate {
+		position: absolute;
+		transform: rotate(90deg);
+	}
+
+	.icon-del-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		margin: auto 0;
+		/* #endif */
+		align-items: center;
+		justify-content: center;
+		position: absolute;
+		top: 0px;
+		bottom: 0;
+		right: 5px;
+		height: 26px;
+		width: 26px;
+		// border-radius: 50%;
+		// background-color: rgba(0, 0, 0, 0.5);
+		z-index: 2;
+		transform: rotate(-45deg);
+	}
+
+	.icon-del {
+		width: 15px;
+		height: 1px;
+		background-color: #333;
+		// border-radius: 1px;
+	}
+
+	/* #ifdef H5 */
+	@media all and (min-width: 768px) {
+		.uni-file-picker__files {
+			max-width: 375px;
+		}
+	}
+
+	/* #endif */
+</style>

+ 289 - 0
bureau-of-education/components/uni-file-picker/upload-image.vue

@@ -0,0 +1,289 @@
+<template>
+	<view class="uni-file-picker__container">
+		<view class="file-picker__box" v-for="(item,index) in filesList" :key="index" :style="boxStyle">
+			<view class="file-picker__box-content" :style="borderStyle">
+				<image class="file-image" :src="item.path" mode="aspectFill" @click.stop="prviewImage(item,index)"></image>
+				<view v-if="delIcon && !readonly" class="icon-del-box" @click.stop="delFile(index)">
+					<view class="icon-del"></view>
+					<view class="icon-del rotate"></view>
+				</view>
+				<view v-if="(item.progress && item.progress !== 100) ||item.progress===0 " class="file-picker__progress">
+					<progress class="file-picker__progress-item" :percent="item.progress === -1?0:item.progress" stroke-width="4"
+					 :backgroundColor="item.errMsg?'#ff5a5f':'#EBEBEB'" />
+				</view>
+				<view v-if="item.errMsg" class="file-picker__mask" @click.stop="uploadFiles(item,index)">
+					点击重试
+				</view>
+			</view>
+		</view>
+		<view v-if="filesList.length < limit && !readonly" class="file-picker__box" :style="boxStyle">
+			<view class="file-picker__box-content is-add" :style="borderStyle" @click="choose">
+				<slot>
+					<view class="icon-add"></view>
+					<view class="icon-add rotate"></view>
+				</slot>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "uploadImage",
+		props: {
+			filesList: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			disabled:{
+				type: Boolean,
+				default: false
+			},
+			disablePreview: {
+				type: Boolean,
+				default: false
+			},
+			limit: {
+				type: [Number, String],
+				default: 9
+			},
+			imageStyles: {
+				type: Object,
+				default () {
+					return {
+						width: 'auto',
+						height: 'auto',
+						border: {}
+					}
+				}
+			},
+			delIcon: {
+				type: Boolean,
+				default: true
+			},
+			readonly:{
+				type:Boolean,
+				default:false
+			}
+		},
+		computed: {
+			styles() {
+				let styles = {
+					width: 'auto',
+					height: 'auto',
+					border: {}
+				}
+				return Object.assign(styles, this.imageStyles)
+			},
+			boxStyle() {
+				const {
+					width = 'auto',
+						height = 'auto'
+				} = this.styles
+				let obj = {}
+				if (height === 'auto') {
+					if (width !== 'auto') {
+						obj.height = this.value2px(width)
+						obj['padding-top'] = 0
+					} else {
+						obj.height = 0
+					}
+				} else {
+					obj.height = this.value2px(height)
+					obj['padding-top'] = 0
+				}
+
+				if (width === 'auto') {
+					if (height !== 'auto') {
+						obj.width = this.value2px(height)
+					} else {
+						obj.width = '33.3%'
+					}
+				} else {
+					obj.width = this.value2px(width)
+				}
+
+				let classles = ''
+				for(let i in obj){
+					classles+= `${i}:${obj[i]};`
+				}
+				return classles
+			},
+			borderStyle() {
+				let {
+					border
+				} = this.styles
+				let obj = {}
+				if (typeof border === 'boolean') {
+					obj.border = border ? '1px #eee solid' : 'none'
+				} else {
+					let width = (border && border.width) || 1
+					width = this.value2px(width)
+					let radius = (border && border.radius) || 5
+					radius = this.value2px(radius)
+					obj = {
+						'border-width': width,
+						'border-style': (border && border.style) || 'solid',
+						'border-color': (border && border.color) || '#eee',
+						'border-radius': radius
+					}
+				}
+				let classles = ''
+				for(let i in obj){
+					classles+= `${i}:${obj[i]};`
+				}
+				return classles
+			}
+		},
+		methods: {
+			uploadFiles(item, index) {
+				this.$emit("uploadFiles", item)
+			},
+			choose() {
+				this.$emit("choose")
+			},
+			delFile(index) {
+				this.$emit('delFile', index)
+			},
+			prviewImage(img, index) {
+				let urls = []
+				if(Number(this.limit) === 1&&this.disablePreview&&!this.disabled){
+					this.$emit("choose")
+				}
+				if(this.disablePreview) return
+				this.filesList.forEach(i => {
+					urls.push(i.path)
+				})
+
+				uni.previewImage({
+					urls: urls,
+					current: index
+				});
+			},
+			value2px(value) {
+				if (typeof value === 'number') {
+					value += 'px'
+				} else {
+					if (value.indexOf('%') === -1) {
+						value = value.indexOf('px') !== -1 ? value : value + 'px'
+					}
+				}
+				return value
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.uni-file-picker__container {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		box-sizing: border-box;
+		/* #endif */
+		flex-wrap: wrap;
+		margin: -5px;
+	}
+
+	.file-picker__box {
+		position: relative;
+		// flex: 0 0 33.3%;
+		width: 33.3%;
+		height: 0;
+		padding-top: 33.33%;
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+	}
+
+	.file-picker__box-content {
+		position: absolute;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		left: 0;
+		margin: 5px;
+		border: 1px #eee solid;
+		border-radius: 8px;
+		overflow: hidden;
+	}
+
+	.file-picker__progress {
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		/* border: 1px red solid; */
+		z-index: 2;
+	}
+
+	.file-picker__progress-item {
+		width: 100%;
+	}
+
+	.file-picker__mask {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		position: absolute;
+		right: 0;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		color: #fff;
+		font-size: 12px;
+		background-color: rgba(0, 0, 0, 0.4);
+	}
+
+	.file-image {
+		width: 100%;
+		height: 100%;
+	}
+
+	.is-add {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+		justify-content: center;
+	}
+
+	.icon-add {
+		width: 50px;
+		height: 5px;
+		background-color: #f1f1f1;
+		border-radius: 2px;
+	}
+
+	.rotate {
+		position: absolute;
+		transform: rotate(90deg);
+	}
+
+	.icon-del-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+		justify-content: center;
+		position: absolute;
+		top: 5px;
+		right: 5px;
+		height: 26px;
+		width: 26px;
+		border-radius: 50%;
+		background-color: rgba(0, 0, 0, 0.5);
+		z-index: 2;
+		transform: rotate(-45deg);
+	}
+
+	.icon-del {
+		width: 15px;
+		height: 2px;
+		background-color: #fff;
+		border-radius: 2px;
+	}
+</style>

+ 12 - 0
bureau-of-education/components/xl-slider-verify/new_file.md

@@ -0,0 +1,12 @@
+###这是一个前端组件
+##import xlSliderVerify from '@/components/xl-slider-verify/xl-slider-verify.vue'
+##<xl-slider-verify @success="verifySuccess"></xl-slider-verify>
+##即可使用
+##success 验证成功的回调
+###参数说明
+##initText:未滑动的验证文案
+##successText://验证成功文案
+##sliderBlockBg://滑块颜色
+##forntBg://滑块滑动后的颜色
+##sliderBlockWidth://单位rpx 最大80
+##reset://成功后重置

+ 126 - 0
bureau-of-education/components/xl-slider-verify/xl-slider-verify.vue

@@ -0,0 +1,126 @@
+<template>
+	<view class="content" style="overflow: hidden;">
+		<view class="slider-container" :style="{backgroundColor:sliderBlockBg,touchAction: 'none'}">
+			<view class="" :class="value == 100?'initText':''" style="height: 100%;font-size: 28rpx;color: #;text-align: center;line-height: 90rpx;">
+				{{value==100?successText:initText}}
+			</view>
+			<view class="front" :style="{width: value+'%',backgroundColor:forntBg}">
+				
+			</view>
+			<view class="slider-block" :style="{left:!value?'0':'calc('+value+'% - '+sliderBlockWidth+'rpx)',width:sliderBlockWidth+'rpx'}">
+				<image class="icon_dlhk" src="/static/img/icon_dlhk.png" mode=""></image>
+			</view>
+			<slider :value="value" @change="sliderChange" :disabled="disabled" activeColor="transparent" @changing="changing" block-color="transparent" :block-size="35" backgroundColor="transparent" style="position: absolute;top:6rpx;left: 0;z-index: 5;width: 88%;" />
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props:{
+			initText:{
+				type:String,
+				default:'拖动滑块到右边' //未滑动的验证文案
+			},
+			successText:{
+				type:String,
+				default:'验证成功'//验证成功文案
+			},
+			sliderBlockBg:{//
+				type:String,
+				default:'#E6E6E6'//滑块颜色
+			},
+			forntBg:{
+				type:String,
+				default:'#009FE8'//滑块滑动后的颜色
+			},
+			sliderBlockWidth:{
+				type:Number,//单位rpx 最大80
+				default:90
+			},
+			reset:{
+				type:Boolean,//成功后重置
+				default:true
+			}
+		},
+		data() {
+			return {
+				value:0,
+				disabled:false
+			}
+		},
+		onLoad() {
+			
+		},
+		methods: {
+			changing(e){
+				this.value=e.detail.value
+			},
+			sliderChange(e){
+				if(e.detail.value!=100){
+					this.value=e.detail.value
+					this.$nextTick(()=>{
+						this.value=0
+					})
+				}
+				if(e.detail.value==100){
+					this.value=100
+					this.$emit('success') //验证成功触发组件通知
+					if(!this.reset){
+						this.disabled=true
+						return
+					}
+					// setTimeout(()=>{
+					// 	this.value=0
+					// },1500)
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.slider-container {
+		position: relative;
+		height: 90rpx;
+		border-radius: 4rpx;
+		overflow: hidden;
+		width: 100%;
+		/deep/.uni-slider-thumb{
+			box-shadow: none;
+		}
+		.initText{
+			position: absolute;
+			z-index: 2;
+			color: #fff;
+			left: 50%;
+			transform: translate(-50%,0);
+		}
+		.slider-block{
+			height: 100%;
+			position: absolute;
+			left: 0;
+			top: 0;
+			color: #787878;
+			border-right: 1px solid #E6E6E6;
+			line-height: 90rpx;
+			background-color: #FFFFFF;
+			text-align: center;
+			width: 90rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			.icon_dlhk{
+				width: 35rpx;
+				height: 25rpx;
+			}
+		}
+		.front{
+			height:100%;
+			position:absolute;
+			top:0;left:0;
+			opacity:0.8;
+		}
+	}
+	slider{opacity:0;}
+</style>

BIN
bureau-of-education/education.keystore


+ 64 - 0
bureau-of-education/main.js

@@ -0,0 +1,64 @@
+import Vue from 'vue';
+import App from './App';
+
+Vue.config.productionTip = false;
+
+App.mpType = 'app';
+
+// 此处为演示Vue.prototype使用,非uView的功能部分
+Vue.prototype.vuePrototype = '枣红';
+
+// 引入全局uView
+import uView from 'uview-ui';
+Vue.use(uView);
+
+// 此处为演示vuex使用,非uView的功能部分
+import store from '@/store';
+
+// 引入uView提供的对vuex的简写法文件
+let vuexStore = require('@/store/$u.mixin.js');
+Vue.mixin(vuexStore);
+
+// 引入uView对小程序分享的mixin封装
+let mpShare = require('uview-ui/libs/mixin/mpShare.js');
+Vue.mixin(mpShare);
+
+// i18n部分的配置
+// 引入语言包,注意路径
+import Chinese from '@/common/locales/zh.js';
+import English from '@/common/locales/en.js';
+
+// VueI18n
+import VueI18n from '@/common/vue-i18n.min.js';
+
+// VueI18n
+Vue.use(VueI18n);
+
+const i18n = new VueI18n({
+	// 默认语言
+	locale: 'zh',
+	// 引入语言文件
+	messages: {
+		'zh': Chinese,
+		'en': English,
+	}
+});
+
+// 由于微信小程序的运行机制问题,需声明如下一行,H5和APP非必填
+Vue.prototype._i18n = i18n;
+
+const app = new Vue({
+	i18n,
+	store,
+	...App
+});
+
+// http拦截器,将此部分放在new Vue()和app.$mount()之间,才能App.vue中正常使用
+import httpInterceptor from '@/common/http.interceptor.js';
+Vue.use(httpInterceptor, app);
+
+// http接口API抽离,免于写url或者一些固定的参数
+import httpApi from '@/common/http.api.js';
+Vue.use(httpApi, app);
+
+app.$mount();

+ 142 - 0
bureau-of-education/manifest.json

@@ -0,0 +1,142 @@
+{
+    "name" : "潜山教育收发文系统",
+    "appid" : "__UNI__C111CD4",
+    "description" : "潜山教育收发文系统",
+    "versionName" : "1.1.0",
+    "versionCode" : 110,
+    "transformPx" : false,
+    "app-plus" : {
+        // APP-VUE分包,可提APP升启动速度,2.7.12开始支持,兼容微信小程序分包方案,默认关闭
+        "optimization" : {
+            "subPackages" : true
+        },
+        "compatible" : {
+            "ignoreVersion" : true //true表示忽略版本检查提示框,HBuilderX1.9.0及以上版本支持
+        },
+        "safearea" : {
+            "bottom" : {
+                "offset" : "none"
+            }
+        },
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        "usingComponents" : true,
+        "nvueCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "modules" : {},
+        "distribute" : {
+            "android" : {
+                "permissions" : [],
+                "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ],
+                "autoSdkPermissions" : false
+            },
+            "ios" : {
+                "dSYMs" : false
+            },
+            "sdkConfigs" : {
+                "ad" : {}
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "static/logo.png",
+                    "xhdpi" : "static/logo.png",
+                    "xxhdpi" : "",
+                    "xxxhdpi" : ""
+                },
+                "ios" : {
+                    "appstore" : "",
+                    "ipad" : {
+                        "app" : "",
+                        "app@2x" : "",
+                        "notification" : "",
+                        "notification@2x" : "",
+                        "proapp@2x" : "",
+                        "settings" : "",
+                        "settings@2x" : "",
+                        "spotlight" : "",
+                        "spotlight@2x" : ""
+                    },
+                    "iphone" : {
+                        "app@2x" : "",
+                        "app@3x" : "",
+                        "notification@2x" : "",
+                        "notification@3x" : "",
+                        "settings@2x" : "",
+                        "settings@3x" : "",
+                        "spotlight@2x" : "",
+                        "spotlight@3x" : ""
+                    }
+                }
+            }
+        }
+    },
+    "quickapp" : {},
+    "mp-weixin" : {
+        "appid" : "wxf556d2b0c34da8cf",
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : true,
+            "minified" : true,
+            "postcss" : true
+        },
+        "optimization" : {
+            "subPackages" : true
+        },
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "wxf556d2b0c34da8cf"
+            }
+        }
+    },
+    "mp-alipay" : {
+        "usingComponents" : true,
+        "component2" : true
+    },
+    "mp-qq" : {
+        "optimization" : {
+            "subPackages" : true
+        },
+        "appid" : ""
+    },
+    "mp-baidu" : {
+        "usingComponents" : true,
+        "appid" : ""
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true,
+        "appid" : ""
+    },
+    "h5" : {
+        "devServer" : {
+            "port" : 8080,
+            "disableHostCheck" : true,
+            "proxy" : {
+                "/wxuser" : {
+                    "target" : "https://test.xinxiny.com:8100",
+                    "changeOrigin" : true,
+                    "secure" : false,
+                    "pathRewrite" : {
+                        "^/wxuser" : ""
+                    }
+                }
+            },
+            "https" : false
+        },
+        "template" : "template.h5.html",
+        "router" : {
+            "mode" : "history",
+            "base" : ""
+        },
+        "optimization" : {
+            "treeShaking" : {
+                "enable" : false
+            }
+        },
+        "title" : "新星源"
+    }
+}

+ 23 - 0
bureau-of-education/package.json

@@ -0,0 +1,23 @@
+{
+  "name": "教育局发文系统",
+  "version": "1.0.0",
+  "description": "<p align=\"center\">\r     <img alt=\"logo\" src=\"https://uviewui.com/common/logo.png\" width=\"120\" height=\"120\" style=\"margin-bottom: 10px;\">\r </p>\r <h3 align=\"center\" style=\"margin: 30px 0 30px;font-weight: bold;font-size:40px;\">uView</h3>\r <h3 align=\"center\">多平台快速开发的UI框架</h3>",
+  "main": "main.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/YanxinNet/uView.git"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "bugs": {
+    "url": "https://github.com/YanxinNet/uView/issues"
+  },
+  "homepage": "https://github.com/YanxinNet/uView#readme",
+  "dependencies": {
+    "vue-i18n": "^8.20.0"
+  }
+}

+ 203 - 0
bureau-of-education/pages.json

@@ -0,0 +1,203 @@
+{
+	"easycom": {
+		"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
+	},
+	// "condition": { //模式配置,仅开发期间生效
+	// 	"current": 0, //当前激活的模式(list 的索引项)
+	// 	"list": [{
+	// 		"name": "test", //模式名称
+	// 		"path": "pages/componentsC/test/index", //启动页面,必选
+	// 		"query": "uuid=c4bba940-f69e-11ea-a419-6bafda9d095e&__id__=1" //启动参数,在页面的onLoad函数里面得到
+	// 	}]
+	// },
+	"pages": [
+		{
+			"path": "pages/tabbar/index/index",
+			"style": {
+				"navigationBarTitleText": "首页"
+			}
+		},
+		{
+			"path": "pages/tabbar/login/index",
+			"style": {
+				"navigationBarTitleText": "登陆"
+			}
+		},
+		{
+			"path": "pages/tabbar/addressee/index",
+			"style": {
+				"navigationBarTitleText": "收文"
+			}
+		},
+		{
+			"path": "pages/tabbar/post/index",
+			"style": {
+				"navigationBarTitleText": "发文"
+			}
+		},
+		{
+			"path": "pages/tabbar/center/index",
+			"style": {
+				"navigationBarTitleText": "我的"
+			}
+		}
+	],
+	"subPackages": [
+		{
+			"root": "pages/indexView",
+			"pages": [
+				{
+					"path": "archive/index",
+					"style": {
+						"navigationBarTitleText": "待归档"
+					}
+				},
+				{
+					"path": "addressee/index",
+					"style": {
+						"navigationBarTitleText": "收文"
+					}
+				},
+				{
+					"path": "addressee/details",
+					"style": {
+						"navigationBarTitleText": "收文详情"
+					}
+				},
+				{
+					"path": "addPost/index",
+					"style": {
+						"navigationBarTitleText": "新增发文"
+					}
+				}
+			]
+		},
+		{
+			"root": "pages/postView",
+			"pages": [
+				{
+					"path": "approvalProcess/index",
+					"style": {
+						"navigationBarTitleText": "审核流程"
+					}
+				},
+				{
+					"path": "viewProgress/index",
+					"style": {
+						"navigationBarTitleText": "查看进度"
+					}
+				},
+				{
+					"path": "postDetails/index",
+					"style": {
+						"navigationBarTitleText": "发文详情"
+					}
+				},
+				{
+					"path": "selectPeople/index",
+					"style": {
+						"navigationBarTitleText": "选择人员"
+					}
+				}
+			]
+		},
+		{
+			"root": "pages/centerView",
+			"pages": [
+				{
+					"path": "collection/index",
+					"style": {
+						"navigationBarTitleText": "催收文"
+					}
+				},
+				{
+					"path": "collection/details",
+					"style": {
+						"navigationBarTitleText": "催收文详情"
+					}
+				},
+				{
+					"path": "collection/collector",
+					"style": {
+						"navigationBarTitleText": "选择催收文人员"
+					}
+				},
+				{
+					"path": "schedule/index",
+					"style": {
+						"navigationBarTitleText": "待办"
+					}
+				},
+				{
+					"path": "schedule/details",
+					"style": {
+						"navigationBarTitleText": "待办详情"
+					}
+				},
+				{
+					"path": "toExamine/index",
+					"style": {
+						"navigationBarTitleText": "审核"
+					}
+				},
+				{
+					"path": "toExamine/auditDetails",
+					"style": {
+						"navigationBarTitleText": "审核详情"
+					}
+				},
+				{
+					"path": "filed/index",
+					"style": {
+						"navigationBarTitleText": "已归档"
+					}
+				},
+				{
+					"path": "changPwd/index",
+					"style": {
+						"navigationBarTitleText": "修改密码"
+					}
+				}
+			]
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "white",
+		"navigationBarTitleText": "教育局收发文",
+		"navigationBarBackgroundColor": "#FFFFFF",
+		"backgroundColor": "#FFFFFF",
+		"navigationStyle":"custom"
+	},
+	"tabBar": {
+		"color": "#AAAAAA",
+		"selectedColor": "#343434",
+		"backgroundColor": "#FFFFFF",
+		"borderStyle": "black",
+		"list": [
+			{
+				"pagePath": "pages/tabbar/index/index",
+				"iconPath": "static/tabbar/1.png",
+				"selectedIconPath": "static/tabbar/11.png",
+				"text": "首页"
+			},
+			{
+				"pagePath": "pages/tabbar/addressee/index",
+				"iconPath": "static/tabbar/2.png",
+				"selectedIconPath": "static/tabbar/22.png",
+				"text": "收文"
+			},
+			{
+				"pagePath": "pages/tabbar/post/index",
+				"iconPath": "static/tabbar/3.png",
+				"selectedIconPath": "static/tabbar/33.png",
+				"text": "发文"
+			},
+			{
+				"pagePath": "pages/tabbar/center/index",
+				"iconPath": "static/tabbar/4.png",
+				"selectedIconPath": "static/tabbar/44.png",
+				"text": "我的"
+			}
+		]
+	}
+}

+ 129 - 0
bureau-of-education/pages/centerView/changPwd/index.vue

@@ -0,0 +1,129 @@
+<template>
+	<view class="changePwd">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		 
+		 <view class="input">
+			 <view class="lable">旧密码</view>
+			 <input type="text" v-model="oldPassword" placeholder="请输入旧密码" />
+		 </view>
+		 <view class="input">
+			 <view class="lable">新密码</view>
+			 <input type="text" v-model="newPassword" placeholder="请输入新密码" />
+		 </view>
+		 <view class="input">
+			 <view class="lable">再次确认密码</view>
+			 <input type="text" v-model="newPassword1" placeholder="请再次输入新密码" />
+		 </view>
+		 <view class="btn" @click="getQueryList">确认修改</view>
+	</view>
+</template>
+
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '##343434', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '##343434',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle: '修改密码' //导航标题
+				},
+				oldPassword: '',
+				newPassword: '',
+				newPassword1: '',
+			}
+		},
+		onLoad() {
+			
+		},
+		computed: {
+
+		},
+		methods: {
+			async getQueryList() {
+				if (!this.oldPassword) {
+					return uni.showToast({
+						'title': '请输入旧密码',
+						icon: 'none'
+					})
+				}
+				if (!this.newPassword) {
+					return uni.showToast({
+						'title': '请输入新密码',
+						icon: 'none'
+					})
+				}
+				if (!this.newPassword1) {
+					return uni.showToast({
+						'title': '请再次输入新密码',
+						icon: 'none'
+					})
+				}
+				if (this.newPassword != this.newPassword1) {
+					return uni.showToast({
+						'title': '新密码不匹配',
+						icon: 'none'
+					})
+				}
+				let res = await this.$u.put(`system/user/profile/updatePwd?oldPassword=${this.oldPassword}&newPassword=${this.newPassword}`, {
+					"oldPassword": this.oldPassword,
+					"newPassword": this.newPassword
+				})
+				console.log(res)
+				if (res.code ==500){
+					uni.showToast({
+						'title': res.msg,
+						icon: 'none'
+					})
+				} else {
+					uni.showToast({
+						'title': res.msg
+					})
+					setTimeout(function(){
+						uni.navigateBack({
+							
+						})
+					}, 1000)
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.changePwd  {
+		height: 100%;
+		background: #fff;
+		.input {
+			display: flex;
+			align-items: center;
+			padding: 22rpx 34rpx;
+			font-size: 28rpx;
+			font-weight: 500;
+			color: #343434;
+			input {
+				font-size: 28rpx;
+				font-weight: 400;
+				color: #AAAAAA;
+				flex: 1;
+				text-align: right;
+			}
+		}
+		.btn {
+			width: 90%;
+			height: 82rpx;
+			background: #009FE8;
+			border-radius: 6px;
+			margin: 100rpx auto;
+			color: #fff;
+			text-align: center;
+			line-height: 82rpx;
+			font-size: 28rpx;
+		}
+	}
+</style>

+ 334 - 0
bureau-of-education/pages/centerView/collection/collector.vue

@@ -0,0 +1,334 @@
+<template>
+	<view class="collector">
+		<u-navbar ref="uNavbar" :border-bottom="false" :title-width="340" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="title">
+			当前还 <text>{{notRead}}人</text> 未读
+		</view>
+		<view class="table">
+			<view class="thead">
+				<view class="tr">
+					<view class="th check-th"></view>
+					<view class="th">负责人</view>
+					<view class="th">单位</view>
+					<view class="th">开始时间</view>
+					<view class="th">结束时间</view>
+				</view>
+			</view>
+			<!-- <checkbox-group @change="checkboxChange"> -->
+				<view class="tbody" v-if="data.length">
+					<view class="tr" v-for="(item, index) in data" :key="index">
+						<!-- <view class="">
+							<checkbox :value="String(item.id)" :checked="item.checked" color="#fff" />
+						</view> -->
+						<view class="td check-td check">
+							<image v-if="!item.checked" @click="selected(item)" class="normal" src="../../../static/img/icon_qx_normal.png"></image>
+							<image v-else class="selected" @click="selected(item)" src="../../../static/img/icon_qx_selected.png"></image>
+						</view>
+						<view class="td">
+							{{item.receive_user_name}}
+						</view>
+						<view class="td">
+							{{item.receive_dept_name}}
+						</view>
+						<view class="td">
+							{{item.send_message_time}}
+						</view>
+						<view class="td">
+							{{item.receive_time == null ? '未结束' : item.receive_time}}
+						</view>
+					</view>
+				</view>
+			<!-- </checkbox-group> -->
+			<view class="no-data" v-else>暂无数据</view>
+		</view>
+		<view class="btns" v-if="data.length">
+			<view class="left" @click="allchange()">
+				<view class="check">
+					<image v-if="!checked"  class="normal" src="../../../static/img/icon_qx_normal.png"></image>
+					<image v-else class="selected"  src="../../../static/img/icon_qx_selected.png"></image>
+				</view>
+				<view>全选</view>
+				<!-- <checkbox-group @change=""> -->
+					<!-- <label class="check-td">
+						<checkbox value="all" :checked="" color="#fff" />全选
+					</label> -->
+				<!-- </checkbox-group> -->
+			</view>
+			<view class="right" @click="insertList">
+				催收文
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				checked: false,
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '#333', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle: '选择催收文人员' //导航标题
+				},
+				data: [],
+				total: 0,
+				notRead: 0,
+				pageNo: 1
+			}
+		},
+		onReachBottom() {
+			if (this.data.length >= this.total) {
+				return
+			}
+			this.pageNo += 1
+			this.statistic()
+		},
+		onLoad(options) {
+			this.id = options.id
+			this.statistic()
+			this.init()
+		},
+		methods: {
+			selected(item) {
+				item.checked = !item.checked
+			},
+			async insertList() {
+				let data = []
+			
+				this.data.forEach(item => {
+					if (item.checked) {
+						data.push({
+							"message_id": item.message_id,
+							"message_title": item.message_title,
+							"send_user_name": item.send_user_name,
+							"send_user_id": item.send_user_id,
+							"message_time": item.send_message_time,
+							"receive_user_id": item.receive_user_id,
+							"receive_user_name": item.receive_user_name
+						})
+					}
+				})
+				
+				if (!data.length) {
+					return uni.showToast({
+						title: '请勾选催收人员'
+					})
+				}
+				 
+				let res = await this.$u.post('boman-web-core/p/cs/insertList', {
+					 "tableName": "urge_read_message",
+					 "dataList":  data
+				})
+				if (res.code == 200) {
+					uni.showToast({
+						title: '催收成功',
+						duration: 2500
+					})
+					this.pageNo = 1
+					this.statistic()
+					this.init()
+					this.checked = false
+				} else {
+					uni.showToast({
+						title: res.msg,
+						icon: 'none',
+						duration: 2000
+					})
+				}
+			},
+			async statistic() {
+				// 
+				let res = await this.$u.post('boman-web-core/p/cs/queryList', {
+					 "table": "boman_message_receive",
+					 "pageNo": this.pageNo,
+					 "isUi": false,
+					 "pageSize": 10,
+					 "orderBy": "status desc",
+					 "fixedData": {
+						 "condition": {
+							 "visible": "Y",
+							 "message_id": this.id,
+							 "status":"N",
+							 "is_del":"N"
+						 }
+					 }
+				})
+				if (res.data && res.data.rows) {
+					res.data.rows = res.data.rows.map(item => {
+						return Object.assign({}, item, {
+							checked: false
+						})
+					})
+					if (this.pageNo == 1) {
+						this.data = res.data.rows
+						this.total = res.data.total
+					} else {
+						this.data = this.data.concat(res.data.rows)
+					}
+				}
+			},
+			async init() {
+				// 
+				let res = await this.$u.get('boman-web-core/messageReceive/recieve/statistic/'+ this.id)
+				if (res.code == 200) {
+					this.notRead =  res.data.notRead
+				}
+			},
+			checkboxChange: function(e) {
+				var items = this.data,
+					values = e.detail.value;
+				for (var i = 0, lenI = items.length; i < lenI; ++i) {
+					const item = items[i]
+					if (values.includes(String(item.id))) {
+						this.$set(item, 'checked', true)
+					} else {
+						this.$set(item, 'checked', false)
+					}
+				}
+			},
+			allchange(e) {
+				var items = this.data,
+					values = this.checked;
+					if (!values) {
+						this.checked = true
+						for (var i = 0, lenI = items.length; i < lenI; ++i) {
+							const item = items[i]
+							this.$set(item, 'checked', true)
+						}
+					} else {
+						this.checked = false
+						for (var i = 0, lenI = items.length; i < lenI; ++i) {
+							const item = items[i]
+							this.$set(item, 'checked', false)
+						}
+					}
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.collector {
+		width: 100%;
+		height: 100%;
+		background: #fff;
+
+		/deep/ .u-navbar-inner {
+			box-shadow: none;
+		}
+
+		.title {
+			height: 56rpx;
+			background: #FFFFFF;
+			line-height: 56rpx;
+			box-shadow: 0px 6rpx 4rpx 0px rgba(218, 218, 218, 0.35);
+			font-size: 24rpx;
+			color: #343434;
+			padding-left: 32rpx;
+
+			text {
+				color: #FF3131;
+				margin: 0 12rpx;
+			}
+		}
+
+		.btns {
+			position: fixed;
+			bottom: 0;
+			height: 84rpx;
+			display: flex;
+			width: 100%;
+			border-top: 1px solid #E5E5E5;
+			/deep/ .left {
+				width: 190rpx;
+				background: #FFFFFF;
+				text-align: center;
+				font-size: 28rpx;
+				font-weight: 500;
+				color: #343434;
+				line-height: 84rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				image {
+					margin-right: 10rpx;
+				}
+				uni-checkbox {
+					margin-right: 20rpx;
+				}
+			}
+			.right {
+				flex: 1;
+				background: #009FE8;
+				color: #fff;
+				text-align: center;
+				line-height: 84rpx;
+			}
+		}
+
+		.table {
+			.tr {
+				display: flex;
+
+				.th,
+				.td {
+					flex: 1;
+					text-align: center;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+				}
+
+				.td {
+					padding: 20rpx 4rpx;
+					font-size: 20rpx;
+					color: #333333;
+					border-bottom: 1px solid #E5E5E5;
+				}
+			
+			}
+
+			.thead {
+				padding: 33rpx 0;
+				font-size: 24rpx;
+				font-weight: bold;
+				color: #333333;
+			}
+		}
+		/deep/ .check-td,
+		.check-th {
+			max-width: 8%;
+		
+			.uni-checkbox-input {
+				margin: 0 auto;
+				width: 0rpx;
+				height: 0rpx;
+				padding: 12rpx;
+		
+				&.uni-checkbox-input-checked {
+					background-color: #009FE8;
+					border: 1px solid #009FE8;
+				}
+		
+				&.uni-checkbox-input-checked:before {
+					font-size: 20rpx;
+				}
+			}
+		}
+		.check {
+		
+			.normal,
+			.selected {
+				width: 30rpx;
+				height: 30rpx;
+			}
+		}
+	}
+</style>

+ 366 - 0
bureau-of-education/pages/centerView/collection/details.vue

@@ -0,0 +1,366 @@
+<template>
+	<view class="details">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="box">
+			<view class="list">
+				<view class="title">文件标题</view>
+				<view class="value">{{json.message_title}}</view>
+			</view>
+			<view class="list">
+				<view class="title">拟稿人</view>
+				<view class="value">{{json.send_user_name}}</view>
+			</view>
+			<view class="list">
+				<view class="title">发文日期</view>
+				<view class="value">{{json.message_time}}</view>
+			</view>
+			<view class="list">
+				<view class="title">流程结束日期</view>
+				<view class="value">{{json.finish_time == null ? '未结束' : json.finish_time}}</view>
+			</view>
+			<view class="list">
+				<view class="title">发文字号</view>
+				<view class="value">{{json.message_code}}</view>
+			</view>
+			<view class="list">
+				<view class="title">正文查看</view>
+				<view class="value a" @click="loadFile(item.url,item.originalName)" v-for="(item, index) in json.message_upload" :key="index">{{item.originalName}}</view>
+			</view>
+			<view class="list">
+				<view class="title">附件查看</view>
+				<view class="files">
+					<view class="file" @click="loadFile(item.url,item.originalName)" v-for="(item, index) in json.message_enclosure" :key="index">
+						<image src="/static/img/icon_sc_wj.png"></image>
+						<text>{{item.originalName}}</text>
+					</view>
+				
+				</view>
+			</view>
+			<view class="list">
+				<u-collapse v-if="receive_user_name">
+						<u-collapse-item title="分发人员" >
+							{{receive_user_name}}
+						</u-collapse-item>
+					</u-collapse>
+			</view>
+			<view class="list">
+				<u-collapse v-if="receive_dept_name">
+						<u-collapse-item title="分发单位" >
+							{{receive_dept_name}}
+						</u-collapse-item>
+					</u-collapse>
+			</view>
+			<view class="list">
+				<view class="title">备注</view>
+				<view class="value">{{json.message_remark}}</view>
+			</view>
+			<view class="btns">
+				<view class="btn" @click="approvalProcess">催收文</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				imgUrl: '',
+				show: true,
+				value: '',
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '#333', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle: '催收文详情' //导航标题
+				},
+				json: {
+					message_title: '',
+					send_user_name: '',
+					message_time: '',
+					message_code: '',
+					message_remark: '',
+					finish_time: '',
+					message_upload: [],
+					message_enclosure: []
+				},
+				receive_user_name: '',
+				receive_dept_name: '',
+				id: ''
+			}
+		},
+		onLoad(options) {
+			this.id = options.id
+			this.getOneMap(options.id)
+			this.getChldren(options.id)
+		},
+		methods: {
+			loadFile(url,name) {
+				const manage = uni.getFileSystemManager();
+				uni.downloadFile({
+					url: url,
+					success: (res) => {
+						let path = res.tempFilePath;
+						// #ifdef MP-WEIXIN
+						var savePath = wx.env.USER_DATA_PATH + "/" + name
+						console.log(savePath);
+						if (res.statusCode == 200) {
+							manage.saveFile({
+								tempFilePath: res.tempFilePath,
+								filePath: savePath,
+								success:function(ress){
+									uni.openDocument({
+										 filePath: ress.savedFilePath,
+										 // fileType: "pdf",
+										 success: function (resss) {
+											uni.hideLoading()
+										 }
+									 })
+								}
+							})
+						}
+						// #endif
+						// #ifndef MP-WEIXIN
+							uni.openDocument({
+								filePath: path,
+								showMenu: true,
+								success: function (res) {
+								    // console.log('打开文档成功');
+								}
+							});
+						// #endif
+						
+					}
+				});
+			},
+			async getOneMap (id) {
+				let that = this
+				let data = { 
+					"table": "boman_message",
+					"fixedData": {
+					    "id": id
+					}
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/one/map`,data)
+				
+				if (res.code == 200) {
+					if (res.data) {
+						let {message_title, send_user_name, message_time, message_code, message_remark, message_upload = '', message_enclosure = '', finish_time} = res.data || {}
+						this.json = {
+							message_title,
+							send_user_name,
+							message_time,
+							message_code,
+							finish_time,
+							message_remark,
+							message_upload: message_upload ? JSON.parse(message_upload) : [],
+							message_enclosure: message_enclosure ? JSON.parse(message_enclosure) : []
+						}
+					}
+				}
+			},
+			async getChldren (id) {
+				let that = this
+				let data = { 
+					"table": "boman_message_receive",
+					"pageNo": 1,
+					"isUi": false,
+					"pageSize": 1000,
+					"orderBy": "create_time desc",
+					"fixedData": {
+					    "condition": {
+					        "visible": "Y",
+					        "message_id": id,
+					        "is_del":"N"
+					    }
+					}
+			
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/queryList`,data)
+			
+				if (res.code == 200) {
+					this.receive_user_name = res.data.rows.map(item => {
+						return  item.receive_user_name
+					}).join(',')
+					this.receive_dept_name = res.data.rows.map(item => {
+						return  item.receive_dept_name
+					}).join(',')
+					// let selectData = res.data.rows.map(item => {
+					// 	return {
+					// 		userName: item.receive_user_name,
+					// 		deptName: item.receive_dept_name,
+					// 		id: item.receive_user_id,
+					// 		nickName: item.receive_user_name,
+					// 		"dept": {},
+					// 		"roles": []
+					// 	}
+					// })
+					// if (selectData && selectData.length) {
+					// 	this.getDeptNameAndRoleName(selectData)
+					// }
+				}
+			},
+			async getDeptNameAndRoleName (data) {
+				
+				let res = await this.$u.post(`system/user/getDeptNameAndRoleName`, data)
+				if (res.deptNameList) {
+					this.receive_dept_name = res.deptNameList.join(',')
+				}
+			},
+			approvalProcess () {
+				uni.navigateTo({
+					url: "/pages/centerView/collection/collector?id=" + this.id
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.details{
+		background: #fff;
+		position: relative;
+		.mack {
+			position: fixed;
+			width: 100%;
+			height: 100%;
+			z-index: 9999;
+			top: 88rpx;
+			background-color: rgba(0,0,0,0.2);
+			.box {
+				width: 612rpx;
+				height: 512rpx;
+				background: #FFFFFF;
+				border-radius: 6rpx;
+				top: 40%;
+				left: 50%;
+				transform: translate(-50%, -40%);
+				padding: 34rpx;
+				.head {
+					position: relative;
+					.title {
+						font-size: 30rpx;
+						font-weight: bold;
+						color: #343434;
+						text-align: center;
+					}
+					image {
+						position: absolute;
+						width: 20rpx;
+						height: 20rpx;
+						right: 0;
+						top: 50%;
+						transform: translateY(-50%);
+					}
+				}
+				.middle {
+					margin-top: 50rpx;
+					textarea {
+						width: 510rpx;
+						padding: 20rpx;
+						height: 210rpx;
+						background: #FFFFFF;
+						border: 1px solid #009FE8;
+						border-radius: 6rpx;
+						font-size: 28rpx;
+						color: #AAAAAA;
+					}
+				}
+				.btn {
+					width: 550rpx;
+					height: 76rpx;
+					background: #009FE8;
+					border-radius: 6rpx;
+					color: #fff;
+					text-align: center;
+					line-height: 76rpx;
+					font-size: 30rpx;
+					margin-top: 36rpx;
+				}
+			}
+		}
+		.status {
+			position: absolute;
+			width: 160rpx;
+			height: 94rpx;
+			right: 36rpx;
+			top: 160rpx;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.box {
+			position: relative;
+			z-index: 1;
+			padding: 0 36rpx;
+			padding-bottom: 80rpx;
+			.list {
+				margin-top: 66rpx;
+				
+				.title {
+					font-size: 28rpx;
+					font-weight: bold;
+					color: #343434;
+				}
+				.value {
+					font-size: 25rpx;
+					color: #666666;
+					margin-top: 30rpx;
+				}
+				.a {
+					color: #009FE8;
+				}
+				.files {
+					.file {
+						display: flex;
+						align-items: center;
+						margin-top: 30rpx;
+						font-size: 25rpx;
+						font-weight: 500;
+						color: #343434;
+						image {
+							width: 24rpx;
+							height: 20rpx;
+							margin-right: 10rpx;
+						}
+					}
+				}
+				/deep/ .u-collapse {
+					.u-collapse-title {
+						font-size: 28rpx;
+						font-weight: bold;
+						color: #343434;
+					}
+					.u-collapse-content {
+						font-size: 25rpx;
+						color: #666666;
+					}
+				}
+				
+			}
+			.btns {
+				padding-top: 80rpx;
+				.btn {
+					width: 100%;
+					height: 84rpx;
+					background: #009FE8;
+					border-radius: 8rpx;
+					color: #fff;
+					font-size: 28rpx;
+					text-align: center;
+					line-height: 84rpx;
+					margin-top: 26rpx;
+					&:nth-child(2) {
+						background: #FF3131;
+					}
+				}
+			
+			}
+		}
+	}
+</style>

+ 150 - 0
bureau-of-education/pages/centerView/collection/index.vue

@@ -0,0 +1,150 @@
+<template>
+	<view class="collection">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="contentMain" v-if="data.length">
+			<view  v-for="(item, index) in data" :key="item.id"
+			 class="u-swipe-action">
+				<view class="item">
+					<view class="title">{{item.message_title}}</view>
+					<view class="userInfo">
+						<view class="user">
+							<view class="name">拟稿人:{{item.send_user_name}}</view>
+							<view class="name">发文日期:{{item.message_time}}</view>
+							<view class="name">流程结束日期:{{item.finish_time == null ? '未结束' : item.finish_time}}</view>
+						</view>
+						<!-- <view class="status">发文审核中</view> -->
+						<view class="statusBtn" @click="approvalProcess(item)">催收文</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="no-data" v-else>暂无数据</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '##343434', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '##343434',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle: '催收文' //导航标题
+				},
+				data: [],
+				pageNo: 1,
+				total: 0,
+				userInfo: {}
+			}
+		},
+		onLoad() {
+			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
+			this.getQueryList()
+		},
+		computed: {
+
+		},
+		onReachBottom() {
+			if (this.data.length >= this.total) {
+				return
+			}
+			this.pageNo += 1
+			this.getQueryList()
+		},
+		methods: {
+			async getQueryList(message_situation) {
+				let res = await this.$u.post(`boman-web-core/p/cs/queryList`, {
+					"table": "boman_message",
+					"pageNo": this.pageNo,
+					"isUi": false,
+					"pageSize": 10,
+					"orderBy": "create_time desc",
+					"fixedData": {
+					    "condition": {
+					        "message_situation": "1",
+					        "send_user_id": this.userInfo.id,
+					        "is_del":"N"
+					    }
+					}
+				})
+				if (res.data && res.data.rows) {
+					res.data.rows = res.data.rows.map(item => {
+						return Object.assign({}, item, {
+							show: false
+						})
+					})
+					if (this.pageNo == 1) {
+						this.data = res.data.rows
+						this.total = res.data.total
+					} else {
+						this.data = this.data.concat(res.data.rows)
+					}
+				}
+			},
+			approvalProcess (item) {
+				uni.navigateTo({
+					url: "/pages/centerView/collection/details?id=" + item.id
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.collection {
+		height: 100%;
+		background: #fff;
+		.contentMain {
+			padding: 0 20rpx;
+			.item {
+				background: #fff;
+				.title {
+					font-size: 28rpx;
+					font-weight: bold;
+					color: #343434;
+					padding: 30rpx 30rpx 0 30rpx;
+					white-space: break-word;
+					word-break:break-all;
+				}
+
+				.userInfo {
+					display: flex;
+					align-items: flex-end;
+					border-bottom: solid 1rpx #DADADA;
+					padding: 30rpx;
+
+					.user {
+						flex: 1;
+						color: #666;
+						font-size: 24rpx;
+
+						.name {
+							margin-bottom: 10rpx;
+						}
+					}
+
+					.status {
+						color: #009FE8;
+						font-size: 26rpx;
+						margin-bottom: 4rpx;
+					}
+
+					.statusBtn {
+						color: #fff;
+						font-size: 22rpx;
+						margin-bottom: 4rpx;
+						background: #61C320;
+						padding: 10rpx 20rpx;
+						border-radius: 40rpx;
+					}
+				}
+			}
+		}
+
+	}
+</style>

+ 301 - 0
bureau-of-education/pages/centerView/filed/index.vue

@@ -0,0 +1,301 @@
+<template>
+	<view class="archive">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle" :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="topNav" :style="{top: topNav + 'px'}">
+			<view class="item">
+				<view class="text" :class="{active: active == 0}" @click="setNavs(0)">发文</view>
+			</view>
+			<view class="item">
+				<view class="text" :class="{active: active == 1}" @click="setNavs(1)">收文</view>
+			</view>
+		</view>
+		<view class="searchBox">
+			<view class="inputBox">
+				<u-input class="input" v-model="searchVal" type="text" height="70" placeholder="请输入标题" placeholderStyle="{'color:#AAAAAA'}" />
+				<view class="btn" @click="search">查询</view>
+			</view>
+			<view class="timeBox" @click="showTime = true">
+				<image class="r" src="/static/img/icon_xzrq.png" mode=""></image>
+				<view class="text">{{message_time || '选择日期'}}</view>
+				<image class="d" src="/static/img/icon_xzrq_xl.png" mode=""></image>
+			</view>
+		</view>
+		<view class="contentMain" v-if="list.length">
+			<view 
+				v-for="(item, index) in list" 
+				:key="item.id" 
+				class="u-swipe-action "
+					>
+				<view class="item">
+					<view class="title">{{item.message_title}}</view>
+					<view class="userInfo">
+						<view class="user">
+							<view class="name">拟稿人:{{item.send_user_name}}</view>
+							<view class="name">发文日期:{{item.message_time}}</view>
+							<view class="name">流程结束日期:{{item.finish_time}}</view>
+						</view>
+						<view class="status">{{item.status}}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="no-data" v-else>暂无数据</view>
+		<u-picker mode="time" v-model="showTime" :params="params" @confirm="getTime"></u-picker>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav:{
+					backgroundColor:'#fff',  //背景色
+					color:'#333',  //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle:'已归档' //导航标题
+				},
+				showTime: false,
+				searchVal: '',
+				topNav: 0,
+				list: [],
+				disabled: false,
+				btnWidth: 180,
+				show: false,
+				userInfo: {},
+				pageNo: 1,
+				active: 0,
+				message_time: '',
+				options: [
+					{
+						text: '归档',
+						style: {
+							backgroundColor: '#00B034'
+						}
+					}
+				],
+				params: {
+					year: true,
+					month: true,
+					day: true
+				},
+				total: 0
+			}
+		},
+		onReachBottom() {
+			if (this.list.length >= this.total) {
+				return
+			}
+			this.pageNo += 1
+			this.getQueryList()
+		},
+		onLoad() {
+			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
+			this.getQueryList()
+			setTimeout(() => {
+				this.topNav = (this.$refs.uNavbar.navbarHeight) + (this.$refs.uNavbar.statusBarHeight)
+			}, 10)
+		},
+		methods:{
+			search () {
+					this.pageNo = 1
+					this.getQueryList()
+			},
+			async getQueryList() {
+				let res = await this.$u.post(`boman-web-core/p/cs/queryList`, {
+					"table": "boman_message",
+					"pageNo": this.pageNo,
+					"isUi": false,
+					"pageSize": 10,
+					"orderBy": "create_time desc",
+					"fixedData": {
+						"condition": {
+							"place_on_file": 2,
+							"send_user_id": this.userInfo.id,
+							"message_title": this.searchVal,
+							"create_time": this.message_time,
+							"is_del":"N"
+						}
+					}
+				})
+				if (res.data && res.data.rows) {
+					res.data.rows = res.data.rows.map(item => {
+						return Object.assign({}, item, {
+							show: false
+						})
+					})
+					if (this.pageNo == 1) {
+						this.list = res.data.rows
+					} else {
+						this.list = this.list.concat(res.data.rows)
+					}
+				}
+			},
+			getTime(e) {
+				// console.log(e);
+				this.message_time = `${e.year}-${e.month}-${e.day}`
+				this.pageNo = 1
+				this.getQueryList()
+			},
+			async click(index, index1) {
+				let res = await this.$u.get('boman-web-core/p/cs/objectSave', {
+					"table": "boman_message",
+					    "objId": this.data[index].id,
+					    "fixedData": {
+					        "place_on_file": "2"
+					    }
+				})
+				if (res.code == 200) {
+					uni.showToast({
+						title: res.msg
+					})
+					this.pageNo = 1
+					this.getQueryList()
+				} else {
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					})
+				}
+			},
+			// 如果打开一个的时候,不需要关闭其他,则无需实现本方法
+			open(index) {
+				// 先将正在被操作的swipeAction标记为打开状态,否则由于props的特性限制,
+				// 原本为'false',再次设置为'false'会无效
+				this.list[index].show = true;
+				this.list.map((val, idx) => {
+					if(index != idx) this.list[idx].show = false;
+				})
+			},
+			setNavs (active) {
+				this.active = active
+				this.pageNo = 1
+				if (active == 0) {
+					this.getQueryList()
+				} else {
+					this.list = []
+				}
+			}
+		}
+	}
+</script>
+<style>
+	page{
+		background: #FFFFFF;
+	}
+</style>
+<style lang="scss" scoped>
+.topNav{
+	display: flex;
+	align-items: center;
+	background: #FFFFFF;
+	height: 90rpx;
+	box-shadow: 0px 14rpx 10rpx 0px rgba(218, 218, 218, 0.35);
+	position: sticky;
+	width: 100%;
+	left: 0;
+	z-index: 9;
+	.item{
+		flex: 1;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		.text{
+			font-size: 26rpx;
+			color: #191919;
+			font-weight: 600;
+		}
+		.active{
+			position: relative;
+			&::after{
+				content: '';
+				position: absolute;
+				width: 28rpx;
+				height: 6rpx;
+				background: #009FE8;
+				border-radius: 6rpx;
+				bottom: -14rpx;
+				left: 50%;
+				transform: translate(-50%,0);
+			}
+		}
+	}
+}
+.searchBox{
+	padding: 30rpx;
+	.inputBox{
+		display: flex;
+		align-items: center;
+		.input{
+			flex: 1;
+			width: 100%;
+			margin-right: 30rpx;
+			background: #EDEDED;
+			border-radius: 40rpx;
+			padding: 0 30rpx !important;
+		}
+		.btn{
+			background: #009FE8;
+			color: #FFFFFF;
+			font-size: 26rpx;
+			height: 60rpx;
+			line-height: 60rpx;
+			padding: 0 30rpx;
+			text-align: center;
+			border-radius: 40rpx;
+		}
+	}
+	
+}
+.timeBox{
+	padding: 30rpx 0 20rpx 0;
+	display: flex;
+	align-items: center;
+	.r{
+		width: 30rpx;
+		height: 33rpx;
+	}
+	.text{
+		font-size: 26rpx;
+		color: #343434;
+		margin: 0 14rpx;
+	}
+	.d{
+		width: 20rpx;
+		height: 20rpx;
+	}
+}
+.contentMain{
+	.item{
+		.title{
+			font-size: 28rpx;
+			font-weight: 700;
+			color: #343434;
+			padding: 30rpx 30rpx 0 30rpx;
+			white-space: break-word;
+			word-break:break-all;
+		}
+		.userInfo{
+			display: flex;
+			align-items: flex-end;
+			border-bottom: solid 1rpx #DADADA;
+			padding: 30rpx;
+			.user{
+				flex: 1;
+				color: #666;
+				font-size: 24rpx;
+				.name{
+					margin-bottom: 10rpx;
+				}
+			}
+			.status{
+				color: #AAAAAA;
+				font-size: 26rpx;
+				margin-bottom: 4rpx;
+			}
+		}
+	}
+}
+</style>

+ 386 - 0
bureau-of-education/pages/centerView/schedule/details.vue

@@ -0,0 +1,386 @@
+<template>
+	<view class="details">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<!-- <view class="status">
+			<image :src="imgUrl"></image>
+		</view> -->
+		<view class="box">
+			<view class="list">
+				<view class="title">文件标题</view>
+				<view class="value">{{json.message_title}}</view>
+			</view>
+			<view class="list">
+				<view class="title">拟稿人</view>
+				<view class="value">{{json.send_user_name}}</view>
+			</view>
+			<view class="list">
+				<view class="title">发文日期</view>
+				<view class="value">{{json.message_time}}</view>
+			</view>
+			<view class="list">
+				<view class="title">流程结束日期</view>
+				<view class="value">{{json.finish_time == null ? '未结束' : json.finish_time}}</view>
+			</view>
+			<view class="list">
+				<view class="title">发文字号</view>
+				<view class="value">{{json.message_code}}</view>
+			</view>
+			<view class="list">
+				<view class="title">正文查看</view>
+				<view class="value a" v-for="(item, index) in json.message_upload" :key="index" @click="loadFile(item.url,item.originalName)">{{item.originalName}}</view>
+			</view>
+			<view class="list">
+				<view class="title">附件查看</view>
+				<view class="files">
+					<view @click="loadFile(item.url,item.originalName)" class="file" v-for="(item, index) in json.message_enclosure" :key="index">
+						<image src="/static/img/icon_sc_wj.png"></image>
+						<text>{{item.originalName}}</text>
+					</view>
+				
+				</view>
+			</view>
+			<view class="list">
+				<u-collapse v-if="receive_user_name">
+						<u-collapse-item title="分发人员" >
+							{{receive_user_name}}
+						</u-collapse-item>
+					</u-collapse>
+			</view>
+			<view class="list">
+				<u-collapse v-if="receive_dept_name">
+						<u-collapse-item title="分发单位" >
+							{{receive_dept_name}}
+						</u-collapse-item>
+					</u-collapse>
+			</view>
+			<view class="list">
+				<view class="title">备注</view>
+				<view class="value">{{json.message_remark}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				imgUrl: '',
+				active: null,
+				show: false,
+				value: '',
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '#333', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle: '待办详情' //导航标题
+				},
+				json: {
+					message_title: '',
+					send_user_name: '',
+					message_time: '',
+					message_code: '',
+					message_remark: '',
+					finish_time: '',
+					message_upload: [],
+					message_enclosure: []
+				},
+				receive_user_name: '',
+				receive_dept_name: '',
+			}
+		},
+		onLoad(options) {
+			this.active = options.active
+			this.getOneMap(options.id)
+			this.getChldren(options.id)
+			this.receiveMessage(options.id, options.objId)
+			// this.imgUrl = options.flag == 1 ? ipc_yz_ybh : this.active == 0 ? pic_yz_wwc : this.active == 1 ? ipc_yz_ysh : ''
+		},
+		methods: {
+			loadFile(url,name) {
+				const manage = uni.getFileSystemManager();
+				uni.downloadFile({
+					url: url,
+					success: (res) => {
+						let path = res.tempFilePath;
+						// #ifdef MP-WEIXIN
+						var savePath = wx.env.USER_DATA_PATH + "/" + name
+						console.log(savePath);
+						if (res.statusCode == 200) {
+							manage.saveFile({
+								tempFilePath: res.tempFilePath,
+								filePath: savePath,
+								success:function(ress){
+									uni.openDocument({
+										 filePath: ress.savedFilePath,
+										 // fileType: "pdf",
+										 success: function (resss) {
+											uni.hideLoading()
+										 }
+									 })
+								}
+							})
+						}
+						// #endif
+						// #ifndef MP-WEIXIN
+							uni.openDocument({
+								filePath: path,
+								showMenu: true,
+								success: function (res) {
+								    // console.log('打开文档成功');
+								}
+							});
+						// #endif
+						
+					}
+				});
+			},
+			async getOneMap (id) {
+				let that = this
+				let data = { 
+					"table": "boman_message",
+					"fixedData": {
+					    "id": id
+					}
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/one/map`,data)
+				
+				if (res.code == 200) {
+					if (res.data) {
+						let {message_title, send_user_name, message_time, message_code, message_remark, message_upload = '', message_enclosure = '', finish_time} = res.data || {}
+						this.json = {
+							message_title,
+							send_user_name,
+							message_time,
+							message_code,
+							finish_time,
+							message_remark,
+							message_upload: message_upload ? JSON.parse(message_upload) : [],
+							message_enclosure: message_enclosure ? JSON.parse(message_enclosure) : []
+						}
+					}
+				}
+			},
+			setTime () {
+			  let dateTime
+			  let yy = new Date().getFullYear()
+			  let mm = new Date().getMonth() + 1
+			  let dd = new Date().getDate()
+			  let hh = new Date().getHours() < 10 ? ('0' + new Date().getHours()) : new Date().getHours()
+			  let mf = new Date().getMinutes() < 10 ? ('0' + new Date().getMinutes())
+				:
+				new Date().getMinutes()
+			  let ss = new Date().getSeconds() < 10 ? ('0' + new Date().getSeconds())
+				:
+				new Date().getSeconds()
+			  dateTime = yy + '-' + (mm < 10 ? ('0' + mm) : mm) + '-' + (dd < 10 ? ('0' + dd) : dd) + ' ' + hh + ":" + mf + ":" + ss
+			  return dateTime
+			},
+			async receiveMessage (id, objId) {
+				let that = this
+				let data = { 
+					"objId": objId, // 收文id
+					"messageId": id ,// 发文id
+					"receiveTime": this.setTime()// 当前时间
+			
+				}
+				let res = await that.$u.post(`boman-web-core/message/receiveMessage`,data)
+			},
+			async getChldren (id) {
+				let that = this
+				let data = {
+					"table": "boman_message_receive",
+			        "pageNo": 1,
+			        "isUi": false,
+			        "pageSize": 1000,
+			        "orderBy": "create_time desc",
+			        "fixedData": {
+			            "condition": {
+			                "visible": "Y",
+			                "message_id": id,
+			                "is_del":"N"
+			            }
+			        }
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/queryList`,data)
+			
+				if (res.code == 200) {
+					this.receive_user_name = res.data.rows.map(item => {
+						return  item.receive_user_name
+					}).join(',')
+					this.receive_dept_name = res.data.rows.map(item => {
+						return  item.receive_dept_name
+					}).join(',')
+					// let selectData = res.data.rows.map(item => {
+					// 	return {
+					// 		nickName: item.receive_user_name,
+					// 		deptName: item.receive_dept_name,
+					// 		id: item.receive_user_id,
+					// 		"dept": {},
+					// 		"roles": []
+					// 	}
+					// })
+					// if (selectData && selectData.length) {
+					// 	this.getDeptNameAndRoleName(selectData)
+					// }
+				}
+			},
+			async getDeptNameAndRoleName (data) {
+				
+				let res = await this.$u.post(`system/user/getDeptNameAndRoleName`, data)
+				if (res.deptNameList) {
+					this.receive_dept_name = res.deptNameList.join(',')
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.details{
+		background: #fff;
+		position: relative;
+		.mack {
+			position: fixed;
+			width: 100%;
+			height: 100%;
+			z-index: 9999;
+			top: 88rpx;
+			background-color: rgba(0,0,0,0.2);
+			.box {
+				width: 612rpx;
+				height: 512rpx;
+				background: #FFFFFF;
+				border-radius: 6rpx;
+				top: 40%;
+				left: 50%;
+				transform: translate(-50%, -40%);
+				padding: 34rpx;
+				.head {
+					position: relative;
+					.title {
+						font-size: 30rpx;
+						font-weight: bold;
+						color: #343434;
+						text-align: center;
+					}
+					image {
+						position: absolute;
+						width: 20rpx;
+						height: 20rpx;
+						right: 0;
+						top: 50%;
+						transform: translateY(-50%);
+					}
+				}
+				.middle {
+					margin-top: 50rpx;
+					textarea {
+						width: 510rpx;
+						padding: 20rpx;
+						height: 210rpx;
+						background: #FFFFFF;
+						border: 1px solid #009FE8;
+						border-radius: 6rpx;
+						font-size: 28rpx;
+						color: #AAAAAA;
+					}
+				}
+				.btn {
+					width: 550rpx;
+					height: 76rpx;
+					background: #009FE8;
+					border-radius: 6rpx;
+					color: #fff;
+					text-align: center;
+					line-height: 76rpx;
+					font-size: 30rpx;
+					margin-top: 36rpx;
+				}
+			}
+		}
+		.status {
+			position: absolute;
+			width: 160rpx;
+			height: 94rpx;
+			right: 36rpx;
+			top: 160rpx;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.box {
+			position: relative;
+			z-index: 1;
+			padding: 0 36rpx;
+			padding-bottom: 80rpx;
+			.list {
+				margin-top: 66rpx;
+				
+				.title {
+					font-size: 28rpx;
+					font-weight: bold;
+					color: #343434;
+				}
+				.value {
+					font-size: 25rpx;
+					color: #666666;
+					margin-top: 30rpx;
+				}
+				.a {
+					color: #009FE8;
+				}
+				.files {
+					.file {
+						display: flex;
+						align-items: center;
+						margin-top: 30rpx;
+						font-size: 25rpx;
+						font-weight: 500;
+						color: #343434;
+						image {
+							width: 24rpx;
+							height: 20rpx;
+							margin-right: 10rpx;
+						}
+					}
+				}
+				/deep/ .u-collapse {
+					.u-collapse-title {
+						font-size: 28rpx;
+						font-weight: bold;
+						color: #343434;
+					}
+					.u-collapse-content {
+						font-size: 25rpx;
+						color: #666666;
+					}
+				}
+				
+			}
+			.btns {
+				padding-top: 80rpx;
+				.btn {
+					width: 100%;
+					height: 84rpx;
+					background: #009FE8;
+					border-radius: 8rpx;
+					color: #fff;
+					font-size: 28rpx;
+					text-align: center;
+					line-height: 84rpx;
+					margin-top: 26rpx;
+					&:nth-child(2) {
+						background: #FF3131;
+					}
+				}
+			
+			}
+		}
+	}
+</style>

+ 145 - 0
bureau-of-education/pages/centerView/schedule/index.vue

@@ -0,0 +1,145 @@
+<template>
+	<view class="schedule">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="contentMain" v-if="data.length">
+			<view  v-for="(item, index) in data" :key="item.id"
+			 class="u-swipe-action" @click="click(item)" >
+				<view class="item">
+					<view class="title">{{item.message_title}}</view>
+					<view class="userInfo">
+						<view class="user">
+							<view class="name">拟稿人:{{item.from_dept_name}}</view>
+							<view class="name">发文日期:{{item.receive_time}}</view>
+							<view class="name">流程结束日期:{{item.finish_time}}</view>
+						</view>
+						<!-- <view class="status">发文审核中</view> -->
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="no-data" v-else>暂无数据</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '##343434', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '##343434',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle: '待办' //导航标题
+				},
+				data: [],
+				pageNo: 1,
+				total: 0,
+				userInfo: {}
+			}
+		},
+		onReachBottom() {
+			if (this.data.length >= this.total) {
+				return
+			}
+			this.pageNo += 1
+			this.init()
+		},
+		onLoad() {
+			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
+			this.init()
+		},
+		computed: {
+
+		},
+		methods: {
+			async init() {
+				let res = await this.$u.post(`boman-web-core/message/toDoMessage`, {
+					 "pageNo": this.pageNo,
+			        "pageSize": 10,
+			        "username": this.userInfo.userName
+				})
+				if (res.data && res.data.rows) {
+					res.data.rows = res.data.rows.map(item => {
+						return Object.assign({}, item, {
+							show: false
+						})
+					})
+					if (this.pageNo == 1) {
+						this.data = res.data.rows
+						this.total = res.data.total
+					} else {
+						this.data = this.data.concat(res.data.rows)
+					}
+				}
+			},
+			click(item) {
+				// 跳转到审核页面
+				uni.navigateTo({
+					url: '/pages/centerView/schedule/details?id=' + item.id + '&objId=' + item.receive_id
+				})
+				// if (this.active === 0) {
+					
+				// } else {
+				// 	// 跳转到审核页面
+				// }
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.schedule {
+		height: 100%;
+		background: #fff;
+		.contentMain {
+			padding: 0 20rpx;
+			.item {
+				.title {
+					font-size: 28rpx;
+					font-weight: bold;
+					color: #343434;
+					padding: 30rpx 30rpx 0 30rpx;
+					white-space: break-word;
+					word-break:break-all;
+				}
+
+				.userInfo {
+					display: flex;
+					align-items: flex-end;
+					border-bottom: solid 1rpx #DADADA;
+					padding: 30rpx;
+
+					.user {
+						flex: 1;
+						color: #666;
+						font-size: 24rpx;
+
+						.name {
+							margin-bottom: 10rpx;
+						}
+					}
+
+					.status {
+						color: #009FE8;
+						font-size: 26rpx;
+						margin-bottom: 4rpx;
+					}
+
+					.statusBtn {
+						color: #fff;
+						font-size: 22rpx;
+						margin-bottom: 4rpx;
+						background: #61C320;
+						padding: 10rpx 20rpx;
+						border-radius: 40rpx;
+					}
+				}
+			}
+		}
+
+	}
+</style>

+ 444 - 0
bureau-of-education/pages/centerView/toExamine/auditDetails.vue

@@ -0,0 +1,444 @@
+<template>
+	<view class="details">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="status">
+			<image :src="imgUrl"></image>
+		</view>
+		<view class="box">
+			<view class="list">
+				<view class="title">文件标题</view>
+				<view class="value">{{json.message_title}}</view>
+			</view>
+			<view class="list">
+				<view class="title">拟稿人</view>
+				<view class="value">{{json.send_user_name}}</view>
+			</view>
+			<view class="list">
+				<view class="title">发文日期</view>
+				<view class="value">{{json.message_time}}</view>
+			</view>
+			<view class="list">
+				<view class="title">流程结束日期</view>
+				<view class="value">{{json.finish_time == null ? '未结束' : json.finish_time}}</view>
+			</view>
+			<view class="list">
+				<view class="title">发文字号</view>
+				<view class="value">{{json.message_code}}</view>
+			</view>
+			<view class="list">
+				<view class="title">正文查看</view>
+				<view class="value a" @click="loadFile(item.url,item.originalName)" v-for="(item, index) in json.message_upload" :key="index">{{item.originalName}}</view>
+			</view>
+			<view class="list">
+				<view class="title">附件查看</view>
+				<view class="files">
+					<view class="file" @click="loadFile(item.url,item.originalName)" v-for="(item, index) in json.message_enclosure" :key="index">
+						<image src="/static/img/icon_sc_wj.png"></image>
+						<text>{{item.originalName}}</text>
+					</view>
+				
+				</view>
+			</view>
+			<view class="list">
+				<u-collapse v-if="receive_user_name">
+						<u-collapse-item title="分发人员" >
+							{{receive_user_name}}
+						</u-collapse-item>
+					</u-collapse>
+			</view>
+			<view class="list">
+				<u-collapse v-if="receive_dept_name">
+						<u-collapse-item title="分发单位" >
+							{{receive_dept_name}}
+						</u-collapse-item>
+					</u-collapse>
+			</view>
+			<view class="list">
+				<view class="title">备注</view>
+				<view class="value">{{json.message_remark}}</view>
+			</view>
+			<view class="btns" v-if="active == 0">
+				<view class="btn" @click="pass">审核通过</view>
+				<view class="btn"  @click="show = true">审核驳回</view>
+			</view>
+		</view>
+		<view class="mack" v-if="show">
+			<view class="box">
+				<view class="head">
+					<view class="title">驳回原因</view>
+					<image @click="show = false" src="../../../static/img/icon_tc_close.png"></image>
+				</view>
+				<view class="middle">
+					<textarea v-model="value" placeholder="请在此输入您的驳回原因并提交…"></textarea>
+				</view>
+				<view class="btn" @click="deny">提交</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	const pic_yz_wwc = require("../../../static/img/pic_yz_wwc.png")
+	const ipc_yz_ysh = require("../../../static/img/ipc_yz_ysh.png")
+	export default {
+		data() {
+			return {
+				imgUrl: '',
+				active: null,
+				show: false,
+				value: '',
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '#333', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle: '审核详情' //导航标题
+				},
+				id: '',
+				dataId: '',
+				nodeId: '',
+				instanceId: '',
+				tableInfo: {},
+				userInfo: {},
+				json: {
+					message_title: '',
+					send_user_name: '',
+					message_time: '',
+					message_code: '',
+					message_remark: '',
+					finish_time: '',
+					message_upload: [],
+					message_enclosure: []
+				},
+				receive_user_name: '',
+				receive_dept_name: '',
+			}
+		},
+		onLoad(options) {
+			this.tableInfo = JSON.parse(uni.getStorageSync('byTableInfo') || '{}')
+			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}')
+			this.active = options.active
+			this.dataId = options.businessCode
+			this.id = options.id
+			this.instanceId = options.instanceId
+			this.nodeId = options.nodeId
+			this.imgUrl = this.active == 0 ? pic_yz_wwc : this.active == 1 ? ipc_yz_ysh : ''
+			this.init()
+			this.getChldren(this.dataId)
+		},
+		methods: {
+			loadFile(url,name) {
+				const manage = uni.getFileSystemManager();
+				uni.downloadFile({
+					url: url,
+					success: (res) => {
+						let path = res.tempFilePath;
+						// #ifdef MP-WEIXIN
+						var savePath = wx.env.USER_DATA_PATH + "/" + name
+						console.log(savePath);
+						if (res.statusCode == 200) {
+							manage.saveFile({
+								tempFilePath: res.tempFilePath,
+								filePath: savePath,
+								success:function(ress){
+									uni.openDocument({
+										 filePath: ress.savedFilePath,
+										 // fileType: "pdf",
+										 success: function (resss) {
+											uni.hideLoading()
+										 }
+									 })
+								}
+							})
+						}
+						// #endif
+						// #ifndef MP-WEIXIN
+							uni.openDocument({
+								filePath: path,
+								showMenu: true,
+								success: function (res) {
+								    // console.log('打开文档成功');
+								}
+							});
+						// #endif
+						
+					}
+				});
+			},
+			async init () {
+				let res = await this.$u.post(`boman-web-core/p/cs/one/map`, {
+					"table": this.tableInfo.tableName,
+					"fixedData": {
+						"id": this.dataId
+					}
+				})
+				// console.log(res.data.records)
+				if (res.data) {
+					let {message_title, send_user_name, message_time, message_code, message_remark, message_upload = '', message_enclosure = '', finish_time} = res.data || {}
+					this.json = {
+						message_title,
+						send_user_name,
+						message_time,
+						message_code,
+						finish_time,
+						message_remark,
+						message_upload: message_upload ? JSON.parse(message_upload) : [],
+						message_enclosure: message_enclosure ? JSON.parse(message_enclosure) : []
+					}
+				}
+				
+			},
+			async getChldren (id) {
+				let that = this
+				let data = { 
+					"table": "boman_message_receive",
+					"pageNo": 1,
+					"isUi": false,
+					"pageSize": 1000,
+					"orderBy": "create_time desc",
+					"fixedData": {
+					    "condition": {
+					        "visible": "Y",
+					        "message_id": id,
+					        "is_del":"N"
+					    }
+					}
+			
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/queryList`,data)
+				console.log(res)
+				if (res.code == 200) {
+					this.receive_user_name = res.data.rows.map(item => {
+						return  item.receive_user_name
+					}).join(',')
+					this.receive_dept_name = res.data.rows.map(item => {
+						return  item.receive_dept_name
+					}).join(',')
+					// let selectData = res.data.rows.map(item => {
+					// 	return {
+					// 		userName: item.receive_user_name,
+					// 		deptName: item.receive_dept_name,
+					// 		id: item.receive_user_id,
+					// 		nickName: item.receive_user_name,
+					// 		"dept": {},
+					// 		"roles": []
+					// 	}
+					// })
+					// if (selectData && selectData.length) {
+					// 	this.getDeptNameAndRoleName(selectData)
+					// }
+				}
+			},
+			async getDeptNameAndRoleName (data) {
+				
+				let res = await this.$u.post(`system/user/getDeptNameAndRoleName`, data)
+				if (res.deptNameList) {
+					this.receive_dept_name = res.deptNameList.join(',')
+				}
+			},
+			async deny () {
+				let res = await this.$u.post(`jflow/p/c/task/page/deny`, {
+					"userId": this.userInfo.id,
+					"businessCode": this.dataId,
+					"description": this.value,
+					"businessType": this.tableInfo.id,
+					"businessName": this.tableInfo.tableName,
+					"instanceId": this.instanceId,
+					"id": this.id,
+					"nodeId": this.nodeId
+				})
+				if (res.resultCode == 0) {
+					uni.showToast({
+						title: '驳回成功',
+						success() {
+							setTimeout(() => {
+								uni.navigateBack()
+							}, 2000)
+						}
+					})
+				} else {
+					uni.showToast({
+						title: res.resultMsg,
+						icon: 'none'
+					})
+				}
+			},
+			async pass () {
+				let res = await this.$u.post(`jflow/p/c/task/page/pass`, {
+					"userId": this.userInfo.id,
+					"businessCode": this.dataId,
+					"businessType": this.tableInfo.id,
+					"businessName": this.tableInfo.tableName,
+					"instanceId": this.instanceId,
+					"id": this.id,
+					"nodeId": this.nodeId
+				})
+				if (res.resultCode == 0) {
+					uni.showToast({
+						title: '审核通过',
+						success() {
+							setTimeout(() => {
+								uni.navigateBack()
+							}, 2000)
+						}
+					})
+					
+				} else {
+					uni.showToast({
+						title: res.resultMsg,
+						icon: 'none'
+					})
+				}
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.details{
+		background: #fff;
+		position: relative;
+		.mack {
+			position: fixed;
+			width: 100%;
+			height: 100%;
+			z-index: 9999;
+			top: 88rpx;
+			background-color: rgba(0,0,0,0.2);
+			.box {
+				width: 612rpx;
+				height: 512rpx;
+				background: #FFFFFF;
+				border-radius: 6rpx;
+				top: 40%;
+				left: 50%;
+				transform: translate(-50%, -40%);
+				padding: 34rpx;
+				.head {
+					position: relative;
+					.title {
+						font-size: 30rpx;
+						font-weight: bold;
+						color: #343434;
+						text-align: center;
+					}
+					image {
+						position: absolute;
+						width: 20rpx;
+						height: 20rpx;
+						right: 0;
+						top: 50%;
+						transform: translateY(-50%);
+					}
+				}
+				.middle {
+					margin-top: 50rpx;
+					textarea {
+						width: 510rpx;
+						padding: 20rpx;
+						height: 210rpx;
+						background: #FFFFFF;
+						border: 1px solid #009FE8;
+						border-radius: 6rpx;
+						font-size: 28rpx;
+						color: #AAAAAA;
+					}
+				}
+				.btn {
+					width: 550rpx;
+					height: 76rpx;
+					background: #009FE8;
+					border-radius: 6rpx;
+					color: #fff;
+					text-align: center;
+					line-height: 76rpx;
+					font-size: 30rpx;
+					margin-top: 36rpx;
+				}
+			}
+		}
+		.status {
+			position: absolute;
+			width: 160rpx;
+			height: 94rpx;
+			right: 36rpx;
+			top: calc(160rpx + var(--status-bar-height));
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.box {
+			position: relative;
+			z-index: 1;
+			padding: 0 36rpx;
+			padding-bottom: 80rpx;
+			.list {
+				margin-top: 66rpx;
+				
+				.title {
+					font-size: 28rpx;
+					font-weight: bold;
+					color: #343434;
+				}
+				.value {
+					font-size: 25rpx;
+					color: #666666;
+					margin-top: 30rpx;
+				}
+				.a {
+					color: #009FE8;
+				}
+				.files {
+					.file {
+						display: flex;
+						align-items: center;
+						margin-top: 30rpx;
+						font-size: 25rpx;
+						font-weight: 500;
+						color: #343434;
+						image {
+							width: 24rpx;
+							height: 20rpx;
+							margin-right: 10rpx;
+						}
+					}
+				}
+				/deep/ .u-collapse {
+					.u-collapse-title {
+						font-size: 28rpx;
+						font-weight: bold;
+						color: #343434;
+					}
+					.u-collapse-content {
+						font-size: 25rpx;
+						color: #666666;
+					}
+				}
+				
+			}
+			.btns {
+				padding-top: 80rpx;
+				.btn {
+					width: 100%;
+					height: 84rpx;
+					background: #009FE8;
+					border-radius: 8rpx;
+					color: #fff;
+					font-size: 28rpx;
+					text-align: center;
+					line-height: 84rpx;
+					margin-top: 26rpx;
+					&:nth-child(2) {
+						background: #FF3131;
+					}
+				}
+			
+			}
+		}
+	}
+</style>

+ 254 - 0
bureau-of-education/pages/centerView/toExamine/index.vue

@@ -0,0 +1,254 @@
+<template>
+	<view class="archive">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle" :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="topNav" :style="{top: topNav + 'px'}">
+			<view class="item" @click="tabs(0)">
+				<view :class="['text', active == 0 ? 'active' : '']">待我审核</view>
+			</view>
+			<view class="item"  @click="tabs(1)">
+				<view :class="['text', active == 1 ? 'active' : '']">已审核</view>
+			</view>
+		</view>
+		<view class="contentMain" v-if="list.length">
+			<view 
+				v-for="(item, index) in list" 
+				:key="item.id" 
+				@click="click(item)" 
+				class="u-swipe-action"
+					>
+				<view class="item">
+					<view class="title">{{item.businessData.message_title}}</view>
+					<view class="userInfo">
+						<view class="user">
+							<view class="name">拟稿人:{{item.businessData.send_user_name}}</view>
+							<view class="name">发文日期:{{item.businessData.message_time}}</view>
+							<view class="name" v-if="active == 1">流程结束日期:{{item.businessData.finish_time != null ? item.businessData.finish_time : '未结束'}}</view>
+						</view>
+						<view class="status" :class="{active: item.businessData.status != '已通过'}" v-if="active == 1">{{item.businessData.status}}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="no-data" v-else>暂无数据</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav:{
+					backgroundColor:'#fff',  //背景色
+					color:'#333',  //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle:'审核' //导航标题
+				},
+				searchVal: '',
+				topNav: 0,
+				active: 0,
+				list: [],
+				disabled: false,
+				btnWidth: 180,
+				show: false,
+				options: [
+					{
+						text: '归档',
+						style: {
+							backgroundColor: '#00B034'
+						}
+					}
+				],
+				userInfo: {}
+			}
+		},
+		onLoad() {
+			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
+			this.backlog()
+			setTimeout(() => {
+				this.topNav = (this.$refs.uNavbar.navbarHeight) + (this.$refs.uNavbar.statusBarHeight)
+			}, 10)
+		},
+		onShow() {
+			
+		},
+		methods:{
+			async backlog () {
+				let res = await this.$u.post(`jflow/p/cs/task/backlog/list`, {
+					page: 1,
+					pageSize: 10,
+					searchType: '0,1',
+					"userId": this.userInfo.id,
+					excuStatus: 0
+				})
+				this.list = res.data.records
+			},
+			async history () {
+				let res = await this.$u.post(`jflow/p/cs/task/history/list`, {
+					page: 1,
+					pageSize: 10,
+					searchType: '0,1',
+					"userId": this.userInfo.id,
+					excuStatus: 2
+				})
+				console.log(res.data.records)
+				res.data.records.forEach(item => {
+					console.log(item.businessData.message_title)
+				})
+				this.list = res.data.records
+			},
+			tabs (active) {
+				this.active = active
+				this.list = []
+				if (active == 0) {
+					this.backlog()
+				} else {
+					this.history()
+				}
+			},
+			click(item) {
+				// 跳转到审核页面
+				console.log(item)
+				let url = '&instanceId=' + item.instanceId + '&nodeId=' + item.nodeId + '&id=' + item.id
+				let active = this.active
+				if (this.active == 1) {
+					if (item.businessData.status != '已通过') {
+						active = 2
+					}
+				}
+				uni.navigateTo({
+					url: '/pages/centerView/toExamine/auditDetails?active=' + active + '&businessCode=' + item.businessCode + url 
+				})
+				// if (this.active === 0) {
+					
+				// } else {
+				// 	// 跳转到审核页面
+				// }
+			},
+		}
+	}
+</script>
+<style>
+	page{
+		background: #FFFFFF;
+	}
+</style>
+<style lang="scss" scoped>
+.topNav{
+	display: flex;
+	align-items: center;
+	background: #FFFFFF;
+	height: 90rpx;
+	box-shadow: 0px 14rpx 10rpx 0px rgba(218, 218, 218, 0.35);
+	position: sticky;
+	width: 100%;
+	left: 0;
+	z-index: 9;
+	.item{
+		flex: 1;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		.text{
+			font-size: 26rpx;
+			color: #191919;
+			font-weight: 600;
+		}
+		.active{
+			position: relative;
+			&::after{
+				content: '';
+				position: absolute;
+				width: 28rpx;
+				height: 6rpx;
+				background: #009FE8;
+				border-radius: 6rpx;
+				bottom: -14rpx;
+				left: 50%;
+				transform: translate(-50%,0);
+			}
+		}
+	}
+}
+.searchBox{
+	padding: 30rpx;
+	.inputBox{
+		display: flex;
+		align-items: center;
+		.input{
+			flex: 1;
+			width: 100%;
+			margin-right: 30rpx;
+			background: #EDEDED;
+			border-radius: 40rpx;
+			padding: 0 30rpx !important;
+		}
+		.btn{
+			background: #009FE8;
+			color: #FFFFFF;
+			font-size: 26rpx;
+			height: 60rpx;
+			line-height: 60rpx;
+			padding: 0 30rpx;
+			text-align: center;
+			border-radius: 40rpx;
+		}
+	}
+	
+}
+.timeBox{
+	padding: 30rpx 0 20rpx 0;
+	display: flex;
+	align-items: center;
+	.r{
+		width: 30rpx;
+		height: 33rpx;
+	}
+	.text{
+		font-size: 26rpx;
+		color: #343434;
+		margin: 0 14rpx;
+	}
+	.d{
+		width: 20rpx;
+		height: 20rpx;
+	}
+}
+.contentMain{
+	background: #fff;
+	.item{
+		.title{
+			font-size: 28rpx;
+			font-weight: 700;
+			color: #343434;
+			padding: 30rpx 30rpx 0 30rpx;
+			white-space: break-word;
+			word-break:break-all;
+		}
+		.userInfo{
+			display: flex;
+			align-items: flex-end;
+			border-bottom: solid 1rpx #DADADA;
+			padding: 30rpx;
+			.user{
+				flex: 1;
+				color: #666;
+				font-size: 24rpx;
+				.name{
+					margin-bottom: 10rpx;
+				}
+			}
+			.status{
+				color: #54BA10;
+				font-size: 26rpx;
+				margin-bottom: 4rpx;
+				&.active {
+					color: #FF3131;
+				}
+			}
+		}
+	}
+}
+</style>

+ 803 - 0
bureau-of-education/pages/indexView/addPost/index.vue

@@ -0,0 +1,803 @@
+<template>
+	<view class="addPost">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="content">
+			<view class="title">
+				<view class="lable">发文字号</view>
+				<view class="text" @click="onShowZihao()">查看近期发文字号</view>
+			</view>
+			<view class="list">
+				<textarea placeholder-style="color:#AAAAAA;font-size: 28rpx;" style="height:146rpx;width:calc(100% - (10px + 5px) * 2);;background: #EDEDED;color:#333;font-size: 28rpx;padding: 30rpx;border-radius: 6rpx;"
+				 v-model="fixedData.message_code" placeholder="请输入发文字号" />
+				</view>
+			<view class="title">
+				<view class="lable">发文日期</view>
+				<u-input @click="onShowTime()" class="input" v-model="fixedData.message_time" placeholder-style="{color:#AAAAAA}" input-align="right" placeholder="请选择发文日期" type="text" :border="false" disabled />
+			</view>
+			<!-- #ifdef MP-WEIXIN -->
+			<view class="title" @click="selectFile('text_data')">
+				<view class="lable">正文上传</view>
+				<view class="select">请选择pdf格式文件上传</view>
+				<image class="black" src="/static/img/black.png" mode=""></image>
+			</view>
+			<!-- #endif -->
+			<!-- #ifndef MP-WEIXIN -->
+			<view class="title">
+				<view class="lable">正文上传</view>
+				<lsj-upload
+					ref="lsjUpload"
+					childId="upload"
+					:size="10"
+					style="width: 100%;"
+					v-model="percent"
+					@input="onInput"
+					@callback="onCallback($event,'text_data')">
+					<view class="title" >
+						<view class="select">请选择文件</view>
+						<image class="black" src="/static/img/black.png" mode=""></image>
+					</view>
+				</lsj-upload>
+			</view>
+			<!-- #endif -->
+			<view class="uptEext" v-if="text_data.length > 0">
+				<view class="item" v-for="(item, index) in text_data" :key="index">
+					<view class="text">{{item.name}}</view>
+					<image class="icon_sc_close" src="/static/img/icon_sc_close.png" mode="" @click="delFile('text_data', index)"></image>
+				</view>
+			</view>
+			<!-- #ifdef MP-WEIXIN -->
+			<view class="title"  @click="selectFile('enclosure_data')">
+				<view class="lable">附件上传</view>
+				<view class="select">请选择文件</view>
+				<image class="black" src="/static/img/black.png" mode=""></image>
+			</view>
+			<!-- #endif -->
+			<!-- #ifndef MP-WEIXIN -->
+			<view class="title">
+				<view class="lable">附件上传</view>
+				<lsj-upload
+					ref="lsjUploadS"
+					childId="upload"
+					:size="10"
+					style="width: 100%;"
+					v-model="percent2"
+					@input="onInput"
+					@callback="onCallback($event,'enclosure_data')">
+					<view class="title" >
+						<view class="select">请选择文件</view>
+						<image class="black" src="/static/img/black.png" mode=""></image>
+					</view>
+				</lsj-upload>
+				<!-- <uni-file-picker @select="selectAPP($event,'enclosure_data')" limit="1" file-mediatype="all"></uni-file-picker> -->
+			</view>
+			<!-- #endif -->
+			<view class="uptEexts" v-if="enclosure_data.length > 0">
+				<view class="item"  v-for="(item, index) in enclosure_data" :key="index">
+					<image class="icon_sc_wj" src="/static/img/icon_sc_wj.png" mode=""></image>
+					<view class="text">{{item.name}}</view>
+					<image class="icon_sc_close" src="/static/img/icon_sc_close.png" mode="" @click="delFile('enclosure_data', index)"></image>
+				</view>
+			</view>
+			<view class="title">
+				<view class="lable">文件标题</view>
+				<u-input class="input" v-model="fixedData.message_title" placeholder-style="{color:#AAAAAA}" input-align="right" placeholder="请输入文件标题" type="text" :border="false" />
+			</view>
+			<view class="title" @click="selectPeople">
+				<view class="lable">分发人员</view>
+				<view class="select">请选择分发人员</view>	
+				<image class="black" src="/static/img/black.png" mode=""></image>
+			</view>
+			<view class="list">
+				<view class="renyuan">
+					<view class="tip" v-if="selectData.length">
+						<text v-for="(item, index) in selectData" :key="index">{{item.nickName}}{{index == (selectData.length - 1) ? '' : ','}}</text>
+					</view>
+					<view class="tip" v-else>请选择分发人员</view>
+				</view>
+			</view>
+			<view class="title">
+				<view class="lable">分发单位</view>
+				<view class="select" style="color: #343434;" @click="getDeptNameAndRoleName">请选择上方分发人员</view>
+				<!-- <image class="black" src="/static/img/black.png" mode=""></image> -->
+			</view>
+			<view class="list">
+				<view class="renyuan">
+					
+					<view class="tip" v-if="deptNameList.length">
+						<text v-for="(item, index) in deptNameList" :key="index">{{item}}{{index == (deptNameList.length - 1) ? '' : ','}}</text>
+					</view>
+					<view class="tip" v-else>请选择上方分发人员</view>
+				</view>
+			</view>
+			<view class="title">
+				<view class="lable">备注</view>
+			</view>
+			<view class="list">
+				<textarea v-model="fixedData.message_remark" placeholder-style="color:#AAAAAA;font-size: 28rpx;" style="height:146rpx;width:calc(100% - (10px + 5px) * 2);;background: #EDEDED;color:#333;font-size: 28rpx;padding: 30rpx;border-radius: 6rpx;" placeholder="请输入备注"/>
+			</view>
+			<view class="btnBox" @click="complexSave">提交</view>
+			<view class="tipBtn">* 请仔细阅读发文信息后再提交</view>
+		</view>
+		<!-- 近期字号 -->
+		<u-popup v-model="showZihao" mode="center" width="80%" border-radius="6" height="800">
+			<view class="showZihao">
+				<view class="ziTitle">
+					<image class="icon_tc_close" src="/static/img/icon_tc_close.png" mode="" style="opacity: 0;"></image>
+					<view class="text">近期发文字号</view>
+					<image class="icon_tc_close" src="/static/img/icon_tc_close.png" mode="" @click="onShowZihao()"></image>
+				</view>
+				<view class="itemBox">
+					<scroll-view class="scroll-view_H" scroll-x="true" @scroll="scroll" scroll-left="120" style="height: 550rpx;">
+						<view class="item" v-for="(item,index) in csQueryListData" :key="index" @click="onCopy(index,item.message_code)">
+							<view class="ld"></view>
+							<view class="text" :class="index == copyIndex?'active':''">{{item.message_code}}</view>
+						</view>
+					</scroll-view>
+				</view>
+				<view class="btn" @click="ckCopy()">复制发文字号</view>
+			</view>
+		</u-popup>
+		<!-- 时间 -->
+		<u-picker mode="time" v-model="showTime" :params="params" @confirm="getTime"></u-picker>
+	</view>
+</template>
+
+<script>
+	// import upload from '@/components/pretty-uploadFile/pretty-uploadFile.vue'
+	// import upload from '@/components/uni-file-picker/uni-file-picker.vue'
+	export default {
+		components: {
+			// upload
+		},
+		data() {
+			return {
+				percent: '',
+				percent2: '',
+				setNav:{
+					backgroundColor:'#fff',  //背景色
+					color:'#333',  //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle:'填写发文信息' //导航标题
+				},
+				fromData: {
+					table: 'boman_message',
+					objId: -1,
+					message_time:''
+				},
+				fixedData: {
+					message_code: '',
+					message_title: '',
+					message_remark: '',
+					send_time: '',
+					message_situation: '1',
+					send_user_id: '',
+					send_user_name: '',
+					create_dept_nam: '',
+					message_time: '',
+					message_upload: [],
+					message_id: 'fk.boman_message'
+				},
+				textareaVal: '',
+				showZihao: false,
+				queryListPageNo: 1,
+				csQueryListData: [],
+				copyIndex: null,
+				ckCopyData: '',
+				showTime: false,
+				params: {
+					year: true,
+					month: true,
+					day: true,
+					hour: true,
+					minute: true,
+					second: true
+				},
+				text_data: [],
+				enclosure_data: [],
+				userInfo: {},
+				isGo: false,
+				selectData: [],
+				deptNameList: [],
+				tableInfo: {},
+				objId: '',
+				isLogin: false,
+				isWixin: false,
+				tmpId: []
+			}
+		},
+		onLoad(options) {
+			this.objId = options.objId && options.objId != 'undefined' ? options.objId : ''
+			if (this.objId) {
+				this.getOneMap()
+				this.getChldren()
+			}
+			uni.removeStorageSync('selectData')
+			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
+			this.fixedData.send_user_id = this.userInfo.id
+			this.fixedData.send_user_name = this.userInfo.userName
+			this.fixedData.create_dept_nam = this.userInfo.dept.deptName
+			this.getCsQueryList()
+			this.tableInfo = JSON.parse(uni.getStorageSync('byTableInfo') || '{}')
+			// #ifdef MP-WEIXIN
+				this.isWixin = true
+			// #endif
+			
+		},
+		onShow() {
+			let selectData = JSON.parse(uni.getStorageSync('selectData') || '[]')
+			this.selectData = selectData
+			console.log(selectData)
+			if (selectData && selectData.length) {
+				this.getDeptNameAndRoleName()
+			}
+			
+		},
+		onReady() {
+			this.onCreate();
+		},
+		methods: {
+			onCreate() {
+				// 初始化参数并创建上传DOM
+				this.$refs.lsjUpload.create({
+					// #ifdef APP-PLUS
+					cuWebview: this.$mp.page.$getAppWebview(), // app必传
+					// #endif
+					url: 'https://qsjyoa.qs163.cn/prod-api/boman-file/upload', //替换为你的接口地址
+					name: 'file', // 附件key
+					size: 10, // 附件上传大小上限(M),默认10M
+					debug: true,
+					//根据你接口需求自定义请求头
+					formData: {
+						filename: ''
+					}, 
+					header: {
+						'Authorization': uni.getStorageSync('authToken')
+					},
+			});
+			this.$refs.lsjUploadS.create({
+					// #ifdef APP-PLUS
+					cuWebview: this.$mp.page.$getAppWebview(), // app必传
+					// #endif
+					url: 'https://qsjyoa.qs163.cn/prod-api/boman-file/upload', //替换为你的接口地址
+					name: 'file', // 附件key
+					size: 10, // 附件上传大小上限(M),默认10M
+					debug: true,
+					//根据你接口需求自定义请求头
+					formData: {
+						filename: ''
+					}, 
+					header: {
+						'Authorization': uni.getStorageSync('authToken')
+					},
+			});
+		},
+		onInput(e) {
+			uni.showLoading({
+				mask: true,
+				title: '文件上传中'
+			})
+		},
+		onCallback(e,type) {
+			let files = JSON.parse(e.responseText)
+			if (files.code == 200) {
+				if (type == 'text_data') {
+					this.fixedData.message_title = files.data.name.substring(0, files.data.name.indexOf('.'))
+				}
+				this[type].push(files.data)
+			}
+			uni.hideLoading()
+		},
+			selectAPP(e,type) {
+				console.log(e)
+				uni.showLoading({
+					mask: true,
+					title: '文件上传中'
+				})
+				uni.uploadFile({
+					url: 'https://qsjyoa.qs163.cn/prod-api/boman-file/upload',
+					filePath: e.tempFilePaths[0],
+					name: 'file',
+					formData: {
+						filename: e.tempFiles[0].name
+					}, 
+					header: {
+						'Authorization': uni.getStorageSync('authToken')
+					},
+					success: resFile => {
+						let files = JSON.parse(resFile.data)
+						if (files.code == 200) {
+							if (type == 'text_data') {
+								this.fixedData.message_title = files.data.name.substring(0, files.data.name.indexOf('.'))
+							}
+							this[type].push(files.data)
+						}
+					},
+					complete: () => {
+						uni.hideLoading()
+					}
+				})
+			},
+			onShowZihao() {
+				this.showZihao = !this.showZihao
+			},
+			async getCsQueryList () {
+				let that = this
+				let data = { 
+					"table": "boman_message", 
+					"orderBy": 
+					"create_time desc", 
+					"pageSize": 10, 
+					"pageNo": that.queryListPageNo, 
+					"showData": [ "message_code" ] ,
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/queryList`,data)
+				that.csQueryListData = res.data.rows
+			},
+			async getOneMap () {
+				let that = this
+				let data = { 
+					"table": "boman_message",
+					"fixedData": {
+					    "id": this.objId
+					}
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/one/map`,data)
+				
+				if (res.code == 200) {
+					let {message_code, message_time, message_title, message_remark, send_time, message_upload = "", message_enclosure = ""} = res.data
+					this.fixedData.message_code = message_code
+					this.fixedData.message_time = message_time
+					this.fixedData.message_title = message_title
+					this.fixedData.message_remark = message_remark
+					this.fixedData.send_time = send_time
+					if (message_upload) {
+						this.text_data = JSON.parse(message_upload)
+					}
+					if (message_enclosure) {
+						this.enclosure_data = JSON.parse(message_enclosure)
+					}
+				}
+			},
+			async getChldren () {
+				let that = this
+				let data = {
+					"table": "boman_message_receive",
+					"pageNo": 1,
+					"isUi": false,
+					"pageSize": 1000,
+					"orderBy": "create_time desc",
+					"fixedData": {
+					    "condition": {
+					        "visible": "Y",
+					        "message_id": this.objId,
+					        "is_del":"N"
+					    }
+					}
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/queryList`,data)
+				if (res.code == 200) {
+					this.deptNameList = []
+					this.selectData = res.data.rows.map(item => {
+						this.deptNameList.push(item.receive_dept_name)
+						return {
+							userName: item.receive_user_name,
+							deptName: item.receive_dept_name,
+							id: item.receive_user_id
+						}
+					})
+					// if (selectData && selectData.length) {
+					// 	this.getDeptNameAndRoleName()
+					// }
+				}
+			},
+			onCopy(index,val) {
+				this.copyIndex = index
+				this.ckCopyData = val
+			},
+			ckCopy() {
+				this.fixedData.message_code = this.ckCopyData
+				this.showZihao = false
+				// uni.setClipboardData({
+				//     data: this.ckCopyData ,
+				//     success: function () {
+				//         uni.showToast({
+				//         	icon: 'none',
+				// 			title: '已复制'
+				//         })
+				//     }
+				// });
+			},
+			async complexSave () {
+				if (this.isLogin) {
+					return
+				}
+				if (!this.fixedData.message_time) {
+					return uni.showToast({
+						title: '请选择发文日期',
+						icon: 'none'
+					})
+				}
+				// if (!this.text_data.length) {
+				// 	return uni.showToast({
+				// 		title: '请上传正文',
+				// 		icon: 'none'
+				// 	})
+				// }
+				if (!this.selectData.length) {
+					return uni.showToast({
+						title: '请选择分发人员',
+						icon: 'none'
+					})
+				}
+				
+				this.isLogin = true
+				uni.showLoading({
+					title: '发文中...'
+				})
+				let json = Object.assign({}, this.fixedData, {
+					send_time: this.setTime(),
+					has_annex: "N",
+					message_upload: JSON.stringify(this.text_data.concat(this.enclosure_data))
+				})
+				let children = []
+				if (this.selectData.length) {
+					children = this.selectData.map((item, index) => {
+						return {
+							"table": 'boman_message_receive',
+							"objId":  -1, //this.objId ||
+							"from_dept_name": this.fixedData.create_dept_nam,
+							"fixedData": {
+								"message_id": "fk.boman_message",
+								"send_message_time": json.send_time,
+								// 'message_situation': '1',
+								// "create_dept_name": this.fixedData.create_dept_nam,
+								"receive_user_id": item.id,
+								"receive_user_name": item.nickName,
+								"receive_dept_name": item.dept.deptName,
+								"send_user_id": json.send_user_id,
+								"from_dept_name": json.create_dept_nam,
+								"message_title": json.message_title,
+								"send_user_name": json.send_user_name
+							}
+						}
+					})
+				}
+				let res = await this.$u.post(`boman-web-core/p/cs/complex/save`, {
+					"table": "boman_message",
+					"objId":  -1, // this.objId ||
+					"create_dept_name": this.fixedData.create_dept_nam,
+					"fixedData": json,
+					children
+					
+				})
+				if (res.code == 200) {
+					
+					let ress = await this.$u.post(`jflow/p/c/process/launch`, {
+						"businessCodes": res.data[0].data, 
+						"businessType": this.tableInfo.id, 
+						"businessTypeName": this.tableInfo.tableName, 
+						"dbname": this.tableInfo.tableName, 
+						"initiator": this.fixedData.send_user_id, 
+						"userName": this.fixedData.send_user_name
+					})
+					if (ress.resultCode == 0) {
+						uni.showToast({
+							title: '发文成功',
+						})
+						setTimeout(() => {
+							uni.switchTab({
+							  url: `/pages/tabbar/index/index`,    //要跳转的路径
+							})
+						}, 1500)
+						
+					}
+					this.isLogin = false
+					uni.hideLoading()
+				} else {
+					uni.showToast({
+						title: '发文错误,联系管理员',
+						icon: 'none'
+					})
+					this.isLogin = false
+					uni.hideLoading()
+				}
+			}, 
+			async getDeptNameAndRoleName () {
+				if (!this.selectData.length) {
+					return uni.showToast({
+						title: '请选择分发人员',
+						icon: 'none'
+					})
+				}
+			
+				let res = await this.$u.post(`system/user/getDeptNameAndRoleName`, this.selectData)
+				if (res.nikeNameList) {
+					this.deptNameList = res.nikeNameList
+				}
+			},
+			setTime () {
+			  let dateTime
+			  let yy = new Date().getFullYear()
+			  let mm = new Date().getMonth() + 1
+			  let dd = new Date().getDate()
+			  let hh = new Date().getHours()
+			  let mf = new Date().getMinutes() < 10 ? ('0' + new Date().getMinutes())
+				:
+				new Date().getMinutes()
+			  let ss = new Date().getSeconds() < 10 ? ('0' + new Date().getSeconds())
+				:
+				new Date().getSeconds()
+			  dateTime = yy + '-' + (mm < 10 ? ('0' + mm) : mm) + '-' + (dd < 10 ? ('0' + dd) : dd) + ' ' + (hh < 10 ? ('0' + hh) : hh) + ':' + (mf < 10 ? ('0' + mf) : mf) + ':' + (ss < 10 ? ('0' + ss) : ss)
+			  return dateTime
+			},
+			onShowTime() {
+				this.showTime = !this.showTime
+			},
+			getTime(e) {
+				// console.log(e);
+				this.fixedData.message_time = `${e.year}-${e.month}-${e.day} ${e.hour}:${e.minute}:${e.second}`
+			},
+			selectPeople () {
+				uni.navigateTo({
+					url: '/pages/postView/selectPeople/index'
+				})
+			},
+			delFile (type, index) {
+				this[type].splice(index, 1)
+				this[type] = JSON.parse(JSON.stringify(this[type]))
+			},
+			selectFile (type) {
+				let chooseFile = uni.chooseFile;
+				if (typeof wx !== 'undefined' &&
+				    typeof wx.chooseMessageFile === 'function') {
+				    chooseFile = wx.chooseMessageFile;
+				}
+				if (typeof chooseFile !== 'function') {
+				    return uni.showToast({
+				    	title: '请指定 type 类型,该平台仅支持选择 image 或 video。',
+						icon:'none',
+				    })
+				}
+				chooseFile({
+					  count: 1,
+					  type: 'all',
+					  success: (res) => {
+					    // tempFilePath可以作为img标签的src属性显示图片
+					    const tempFilePaths = res.tempFiles
+						if (tempFilePaths && tempFilePaths.length) {
+							// if (tempFilePaths[0].path.indexOf('.pdf') != -1) {
+								uni.showLoading({
+									mask: true,
+									title: '文件上传中'
+								})
+								uni.uploadFile({
+									url: 'https://qsjyoa.qs163.cn/prod-api/boman-file/upload',
+									filePath: tempFilePaths[0].path,
+									name: 'file',
+									formData: {
+										filename: tempFilePaths[0].name
+									}, 
+									header: {
+										'Authorization': uni.getStorageSync('authToken')
+									},
+									success: resFile => {
+										uni.hideLoading()
+										let files = JSON.parse(resFile.data)
+										if (files.code == 200) {
+											if (type == 'text_data') {
+												this.fixedData.message_title = files.data.name.substring(0, files.data.name.indexOf('.'))
+											}
+											this[type].push(files.data)
+										}
+									}
+								})
+							// } else {
+							// 	uni.showToast({
+							// 		title: '请选择pdf文件',
+							// 		icon:'none',
+							// 	})
+							// }
+						}
+					  },
+					  fail: (res) => {
+						  // uni.showToast({
+						  // 	title: res.errMsg,
+						  // 	icon:'none',
+						  // })
+					  }
+				})
+			},
+			getPdf() {
+				uni.chooseImage({
+					count: 1, //默认100
+					success: function (res) {
+						uni.uploadFile({
+							url: 'https://qsjyoa.qs163.cn/prod-api/boman-file/upload', //仅为示例,非真实的接口地址
+							filePath: res.tempFilePaths[0],
+							name: 'file',
+							header: {
+								Authorization: uni.getStorageSync('authToken')
+							},
+							success: (uploadFileRes) => {
+								console.log(uploadFileRes.data);
+							},
+							complete: (err) => {
+								console.log(err);
+							}
+						});
+				    }
+				});
+			}
+		}
+	}
+</script>
+<style>
+	page{
+		background: #FFFFFF;
+	}
+</style>
+<style lang="scss" scoped>
+.content{
+	padding: 30rpx;
+	.title{
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		font-weight: 500;
+		padding: 30rpx 0 0 0;
+		.lable{
+			font-size: 28rpx;
+			color: #343434;
+			flex:  0 0 120rpx;
+		}
+		.text{
+			font-size: 26rpx;
+			color: #0099FF;
+		}
+		.input{
+			font-size: 28rpx;
+		}
+		.select {
+			color: #aaa;
+			font-size: 28rpx;
+			flex: 1;
+			text-align: right;
+		}
+		.black{
+			width: 15rpx;
+			height: 26rpx;
+			margin-left: 20rpx;
+		}
+	}
+	.list{
+		margin-top: 30rpx;
+		.textarea{
+			background: #EDEDED;
+			border-radius: 8rpx;
+			padding: 20rpx 30rpx !important;
+		}
+		.renyuan{
+			background: #EDEDED;
+			border-radius: 8rpx;
+			min-height: 186rpx;
+			padding: 20rpx 30rpx !important;
+			color: #AAAAAA;
+		}
+	}
+	.uptEext{
+		margin-top: 30rpx;
+		.item{
+			font-size: 26rpx;
+			color: #0099FF;
+			margin-bottom: 20rpx;
+			display: flex;
+			&:last-child{
+				margin-bottom: 0;
+			}
+			.text{
+				flex: 1;
+				margin-right: 30rpx;
+			}
+			.icon_sc_close{
+				width: 30rpx;
+				height: 30rpx;
+				margin-left: auto;
+			}
+		}
+	}
+	.uptEexts{
+		margin-top: 30rpx;
+		.item{
+			font-size: 26rpx;
+			color: #0099FF;
+			margin-bottom: 20rpx;
+			display: flex;
+			&:last-child{
+				margin-bottom: 0;
+			}
+			.text{
+				flex: 1;
+				margin: 0 30rpx;
+			}
+			.icon_sc_wj{
+				width: 33rpx;
+				height: 29rpx;
+				margin-top: 4rpx;
+			}
+			.icon_sc_close{
+				width: 30rpx;
+				height: 30rpx;
+				margin-left: auto;
+			}
+		}
+	}
+	.btnBox{
+		color: #fff;
+		background: #009FE8;
+		line-height: 84rpx;
+		border-radius: 6rpx;
+		text-align: center;
+		margin-top: 60rpx;
+	}
+	.tipBtn{
+		font-size: 24rpx;
+		color: #FF0000;
+		text-align: center;
+		margin-top: 20rpx;
+	}
+}
+.showZihao{
+	.ziTitle{
+		display: flex;
+		align-items: center;
+		height: 100rpx;
+		padding: 0 30rpx;
+		.icon_tc_close{
+			width: 30rpx;
+			height: 30rpx;
+		}
+		.text{
+			flex: 1;
+			text-align: center;
+			margin: 0 30rpx;
+			font-size: 30rpx;
+			font-weight: 700;
+		}
+	}
+	.btn{
+		font-size: 28rpx;
+		background: #009FE8;
+		color: #fff;
+		text-align: center;
+		line-height: 80rpx;
+		border-radius: 10rpx;
+		margin: 30rpx;
+	}
+	.itemBox{
+		.item{
+			display: flex;
+			align-items: center;
+			padding: 30rpx 30rpx 0 30rpx;
+			.ld{
+				width: 14rpx;
+				height: 14rpx;
+				background: #009FE8;
+				border-radius: 100%;
+			}
+			.text{
+				flex: 1;
+				font-size: 26rpx;
+				margin-left: 30rpx;
+				line-height: 33rpx;
+			}
+			.active{
+				color: #009FE8;
+			}
+		}
+	}
+}
+</style>

+ 388 - 0
bureau-of-education/pages/indexView/addressee/details.vue

@@ -0,0 +1,388 @@
+<template>
+	<view class="details">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<!-- <view class="status">
+			<image :src="imgUrl"></image>
+		</view> -->
+		<view class="box">
+			<view class="list">
+				<view class="title">文件标题</view>
+				<view class="value">{{json.message_title}}</view>
+			</view>
+			<view class="list">
+				<view class="title">拟稿人</view>
+				<view class="value">{{json.send_user_name}}</view>
+			</view>
+			<view class="list">
+				<view class="title">发文日期</view>
+				<view class="value">{{json.message_time}}</view>
+			</view>
+			<view class="list">
+				<view class="title">流程结束日期</view>
+				<view class="value">{{json.finish_time == null ? '未结束' : json.finish_time}}</view>
+			</view>
+			<view class="list">
+				<view class="title">发文字号</view>
+				<view class="value">{{json.message_code}}</view>
+			</view>
+			<view class="list">
+				<view class="title">正文查看</view>
+				<view class="value a" v-for="(item, index) in json.message_upload" :key="index" @click="loadFile(item.url,item.originalName)">{{item.originalName}}</view>
+			</view>
+			<view class="list">
+				<view class="title">附件查看</view>
+				<view class="files">
+					<view @click="loadFile(item.url,item.originalName)" class="file" v-for="(item, index) in json.message_enclosure" :key="index">
+						<image src="/static/img/icon_sc_wj.png"></image>
+						<text>{{item.originalName}}</text>
+					</view>
+				
+				</view>
+			</view>
+			<view class="list">
+				<u-collapse v-if="receive_user_name">
+						<u-collapse-item title="分发人员" >
+							{{receive_user_name}}
+						</u-collapse-item>
+					</u-collapse>
+			</view>
+			<view class="list">
+				<u-collapse v-if="receive_dept_name">
+						<u-collapse-item title="分发单位" >
+							{{receive_dept_name}}
+						</u-collapse-item>
+					</u-collapse>
+			</view>
+			<view class="list">
+				<view class="title">备注</view>
+				<view class="value">{{json.message_remark}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				imgUrl: '',
+				active: null,
+				show: false,
+				value: '',
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '#333', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle: '收文详情' //导航标题
+				},
+				json: {
+					message_title: '',
+					send_user_name: '',
+					message_time: '',
+					message_code: '',
+					message_remark: '',
+					finish_time: '',
+					message_upload: [],
+					message_enclosure: []
+				},
+				receive_user_name: '',
+				receive_dept_name: '',
+			}
+		},
+		onLoad(options) {
+			this.active = options.active
+			this.getOneMap(options.id)
+			this.getChldren(options.id)
+			this.receiveMessage(options.id, options.objId)
+			// this.imgUrl = options.flag == 1 ? ipc_yz_ybh : this.active == 0 ? pic_yz_wwc : this.active == 1 ? ipc_yz_ysh : ''
+		},
+		methods: {
+			loadFile(url,name) {
+				const manage = uni.getFileSystemManager();
+				uni.downloadFile({
+					url: url,
+					success: (res) => {
+						let path = res.tempFilePath;
+						// #ifdef MP-WEIXIN
+						var savePath = wx.env.USER_DATA_PATH + "/" + name
+						console.log(savePath);
+						if (res.statusCode == 200) {
+							manage.saveFile({
+								tempFilePath: res.tempFilePath,
+								filePath: savePath,
+								success:function(ress){
+									uni.openDocument({
+										 filePath: ress.savedFilePath,
+										 // fileType: "pdf",
+										 showMenu:true,
+										 success: function (resss) {
+											uni.hideLoading()
+										 }
+									 })
+								}
+							})
+						}
+						// #endif
+						// #ifndef MP-WEIXIN
+						uni.openDocument({
+						  filePath: path,
+						  showMenu: true,
+						  success: function (res) {
+						    // console.log('打开文档成功');
+						  }
+						});
+						// #endif
+						
+					}
+				});
+			},
+			async getOneMap (id) {
+				let that = this
+				let data = { 
+					"table": "boman_message",
+					"fixedData": {
+					    "id": id
+					}
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/one/map`,data)
+				
+				if (res.code == 200) {
+					if (res.data) {
+						let {message_title, send_user_name, message_time, message_code, message_remark, message_upload = '', message_enclosure = '', finish_time} = res.data || {}
+						this.json = {
+							message_title,
+							send_user_name,
+							message_time,
+							message_code,
+							finish_time,
+							message_remark,
+							message_upload: message_upload ? JSON.parse(message_upload) : [],
+							message_enclosure: message_enclosure ? JSON.parse(message_enclosure) : []
+						}
+					}
+				}
+			},
+			setTime () {
+			  let dateTime
+			  let yy = new Date().getFullYear()
+			  let mm = new Date().getMonth() + 1
+			  let dd = new Date().getDate()
+			  let hh = new Date().getHours() < 10 ? ('0' + new Date().getHours()) : new Date().getHours()
+			  let mf = new Date().getMinutes() < 10 ? ('0' + new Date().getMinutes())
+				:
+				new Date().getMinutes()
+			  let ss = new Date().getSeconds() < 10 ? ('0' + new Date().getSeconds())
+				:
+				new Date().getSeconds()
+			  dateTime = yy + '-' + (mm < 10 ? ('0' + mm) : mm) + '-' + (dd < 10 ? ('0' + dd) : dd) + ' ' + hh + ":" + mf + ":" + ss
+			  return dateTime
+			},
+			async receiveMessage (id, objId) {
+				let that = this
+				let data = { 
+					"objId": objId, // 收文id
+					"messageId": id ,// 发文id
+					"receiveTime": this.setTime()// 当前时间
+			
+				}
+				let res = await that.$u.post(`boman-web-core/message/receiveMessage`,data)
+			},
+			async getChldren (id) {
+				let that = this
+				let data = {
+					"table": "boman_message_receive",
+			        "pageNo": 1,
+			        "isUi": false,
+			        "pageSize": 1000,
+			        "orderBy": "create_time desc",
+			        "fixedData": {
+			            "condition": {
+			                "visible": "Y",
+			                "message_id": id,
+			                "is_del":"N"
+			            }
+			        }
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/queryList`,data)
+			
+				if (res.code == 200) {
+					this.receive_user_name = res.data.rows.map(item => {
+						return  item.receive_user_name
+					}).join(',')
+					this.receive_dept_name = res.data.rows.map(item => {
+						return  item.receive_dept_name
+					}).join(',')
+					// let selectData = res.data.rows.map(item => {
+					// 	return {
+					// 		userName: item.receive_user_name,
+					// 		deptName: item.receive_dept_name,
+					// 		id: item.receive_user_id,
+					// 		nickName: item.receive_user_name,
+					// 		"dept": {},
+					// 		"roles": []
+					// 	}
+					// })
+					// if (selectData && selectData.length) {
+					// 	this.getDeptNameAndRoleName(selectData)
+					// }
+				}
+			},
+			async getDeptNameAndRoleName (data) {
+				
+				let res = await this.$u.post(`system/user/getDeptNameAndRoleName`, data)
+				if (res.deptNameList) {
+					this.receive_dept_name = res.deptNameList.join(',')
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.details{
+		background: #fff;
+		position: relative;
+		.mack {
+			position: fixed;
+			width: 100%;
+			height: 100%;
+			z-index: 9999;
+			top: 88rpx;
+			background-color: rgba(0,0,0,0.2);
+			.box {
+				width: 612rpx;
+				height: 512rpx;
+				background: #FFFFFF;
+				border-radius: 6rpx;
+				top: 40%;
+				left: 50%;
+				transform: translate(-50%, -40%);
+				padding: 34rpx;
+				.head {
+					position: relative;
+					.title {
+						font-size: 30rpx;
+						font-weight: bold;
+						color: #343434;
+						text-align: center;
+					}
+					image {
+						position: absolute;
+						width: 20rpx;
+						height: 20rpx;
+						right: 0;
+						top: 50%;
+						transform: translateY(-50%);
+					}
+				}
+				.middle {
+					margin-top: 50rpx;
+					textarea {
+						width: 510rpx;
+						padding: 20rpx;
+						height: 210rpx;
+						background: #FFFFFF;
+						border: 1px solid #009FE8;
+						border-radius: 6rpx;
+						font-size: 28rpx;
+						color: #AAAAAA;
+					}
+				}
+				.btn {
+					width: 550rpx;
+					height: 76rpx;
+					background: #009FE8;
+					border-radius: 6rpx;
+					color: #fff;
+					text-align: center;
+					line-height: 76rpx;
+					font-size: 30rpx;
+					margin-top: 36rpx;
+				}
+			}
+		}
+		.status {
+			position: absolute;
+			width: 160rpx;
+			height: 94rpx;
+			right: 36rpx;
+			top: 160rpx;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.box {
+			position: relative;
+			z-index: 1;
+			padding: 0 36rpx;
+			padding-bottom: 80rpx;
+			.list {
+				margin-top: 66rpx;
+				
+				.title {
+					font-size: 28rpx;
+					font-weight: bold;
+					color: #343434;
+				}
+				.value {
+					font-size: 25rpx;
+					color: #666666;
+					margin-top: 30rpx;
+				}
+				.a {
+					color: #009FE8;
+				}
+				.files {
+					.file {
+						display: flex;
+						align-items: center;
+						margin-top: 30rpx;
+						font-size: 25rpx;
+						font-weight: 500;
+						color: #343434;
+						image {
+							width: 24rpx;
+							height: 20rpx;
+							margin-right: 10rpx;
+						}
+					}
+				}
+				/deep/ .u-collapse {
+					.u-collapse-title {
+						font-size: 28rpx;
+						font-weight: bold;
+						color: #343434;
+					}
+					.u-collapse-content {
+						font-size: 25rpx;
+						color: #666666;
+					}
+				}
+				
+			}
+			.btns {
+				padding-top: 80rpx;
+				.btn {
+					width: 100%;
+					height: 84rpx;
+					background: #009FE8;
+					border-radius: 8rpx;
+					color: #fff;
+					font-size: 28rpx;
+					text-align: center;
+					line-height: 84rpx;
+					margin-top: 26rpx;
+					&:nth-child(2) {
+						background: #FF3131;
+					}
+				}
+			
+			}
+		}
+	}
+</style>

+ 562 - 0
bureau-of-education/pages/indexView/addressee/index.vue

@@ -0,0 +1,562 @@
+<template>
+	<view class="addressee">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle" :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="topNav" :style="{top: topNav + 'px'}">
+			<view class="item">
+				<view class="text" :class="yidu == 0?'active':''" @click="onNav(0)">未读收文</view>
+			</view>
+			<view class="item">
+				<view class="text" :class="yidu == 1?'active':''"  @click="onNav(1)">已读收文</view>
+			</view>
+		</view>
+		<view class="searchBox">
+			<view class="inputBox">
+				<u-input class="input" v-model="searchVal" type="text" height="70" placeholder="请输入标题" placeholderStyle="{'color:#AAAAAA'}" />
+				<view class="btn">查询</view>
+			</view>
+			<view class="timeBox">
+				<image class="r" src="/static/img/icon_xzrq.png" mode=""></image>
+				<view class="text" @click="onShowTime()">{{message_time || '选择日期'}}</view>
+				<image class="d" src="/static/img/icon_xzrq_xl.png" mode=""></image>
+				<view class="yidu" @click="allDu(1)" v-if="yidu == 0 && data.length">
+					<image class="yd" src="/static/img/icon_yjyd.png" mode=""></image>
+					<view class="tt">全部已读</view>
+				</view>
+				<view class="shanchu" @click="allDu(2)" v-if="yidu == 1 && data.length">
+					<image class="yd" src="/static/img/icon_plsc.png" mode=""></image>
+					<view class="tt">全部删除</view>
+				</view>
+			</view>
+		</view>
+		<view class="contentMain" v-if="data.length">
+			
+			<view  class="u-swipe-action" v-for="(item, index) in data" :key="index"  @click.stop="jump(item)">
+				<!-- <view class="checkbox" v-if="">
+					<u-checkbox class="check" v-model="item.checked" active-color="#009FE8" size="40"></u-checkbox>
+				</view> -->
+				<view class="check" v-if="allduCk || allduDel">
+					<image v-if="!item.checked" class="normal" src="../../../static/img/icon_qx_normal.png"></image>
+					<image v-else class="selected"  src="../../../static/img/icon_qx_selected.png"></image>
+				</view>
+				<view class="item">
+					<view class="title">{{item.message_title}}</view>
+					<view class="userInfo">
+						<view class="user">
+							<!-- <view class="name">来文机关:潜山市教育局</view> -->
+							<view class="name">拟稿人:{{item.send_user_name}}</view>
+							<view class="name">收文日期:{{item.send_message_time}}</view>
+							<view class="name">流程结束日期:{{item.finish_time == null?'未结束':item.finish_time}}</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="no-data" v-else>暂无数据</view>
+		<view style="height: 130rpx;" v-if="allduCk"></view>
+		<view class="bottomBtn" v-if="allduCk && yidu == 0">
+			<view class="all" @click="selectedAll">
+				<!-- <u-checkbox class="check"  active-color="#009FE8" size="40"></u-checkbox> -->
+				<image v-if="!isSelected"  class="normal" src="../../../static/img/icon_qx_normal.png"></image>
+				<image v-else class="selected"  src="../../../static/img/icon_qx_selected.png"></image>
+				<view class="text">全选</view>
+			</view>
+			<view class="btn" @click="yiduUpdate">全部已读</view>
+		</view>
+		<view class="bottomBtn allduDel" v-if="allduDel && yidu == 1">
+			<view class="all" @click="selectedAll">
+				<!-- <u-checkbox class="check"  active-color="#009FE8" size="40"></u-checkbox> -->
+				<image v-if="!isSelected"  class="normal" src="../../../static/img/icon_qx_normal.png"></image>
+				<image v-else class="selected"  src="../../../static/img/icon_qx_selected.png"></image>
+				<view class="text">全选</view>
+			</view>
+			<view class="btn" @click="allDel">全部删除</view>
+		</view>
+		
+		<!-- 时间 -->
+		<u-picker mode="time" v-model="showTime" :params="params" @confirm="getTime"></u-picker>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav:{
+					backgroundColor:'#fff',  //背景色
+					color:'#333',  //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle:'收文' //导航标题
+				},
+				searchVal: '',
+				topNav: 0,
+				allduCk: false,
+				options: [
+					{
+						text: '归档',
+						style: {
+							backgroundColor: '#00B034'
+						}
+					}
+				],
+				pageNo: 1,
+				csQueryListData: [],
+				showTime: false,
+				params: {
+					year: true,
+					month: true,
+					day: true
+				},
+				message_time: '',
+				yidu: 0,
+				allduDel: false,
+				userInfo: {},
+				pageNo: 1,
+				total: 0,
+				data: [],
+				isSelected: false
+			}
+		},
+		onReachBottom() {
+			if (this.data.length >= this.total) {
+				return
+			}
+			this.pageNo += 1
+			this.getQueryList()
+		},
+		onLoad() {
+			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
+			this.getQueryList()
+			setTimeout(() => {
+				this.topNav = (this.$refs.uNavbar.navbarHeight) + (this.$refs.uNavbar.statusBarHeight)
+			}, 10)
+			// this.getMessageReceive()
+		},
+		methods:{
+			selectedAll() {
+				this.isSelected = !this.isSelected
+				this.data.forEach(item => {
+					item.checked = this.isSelected
+				})
+			},
+			async getQueryList() {
+				let res = await this.$u.post(`boman-web-core/p/cs/queryList`, {
+					"table": "boman_message_receive",
+					    "pageNo": this.pageNo,
+					    "isUi": false,
+					    "pageSize": 10,
+					    "orderBy": "create_time desc",
+					    "fixedData": {
+					        "condition": {
+					            "visible": "Y",
+								"receive_user_id": this.userInfo.id,
+					            "status": this.yidu == 0 ? "N" : 'Y',
+					            "create_time": this.message_time,
+					            "is_del":"N"
+					        }
+					    }
+				})
+				if (res.data && res.data.rows) {
+					res.data.rows = res.data.rows.map(item => {
+						return Object.assign({}, item, {
+							checked: false
+						})
+					})
+					if (this.pageNo == 1) {
+						this.data = res.data.rows
+					} else {
+						this.data = this.data.concat(res.data.rows)
+					}
+				}
+			},
+			// getTime(e) {
+			// 	// console.log(e);
+			// 	this.message_time = `${e.year}-${e.month}-${e.day}`
+			// },
+			click(index, index1) {
+				if(index1 == 1) {
+					this.list.splice(index, 1);
+					this.$u.toast(`删除了第${index}个cell`);
+				} else {
+					this.list[index].show = false;
+					this.$u.toast(`收藏成功`);
+				}
+			},
+			// 如果打开一个的时候,不需要关闭其他,则无需实现本方法
+			open(index) {
+				// 先将正在被操作的swipeAction标记为打开状态,否则由于props的特性限制,
+				// 原本为'false',再次设置为'false'会无效
+				this.list[index].show = true;
+				this.list.map((val, idx) => {
+					if(index != idx) this.list[idx].show = false;
+				})
+			},
+			onNav(val) {
+				this.yidu = val
+				this.pageNo = 1
+				this.getQueryList()
+			},
+			onShowTime() {
+				this.showTime = !this.showTime
+			},
+			getTime(e) {
+				this.message_time = `${e.year}-${e.month}-${e.day}`
+				this.pageNo = 1
+				this.getQueryList()
+			},
+			allDu(val) {
+				if (val == 1) {
+					this.allduCk = !this.allduCk
+				} else {
+					this.allduDel = !this.allduDel
+				}
+			},
+			async getMessageReceive () {
+				let that = this
+				let data = {
+					"table": "boman_message_receive",
+					"pageNo": that.pageNo,
+					"isUi": false,
+					"pageSize": 10,
+					"orderBy": "create_time desc",
+					"fixedData": {
+						"condition": {
+							"visible": "Y",
+							"receive_user_id": '',
+							"status":"N",
+							"create_time":"2021-01-01",
+							"is_del":"N"
+						}
+					},
+					"finish_time": null,
+					"id": ''
+				}
+				
+				let res = await that.$u.post(`boman-web-core/p/cs/queryList`,data)
+				that.csQueryListData = res.data.rows
+			},
+			async yiduUpdate () {
+				let that = this
+				let condition = []
+				condition = this.data.filter(item => item.checked)
+				if (!condition.length) {
+					uni.showToast({
+						title: '未选择已读文章',
+						icon: 'none'
+					})
+				}
+				let data = {
+					"tableName": "boman_message_receive",
+					    "condition": {
+					        "id": condition.map(item => item.id)
+					    },
+					    "commitData": {
+					        "status":"Y"
+					    }
+				}
+				
+				let res = await that.$u.post(`boman-web-core/p/cs/update`,data)
+				// that.csQueryListData = res.data.tableHeadList
+				if (res.code == 200) {
+					uni.showToast({
+						title:'已读成功'
+					})
+					this.allduDel = false
+					this.getQueryList()
+				} else {
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					})
+				}
+			},
+			async allDel () {
+				let that = this
+				let condition = []
+				condition = this.data.filter(item => item.checked)
+				if (!condition.length) {
+					uni.showToast({
+						title: '未选择删除文章',
+						icon: 'none'
+					})
+				}
+				let data = {
+					"tableName": "boman_message_receive",
+					    "condition": {
+					        "id": condition.map(item => item.id)
+					    },
+					    "commitData": {
+					        "is_del":"Y"
+					    }
+				}
+				
+				let res = await that.$u.post(`boman-web-core/p/cs/update`,data)
+				// that.csQueryListData = res.data.tableHeadList
+				if (res.code == 200) {
+					uni.showToast({
+						title:'删除成功'
+					})
+					this.allduDel = false
+					this.getQueryList()
+				} else {
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					})
+				}
+			},
+			async jump(item = {}) {
+				if (this.allduCk || this.allduDel) {
+					item.checked = !item.checked
+					return
+				}
+				// if (this.yidu == 0) {
+				// 	let data = {
+				// 		"tableName": "boman_message_receive",
+				// 		    "condition": {
+				// 		        "id": item.id
+				// 		    },
+				// 		    "commitData": {
+				// 		        "status":"Y"
+				// 		    }
+				// 	}
+					
+				// 	let res = await this.$u.post(`boman-web-core/p/cs/update`,data)
+				// 	// that.csQueryListData = res.data.tableHeadList
+					
+				// } else {
+				// 	uni.navigateTo({
+				// 		url: '/pages/indexView/addressee/details?id=' + item.message_id + '&objId=' + item.id
+				// 	})
+				// }
+				uni.navigateTo({
+					url: '/pages/indexView/addressee/details?id=' + item.message_id + '&objId=' + item.id
+				})
+			}
+		}
+	}
+</script>
+<style>
+	page{
+		background: #FFFFFF;
+	}
+</style>
+<style lang="scss" scoped>
+.topNav{
+	display: flex;
+	align-items: center;
+	background: #FFFFFF;
+	height: 90rpx;
+	box-shadow: 0px 14rpx 10rpx 0px rgba(218, 218, 218, 0.35);
+	position: sticky;
+	width: 100%;
+	left: 0;
+	z-index: 9;
+	.item{
+		flex: 1;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		.text{
+			font-size: 26rpx;
+			color: #191919;
+			font-weight: 600;
+		}
+		.active{
+			position: relative;
+			&::after{
+				content: '';
+				position: absolute;
+				width: 28rpx;
+				height: 6rpx;
+				background: #009FE8;
+				border-radius: 6rpx;
+				bottom: -14rpx;
+				left: 50%;
+				transform: translate(-50%,0);
+			}
+		}
+	}
+}
+.searchBox{
+	padding: 30rpx;
+	.inputBox{
+		display: flex;
+		align-items: center;
+		.input{
+			flex: 1;
+			width: 100%;
+			margin-right: 30rpx;
+			background: #EDEDED;
+			border-radius: 40rpx;
+			padding: 0 30rpx !important;
+		}
+		.btn{
+			background: #009FE8;
+			color: #FFFFFF;
+			font-size: 26rpx;
+			height: 60rpx;
+			line-height: 60rpx;
+			padding: 0 30rpx;
+			text-align: center;
+			border-radius: 40rpx;
+		}
+	}
+	
+}
+.timeBox{
+	padding: 30rpx 0 20rpx 0;
+	display: flex;
+	align-items: center;
+	.r{
+		width: 30rpx;
+		height: 33rpx;
+	}
+	.text{
+		font-size: 26rpx;
+		color: #343434;
+		margin: 0 14rpx;
+	}
+	.d{
+		width: 20rpx;
+		height: 20rpx;
+	}
+	.yidu{
+		margin-left: auto;
+		display: flex;
+		align-items: center;
+		.yd{
+			width: 26rpx;
+			height: 26rpx;
+		}
+		.tt{
+			font-size: 24rpx;
+			color: #54BA10;
+			margin-left: 10rpx;
+		}
+	}
+	.shanchu{
+		margin-left: auto;
+		display: flex;
+		align-items: center;
+		.yd{
+			width: 30rpx;
+			height: 35rpx;
+		}
+		.tt{
+			font-size: 24rpx;
+			color: #FF3131;
+			margin-left: 10rpx;
+		}
+	}
+}
+.contentMain{
+	.u-swipe-action {
+		margin-bottom: 30rpx;
+		display: flex;
+		align-items: center;
+		.checkbox{
+			flex: 0 0 40rpx;
+			width: 40rpx;
+			margin-left: 30rpx;
+			.check{
+				width: 40rpx;
+			}
+		}
+		.check {
+			margin-left: 20rpx;
+			.normal,
+			.selected {
+				width: 30rpx;
+				height: 30rpx;
+			}
+		}
+	}
+	.item{
+		flex: 1;
+		padding: 0 30rpx;
+		.title{
+			font-size: 28rpx;
+			font-weight: 700;
+			color: #343434;
+			width: 70%;
+			white-space: break-word;
+			word-break:break-all;
+		}
+		.userInfo{
+			display: flex;
+			align-items: flex-end;
+			margin-top: 30rpx;
+			border-bottom: solid 1rpx #DADADA;
+			padding-bottom: 30rpx;
+			.user{
+				flex: 1;
+				color: #666;
+				font-size: 24rpx;
+				.name{
+					margin-bottom: 10rpx;
+				}
+			}
+			.status{
+				color: #AAAAAA;
+				font-size: 26rpx;
+				margin-bottom: 4rpx;
+			}
+		}
+	}
+}
+.bottomBtn{
+	display: flex;
+	align-items: center;
+	height: 100rpx;
+	width: 100%;
+	left: 0;
+	z-index: 9;
+	bottom: 0;
+	position: fixed;
+	border-top: solid 1px #E5E5E5;
+	.all{
+		display: flex;
+		align-items: center;
+		flex: 0 0 200rpx;
+		background: #FFFFFF;
+		justify-content: center;
+		line-height: 100rpx;
+		.normal,
+		.selected {
+			width: 30rpx;
+			height: 30rpx;
+		}
+		.check{
+			width: 40rpx;
+			height: 40rpx;
+		}
+		.text{
+			font-size: 28rpx;
+			color: #343434;
+			margin-left: 20rpx;
+		}
+	}
+	.btn{
+		background: #009FE8;
+		color: #FFFFFF;
+		font-size: 28rpx;
+		line-height: 100rpx;
+		text-align: center;
+		flex: 1;
+	}
+}
+
+.allduDel{
+	.btn{
+		background: #FF3131;
+		color: #FFFFFF;
+		font-size: 28rpx;
+		line-height: 100rpx;
+		text-align: center;
+		flex: 1;
+	}
+}
+</style>

+ 307 - 0
bureau-of-education/pages/indexView/archive/index.vue

@@ -0,0 +1,307 @@
+<template>
+	<view class="archive">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle" :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="topNav" :style="{top: topNav + 'px'}">
+			<view class="item">
+				<view class="text" :class="{active: active == 0}" @click="setNavs(0)">发文</view>
+			</view>
+			<view class="item">
+				<view class="text" :class="{active: active == 1}" @click="setNavs(1)">收文</view>
+			</view>
+		</view>
+		<view class="searchBox">
+			<view class="inputBox">
+				<u-input class="input" v-model="searchVal" type="text" height="70" placeholder="请输入标题" placeholderStyle="{'color:#AAAAAA'}" />
+				<view class="btn" @click="search">查询</view>
+			</view>
+			<view class="timeBox" @click="showTime = true">
+				<image class="r" src="/static/img/icon_xzrq.png" mode=""></image>
+				<view class="text">{{message_time || '选择日期'}}</view>
+				<image class="d" src="/static/img/icon_xzrq_xl.png" mode=""></image>
+			</view>
+		</view>
+		<view class="contentMain" v-if="list.length">
+			<u-swipe-action 
+				:show="item.show" 
+				:index="index" 
+				v-for="(item, index) in list" 
+				:key="item.id" 
+				@click="click" 
+				@open="open"
+				:options="options"
+				class="u-swipe-action "
+					>
+				<view class="item">
+					<view class="title">{{item.message_title}}</view>
+					<view class="userInfo">
+						<view class="user">
+							<view class="name">拟稿人:{{item.send_user_name}}</view>
+							<view class="name">发文日期:{{item.message_time}}</view>
+							<view class="name">流程结束日期:{{item.finish_time}}</view>
+						</view>
+						<view class="status">{{item.status}}</view>
+					</view>
+				</view>
+			</u-swipe-action>
+		</view>
+		<view class="no-data" v-else>暂无数据</view>
+		<u-picker mode="time" v-model="showTime" :params="params" @confirm="getTime"></u-picker>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav:{
+					backgroundColor:'#fff',  //背景色
+					color:'#333',  //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle:'待归档' //导航标题
+				},
+				showTime: false,
+				searchVal: '',
+				topNav: 0,
+				list: [],
+				disabled: false,
+				btnWidth: 180,
+				show: false,
+				userInfo: {},
+				pageNo: 1,
+				active: 0,
+				message_time: '',
+				options: [
+					{
+						text: '归档',
+						style: {
+							backgroundColor: '#00B034'
+						}
+					}
+				],
+				params: {
+					year: true,
+					month: true,
+					day: true
+				},
+				total: 0
+			}
+		},
+		onReachBottom() {
+			if (this.list.length >= this.total) {
+				return
+			}
+			this.pageNo += 1
+			this.getQueryList()
+		},
+		onLoad() {
+			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
+			this.getQueryList()
+			setTimeout(() => {
+				this.topNav = (this.$refs.uNavbar.navbarHeight) + (this.$refs.uNavbar.statusBarHeight)
+			}, 10)
+		},
+		methods:{
+			search () {
+					this.pageNo = 1
+					this.getQueryList()
+			},
+			async getQueryList() {
+				let res = await this.$u.post(`boman-web-core/p/cs/queryList`, {
+					"table": "boman_message",
+					"pageNo": this.pageNo,
+					"isUi": false,
+					"pageSize": 10,
+					"orderBy": "create_time desc",
+					"fixedData": {
+						"condition": {
+							"place_on_file": 1,
+							"send_user_id": this.userInfo.id,
+							"message_title": this.searchVal,
+							"create_time": this.message_time,
+							"is_del":"N"
+						}
+					}
+				})
+				if (res.data && res.data.rows) {
+					res.data.rows = res.data.rows.map(item => {
+						return Object.assign({}, item, {
+							show: false
+						})
+					})
+					if (this.pageNo == 1) {
+						this.list = res.data.rows
+					} else {
+						this.list = this.list.concat(res.data.rows)
+					}
+				}
+			},
+			getTime(e) {
+				// console.log(e);
+				this.message_time = `${e.year}-${e.month}-${e.day}`
+				this.pageNo = 1
+				this.getQueryList()
+			},
+			async click(index, index1) {
+				let res = await this.$u.get('boman-web-core/p/cs/objectSave', {
+					"table": "boman_message",
+					    "objId": this.data[index].id,
+					    "fixedData": {
+					        "place_on_file": "2"
+					    }
+				})
+				if (res.code == 200) {
+					uni.showToast({
+						title: res.msg
+					})
+					this.pageNo = 1
+					this.getQueryList()
+				} else {
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					})
+				}
+			},
+			// 如果打开一个的时候,不需要关闭其他,则无需实现本方法
+			open(index) {
+				// 先将正在被操作的swipeAction标记为打开状态,否则由于props的特性限制,
+				// 原本为'false',再次设置为'false'会无效
+				this.list[index].show = true;
+				this.list.map((val, idx) => {
+					if(index != idx) this.list[idx].show = false;
+				})
+			},
+			setNavs (active) {
+				this.active = active
+				this.pageNo = 1
+				if (active == 0) {
+					this.getQueryList()
+				} else {
+					this.list = []
+				}
+			}
+		}
+	}
+</script>
+<style>
+	page{
+		background: #FFFFFF;
+	}
+</style>
+<style lang="scss" scoped>
+.topNav{
+	display: flex;
+	align-items: center;
+	background: #FFFFFF;
+	height: 90rpx;
+	box-shadow: 0px 14rpx 10rpx 0px rgba(218, 218, 218, 0.35);
+	position: sticky;
+	width: 100%;
+	left: 0;
+	z-index: 9;
+	.item{
+		flex: 1;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		.text{
+			font-size: 26rpx;
+			color: #191919;
+			font-weight: 600;
+		}
+		.active{
+			position: relative;
+			&::after{
+				content: '';
+				position: absolute;
+				width: 28rpx;
+				height: 6rpx;
+				background: #009FE8;
+				border-radius: 6rpx;
+				bottom: -14rpx;
+				left: 50%;
+				transform: translate(-50%,0);
+			}
+		}
+	}
+}
+.searchBox{
+	padding: 30rpx;
+	.inputBox{
+		display: flex;
+		align-items: center;
+		.input{
+			flex: 1;
+			width: 100%;
+			margin-right: 30rpx;
+			background: #EDEDED;
+			border-radius: 40rpx;
+			padding: 0 30rpx !important;
+		}
+		.btn{
+			background: #009FE8;
+			color: #FFFFFF;
+			font-size: 26rpx;
+			height: 60rpx;
+			line-height: 60rpx;
+			padding: 0 30rpx;
+			text-align: center;
+			border-radius: 40rpx;
+		}
+	}
+	
+}
+.timeBox{
+	padding: 30rpx 0 20rpx 0;
+	display: flex;
+	align-items: center;
+	.r{
+		width: 30rpx;
+		height: 33rpx;
+	}
+	.text{
+		font-size: 26rpx;
+		color: #343434;
+		margin: 0 14rpx;
+	}
+	.d{
+		width: 20rpx;
+		height: 20rpx;
+	}
+}
+.contentMain{
+	.item{
+		.title{
+			font-size: 28rpx;
+			font-weight: 700;
+			color: #343434;
+			padding: 30rpx 30rpx 0 30rpx;
+			width: 70%;
+			white-space: break-word;
+			word-break:break-all;
+		}
+		.userInfo{
+			display: flex;
+			align-items: flex-end;
+			border-bottom: solid 1rpx #DADADA;
+			padding: 30rpx;
+			.user{
+				flex: 1;
+				color: #666;
+				font-size: 24rpx;
+				.name{
+					margin-bottom: 10rpx;
+				}
+			}
+			.status{
+				color: #AAAAAA;
+				font-size: 26rpx;
+				margin-bottom: 4rpx;
+			}
+		}
+	}
+}
+</style>

+ 11 - 0
bureau-of-education/pages/indexView/postList/index.vue

@@ -0,0 +1,11 @@
+<template>
+	<view class="postList">
+		postList
+	</view>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 138 - 0
bureau-of-education/pages/postView/approvalProcess/index.vue

@@ -0,0 +1,138 @@
+<template>
+	<view class="approvalProcess">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle" :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="content">
+			<u-time-line>
+				<u-time-line-item nodeTop="10">
+					<!-- 此处自定义了左边内容,用一个图标替代 -->
+					<template v-slot:node>
+						<view class="u-node" style="background: #009FE8;"></view>
+					</template>
+					<template v-slot:content>
+						<view>
+							<view class="u-order-title">{{name}}</view>
+							<view class="u-order-desc">发文审核申请</view>
+							<view class="u-order-time">{{createTime}}</view>
+						</view>
+					</template>
+				</u-time-line-item>
+				<u-time-line-item nodeTop="10" v-for="(item, index) in data" :key="index">
+					<!-- 此处自定义了左边内容,用一个图标替代 -->
+					<template v-slot:node>
+						<view class="u-node" style="background: #009FE8;"></view>
+					</template>
+					<template v-slot:content>
+						<view>
+							<view class="u-order-title">{{item.approvalName}}</view>
+							<view class="u-order-desc">{{item.nodeName}} - {{item.approvalOperation}}</view>
+							<view class="u-order-time">{{item.approveTime}}</view>
+						</view>
+					</template>
+				</u-time-line-item>
+				<u-time-line-item nodeTop="10">
+					<!-- 此处自定义了左边内容,用一个图标替代 -->
+					<template v-slot:node>
+						<view class="u-node" style="background: #009FE8;"></view>
+					</template>
+					<template v-slot:content>
+						<view>
+							<view class="u-order-title">等待下一级人员审核中</view>
+						</view>
+					</template>
+				</u-time-line-item>
+			</u-time-line>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav:{
+					backgroundColor:'#fff',  //背景色
+					color:'#333',  //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle:'审核流程' //导航标题
+				},
+				id: '',
+				data: [],
+				name: '',
+				createTime: ''
+			}
+		},
+		onLoad(options) {
+			this.id = options.id
+			this.name = options.name
+			this.getDetail()
+		},
+		methods: {
+			async getDetail() {
+				let res = await this.$u.post(`jflow/p/c/task/backlog/detail`, {
+					businessCode: this.id
+				})
+				if (res.resultCode == 0) {
+					let data = []
+					res.data.guiValue.forEach(item => {
+						if (item.nodeName == '开始') {
+							this.createTime = item.createTime
+						} else {
+							item.approvalLists.forEach(({approvalName, approvalOperation, approveTime}) => {
+								data.push({
+									approvalName,
+									approvalOperation,
+									approveTime,
+									nodeName: item.nodeName
+								})
+							})
+							
+						}
+					})
+					this.data = data
+				}
+				// if (res.data && res.data.rows) {
+				// 	if (this.pageNo == 1) {
+				// 		this.data = res.data.rows
+				// 		this.total = res.data.total
+				// 	} else {
+				// 		this.data = this.data.concat(res.data.rows)
+				// 	}
+				// }
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content{
+		padding: 100rpx;
+	}
+	.u-node {
+		width: 22rpx;
+		height: 22rpx;
+		border-radius: 100rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		background: #d0d0d0;
+	}
+	
+	.u-order-title {
+		color: #343434;
+		font-weight: bold;
+		font-size: 28rpx;
+	}
+	
+	.u-order-desc {
+		color: rgb(150, 150, 150);  
+	}
+	
+	.u-order-time {
+		color: rgb(200, 200, 200);
+		font-size: 26rpx;
+		margin-top: 20rpx;
+	}
+</style>

+ 374 - 0
bureau-of-education/pages/postView/postDetails/index.vue

@@ -0,0 +1,374 @@
+<template>
+	<view class="details">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="status">
+			<image :src="imgUrl"></image>
+		</view>
+		<view class="box">
+			<view class="list">
+				<view class="title">文件标题</view>
+				<view class="value">{{json.message_title}}</view>
+			</view>
+			<view class="list">
+				<view class="title">拟稿人</view>
+				<view class="value">{{json.send_user_name}}</view>
+			</view>
+			<view class="list">
+				<view class="title">发文日期</view>
+				<view class="value">{{json.message_time}}</view>
+			</view>
+			<view class="list">
+				<view class="title">流程结束日期</view>
+				<view class="value">{{json.finish_time == null ? '未结束' : json.finish_time}}</view>
+			</view>
+			<view class="list">
+				<view class="title">发文字号</view>
+				<view class="value">{{json.message_code}}</view>
+			</view>
+			<view class="list">
+				<view class="title">正文查看</view>
+				<view class="value a" v-for="(item, index) in json.message_upload" :key="index" @click="loadFile(item.url,item.originalName)">{{item.originalName}}</view>
+			</view>
+			<view class="list">
+				<view class="title">附件查看</view>
+				<view class="files">
+					<view class="file" @click="loadFile(item.url,item.originalName)" v-for="(item, index) in json.message_enclosure" :key="index">
+						<image src="/static/img/icon_sc_wj.png"></image>
+						<text>{{item.originalName}}</text>
+					</view>
+				
+				</view>
+			</view>
+			<view class="list">
+				<u-collapse v-if="receive_user_name" >
+						<u-collapse-item title="分发人员" >
+							{{receive_user_name}}
+						</u-collapse-item>
+					</u-collapse>
+			</view>
+			<view class="list">
+				<u-collapse v-if="receive_dept_name">
+						<u-collapse-item title="分发单位" >
+							{{receive_dept_name}}
+						</u-collapse-item>
+				</u-collapse>
+			</view>
+			<view class="list">
+				<view class="title">备注</view>
+				<view class="value">{{json.message_remark}}</view>
+			</view>
+			<view class="btns" v-if="active == 0">
+				<view class="btn" @click="pass">审核通过</view>
+				<view class="btn"  @click="show = true">审核驳回</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	const pic_yz_wwc = require("../../../static/img/pic_yz_wwc_1.png")
+	const ipc_yz_ysh = require("../../../static/img/ipc_yz_ywc.png")
+	const ipc_yz_ybh = require("../../../static/img/ipc_yz_ybh.png")
+	export default {
+		data() {
+			return {
+				imgUrl: '',
+				active: null,
+				show: false,
+				value: '',
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '#333', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle: '发文详情' //导航标题
+				},
+				json: {
+					message_title: '',
+					send_user_name: '',
+					message_time: '',
+					message_code: '',
+					message_remark: '',
+					finish_time: '',
+					message_upload: [],
+					message_enclosure: []
+				},
+				receive_user_name: '',
+				receive_dept_name: '',
+			}
+		},
+		onLoad(options) {
+			this.active = options.active
+			this.getOneMap(options.id)
+			this.getChldren(options.id)
+			// this.imgUrl = options.flag == 1 ? ipc_yz_ybh : this.active == 0 ? pic_yz_wwc : this.active == 1 ? ipc_yz_ysh : ''
+		},
+		methods: {
+			loadFile(url,name) {
+				const manage = uni.getFileSystemManager();
+				uni.downloadFile({
+					url: url,
+					success: (res) => {
+						let path = res.tempFilePath;
+						// #ifdef MP-WEIXIN
+						var savePath = wx.env.USER_DATA_PATH + "/" + name
+						console.log(savePath);
+						if (res.statusCode == 200) {
+							manage.saveFile({
+								tempFilePath: res.tempFilePath,
+								filePath: savePath,
+								success:function(ress){
+									uni.openDocument({
+										 filePath: ress.savedFilePath,
+										 // fileType: "pdf",
+										 success: function (resss) {
+											uni.hideLoading()
+										 }
+									 })
+								}
+							})
+						}
+						// #endif
+						// #ifndef MP-WEIXIN
+							uni.openDocument({
+								filePath: path,
+								showMenu: true,
+								success: function (res) {
+								    // console.log('打开文档成功');
+								}
+							});
+						// #endif
+						
+					}
+				});
+			},
+			async getOneMap (id) {
+				let that = this
+				let data = { 
+					"table": "boman_message",
+					"fixedData": {
+					    "id": id
+					}
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/one/map`,data)
+				
+				if (res.code == 200) {
+					if (res.data) {
+						let {message_title, send_user_name, message_time, message_code, message_remark, message_upload = '', message_enclosure = '', finish_time} = res.data || {}
+						this.json = {
+							message_title,
+							send_user_name,
+							message_time,
+							message_code,
+							finish_time,
+							message_remark,
+							message_upload: message_upload ? JSON.parse(message_upload) : [],
+							message_enclosure: message_enclosure ? JSON.parse(message_enclosure) : []
+						}
+					}
+				}
+			},
+			async getChldren (id) {
+				let that = this
+				let data = { 
+					"table": "boman_message_receive",
+					"pageNo": 1,
+					"isUi": false,
+					"pageSize": 1000,
+					"orderBy": "create_time desc",
+					"fixedData": {
+					    "condition": {
+					        "visible": "Y",
+					        "message_id": id,
+					        "is_del":"N"
+					    }
+					}
+			
+				}
+				let res = await that.$u.post(`boman-web-core/p/cs/queryList`,data)
+			
+				if (res.code == 200) {
+					this.receive_user_name = res.data.rows.map(item => {
+						return  item.receive_user_name
+					}).join(',')
+					this.receive_dept_name = res.data.rows.map(item => {
+						return  item.receive_dept_name
+					}).join(',')
+					// console.log(this.receive_dept_name)
+					// let selectData = res.data.rows.map(item => {
+					// 	return {
+					// 		userName: item.receive_user_name,
+					// 		deptName: item.receive_dept_name,
+					// 		id: item.receive_user_id,
+					// 		nickName: item.receive_user_name,
+					// 		"dept": {},
+					// 		"roles": []
+					// 	}
+					// })
+					// if (selectData && selectData.length) {
+					// 	this.getDeptNameAndRoleName(selectData)
+					// }
+				}
+			},
+			async getDeptNameAndRoleName (data) {
+				
+				let res = await this.$u.post(`system/user/getDeptNameAndRoleName`, data)
+				if (res.deptNameList) {
+					this.receive_dept_name = res.deptNameList.join(',')
+				}
+			},
+			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.details{
+		background: #fff;
+		position: relative;
+		.mack {
+			position: fixed;
+			width: 100%;
+			height: 100%;
+			z-index: 9999;
+			top: 88rpx;
+			background-color: rgba(0,0,0,0.2);
+			.box {
+				width: 612rpx;
+				height: 512rpx;
+				background: #FFFFFF;
+				border-radius: 6rpx;
+				top: 40%;
+				left: 50%;
+				transform: translate(-50%, -40%);
+				padding: 34rpx;
+				.head {
+					position: relative;
+					.title {
+						font-size: 30rpx;
+						font-weight: bold;
+						color: #343434;
+						text-align: center;
+					}
+					image {
+						position: absolute;
+						width: 20rpx;
+						height: 20rpx;
+						right: 0;
+						top: 50%;
+						transform: translateY(-50%);
+					}
+				}
+				.middle {
+					margin-top: 50rpx;
+					textarea {
+						width: 510rpx;
+						padding: 20rpx;
+						height: 210rpx;
+						background: #FFFFFF;
+						border: 1px solid #009FE8;
+						border-radius: 6rpx;
+						font-size: 28rpx;
+						color: #AAAAAA;
+					}
+				}
+				.btn {
+					width: 550rpx;
+					height: 76rpx;
+					background: #009FE8;
+					border-radius: 6rpx;
+					color: #fff;
+					text-align: center;
+					line-height: 76rpx;
+					font-size: 30rpx;
+					margin-top: 36rpx;
+				}
+			}
+		}
+		.status {
+			position: absolute;
+			width: 160rpx;
+			height: 94rpx;
+			right: 36rpx;
+			top: 160rpx;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.box {
+			position: relative;
+			z-index: 1;
+			padding: 0 36rpx;
+			padding-bottom: 80rpx;
+			.list {
+				margin-top: 66rpx;
+				
+				.title {
+					font-size: 28rpx;
+					font-weight: bold;
+					color: #343434;
+				}
+				.value {
+					font-size: 25rpx;
+					color: #666666;
+					margin-top: 30rpx;
+				}
+				.a {
+					color: #009FE8;
+				}
+				.files {
+					.file {
+						display: flex;
+						align-items: center;
+						margin-top: 30rpx;
+						font-size: 25rpx;
+						font-weight: 500;
+						color: #343434;
+						image {
+							width: 24rpx;
+							height: 20rpx;
+							margin-right: 10rpx;
+						}
+					}
+				}
+				/deep/ .u-collapse {
+					.u-collapse-title {
+						font-size: 28rpx;
+						font-weight: bold;
+						color: #343434;
+					}
+					.u-collapse-content {
+						font-size: 25rpx;
+						color: #666666;
+					}
+					// .u-collapse-body {
+					// 	height: auto !important;
+					// }
+				}
+				
+			}
+			.btns {
+				padding-top: 80rpx;
+				.btn {
+					width: 100%;
+					height: 84rpx;
+					background: #009FE8;
+					border-radius: 8rpx;
+					color: #fff;
+					font-size: 28rpx;
+					text-align: center;
+					line-height: 84rpx;
+					margin-top: 26rpx;
+					&:nth-child(2) {
+						background: #FF3131;
+					}
+				}
+			
+			}
+		}
+	}
+</style>

+ 359 - 0
bureau-of-education/pages/postView/selectPeople/index.vue

@@ -0,0 +1,359 @@
+<template>
+	<view class="selectPeople">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="selectBox">
+			<view class="navs">
+				<view class="nav" @click="setNavs(0)" :class="active == 0 ? 'active' : ''">按部门</view>
+				<view class="nav" @click="setNavs(1)" :class="active == 1 ? 'active' : ''">按角色</view>
+				<view class="nav" @click="setNavs(2)" :class="active == 2 ? 'active' : ''">按组</view>
+			</view>
+			<view class="box" v-if="active === 0">
+				<view class="list" v-for="(item, index) in data">
+					<view class="head"  @click="deptUser(item)">
+						<view class="tite">{{item.label}}</view>
+						<image v-if="!item.isSl" src="../../../static/img/icon_xzry_xl.png"></image>
+						<image v-else src="../../../static/img/icon_xzry_sl.png"></image>
+					</view>
+					<view class="section" v-if="item.isSl">
+						<view class="allSelect" @click="selectAll(item)">
+							<image v-if="!item.isAll" src="../../../static/img/icon_qx_normal.png"></image>
+							<image v-else src="../../../static/img/icon_qx_selected.png"></image>
+							<text>全选</text>
+						</view>
+						<view class="select" @click="select(ls)" v-for="(ls, i) in item.userList">{{ls.userName}}</view>
+					</view>
+				</view>
+			</view>
+			<view class="box" v-if="active === 1">
+				<view class="list" v-for="(item, index) in data1">
+					<view class="head"  @click="rolesUser(item)">
+						<view class="tite">{{item.label}}</view>
+						<image v-if="!item.isSl" src="../../../static/img/icon_xzry_xl.png"></image>
+						<image v-else src="../../../static/img/icon_xzry_sl.png"></image>
+					</view>
+					<view class="section" v-if="item.isSl">
+						<view class="allSelect" @click="selectAll(item)">
+							<image v-if="!item.isAll" src="../../../static/img/icon_qx_normal.png"></image>
+							<image v-else src="../../../static/img/icon_qx_selected.png"></image>
+							<text>全选</text>
+						</view>
+						<view class="select" @click="select(ls)" v-for="(ls, i) in item.userList">{{ls.userName}}</view>
+					</view>
+				</view>
+			</view>
+			<view class="box" v-if="active === 2">
+				<view class="list" v-for="(item, index) in data2">
+					<view class="head" @click="groupUser(item)">
+						<view class="tite">{{item.label}}</view>
+						<image v-if="!item.isSl"  src="../../../static/img/icon_xzry_xl.png"></image>
+						<image v-else  src="../../../static/img/icon_xzry_sl.png"></image>
+					</view>
+					<view class="section" v-if="item.isSl">
+						<view class="allSelect" @click="selectAll(item)">
+							<image v-if="!item.isAll" src="../../../static/img/icon_qx_normal.png"></image>
+							<image v-else src="../../../static/img/icon_qx_selected.png"></image>
+							<text>全选</text>
+						</view>
+						<view class="select" @click="select(ls)" v-for="(ls, i) in item.userList">{{ls.userName}}</view>
+					</view>
+				</view>
+			</view>
+			
+			<view class="exhibition">
+				<view class="empty" @click="delAll()">
+					<image src="../../../static/img/icon_plsc.png"></image>
+					<view>清空</view>
+				</view>
+				<view class="lis">
+					<view class="li" @click="del(item)" v-for="(item, index) in selectData" :key="index">{{item.nickName}}<image  src="../../../static/img/icon_xzry_close.png"></image>
+					</view>
+				</view>
+				<view class="btn" @click="jump()">确认</view>
+			</view>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '#000', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#000',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle: '选择人员' //导航标题
+				},
+				active: 0,
+				data: [],
+				data1: [],
+				data2: [],
+				selectData: []
+			}
+		},
+		onLoad() {
+			this.getDepts()
+		},
+		methods: {
+			setNavs (type) {
+				this.active = type
+				switch (type){
+					case 0:
+						this.getDepts()
+						break;
+					case 1:
+						this.getRoles()
+						break;
+					default:
+						this.getGroups()
+						break;
+				}
+			},
+			async getDepts () {
+				let res = await this.$u.get('system/dept/treeselect')
+				if (res.code == 200) {
+					this.data = res.data.map(item => {
+						return Object.assign({}, item, {
+							isAll: false,
+							isSl: false,
+							userList: []
+						})
+					})
+				} else {
+					this.data = []
+				}
+			},
+			async getGroups () {
+				let res = await this.$u.get('system/group/list')
+				console.log(res)
+				if (res.code == 200) {
+					this.data2 = res.data.map(item => {
+						return Object.assign({}, item, {
+							label: item.groupName,
+							isAll: false,
+							isSl: false,
+							userList: []
+						})
+					})
+				} else {
+					this.data2 = []
+				}
+			},
+			async getRoles () {
+				let res = await this.$u.get('system/role/list')
+				console.log(res)
+				if (res.code == 200) {
+					this.data1 = res.rows.map(item => {
+						return Object.assign({}, item, {
+							label: item.roleName,
+							isAll: false,
+							isSl: false,
+							userList: []
+						})
+					})
+				} else {
+					this.data1 = []
+				}
+			},
+			async rolesUser(item) {
+				let res = await this.$u.get('system/role/user/' + item.id)
+				item.userList = res.data
+				item.isSl = !item.isSl
+			},
+			async deptUser(item) {
+				let res = await this.$u.get('system/dept/user/' + item.id)
+				item.userList = res.data
+				item.isSl = !item.isSl
+			},
+			async groupUser(item) {
+				let res = await this.$u.get('system/group/user/' + item.id)
+				item.userList = res.data
+				item.isSl = !item.isSl
+			},
+			delAll () {
+				this.data.map(item => {
+					item.isAll = false
+				})
+				this.data1.map(item => {
+					item.isAll = false
+				})
+				this.data2.map(item => {
+					item.isAll = false
+				})
+				this.selectData = []
+			},
+			del (item) {
+				var result = this.selectData.filter(list => list.nickName !== item.nickName )
+				this.selectData = result
+			},
+			selectAll (item) {
+				// 全选
+				let users = item.userList.map(item1 => item1.nickName)
+				if (!item.isAll) {
+					item.isAll = true
+					item.userList.map(item1 => {
+						var result = this.selectData.some(list => list.nickName === item1.nickName )
+						if (!result) {
+							this.selectData.push(item1)
+						}
+					})
+				} else {
+					item.isAll = false
+					this.selectData = this.selectData.filter(item1 => users.indexOf(item1.nickName) == -1)
+				}
+			},
+			select (item) {
+				var result = this.selectData.some(list => list.nickName === item.nickName )
+				if (!result) {
+					this.selectData.push(item)
+				}
+			},
+			jump () {
+				uni.setStorageSync('selectData', JSON.stringify(this.selectData))
+				uni.navigateBack({
+				    delta: 1
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.selectPeople {
+		background-color: #fff;
+		height: 100%;
+		.selectBox {
+			display: flex;
+			flex-direction: column;
+			height: calc(100% - 44px);
+		}
+		.navs {
+			display: flex;
+			align-items: center;
+			height: 90rpx;
+			background: #FFFFFF;
+			box-shadow: 0px 4rpx 2rpx 0px rgba(227, 227, 227, 0.3);
+
+			.nav {
+				font-size: 24rpx;
+				font-weight: 500;
+				color: #666666;
+				margin: 0 32rpx;
+
+				&.active {
+					color: #009FE8;
+				}
+
+			}
+		}
+
+		.box {
+			padding: 0 32rpx;
+			flex: 1;
+			overflow: hidden;
+			overflow-y: auto;
+			.list {
+				// 
+				border-bottom: 1px solid #CDCDCD;
+
+				.head {
+					height: 90rpx;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					font-size: 28rpx;
+					font-weight: bold;
+					color: #343434;
+
+					image {
+						width: 20rpx;
+						height: 12rpx;
+					}
+				}
+
+				.section {
+					.allSelect {
+						display: flex;
+						align-items: center;
+						font-size: 24rpx;
+						font-weight: 500;
+						color: #009FE8;
+
+						image {
+							width: 30rpx;
+							height: 30rpx;
+							margin-right: 12rpx;
+						}
+					}
+
+					.select {
+						font-size: 28rpx;
+						color: #343434;
+						margin: 40rpx 0;
+					}
+				}
+			}
+		}
+
+		.exhibition {
+			padding: 32rpx;
+
+			.empty {
+				display: flex;
+				justify-content: flex-end;
+				align-items: center;
+				font-size: 24rpx;
+				color: #FF3131;
+
+				image {
+					width: 20rpx;
+					height: 24rpx;
+					margin-right: 12rpx;
+				}
+			}
+
+			.lis {
+				height: 270rpx;
+				border: 1px solid #A7A7A7;
+				border-radius: 6rpx;
+				display: flex;
+				margin-top: 16rpx;
+				margin-bottom: 26rpx;
+				flex-wrap: wrap;
+				overflow-y: auto;
+				.li {
+					padding: 0 20rpx;
+					height: 56rpx;
+					background: #D2E5ED;
+					border-radius: 28rpx;
+					font-size: 24rpx;
+					font-weight: 500;
+					color: #343434;
+					display: flex;
+					align-items: center;
+					margin: 20rpx;
+
+					image {
+						width: 20rpx;
+						height: 20rpx;
+						margin-left: 16rpx;
+					}
+				}
+			}
+
+			.btn {
+				height: 90rpx;
+				background: #009FE8;
+				border-radius: 6px;
+				color: #fff;
+				text-align: center;
+				line-height: 90rpx;
+			}
+		}
+	}
+</style>

+ 306 - 0
bureau-of-education/pages/postView/viewProgress/index.vue

@@ -0,0 +1,306 @@
+<template>
+	<view class="collector">
+		<u-navbar ref="uNavbar" :border-bottom="false" :title-width="340" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="topNav" :style="{top: topNav + 'px'}">
+			<view class="item">
+				<view class="text" :class="yidu == 0?'active':''" @click="onNav(0)">全部</view>
+			</view>
+			<view class="item">
+				<view class="text" :class="yidu == 1?'active':''"  @click="onNav(1)">已读</view>
+			</view>
+			<view class="item">
+				<view class="text" :class="yidu == 2?'active':''"  @click="onNav(2)">未读</view>
+			</view>
+		</view>
+		<view class="title">
+			已发文给 <text>{{totals}}人</text>;其中有 <text>{{read}}人</text> 已读; <text>{{notRead}}人</text> 未读
+		</view>
+		<view class="table">
+			<view class="thead">
+				<view class="tr">
+					<view class="th">收文员</view>
+					<view class="th">单位</view>
+					<view class="th">发文时间</view>
+					<view class="th">收文时间</view>
+					<view class="th">状态</view>
+				</view>
+			</view>
+			<view class="tbody" v-if="data.length">
+				<view class="tr" v-for="(item, index) in data" :key="index">
+					<view class="td">
+						{{item.receive_user_name}}
+					</view>
+					<view class="td">
+						{{item.receive_dept_name}}
+					</view>
+					<view class="td">
+						{{item.send_message_time}}
+					</view>
+					<view class="td">
+						{{item.receive_time == null ? '未结束' : item.receive_time}}
+					</view>
+					<view :class="[item.status != '未读' ? 'yes' : 'no', 'td']">
+						{{item.status}}
+					</view>
+				</view>
+			</view>
+			<view class="no-data" v-else>暂无数据</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				checked: false,
+				topNav: 0,
+				yidu: 0,
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '#333', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: true, //是否显示返回按钮
+					navTitle: '查看进度' //导航标题
+				},
+				data: [],
+				id: '',
+				name: '',
+				pageNo: 1,
+				total: 0,
+				"totals": 0,
+				      "notRead": 0,
+				      "read": 0
+			}
+		},
+		onReachBottom() {
+			if (this.data.length >= this.total) {
+				return
+			}
+			this.pageNo += 1
+			this.statistic()
+		},
+		onLoad(options) {
+			this.id = options.id
+			this.name = options.name
+			this.statistic()
+			this.init()
+			setTimeout(() => {
+				this.topNav = (this.$refs.uNavbar.navbarHeight) + (this.$refs.uNavbar.statusBarHeight)
+			}, 10)
+		},
+		methods: {
+			onNav(val) {
+				this.yidu = val
+				this.pageNo = 1
+				this.statistic()
+			},
+			checkboxChange: function(e) {
+				var items = this.data,
+					values = e.detail.value;
+				for (var i = 0, lenI = items.length; i < lenI; ++i) {
+					const item = items[i]
+					if (values.includes(item.value)) {
+						this.$set(item, 'checked', true)
+					} else {
+						this.$set(item, 'checked', false)
+					}
+				}
+			},
+			async statistic() {
+				// 
+				let res = await this.$u.post('boman-web-core/p/cs/queryList', {
+					 "table": "boman_message_receive",
+					    "pageNo": this.pageNo,
+					    "isUi": false,
+					    "pageSize": 20,
+					    "orderBy": "status desc",
+					    "fixedData": {
+					        "condition": {
+					            "visible": "Y",
+					            "message_id": this.id,
+					            "status": this.yidu == 0 ? '' : this.yidu == 1 ? 'Y' : 'N',
+					            "is_del":"N"
+					        }
+					    }
+				})
+				if (res.data && res.data.rows) {
+					
+					if (this.pageNo == 1) {
+						this.data = res.data.rows
+						this.total = res.data.total
+					} else {
+						this.data = this.data.concat(res.data.rows)
+					}
+				}
+			},
+			async init() {
+				// 
+				let res = await this.$u.get('boman-web-core/messageReceive/recieve/statistic/'+ this.id)
+				if (res.code == 200) {
+					
+					this.totals =  res.data.total
+					this.notRead =  res.data.notRead
+					this.read =  res.data.read
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.collector {
+		width: 100%;
+		height: 100%;
+		background: #fff;
+		
+		.topNav{
+			display: flex;
+			align-items: center;
+			background: #FFFFFF;
+			height: 90rpx;
+			box-shadow: 0px 14rpx 10rpx 0px rgba(218, 218, 218, 0.35);
+			position: sticky;
+			width: 100%;
+			left: 0;
+			z-index: 9;
+			.item{
+				flex: 1;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				.text{
+					font-size: 26rpx;
+					color: #191919;
+					font-weight: 600;
+				}
+				.active{
+					position: relative;
+					&::after{
+						content: '';
+						position: absolute;
+						width: 28rpx;
+						height: 6rpx;
+						background: #009FE8;
+						border-radius: 6rpx;
+						bottom: -14rpx;
+						left: 50%;
+						transform: translate(-50%,0);
+					}
+				}
+			}
+		}
+	
+		/deep/ .u-navbar-inner {
+			box-shadow: none;
+		}
+
+		.title {
+			height: 56rpx;
+			background: #FFFFFF;
+			line-height: 56rpx;
+			font-size: 24rpx;
+			color: #343434;
+			padding-left: 32rpx;
+			margin-top: 30rpx;
+			text {
+				color: #FF3131;
+				margin: 0 6rpx;
+				&:nth-child(1) {
+					color: #009FE8;
+				}
+				&:nth-child(2) {
+					color: #54BA10;
+				}
+			}
+		}
+
+		.btns {
+			position: fixed;
+			bottom: 0;
+			height: 84rpx;
+			display: flex;
+			width: 100%;
+			border-top: 1px solid #E5E5E5;
+			/deep/ .left {
+				width: 190rpx;
+				background: #FFFFFF;
+				text-align: center;
+				font-size: 28rpx;
+				font-weight: 500;
+				color: #343434;
+				line-height: 84rpx;
+				uni-checkbox {
+					margin-right: 20rpx;
+				}
+			}
+			.right {
+				flex: 1;
+				background: #009FE8;
+				color: #fff;
+				text-align: center;
+				line-height: 84rpx;
+			}
+		}
+
+		.table {
+			.tr {
+				display: flex;
+
+				.th,
+				.td {
+					flex: 1;
+					text-align: center;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					max-width: 20%;
+				}
+
+				.td {
+					padding: 20rpx 0;
+					font-size: 20rpx;
+					color: #333333;
+					border-bottom: 1px solid #E5E5E5;
+				}
+				.yes {
+					color: #54BA10;
+				}
+				.no {
+					color: #FF0000;
+				}
+			}
+
+			.thead {
+				padding: 33rpx 0;
+				font-size: 24rpx;
+				font-weight: bold;
+				color: #333333;
+			}
+		}
+		/deep/ .check-td,
+		.check-th {
+			max-width: 8%;
+		
+			.uni-checkbox-input {
+				margin: 0 auto;
+				width: 0rpx;
+				height: 0rpx;
+				padding: 12rpx;
+		
+				&.uni-checkbox-input-checked {
+					background-color: #009FE8;
+					border: 1px solid #009FE8;
+				}
+		
+				&.uni-checkbox-input-checked:before {
+					font-size: 20rpx;
+				}
+			}
+		}
+	
+	}
+</style>

+ 576 - 0
bureau-of-education/pages/tabbar/addressee/index.vue

@@ -0,0 +1,576 @@
+<template>
+	<view class="addressee">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle" :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="topNav" :style="{top: topNav + 'px'}">
+			<view class="item">
+				<view class="text" :class="yidu == 0?'active':''" @click="onNav(0)">未读收文</view>
+			</view>
+			<view class="item">
+				<view class="text" :class="yidu == 1?'active':''"  @click="onNav(1)">已读收文</view>
+			</view>
+		</view>
+		<view class="searchBox">
+			<view class="inputBox">
+				<u-input class="input" v-model="searchVal" type="text" height="70" placeholder="请输入标题" placeholderStyle="{'color:#AAAAAA'}" />
+				<view class="btn" @click="getQueryList()">查询</view>
+			</view>
+			<view class="timeBox">
+				<image class="r" src="/static/img/icon_xzrq.png" mode=""></image>
+				<view class="text" @click="onShowTime()">{{message_time || '选择日期'}}</view>
+				<image class="d" src="/static/img/icon_xzrq_xl.png" mode=""></image>
+				<view class="yidu" @click="allDu(1)" v-if="yidu == 0 && data.length">
+					<image class="yd" src="/static/img/icon_yjyd.png" mode=""></image>
+					<view class="tt">全部已读</view>
+				</view>
+				<view class="shanchu" @click="allDu(2)" v-if="yidu == 1 && data.length">
+					<image class="yd" src="/static/img/icon_plsc.png" mode=""></image>
+					<view class="tt">全部删除</view>
+				</view>
+			</view>
+		</view>
+		<view class="contentMain" v-if="data.length">
+			
+			<view  class="u-swipe-action" v-for="(item, index) in data" :key="index" @click.stop="jump(item)">
+				<!-- <view class="checkbox" v-if="">
+					<u-checkbox class="check" v-model="item.checked" active-color="#009FE8" size="40"></u-checkbox>
+				</view> -->
+				<view class="check" v-if="allduCk || allduDel">
+					<image v-if="!item.checked"  class="normal" src="../../../static/img/icon_qx_normal.png"></image>
+					<image v-else class="selected"  src="../../../static/img/icon_qx_selected.png"></image>
+				</view>
+				<view class="item" >
+					<view class="title">{{item.message_title}}</view>
+					<view class="userInfo">
+						<view class="user">
+							<!-- <view class="name">来文机关:潜山市教育局</view> -->
+							<view class="name">拟稿人:{{item.send_user_name}}</view>
+							<view class="name">收文日期:{{item.send_message_time}}</view>
+							<view class="name">流程结束日期:{{item.finish_time == null?'未结束':item.finish_time}}</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="no-data" v-else>暂无数据</view>
+		<view style="height: 130rpx;" v-if="allduCk"></view>
+		<view class="bottomBtn" v-if="allduCk && yidu == 0">
+			<view class="all" @click="selectedAll">
+				<!-- <u-checkbox class="check"  active-color="#009FE8" size="40"></u-checkbox> -->
+				<image v-if="!isSelected"  class="normal" src="../../../static/img/icon_qx_normal.png"></image>
+				<image v-else class="selected"  src="../../../static/img/icon_qx_selected.png"></image>
+				<view class="text">全选</view>
+			</view>
+			<view class="btn" @click="yiduUpdate">全部已读</view>
+		</view>
+		<view class="bottomBtn allduDel" v-if="allduDel && yidu == 1">
+			<view class="all" @click="selectedAll">
+				<!-- <u-checkbox class="check"  active-color="#009FE8" size="40"></u-checkbox> -->
+				<image v-if="!isSelected"  class="normal" src="../../../static/img/icon_qx_normal.png"></image>
+				<image v-else class="selected"  src="../../../static/img/icon_qx_selected.png"></image>
+				<view class="text">全选</view>
+			</view>
+			<view class="btn" @click="allDel">全部删除</view>
+		</view>
+		
+		<!-- 时间 -->
+		<u-picker mode="time" v-model="showTime" :params="params" @confirm="getTime"></u-picker>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav:{
+					backgroundColor:'#fff',  //背景色
+					color:'#333',  //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: false, //是否显示返回按钮
+					navTitle:'收文' //导航标题
+				},
+				searchVal: '',
+				topNav: 0,
+				allduCk: false,
+				options: [
+					{
+						text: '归档',
+						style: {
+							backgroundColor: '#00B034'
+						}
+					}
+				],
+				pageNo: 1,
+				csQueryListData: [],
+				showTime: false,
+				params: {
+					year: true,
+					month: true,
+					day: true
+				},
+				message_time: '',
+				yidu: 0,
+				allduDel: false,
+				userInfo: {},
+				pageNo: 1,
+				total: 0,
+				data: [],
+				isSelected: false
+			}
+		},
+		onReachBottom() {
+			console.log(2313);
+			if (this.data.length >= this.total) {
+				return
+			}
+			this.pageNo += 1
+			this.getQueryList()
+		},
+		onShow(opt) {
+			console.log(opt);
+			this.pageNo = 1
+			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
+			if (uni.getStorageSync('addresseeY') == 1) {
+				this.yidu = 1
+				this.getQueryList()
+			} else {
+				this.yidu = 0
+				this.getQueryList()
+			}
+			setTimeout(() => {
+				this.topNav = (this.$refs.uNavbar.navbarHeight) + (this.$refs.uNavbar.statusBarHeight)
+			}, 10)
+			// this.getMessageReceive()
+		},
+		methods:{
+			selectedAll() {
+				this.isSelected = !this.isSelected
+				this.data.forEach(item => {
+					item.checked = this.isSelected
+				})
+			},
+			async getQueryList() {
+				let res = await this.$u.post(`boman-web-core/p/cs/queryList`, {
+					"table": "boman_message_receive",
+					    "pageNo": this.pageNo,
+					    "isUi": false,
+					    "pageSize": 10,
+					    "orderBy": "create_time desc",
+					    "fixedData": {
+					        "condition": {
+					            "visible": "Y",
+											"message_title": this.searchVal,
+											"receive_user_id": this.userInfo.id,
+					            "status": this.yidu == 0 ? "N" : 'Y',
+					            "create_time": this.message_time,
+					            "is_del":"N"
+					        }
+					    }
+				})
+				if (res.data && res.data.rows) {
+					res.data.rows = res.data.rows.map(item => {
+						return Object.assign({}, item, {
+							checked: false
+						})
+					})
+					if (this.pageNo == 1) {
+						this.data = res.data.rows
+					} else {
+						this.data = this.data.concat(res.data.rows)
+					}
+					this.total = res.data.total
+				}
+			},
+			// getTime(e) {
+			// 	// console.log(e);
+			// 	this.message_time = `${e.year}-${e.month}-${e.day}`
+			// },
+			click(index, index1) {
+				if(index1 == 1) {
+					this.list.splice(index, 1);
+					this.$u.toast(`删除了第${index}个cell`);
+				} else {
+					this.list[index].show = false;
+					this.$u.toast(`收藏成功`);
+				}
+			},
+			// 如果打开一个的时候,不需要关闭其他,则无需实现本方法
+			open(index) {
+				// 先将正在被操作的swipeAction标记为打开状态,否则由于props的特性限制,
+				// 原本为'false',再次设置为'false'会无效
+				this.list[index].show = true;
+				this.list.map((val, idx) => {
+					if(index != idx) this.list[idx].show = false;
+				})
+			},
+			onNav(val) {
+				this.yidu = val
+				this.pageNo = 1
+				this.getQueryList()
+			},
+			onShowTime() {
+				this.showTime = !this.showTime
+			},
+			getTime(e) {
+				this.message_time = `${e.year}-${e.month}-${e.day}`
+				this.pageNo = 1
+				this.getQueryList()
+			},
+			allDu(val) {
+				if (val == 1) {
+					this.allduCk = !this.allduCk
+				} else {
+					this.allduDel = !this.allduDel
+				}
+			},
+			async getMessageReceive () {
+				let that = this
+				let data = {
+					"table": "boman_message_receive",
+					"pageNo": that.pageNo,
+					"isUi": false,
+					"pageSize": 10,
+					"orderBy": "create_time desc",
+					"fixedData": {
+						"condition": {
+							"visible": "Y",
+							"receive_user_id": '',
+							"status":"N",
+							"create_time":"2021-01-01",
+							"is_del":"N"
+						}
+					},
+					"finish_time": null,
+					"id": ''
+				}
+				
+				let res = await that.$u.post(`boman-web-core/p/cs/queryList`,data)
+				that.csQueryListData = res.data.rows
+			},
+			async yiduUpdate () {
+				let that = this
+				let condition = []
+				condition = this.data.filter(item => item.checked)
+				if (!condition.length) {
+					uni.showToast({
+						title: '未选择已读文章',
+						icon: 'none'
+					})
+				}
+				let data = {
+					"tableName": "boman_message_receive",
+					    "condition": {
+					        "id": condition.map(item => item.id)
+					    },
+					    "commitData": {
+					        "status":"Y"
+					    }
+				}
+				
+				let res = await that.$u.post(`boman-web-core/p/cs/update`,data)
+				// that.csQueryListData = res.data.tableHeadList
+				if (res.code == 200) {
+					uni.showToast({
+						title:'已读成功'
+					})
+					this.allduDel = false
+					this.getQueryList()
+				} else {
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					})
+				}
+			},
+			async allDel () {
+				let that = this
+				let condition = []
+				condition = this.data.filter(item => item.checked)
+				if (condition.length == 0) {
+					uni.showToast({
+						icon: 'none',
+						title: '请至少选择一条数据'
+					})
+					return false
+				}
+				let data = {
+					"tableName": "boman_message_receive",
+					    "condition": {
+					        "id": condition.map(item => item.id)
+					    },
+					    "commitData": {
+					        "is_del":"Y"
+					    }
+				}
+				
+				let res = await that.$u.post(`boman-web-core/p/cs/update`,data)
+				// that.csQueryListData = res.data.tableHeadList
+				if (res.code == 200) {
+					uni.showToast({
+						title:'删除成功'
+					})
+					this.allduDel = false
+					this.getQueryList()
+				} else {
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					})
+				}
+			},
+			async jump(item = {}) {
+				if (this.allduCk || this.allduDel) {
+					item.checked = !item.checked
+					return
+				}
+				// if (this.yidu == 0) {
+				// 	let data = {
+				// 		"tableName": "boman_message_receive",
+				// 		    "condition": {
+				// 		        "id": item.id
+				// 		    },
+				// 		    "commitData": {
+				// 		        "status":"Y"
+				// 		    }
+				// 	}
+					
+				// 	let res = await this.$u.post(`boman-web-core/p/cs/update`,data)
+				// 	// that.csQueryListData = res.data.tableHeadList
+				// 	uni.navigateTo({
+				// 		url: '/pages/indexView/addressee/details?id=' + item.message_id
+				// 	})
+				// } else {
+				// 	uni.navigateTo({
+				// 		url: '/pages/indexView/addressee/details?id=' + item.message_id
+				// 	})
+				// }
+				uni.navigateTo({
+					url: '/pages/indexView/addressee/details?id=' + item.message_id + '&objId=' + item.id
+				})
+			}
+		}
+	}
+</script>
+<style>
+	page{
+		background: #FFFFFF;
+	}
+</style>
+<style lang="scss" scoped>
+.topNav{
+	display: flex;
+	align-items: center;
+	background: #FFFFFF;
+	height: 90rpx;
+	box-shadow: 0px 14rpx 10rpx 0px rgba(218, 218, 218, 0.35);
+	position: sticky;
+	width: 100%;
+	left: 0;
+	z-index: 9;
+	.item{
+		flex: 1;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		.text{
+			font-size: 26rpx;
+			color: #191919;
+			font-weight: 600;
+		}
+		.active{
+			position: relative;
+			&::after{
+				content: '';
+				position: absolute;
+				width: 28rpx;
+				height: 6rpx;
+				background: #009FE8;
+				border-radius: 6rpx;
+				bottom: -14rpx;
+				left: 50%;
+				transform: translate(-50%,0);
+			}
+		}
+	}
+}
+.searchBox{
+	padding: 30rpx;
+	.inputBox{
+		display: flex;
+		align-items: center;
+		.input{
+			flex: 1;
+			width: 100%;
+			margin-right: 30rpx;
+			background: #EDEDED;
+			border-radius: 40rpx;
+			padding: 0 30rpx !important;
+		}
+		.btn{
+			background: #009FE8;
+			color: #FFFFFF;
+			font-size: 26rpx;
+			height: 60rpx;
+			line-height: 60rpx;
+			padding: 0 30rpx;
+			text-align: center;
+			border-radius: 40rpx;
+		}
+	}
+	
+}
+.timeBox{
+	padding: 30rpx 0 20rpx 0;
+	display: flex;
+	align-items: center;
+	.r{
+		width: 30rpx;
+		height: 33rpx;
+	}
+	.text{
+		font-size: 26rpx;
+		color: #343434;
+		margin: 0 14rpx;
+	}
+	.d{
+		width: 20rpx;
+		height: 20rpx;
+	}
+	.yidu{
+		margin-left: auto;
+		display: flex;
+		align-items: center;
+		.yd{
+			width: 26rpx;
+			height: 26rpx;
+		}
+		.tt{
+			font-size: 24rpx;
+			color: #54BA10;
+			margin-left: 10rpx;
+		}
+	}
+	.shanchu{
+		margin-left: auto;
+		display: flex;
+		align-items: center;
+		.yd{
+			width: 30rpx;
+			height: 35rpx;
+		}
+		.tt{
+			font-size: 24rpx;
+			color: #FF3131;
+			margin-left: 10rpx;
+		}
+	}
+}
+.contentMain{
+	.u-swipe-action {
+		margin-bottom: 30rpx;
+		display: flex;
+		align-items: center;
+		.checkbox{
+			flex: 0 0 40rpx;
+			width: 40rpx;
+			margin-left: 30rpx;
+			.check{
+				width: 40rpx;
+			}
+		}
+		.check {
+			margin-left: 20rpx;
+			.normal,
+			.selected {
+				width: 30rpx;
+				height: 30rpx;
+			}
+		}
+	}
+	.item{
+		flex: 1;
+		padding: 0 30rpx;
+		border-bottom: 1px solid #DADADA;
+		.title{
+			font-size: 28rpx;
+			font-weight: 700;
+			color: #343434;
+			white-space: break-word;
+			word-break:break-all;
+		}
+		.userInfo{
+			display: flex;
+			align-items: flex-end;
+			margin-top: 30rpx;
+			
+			padding-bottom: 30rpx;
+			.user{
+				flex: 1;
+				color: #666;
+				font-size: 24rpx;
+				.name{
+					margin-bottom: 10rpx;
+				}
+			}
+			.status{
+				color: #AAAAAA;
+				font-size: 26rpx;
+				margin-bottom: 4rpx;
+			}
+		}
+	}
+}
+.bottomBtn{
+	display: flex;
+	align-items: center;
+	height: 100rpx;
+	width: 100%;
+	left: 0;
+	z-index: 9;
+	bottom: var(--window-bottom);
+	position: fixed;
+	border-top: solid 1px #E5E5E5;
+	.all{
+		display: flex;
+		align-items: center;
+		flex: 0 0 200rpx;
+		background: #FFFFFF;
+		justify-content: center;
+		line-height: 100rpx;
+		.normal,
+		.selected {
+			width: 30rpx;
+			height: 30rpx;
+		}
+		.check{
+			width: 40rpx;
+			height: 40rpx;
+		}
+		.text{
+			font-size: 28rpx;
+			color: #343434;
+			margin-left: 20rpx;
+		}
+	}
+	.btn{
+		background: #009FE8;
+		color: #FFFFFF;
+		font-size: 28rpx;
+		line-height: 100rpx;
+		text-align: center;
+		flex: 1;
+	}
+}
+
+.allduDel{
+	.btn{
+		background: #FF3131;
+		color: #FFFFFF;
+		font-size: 28rpx;
+		line-height: 100rpx;
+		text-align: center;
+		flex: 1;
+	}
+}
+</style>

+ 347 - 0
bureau-of-education/pages/tabbar/center/index.vue

@@ -0,0 +1,347 @@
+<template>
+	<view class="center">
+		<image class="pic_hp_tbbg" src="/static/img/pic_mine_tbbg.png" mode=""></image>
+		<view class="center_box">
+			<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+			 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color"
+			 :background="setNav"></u-navbar>
+			<view class="userInfo">
+				<view class="img">
+					<image src="../../../static/img/icon_hp_hp.png"></image>
+				</view>
+				<view class="info" style="flex: 1;">
+					<view class="info-one">
+						<view class="name">{{userInfo.userName}}</view>
+						<view class="position">{{userInfo.nickName}}</view>
+					</view>
+					<!-- <view class="info-two">{{userInfo.dept && userInfo.dept.deptName}}</view> -->
+					<view class="info-three" style="padding-left: 0;display: flex;align-items: center;" v-if="userInfo.phonenumber">
+						<image style="width: 20rpx;height: 28rpx;" src="/static/img/icon_mine_tel.png" mode=""></image>
+						<view class="" style="margin-left: 20rpx;">{{userInfo.phonenumber}}</view>
+					</view>
+				</view>
+				<view class="changePassword" @click="jumpPwd">
+					<view>修改密码</view>
+					<image src="../../../static/img/icon_mine_white_enter.png"></image>
+				</view>
+			</view>
+			<view class="ul">
+				<view class="li" @click="addCollection" v-if="roles.indexOf('user-admin') != -1">
+					<view class="icon">
+						<image src="../../../static/img/icon_mine_csw.png"></image>
+					</view>
+					<view class="middle">催收文</view>
+					<view class="jump">
+						<image src="../../../static/img/icon_black_enter.png"></image>
+					</view>
+				</view>
+				<view class="li" @click="addSchedule">
+					<view class="icon">
+						<image src="../../../static/img/icon_mine_csw.png"></image>
+					</view>
+					<view class="middle">待办
+					<view class="tips" v-if="num!=0" >
+							<view>{{num}}</view>
+						</view>
+					</view>
+					<view class="jump">
+						<image src="../../../static/img/icon_black_enter.png"></image>
+					</view>
+				</view>
+				<view class="li" @click="addToExamine" v-if="roles.indexOf('user-admin') != -1">
+					<view class="icon">
+						<image src="../../../static/img/icon_mine_sh.png"></image>
+					</view>
+					<view class="middle">审核
+					<view class="tips" v-if="num2!=0">
+							<view>{{num2}}</view>
+						</view>
+					</view>
+					<view class="jump">
+						<image src="../../../static/img/icon_black_enter.png"></image>
+					</view>
+				</view>
+				<view class="li" @click="addFiled" v-if="roles.indexOf('user-admin') != -1">
+					<view class="icon">
+						<image src="../../../static/img/icon_mine_csw.png"></image>
+					</view>
+					<view class="middle">已归档</view>
+					<view class="jump">
+						<image src="../../../static/img/icon_black_enter.png"></image>
+					</view>
+				</view>
+				<view class="li" @click="logout">
+					<view class="icon">
+						<image src="../../../static/img/icon_mine_tcdl.png"></image>
+					</view>
+					<view class="middle">退出登录</view>
+					<view class="jump">
+						<image src="../../../static/img/icon_black_enter.png"></image>
+					</view>
+				</view>
+			</view>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	const infoThree = require('../../../static/img/icon_mine_tel.png')
+	export default {
+		data() {
+			return {
+				setNav: {
+					backgroundColor: '', //背景色
+					color: '#fff', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#ffff',
+					isdisPlayNavTitle: false, //是否显示返回按钮
+					navTitle: '我的' //导航标题
+				},
+				infoThree: {
+					'background': 'url('+ infoThree +') no-repeat',
+					'background-size': '20rpx 28rpx',
+					'background-position': '0 50%'
+				},
+				userInfo: {},
+				num: 0,
+				roles: [],
+				num2: 0,
+			}
+		},
+		onLoad() {
+
+		},
+		onShow() {
+			this.getInfo()
+		},
+		computed: {
+
+		},
+		methods: {
+			async getInfo () {
+				let that = this
+				let res = await that.$u.get('system/user/getInfo')
+				that.userInfo = res.user
+				that.roles = res.roles
+				let res1 = await this.$u.post(`boman-web-core/message/toDoMessage`, {
+						 "pageNo": 1,
+				        "pageSize": 1000000,
+				        "username": that.userInfo.userName
+					})
+					if (res1.data && res1.data.rows) {
+						this.num = res1.data.rows.length
+					} else {
+						this.num = 0
+					}
+				this.backlog()
+			},
+			async backlog () {
+				let res = await this.$u.post(`jflow/p/cs/task/backlog/list`, {
+					page: 1,
+					pageSize: 10,
+					searchType: '0,1',
+					"userId": this.userInfo.id,
+					excuStatus: 0
+				})
+				this.num2 = res.data.records.length
+			},
+			async logout () {
+				let that = this
+				let res = await that.$u.delete('auth/logout')
+				console.log(res)
+				if (res.code == 200) {
+					uni.removeStorageSync('authToken')
+					uni.navigateTo({
+						url: '/pages/tabbar/login/index'
+					})
+				}
+			},
+			addCollection() {
+				uni.navigateTo({
+					url: '/pages/centerView/collection/index'
+				})
+			},
+			addSchedule() {
+				uni.navigateTo({
+					url: '/pages/centerView/schedule/index'
+				})
+			},
+			addToExamine() {
+				uni.navigateTo({
+					url: '/pages/centerView/toExamine/index'
+				})
+			},
+			addFiled() {
+				uni.navigateTo({
+					url: '/pages/centerView/filed/index'
+				})
+			},
+			jumpPwd() {
+				uni.navigateTo({
+					url: '/pages/centerView/changPwd/index'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.center {
+		// background: url(../../../static/img/pic_mine_tbbg.png) no-repeat;
+		// background-size: 100% 416rpx;
+		height: 100%;
+
+		.pic_hp_tbbg {
+			width: 100%;
+			height: 460rpx;
+		}
+		.center_box {
+			position: absolute;
+			top: 0;
+			width: 100%;
+		}
+		.userInfo {
+			display: flex;
+			padding: 50rpx 40rpx 70rpx 40rpx;
+			position: relative;
+			align-items: center;
+			.changePassword {
+				transform: translateY(-50%);
+				color: #fff;
+				font-size: 24rpx;
+				display: flex;
+				align-items: center;
+				right: 34rpx;
+				image {
+					width: 14rpx;
+					height: 26rpx;
+					margin-left: 18rpx;
+				}
+			}
+			.img {
+				width: 128rpx;
+				height: 128rpx;
+				border-radius: 50%;
+				overflow: hidden;
+				margin-right: 36rpx;
+
+				image {
+					width: 100%;
+					height: 100%;
+				}
+			}
+
+			.info {
+				.info-one {
+					display: flex;
+					align-items: center;
+					flex: 1;
+					.name {
+						font-size: 35rpx;
+						font-weight: bold;
+						color: #FFFFFF;
+					}
+
+					.position {
+						// width: 112rpx;
+						padding: 0 20rpx;
+						height: 36rpx;
+						background: #116CB9;
+						border-radius: 18rpx;
+						text-align: center;
+						font-size: 20rpx;
+						color: #FFFFFF;
+						white-space: nowrap;
+						margin-left: 18rpx;
+						line-height: 36rpx;
+					}
+				}
+
+				.info-two {
+					font-size: 22rpx;
+					color: #DFF0FF;
+					margin-top: 18rpx;
+
+				}
+
+				.info-three {
+					font-size: 26rpx;
+					color: #DFF0FF;
+					margin-top: 20rpx;
+					padding-left: 30rpx;
+				}
+			}
+		}
+
+		.ul {
+			.li {
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				padding: 0 35rpx;
+				margin: 0 auto;
+				width: 683rpx;
+				height: 125rpx;
+				background: #FFFFFF;
+				box-shadow: 0px 0px 19rpx 3rpx rgba(216, 215, 215, 0.72);
+				border-radius: 7rpx;
+				margin-top: 28rpx;
+
+				&:first-child {
+					margin-top: 0;
+				}
+
+				.icon {
+					min-width: 48rpx;
+					height: 48rpx;
+
+					image {
+						width: 100%;
+						height: 100%;
+					}
+				}
+
+				.middle {
+					flex: 1;
+					margin-left: 33rpx;
+					font-size: 31rpx;
+					font-weight: 500;
+					color: #343434;
+					position: relative;
+
+					.tips {
+						// width: 32rpx;
+						height: 32rpx;
+						background: #FF3131;
+						padding: 0 10rpx;
+						text-align: center;
+						line-height: 32rpx;
+						color: #fff;
+						position: absolute;
+						top: -4rpx;
+						left: 70rpx;
+						font-size: 20rpx;
+						font-weight: 500;
+						color: #FFFFFF;
+						border-radius: 16rpx;
+						// view {
+						// 	transform: scale(0.7);
+						// }
+					}
+				}
+
+				.jump {
+					min-width: 15rpx;
+					height: 27rpx;
+
+					image {
+						width: 100%;
+						height: 100%;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 356 - 0
bureau-of-education/pages/tabbar/index/index.vue

@@ -0,0 +1,356 @@
+<template>
+	<view class="index">
+		<view class="headTop">
+			<image class="pic_hp_tbbg" src="/static/img/pic_hp_tbbg@2x.png" mode=""></image>
+			<view class="userInfo">
+				<view :style="{height:statusBarHeight+'px'}"></view>
+				<view class="title" :style="{height:statusBarHeight2+'px'}"><text>潜山市教育局在线收发文系统</text></view>
+				<view class="content">
+					<image class="uImg" v-if="userInfo.avatar" :src="userInfo.avatar" mode=""></image>
+					<image class="uImg" v-else src="/static/img/icon_hp_hp.png" mode=""></image>
+					<view class="userText">
+						<view class="nameT"><text class="n">{{userInfo.userName}}</text>您好!</view>
+						<view class="toDay">
+							<text class="j">今天是 </text><text class="d">{{toDay.time}} {{toDay.riqi}}</text> <text class="g">{{toDay.gongzuo}}</text>
+						</view>
+					</view>
+				</view>
+				<view class="listItem">
+					<view class="item" @click="addresseeY(0)">
+						<view class="name">今日收文</view>
+						<view class="num">
+							<view class="n">{{messageReceiveData.todayReceipt}}</view>
+							<view class="t">条</view>
+						</view>
+					</view>
+					<view class="item" @click="addresseeY(0)">
+						<view class="name">未读收文</view>
+						<view class="num">
+							<view class="n">{{messageReceiveData.unread}}</view>
+							<view class="t">条</view>
+						</view>
+					</view>
+					<view class="item" v-if="roles.indexOf('user-admin') != -1" @click="addresseeF()">
+						<view class="name">今日发文</view>
+						<view class="num">
+							<view class="n">{{messageReceiveData.toDaySend}}</view>
+							<view class="t">条</view>
+						</view>
+					</view>
+					<view class="item" @click="addresseeY(1)">
+						<view class="name">已读收文</view>
+						<view class="num">
+							<view class="n">{{messageReceiveData.read}}</view>
+							<view class="t">条</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="gongju">
+			<view class="item" @click="addPost()" v-if="roles.indexOf('user-admin') != -1">
+				<image class="bg" src="/static/img/pic_hp_bgxzfw.png" mode=""></image>
+				<view class="box">
+					<image class="iocn" src="/static/img/icon_hp_xzfw.png" mode=""></image>
+					<view class="text">新增发文</view>
+				</view>
+			</view>
+			<view class="item" @click="addresseeY(0)">
+				<image class="bg" src="/static/img/pic_hp_bgsw.png" mode=""></image>
+				<view class="box">
+					<image class="iocn" src="/static/img/icon_hp_sw.png" mode=""></image>
+					<view class="text">收文</view>
+				</view>
+			</view>
+			<view class="item" @click="archive()" v-if="roles.indexOf('user-admin') != -1">
+				<image class="bg" src="/static/img/pic_hp_bgdgd.png" mode=""></image>
+				<view class="box">
+					<image class="iocn" src="/static/img/icon_hp_dgd.png" mode=""></image>
+					<view class="text">待归档</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav:{
+					backgroundColor:'',  //背景色
+					color:'#fff',  //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#ffff',
+					immersive : true,
+					isdisPlayNavTitle: false, //是否显示返回按钮
+					navTitle:'潜山市教育局在线收发文系统' //导航标题
+				},
+				statusBarHeight: 0,
+				statusBarHeight2: 0,
+				userInfo: {},
+				toDay: {
+					time: this.$u.timeFormat(new Date(), 'yyyy年mm月dd日'),
+					riqi: '星期一',
+					gongzuo: '工作日'
+				},
+				messageReceiveData: {},
+				roles: []
+			}
+		},
+		onLoad() {
+		
+		},
+		onShow ()  {
+			// this.init()
+			this.getByTableName()
+			this.init()
+		},
+		methods:{
+			init () {
+				this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight
+				this.statusBarHeight2 = uni.getSystemInfoSync().platform == 'ios' ? 44 : 48
+				this.getInfo()
+				switch (new Date().getDay()){
+						case 1:
+							this.toDay.riqi = '星期一'
+							this.toDay.gongzuo = '工作日'
+							break;
+						case 2:
+							this.toDay.riqi = '星期二'
+							this.toDay.gongzuo = '工作日'
+							break;
+						case 3:
+							this.toDay.riqi = '星期三'
+							this.toDay.gongzuo = '工作日'
+							break;
+						case 4:
+							this.toDay.riqi = '星期四'
+							this.toDay.gongzuo = '工作日'
+							break;
+						case 5:
+							this.toDay.riqi = '星期五'
+							this.toDay.gongzuo = '工作日'
+							break;
+						case 6:
+							this.toDay.riqi = '星期六'
+							this.toDay.gongzuo = '工作日'
+							break;
+						case 0:
+							this.toDay.riqi = '星期日'
+							this.toDay.gongzuo = '工作日'
+							break;
+						default:
+							this.toDay.riqi = '星期一'
+							this.toDay.gongzuo = '工作日'
+							break;
+					}
+			},
+			async getInfo () {
+				let that = this
+				let res = await that.$u.get('system/user/getInfo')
+				that.userInfo = res.user
+				that.roles = res.roles
+				uni.setStorageSync('userInfo', JSON.stringify(that.userInfo));
+				uni.setStorageSync('roles', JSON.stringify(res.roles));
+				this.getMessageReceive()
+			},
+			async getByTableName () {
+				let res = await this.$u.get('boman-web-core/p/cs/table/getByTableName/boman_message')
+				uni.setStorageSync('byTableInfo', JSON.stringify({
+					id: res.data.id,
+					tableName: res.data.tableName
+				}));
+			},
+			async getMessageReceive () {
+				let that = this
+				let res = await that.$u.get(`boman-web-core/messageReceive/index/${that.userInfo.id}`)
+				that.messageReceiveData = res.data
+			},
+			archive() {
+				uni.navigateTo({
+					url: '/pages/indexView/archive/index'
+				})
+			},
+			addressee() {
+				uni.navigateTo({
+					url: '/pages/indexView/addressee/index'
+				})
+			},
+			addresseeF() {
+				uni.switchTab({
+					url: '/pages/tabbar/post/index'
+				})
+			},
+			addresseeY(type) {
+				uni.setStorage({
+					key: 'addresseeY',
+					data: type,
+					success: async function() {
+						uni.switchTab({
+							url: '/pages/tabbar/addressee/index'
+						})
+					}
+				})
+				
+			},
+			addPost() {
+				uni.navigateTo({
+					url: '/pages/indexView/addPost/index'
+				})
+			},
+			postList() {
+				uni.navigateTo({
+					url: '/pages/indexView/postList/index'
+				})
+			},
+			
+			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.headTop{
+	position: relative;
+	.pic_hp_tbbg{
+		width: 100%;
+		height: 680rpx;
+	}
+	
+	.userInfo{
+		position: absolute;
+		top: 0;
+		z-index: 1;
+		left: 0;
+		width: 100%;
+		.title{
+			color: #FFFFFF;
+			font-size: 31rpx;
+			font-weight: 700;
+			text-align: center;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			
+		}
+		.content{
+			padding: 20rpx 30rpx;
+			display: flex;
+			.uImg{
+				width: 70rpx;
+				height: 70rpx;
+				border-radius: 100%;
+			}
+			.userText{
+				flex: 1;
+				margin-left: 30rpx;
+				.nameT{
+					font-size: 28rpx;
+					color: #FFFFFF;
+					.n{
+						font-size: 36rpx;
+						font-weight: 700;
+						padding-right: 30rpx;
+					}
+				}
+				.toDay{
+					display: flex;
+					align-items: center;
+					font-size: 28rpx;
+					color: #FFFFFF;
+					margin-top: 30rpx;
+					.j{
+						opacity: 0.8;
+					}
+					.d{
+						font-weight: 700;
+						margin: 0 20rpx;
+					}
+					.g{
+						font-size: 22rpx;
+						background: #116cb9;
+						width: 109rpx;
+						height: 44rpx;
+						text-align: center;
+						line-height: 44rpx;
+						border-radius: 10rpx 24rpx 24rpx 24rpx;
+						box-shadow: 0px 0px 4px 0px #116cb9;
+					}
+				}
+			}
+		}
+		.listItem{
+			display: flex;
+			align-items: center;
+			padding: 30rpx;
+			flex-wrap: wrap;
+			.item{
+				flex: 0 0 50%;
+				margin-bottom: 30rpx;
+				.name{
+					color: #FFFFFF;
+					font-size: 28rpx;
+					text-align: center;
+				}
+				.num{
+					display: flex;
+					align-items: flex-end;
+					color: #FFFFFF;
+					justify-content: center;
+					margin-top: 20rpx;
+					.n{
+						font-size: 49rpx;
+						font-weight: 700;
+					}
+					.t{
+						font-size: 25rpx;
+						margin-bottom: 10rpx;
+						margin-left: 10rpx;
+					}
+				}
+			}
+		}
+	}
+}
+.gongju{
+	display: flex;
+	align-items: center;
+	margin: 43rpx 30rpx;
+	justify-content: space-between;
+	.item{
+		width: 208rpx;
+		height: 208rpx;
+		position: relative;
+		padding: 0 30rpx;
+		.bg{
+			width: 208rpx;
+			height: 208rpx;
+			position: absolute;
+			top: 0;
+			left: 0;
+		}
+		.box{
+			position: absolute;
+			width: 208rpx;
+			height: 208rpx;
+			top: 50%;
+			left: 50%;
+			margin-top: 22rpx;
+			transform: translate(-50%,-50%);
+			.iocn{
+				width: 117rpx;
+				height: 119rpx;
+				margin: auto;
+			}
+			.text{
+				color: #FFFFFF;
+				font-size: 31rpx;
+				font-weight: 700;
+				text-align: center;
+			}
+		}
+	}
+}
+</style>

+ 303 - 0
bureau-of-education/pages/tabbar/login/index.vue

@@ -0,0 +1,303 @@
+<template>
+	<view class="login">
+		<image class="pic_dlbg" src="/static/img/pic_dlbg.png" mode=""></image>
+		
+		<view class="content1">
+			<image class="pic_dl_hum" src="/static/img/pic_dl_hum.png" mode=""></image>
+			<view class="title">潜山市教育局在线收发文系统</view>
+			<!-- #ifdef MP-WEIXIN -->
+			<view class="formContent">
+				<view class="list">
+					<view class="lable">账号</view>
+					<view class="input">
+						<u-input class="uInput" v-model="userData.username" type="text" placeholder="请输入您的账号" :border="false" />
+					</view>
+				</view>
+				<view class="list">
+					<view class="lable">密码</view>
+					<view class="input">
+						<u-input class="uInput" v-model="userData.password" type="password" placeholder="请输入您的密码" :border="false" />
+					</view>
+				</view>
+				<view class="list">
+					<xlSliderVerify @success="verifySuccess"></xlSliderVerify>
+				</view>
+				<view class="list">
+					<view class="btn" @click="postLogin">登录</view>
+				</view>
+			</view>
+			<!-- #endif -->
+			<!-- #ifndef MP-WEIXIN -->
+			<view class="formContent">
+				<view class="list">
+					<view class="lable">账号</view>
+					<view class="input">
+						<u-input class="uInput" v-model="userDataAPP.username" type="text" placeholder="请输入您的账号" :border="false" />
+					</view>
+				</view>
+				<view class="list">
+					<view class="lable">密码</view>
+					<view class="input">
+						<u-input class="uInput" v-model="userDataAPP.password" type="password" placeholder="请输入您的密码" :border="false" />
+					</view>
+				</view>
+				<view class="list">
+					<view class="lable">验证码</view>
+					<view class="input">
+						<u-input class="uInput" v-model="userDataAPP.code" type="text" placeholder="请输入验证码" :border="false" />
+						<image :src="appcode" mode="" class="appcode" @click="appCode()"></image>
+					</view>
+				</view>
+				<view class="list">
+					<xlSliderVerify @success="verifySuccess"></xlSliderVerify>
+				</view>
+				<view class="list">
+					<view class="btn" @click="postLoginAPP">登录</view>
+				</view>
+			</view>
+			<!-- #endif -->
+		</view>
+	</view>
+</template>
+
+<script>
+	import xlSliderVerify from '@/components/xl-slider-verify/xl-slider-verify.vue'
+	export default {
+		data() {
+			return {
+				userData: {
+					username: '',
+					password: '',
+					code: ''
+				},
+				userDataAPP: {
+					username: '',
+					password: '',
+					code: ''
+				},
+				isLogin: false,
+				mainSwitch: false,
+				tmpIds: [],
+				appcode: '',
+				appuuid: ''
+			}
+		},
+		components:{
+			xlSliderVerify
+		},
+		onLoad() {
+			let that = this
+			// #ifdef MP-WEIXIN
+			wx.getSetting({
+			  withSubscriptions: true,
+			  success (res) {
+					if (res.subscriptionsSetting.mainSwitch) {
+						if (res.subscriptionsSetting.itemSettings != null)  {
+							that.mainSwitch = true
+							for (var key in res.subscriptionsSetting.itemSettings) {
+								that.tmpIds.push(key)
+							}
+						}
+					}
+			  }
+			})
+			
+			// #endif
+			// #ifndef MP-WEIXIN
+				this.appCode()
+			// #endif
+		},
+		onShow() {
+			let that = this
+			// #ifdef MP-WEIXIN
+			uni.login({
+				provider: 'weixin',
+				success: function(weixinRes) {
+					that.userData.code = weixinRes.code
+					console.log(weixinRes);
+				}
+			});
+			// #endif
+		},
+		methods:{
+			async postLogin () {
+				if (!this.isLogin){
+					uni.showToast({
+						title: '请滑动验证条',
+						icon: 'none'
+					})
+					return
+				}
+				let that = this
+				let data = {
+					username: that.userData.username,
+					password: that.userData.password,
+					code: that.userData.code,
+					logintype: 'w'
+				}
+				let res = await that.$u.post('auth/login',data)
+				if (res.code == 500) {
+					uni.login({
+						provider: 'weixin',
+						success: function(weixinRes) {
+							that.userData.code = weixinRes.code
+							console.log(weixinRes);
+						}
+					});
+					return false
+				}
+				console.log(res);
+				uni.setStorage({
+					key: 'authToken',
+					data: res.data.access_token,
+					success: async function() {
+						uni.showToast({
+							icon: 'none',
+							title: '登陆成功'
+						})
+						// #ifdef MP-WEIXIN
+						let res1 = await that.$u.get(`boman-wechat/wechat/p/c/tmpIds`, {})
+						let dataList = []
+						res1.data.forEach((item) => {
+							if (that.tmpIds.indexOf(item) == -1) {
+								dataList.push(item)
+							}
+						})
+						if (that.mainSwitch && !dataList.length) {
+							setTimeout( () => {
+								uni.switchTab({
+									url: '/pages/tabbar/index/index'
+								})
+							},2000)
+						} else {
+							wx.showModal({
+							  title: '提示',
+							  content: '订阅授权通知',
+							  success : function (res) {
+							    if (res.confirm) {
+							      wx.requestSubscribeMessage({
+							      	 tmplIds: dataList,
+							      	 success (resMessage) {
+							      	  uni.switchTab({
+							      		url: '/pages/tabbar/index/index'
+							      	  })
+							      	}
+							      })
+							    } else if (res.cancel) {
+							      console.log('用户点击取消')
+								  uni.switchTab({
+										url: '/pages/tabbar/index/index'
+								  })
+							    }
+							  }
+							})
+						}
+						// #endif
+						
+					}
+				});
+			},
+			verifySuccess(e) {
+				this.isLogin = true
+			},
+			async appCode() {
+				let that = this
+				let res = await that.$u.get('code')
+				that.appcode = 'data:image/gif;base64,' + res.img
+				that.appuuid = res.uuid
+			},
+			async postLoginAPP () {
+				if (!this.isLogin){
+					uni.showToast({
+						title: '请滑动验证条',
+						icon: 'none'
+					})
+					return
+				}
+				let that = this
+				let data = {
+					username: that.userDataAPP.username,
+					password: that.userDataAPP.password,
+					code: that.userDataAPP.code,
+					uuid: that.appuuid,
+				}
+				let res = await that.$u.post('auth/login',data)
+				uni.setStorage({
+					key: 'authToken',
+					data: res.data.access_token,
+					success: async function() {
+						uni.showToast({
+							icon: 'none',
+							title: '登陆成功'
+						})
+						setTimeout( () => {
+							uni.switchTab({
+								url: '/pages/tabbar/index/index'
+							})
+						},2000)
+					},
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.pic_dlbg{
+	width: 100%;
+	min-height: 100vh;
+}
+.content1{
+	position: absolute;
+	width: 100%;
+	top: 0;
+	left: 0;
+	.pic_dl_hum{
+		width: 510rpx;
+		height: 356rpx;
+		margin: 130rpx auto auto auto;
+	}
+	.title{
+		font-size: 38rpx;
+		color: #009FE8;
+		font-weight: 700;
+		text-align: center;
+		margin-top: 16rpx;
+	}
+	.formContent{
+		padding: 30rpx 78rpx;
+		margin-top: 30rpx;
+		.list{
+			margin-bottom: 60rpx;
+			position: relative;
+			.lable{
+				font-size: 28rpx;
+				color: #343434;
+			}
+			.input{
+				border-bottom: solid 2rpx #009FE8;
+				padding: 10rpx 0;
+				display: flex;
+				align-items: center;
+				.uInput{
+					width: 100%;
+					flex: 1;
+				}
+				.appcode{
+					width: 200rpx;
+					height: 60rpx;
+				}
+			}
+			.btn {
+				width: 100%;
+				height: 90rpx;
+				background: #009FE8;
+				border-radius: 6rpx;
+				color: #fff;
+				line-height: 90rpx;
+				text-align: center;
+			}
+		}
+	}
+}
+</style>

+ 555 - 0
bureau-of-education/pages/tabbar/post/index.vue

@@ -0,0 +1,555 @@
+<template>
+	<view class="archive" v-if="roles.indexOf('user-admin') != -1">
+		<u-navbar ref="uNavbar" :border-bottom="false" :back-icon-color="setNav.backColor" :is-back="setNav.isdisPlayNavTitle"
+		 :title-size="setNav.size" :title-bold="setNav.bold" :title="setNav.navTitle" :title-color="setNav.color" :background="setNav"></u-navbar>
+		<view class="topNav" :style="{top: topNav + 'px'}">
+			<view class="item">
+				<view class="text" :class="yidu == 1?'active':''" @click="onNav('1')">未完成发文</view>
+			</view>
+			<view class="item">
+				<view class="text" :class="yidu == 2?'active':''" @click="onNav('2')">已完成发文</view>
+			</view>
+			<view class="item">
+				<view class="text" :class="yidu == 3?'active':''" @click="onNav('3')">已撤回发文</view>
+			</view>
+		</view>
+		<view class="searchBox">
+			<view class="inputBox">
+				<u-input class="input" v-model="searchVal" type="text" height="70" placeholder="请输入标题" placeholderStyle="{'color:#AAAAAA'}" />
+				<view class="btn">查询</view>
+			</view>
+			<view class="toolBox">
+				<view class="timeBox" @click="showTime = true">
+					<image class="r" src="/static/img/icon_xzrq.png" mode=""></image>
+					<view class="text">{{message_time || '选择日期'}}</view>
+					<image class="d" src="/static/img/icon_xzrq_xl.png" mode=""></image>
+				</view>
+				<view v-if="yidu != 1" class="batchDelete" @click="allduDel = !allduDel">
+					<image src="../../../static/img/icon_plsc.png"></image>
+					<view class="text">批量删除</view>
+				</view>
+			</view>
+		</view>
+		<view class="contentMain" v-if="data.length">
+			<u-swipe-action v-if="yidu == 1" :show="item.show" :index="index" v-for="(item, index) in data" :key="item.id"
+			 @click="click" @open="open" :options="options" class="u-swipe-action " style="width: 100%;">
+				<view class="item">
+					<view class="title" @click.stop="jump(item)">{{item.message_title}}</view>
+					<view class="userInfo">
+						<view class="user">
+							<view class="name">拟稿人:{{item.send_user_name}}</view>
+							<view class="name">发文日期:{{item.message_time}}</view>
+							<!-- <view class="name">流程结束日期:2021-04-28</view> -->
+						</view>
+						<view v-if="item.status == '审核中'" class="status" @click="approvalProcess(item)">发文审核中</view>
+						<view v-else class="statusBtn" @click="viewProgress(item)">查看进度</view>
+					</view>
+				</view>
+			</u-swipe-action>
+			<view v-if="yidu == 2" v-for="(item, index) in data" :key="item.id" class="u-swipe-action-1">
+				<view class="check" v-if="allduDel">
+					<image v-if="!item.show" @click="selected(item)" class="normal" src="../../../static/img/icon_qx_normal.png"></image>
+					<image v-else class="selected" @click="selected(item)" src="../../../static/img/icon_qx_selected.png"></image>
+				</view>
+				<view class="item">
+					<view class="title" @click.stop="jump(item)">{{item.message_title}}</view>
+					<view class="userInfo">
+						<view class="user">
+							<view class="name">拟稿人:{{item.send_user_name}}</view>
+							<view class="name">发文日期:{{item.message_time}}</view>
+							<!-- <view class="name">流程结束日期:2021-04-28</view> -->
+						</view>
+						<view v-if="item.status == '已驳回'" class="rejected">已驳回</view>
+					</view>
+				</view>
+			</view>
+			<view v-if="yidu == 3" v-for="(item, index) in data" :key="item.id" class="u-swipe-action-1">
+				<view class="check" v-if="allduDel">
+					<image v-if="!item.show" @click="selected(item)" class="normal" src="../../../static/img/icon_qx_normal.png"></image>
+					<image v-else class="selected" @click="selected(item)" src="../../../static/img/icon_qx_selected.png"></image>
+				</view>
+				<view class="item">
+					<view class="title" @click.stop="jump(item)">{{item.message_title}}</view>
+					<view class="userInfo">
+						<view class="user">
+							<view class="name">拟稿人:{{item.send_user_name}}</view>
+							<view class="name">发文日期:{{item.message_time}}</view>
+							<!-- <view class="name">流程结束日期:2021-04-28</view> -->
+						</view>
+						<view class="statusBtn" @click="addPost(item)">编辑</view>
+					</view>
+				</view>
+			</view>
+			
+		</view>
+		<view class="no-data" v-else>暂无数据</view>
+		<view style="height: 210rpx;"></view>
+		<view class="btns" @click="addPost">新增发文</view>
+		<view class="bottomBtn allduDel" v-if="allduDel && yidu != 1">
+			<view class="all" @click="selectedAll">
+				<image v-if="!isSelected"  class="normal" src="../../../static/img/icon_qx_normal.png"></image>
+				<image v-else class="selected"  src="../../../static/img/icon_qx_selected.png"></image>
+				<view class="text">全选</view>
+			</view>
+			<view class="btn" @click="delt">确定删除</view>
+		</view>
+		<u-picker mode="time" v-model="showTime" :params="params" @confirm="getTime"></u-picker>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				setNav: {
+					backgroundColor: '#fff', //背景色
+					color: '#333', //字体颜色
+					bold: true,
+					size: '36',
+					backColor: '#333',
+					isdisPlayNavTitle: false, //是否显示返回按钮
+					navTitle: '发文' //导航标题
+				},
+				showTime: false,
+				params: {
+					year: true,
+					month: true,
+					day: true
+				},
+				message_time: '',
+				allduDel: false,
+				isSelected: false,
+				searchVal: '',
+				topNav: 0,
+				yidu: '1',
+				disabled: false,
+				btnWidth: 180,
+				show: false,
+				data: [],
+				options: [{
+					text: '撤回',
+					style: {
+						backgroundColor: '#FF3131'
+					}
+				}],
+				userInfo: {},
+				pageNo: 1,
+				total: 0,
+				roles: []
+			}
+		},
+		onShow () {
+			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
+			this.roles = JSON.parse(uni.getStorageSync('roles'));
+			if (this.roles.indexOf('user-admin') == -1) {
+				return uni.showToast({
+					title: '暂无权限',
+					icon:  'none'
+				})
+			}
+			this.getQueryList(this.yidu)
+			setTimeout(() => {
+				this.topNav = (this.$refs.uNavbar.navbarHeight) + (this.$refs.uNavbar.statusBarHeight)
+			}, 10)
+		},
+		onReachBottom() {
+			if (this.data.length >= this.total) {
+				return
+			}
+			this.pageNo += 1
+			this.getQueryList(this.yidu)
+		},
+		methods: {
+			async getQueryList(message_situation) {
+				let res = await this.$u.post(`boman-web-core/p/cs/queryList`, {
+					"table": "boman_message",
+					"pageNo": this.pageNo,
+					"orderBy": "create_time desc",
+					"isUi": false,
+					"pageSize": 10,
+					"fixedData": {
+						"condition": {
+							"message_situation": message_situation,
+							"send_user_id": this.userInfo.id,
+							"message_time": this.message_time,
+							"is_del": "N"
+						}
+					}
+				})
+				if (res.data && res.data.rows) {
+					res.data.rows = res.data.rows.map(item => {
+						return Object.assign({}, item, {
+							show: false
+						})
+					})
+					if (this.pageNo == 1) {
+						this.data = res.data.rows
+						this.total = res.data.total
+					} else {
+						this.data = this.data.concat(res.data.rows)
+					}
+				}
+			},
+			getTime(e) {
+				// console.log(e);
+				this.message_time = `${e.year}-${e.month}-${e.day}`
+				this.pageNo = 1
+				this.getQueryList(this.yidu)
+			},
+			approvalProcess(item) {
+				uni.navigateTo({
+					url: '/pages/postView/approvalProcess/index?id=' + item.id + '&name=' + item.send_user_name
+				})
+
+			},
+			viewProgress(item) {
+				uni.navigateTo({
+					url: '/pages/postView/viewProgress/index?id=' + item.id + '&name=' + item.send_user_name
+				})
+			},
+			addPost(item) {
+				if (item) {
+					uni.navigateTo({
+						url: '/pages/indexView/addPost/index?objId=' + item.id
+					})
+				} else {
+					uni.navigateTo({
+						url: '/pages/indexView/addPost/index'
+					})
+				}
+				
+			},
+			jump(item = {}) {
+				if (this.allduDel) {
+					return
+				}
+				uni.navigateTo({
+					url: '/pages/postView/postDetails/index?active=' + this.yidu + '&id=' + item.id
+				})
+			},
+			onNav(val) {
+				this.allduDel = false
+				this.yidu = val
+				this.pageNo = 1
+				this.getQueryList(this.yidu)
+				uni.pageScrollTo({
+					scrollTop: 0,
+					duration: 0,
+				});
+			},
+			selectedAll() {
+				this.isSelected = !this.isSelected
+				this.data.forEach(item => {
+					item.show = this.isSelected
+				})
+			},
+			async delt () {
+				let idList = []
+				idList = this.data.filter(item => item.show)
+				console.log(idList);
+				if (idList.length == 0) {
+					uni.showToast({
+						icon: 'none',
+						title: '请至少选择一条数据'
+					})
+					return false
+				}
+				
+				let res = await this.$u.post('boman-web-core/p/cs/objectLogicDelete', {
+				 "table":"boman_message", // 固定值
+				 "logicDelName":"is_del", // 固定值
+				 "logicDelValue":"Y", // 固定值
+				 "idList": idList.map(item => item.id)
+				})
+				if (res.code == 200) {
+					uni.showToast({
+						title: '删除成功'
+					})
+					this.allduDel = false
+					this.pageNo = 1
+					this.getQueryList(this.yidu)
+				} else {
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					})
+				}
+			},
+			selected(item) {
+				item.show = !item.show
+			},
+			async click(index, index1) {
+				let res = await this.$u.get('boman-web-core/message/withdraw/' + this.data[index].id)
+				if (res.code == 200) {
+					uni.showToast({
+						title: res.msg
+					})
+					this.pageNo = 1
+					this.getQueryList(this.yidu)
+				} else {
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					})
+				}
+				// console.log(index, index1)
+				// if (index1 == 1) {
+				// 	this.data.splice(index, 1);
+				// 	this.$u.toast(`删除了第${index}个cell`);
+				// } else {
+				// 	this.data[index].show = false;
+				// 	this.$u.toast(`收藏成功`);
+				// }
+			},
+			// 如果打开一个的时候,不需要关闭其他,则无需实现本方法
+			open(index) {
+				// 先将正在被操作的swipeAction标记为打开状态,否则由于props的特性限制,
+				// 原本为'false',再次设置为'false'会无效
+				this.data[index].show = true;
+				this.data.map((val, idx) => {
+					if (index != idx) this.data[index].show = false;
+				})
+			}
+		}
+	}
+</script>
+<style>
+	page {
+		background: #FFFFFF;
+	}
+</style>
+<style lang="scss" scoped>
+	.topNav {
+		display: flex;
+		align-items: center;
+		background: #FFFFFF;
+		height: 90rpx;
+		box-shadow: 0px 14rpx 10rpx 0px rgba(218, 218, 218, 0.35);
+		position: sticky;
+		width: 100%;
+		left: 0;
+		z-index: 9;
+
+		.item {
+			flex: 1;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+
+			.text {
+				font-size: 26rpx;
+				color: #191919;
+				font-weight: 600;
+			}
+
+			.active {
+				position: relative;
+
+				&::after {
+					content: '';
+					position: absolute;
+					width: 28rpx;
+					height: 6rpx;
+					background: #009FE8;
+					border-radius: 6rpx;
+					bottom: -14rpx;
+					left: 50%;
+					transform: translate(-50%, 0);
+				}
+			}
+		}
+	}
+
+	.searchBox {
+		padding: 30rpx;
+
+		.inputBox {
+			display: flex;
+			align-items: center;
+
+			.input {
+				flex: 1;
+				width: 100%;
+				margin-right: 30rpx;
+				background: #EDEDED;
+				border-radius: 40rpx;
+				padding: 0 30rpx !important;
+			}
+
+			.btn {
+				background: #009FE8;
+				color: #FFFFFF;
+				font-size: 26rpx;
+				height: 60rpx;
+				line-height: 60rpx;
+				padding: 0 30rpx;
+				text-align: center;
+				border-radius: 40rpx;
+			}
+		}
+
+	}
+
+	.toolBox {
+		display: flex;
+		justify-content: space-between;
+
+		.batchDelete {
+			display: flex;
+			align-items: center;
+			font-size: 24rpx;
+			color: #FF3131;
+
+			image {
+				width: 20rpx;
+				height: 24rpx;
+				margin-right: 8rpx;
+			}
+		}
+	}
+
+	.timeBox {
+		padding: 30rpx 0 20rpx 0;
+		display: flex;
+		align-items: center;
+
+		.r {
+			width: 30rpx;
+			height: 33rpx;
+		}
+
+		.text {
+			font-size: 26rpx;
+			color: #343434;
+			margin: 0 14rpx;
+		}
+
+		.d {
+			width: 20rpx;
+			height: 20rpx;
+		}
+	}
+
+	.contentMain {
+		padding: 0 20rpx;
+		
+
+		.u-swipe-action-1 {
+			display: flex;
+			align-items: center;
+			border-bottom: solid 1rpx #DADADA;
+		}
+
+		.check {
+
+			.normal,
+			.selected {
+				width: 30rpx;
+				height: 30rpx;
+			}
+		}
+
+		.item {
+			width: 100%;
+			border-bottom: 1px solid #dadada;
+			.title {
+				font-size: 28rpx;
+				font-weight: 700;
+				color: #343434;
+				padding: 30rpx 30rpx 0 30rpx;
+				white-space: break-word;
+				word-break:break-all;
+			}
+
+			.userInfo {
+				display: flex;
+				align-items: flex-end;
+				padding: 30rpx;
+
+				.user {
+					flex: 1;
+					color: #666;
+					font-size: 24rpx;
+
+					.name {
+						margin-bottom: 10rpx;
+					}
+				}
+
+				.status {
+					color: #009FE8;
+					font-size: 26rpx;
+					margin-bottom: 4rpx;
+				}
+
+				.rejected {
+					color: #AAAAAA;
+					font-size: 26rpx;
+					margin-bottom: 4rpx;
+				}
+
+				.statusBtn {
+					color: #fff;
+					font-size: 22rpx;
+					margin-bottom: 4rpx;
+					background: #61C320;
+					padding: 10rpx 20rpx;
+					border-radius: 40rpx;
+				}
+			}
+		}
+	}
+	
+	.btns {
+		position: fixed;
+		bottom: var(--window-bottom);
+		width: 100%;
+		height: 84rpx;
+		background: #009FE8;
+		color: #fff;
+		text-align: center;
+		line-height: 84rpx;
+	}
+
+	.bottomBtn {
+		display: flex;
+		align-items: center;
+		height: 100rpx;
+		width: 100%;
+		left: 0;
+		z-index: 9;
+		bottom: var(--window-bottom);
+		position: fixed;
+		border-top: solid 1px #E5E5E5;
+
+		.all {
+			display: flex;
+			align-items: center;
+			flex: 0 0 200rpx;
+			background: #FFFFFF;
+			justify-content: center;
+			line-height: 100rpx;
+
+			.normal,
+			.selected {
+				width: 30rpx;
+				height: 30rpx;
+			}
+
+			.text {
+				font-size: 28rpx;
+				color: #343434;
+				margin-left: 20rpx;
+			}
+		}
+
+		.btn {
+			background: #FF3131;
+			color: #FFFFFF;
+			font-size: 28rpx;
+			line-height: 100rpx;
+			text-align: center;
+			flex: 1;
+		}
+	}
+</style>

+ 363 - 0
bureau-of-education/static/common/js/touch-emulator.js

@@ -0,0 +1,363 @@
+(function(window, document, exportName, undefined) {
+    "use strict";
+
+    var isMultiTouch = false;
+    var multiTouchStartPos;
+    var eventTarget;
+    var touchElements = {};
+
+    // polyfills
+    if(!document.createTouch) {
+        document.createTouch = function(view, target, identifier, pageX, pageY, screenX, screenY, clientX, clientY) {
+            // auto set
+            if(clientX == undefined || clientY == undefined) {
+                clientX = pageX - window.pageXOffset;
+                clientY = pageY - window.pageYOffset;
+            }
+
+            return new Touch(target, identifier, {
+                pageX: pageX,
+                pageY: pageY,
+                screenX: screenX,
+                screenY: screenY,
+                clientX: clientX,
+                clientY: clientY
+            });
+        };
+    }
+
+    if(!document.createTouchList) {
+        document.createTouchList = function() {
+            var touchList = new TouchList();
+            for (var i = 0; i < arguments.length; i++) {
+                touchList[i] = arguments[i];
+            }
+            touchList.length = arguments.length;
+            return touchList;
+        };
+    }
+
+    /**
+     * create an touch point
+     * @constructor
+     * @param target
+     * @param identifier
+     * @param pos
+     * @param deltaX
+     * @param deltaY
+     * @returns {Object} touchPoint
+     */
+    function Touch(target, identifier, pos, deltaX, deltaY) {
+        deltaX = deltaX || 0;
+        deltaY = deltaY || 0;
+
+        this.identifier = identifier;
+        this.target = target;
+        this.clientX = pos.clientX + deltaX;
+        this.clientY = pos.clientY + deltaY;
+        this.screenX = pos.screenX + deltaX;
+        this.screenY = pos.screenY + deltaY;
+        this.pageX = pos.pageX + deltaX;
+        this.pageY = pos.pageY + deltaY;
+    }
+
+    /**
+     * create empty touchlist with the methods
+     * @constructor
+     * @returns touchList
+     */
+    function TouchList() {
+        var touchList = [];
+
+        touchList.item = function(index) {
+            return this[index] || null;
+        };
+
+        // specified by Mozilla
+        touchList.identifiedTouch = function(id) {
+            return this[id + 1] || null;
+        };
+
+        return touchList;
+    }
+
+
+    /**
+     * Simple trick to fake touch event support
+     * this is enough for most libraries like Modernizr and Hammer
+     */
+    function fakeTouchSupport() {
+        var objs = [window, document.documentElement];
+        var props = ['ontouchstart', 'ontouchmove', 'ontouchcancel', 'ontouchend'];
+
+        for(var o=0; o<objs.length; o++) {
+            for(var p=0; p<props.length; p++) {
+                if(objs[o] && objs[o][props[p]] == undefined) {
+                    objs[o][props[p]] = null;
+                }
+            }
+        }
+    }
+
+    /**
+     * we don't have to emulate on a touch device
+     * @returns {boolean}
+     */
+    function hasTouchSupport() {
+        return ("ontouchstart" in window) || // touch events
+               (window.Modernizr && window.Modernizr.touch) || // modernizr
+               (navigator.msMaxTouchPoints || navigator.maxTouchPoints) > 2; // pointer events
+    }
+
+    /**
+     * disable mouseevents on the page
+     * @param ev
+     */
+    function preventMouseEvents(ev) {
+		// 注释启用默认事件
+        // ev.preventDefault();
+        // ev.stopPropagation();
+    }
+
+    /**
+     * only trigger touches when the left mousebutton has been pressed
+     * @param touchType
+     * @returns {Function}
+     */
+    function onMouse(touchType) {
+        return function(ev) {
+            // prevent mouse events
+            preventMouseEvents(ev);
+
+            if (ev.which !== 1) {
+                return;
+            }
+
+            // The EventTarget on which the touch point started when it was first placed on the surface,
+            // even if the touch point has since moved outside the interactive area of that element.
+            // also, when the target doesnt exist anymore, we update it
+            if (ev.type == 'mousedown' || !eventTarget || (eventTarget && !eventTarget.dispatchEvent)) {
+                eventTarget = ev.target;
+            }
+
+            // shiftKey has been lost, so trigger a touchend
+            if (isMultiTouch && !ev.shiftKey) {
+                triggerTouch('touchend', ev);
+                isMultiTouch = false;
+            }
+
+            triggerTouch(touchType, ev);
+
+            // we're entering the multi-touch mode!
+            if (!isMultiTouch && ev.shiftKey) {
+                isMultiTouch = true;
+                multiTouchStartPos = {
+                    pageX: ev.pageX,
+                    pageY: ev.pageY,
+                    clientX: ev.clientX,
+                    clientY: ev.clientY,
+                    screenX: ev.screenX,
+                    screenY: ev.screenY
+                };
+                triggerTouch('touchstart', ev);
+            }
+
+            // reset
+            if (ev.type == 'mouseup') {
+                multiTouchStartPos = null;
+                isMultiTouch = false;
+                eventTarget = null;
+            }
+        }
+    }
+
+    /**
+     * trigger a touch event
+     * @param eventName
+     * @param mouseEv
+     */
+    function triggerTouch(eventName, mouseEv) {
+        var touchEvent = document.createEvent('Event');
+        touchEvent.initEvent(eventName, true, true);
+
+        touchEvent.altKey = mouseEv.altKey;
+        touchEvent.ctrlKey = mouseEv.ctrlKey;
+        touchEvent.metaKey = mouseEv.metaKey;
+        touchEvent.shiftKey = mouseEv.shiftKey;
+
+        touchEvent.touches = getActiveTouches(mouseEv, eventName);
+        touchEvent.targetTouches = getActiveTouches(mouseEv, eventName);
+        touchEvent.changedTouches = getChangedTouches(mouseEv, eventName);
+
+        eventTarget.dispatchEvent(touchEvent);
+    }
+
+    /**
+     * create a touchList based on the mouse event
+     * @param mouseEv
+     * @returns {TouchList}
+     */
+    function createTouchList(mouseEv) {
+        var touchList = new TouchList();
+
+        if (isMultiTouch) {
+            var f = TouchEmulator.multiTouchOffset;
+            var deltaX = multiTouchStartPos.pageX - mouseEv.pageX;
+            var deltaY = multiTouchStartPos.pageY - mouseEv.pageY;
+
+            touchList.push(new Touch(eventTarget, 1, multiTouchStartPos, (deltaX*-1) - f, (deltaY*-1) + f));
+            touchList.push(new Touch(eventTarget, 2, multiTouchStartPos, deltaX+f, deltaY-f));
+        } else {
+            touchList.push(new Touch(eventTarget, 1, mouseEv, 0, 0));
+        }
+
+        return touchList;
+    }
+
+    /**
+     * receive all active touches
+     * @param mouseEv
+     * @returns {TouchList}
+     */
+    function getActiveTouches(mouseEv, eventName) {
+        // empty list
+        if (mouseEv.type == 'mouseup') {
+            return new TouchList();
+        }
+
+        var touchList = createTouchList(mouseEv);
+        if(isMultiTouch && mouseEv.type != 'mouseup' && eventName == 'touchend') {
+            touchList.splice(1, 1);
+        }
+        return touchList;
+    }
+
+    /**
+     * receive a filtered set of touches with only the changed pointers
+     * @param mouseEv
+     * @param eventName
+     * @returns {TouchList}
+     */
+    function getChangedTouches(mouseEv, eventName) {
+        var touchList = createTouchList(mouseEv);
+
+        // we only want to return the added/removed item on multitouch
+        // which is the second pointer, so remove the first pointer from the touchList
+        //
+        // but when the mouseEv.type is mouseup, we want to send all touches because then
+        // no new input will be possible
+        if(isMultiTouch && mouseEv.type != 'mouseup' &&
+            (eventName == 'touchstart' || eventName == 'touchend')) {
+            touchList.splice(0, 1);
+        }
+
+        return touchList;
+    }
+
+    /**
+     * show the touchpoints on the screen
+     */
+    function showTouches(ev) {
+        var touch, i, el, styles;
+
+        // first all visible touches
+        for(i = 0; i < ev.touches.length; i++) {
+            touch = ev.touches[i];
+            el = touchElements[touch.identifier];
+            if(!el) {
+                el = touchElements[touch.identifier] = document.createElement("div");
+                document.body.appendChild(el);
+            }
+
+            styles = TouchEmulator.template(touch);
+            for(var prop in styles) {
+                el.style[prop] = styles[prop];
+            }
+        }
+
+        // remove all ended touches
+        if(ev.type == 'touchend' || ev.type == 'touchcancel') {
+            for(i = 0; i < ev.changedTouches.length; i++) {
+                touch = ev.changedTouches[i];
+                el = touchElements[touch.identifier];
+                if(el) {
+                    el.parentNode.removeChild(el);
+                    delete touchElements[touch.identifier];
+                }
+            }
+        }
+    }
+
+    /**
+     * TouchEmulator initializer
+     */
+    function TouchEmulator() {
+        if (hasTouchSupport()) {
+            return;
+        }
+
+        fakeTouchSupport();
+
+        window.addEventListener("mousedown", onMouse('touchstart'), true);
+        window.addEventListener("mousemove", onMouse('touchmove'), true);
+        window.addEventListener("mouseup", onMouse('touchend'), true);
+
+        window.addEventListener("mouseenter", preventMouseEvents, true);
+        window.addEventListener("mouseleave", preventMouseEvents, true);
+        window.addEventListener("mouseout", preventMouseEvents, true);
+        window.addEventListener("mouseover", preventMouseEvents, true);
+
+        // it uses itself!
+        window.addEventListener("touchstart", showTouches, true);
+        window.addEventListener("touchmove", showTouches, true);
+        window.addEventListener("touchend", showTouches, true);
+        window.addEventListener("touchcancel", showTouches, true);
+    }
+
+    // start distance when entering the multitouch mode
+    TouchEmulator.multiTouchOffset = 75;
+
+    /**
+     * css template for the touch rendering
+     * @param touch
+     * @returns object
+     */
+    TouchEmulator.template = function(touch) {
+        var size = 0;
+        var transform = 'translate('+ (touch.clientX-(size/2)) +'px, '+ (touch.clientY-(size/2)) +'px)';
+        return {
+            position: 'fixed',
+            left: 0,
+            top: 0,
+            background: '#fff',
+            border: 'solid 1px #999',
+            opacity: .6,
+            borderRadius: '100%',
+            height: size + 'px',
+            width: size + 'px',
+            padding: 0,
+            margin: 0,
+            display: 'block',
+            overflow: 'hidden',
+            pointerEvents: 'none',
+            webkitUserSelect: 'none',
+            mozUserSelect: 'none',
+            userSelect: 'none',
+            webkitTransform: transform,
+            mozTransform: transform,
+            transform: transform,
+            zIndex: 100
+        }
+    };
+
+    // export
+    if (typeof define == "function" && define.amd) {
+        define(function() {
+            return TouchEmulator;
+        });
+    } else if (typeof module != "undefined" && module.exports) {
+        module.exports = TouchEmulator;
+    } else {
+        window[exportName] = TouchEmulator;
+    }
+})(window, document, "TouchEmulator");

BIN
bureau-of-education/static/e69520e1b75f2a99a4c9a142da9446d.png


BIN
bureau-of-education/static/img/black.png


BIN
bureau-of-education/static/img/icon_1.png


BIN
bureau-of-education/static/img/icon_black_enter.png


BIN
bureau-of-education/static/img/icon_dlhk.png


BIN
bureau-of-education/static/img/icon_hp_dgd.png


BIN
bureau-of-education/static/img/icon_hp_hp.png


BIN
bureau-of-education/static/img/icon_hp_sw.png


BIN
bureau-of-education/static/img/icon_hp_xzfw.png


BIN
bureau-of-education/static/img/icon_mine_csw.png


BIN
bureau-of-education/static/img/icon_mine_sh.png


BIN
bureau-of-education/static/img/icon_mine_tcdl.png


BIN
bureau-of-education/static/img/icon_mine_tel.png


BIN
bureau-of-education/static/img/icon_mine_white_enter.png


BIN
bureau-of-education/static/img/icon_plsc.png


BIN
bureau-of-education/static/img/icon_qx_normal.png


BIN
bureau-of-education/static/img/icon_qx_selected.png


BIN
bureau-of-education/static/img/icon_sc_close.png


BIN
bureau-of-education/static/img/icon_sc_wj.png


BIN
bureau-of-education/static/img/icon_tc_close.png


BIN
bureau-of-education/static/img/icon_xzrq.png


BIN
bureau-of-education/static/img/icon_xzrq_xl.png


BIN
bureau-of-education/static/img/icon_xzry_close.png


BIN
bureau-of-education/static/img/icon_xzry_sl.png


BIN
bureau-of-education/static/img/icon_xzry_xl.png


BIN
bureau-of-education/static/img/icon_yjyd.png


BIN
bureau-of-education/static/img/ipc_yz_ybh.png


BIN
bureau-of-education/static/img/ipc_yz_ysh.png


BIN
bureau-of-education/static/img/ipc_yz_ywc.png


BIN
bureau-of-education/static/img/pic_dl_hum.png


BIN
bureau-of-education/static/img/pic_dlbg.png


BIN
bureau-of-education/static/img/pic_hp_bgdgd.png


BIN
bureau-of-education/static/img/pic_hp_bgsw.png


BIN
bureau-of-education/static/img/pic_hp_bgxzfw.png


BIN
bureau-of-education/static/img/pic_hp_tbbg@2x.png


BIN
bureau-of-education/static/img/pic_mine_tbbg.png


BIN
bureau-of-education/static/img/pic_yz_wwc.png


BIN
bureau-of-education/static/img/pic_yz_wwc_1.png


BIN
bureau-of-education/static/logo.png


BIN
bureau-of-education/static/tabbar/1.png


BIN
bureau-of-education/static/tabbar/11.png


BIN
bureau-of-education/static/tabbar/2.png


BIN
bureau-of-education/static/tabbar/22.png


BIN
bureau-of-education/static/tabbar/3.png


BIN
bureau-of-education/static/tabbar/33.png


Деякі файли не було показано, через те що забагато файлів було змінено