Ver Fonte

智慧田前端初始代码

yfzhang há 9 meses atrás
commit
5aaf783a5b
100 ficheiros alterados com 19534 adições e 0 exclusões
  1. 3 0
      .gitignore
  2. 20 0
      .hbuilderx/launch.json
  3. 8 0
      .idea/.gitignore
  4. 6 0
      .idea/misc.xml
  5. 8 0
      .idea/modules.xml
  6. 9 0
      .idea/zht-miniapp.iml
  7. 264 0
      App.vue
  8. 144 0
      Readme.md
  9. 3 0
      androidPrivacy.json
  10. 184 0
      colorui/animation.css
  11. 86 0
      colorui/components/cu-custom.vue
  12. 36 0
      colorui/icon.css
  13. 4104 0
      colorui/main.css
  14. 58 0
      colorui/screenTextScroll.vue
  15. 41 0
      main.js
  16. 145 0
      manifest.json
  17. 8 0
      node_modules/i/.github/dependabot.yml
  18. 26 0
      node_modules/i/.github/workflows/ci.yml
  19. 20 0
      node_modules/i/LICENSE
  20. 176 0
      node_modules/i/README.md
  21. 78 0
      node_modules/i/lib/defaults.js
  22. 11 0
      node_modules/i/lib/inflect.js
  23. 138 0
      node_modules/i/lib/inflections.js
  24. 234 0
      node_modules/i/lib/methods.js
  25. 51 0
      node_modules/i/lib/native.js
  26. 147 0
      node_modules/i/lib/util.js
  27. 85 0
      node_modules/i/package.json
  28. 230 0
      node_modules/i/test/inflector/cases.js
  29. 87 0
      node_modules/i/test/inflector/inflections-test.js
  30. 348 0
      node_modules/i/test/inflector/methods-test.js
  31. 39 0
      node_modules/i/test/utils/array-test.js
  32. 88 0
      node_modules/i/test/utils/string-test.js
  33. 169 0
      node_modules/mpvue-echarts/README.md
  34. 67 0
      node_modules/mpvue-echarts/package.json
  35. 125 0
      node_modules/mpvue-echarts/src/echarts.vue
  36. 73 0
      node_modules/mpvue-echarts/src/wx-canvas.js
  37. 11 0
      node_modules/mpvue-echarts/types/echarts.d.ts
  38. 3 0
      node_modules/mpvue-echarts/types/index.d.ts
  39. 96 0
      node_modules/prettier/README.md
  40. 181 0
      node_modules/prettier/bin-prettier.js
  41. 178 0
      node_modules/prettier/index.js
  42. 86 0
      node_modules/prettier/package.json
  43. 0 0
      node_modules/prettier/parser-babylon.js
  44. 0 0
      node_modules/prettier/parser-flow.js
  45. 109 0
      node_modules/prettier/parser-glimmer.js
  46. 0 0
      node_modules/prettier/parser-graphql.js
  47. 0 0
      node_modules/prettier/parser-markdown.js
  48. 0 0
      node_modules/prettier/parser-parse5.js
  49. 3761 0
      node_modules/prettier/parser-postcss.js
  50. 0 0
      node_modules/prettier/parser-typescript.js
  51. 0 0
      node_modules/prettier/parser-upload.js
  52. 0 0
      node_modules/prettier/parser-vue.js
  53. 365 0
      node_modules/prettier/third-party.js
  54. 23 0
      package-lock.json
  55. 22 0
      package.json
  56. 217 0
      pages.json
  57. 23 0
      pages/data-filled/data-filled-model.js
  58. 253 0
      pages/data-filled/index.vue
  59. 53 0
      pages/home/home.js
  60. 349 0
      pages/home/index.vue
  61. 60 0
      pages/index/index.vue
  62. 494 0
      pages/login/index.vue
  63. 100 0
      pages/login/login-model.js
  64. 178 0
      pages/my/index.vue
  65. 50 0
      pages/my/my-model.js
  66. 142 0
      pages/quick-task/camera.vue
  67. 504 0
      pages/quick-task/form.vue
  68. 63 0
      pages/quick-task/index.vue
  69. 298 0
      pages/quick-task/list.vue
  70. 334 0
      pages/quick-task/quick-list.vue
  71. 148 0
      pages/quick-task/result.vue
  72. 89 0
      pages/sample-check-list/check-model.js
  73. 69 0
      pages/sample-check-list/home.vue
  74. 254 0
      pages/sample-check-list/index.vue
  75. 377 0
      pages/sample-check-list/sample-detail/index.vue
  76. 1017 0
      pages/sample-detail/index.vue
  77. 291 0
      pages/sample-detail/sample-detail-model.js
  78. 76 0
      pages/sample-info-list/index.vue
  79. 22 0
      pages/sample-info-list/sample-info-model.js
  80. 309 0
      pages/sample-list/index.vue
  81. 79 0
      pages/sample-list/sample-list-model.js
  82. 55 0
      pages/sample-sheet-add/index.vue
  83. 26 0
      pages/sample-sheet-add/sample-sheet-add-model.js
  84. 79 0
      pages/task-detail/index.vue
  85. 209 0
      pages/task-list/index.vue
  86. 46 0
      pages/task-list/task-list-model.js
  87. 176 0
      pages/zf-task-list/index.vue
  88. 534 0
      pages/zf-task-list/sampleRandom/index.vue
  89. 113 0
      pages/zf-task-list/sampleRandom/sample-random-model.js
  90. 162 0
      pages/zf-task-list/taskList.vue
  91. 43 0
      pages/zf-task-list/zf-task-list-model.js
  92. 55 0
      project.config.json
  93. 7 0
      project.private.config.json
  94. 22 0
      static/common/common.js
  95. BIN
      static/icons/bg.png
  96. 2 0
      static/icons/cancel-icon.svg
  97. 2 0
      static/icons/fail-icon.svg
  98. BIN
      static/icons/home.png
  99. BIN
      static/icons/home_cur.png
  100. BIN
      static/icons/my.png

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+unpackage/*
+.DS_Store
+										

+ 20 - 0
.hbuilderx/launch.json

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

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 6 - 0
.idea/misc.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/zht-miniapp.iml" filepath="$PROJECT_DIR$/.idea/zht-miniapp.iml" />
+    </modules>
+  </component>
+</project>

+ 9 - 0
.idea/zht-miniapp.iml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 264 - 0
App.vue

@@ -0,0 +1,264 @@
+<script>
+import Vue from "vue";
+import { checkUpdateVersion } from "./static/util/CheckUpdateVersion";
+import { Token } from "./static/util/token.js";
+
+export default {
+
+
+  onLaunch: function() {
+    // console.log("开始调用方法")
+    // let token = new Token();
+    //  token.getTokenFromServer();
+
+    //判断是否为最新版本
+    checkUpdateVersion();
+
+    uni.getSystemInfo({
+      success: function(e) {
+        // #ifndef MP
+        Vue.prototype.StatusBar = e.statusBarHeight;
+        if (e.platform == "android") {
+          Vue.prototype.CustomBar = e.statusBarHeight + 50;
+        } else {
+          Vue.prototype.CustomBar = e.statusBarHeight + 45;
+        }
+        ;
+        // #endif
+
+        // #ifdef MP-WEIXIN
+        Vue.prototype.StatusBar = e.statusBarHeight;
+        let custom = wx.getMenuButtonBoundingClientRect();
+        Vue.prototype.Custom = custom;
+        Vue.prototype.CustomBar = custom.bottom + custom.top - e.statusBarHeight;
+        // #endif
+
+        // #ifdef MP-ALIPAY
+        Vue.prototype.StatusBar = e.statusBarHeight;
+        Vue.prototype.CustomBar = e.statusBarHeight + e.titleBarHeight;
+        // #endif
+      }
+    });
+
+
+    Vue.prototype.ColorList = [{
+      title: "嫣红",
+      name: "red",
+      color: "#e54d42"
+    },
+      {
+        title: "桔橙",
+        name: "orange",
+        color: "#f37b1d"
+      },
+      {
+        title: "明黄",
+        name: "yellow",
+        color: "#fbbd08"
+      },
+      {
+        title: "橄榄",
+        name: "olive",
+        color: "#8dc63f"
+      },
+      {
+        title: "森绿",
+        name: "green",
+        color: "#39b54a"
+      },
+      {
+        title: "天青",
+        name: "cyan",
+        color: "#1cbbb4"
+      },
+      {
+        title: "海蓝",
+        name: "blue",
+        color: "#0081ff"
+      },
+      {
+        title: "姹紫",
+        name: "purple",
+        color: "#6739b6"
+      },
+      {
+        title: "木槿",
+        name: "mauve",
+        color: "#9c26b0"
+      },
+      {
+        title: "桃粉",
+        name: "pink",
+        color: "#e03997"
+      },
+      {
+        title: "棕褐",
+        name: "brown",
+        color: "#a5673f"
+      },
+      {
+        title: "玄灰",
+        name: "grey",
+        color: "#8799a3"
+      },
+      {
+        title: "草灰",
+        name: "gray",
+        color: "#aaaaaa"
+      },
+      {
+        title: "墨黑",
+        name: "black",
+        color: "#333333"
+      },
+      {
+        title: "雅白",
+        name: "white",
+        color: "#ffffff"
+      }
+    ];
+
+  },
+  onShow: function() {
+    console.log("App Show");
+  },
+  onHide: function() {
+    console.log("App Hide");
+  }
+
+};
+</script>
+
+<style>
+@import "colorui/main.css";
+@import "colorui/icon.css";
+
+.nav-list {
+  display: flex;
+  flex-wrap: wrap;
+  padding: 0px 40upx 0px;
+  justify-content: space-between;
+}
+
+.nav-li {
+  padding: 30upx;
+  border-radius: 12upx;
+  width: 45%;
+  margin: 0 2.5% 40upx;
+  background-image: url(https://cdn.nlark.com/yuque/0/2019/png/280374/1552996358352-assets/web-upload/cc3b1807-c684-4b83-8f80-80e5b8a6b975.png);
+  background-size: cover;
+  background-position: center;
+  position: relative;
+  z-index: 1;
+}
+
+.nav-li::after {
+  content: "";
+  position: absolute;
+  z-index: -1;
+  background-color: inherit;
+  width: 100%;
+  height: 100%;
+  left: 0;
+  bottom: -10%;
+  border-radius: 10upx;
+  opacity: 0.2;
+  transform: scale(0.9, 0.9);
+}
+
+.nav-li.cur {
+  color: #fff;
+  background: rgb(94, 185, 94);
+  box-shadow: 4upx 4upx 6upx rgba(94, 185, 94, 0.4);
+}
+
+.nav-title {
+  font-size: 32upx;
+  font-weight: 300;
+}
+
+.nav-title::first-letter {
+  font-size: 40upx;
+  margin-right: 4upx;
+}
+
+.nav-name {
+  font-size: 28upx;
+  text-transform: Capitalize;
+  margin-top: 20upx;
+  position: relative;
+}
+
+.nav-name::before {
+  content: "";
+  position: absolute;
+  display: block;
+  width: 40upx;
+  height: 6upx;
+  background: #fff;
+  bottom: 0;
+  right: 0;
+  opacity: 0.5;
+}
+
+.nav-name::after {
+  content: "";
+  position: absolute;
+  display: block;
+  width: 100upx;
+  height: 1px;
+  background: #fff;
+  bottom: 0;
+  right: 40upx;
+  opacity: 0.3;
+}
+
+.nav-name::first-letter {
+  font-weight: bold;
+  font-size: 36upx;
+  margin-right: 1px;
+}
+
+.nav-li text {
+  position: absolute;
+  right: 30upx;
+  top: 30upx;
+  font-size: 52upx;
+  width: 60upx;
+  height: 60upx;
+  text-align: center;
+  line-height: 60upx;
+}
+
+.text-light {
+  font-weight: 300;
+}
+
+@keyframes show {
+  0% {
+    transform: translateY(-50px);
+  }
+
+  60% {
+    transform: translateY(40upx);
+  }
+
+  100% {
+    transform: translateY(0px);
+  }
+}
+
+@-webkit-keyframes show {
+  0% {
+    transform: translateY(-50px);
+  }
+
+  60% {
+    transform: translateY(40upx);
+  }
+
+  100% {
+    transform: translateY(0px);
+  }
+}
+</style>

+ 144 - 0
Readme.md

@@ -0,0 +1,144 @@
+<p style="text-align: center;"><img src="https://image.weilanwl.com/uni/UniAppReadme.jpg" alt="ColorUI简介"></img></p>
+
+## 前言
+ColorUI是一个css库!!!在你引入样式后可以根据class来调用组件,一些含有交互的操作我也有简单写,可以为你开发提供一些思路。插件市场版本如果和更新日志不一样,请移步Github下载。有组件需求或者Bug提交也可以移步到issues。
+
+## 交流
+微信群:加入微信群请先添加开发者微信,备注UniApp插件市场。QQ群:240787041 或扫描二维码。
+<p style="text-align: center;"><img src="https://image.weilanwl.com/colorui/githubQrcode.jpg" alt="" style="max-width:100%;" width="748"></p>				  
+
+## 素材
+ColorUI在语雀有个群友共同在维护的知识库,里面有一些群友改的模板和UI素材供开发使用哦!
+[语雀-ColorUI群资源](https://www.yuque.com/colorui)
+ 
+## 开始使用
+下载源码解压,复制根目录的 `/colorui` 文件夹到你的根目录
+
+`App.vue` 引入关键Css `main.css` `icon.css`
+```
+<style>
+    @import "colorui/main.css";
+	@import "colorui/icon.css";
+	@import "app.css"; /* 你的项目css */
+	....
+</style>
+```
+
+------
+
+## 使用自定义导航栏
+导航栏作为常用组件有做简单封装,当然你也可以直接复制代码结构自己修改,达到个性化目的。
+
+`App.vue` 获得系统信息
+```
+onLaunch: function() {
+	uni.getSystemInfo({
+		success: function(e) {
+			// #ifndef MP
+			Vue.prototype.StatusBar = e.statusBarHeight;
+			if (e.platform == 'android') {
+				Vue.prototype.CustomBar = e.statusBarHeight + 50;
+			} else {
+				Vue.prototype.CustomBar = e.statusBarHeight + 45;
+			};
+			// #endif
+			// #ifdef MP-WEIXIN
+			Vue.prototype.StatusBar = e.statusBarHeight;
+			let custom = wx.getMenuButtonBoundingClientRect();
+			Vue.prototype.Custom = custom;
+			Vue.prototype.CustomBar = custom.bottom + custom.top - e.statusBarHeight;
+			// #endif		
+			// #ifdef MP-ALIPAY
+			Vue.prototype.StatusBar = e.statusBarHeight;
+			Vue.prototype.CustomBar = e.statusBarHeight + e.titleBarHeight;
+			// #endif
+		}
+	})
+},
+```
+
+`pages.json` 配置取消系统导航栏
+```
+"globalStyle": {
+	"navigationStyle": "custom"
+},
+```
+复制代码结构可以直接使用,注意全局变量的获取。
+
+使用封装,在`main.js` 引入 `cu-custom` 组件。
+```
+import cuCustom from './colorui/components/cu-custom.vue'
+Vue.component('cu-custom',cuCustom)
+```
+
+`page.vue` 页面可以直接调用了
+```
+<cu-custom bgColor="bg-gradual-blue" :isBack="true">
+	<block slot="backText">返回</block>
+	<block slot="content">导航栏</block>
+</cu-custom>
+```
+| 参数       | 作用   |类型    |  默认值 |
+| --------   | -----:  |-----:  | :----:  |
+| bgColor    | 背景颜色类名 |String  |   ''    |
+| isBack     | 是否开启返回 | Boolean |   false |
+| bgImage    | 背景图片路径 | String  |  ''     |
+
+| slot块       | 作用   |
+| --------   | -----:  |
+| backText    | 返回时的文字 | 
+| content     | 中间区域 | 
+| right    | 右侧区域(小程序端可使用范围很窄!)  | 
+
+
+------
+
+
+## 使用自定义Tabbar
+这部分暂时没有封装,思路可以参考下我的源码,原理是一个主页面引入多个页面,在主页面进行切换显示。这样可以解决切换时闪烁的问题。
+
+
+------
+
+
+## 更新日志
+
+ * 2019年4月25日 v2.1.6
+    *  删除var变量 向下兼容安卓APP
+	*  优化单选等表单控件
+
+ * 2019年4月25日 v2.1.5
+    *  优化图片上传
+    *  优化一些点击区域过小
+    *  优化图标旋转
+    *  优化demo显示
+    *  优化阴影
+    *  修复支付宝小程序编译出错
+
+ * 2019年4月14日 v2.1.4
+    *  新增多种阴影
+	*  修复一些var属性的错误
+	*  修复轮播图控制点隐藏不了
+	*  修改图标类名
+	*  修复表单组件里上传图片 ios没有图片显示问题
+
+ 
+ * 2019年4月01日 v2.1.3
+    *  优化代码,支持支付宝小程序
+	*  textarea 样式还原
+
+ * 2019年3月28日 v2.1.2
+	*  修复列表组件样式
+	*  优化主样式代码
+
+ * 2019年3月27日 v2.1.1
+    *  新增多种扩展
+    *  优化堆叠轮播图
+    *  优化消息列表
+	*  优化导航栏的封装
+	*  修复卡片评论错位(3月27日16:32:17)
+
+* 2019年3月25日 v2.1.0
+    *  完成元素,组件移植
+	*  icon文件更改名称,避免图标冲突
+	*  针对不同端口做了优化

+ 3 - 0
androidPrivacy.json

@@ -0,0 +1,3 @@
+{
+    "prompt" : "template"
+}

+ 184 - 0
colorui/animation.css

@@ -0,0 +1,184 @@
+/* 
+  Animation 微动画  
+  基于ColorUI组建库的动画模块 by 文晓港 2019年3月26日19:52:28
+ */
+
+/* css 滤镜 控制黑白底色gif的 */
+.gif-black{  
+  mix-blend-mode: screen;  
+}
+.gif-white{  
+  mix-blend-mode: multiply; 
+}
+
+
+/* Animation css */
+[class*=animation-] {
+    animation-duration: .5s;
+    animation-timing-function: ease-out;
+    animation-fill-mode: both
+}
+
+.animation-fade {
+    animation-name: fade;
+    animation-duration: .8s;
+    animation-timing-function: linear
+}
+
+.animation-scale-up {
+    animation-name: scale-up
+}
+
+.animation-scale-down {
+    animation-name: scale-down
+}
+
+.animation-slide-top {
+    animation-name: slide-top
+}
+
+.animation-slide-bottom {
+    animation-name: slide-bottom
+}
+
+.animation-slide-left {
+    animation-name: slide-left
+}
+
+.animation-slide-right {
+    animation-name: slide-right
+}
+
+.animation-shake {
+    animation-name: shake
+}
+
+.animation-reverse {
+    animation-direction: reverse
+}
+
+@keyframes fade {
+    0% {
+        opacity: 0
+    }
+
+    100% {
+        opacity: 1
+    }
+}
+
+@keyframes scale-up {
+    0% {
+        opacity: 0;
+        transform: scale(.2)
+    }
+
+    100% {
+        opacity: 1;
+        transform: scale(1)
+    }
+}
+
+@keyframes scale-down {
+    0% {
+        opacity: 0;
+        transform: scale(1.8)
+    }
+
+    100% {
+        opacity: 1;
+        transform: scale(1)
+    }
+}
+
+@keyframes slide-top {
+    0% {
+        opacity: 0;
+        transform: translateY(-100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateY(0)
+    }
+}
+
+@keyframes slide-bottom {
+    0% {
+        opacity: 0;
+        transform: translateY(100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateY(0)
+    }
+}
+
+@keyframes shake {
+
+    0%,
+    100% {
+        transform: translateX(0)
+    }
+
+    10% {
+        transform: translateX(-9px)
+    }
+
+    20% {
+        transform: translateX(8px)
+    }
+
+    30% {
+        transform: translateX(-7px)
+    }
+
+    40% {
+        transform: translateX(6px)
+    }
+
+    50% {
+        transform: translateX(-5px)
+    }
+
+    60% {
+        transform: translateX(4px)
+    }
+
+    70% {
+        transform: translateX(-3px)
+    }
+
+    80% {
+        transform: translateX(2px)
+    }
+
+    90% {
+        transform: translateX(-1px)
+    }
+}
+
+@keyframes slide-left {
+    0% {
+        opacity: 0;
+        transform: translateX(-100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateX(0)
+    }
+}
+
+@keyframes slide-right {
+    0% {
+        opacity: 0;
+        transform: translateX(100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateX(0)
+    }
+}

+ 86 - 0
colorui/components/cu-custom.vue

@@ -0,0 +1,86 @@
+<template>
+	<view>
+		<view class="cu-custom" :style="[{height:CustomBar + 'px'}]">
+			<view class="cu-bar fixed" :style="style" :class="[bgImage!=''?'none-bg text-white bg-img':'',bgColor]">
+<!--				<view class="action" @tap="BackPage" v-if="isBack">
+					<text class="cuIcon-back"></text>
+					<slot name="backText"></slot>
+				</view>-->
+        <view class="action" v-if="toTopPage">
+          <slot name="topPage"></slot>
+        </view>
+        <view class="action border-custom"  v-if="isBack" :style="'width:'+Custom.width+'px;height:'+Custom.height+'px;margin-left:calc(750rpx - '+Custom.right+'px)'">
+          <text class="cuIcon-back" @tap="BackPage"></text>
+          <text class="cuIcon-homefill" @tap="toHome"></text>
+        </view>
+				<view class="content" :style="[{top:StatusBar + 'px'}]">
+					<slot name="content"></slot>
+				</view>
+				<slot name="right"></slot>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				StatusBar: this.StatusBar,
+				CustomBar: this.CustomBar,
+        Custom: this.Custom
+			};
+		},
+		name: 'cu-custom',
+		computed: {
+			style() {
+				var StatusBar= this.StatusBar;
+				var CustomBar= this.CustomBar;
+				var bgImage = this.bgImage;
+				var style = `height:${CustomBar}px;padding-top:${StatusBar}px;`;
+				if (this.bgImage) {
+					style = `${style}background-image:url(${bgImage});`;
+				}
+				return style
+			}
+		},
+		props: {
+			bgColor: {
+				type: String,
+				default: ''
+			},
+			isBack: {
+				type: [Boolean, String],
+				default: false
+			},
+      toTopPage: {
+        type: [Boolean, String],
+        default: false
+      },
+			bgImage: {
+				type: String,
+				default: ''
+			},
+      isCustom: {
+        type: [Boolean, String],
+        default: false
+      },
+		},
+		methods: {
+      BackPage() {
+        uni.navigateBack({
+          delta: 1
+        });
+      },
+      toHome(){
+        wx.redirectTo({
+          url: '/pages/index/index'
+        });
+      }
+		}
+	}
+</script>
+
+<style>
+
+</style>

Diff do ficheiro suprimidas por serem muito extensas
+ 36 - 0
colorui/icon.css


+ 4104 - 0
colorui/main.css

@@ -0,0 +1,4104 @@
+/*
+  ColorUi for uniApp  v2.1.6 | by 文晓港 2019-05-31 10:44:24
+  仅供学习交流,如作它用所承受的法律责任一概与作者无关  
+  
+  *使用ColorUi开发扩展与插件时,请注明基于ColorUi开发 
+  
+  (QQ交流群:240787041)
+*/
+
+/* ==================
+        初始化
+ ==================== */
+body {
+	background-color: #f1f1f1;
+	font-size: 28upx;
+	color: #333333;
+	font-family: Helvetica Neue, Helvetica, sans-serif;
+	width: 100%;
+	height: 100%;
+}
+
+view,
+scroll-view,
+swiper,
+button,
+input,
+textarea,
+label,
+navigator,
+image {
+	box-sizing: border-box;
+}
+
+.round {
+	border-radius: 5000upx;
+}
+
+.radius {
+	border-radius: 6upx;
+}
+
+/* ==================
+          图片
+ ==================== */
+
+image {
+	max-width: 100%;
+	display: inline-block;
+	position: relative;
+	z-index: 0;
+}
+
+image.loading::before {
+	content: "";
+	background-color: #f5f5f5;
+	display: block;
+	position: absolute;
+	width: 100%;
+	height: 100%;
+	z-index: -2;
+}
+
+image.loading::after {
+	content: "\e7f1";
+	font-family: "cuIcon";
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 32upx;
+	height: 32upx;
+	line-height: 32upx;
+	right: 0;
+	bottom: 0;
+	z-index: -1;
+	font-size: 32upx;
+	margin: auto;
+	color: #ccc;
+	-webkit-animation: cuIcon-spin 2s infinite linear;
+	animation: cuIcon-spin 2s infinite linear;
+	display: block;
+}
+
+.response {
+	width: 100%;
+}
+
+/* ==================
+         开关
+ ==================== */
+
+switch,
+checkbox,
+radio {
+	position: relative;
+}
+
+switch::after,
+switch::before {
+	font-family: "cuIcon";
+	content: "\e645";
+	position: absolute;
+	color: #ffffff !important;
+	top: 0%;
+	left: 0upx;
+	font-size: 26upx;
+	line-height: 26px;
+	width: 50%;
+	text-align: center;
+	pointer-events: none;
+	transform: scale(0, 0);
+	transition: all 0.3s ease-in-out 0s;
+	z-index: 9;
+	bottom: 0;
+	height: 26px;
+	margin: auto;
+}
+
+switch::before {
+	content: "\e646";
+	right: 0;
+	transform: scale(1, 1);
+	left: auto;
+}
+
+switch[checked]::after,
+switch.checked::after {
+	transform: scale(1, 1);
+}
+
+switch[checked]::before,
+switch.checked::before {
+	transform: scale(0, 0);
+}
+
+/* #ifndef MP-ALIPAY */
+radio::before,
+checkbox::before {
+	font-family: "cuIcon";
+	content: "\e645";
+	position: absolute;
+	color: #ffffff !important;
+	top: 50%;
+	margin-top: -8px;
+	right: 5px;
+	font-size: 32upx;
+	line-height: 16px;
+	pointer-events: none;
+	transform: scale(1, 1);
+	transition: all 0.3s ease-in-out 0s;
+	z-index: 9;
+}
+
+radio .wx-radio-input,
+checkbox .wx-checkbox-input,
+radio .uni-radio-input,
+checkbox .uni-checkbox-input {
+	margin: 0;
+	width: 24px;
+	height: 24px;
+}
+
+checkbox.round .wx-checkbox-input,
+checkbox.round .uni-checkbox-input {
+	border-radius: 100upx;
+}
+
+/* #endif */
+
+switch[checked]::before {
+	transform: scale(0, 0);
+}
+
+switch .wx-switch-input,
+switch .uni-switch-input {
+	border: none;
+	padding: 0 24px;
+	width: 48px;
+	height: 26px;
+	margin: 0;
+	border-radius: 100upx;
+}
+
+switch .wx-switch-input:not([class*="bg-"]),
+switch .uni-switch-input:not([class*="bg-"]) {
+	background: #8799a3 !important;
+}
+
+switch .wx-switch-input::after,
+switch .uni-switch-input::after {
+	margin: auto;
+	width: 26px;
+	height: 26px;
+	border-radius: 100upx;
+	left: 0upx;
+	top: 0upx;
+	bottom: 0upx;
+	position: absolute;
+	transform: scale(0.9, 0.9);
+	transition: all 0.1s ease-in-out 0s;
+}
+
+switch .wx-switch-input.wx-switch-input-checked::after,
+switch .uni-switch-input.uni-switch-input-checked::after {
+	margin: auto;
+	left: 22px;
+	box-shadow: none;
+	transform: scale(0.9, 0.9);
+}
+
+radio-group {
+	display: inline-block;
+}
+
+
+
+switch.radius .wx-switch-input::after,
+switch.radius .wx-switch-input,
+switch.radius .wx-switch-input::before,
+switch.radius .uni-switch-input::after,
+switch.radius .uni-switch-input,
+switch.radius .uni-switch-input::before {
+	border-radius: 10upx;
+}
+
+switch .wx-switch-input::before,
+radio.radio::before,
+checkbox .wx-checkbox-input::before,
+radio .wx-radio-input::before,
+switch .uni-switch-input::before,
+radio.radio::before,
+checkbox .uni-checkbox-input::before,
+radio .uni-radio-input::before {
+	display: none;
+}
+
+radio.radio[checked]::after,
+radio.radio .uni-radio-input-checked::after {
+	content: "";
+	background-color: transparent;
+	display: block;
+	position: absolute;
+	width: 8px;
+	height: 8px;
+	z-index: 999;
+	top: 0upx;
+	left: 0upx;
+	right: 0;
+	bottom: 0;
+	margin: auto;
+	border-radius: 200upx;
+	/* #ifndef MP */
+	border: 7px solid #ffffff !important;
+	/* #endif */
+
+	/* #ifdef MP */
+	border: 8px solid #ffffff !important;
+	/* #endif */
+}
+
+.switch-sex::after {
+	content: "\e71c";
+}
+
+.switch-sex::before {
+	content: "\e71a";
+}
+
+.switch-sex .wx-switch-input,
+.switch-sex .uni-switch-input {
+	background: #e54d42 !important;
+	border-color: #e54d42 !important;
+}
+
+.switch-sex[checked] .wx-switch-input,
+.switch-sex.checked .uni-switch-input {
+	background: #0081ff !important;
+	border-color: #0081ff !important;
+}
+
+switch.red[checked] .wx-switch-input.wx-switch-input-checked,
+checkbox.red[checked] .wx-checkbox-input,
+radio.red[checked] .wx-radio-input,
+switch.red.checked .uni-switch-input.uni-switch-input-checked,
+checkbox.red.checked .uni-checkbox-input,
+radio.red.checked .uni-radio-input {
+	background-color: #e54d42 !important;
+	border-color: #e54d42 !important;
+	color: #ffffff !important;
+}
+
+switch.orange[checked] .wx-switch-input,
+checkbox.orange[checked] .wx-checkbox-input,
+radio.orange[checked] .wx-radio-input,
+switch.orange.checked .uni-switch-input,
+checkbox.orange.checked .uni-checkbox-input,
+radio.orange.checked .uni-radio-input {
+	background-color: #f37b1d !important;
+	border-color: #f37b1d !important;
+	color: #ffffff !important;
+}
+
+switch.yellow[checked] .wx-switch-input,
+checkbox.yellow[checked] .wx-checkbox-input,
+radio.yellow[checked] .wx-radio-input,
+switch.yellow.checked .uni-switch-input,
+checkbox.yellow.checked .uni-checkbox-input,
+radio.yellow.checked .uni-radio-input {
+	background-color: #fbbd08 !important;
+	border-color: #fbbd08 !important;
+	color: #333333 !important;
+}
+
+switch.olive[checked] .wx-switch-input,
+checkbox.olive[checked] .wx-checkbox-input,
+radio.olive[checked] .wx-radio-input,
+switch.olive.checked .uni-switch-input,
+checkbox.olive.checked .uni-checkbox-input,
+radio.olive.checked .uni-radio-input {
+	background-color: #8dc63f !important;
+	border-color: #8dc63f !important;
+	color: #ffffff !important;
+}
+
+switch.green[checked] .wx-switch-input,
+switch[checked] .wx-switch-input,
+checkbox.green[checked] .wx-checkbox-input,
+checkbox[checked] .wx-checkbox-input,
+radio.green[checked] .wx-radio-input,
+radio[checked] .wx-radio-input,
+switch.green.checked .uni-switch-input,
+switch.checked .uni-switch-input,
+checkbox.green.checked .uni-checkbox-input,
+checkbox.checked .uni-checkbox-input,
+radio.green.checked .uni-radio-input,
+radio.checked .uni-radio-input {
+	background-color: #39b54a !important;
+	border-color: #39b54a !important;
+	color: #ffffff !important;
+	border-color: #39B54A !important;
+}
+
+switch.cyan[checked] .wx-switch-input,
+checkbox.cyan[checked] .wx-checkbox-input,
+radio.cyan[checked] .wx-radio-input,
+switch.cyan.checked .uni-switch-input,
+checkbox.cyan.checked .uni-checkbox-input,
+radio.cyan.checked .uni-radio-input {
+	background-color: #1cbbb4 !important;
+	border-color: #1cbbb4 !important;
+	color: #ffffff !important;
+}
+
+switch.blue[checked] .wx-switch-input,
+checkbox.blue[checked] .wx-checkbox-input,
+radio.blue[checked] .wx-radio-input,
+switch.blue.checked .uni-switch-input,
+checkbox.blue.checked .uni-checkbox-input,
+radio.blue.checked .uni-radio-input {
+	background-color: #0081ff !important;
+	border-color: #0081ff !important;
+	color: #ffffff !important;
+}
+
+switch.purple[checked] .wx-switch-input,
+checkbox.purple[checked] .wx-checkbox-input,
+radio.purple[checked] .wx-radio-input,
+switch.purple.checked .uni-switch-input,
+checkbox.purple.checked .uni-checkbox-input,
+radio.purple.checked .uni-radio-input {
+	background-color: #6739b6 !important;
+	border-color: #6739b6 !important;
+	color: #ffffff !important;
+}
+
+switch.mauve[checked] .wx-switch-input,
+checkbox.mauve[checked] .wx-checkbox-input,
+radio.mauve[checked] .wx-radio-input,
+switch.mauve.checked .uni-switch-input,
+checkbox.mauve.checked .uni-checkbox-input,
+radio.mauve.checked .uni-radio-input {
+	background-color: #9c26b0 !important;
+	border-color: #9c26b0 !important;
+	color: #ffffff !important;
+}
+
+switch.pink[checked] .wx-switch-input,
+checkbox.pink[checked] .wx-checkbox-input,
+radio.pink[checked] .wx-radio-input,
+switch.pink.checked .uni-switch-input,
+checkbox.pink.checked .uni-checkbox-input,
+radio.pink.checked .uni-radio-input {
+	background-color: #e03997 !important;
+	border-color: #e03997 !important;
+	color: #ffffff !important;
+}
+
+switch.brown[checked] .wx-switch-input,
+checkbox.brown[checked] .wx-checkbox-input,
+radio.brown[checked] .wx-radio-input,
+switch.brown.checked .uni-switch-input,
+checkbox.brown.checked .uni-checkbox-input,
+radio.brown.checked .uni-radio-input {
+	background-color: #a5673f !important;
+	border-color: #a5673f !important;
+	color: #ffffff !important;
+}
+
+switch.grey[checked] .wx-switch-input,
+checkbox.grey[checked] .wx-checkbox-input,
+radio.grey[checked] .wx-radio-input,
+switch.grey.checked .uni-switch-input,
+checkbox.grey.checked .uni-checkbox-input,
+radio.grey.checked .uni-radio-input {
+	background-color: #8799a3 !important;
+	border-color: #8799a3 !important;
+	color: #ffffff !important;
+}
+
+switch.gray[checked] .wx-switch-input,
+checkbox.gray[checked] .wx-checkbox-input,
+radio.gray[checked] .wx-radio-input,
+switch.gray.checked .uni-switch-input,
+checkbox.gray.checked .uni-checkbox-input,
+radio.gray.checked .uni-radio-input {
+	background-color: #f0f0f0 !important;
+	border-color: #f0f0f0 !important;
+	color: #333333 !important;
+}
+
+switch.black[checked] .wx-switch-input,
+checkbox.black[checked] .wx-checkbox-input,
+radio.black[checked] .wx-radio-input,
+switch.black.checked .uni-switch-input,
+checkbox.black.checked .uni-checkbox-input,
+radio.black.checked .uni-radio-input {
+	background-color: #333333 !important;
+	border-color: #333333 !important;
+	color: #ffffff !important;
+}
+
+switch.white[checked] .wx-switch-input,
+checkbox.white[checked] .wx-checkbox-input,
+radio.white[checked] .wx-radio-input,
+switch.white.checked .uni-switch-input,
+checkbox.white.checked .uni-checkbox-input,
+radio.white.checked .uni-radio-input {
+	background-color: #ffffff !important;
+	border-color: #ffffff !important;
+	color: #333333 !important;
+}
+
+/* ==================
+          边框
+ ==================== */
+
+/* -- 实线 -- */
+
+.solid,
+.solid-top,
+.solid-right,
+.solid-bottom,
+.solid-left,
+.solids,
+.solids-top,
+.solids-right,
+.solids-bottom,
+.solids-left,
+.dashed,
+.dashed-top,
+.dashed-right,
+.dashed-bottom,
+.dashed-left {
+	position: relative;
+}
+
+.solid::after,
+.solid-top::after,
+.solid-right::after,
+.solid-bottom::after,
+.solid-left::after,
+.solids::after,
+.solids-top::after,
+.solids-right::after,
+.solids-bottom::after,
+.solids-left::after,
+.dashed::after,
+.dashed-top::after,
+.dashed-right::after,
+.dashed-bottom::after,
+.dashed-left::after {
+	content: " ";
+	width: 200%;
+	height: 200%;
+	position: absolute;
+	top: 0;
+	left: 0;
+	border-radius: inherit;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	pointer-events: none;
+	box-sizing: border-box;
+}
+
+.solid::after {
+	border: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-top::after {
+	border-top: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-right::after {
+	border-right: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-bottom::after {
+	border-bottom: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-left::after {
+	border-left: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solids::after {
+	border: 8upx solid #eee;
+}
+
+.solids-top::after {
+	border-top: 8upx solid #eee;
+}
+
+.solids-right::after {
+	border-right: 8upx solid #eee;
+}
+
+.solids-bottom::after {
+	border-bottom: 8upx solid #eee;
+}
+
+.solids-left::after {
+	border-left: 8upx solid #eee;
+}
+
+/* -- 虚线 -- */
+
+.dashed::after {
+	border: 1upx dashed #ddd;
+}
+
+.dashed-top::after {
+	border-top: 1upx dashed #ddd;
+}
+
+.dashed-right::after {
+	border-right: 1upx dashed #ddd;
+}
+
+.dashed-bottom::after {
+	border-bottom: 1upx dashed #ddd;
+}
+
+.dashed-left::after {
+	border-left: 1upx dashed #ddd;
+}
+
+/* -- 阴影 -- */
+
+.shadow[class*='white'] {
+	--ShadowSize: 0 1upx 6upx;
+}
+
+.shadow-lg {
+	--ShadowSize: 0upx 40upx 100upx 0upx;
+}
+
+.shadow-warp {
+	position: relative;
+	box-shadow: 0 0 10upx rgba(0, 0, 0, 0.1);
+}
+
+.shadow-warp:before,
+.shadow-warp:after {
+	position: absolute;
+	content: "";
+	top: 20upx;
+	bottom: 30upx;
+	left: 20upx;
+	width: 50%;
+	box-shadow: 0 30upx 20upx rgba(0, 0, 0, 0.2);
+	transform: rotate(-3deg);
+	z-index: -1;
+}
+
+.shadow-warp:after {
+	right: 20upx;
+	left: auto;
+	transform: rotate(3deg);
+}
+
+.shadow-blur {
+	position: relative;
+}
+
+.shadow-blur::before {
+	content: "";
+	display: block;
+	background: inherit;
+	filter: blur(10upx);
+	position: absolute;
+	width: 100%;
+	height: 100%;
+	top: 10upx;
+	left: 10upx;
+	z-index: -1;
+	opacity: 0.4;
+	transform-origin: 0 0;
+	border-radius: inherit;
+	transform: scale(1, 1);
+}
+
+/* ==================
+          按钮
+ ==================== */
+
+.cu-btn {
+	position: relative;
+	border: 0upx;
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	box-sizing: border-box;
+	padding: 0 30upx;
+	font-size: 28upx;
+	height: 64upx;
+	line-height: 1;
+	text-align: center;
+	text-decoration: none;
+	overflow: visible;
+	margin-left: initial;
+	transform: translate(0upx, 0upx);
+	margin-right: initial;
+}
+
+.cu-btn::after {
+	display: none;
+}
+
+.cu-btn:not([class*="bg-"]) {
+	background-color: #f0f0f0;
+}
+
+.cu-btn[class*="line"] {
+	background-color: transparent;
+}
+
+.cu-btn[class*="line"]::after {
+	content: " ";
+	display: block;
+	width: 200%;
+	height: 200%;
+	position: absolute;
+	top: 0;
+	left: 0;
+	border: 1upx solid currentColor;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	box-sizing: border-box;
+	border-radius: 12upx;
+	z-index: 1;
+	pointer-events: none;
+}
+
+.cu-btn.round[class*="line"]::after {
+	border-radius: 1000upx;
+}
+
+.cu-btn[class*="lines"]::after {
+	border: 6upx solid currentColor;
+}
+
+.cu-btn[class*="bg-"]::after {
+	display: none;
+}
+
+.cu-btn.sm {
+	padding: 0 20upx;
+	font-size: 20upx;
+	height: 48upx;
+}
+
+.cu-btn.lg {
+	padding: 0 40upx;
+	font-size: 32upx;
+	height: 80upx;
+}
+
+.cu-btn.cuIcon.sm {
+	width: 48upx;
+	height: 48upx;
+}
+
+.cu-btn.cuIcon {
+	width: 64upx;
+	height: 64upx;
+	border-radius: 500upx;
+	padding: 0;
+}
+
+button.cuIcon.lg {
+	width: 80upx;
+	height: 80upx;
+}
+
+.cu-btn.shadow-blur::before {
+	top: 4upx;
+	left: 4upx;
+	filter: blur(6upx);
+	opacity: 0.6;
+}
+
+.cu-btn.button-hover {
+	transform: translate(1upx, 1upx);
+}
+
+.block {
+	display: block;
+}
+
+.cu-btn.block {
+	display: flex;
+}
+
+.cu-btn[disabled] {
+	opacity: 0.6;
+	color: #ffffff;
+}
+
+/* ==================
+          徽章
+ ==================== */
+
+.cu-tag {
+	font-size: 24upx;
+	vertical-align: middle;
+	position: relative;
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	box-sizing: border-box;
+	padding: 0upx 16upx;
+	height: 48upx;
+	font-family: Helvetica Neue, Helvetica, sans-serif;
+	white-space: nowrap;
+}
+
+.cu-tag:not([class*="bg"]):not([class*="line"]) {
+	background-color: #f1f1f1;
+}
+
+.cu-tag[class*="line-"]::after {
+	content: " ";
+	width: 200%;
+	height: 200%;
+	position: absolute;
+	top: 0;
+	left: 0;
+	border: 1upx solid currentColor;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	box-sizing: border-box;
+	border-radius: inherit;
+	z-index: 1;
+	pointer-events: none;
+}
+
+.cu-tag.radius[class*="line"]::after {
+	border-radius: 12upx;
+}
+
+.cu-tag.round[class*="line"]::after {
+	border-radius: 1000upx;
+}
+
+.cu-tag[class*="line-"]::after {
+	border-radius: 0;
+}
+
+.cu-tag+.cu-tag {
+	margin-left: 10upx;
+}
+
+.cu-tag.sm {
+	font-size: 20upx;
+	padding: 0upx 12upx;
+	height: 32upx;
+}
+
+.cu-capsule {
+	display: inline-flex;
+	vertical-align: middle;
+}
+
+.cu-capsule+.cu-capsule {
+	margin-left: 10upx;
+}
+
+.cu-capsule .cu-tag {
+	margin: 0;
+}
+
+.cu-capsule .cu-tag[class*="line-"]:last-child::after {
+	border-left: 0upx solid transparent;
+}
+
+.cu-capsule .cu-tag[class*="line-"]:first-child::after {
+	border-right: 0upx solid transparent;
+}
+
+.cu-capsule.radius .cu-tag:first-child {
+	border-top-left-radius: 6upx;
+	border-bottom-left-radius: 6upx;
+}
+
+.cu-capsule.radius .cu-tag:last-child::after,
+.cu-capsule.radius .cu-tag[class*="line-"] {
+	border-top-right-radius: 12upx;
+	border-bottom-right-radius: 12upx;
+}
+
+.cu-capsule.round .cu-tag:first-child {
+	border-top-left-radius: 200upx;
+	border-bottom-left-radius: 200upx;
+	text-indent: 4upx;
+}
+
+.cu-capsule.round .cu-tag:last-child::after,
+.cu-capsule.round .cu-tag:last-child {
+	border-top-right-radius: 200upx;
+	border-bottom-right-radius: 200upx;
+	text-indent: -4upx;
+}
+
+.cu-tag.badge {
+	border-radius: 200upx;
+	position: absolute;
+	top: -10upx;
+	right: -10upx;
+	font-size: 20upx;
+	padding: 0upx 10upx;
+	height: 28upx;
+	color: #ffffff;
+}
+
+.cu-tag.badge:not([class*="bg-"]) {
+	background-color: #dd514c;
+}
+
+.cu-tag:empty:not([class*="cuIcon-"]) {
+	padding: 0upx;
+	width: 16upx;
+	height: 16upx;
+	top: -4upx;
+	right: -4upx;
+}
+
+.cu-tag[class*="cuIcon-"] {
+	width: 32upx;
+	height: 32upx;
+	top: -4upx;
+	right: -4upx;
+}
+
+/* ==================
+          头像
+ ==================== */
+
+.cu-avatar {
+	font-variant: small-caps;
+	margin: 0;
+	padding: 0;
+	display: inline-flex;
+	text-align: center;
+	justify-content: center;
+	align-items: center;
+	background-color: #ccc;
+	color: #ffffff;
+	white-space: nowrap;
+	position: relative;
+	width: 64upx;
+	height: 64upx;
+	background-size: cover;
+	background-position: center;
+	vertical-align: middle;
+	font-size: 1.5em;
+}
+
+.cu-avatar.sm {
+	width: 48upx;
+	height: 48upx;
+	font-size: 1em;
+}
+
+.cu-avatar.lg {
+	width: 96upx;
+	height: 96upx;
+	font-size: 2em;
+}
+
+.cu-avatar.xl {
+	width: 128upx;
+	height: 128upx;
+	font-size: 2.5em;
+}
+
+.cu-avatar .avatar-text {
+	font-size: 0.4em;
+}
+
+.cu-avatar-group {
+	direction: rtl;
+	unicode-bidi: bidi-override;
+	padding: 0 10upx 0 40upx;
+	display: inline-block;
+}
+
+.cu-avatar-group .cu-avatar {
+	margin-left: -30upx;
+	border: 4upx solid #f1f1f1;
+	vertical-align: middle;
+}
+
+.cu-avatar-group .cu-avatar.sm {
+	margin-left: -20upx;
+	border: 1upx solid #f1f1f1;
+}
+
+/* ==================
+         进度条
+ ==================== */
+
+.cu-progress {
+	overflow: hidden;
+	height: 28upx;
+	background-color: #ebeef5;
+	display: inline-flex;
+	align-items: center;
+	width: 100%;
+}
+
+.cu-progress+view,
+.cu-progress+text {
+	line-height: 1;
+}
+
+.cu-progress.xs {
+	height: 10upx;
+}
+
+.cu-progress.sm {
+	height: 20upx;
+}
+
+.cu-progress view {
+	width: 0;
+	height: 100%;
+	align-items: center;
+	display: flex;
+	justify-items: flex-end;
+	justify-content: space-around;
+	font-size: 20upx;
+	color: #ffffff;
+	transition: width 0.6s ease;
+}
+
+.cu-progress text {
+	align-items: center;
+	display: flex;
+	font-size: 20upx;
+	color: #333333;
+	text-indent: 10upx;
+}
+
+.cu-progress.text-progress {
+	padding-right: 60upx;
+}
+
+.cu-progress.striped view {
+	background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+	background-size: 72upx 72upx;
+}
+
+.cu-progress.active view {
+	animation: progress-stripes 2s linear infinite;
+}
+
+@keyframes progress-stripes {
+	from {
+		background-position: 72upx 0;
+	}
+
+	to {
+		background-position: 0 0;
+	}
+}
+
+/* ==================
+          加载
+ ==================== */
+
+.cu-load {
+	display: block;
+	line-height: 3em;
+	text-align: center;
+}
+
+.cu-load::before {
+	font-family: "cuIcon";
+	display: inline-block;
+	margin-right: 6upx;
+}
+
+.cu-load.loading::before {
+	content: "\e67a";
+	animation: cuIcon-spin 2s infinite linear;
+}
+
+.cu-load.loading::after {
+	content: "加载中...";
+}
+
+.cu-load.over::before {
+	content: "\e64a";
+}
+
+.cu-load.over::after {
+	content: "没有更多了";
+}
+
+.cu-load.more::before {
+	content: "\e64a";
+}
+
+.cu-load.more::after {
+	content: "点击加载更多";
+}
+
+.cu-load.erro::before {
+	content: "\e658";
+}
+
+.cu-load.erro::after {
+	content: "加载失败";
+}
+
+.cu-load.load-cuIcon::before {
+	font-size: 32upx;
+}
+
+.cu-load.load-cuIcon::after {
+	display: none;
+}
+
+.cu-load.load-cuIcon.over {
+	display: none;
+}
+
+.cu-load.load-modal {
+	position: fixed;
+	top: 0;
+	right: 0;
+	bottom: 140upx;
+	left: 0;
+	margin: auto;
+	width: 260upx;
+	height: 260upx;
+	background-color: #ffffff;
+	border-radius: 10upx;
+	box-shadow: 0 0 0upx 2000upx rgba(0, 0, 0, 0.5);
+	display: flex;
+	align-items: center;
+	flex-direction: column;
+	justify-content: center;
+	font-size: 28upx;
+	z-index: 9999;
+	line-height: 2.4em;
+}
+
+.cu-load.load-modal [class*="cuIcon-"] {
+	font-size: 60upx;
+}
+
+.cu-load.load-modal image {
+	width: 70upx;
+	height: 70upx;
+}
+
+.cu-load.load-modal::after {
+	content: "";
+	position: absolute;
+	background-color: #ffffff;
+	border-radius: 50%;
+	width: 200upx;
+	height: 200upx;
+	font-size: 10px;
+	border-top: 6upx solid rgba(0, 0, 0, 0.05);
+	border-right: 6upx solid rgba(0, 0, 0, 0.05);
+	border-bottom: 6upx solid rgba(0, 0, 0, 0.05);
+	border-left: 6upx solid #f37b1d;
+	animation: cuIcon-spin 1s infinite linear;
+	z-index: -1;
+}
+
+.load-progress {
+	pointer-events: none;
+	top: 0;
+	position: fixed;
+	width: 100%;
+	left: 0;
+	z-index: 2000;
+}
+
+.load-progress.hide {
+	display: none;
+}
+
+.load-progress .load-progress-bar {
+	position: relative;
+	width: 100%;
+	height: 4upx;
+	overflow: hidden;
+	transition: all 200ms ease 0s;
+}
+
+.load-progress .load-progress-spinner {
+	position: absolute;
+	top: 10upx;
+	right: 10upx;
+	z-index: 2000;
+	display: block;
+}
+
+.load-progress .load-progress-spinner::after {
+	content: "";
+	display: block;
+	width: 24upx;
+	height: 24upx;
+	-webkit-box-sizing: border-box;
+	box-sizing: border-box;
+	border: solid 4upx transparent;
+	border-top-color: inherit;
+	border-left-color: inherit;
+	border-radius: 50%;
+	-webkit-animation: load-progress-spinner 0.4s linear infinite;
+	animation: load-progress-spinner 0.4s linear infinite;
+}
+
+@-webkit-keyframes load-progress-spinner {
+	0% {
+		-webkit-transform: rotate(0);
+		transform: rotate(0);
+	}
+
+	100% {
+		-webkit-transform: rotate(360deg);
+		transform: rotate(360deg);
+	}
+}
+
+@keyframes load-progress-spinner {
+	0% {
+		-webkit-transform: rotate(0);
+		transform: rotate(0);
+	}
+
+	100% {
+		-webkit-transform: rotate(360deg);
+		transform: rotate(360deg);
+	}
+}
+
+/* ==================
+          列表
+ ==================== */
+.grayscale {
+	filter: grayscale(1);
+}
+
+.cu-list+.cu-list {
+	margin-top: 30upx
+}
+
+.cu-list>.cu-item {
+	transition: all .6s ease-in-out 0s;
+	transform: translateX(0upx)
+}
+
+.cu-list>.cu-item.move-cur {
+	transform: translateX(-260upx)
+}
+
+.cu-list>.cu-item .move {
+	position: absolute;
+	right: 0;
+	display: flex;
+	width: 260upx;
+	height: 100%;
+	transform: translateX(100%)
+}
+
+.cu-list>.cu-item .move view {
+	display: flex;
+	flex: 1;
+	justify-content: center;
+	align-items: center
+}
+
+.cu-list.menu-avatar {
+	overflow: hidden;
+}
+
+.cu-list.menu-avatar>.cu-item {
+	position: relative;
+	display: flex;
+	padding-right: 10upx;
+	height: 140upx;
+	background-color: #ffffff;
+	justify-content: flex-end;
+	align-items: center
+}
+
+.cu-list.menu-avatar>.cu-item>.cu-avatar {
+	position: absolute;
+	left: 30upx
+}
+
+.cu-list.menu-avatar>.cu-item .flex .text-cut {
+	max-width: 510upx
+}
+
+.cu-list.menu-avatar>.cu-item .content {
+	position: absolute;
+	left: 146upx;
+	width: calc(100% - 96upx - 60upx - 120upx - 20upx);
+	line-height: 1.6em;
+}
+
+.cu-list.menu-avatar>.cu-item .content.flex-sub {
+	width: calc(100% - 96upx - 60upx - 20upx);
+}
+
+.cu-list.menu-avatar>.cu-item .content>view:first-child {
+	font-size: 30upx;
+	display: flex;
+	align-items: center
+}
+
+.cu-list.menu-avatar>.cu-item .content .cu-tag.sm {
+	display: inline-block;
+	margin-left: 10upx;
+	height: 28upx;
+	font-size: 16upx;
+	line-height: 32upx
+}
+
+.cu-list.menu-avatar>.cu-item .action {
+	width: 100upx;
+	text-align: center
+}
+
+.cu-list.menu-avatar>.cu-item .action view+view {
+	margin-top: 10upx
+}
+
+.cu-list.menu-avatar.comment>.cu-item .content {
+	position: relative;
+	left: 0;
+	width: auto;
+	flex: 1;
+}
+
+.cu-list.menu-avatar.comment>.cu-item {
+	padding: 30upx 30upx 30upx 120upx;
+	height: auto
+}
+
+.cu-list.menu-avatar.comment .cu-avatar {
+	align-self: flex-start
+}
+
+.cu-list.menu>.cu-item {
+	position: relative;
+	display: flex;
+	padding: 0 30upx;
+	min-height: 100upx;
+	background-color: #ffffff;
+	justify-content: space-between;
+	align-items: center
+}
+
+.cu-list.menu>.cu-item:last-child:after {
+	border: none
+}
+
+.cu-list.menu-avatar>.cu-item:after,
+.cu-list.menu>.cu-item:after {
+	position: absolute;
+	top: 0;
+	left: 0;
+	box-sizing: border-box;
+	width: 200%;
+	height: 200%;
+	border-bottom: 1upx solid #ddd;
+	border-radius: inherit;
+	content: " ";
+	transform: scale(.5);
+	transform-origin: 0 0;
+	pointer-events: none
+}
+
+.cu-list.menu>.cu-item.grayscale {
+	background-color: #f5f5f5
+}
+
+.cu-list.menu>.cu-item.cur {
+	background-color: #fcf7e9
+}
+
+.cu-list.menu>.cu-item.arrow {
+	padding-right: 90upx
+}
+
+.cu-list.menu>.cu-item.arrow:before {
+	position: absolute;
+	top: 0;
+	right: 30upx;
+	bottom: 0;
+	display: block;
+	margin: auto;
+	width: 30upx;
+	height: 30upx;
+	color: #8799a3;
+	content: "\e6a3";
+	text-align: center;
+	font-size: 34upx;
+	font-family: cuIcon;
+	line-height: 30upx
+}
+
+.cu-list.menu>.cu-item button.content {
+	padding: 0;
+	background-color: transparent;
+	justify-content: flex-start
+}
+
+.cu-list.menu>.cu-item button.content:after {
+	display: none
+}
+
+.cu-list.menu>.cu-item .cu-avatar-group .cu-avatar {
+	border-color: #ffffff
+}
+
+.cu-list.menu>.cu-item .content>view:first-child {
+	display: flex;
+	align-items: center
+}
+
+.cu-list.menu>.cu-item .content>text[class*=cuIcon] {
+	display: inline-block;
+	margin-right: 10upx;
+	width: 1.6em;
+	text-align: center
+}
+
+.cu-list.menu>.cu-item .content>image {
+	display: inline-block;
+	margin-right: 10upx;
+	width: 1.6em;
+	height: 1.6em;
+	vertical-align: middle
+}
+
+.cu-list.menu>.cu-item .content {
+	font-size: 30upx;
+	line-height: 1.6em;
+	flex: 1
+}
+
+.cu-list.menu>.cu-item .content .cu-tag.sm {
+	display: inline-block;
+	margin-left: 10upx;
+	height: 28upx;
+	font-size: 16upx;
+	line-height: 32upx
+}
+
+.cu-list.menu>.cu-item .action .cu-tag:empty {
+	right: 10upx
+}
+
+.cu-list.menu {
+	display: block;
+	overflow: hidden
+}
+
+.cu-list.menu.sm-border>.cu-item:after {
+	left: 30upx;
+	width: calc(200% - 120upx)
+}
+
+.cu-list.grid>.cu-item {
+	position: relative;
+	display: flex;
+	padding: 20upx 0 30upx;
+	transition-duration: 0s;
+	flex-direction: column
+}
+
+.cu-list.grid>.cu-item:after {
+	position: absolute;
+	top: 0;
+	left: 0;
+	box-sizing: border-box;
+	width: 200%;
+	height: 200%;
+	border-right: 1px solid rgba(0, 0, 0, .1);
+	border-bottom: 1px solid rgba(0, 0, 0, .1);
+	border-radius: inherit;
+	content: " ";
+	transform: scale(.5);
+	transform-origin: 0 0;
+	pointer-events: none
+}
+
+.cu-list.grid>.cu-item text {
+	display: block;
+	margin-top: 10upx;
+	color: #888;
+	font-size: 26upx;
+	line-height: 40upx
+}
+
+.cu-list.grid>.cu-item [class*=cuIcon] {
+	position: relative;
+	display: block;
+	margin-top: 20upx;
+	width: 100%;
+	font-size: 48upx
+}
+
+.cu-list.grid>.cu-item .cu-tag {
+	right: auto;
+	left: 50%;
+	margin-left: 20upx
+}
+
+.cu-list.grid {
+	background-color: #ffffff;
+	text-align: center
+}
+
+.cu-list.grid.no-border>.cu-item {
+	padding-top: 10upx;
+	padding-bottom: 20upx
+}
+
+.cu-list.grid.no-border>.cu-item:after {
+	border: none
+}
+
+.cu-list.grid.no-border {
+	padding: 20upx 10upx
+}
+
+.cu-list.grid.col-3>.cu-item:nth-child(3n):after,
+.cu-list.grid.col-4>.cu-item:nth-child(4n):after,
+.cu-list.grid.col-5>.cu-item:nth-child(5n):after {
+	border-right-width: 0
+}
+
+.cu-list.card-menu {
+	overflow: hidden;
+	margin-right: 30upx;
+	margin-left: 30upx;
+	border-radius: 20upx
+}
+
+
+/* ==================
+          操作条
+ ==================== */
+
+.cu-bar {
+	display: flex;
+	position: relative;
+	align-items: center;
+	min-height: 100upx;
+	justify-content: space-between;
+}
+
+.cu-bar .action {
+	display: flex;
+	align-items: center;
+	height: 100%;
+	justify-content: center;
+	max-width: 100%;
+}
+
+.cu-bar .action.border-title {
+	position: relative;
+	top: -10upx;
+}
+
+.cu-bar .action.border-title text[class*="bg-"]:last-child {
+	position: absolute;
+	bottom: -0.5rem;
+	min-width: 2rem;
+	height: 6upx;
+	left: 0;
+}
+
+.cu-bar .action.sub-title {
+	position: relative;
+	top: -0.2rem;
+}
+
+.cu-bar .action.sub-title text {
+	position: relative;
+	z-index: 1;
+}
+
+.cu-bar .action.sub-title text[class*="bg-"]:last-child {
+	position: absolute;
+	display: inline-block;
+	bottom: -0.2rem;
+	border-radius: 6upx;
+	width: 100%;
+	height: 0.6rem;
+	left: 0.6rem;
+	opacity: 0.3;
+	z-index: 0;
+}
+
+.cu-bar .action.sub-title text[class*="text-"]:last-child {
+	position: absolute;
+	display: inline-block;
+	bottom: -0.7rem;
+	left: 0.5rem;
+	opacity: 0.2;
+	z-index: 0;
+	text-align: right;
+	font-weight: 900;
+	font-size: 36upx;
+}
+
+.cu-bar.justify-center .action.border-title text:last-child,
+.cu-bar.justify-center .action.sub-title text:last-child {
+	left: 0;
+	right: 0;
+	margin: auto;
+	text-align: center;
+}
+
+.cu-bar .action:first-child {
+	margin-left: 30upx;
+	font-size: 30upx;
+}
+
+.cu-bar .action text.text-cut {
+	text-align: left;
+	width: 100%;
+}
+
+.cu-bar .cu-avatar:first-child {
+	margin-left: 20upx;
+}
+
+.cu-bar .action:first-child>text[class*="cuIcon-"] {
+	margin-left: -0.3em;
+	margin-right: 0.3em;
+}
+
+.cu-bar .action:last-child {
+	margin-right: 30upx;
+}
+
+.cu-bar .action>text[class*="cuIcon-"],
+.cu-bar .action>view[class*="cuIcon-"] {
+	font-size: 36upx;
+}
+
+.cu-bar .action>text[class*="cuIcon-"]+text[class*="cuIcon-"] {
+	margin-left: 0.5em;
+}
+
+.cu-bar .content {
+	position: absolute;
+	text-align: center;
+	width: 100%;
+	left: 2.5%;
+	right: auto;
+	bottom: 0;
+	top: 0;
+	margin: auto;
+	height: 60upx;
+	font-size: 32upx;
+	line-height: 60upx;
+	cursor: none;
+	pointer-events: none;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+	overflow: hidden;
+}
+
+.cu-bar.ios .content {
+	bottom: 7px;
+	height: 30px;
+	font-size: 32upx;
+	line-height: 30px;
+}
+
+.cu-bar.btn-group {
+	justify-content: space-around;
+}
+
+.cu-bar.btn-group button {
+	padding: 20upx 32upx;
+}
+
+.cu-bar.btn-group button {
+	flex: 1;
+	margin: 0 20upx;
+	max-width: 50%;
+}
+
+.cu-bar .search-form {
+	background-color: #f5f5f5;
+	line-height: 64upx;
+	height: 64upx;
+	font-size: 24upx;
+	color: #333333;
+	flex: 1;
+	display: flex;
+	align-items: center;
+	margin: 0 30upx;
+}
+
+.cu-bar .search-form+.action {
+	margin-right: 30upx;
+}
+
+.cu-bar .search-form input {
+	flex: 1;
+	padding-right: 30upx;
+	height: 64upx;
+	line-height: 64upx;
+	font-size: 26upx;
+	background-color: transparent;
+}
+
+.cu-bar .search-form [class*="cuIcon-"] {
+	margin: 0 0.5em 0 0.8em;
+}
+
+.cu-bar .search-form [class*="cuIcon-"]::before {
+	top: 0upx;
+}
+
+.cu-bar.fixed,
+.nav.fixed {
+	position: fixed;
+	width: 100%;
+	top: 0;
+	z-index: 1024;
+	box-shadow: 0 1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.foot {
+	position: fixed;
+	width: 100%;
+	bottom: 0;
+	z-index: 1024;
+	box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.tabbar {
+	padding: 0;
+	height: calc(100upx + env(safe-area-inset-bottom) / 2);
+	padding-bottom: calc(env(safe-area-inset-bottom) / 2);
+}
+
+.cu-tabbar-height {
+	min-height: 100upx;
+	height: calc(100upx + env(safe-area-inset-bottom) / 2);
+}
+
+.cu-bar.tabbar.shadow {
+	box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.tabbar .action {
+	font-size: 22upx;
+	position: relative;
+	flex: 1;
+	text-align: center;
+	padding: 0;
+	display: block;
+	height: auto;
+	line-height: 1;
+	margin: 0;
+	background-color: inherit;
+	overflow: initial;
+}
+
+.cu-bar.tabbar.shop .action {
+	width: 140upx;
+	flex: initial;
+}
+
+.cu-bar.tabbar .action.add-action {
+	position: relative;
+	z-index: 2;
+	padding-top: 50upx;
+}
+
+.cu-bar.tabbar .action.add-action [class*="cuIcon-"] {
+	position: absolute;
+	width: 70upx;
+	z-index: 2;
+	height: 70upx;
+	border-radius: 50%;
+	line-height: 70upx;
+	font-size: 50upx;
+	top: -35upx;
+	left: 0;
+	right: 0;
+	margin: auto;
+	padding: 0;
+}
+
+.cu-bar.tabbar .action.add-action::after {
+	content: "";
+	position: absolute;
+	width: 100upx;
+	height: 100upx;
+	top: -50upx;
+	left: 0;
+	right: 0;
+	margin: auto;
+	box-shadow: 0 -3upx 8upx rgba(0, 0, 0, 0.08);
+	border-radius: 50upx;
+	background-color: inherit;
+	z-index: 0;
+}
+
+.cu-bar.tabbar .action.add-action::before {
+	content: "";
+	position: absolute;
+	width: 100upx;
+	height: 30upx;
+	bottom: 30upx;
+	left: 0;
+	right: 0;
+	margin: auto;
+	background-color: inherit;
+	z-index: 1;
+}
+
+.cu-bar.tabbar .btn-group {
+	flex: 1;
+	display: flex;
+	justify-content: space-around;
+	align-items: center;
+	padding: 0 10upx;
+}
+
+.cu-bar.tabbar button.action::after {
+	border: 0;
+}
+
+.cu-bar.tabbar .action [class*="cuIcon-"] {
+	width: 100upx;
+	position: relative;
+	display: block;
+	height: auto;
+	margin: 0 auto 10upx;
+	text-align: center;
+	font-size: 40upx;
+}
+
+.cu-bar.tabbar .action .cuIcon-cu-image {
+	margin: 0 auto;
+}
+
+.cu-bar.tabbar .action .cuIcon-cu-image image {
+	width: 50upx;
+	height: 50upx;
+	display: inline-block;
+}
+
+.cu-bar.tabbar .submit {
+	align-items: center;
+	display: flex;
+	justify-content: center;
+	text-align: center;
+	position: relative;
+	flex: 2;
+	align-self: stretch;
+}
+
+.cu-bar.tabbar .submit:last-child {
+	flex: 2.6;
+}
+
+.cu-bar.tabbar .submit+.submit {
+	flex: 2;
+}
+
+.cu-bar.tabbar.border .action::before {
+	content: " ";
+	width: 200%;
+	height: 200%;
+	position: absolute;
+	top: 0;
+	left: 0;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	border-right: 1upx solid rgba(0, 0, 0, 0.1);
+	z-index: 3;
+}
+
+.cu-bar.tabbar.border .action:last-child:before {
+	display: none;
+}
+
+.cu-bar.input {
+	padding-right: 20upx;
+	background-color: #ffffff;
+}
+
+.cu-bar.input input {
+	overflow: initial;
+	line-height: 64upx;
+	height: 64upx;
+	min-height: 64upx;
+	flex: 1;
+	font-size: 30upx;
+	margin: 0 20upx;
+}
+
+.cu-bar.input .action {
+	margin-left: 20upx;
+}
+
+.cu-bar.input .action [class*="cuIcon-"] {
+	font-size: 48upx;
+}
+
+.cu-bar.input input+.action {
+	margin-right: 20upx;
+	margin-left: 0upx;
+}
+
+.cu-bar.input .action:first-child [class*="cuIcon-"] {
+	margin-left: 0upx;
+}
+
+.cu-custom {
+	display: block;
+	position: relative;
+}
+
+.cu-custom .cu-bar .content {
+	width: calc(100% - 44upx);
+}
+
+/* #ifdef MP-ALIPAY */
+.cu-custom .cu-bar .action .cuIcon-back {
+	opacity: 0;
+}
+
+/* #endif */
+
+.cu-custom .cu-bar .content image {
+	height: 60upx;
+	width: 240upx;
+}
+
+.cu-custom .cu-bar {
+	min-height: 0px;
+	/* #ifdef MP-WEIXIN */
+	padding-right: 220upx;
+	/* #endif */
+	/* #ifdef MP-ALIPAY */
+	padding-right: 150upx;
+	/* #endif */
+	box-shadow: 0upx 0upx 0upx;
+	z-index: 9999;
+}
+
+.cu-custom .cu-bar .border-custom {
+	position: relative;
+	background: rgba(0, 0, 0, 0.15);
+	border-radius: 1000upx;
+	height: 30px;
+}
+
+.cu-custom .cu-bar .border-custom::after {
+	content: " ";
+	width: 200%;
+	height: 200%;
+	position: absolute;
+	top: 0;
+	left: 0;
+	border-radius: inherit;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	pointer-events: none;
+	box-sizing: border-box;
+	border: 1upx solid #ffffff;
+	opacity: 0.5;
+}
+
+.cu-custom .cu-bar .border-custom::before {
+	content: " ";
+	width: 1upx;
+	height: 110%;
+	position: absolute;
+	top: 22.5%;
+	left: 0;
+	right: 0;
+	margin: auto;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	pointer-events: none;
+	box-sizing: border-box;
+	opacity: 0.6;
+	background-color: #ffffff;
+}
+
+.cu-custom .cu-bar .border-custom text {
+	display: block;
+	flex: 1;
+	margin: auto !important;
+	text-align: center;
+	font-size: 34upx;
+}
+
+/* ==================
+         导航栏
+ ==================== */
+
+.nav {
+	white-space: nowrap;
+}
+
+::-webkit-scrollbar {
+	display: none;
+}
+
+.nav .cu-item {
+	height: 90upx;
+	display: inline-block;
+	line-height: 90upx;
+	margin: 0 10upx;
+	padding: 0 20upx;
+}
+
+.nav .cu-item.cur {
+	border-bottom: 4upx solid;
+}
+
+/* ==================
+         时间轴
+ ==================== */
+
+.cu-timeline {
+	display: block;
+	background-color: #ffffff;
+}
+
+.cu-timeline .cu-time {
+	width: 120upx;
+	text-align: center;
+	padding: 20upx 0;
+	font-size: 26upx;
+	color: #888;
+	display: block;
+}
+
+.cu-timeline>.cu-item {
+	padding: 30upx 30upx 30upx 120upx;
+	position: relative;
+	display: block;
+	z-index: 0;
+}
+
+.cu-timeline>.cu-item:not([class*="text-"]) {
+	color: #ccc;
+}
+
+.cu-timeline>.cu-item::after {
+	content: "";
+	display: block;
+	position: absolute;
+	width: 1upx;
+	background-color: #ddd;
+	left: 60upx;
+	height: 100%;
+	top: 0;
+	z-index: 8;
+}
+
+.cu-timeline>.cu-item::before {
+	font-family: "cuIcon";
+	display: block;
+	position: absolute;
+	top: 36upx;
+	z-index: 9;
+	background-color: #ffffff;
+	width: 50upx;
+	height: 50upx;
+	text-align: center;
+	border: none;
+	line-height: 50upx;
+	left: 36upx;
+}
+
+.cu-timeline>.cu-item:not([class*="cuIcon-"])::before {
+	content: "\e763";
+}
+
+.cu-timeline>.cu-item[class*="cuIcon-"]::before {
+	background-color: #ffffff;
+	width: 50upx;
+	height: 50upx;
+	text-align: center;
+	border: none;
+	line-height: 50upx;
+	left: 36upx;
+}
+
+.cu-timeline>.cu-item>.content {
+	padding: 30upx;
+	border-radius: 6upx;
+	display: block;
+	line-height: 1.6;
+}
+
+.cu-timeline>.cu-item>.content:not([class*="bg-"]) {
+	background-color: #f1f1f1;
+	color: #333333;
+}
+
+.cu-timeline>.cu-item>.content+.content {
+	margin-top: 20upx;
+}
+
+/* ==================
+         聊天
+ ==================== */
+
+.cu-chat {
+	display: flex;
+	flex-direction: column;
+}
+
+.cu-chat .cu-item {
+	display: flex;
+	padding: 30upx 30upx 70upx;
+	position: relative;
+}
+
+.cu-chat .cu-item>.cu-avatar {
+	width: 80upx;
+	height: 80upx;
+}
+
+.cu-chat .cu-item>.main {
+	max-width: calc(100% - 260upx);
+	margin: 0 40upx;
+	display: flex;
+	align-items: center;
+}
+
+.cu-chat .cu-item>image {
+	height: 320upx;
+}
+
+.cu-chat .cu-item>.main .content {
+	padding: 20upx;
+	border-radius: 6upx;
+	display: inline-flex;
+	max-width: 100%;
+	align-items: center;
+	font-size: 30upx;
+	position: relative;
+	min-height: 80upx;
+	line-height: 40upx;
+	text-align: left;
+}
+
+.cu-chat .cu-item>.main .content:not([class*="bg-"]) {
+	background-color: #ffffff;
+	color: #333333;
+}
+
+.cu-chat .cu-item .date {
+	position: absolute;
+	font-size: 24upx;
+	color: #8799a3;
+	width: calc(100% - 320upx);
+	bottom: 20upx;
+	left: 160upx;
+}
+
+.cu-chat .cu-item .action {
+	padding: 0 30upx;
+	display: flex;
+	align-items: center;
+}
+
+.cu-chat .cu-item>.main .content::after {
+	content: "";
+	top: 27upx;
+	transform: rotate(45deg);
+	position: absolute;
+	z-index: 100;
+	display: inline-block;
+	overflow: hidden;
+	width: 24upx;
+	height: 24upx;
+	left: -12upx;
+	right: initial;
+	background-color: inherit;
+}
+
+.cu-chat .cu-item.self>.main .content::after {
+	left: auto;
+	right: -12upx;
+}
+
+.cu-chat .cu-item>.main .content::before {
+	content: "";
+	top: 30upx;
+	transform: rotate(45deg);
+	position: absolute;
+	z-index: -1;
+	display: inline-block;
+	overflow: hidden;
+	width: 24upx;
+	height: 24upx;
+	left: -12upx;
+	right: initial;
+	background-color: inherit;
+	filter: blur(5upx);
+	opacity: 0.3;
+}
+
+.cu-chat .cu-item>.main .content:not([class*="bg-"])::before {
+	background-color: #333333;
+	opacity: 0.1;
+}
+
+.cu-chat .cu-item.self>.main .content::before {
+	left: auto;
+	right: -12upx;
+}
+
+.cu-chat .cu-item.self {
+	justify-content: flex-end;
+	text-align: right;
+}
+
+.cu-chat .cu-info {
+	display: inline-block;
+	margin: 20upx auto;
+	font-size: 24upx;
+	padding: 8upx 12upx;
+	background-color: rgba(0, 0, 0, 0.2);
+	border-radius: 6upx;
+	color: #ffffff;
+	max-width: 400upx;
+	line-height: 1.4;
+}
+
+/* ==================
+         卡片
+ ==================== */
+
+.cu-card {
+	display: block;
+	overflow: hidden;
+}
+
+.cu-card>.cu-item {
+	display: block;
+	background-color: #ffffff;
+	overflow: hidden;
+	border-radius: 10upx;
+	margin: 30upx;
+}
+
+.cu-card>.cu-item.shadow-blur {
+	overflow: initial;
+}
+
+.cu-card.no-card>.cu-item {
+	margin: 0upx;
+	border-radius: 0upx;
+}
+
+.cu-card .grid.grid-square {
+	margin-bottom: -20upx;
+}
+
+.cu-card.case .image {
+	position: relative;
+}
+
+.cu-card.case .image image {
+	width: 100%;
+}
+
+.cu-card.case .image .cu-tag {
+	position: absolute;
+	right: 0;
+	top: 0;
+}
+
+.cu-card.case .image .cu-bar {
+	position: absolute;
+	bottom: 0;
+	width: 100%;
+	background-color: transparent;
+	padding: 0upx 30upx;
+}
+
+.cu-card.case.no-card .image {
+	margin: 30upx 30upx 0;
+	overflow: hidden;
+	border-radius: 10upx;
+}
+
+.cu-card.dynamic {
+	display: block;
+}
+
+.cu-card.dynamic>.cu-item {
+	display: block;
+	background-color: #ffffff;
+	overflow: hidden;
+}
+
+.cu-card.dynamic>.cu-item>.text-content {
+	padding: 0 30upx 0;
+	max-height: 6.4em;
+	overflow: hidden;
+	font-size: 30upx;
+	margin-bottom: 20upx;
+}
+
+.cu-card.dynamic>.cu-item .square-img {
+	width: 100%;
+	height: 200upx;
+	border-radius: 6upx;
+}
+
+.cu-card.dynamic>.cu-item .only-img {
+	width: 100%;
+	height: 320upx;
+	border-radius: 6upx;
+}
+
+/* card.dynamic>.cu-item .comment {
+  padding: 20upx;
+  background-color: #f1f1f1;
+  margin: 0 30upx 30upx;
+  border-radius: 6upx;
+} */
+
+.cu-card.article {
+	display: block;
+}
+
+.cu-card.article>.cu-item {
+	padding-bottom: 30upx;
+}
+
+.cu-card.article>.cu-item .title {
+	font-size: 30upx;
+	font-weight: 900;
+	color: #333333;
+	line-height: 100upx;
+	padding: 0 30upx;
+}
+
+.cu-card.article>.cu-item .content {
+	display: flex;
+	padding: 0 30upx;
+}
+
+.cu-card.article>.cu-item .content>image {
+	width: 240upx;
+	height: 6.4em;
+	margin-right: 20upx;
+	border-radius: 6upx;
+}
+
+.cu-card.article>.cu-item .content .desc {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	justify-content: space-between;
+}
+
+.cu-card.article>.cu-item .content .text-content {
+	font-size: 28upx;
+	color: #888;
+	height: 4.8em;
+	overflow: hidden;
+}
+
+/* ==================
+         表单
+ ==================== */
+
+.cu-form-group {
+	background-color: #ffffff;
+	padding: 1upx 30upx;
+	display: flex;
+	align-items: center;
+	min-height: 100upx;
+	justify-content: space-between;
+}
+
+.cu-form-group+.cu-form-group {
+	border-top: 1upx solid #eee;
+}
+
+.cu-form-group .title {
+	text-align: justify;
+	padding-right: 30upx;
+	font-size: 30upx;
+	position: relative;
+	height: 60upx;
+	line-height: 60upx;
+}
+
+.cu-form-group input {
+	flex: 1;
+	font-size: 30upx;
+	color: #555;
+	padding-right: 20upx;
+	text-align: right;
+}
+
+.cu-form-group>text[class*="cuIcon-"] {
+	font-size: 36upx;
+	padding: 0;
+	box-sizing: border-box;
+}
+
+.cu-form-group textarea {
+	margin: 32upx 0 30upx;
+	height: 4.6em;
+	width: 100%;
+	line-height: 1.2em;
+	flex: 1;
+	font-size: 28upx;
+	padding: 0;
+}
+
+.cu-form-group.align-start .title {
+	height: 1em;
+	margin-top: 32upx;
+	line-height: 1em;
+}
+
+.cu-form-group picker {
+	flex: 1;
+	padding-right: 40upx;
+	overflow: hidden;
+	position: relative;
+}
+
+.cu-form-group picker .picker {
+	line-height: 100upx;
+	font-size: 28upx;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+	overflow: hidden;
+	width: 100%;
+	text-align: right;
+}
+
+.cu-form-group picker::after {
+	font-family: cuIcon;
+	display: block;
+	content: "\e6a3";
+	position: absolute;
+	font-size: 34upx;
+	color: #8799a3;
+	line-height: 100upx;
+	width: 60upx;
+	text-align: center;
+	top: 0;
+	bottom: 0;
+	right: -20upx;
+	margin: auto;
+}
+
+.cu-form-group textarea[disabled],
+.cu-form-group textarea[disabled] .placeholder {
+	color: transparent;
+}
+
+/* ==================
+         模态窗口
+ ==================== */
+
+.cu-modal {
+	position: fixed;
+	top: 0;
+	right: 0;
+	bottom: 0;
+	left: 0;
+	z-index: 1110;
+	opacity: 0;
+	outline: 0;
+	text-align: center;
+	-ms-transform: scale(1.185);
+	transform: scale(1.185);
+	backface-visibility: hidden;
+	perspective: 2000upx;
+	background: rgba(0, 0, 0, 0.6);
+	transition: all 0.3s ease-in-out 0s;
+	pointer-events: none;
+}
+
+
+
+
+.cu-modal::before {
+	content: "\200B";
+	display: inline-block;
+	height: 100%;
+	vertical-align: middle;
+}
+.cu-rule-modal{
+	-ms-transform: scale(0);
+	transform: scale(0);
+	transform-origin: 0% 90%;
+	transition: all 0.6s ease-in-out 0s;
+}
+
+.cu-modal.show {
+	opacity: 1;
+	transition-duration: 0.6s;
+	-ms-transform: scale(1);
+	transform: scale(1);
+	overflow-x: hidden;
+	overflow-y: auto;
+	pointer-events: auto;
+}
+
+.cu-dialog {
+	position: relative;
+	display: inline-block;
+	vertical-align: middle;
+	margin-left: auto;
+	margin-right: auto;
+	width: 680upx;
+	max-width: 100%;
+	background-color: #f8f8f8;
+	border-radius: 10upx;
+	overflow: hidden;
+}
+
+.cu-modal.bottom-modal::before {
+	vertical-align: bottom;
+}
+
+.cu-modal.bottom-modal .cu-dialog {
+	width: 100%;
+	border-radius: 0;
+}
+
+.cu-modal.bottom-modal {
+	margin-bottom: -1000upx;
+}
+
+.cu-modal.bottom-modal.show {
+	margin-bottom: 0;
+}
+
+.cu-modal.drawer-modal {
+	transform: scale(1);
+	display: flex;
+}
+
+.cu-modal.drawer-modal .cu-dialog {
+	height: 100%;
+	min-width: 200upx;
+	border-radius: 0;
+	margin: initial;
+	transition-duration: 0.3s;
+}
+
+.cu-modal.drawer-modal.justify-start .cu-dialog {
+	transform: translateX(-100%);
+}
+
+.cu-modal.drawer-modal.justify-end .cu-dialog {
+	transform: translateX(100%);
+}
+
+.cu-modal.drawer-modal.show .cu-dialog {
+	transform: translateX(0%);
+}
+.cu-modal .cu-dialog>.cu-bar:first-child .action{
+  min-width: 100rpx;
+  margin-right: 0;
+  min-height: 100rpx;
+}
+/* ==================
+         轮播
+ ==================== */
+swiper .a-swiper-dot {
+	display: inline-block;
+	width: 16upx;
+	height: 16upx;
+	background: rgba(0, 0, 0, .3);
+	border-radius: 50%;
+	vertical-align: middle;
+}
+
+swiper[class*="-dot"] .wx-swiper-dots,
+swiper[class*="-dot"] .a-swiper-dots,
+swiper[class*="-dot"] .uni-swiper-dots {
+	display: flex;
+	align-items: center;
+	width: 100%;
+	justify-content: center;
+}
+
+swiper.square-dot .wx-swiper-dot,
+swiper.square-dot .a-swiper-dot,
+swiper.square-dot .uni-swiper-dot {
+	background-color: #ffffff;
+	opacity: 0.4;
+	width: 10upx;
+	height: 10upx;
+	border-radius: 20upx;
+	margin: 0 8upx !important;
+}
+
+swiper.square-dot .wx-swiper-dot.wx-swiper-dot-active,
+swiper.square-dot .a-swiper-dot.a-swiper-dot-active,
+swiper.square-dot .uni-swiper-dot.uni-swiper-dot-active {
+	opacity: 1;
+	width: 30upx;
+}
+
+swiper.round-dot .wx-swiper-dot,
+swiper.round-dot .a-swiper-dot,
+swiper.round-dot .uni-swiper-dot {
+	width: 10upx;
+	height: 10upx;
+	position: relative;
+	margin: 4upx 8upx !important;
+}
+
+swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active::after,
+swiper.round-dot .a-swiper-dot.a-swiper-dot-active::after,
+swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active::after {
+	content: "";
+	position: absolute;
+	width: 10upx;
+	height: 10upx;
+	top: 0upx;
+	left: 0upx;
+	right: 0;
+	bottom: 0;
+	margin: auto;
+	background-color: #ffffff;
+	border-radius: 20upx;
+}
+
+swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active,
+swiper.round-dot .a-swiper-dot.a-swiper-dot-active,
+swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active {
+	width: 18upx;
+	height: 18upx;
+}
+
+.screen-swiper {
+	min-height: 375upx;
+}
+
+.screen-swiper image,
+.screen-swiper video,
+.swiper-item image,
+.swiper-item video {
+	width: 100%;
+	display: block;
+	height: 100%;
+	margin: 0;
+	pointer-events: none;
+}
+
+.card-swiper {
+	height: 420upx !important;
+}
+
+.card-swiper swiper-item {
+	width: 610upx !important;
+	left: 70upx;
+	box-sizing: border-box;
+	padding: 40upx 0upx 70upx;
+	overflow: initial;
+}
+
+.card-swiper swiper-item .swiper-item {
+	width: 100%;
+	display: block;
+	height: 100%;
+	border-radius: 10upx;
+	transform: scale(0.9);
+	transition: all 0.2s ease-in 0s;
+	overflow: hidden;
+}
+
+.card-swiper swiper-item.cur .swiper-item {
+	transform: none;
+	transition: all 0.2s ease-in 0s;
+}
+
+
+.tower-swiper {
+	height: 420upx;
+	position: relative;
+	max-width: 750upx;
+	overflow: hidden;
+}
+
+.tower-swiper .tower-item {
+	position: absolute;
+	width: 300upx;
+	height: 380upx;
+	top: 0;
+	bottom: 0;
+	left: 50%;
+	margin: auto;
+	transition: all 0.2s ease-in 0s;
+	opacity: 1;
+}
+
+.tower-swiper .tower-item.none {
+	opacity: 0;
+}
+
+.tower-swiper .tower-item .swiper-item {
+	width: 100%;
+	height: 100%;
+	border-radius: 6upx;
+	overflow: hidden;
+}
+
+/* ==================
+          步骤条
+ ==================== */
+
+.cu-steps {
+	display: flex;
+}
+
+scroll-view.cu-steps {
+	display: block;
+	white-space: nowrap;
+}
+
+scroll-view.cu-steps .cu-item {
+	display: inline-block;
+}
+
+.cu-steps .cu-item {
+	flex: 1;
+	text-align: center;
+	position: relative;
+	min-width: 100upx;
+}
+
+.cu-steps .cu-item:not([class*="text-"]) {
+	color: #8799a3;
+}
+
+.cu-steps .cu-item [class*="cuIcon-"],
+.cu-steps .cu-item .num {
+	display: block;
+	font-size: 40upx;
+	line-height: 80upx;
+}
+
+.cu-steps .cu-item::before,
+.cu-steps .cu-item::after,
+.cu-steps.steps-arrow .cu-item::before,
+.cu-steps.steps-arrow .cu-item::after {
+	content: "";
+	display: block;
+	position: absolute;
+	height: 0px;
+	width: calc(100% - 80upx);
+	border-bottom: 1px solid #ccc;
+	left: calc(0px - (100% - 80upx) / 2);
+	top: 40upx;
+	z-index: 0;
+}
+
+.cu-steps.steps-arrow .cu-item::before,
+.cu-steps.steps-arrow .cu-item::after {
+	content: "\e6a3";
+	font-family: 'cuIcon';
+	height: 30upx;
+	border-bottom-width: 0px;
+	line-height: 30upx;
+	top: 0;
+	bottom: 0;
+	margin: auto;
+	color: #ccc;
+}
+
+.cu-steps.steps-bottom .cu-item::before,
+.cu-steps.steps-bottom .cu-item::after {
+	bottom: 40upx;
+	top: initial;
+}
+
+.cu-steps .cu-item::after {
+	border-bottom: 1px solid currentColor;
+	width: 0px;
+	transition: all 0.3s ease-in-out 0s;
+}
+
+.cu-steps .cu-item[class*="text-"]::after {
+	width: calc(100% - 80upx);
+	color: currentColor;
+}
+
+.cu-steps .cu-item:first-child::before,
+.cu-steps .cu-item:first-child::after {
+	display: none;
+}
+
+.cu-steps .cu-item .num {
+	width: 40upx;
+	height: 40upx;
+	border-radius: 50%;
+	line-height: 40upx;
+	margin: 20upx auto;
+	font-size: 24upx;
+	border: 1px solid currentColor;
+	position: relative;
+	overflow: hidden;
+}
+
+.cu-steps .cu-item[class*="text-"] .num {
+	background-color: currentColor;
+}
+
+.cu-steps .cu-item .num::before,
+.cu-steps .cu-item .num::after {
+	content: attr(data-index);
+	position: absolute;
+	left: 0;
+	right: 0;
+	top: 0;
+	bottom: 0;
+	margin: auto;
+	transition: all 0.3s ease-in-out 0s;
+	transform: translateY(0upx);
+}
+
+.cu-steps .cu-item[class*="text-"] .num::before {
+	transform: translateY(-40upx);
+	color: #ffffff;
+}
+
+.cu-steps .cu-item .num::after {
+	transform: translateY(40upx);
+	color: #ffffff;
+	transition: all 0.3s ease-in-out 0s;
+}
+
+.cu-steps .cu-item[class*="text-"] .num::after {
+	content: "\e645";
+	font-family: 'cuIcon';
+	color: #ffffff;
+	transform: translateY(0upx);
+}
+
+.cu-steps .cu-item[class*="text-"] .num.err::after {
+	content: "\e646";
+}
+
+/* ==================
+          布局
+ ==================== */
+
+/*  -- flex弹性布局 -- */
+
+.flex {
+	display: flex;
+}
+
+.basis-xs {
+	flex-basis: 20%;
+}
+
+.basis-sm {
+	flex-basis: 40%;
+}
+
+.basis-df {
+	flex-basis: 50%;
+}
+
+.basis-lg {
+	flex-basis: 60%;
+}
+
+.basis-xl {
+	flex-basis: 80%;
+}
+
+.flex-sub {
+	flex: 1;
+}
+
+.flex-twice {
+	flex: 2;
+}
+
+.flex-treble {
+	flex: 3;
+}
+
+.flex-direction {
+	flex-direction: column;
+}
+
+.flex-wrap {
+	flex-wrap: wrap;
+}
+
+.align-start {
+	align-items: flex-start;
+}
+
+.align-end {
+	align-items: flex-end;
+}
+
+.align-center {
+	align-items: center;
+}
+
+.align-stretch {
+	align-items: stretch;
+}
+
+.self-start {
+	align-self: flex-start;
+}
+
+.self-center {
+	align-self: flex-center;
+}
+
+.self-end {
+	align-self: flex-end;
+}
+
+.self-stretch {
+	align-self: stretch;
+}
+
+.align-stretch {
+	align-items: stretch;
+}
+
+.justify-start {
+	justify-content: flex-start;
+}
+
+.justify-end {
+	justify-content: flex-end;
+}
+
+.justify-center {
+	justify-content: center;
+}
+
+.justify-between {
+	justify-content: space-between;
+}
+
+.justify-around {
+	justify-content: space-around;
+}
+
+/* grid布局 */
+
+.grid {
+	display: flex;
+	flex-wrap: wrap;
+}
+
+.grid.grid-square {
+	overflow: hidden;
+}
+
+.grid.grid-square .cu-tag {
+	position: absolute;
+	right: 0;
+	top: 0;
+	border-bottom-left-radius: 6upx;
+	padding: 6upx 12upx;
+	height: auto;
+	background-color: rgba(0, 0, 0, 0.5);
+}
+
+.grid.grid-square>view>text[class*="cuIcon-"] {
+	font-size: 52upx;
+	position: absolute;
+	color: #8799a3;
+	margin: auto;
+	top: 0;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	flex-direction: column;
+}
+
+.grid.grid-square>view {
+	margin-right: 20upx;
+	margin-bottom: 20upx;
+	border-radius: 6upx;
+	position: relative;
+	overflow: hidden;
+}
+.grid.grid-square>view.bg-img image {
+	width: 100%;
+	height: 100%;
+	position: absolute;
+}
+.grid.col-1.grid-square>view {
+	padding-bottom: 100%;
+	height: 0;
+	margin-right: 0;
+}
+
+.grid.col-2.grid-square>view {
+	padding-bottom: calc((100% - 20upx)/2);
+	height: 0;
+	width: calc((100% - 20upx)/2);
+}
+
+.grid.col-3.grid-square>view {
+	padding-bottom: calc((100% - 40upx)/3);
+	height: 0;
+	width: calc((100% - 40upx)/3);
+}
+
+.grid.col-4.grid-square>view {
+	padding-bottom: calc((100% - 60upx)/4);
+	height: 0;
+	width: calc((100% - 60upx)/4);
+}
+
+.grid.col-5.grid-square>view {
+	padding-bottom: calc((100% - 80upx)/5);
+	height: 0;
+	width: calc((100% - 80upx)/5);
+}
+
+.grid.col-2.grid-square>view:nth-child(2n),
+.grid.col-3.grid-square>view:nth-child(3n),
+.grid.col-4.grid-square>view:nth-child(4n),
+.grid.col-5.grid-square>view:nth-child(5n) {
+	margin-right: 0;
+}
+
+.grid.col-1>view {
+	width: 100%;
+}
+
+.grid.col-2>view {
+	width: 50%;
+}
+
+.grid.col-3>view {
+	width: 33.33%;
+}
+
+.grid.col-4>view {
+	width: 25%;
+}
+
+.grid.col-5>view {
+	width: 20%;
+}
+
+/*  -- 内外边距 -- */
+
+.margin-0 {
+	margin: 0;
+}
+
+.margin-xs {
+	margin: 10upx;
+}
+
+.margin-sm {
+	margin: 20upx;
+}
+
+.margin {
+	margin: 30upx;
+}
+
+.margin-lg {
+	margin: 40upx;
+}
+
+.margin-xl {
+	margin: 50upx;
+}
+
+.margin-top-xs {
+	margin-top: 10upx;
+}
+
+.margin-top-sm {
+	margin-top: 20upx;
+}
+
+.margin-top {
+	margin-top: 30upx;
+}
+
+.margin-top-lg {
+	margin-top: 40upx;
+}
+
+.margin-top-xl {
+	margin-top: 50upx;
+}
+
+.margin-right-xs {
+	margin-right: 10upx;
+}
+
+.margin-right-sm {
+	margin-right: 20upx;
+}
+
+.margin-right {
+	margin-right: 30upx;
+}
+
+.margin-right-lg {
+	margin-right: 40upx;
+}
+
+.margin-right-xl {
+	margin-right: 50upx;
+}
+
+.margin-bottom-xs {
+	margin-bottom: 10upx;
+}
+
+.margin-bottom-sm {
+	margin-bottom: 20upx;
+}
+
+.margin-bottom {
+	margin-bottom: 30upx;
+}
+
+.margin-bottom-lg {
+	margin-bottom: 40upx;
+}
+
+.margin-bottom-xl {
+	margin-bottom: 50upx;
+}
+
+.margin-left-xs {
+	margin-left: 10upx;
+}
+
+.margin-left-sm {
+	margin-left: 20upx;
+}
+
+.margin-left {
+	margin-left: 30upx;
+}
+
+.margin-left-lg {
+	margin-left: 40upx;
+}
+
+.margin-left-xl {
+	margin-left: 50upx;
+}
+
+.margin-lr-xs {
+	margin-left: 10upx;
+	margin-right: 10upx;
+}
+
+.margin-lr-sm {
+	margin-left: 20upx;
+	margin-right: 20upx;
+}
+
+.margin-lr {
+	margin-left: 30upx;
+	margin-right: 30upx;
+}
+
+.margin-lr-lg {
+	margin-left: 40upx;
+	margin-right: 40upx;
+}
+
+.margin-lr-xl {
+	margin-left: 50upx;
+	margin-right: 50upx;
+}
+
+.margin-tb-xs {
+	margin-top: 10upx;
+	margin-bottom: 10upx;
+}
+
+.margin-tb-sm {
+	margin-top: 20upx;
+	margin-bottom: 20upx;
+}
+
+.margin-tb {
+	margin-top: 30upx;
+	margin-bottom: 30upx;
+}
+
+.margin-tb-lg {
+	margin-top: 40upx;
+	margin-bottom: 40upx;
+}
+
+.margin-tb-xl {
+	margin-top: 50upx;
+	margin-bottom: 50upx;
+}
+
+.padding-0 {
+	padding: 0;
+}
+
+.padding-xs {
+	padding: 10upx;
+}
+
+.padding-sm {
+	padding: 20upx;
+}
+
+.padding {
+	padding: 30upx;
+}
+
+.padding-lg {
+	padding: 40upx;
+}
+
+.padding-xl {
+	padding: 50upx;
+}
+
+.padding-top-xs {
+	padding-top: 10upx;
+}
+
+.padding-top-sm {
+	padding-top: 20upx;
+}
+
+.padding-top {
+	padding-top: 30upx;
+}
+
+.padding-top-lg {
+	padding-top: 40upx;
+}
+
+.padding-top-xl {
+	padding-top: 50upx;
+}
+
+.padding-right-xs {
+	padding-right: 10upx;
+}
+
+.padding-right-sm {
+	padding-right: 20upx;
+}
+
+.padding-right {
+	padding-right: 30upx;
+}
+
+.padding-right-lg {
+	padding-right: 40upx;
+}
+
+.padding-right-xl {
+	padding-right: 50upx;
+}
+
+.padding-bottom-xs {
+	padding-bottom: 10upx;
+}
+
+.padding-bottom-sm {
+	padding-bottom: 20upx;
+}
+
+.padding-bottom {
+	padding-bottom: 30upx;
+}
+
+.padding-bottom-lg {
+	padding-bottom: 40upx;
+}
+
+.padding-bottom-xl {
+	padding-bottom: 50upx;
+}
+
+.padding-left-xs {
+	padding-left: 10upx;
+}
+
+.padding-left-sm {
+	padding-left: 20upx;
+}
+
+.padding-left {
+	padding-left: 30upx;
+}
+
+.padding-left-lg {
+	padding-left: 40upx;
+}
+
+.padding-left-xl {
+	padding-left: 50upx;
+}
+
+.padding-lr-xs {
+	padding-left: 10upx;
+	padding-right: 10upx;
+}
+
+.padding-lr-sm {
+	padding-left: 20upx;
+	padding-right: 20upx;
+}
+
+.padding-lr {
+	padding-left: 30upx;
+	padding-right: 30upx;
+}
+
+.padding-lr-lg {
+	padding-left: 40upx;
+	padding-right: 40upx;
+}
+
+.padding-lr-xl {
+	padding-left: 50upx;
+	padding-right: 50upx;
+}
+
+.padding-tb-xs {
+	padding-top: 10upx;
+	padding-bottom: 10upx;
+}
+
+.padding-tb-sm {
+	padding-top: 20upx;
+	padding-bottom: 20upx;
+}
+
+.padding-tb {
+	padding-top: 30upx;
+	padding-bottom: 30upx;
+}
+
+.padding-tb-lg {
+	padding-top: 40upx;
+	padding-bottom: 40upx;
+}
+
+.padding-tb-xl {
+	padding-top: 50upx;
+	padding-bottom: 50upx;
+}
+
+/* -- 浮动 --  */
+
+.cf::after,
+.cf::before {
+	content: " ";
+	display: table;
+}
+
+.cf::after {
+	clear: both;
+}
+
+.fl {
+	float: left;
+}
+
+.fr {
+	float: right;
+}
+
+/* ==================
+          背景
+ ==================== */
+
+.line-red::after,
+.lines-red::after {
+	border-color: #e54d42;
+}
+
+.line-orange::after,
+.lines-orange::after {
+	border-color: #f37b1d;
+}
+
+.line-yellow::after,
+.lines-yellow::after {
+	border-color: #fbbd08;
+}
+
+.line-olive::after,
+.lines-olive::after {
+	border-color: #8dc63f;
+}
+
+.line-green::after,
+.lines-green::after {
+	border-color: #39b54a;
+}
+
+.line-cyan::after,
+.lines-cyan::after {
+	border-color: #1cbbb4;
+}
+
+.line-blue::after,
+.lines-blue::after {
+	border-color: #0081ff;
+}
+
+.line-purple::after,
+.lines-purple::after {
+	border-color: #6739b6;
+}
+
+.line-mauve::after,
+.lines-mauve::after {
+	border-color: #9c26b0;
+}
+
+.line-pink::after,
+.lines-pink::after {
+	border-color: #e03997;
+}
+
+.line-brown::after,
+.lines-brown::after {
+	border-color: #a5673f;
+}
+
+.line-grey::after,
+.lines-grey::after {
+	border-color: #8799a3;
+}
+
+.line-gray::after,
+.lines-gray::after {
+	border-color: #aaaaaa;
+}
+
+.line-black::after,
+.lines-black::after {
+	border-color: #333333;
+}
+
+.line-white::after,
+.lines-white::after {
+	border-color: #ffffff;
+}
+
+.bg-red {
+	background-color: #e54d42;
+	color: #ffffff;
+}
+
+.bg-orange {
+	background-color: #f37b1d;
+	color: #ffffff;
+}
+
+.bg-yellow {
+	background-color: #fbbd08;
+	color: #333333;
+}
+
+.bg-olive {
+	background-color: #8dc63f;
+	color: #ffffff;
+}
+
+.bg-green {
+	background-color: #39b54a;
+	color: #ffffff;
+}
+
+.bg-cyan {
+	background-color: #1cbbb4;
+	color: #ffffff;
+}
+
+.bg-blue {
+	background-color: #0081ff;
+	color: #ffffff;
+}
+
+.bg-purple {
+	background-color: #6739b6;
+	color: #ffffff;
+}
+
+.bg-mauve {
+	background-color: #9c26b0;
+	color: #ffffff;
+}
+
+.bg-pink {
+	background-color: #e03997;
+	color: #ffffff;
+}
+
+.bg-brown {
+	background-color: #a5673f;
+	color: #ffffff;
+}
+
+.bg-grey {
+	background-color: #8799a3;
+	color: #ffffff;
+}
+
+.bg-gray {
+	background-color: #f0f0f0;
+	color: #333333;
+}
+
+.bg-black {
+	background-color: #333333;
+	color: #ffffff;
+}
+
+.bg-white {
+	background-color: #ffffff;
+	color: #666666;
+}
+
+.bg-suncolor1 {
+	background-color: #B0E9FC;
+	color: #333333;
+}
+.bg-sancolor{
+	background-color: #33825F;
+	color: #ffffff;
+}
+
+.bg-shadeTop {
+	background-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.01));
+	color: #ffffff;
+}
+
+.bg-shadeBottom {
+	background-image: linear-gradient(rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 1));
+	color: #ffffff;
+}
+
+.bg-red.light {
+	color: #e54d42!important;
+	background-color: #fadbd9!important;
+}
+
+.bg-orange.light {
+	color: #f37b1d!important;
+	background-color: #fde6d2!important;
+}
+
+.bg-yellow.light {
+	color: #fbbd08!important;
+	background-color: #fef2ced2!important;
+}
+
+.bg-olive.light {
+	color: #8dc63f!important;
+	background-color: #e8f4d9!important;
+}
+
+.bg-green.light {
+	color: #39b54a!important;
+	background-color: #d7f0dbff!important;
+}
+
+.bg-cyan.light {
+	color: #1cbbb4!important;
+	background-color: #d2f1f0!important;
+}
+
+.bg-blue.light {
+	color: #0081ff!important;
+	background-color: #cce6ff!important;
+}
+
+.bg-purple.light {
+	color: #6739b6!important;
+	background-color: #e1d7f0!important;
+}
+
+.bg-mauve.light {
+	color: #9c26b0!important;
+	background-color: #ebd4ef!important;
+}
+
+.bg-pink.light {
+	color: #e03997!important;
+	background-color: #f9d7ea!important;
+}
+
+.bg-brown.light {
+	color: #a5673f!important;
+	background-color: #ede1d9!important;
+}
+
+.bg-grey.light {
+	color: #8799a3!important;
+	background-color: #e7ebed!important;
+}
+
+.bg-gradual-red {
+	background-image: linear-gradient(45deg, #f43f3b, #ec008c);
+	color: #ffffff;
+}
+
+.bg-gradual-orange {
+	background-image: linear-gradient(45deg, #ff9700, #ed1c24);
+	color: #ffffff;
+}
+
+.bg-gradual-green {
+	background-image: linear-gradient(45deg, #39b54a, #8dc63f);
+	color: #ffffff;
+}
+
+.bg-gradual-green1 {
+	background-image: linear-gradient(45deg, #78CA57,#A8D155);
+	color: #ffffff;
+}
+
+.bg-gradual-purple {
+	background-image: linear-gradient(45deg, #9000ff, #5e00ff);
+	color: #ffffff;
+}
+
+.bg-gradual-pink {
+	background-image: linear-gradient(45deg, #ec008c, #6739b6);
+	color: #ffffff;
+}
+
+.bg-gradual-blue {
+	background-image: linear-gradient(45deg, #0081ff, #1cbbb4);
+	color: #ffffff;
+}
+
+.shadow[class*="-red"] {
+	box-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);
+}
+
+.shadow[class*="-orange"] {
+	box-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);
+}
+
+.shadow[class*="-yellow"] {
+	box-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);
+}
+
+.shadow[class*="-olive"] {
+	box-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);
+}
+
+.shadow[class*="-green"] {
+	box-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);
+}
+
+.shadow[class*="-cyan"] {
+	box-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);
+}
+
+.shadow[class*="-blue"] {
+	box-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);
+}
+
+.shadow[class*="-purple"] {
+	box-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);
+}
+
+.shadow[class*="-mauve"] {
+	box-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);
+}
+
+.shadow[class*="-pink"] {
+	box-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);
+}
+
+.shadow[class*="-brown"] {
+	box-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);
+}
+
+.shadow[class*="-grey"] {
+	box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.shadow[class*="-gray"] {
+	box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.shadow[class*="-black"] {
+	box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.shadow[class*="-white"] {
+	box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.text-shadow[class*="-red"] {
+	text-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);
+}
+
+.text-shadow[class*="-orange"] {
+	text-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);
+}
+
+.text-shadow[class*="-yellow"] {
+	text-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);
+}
+
+.text-shadow[class*="-olive"] {
+	text-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);
+}
+
+.text-shadow[class*="-green"] {
+	text-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);
+}
+
+.text-shadow[class*="-cyan"] {
+	text-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);
+}
+
+.text-shadow[class*="-blue"] {
+	text-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);
+}
+
+.text-shadow[class*="-purple"] {
+	text-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);
+}
+
+.text-shadow[class*="-mauve"] {
+	text-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);
+}
+
+.text-shadow[class*="-pink"] {
+	text-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);
+}
+
+.text-shadow[class*="-brown"] {
+	text-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);
+}
+
+.text-shadow[class*="-grey"] {
+	text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.text-shadow[class*="-gray"] {
+	text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.text-shadow[class*="-black"] {
+	text-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.home-fixed{
+	position: fixed;
+	bottom:80px;
+	right:40px;
+	background-color: #c0c0c0 ;
+	opacity: 0.7;
+	border-radius: 50%;
+    color: #ffffff;
+	width: 50px;
+	height: 50px;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	text-align: center;
+}
+
+.bg-img {
+	background-size: cover;
+	background-position: center;
+	background-repeat: no-repeat;
+}
+
+.bg-mask {
+	background-color: #333333;
+	position: relative;
+}
+
+.bg-mask::after {
+	content: "";
+	border-radius: inherit;
+	width: 100%;
+	height: 100%;
+	display: block;
+	background-color: rgba(0, 0, 0, 0.4);
+	position: absolute;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	top: 0;
+}
+
+.bg-mask view,
+.bg-mask cover-view {
+	z-index: 5;
+	position: relative;
+}
+
+.bg-video {
+	position: relative;
+}
+
+.bg-video video {
+	display: block;
+	height: 100%;
+	width: 100%;
+	-o-object-fit: cover;
+	object-fit: cover;
+	position: absolute;
+	top: 0;
+	z-index: 0;
+	pointer-events: none;
+}
+
+/* ==================
+          文本
+ ==================== */
+
+.text-xs {
+	font-size: 20upx;
+}
+
+.text-sm {
+	font-size: 24upx;
+}
+
+.text-df {
+	font-size: 28upx;
+}
+
+.text-lg {
+	font-size: 32upx;
+}
+
+.text-xl {
+	font-size: 36upx;
+}
+
+.text-xxl {
+	font-size: 44upx;
+}
+
+.text-sl {
+	font-size: 80upx;
+}
+
+.text-xsl {
+	font-size: 120upx;
+}
+
+.text-Abc {
+	text-transform: Capitalize;
+}
+
+.text-ABC {
+	text-transform: Uppercase;
+}
+
+.text-abc {
+	text-transform: Lowercase;
+}
+
+.text-price::before {
+	content: "¥";
+	font-size: 80%;
+	margin-right: 4upx;
+}
+
+.text-cut {
+	text-overflow: ellipsis;
+	white-space: nowrap;
+	overflow: hidden;
+}
+
+.text-bold {
+	font-weight: bold;
+}
+
+.text-center {
+	text-align: center;
+}
+
+.text-content {
+	line-height: 1.6;
+}
+
+.text-left {
+	text-align: left;
+}
+
+.text-right {
+	text-align: right;
+}
+
+.text-red,
+.line-red,
+.lines-red {
+	color: #e54d42;
+}
+
+.text-orange,
+.line-orange,
+.lines-orange {
+	color: #f37b1d;
+}
+
+.text-yellow,
+.line-yellow,
+.lines-yellow {
+	color: #fbbd08;
+}
+
+.text-olive,
+.line-olive,
+.lines-olive {
+	color: #8dc63f;
+}
+
+.text-green,
+.line-green,
+.lines-green {
+	color: #39b54a;
+}
+
+.text-cyan,
+.line-cyan,
+.lines-cyan {
+	color: #1cbbb4;
+}
+
+.text-blue,
+.line-blue,
+.lines-blue {
+	color: #0081ff;
+}
+
+.text-purple,
+.line-purple,
+.lines-purple {
+	color: #6739b6;
+}
+
+.text-mauve,
+.line-mauve,
+.lines-mauve {
+	color: #9c26b0;
+}
+
+.text-pink,
+.line-pink,
+.lines-pink {
+	color: #e03997;
+}
+
+.text-brown,
+.line-brown,
+.lines-brown {
+	color: #a5673f;
+}
+
+.text-grey,
+.line-grey,
+.lines-grey {
+	color: #8799a3;
+}
+
+.text-gray,
+.line-gray,
+.lines-gray {
+	color: #aaaaaa;
+}
+
+.text-black,
+.line-black,
+.lines-black {
+	color: #333333;
+}
+
+.text-white,
+.line-white,
+.lines-white {
+	color: #ffffff;
+}
+
+
+/* 以下为阳光电源项目单独封装样式 */
+.sun-title .cu-custom .cu-bar .content{
+	width: 100%;
+	text-align: left;
+	padding-left: 20px;
+	box-sizing: border-box;
+	font-size: 18px;
+	margin-left: 11px;
+}
+
+
+.DrawerPage {
+	position: fixed;
+	width: 100vw;
+	height: 100vh;
+	left: 0vw;
+	background-color: #f1f1f1;
+	transition: all 0.4s;
+}
+
+.DrawerPage.show {
+	transform: scale(0.9, 0.9);
+	left: 90vw;
+	box-shadow: 0 0 60rpx rgba(0, 0, 0, 0.2);
+	transform-origin: 0;
+}
+
+.DrawerWindow {
+	position: absolute;
+	width: 90vw;
+	height: 100vh;
+	left: 0;
+	top: 0;
+	transform: scale(0.9, 0.9) translateX(-100%);
+	opacity: 0;
+	pointer-events: none;
+	transition: all 0.4s;
+}
+
+.DrawerWindow.show {
+	transform: scale(1, 1) translateX(0%);
+	opacity: 1;
+	pointer-events: all;
+}
+
+.DrawerClose {
+	position: absolute;
+	width: 40vw;
+	height: 100vh;
+	right: 0;
+	top: 0;
+	color: transparent;
+	padding-bottom: 30rpx;
+	display: flex;
+	align-items: flex-end;
+	justify-content: flex-end;
+	background-image: linear-gradient(90deg, rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 0.6));
+	letter-spacing: 5px;
+	font-size: 50rpx;
+	opacity: 0;
+	pointer-events: none;
+	transition: all 0.4s;
+}
+
+.DrawerClose.show {
+	opacity: 1;
+	pointer-events: all;
+	width: 10vw;
+	color: #fff;
+	background-image: linear-gradient(rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 1));
+}
+
+.DrawerPage .cu-bar.tabbar .action button.icon {
+	width: 64rpx;
+	height: 64rpx;
+	line-height: 64rpx;
+	margin: 0;
+	display: inline-block;
+}
+
+.DrawerPage .cu-bar.tabbar .action .cu-avatar {
+	margin: 0;
+}
+
+.DrawerPage .nav {
+	flex: 1;
+}
+
+.DrawerPage .nav .cu-item.cur {
+	border-bottom: 0;
+	position: relative;
+}
+
+.DrawerPage .nav .cu-item.cur::after {
+	content: "";
+	width: 10rpx;
+	height: 10rpx;
+	background-color: currentColor;
+	position: absolute;
+	bottom: 10rpx;
+	border-radius: 10rpx;
+	left: 0;
+	right: 0;
+	margin: auto;
+}
+
+.DrawerPage .cu-bar.tabbar .action {
+	flex: initial;
+}
+
+.fixedFootBtn{
+	border-top: 1px solid #ddd;
+	position: fixed;
+	width: 100vw;
+	bottom: 0;
+	z-index: 1000;
+	border-radius: 20rpx 20rpx 0 0;
+}
+.reviewBtn {
+	position: fixed;
+	bottom: 15vh;
+	right: 3vw;
+	width: 4.7em;
+	height: 4.7em;
+	border-radius: 50%;
+	text-align: center;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	background-color: #d7f0dbff;
+}
+.subBtn {
+	 font-size: 26upx;
+	 width: 4em;
+	 height: 4em;
+	 line-height: 4em;
+	 border-radius: 50%;
+	 text-align: center;
+	 transition: scale 0.5s;
+ }

+ 58 - 0
colorui/screenTextScroll.vue

@@ -0,0 +1,58 @@
+<template>
+	<view class="_notice">
+		<swiper class="_swiper tc" @change="slideChange" indicator-dots="false" autoplay="true" circular="true"
+		 display-multiple-items="2" :duration="duration" :interval="interval">
+			<swiper-item>
+				<view class="swiper-item uni-bg-red"></view>
+			</swiper-item>
+			<swiper-item>
+				<view class="swiper-item uni-bg-red"></view>
+			</swiper-item>
+			<swiper-item v-for="(item,index) in list" :key="index">
+				<view class="swiper-item uni-bg-red">{{item}}</view>
+			</swiper-item>
+		</swiper>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			//显示数据
+			list: {
+				type: Array,
+				defual:function(){
+					return [];
+				}
+			},
+		},
+		data() {
+			return {
+				interval:3000,
+				duration:12000,
+			};
+		},
+		methods:{
+			slideChange(e){
+				this.$emit('getCurrentIndex',e.detail.current); 
+				
+			}
+		}
+	};
+</script>
+
+<style>
+	._notice {
+		width: 100%;
+		font-size: 25rpx;
+		color: #ffffff;
+		border-radius: 6rpx;
+		overflow: hidden;
+		box-sizing: border-box;
+		height: 45upx;
+		
+	}
+	._swiper {
+		line-height: 47upx;
+	}
+</style>

+ 41 - 0
main.js

@@ -0,0 +1,41 @@
+import Vue from 'vue'
+import App from './App'
+
+import home from './pages/home/index.vue'
+Vue.component('home',home)
+
+import my from './pages/my/index.vue'
+Vue.component('my', my)
+
+
+import screenTextScroll from './colorui/screenTextScroll.vue'
+Vue.component('textscroll',screenTextScroll)
+
+import cuCustom from './colorui/components/cu-custom.vue'
+Vue.component('cu-custom',cuCustom)
+
+
+
+import {msg,success} from "./static/util/globalFun";
+
+
+Vue.config.productionTip = false
+Vue.prototype.$msg = msg;
+Vue.prototype.$success = success;
+Vue.prototype.$loading = (title)=>{
+    uni.showLoading({
+        title:title
+    });
+}
+
+App.mpType = 'app'
+
+const app = new Vue({
+    ...App
+})
+app.$mount()
+
+ 
+
+
+

+ 145 - 0
manifest.json

@@ -0,0 +1,145 @@
+{
+    "name" : "农检宝",
+    "appid" : "__UNI__405C61F",
+    "description" : "农检宝",
+    "versionName" : "1.0.0",
+    "versionCode" : 100,
+    "transformPx" : false,
+    "app-plus" : {
+        /* 5+App特有相关 */
+        "modules" : {
+            "VideoPlayer" : {}
+        },
+        /* 模块配置 */
+        "distribute" : {
+            /* 应用发布信息 */
+            "android" : {
+                /* android打包配置 */
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            "ios" : {},
+            /* ios打包配置 */
+            "sdkConfigs" : {
+                "ad" : {}
+            },
+            "splashscreen" : {
+                "androidStyle" : "default",
+                "iosStyle" : "default",
+                "android" : {
+                    "hdpi" : "boot_photo/android/480.png",
+                    "xhdpi" : "boot_photo/android/720.png",
+                    "xxhdpi" : "boot_photo/android/1080.png"
+                },
+                "useOriginalMsgbox" : true,
+                "ios" : {
+                    "iphone" : {
+                        "portrait-896h@3x" : "boot_photo/ios/1242.png",
+                        "landscape-896h@3x" : "boot_photo/ios/2688.png",
+                        "landscape-896h@2x" : "boot_photo/ios/1792.png",
+                        "iphonexl" : "boot_photo/ios/2436.png",
+                        "retina55l" : "boot_photo/ios/2208.png",
+                        "retina47l" : "boot_photo/ios/1334.png",
+                        "portrait-896h@2x" : "boot_photo/ios/828.png",
+                        "iphonex" : "boot_photo/ios/1125.png",
+                        "retina55" : "boot_photo/ios/1242.png",
+                        "retina47" : "boot_photo/ios/750.png",
+                        "retina40" : "boot_photo/ios/640.png",
+                        "retina40l" : "boot_photo/ios/1136.png",
+                        "retina35" : "boot_photo/ios/640-960.png"
+                    },
+                    "ipad" : {
+                        "portrait-1366h@2x" : "boot_photo/pad/2048-2732.png",
+                        "landscape-1366h@2x" : "boot_photo/pad/2732-2048.png",
+                        "portrait-1194h@2x" : "boot_photo/pad/1668-2388.png",
+                        "landscape-1194h@2x" : "boot_photo/pad/2388-1668.png",
+                        "portrait-1112h@2x" : "boot_photo/pad/1668-2224.png",
+                        "landscape-1112h@2x" : "boot_photo/pad/2224-1668.png",
+                        "portrait-retina7" : "boot_photo/pad/1536-2048.png",
+                        "landscape-retina7" : "boot_photo/pad/2048-1536.png",
+                        "portrait7" : "boot_photo/pad/768-1024.png",
+                        "landscape7" : "boot_photo/pad/1024-768.png"
+                    }
+                }
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "unpackage/res/icons/72x72.png",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
+                    "xxhdpi" : "unpackage/res/icons/144x144.png",
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
+                },
+                "ios" : {
+                    "appstore" : "unpackage/res/icons/1024x1024.png",
+                    "ipad" : {
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
+                    },
+                    "iphone" : {
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
+                    }
+                }
+            }
+        }
+    },
+    /* SDK配置 */
+    "quickapp" : {},
+    /* 快应用特有相关 */
+    "mp-weixin" : {
+        /* 小程序特有相关 */
+        "appid" : "wx06463f20f06692d5",
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : true
+        },
+        "optimization" : {
+            "subPackages" : true
+        },
+		"permission" : {
+			"scope.userLocation" : {
+			"desc" : "获取用户填写的地址经纬度"
+			}
+		},
+		"requiredPrivateInfos" : [ "getLocation", "chooseLocation" ]
+    },
+    "h5" : {
+        "title" : "ColorUi for UniApp",
+        "domain" : "demo.color-ui.com"
+    }
+}

+ 8 - 0
node_modules/i/.github/dependabot.yml

@@ -0,0 +1,8 @@
+version: 2
+updates:
+- package-ecosystem: npm
+  directory: "/"
+  schedule:
+    interval: daily
+    time: "04:00"
+  open-pull-requests-limit: 10

+ 26 - 0
node_modules/i/.github/workflows/ci.yml

@@ -0,0 +1,26 @@
+name: CI
+on:
+  push:
+    branches: [master]
+  pull_request:
+    branches: [master]
+    types: [opened, reopened, synchronize]
+jobs:
+  test:
+    name: Tests
+    strategy:
+      fail-fast: true
+      matrix:
+        node: [4, 6, 8, 10, 12, 14]
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+      - name: Install Node.js
+        uses: actions/setup-node@v2-beta
+        with:
+          node-version: ${{ matrix.node }}
+      - name: Install dependencies
+        run: npm install
+      - name: Test
+        run: npm test

+ 20 - 0
node_modules/i/LICENSE

@@ -0,0 +1,20 @@
+Copyright (C) 2020 Pavan Kumar Sunkara
+
+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.

+ 176 - 0
node_modules/i/README.md

@@ -0,0 +1,176 @@
+# inflect
+
+customizable inflections for nodejs
+
+**NOTE: 0.3.2 was accidentally unpublished from the server and npm doesn't allow me to publish it back. Please upgrade to 0.3.3**
+
+## Installation
+
+```bash
+npm install i
+```
+
+## Usage
+
+Require the module before using
+
+```js
+var inflect = require('i')();
+```
+
+All the below api functions can be called directly on a string
+
+```js
+inflect.titleize('messages to store') // === 'Messages To Store'
+'messages to store'.titleize // === 'Messages To Store'
+```
+
+only if `true` is passed while initiating
+
+```js
+var inflect = require('i')(true);
+```
+
+### Pluralize
+
+```js
+inflect.pluralize('person'); // === 'people'
+inflect.pluralize('octopus'); // === 'octopi'
+inflect.pluralize('Hat'); // === 'Hats'
+```
+
+### Singularize
+
+```js
+inflect.singularize('people'); // === 'person'
+inflect.singularize('octopi'); // === 'octopus'
+inflect.singularize('Hats'); // === 'Hat'
+```
+
+### Camelize
+
+```js
+inflect.camelize('message_properties'); // === 'MessageProperties'
+inflect.camelize('message_properties', false); // === 'messageProperties'
+```
+
+### Underscore
+
+```js
+inflect.underscore('MessageProperties'); // === 'message_properties'
+inflect.underscore('messageProperties'); // === 'message_properties'
+```
+
+### Humanize
+
+```js
+inflect.humanize('message_id'); // === 'Message'
+```
+
+### Dasherize
+
+```js
+inflect.dasherize('message_properties'); // === 'message-properties'
+inflect.dasherize('Message Properties'); // === 'Message Properties'
+```
+
+### Titleize
+
+```js
+inflect.titleize('message_properties'); // === 'Message Properties'
+inflect.titleize('message properties to keep'); // === 'Message Properties to Keep'
+```
+
+### Demodulize
+
+```js
+inflect.demodulize('Message.Bus.Properties'); // === 'Properties'
+```
+
+### Tableize
+
+```js
+inflect.tableize('MessageBusProperty'); // === 'message_bus_properties'
+```
+
+### Classify
+
+```js
+inflect.classify('message_bus_properties'); // === 'MessageBusProperty'
+```
+
+### Foreign key
+
+```js
+inflect.foreign_key('MessageBusProperty'); // === 'message_bus_property_id'
+inflect.foreign_key('MessageBusProperty', false); // === 'message_bus_propertyid'
+```
+
+### Ordinalize
+
+```js
+inflect.ordinalize( '1' ); // === '1st'
+```
+
+## Custom rules for inflection
+
+### Custom plural
+
+We can use regexp in any of these custom rules
+
+```js
+inflect.inflections.plural('person', 'guys');
+inflect.pluralize('person'); // === 'guys'
+inflect.singularize('guys'); // === 'guy'
+```
+
+### Custom singular
+
+```js
+inflect.inflections.singular('guys', 'person')
+inflect.singularize('guys'); // === 'person'
+inflect.pluralize('person'); // === 'people'
+```
+
+### Custom irregular
+
+```js
+inflect.inflections.irregular('person', 'guys')
+inflect.pluralize('person'); // === 'guys'
+inflect.singularize('guys'); // === 'person'
+```
+
+### Custom human
+
+```js
+inflect.inflections.human(/^(.*)_cnt$/i, '$1_count');
+inflect.humanize('jargon_cnt'); // === 'Jargon count'
+```
+
+### Custom uncountable
+
+```js
+inflect.inflections.uncountable('oil')
+inflect.pluralize('oil'); // === 'oil'
+inflect.singularize('oil'); // === 'oil'
+```
+
+## Contributors
+Here is a list of [Contributors](http://github.com/pksunkara/inflect/contributors)
+
+### TODO
+
+- More obscure test cases
+
+__I accept pull requests and guarantee a reply back within a day__
+
+## License
+MIT/X11
+
+## Bug Reports
+Report [here](http://github.com/pksunkara/inflect/issues). __Guaranteed reply within a day__.
+
+## Contact
+Pavan Kumar Sunkara (pavan.sss1991@gmail.com)
+
+Follow me on [github](https://github.com/users/follow?target=pksunkara), [twitter](http://twitter.com/pksunkara)

+ 78 - 0
node_modules/i/lib/defaults.js

@@ -0,0 +1,78 @@
+// Default inflections
+module.exports = function (inflect) {
+  inflect.plural(/$/, 's');
+  inflect.plural(/s$/i, 's');
+  inflect.plural(/(ax|test)is$/i, '$1es');
+  inflect.plural(/(octop|vir)us$/i, '$1i');
+  inflect.plural(/(octop|vir)i$/i, '$1i');
+  inflect.plural(/(alias|status)$/i, '$1es');
+  inflect.plural(/(bu)s$/i, '$1ses');
+  inflect.plural(/(buffal|tomat)o$/i, '$1oes');
+  inflect.plural(/([ti])um$/i, '$1a');
+  inflect.plural(/([ti])a$/i, '$1a');
+  inflect.plural(/sis$/i, 'ses');
+  inflect.plural(/(?:([^fa])fe|(?:(oa)f)|([lr])f)$/i, '$1ves');
+  inflect.plural(/(hive)$/i, '$1s');
+  inflect.plural(/([^aeiouy]|qu)y$/i, '$1ies');
+  inflect.plural(/(x|ch|ss|sh)$/i, '$1es');
+  inflect.plural(/(matr|vert|ind)(?:ix|ex)$/i, '$1ices');
+  inflect.plural(/([m|l])ouse$/i, '$1ice');
+  inflect.plural(/([m|l])ice$/i, '$1ice');
+  inflect.plural(/^(ox)$/i, '$1en');
+  inflect.plural(/^(oxen)$/i, '$1');
+  inflect.plural(/(quiz)$/i, '$1zes');
+
+  inflect.singular(/s$/i, '');
+  inflect.singular(/(n)ews$/i, '$1ews');
+  inflect.singular(/([ti])a$/i, '$1um');
+  inflect.singular(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i, '$1sis');
+  inflect.singular(/(^analy)ses$/i, '$1sis');
+  inflect.singular(/([^f])ves$/i, '$1fe');
+  inflect.singular(/(hive)s$/i, '$1');
+  inflect.singular(/(tive)s$/i, '$1');
+  inflect.singular(/(oave)s$/i, 'oaf');
+  inflect.singular(/([lr])ves$/i, '$1f');
+  inflect.singular(/([^aeiouy]|qu)ies$/i, '$1y');
+  inflect.singular(/(s)eries$/i, '$1eries');
+  inflect.singular(/(m)ovies$/i, '$1ovie');
+  inflect.singular(/(x|ch|ss|sh)es$/i, '$1');
+  inflect.singular(/([m|l])ice$/i, '$1ouse');
+  inflect.singular(/(bus)es$/i, '$1');
+  inflect.singular(/(o)es$/i, '$1');
+  inflect.singular(/(shoe)s$/i, '$1');
+  inflect.singular(/(cris|ax|test)es$/i, '$1is');
+  inflect.singular(/(octop|vir)i$/i, '$1us');
+  inflect.singular(/(alias|status)es$/i, '$1');
+  inflect.singular(/^(ox)en/i, '$1');
+  inflect.singular(/(vert|ind)ices$/i, '$1ex');
+  inflect.singular(/(matr)ices$/i, '$1ix');
+  inflect.singular(/(quiz)zes$/i, '$1');
+  inflect.singular(/(database)s$/i, '$1');
+
+  inflect.irregular('child', 'children');
+  inflect.irregular('person', 'people');
+  inflect.irregular('man', 'men');
+  inflect.irregular('child', 'children');
+  inflect.irregular('sex', 'sexes');
+  inflect.irregular('move', 'moves');
+  inflect.irregular('cow', 'kine');
+  inflect.irregular('zombie', 'zombies');
+  inflect.irregular('oaf', 'oafs', true);
+  inflect.irregular('jefe', 'jefes');
+  inflect.irregular('save', 'saves');
+  inflect.irregular('safe', 'safes');
+  inflect.irregular('fife', 'fifes');
+
+  inflect.uncountable([
+    'equipment',
+    'information',
+    'rice',
+    'money',
+    'species',
+    'series',
+    'fish',
+    'sheep',
+    'jeans',
+    'sushi',
+  ]);
+};

+ 11 - 0
node_modules/i/lib/inflect.js

@@ -0,0 +1,11 @@
+// Requiring modules
+
+module.exports = function (attach) {
+  var methods = require('./methods');
+
+  if (attach) {
+    require('./native')(methods);
+  }
+
+  return methods;
+};

+ 138 - 0
node_modules/i/lib/inflections.js

@@ -0,0 +1,138 @@
+// A singleton instance of this class is yielded by Inflector.inflections, which can then be used to specify additional
+// inflection rules. Examples:
+//
+//     BulletSupport.Inflector.inflect ($) ->
+//       $.plural /^(ox)$/i, '$1en'
+//       $.singular /^(ox)en/i, '$1'
+//
+//       $.irregular 'octopus', 'octopi'
+//
+//       $.uncountable "equipment"
+//
+// New rules are added at the top. So in the example above, the irregular rule for octopus will now be the first of the
+// pluralization and singularization rules that is runs. This guarantees that your rules run before any of the rules that may
+// already have been loaded.
+
+var util = require('./util');
+
+var Inflections = function () {
+  this.plurals = [];
+  this.singulars = [];
+  this.uncountables = [];
+  this.humans = [];
+  require('./defaults')(this);
+  return this;
+};
+
+// Specifies a new pluralization rule and its replacement. The rule can either be a string or a regular expression.
+// The replacement should always be a string that may include references to the matched data from the rule.
+Inflections.prototype.plural = function (rule, replacement) {
+  if (typeof rule == 'string') {
+    this.uncountables = util.array.del(this.uncountables, rule);
+  }
+  this.uncountables = util.array.del(this.uncountables, replacement);
+  this.plurals.unshift([rule, replacement]);
+};
+
+// Specifies a new singularization rule and its replacement. The rule can either be a string or a regular expression.
+// The replacement should always be a string that may include references to the matched data from the rule.
+Inflections.prototype.singular = function (rule, replacement) {
+  if (typeof rule == 'string') {
+    this.uncountables = util.array.del(this.uncountables, rule);
+  }
+  this.uncountables = util.array.del(this.uncountables, replacement);
+  this.singulars.unshift([rule, replacement]);
+};
+
+// Specifies a new irregular that applies to both pluralization and singularization at the same time. This can only be used
+// for strings, not regular expressions. You simply pass the irregular in singular and plural form.
+//
+//     irregular 'octopus', 'octopi'
+//     irregular 'person', 'people'
+Inflections.prototype.irregular = function (singular, plural, fullMatchRequired) {
+  this.uncountables = util.array.del(this.uncountables, singular);
+  this.uncountables = util.array.del(this.uncountables, plural);
+  var prefix = '';
+  if (fullMatchRequired) {
+    prefix = '^';
+  }
+  if (singular[0].toUpperCase() == plural[0].toUpperCase()) {
+    this.plural(new RegExp('(' + prefix + singular[0] + ')' + singular.slice(1) + '$', 'i'), '$1' + plural.slice(1));
+    this.plural(new RegExp('(' + prefix + plural[0] + ')' + plural.slice(1) + '$', 'i'), '$1' + plural.slice(1));
+    this.singular(new RegExp('(' + prefix + plural[0] + ')' + plural.slice(1) + '$', 'i'), '$1' + singular.slice(1));
+  } else {
+    this.plural(
+      new RegExp(prefix + singular[0].toUpperCase() + singular.slice(1) + '$'),
+      plural[0].toUpperCase() + plural.slice(1)
+    );
+    this.plural(
+      new RegExp(prefix + singular[0].toLowerCase() + singular.slice(1) + '$'),
+      plural[0].toLowerCase() + plural.slice(1)
+    );
+    this.plural(
+      new RegExp(prefix + plural[0].toUpperCase() + plural.slice(1) + '$'),
+      plural[0].toUpperCase() + plural.slice(1)
+    );
+    this.plural(
+      new RegExp(prefix + plural[0].toLowerCase() + plural.slice(1) + '$'),
+      plural[0].toLowerCase() + plural.slice(1)
+    );
+    this.singular(
+      new RegExp(prefix + plural[0].toUpperCase() + plural.slice(1) + '$'),
+      singular[0].toUpperCase() + singular.slice(1)
+    );
+    this.singular(
+      new RegExp(prefix + plural[0].toLowerCase() + plural.slice(1) + '$'),
+      singular[0].toLowerCase() + singular.slice(1)
+    );
+  }
+};
+
+// Specifies a humanized form of a string by a regular expression rule or by a string mapping.
+// When using a regular expression based replacement, the normal humanize formatting is called after the replacement.
+// When a string is used, the human form should be specified as desired (example: 'The name', not 'the_name')
+//
+//     human /(.*)_cnt$/i, '$1_count'
+//     human "legacy_col_person_name", "Name"
+Inflections.prototype.human = function (rule, replacement) {
+  this.humans.unshift([rule, replacement]);
+};
+
+// Add uncountable words that shouldn't be attempted inflected.
+//
+//     uncountable "money"
+//     uncountable ["money", "information"]
+Inflections.prototype.uncountable = function (words) {
+  this.uncountables = this.uncountables.concat(words);
+};
+
+// Clears the loaded inflections within a given scope (default is _'all'_).
+// Give the scope as a symbol of the inflection type, the options are: _'plurals'_,
+// _'singulars'_, _'uncountables'_, _'humans'_.
+//
+//     clear 'all'
+//     clear 'plurals'
+Inflections.prototype.clear = function (scope) {
+  if (scope == null) scope = 'all';
+  switch (scope) {
+    case 'all':
+      this.plurals = [];
+      this.singulars = [];
+      this.uncountables = [];
+      this.humans = [];
+    default:
+      this[scope] = [];
+  }
+};
+
+// Clears the loaded inflections and initializes them to [default](../inflections.html)
+Inflections.prototype.default = function () {
+  this.plurals = [];
+  this.singulars = [];
+  this.uncountables = [];
+  this.humans = [];
+  require('./defaults')(this);
+  return this;
+};
+
+module.exports = new Inflections();

+ 234 - 0
node_modules/i/lib/methods.js

@@ -0,0 +1,234 @@
+// The Inflector transforms words from singular to plural, class names to table names, modularized class names to ones without,
+// and class names to foreign keys. The default inflections for pluralization, singularization, and uncountable words are kept
+// in inflections.coffee
+//
+// If you discover an incorrect inflection and require it for your application, you'll need
+// to correct it yourself (explained below).
+
+var util = require('./util');
+
+var inflect = module.exports;
+
+// Import [inflections](inflections.html) instance
+inflect.inflections = require('./inflections');
+
+// Gives easy access to add inflections to this class
+inflect.inflect = function (fn) {
+  fn(inflect.inflections);
+};
+
+// By default, _camelize_ converts strings to UpperCamelCase. If the argument to _camelize_
+// is set to _false_ then _camelize_ produces lowerCamelCase.
+//
+// _camelize_ will also convert '/' to '.' which is useful for converting paths to namespaces.
+//
+//     "bullet_record".camelize()             // => "BulletRecord"
+//     "bullet_record".camelize(false)        // => "bulletRecord"
+//     "bullet_record/errors".camelize()      // => "BulletRecord.Errors"
+//     "bullet_record/errors".camelize(false) // => "bulletRecord.Errors"
+//
+// As a rule of thumb you can think of _camelize_ as the inverse of _underscore_,
+// though there are cases where that does not hold:
+//
+//     "SSLError".underscore.camelize // => "SslError"
+inflect.camelize = function (lower_case_and_underscored_word, first_letter_in_uppercase) {
+  var result;
+  if (first_letter_in_uppercase == null) first_letter_in_uppercase = true;
+  result = util.string.gsub(lower_case_and_underscored_word, /\/(.?)/, function ($) {
+    return '.' + util.string.upcase($[1]);
+  });
+  result = util.string.gsub(result, /(?:_)(.)/, function ($) {
+    return util.string.upcase($[1]);
+  });
+  if (first_letter_in_uppercase) {
+    return util.string.upcase(result);
+  } else {
+    return util.string.downcase(result);
+  }
+};
+
+// Makes an underscored, lowercase form from the expression in the string.
+//
+// Changes '.' to '/' to convert namespaces to paths.
+//
+//     "BulletRecord".underscore()         // => "bullet_record"
+//     "BulletRecord.Errors".underscore()  // => "bullet_record/errors"
+//
+// As a rule of thumb you can think of +underscore+ as the inverse of +camelize+,
+// though there are cases where that does not hold:
+//
+//     "SSLError".underscore().camelize() // => "SslError"
+inflect.underscore = function (camel_cased_word) {
+  var self;
+  self = util.string.gsub(camel_cased_word, /\./, '/');
+  self = util.string.gsub(self, /([A-Z])([A-Z][a-z])/, '$1_$2');
+  self = util.string.gsub(self, /([a-z\d])([A-Z])/, '$1_$2');
+  self = util.string.gsub(self, /-/, '_');
+  return self.toLowerCase();
+};
+
+// Replaces underscores with dashes in the string.
+//
+//     "puni_puni".dasherize()   // => "puni-puni"
+inflect.dasherize = function (underscored_word) {
+  return util.string.gsub(underscored_word, /_/, '-');
+};
+
+// Removes the module part from the expression in the string.
+//
+//     "BulletRecord.String.Inflections".demodulize() // => "Inflections"
+//     "Inflections".demodulize()                     // => "Inflections"
+inflect.demodulize = function (class_name_in_module) {
+  return util.string.gsub(class_name_in_module, /^.*\./, '');
+};
+
+// Creates a foreign key name from a class name.
+// _separate_class_name_and_id_with_underscore_ sets whether
+// the method should put '_' between the name and 'id'.
+//
+//     "Message".foreign_key()      // => "message_id"
+//     "Message".foreign_key(false) // => "messageid"
+//     "Admin::Post".foreign_key()  // => "post_id"
+inflect.foreign_key = function (class_name, separate_class_name_and_id_with_underscore) {
+  if (separate_class_name_and_id_with_underscore == null) {
+    separate_class_name_and_id_with_underscore = true;
+  }
+  return (
+    inflect.underscore(inflect.demodulize(class_name)) + (separate_class_name_and_id_with_underscore ? '_id' : 'id')
+  );
+};
+
+// Turns a number into an ordinal string used to denote the position in an
+// ordered sequence such as 1st, 2nd, 3rd, 4th.
+//
+//     ordinalize(1)     // => "1st"
+//     ordinalize(2)     // => "2nd"
+//     ordinalize(1002)  // => "1002nd"
+//     ordinalize(1003)  // => "1003rd"
+//     ordinalize(-11)   // => "-11th"
+//     ordinalize(-1021) // => "-1021st"
+inflect.ordinalize = function (number) {
+  var _ref;
+  number = parseInt(number);
+  if ((_ref = Math.abs(number) % 100) === 11 || _ref === 12 || _ref === 13) {
+    return '' + number + 'th';
+  } else {
+    switch (Math.abs(number) % 10) {
+      case 1:
+        return '' + number + 'st';
+      case 2:
+        return '' + number + 'nd';
+      case 3:
+        return '' + number + 'rd';
+      default:
+        return '' + number + 'th';
+    }
+  }
+};
+
+// Checks a given word for uncountability
+//
+//     "money".uncountability()     // => true
+//     "my money".uncountability()  // => true
+inflect.uncountability = function (word) {
+  return inflect.inflections.uncountables.some(function (ele, ind, arr) {
+    return word.match(new RegExp('(\\b|_)' + ele + '$', 'i')) != null;
+  });
+};
+
+// Returns the plural form of the word in the string.
+//
+//     "post".pluralize()             // => "posts"
+//     "octopus".pluralize()          // => "octopi"
+//     "sheep".pluralize()            // => "sheep"
+//     "words".pluralize()            // => "words"
+//     "CamelOctopus".pluralize()     // => "CamelOctopi"
+inflect.pluralize = function (word) {
+  var plural, result;
+  result = word;
+  if (word === '' || inflect.uncountability(word)) {
+    return result;
+  } else {
+    for (var i = 0; i < inflect.inflections.plurals.length; i++) {
+      plural = inflect.inflections.plurals[i];
+      result = util.string.gsub(result, plural[0], plural[1]);
+      if (word.match(plural[0]) != null) break;
+    }
+    return result;
+  }
+};
+
+// The reverse of _pluralize_, returns the singular form of a word in a string.
+//
+//     "posts".singularize()            // => "post"
+//     "octopi".singularize()           // => "octopus"
+//     "sheep".singularize()            // => "sheep"
+//     "word".singularize()             // => "word"
+//     "CamelOctopi".singularize()      // => "CamelOctopus"
+inflect.singularize = function (word) {
+  var result, singular;
+  result = word;
+  if (word === '' || inflect.uncountability(word)) {
+    return result;
+  } else {
+    for (var i = 0; i < inflect.inflections.singulars.length; i++) {
+      singular = inflect.inflections.singulars[i];
+      result = util.string.gsub(result, singular[0], singular[1]);
+      if (word.match(singular[0])) break;
+    }
+    return result;
+  }
+};
+
+// Capitalizes the first word and turns underscores into spaces and strips a
+// trailing "_id", if any. Like _titleize_, this is meant for creating pretty output.
+//
+//     "employee_salary".humanize()   // => "Employee salary"
+//     "author_id".humanize()         // => "Author"
+inflect.humanize = function (lower_case_and_underscored_word) {
+  var human, result;
+  result = lower_case_and_underscored_word;
+  for (var i = 0; i < inflect.inflections.humans.length; i++) {
+    human = inflect.inflections.humans[i];
+    result = util.string.gsub(result, human[0], human[1]);
+  }
+  result = util.string.gsub(result, /_id$/, '');
+  result = util.string.gsub(result, /_/, ' ');
+  return util.string.capitalize(result, true);
+};
+
+// Capitalizes all the words and replaces some characters in the string to create
+// a nicer looking title. _titleize_ is meant for creating pretty output. It is not
+// used in the Bullet internals.
+//
+//
+//     "man from the boondocks".titleize()   // => "Man From The Boondocks"
+//     "x-men: the last stand".titleize()    // => "X Men: The Last Stand"
+inflect.titleize = function (word) {
+  var self;
+  self = inflect.humanize(inflect.underscore(word));
+  return util.string.capitalize(self);
+};
+
+// Create the name of a table like Bullet does for models to table names. This method
+// uses the _pluralize_ method on the last word in the string.
+//
+//     "RawScaledScorer".tableize()   // => "raw_scaled_scorers"
+//     "egg_and_ham".tableize()       // => "egg_and_hams"
+//     "fancyCategory".tableize()     // => "fancy_categories"
+inflect.tableize = function (class_name) {
+  return inflect.pluralize(inflect.underscore(class_name));
+};
+
+// Create a class name from a plural table name like Bullet does for table names to models.
+// Note that this returns a string and not a Class.
+//
+//     "egg_and_hams".classify()   // => "EggAndHam"
+//     "posts".classify()          // => "Post"
+//
+// Singular names are not handled correctly:
+//
+//     "business".classify()       // => "Busines"
+inflect.classify = function (table_name) {
+  return inflect.camelize(inflect.singularize(util.string.gsub(table_name, /^.*\./, '')));
+};

+ 51 - 0
node_modules/i/lib/native.js

@@ -0,0 +1,51 @@
+module.exports = function (obj) {
+  var addProperty = function (method, func) {
+    String.prototype.__defineGetter__(method, func);
+  };
+
+  var stringPrototypeBlacklist = [
+    '__defineGetter__',
+    '__defineSetter__',
+    '__lookupGetter__',
+    '__lookupSetter__',
+    'charAt',
+    'constructor',
+    'hasOwnProperty',
+    'isPrototypeOf',
+    'propertyIsEnumerable',
+    'toLocaleString',
+    'toString',
+    'valueOf',
+    'charCodeAt',
+    'indexOf',
+    'lastIndexof',
+    'length',
+    'localeCompare',
+    'match',
+    'replace',
+    'search',
+    'slice',
+    'split',
+    'substring',
+    'toLocaleLowerCase',
+    'toLocaleUpperCase',
+    'toLowerCase',
+    'toUpperCase',
+    'trim',
+    'trimLeft',
+    'trimRight',
+    'gsub',
+  ];
+
+  Object.keys(obj).forEach(function (key) {
+    if (key != 'inflect' && key != 'inflections') {
+      if (stringPrototypeBlacklist.indexOf(key) !== -1) {
+        console.log('warn: You should not override String.prototype.' + key);
+      } else {
+        addProperty(key, function () {
+          return obj[key](this);
+        });
+      }
+    }
+  });
+};

+ 147 - 0
node_modules/i/lib/util.js

@@ -0,0 +1,147 @@
+// Some utility functions in js
+
+var u = (module.exports = {
+  array: {
+    // Returns a copy of the array with the value removed once
+    //
+    //     [1, 2, 3, 1].del 1 #=> [2, 3, 1]
+    //     [1, 2, 3].del 4    #=> [1, 2, 3]
+    del: function (arr, val) {
+      var index = arr.indexOf(val);
+
+      if (index != -1) {
+        if (index == 0) {
+          return arr.slice(1);
+        } else {
+          return arr.slice(0, index).concat(arr.slice(index + 1));
+        }
+      } else {
+        return arr;
+      }
+    },
+
+    // Returns the first element of the array
+    //
+    //     [1, 2, 3].first() #=> 1
+    first: function (arr) {
+      return arr[0];
+    },
+
+    // Returns the last element of the array
+    //
+    //     [1, 2, 3].last()  #=> 3
+    last: function (arr) {
+      return arr[arr.length - 1];
+    },
+  },
+  string: {
+    // Returns a copy of str with all occurrences of pattern replaced with either replacement or the return value of a function.
+    // The pattern will typically be a Regexp; if it is a String then no regular expression metacharacters will be interpreted
+    // (that is /\d/ will match a digit, but ‘\d’ will match a backslash followed by a ‘d’).
+    //
+    // In the function form, the current match object is passed in as a parameter to the function, and variables such as
+    // $[1], $[2], $[3] (where $ is the match object) will be set appropriately. The value returned by the function will be
+    // substituted for the match on each call.
+    //
+    // The result inherits any tainting in the original string or any supplied replacement string.
+    //
+    //     "hello".gsub /[aeiou]/, '*'      #=> "h*ll*"
+    //     "hello".gsub /[aeiou]/, '<$1>'   #=> "h<e>ll<o>"
+    //     "hello".gsub /[aeiou]/, ($) {
+    //       "<#{$[1]}>"                    #=> "h<e>ll<o>"
+    //
+    gsub: function (str, pattern, replacement) {
+      var i, match, matchCmpr, matchCmprPrev, replacementStr, result, self;
+      if (!(pattern != null && replacement != null)) return u.string.value(str);
+      result = '';
+      self = str;
+      while (self.length > 0) {
+        if ((match = self.match(pattern))) {
+          result += self.slice(0, match.index);
+          if (typeof replacement === 'function') {
+            match[1] = match[1] || match[0];
+            result += replacement(match);
+          } else if (replacement.match(/\$[1-9]/)) {
+            matchCmprPrev = match;
+            matchCmpr = u.array.del(match, void 0);
+            while (matchCmpr !== matchCmprPrev) {
+              matchCmprPrev = matchCmpr;
+              matchCmpr = u.array.del(matchCmpr, void 0);
+            }
+            match[1] = match[1] || match[0];
+            replacementStr = replacement;
+            for (i = 1; i <= 9; i++) {
+              if (matchCmpr[i]) {
+                replacementStr = u.string.gsub(replacementStr, new RegExp('\\$' + i), matchCmpr[i]);
+              }
+            }
+            result += replacementStr;
+          } else {
+            result += replacement;
+          }
+          self = self.slice(match.index + match[0].length);
+        } else {
+          result += self;
+          self = '';
+        }
+      }
+      return result;
+    },
+
+    // Returns a copy of the String with the first letter being upper case
+    //
+    //     "hello".upcase #=> "Hello"
+    upcase: function (str) {
+      var self = u.string.gsub(str, /_([a-z])/, function ($) {
+        return '_' + $[1].toUpperCase();
+      });
+
+      self = u.string.gsub(self, /\/([a-z])/, function ($) {
+        return '/' + $[1].toUpperCase();
+      });
+
+      return self[0].toUpperCase() + self.substr(1);
+    },
+
+    // Returns a copy of capitalized string
+    //
+    //     "employee salary" #=> "Employee Salary"
+    capitalize: function (str, spaces) {
+      if (!str.length) {
+        return str;
+      }
+
+      var self = str.toLowerCase();
+
+      if (!spaces) {
+        self = u.string.gsub(self, /\s([a-z])/, function ($) {
+          return ' ' + $[1].toUpperCase();
+        });
+      }
+
+      return self[0].toUpperCase() + self.substr(1);
+    },
+
+    // Returns a copy of the String with the first letter being lower case
+    //
+    //     "HELLO".downcase #=> "hELLO"
+    downcase: function (str) {
+      var self = u.string.gsub(str, /_([A-Z])/, function ($) {
+        return '_' + $[1].toLowerCase();
+      });
+
+      self = u.string.gsub(self, /\/([A-Z])/, function ($) {
+        return '/' + $[1].toLowerCase();
+      });
+
+      return self[0].toLowerCase() + self.substr(1);
+    },
+
+    // Returns a string value for the String object
+    //
+    //     "hello".value() #=> "hello"
+    value: function (str) {
+      return str.substr(0);
+    },
+  },
+});

+ 85 - 0
node_modules/i/package.json

@@ -0,0 +1,85 @@
+{
+  "_args": [
+    [
+      "i@0.3.7",
+      "C:\\Users\\MEMBER\\Desktop\\check-miniapp"
+    ]
+  ],
+  "_from": "i@0.3.7",
+  "_id": "i@0.3.7",
+  "_inBundle": false,
+  "_integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==",
+  "_location": "/i",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "i@0.3.7",
+    "name": "i",
+    "escapedName": "i",
+    "rawSpec": "0.3.7",
+    "saveSpec": null,
+    "fetchSpec": "0.3.7"
+  },
+  "_requiredBy": [
+    "/"
+  ],
+  "_resolved": "https://registry.npmmirror.com/i/-/i-0.3.7.tgz",
+  "_spec": "0.3.7",
+  "_where": "C:\\Users\\MEMBER\\Desktop\\check-miniapp",
+  "author": {
+    "name": "Pavan Kumar Sunkara",
+    "email": "pavan.sss1991@gmail.com",
+    "url": "pksunkara.github.com"
+  },
+  "bugs": {
+    "url": "https://github.com/pksunkara/inflect/issues"
+  },
+  "contributors": [
+    {
+      "name": "Pavan Kumar Sunkara",
+      "email": "pavan.sss1991@gmail.com"
+    }
+  ],
+  "dependencies": {},
+  "description": "custom inflections for nodejs",
+  "devDependencies": {
+    "vows": "^0.8.2"
+  },
+  "engines": {
+    "node": ">=0.4"
+  },
+  "homepage": "http://pksunkara.github.com/inflect",
+  "keywords": [
+    "singular",
+    "plural",
+    "camelize",
+    "underscore",
+    "dasherize",
+    "demodulize",
+    "ordinalize",
+    "uncountable",
+    "pluralize",
+    "singularize",
+    "titleize",
+    "tableize",
+    "classify",
+    "foreign_key"
+  ],
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "https://github.com/pksunkara/inflect/raw/master/LICENSE"
+    }
+  ],
+  "main": "./lib/inflect",
+  "name": "i",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/pksunkara/inflect.git"
+  },
+  "scripts": {
+    "test": "vows --spec $(find test -name '*-test.js')"
+  },
+  "version": "0.3.7"
+}

+ 230 - 0
node_modules/i/test/inflector/cases.js

@@ -0,0 +1,230 @@
+(function() {
+
+  module.exports = {
+    SingularToPlural: {
+      "search": "searches",
+      "switch": "switches",
+      "fix": "fixes",
+      "box": "boxes",
+      "process": "processes",
+      "address": "addresses",
+      "case": "cases",
+      "stack": "stacks",
+      "wish": "wishes",
+      "fish": "fish",
+      "jeans": "jeans",
+      "funky jeans": "funky jeans",
+      "my money": "my money",
+      "category": "categories",
+      "query": "queries",
+      "ability": "abilities",
+      "agency": "agencies",
+      "movie": "movies",
+      "archive": "archives",
+      "index": "indices",
+      "wife": "wives",
+      "safe": "saves",
+      "half": "halves",
+      "move": "moves",
+      "salesperson": "salespeople",
+      "person": "people",
+      "spokesman": "spokesmen",
+      "man": "men",
+      "woman": "women",
+      "basis": "bases",
+      "diagnosis": "diagnoses",
+      "diagnosis_a": "diagnosis_as",
+      "datum": "data",
+      "medium": "media",
+      "stadium": "stadia",
+      "analysis": "analyses",
+      "node_child": "node_children",
+      "child": "children",
+      "experience": "experiences",
+      "day": "days",
+      "comment": "comments",
+      "foobar": "foobars",
+      "newsletter": "newsletters",
+      "old_news": "old_news",
+      "news": "news",
+      "series": "series",
+      "species": "species",
+      "quiz": "quizzes",
+      "perspective": "perspectives",
+      "ox": "oxen",
+      "photo": "photos",
+      "buffalo": "buffaloes",
+      "tomato": "tomatoes",
+      "dwarf": "dwarves",
+      "elf": "elves",
+      "information": "information",
+      "equipment": "equipment",
+      "bus": "buses",
+      "status": "statuses",
+      "status_code": "status_codes",
+      "mouse": "mice",
+      "louse": "lice",
+      "house": "houses",
+      "octopus": "octopi",
+      "virus": "viri",
+      "alias": "aliases",
+      "portfolio": "portfolios",
+      "vertex": "vertices",
+      "matrix": "matrices",
+      "matrix_fu": "matrix_fus",
+      "axis": "axes",
+      "testis": "testes",
+      "crisis": "crises",
+      "rice": "rice",
+      "shoe": "shoes",
+      "horse": "horses",
+      "prize": "prizes",
+      "edge": "edges",
+      "cow": "kine",
+      "database": "databases",
+      "safe": "safes",
+      "belief": "beliefs",
+      "gaffe": "gaffes",
+      "cafe": "cafes",
+      "caffe": "caffes",
+      "life": "lives",
+      "wife": "wives",
+      "save": "saves",
+      "fife": "fifes",
+      "carafe": "carafes",
+      "giraffe": "giraffes",
+      "elf": "elves",
+      "calf": "calves",
+      "bookshelf": "bookshelves",
+      "wolf": "wolves",
+      "half": "halves",
+      "meatloaf": "meatloaves",
+      "loaf": "loaves",
+      "oaf": "oafs",
+      "jefe": "jefes",
+      "afterlife": "afterlives",
+    },
+    CamelToUnderscore: {
+      "Product": "product",
+      "SpecialGuest": "special_guest",
+      "ApplicationController": "application_controller",
+      "Area51Controller": "area51_controller"
+    },
+    UnderscoreToLowerCamel: {
+      "product": "product",
+      "Widget": "widget",
+      "special_guest": "specialGuest",
+      "application_controller": "applicationController",
+      "area51_controller": "area51Controller"
+    },
+    CamelToUnderscoreWithoutReverse: {
+      "HTMLTidy": "html_tidy",
+      "HTMLTidyGenerator": "html_tidy_generator",
+      "FreeBSD": "free_bsd",
+      "HTML": "html"
+    },
+    CamelWithModuleToUnderscoreWithSlash: {
+      "Admin.Product": "admin/product",
+      "Users.Commission.Department": "users/commission/department",
+      "UsersSection.CommissionDepartment": "users_section/commission_department"
+    },
+    ClassNameToForeignKeyWithUnderscore: {
+      "Person": "person_id",
+      "MyApplication.Billing.Account": "account_id"
+    },
+    ClassNameToForeignKeyWithoutUnderscore: {
+      "Person": "personid",
+      "MyApplication.Billing.Account": "accountid"
+    },
+    ClassNameToTableName: {
+      "PrimarySpokesman": "primary_spokesmen",
+      "NodeChild": "node_children"
+    },
+    UnderscoreToHuman: {
+      "employee_salary": "Employee salary",
+      "employee_id": "Employee",
+      "underground": "Underground"
+    },
+    MixtureToTitleCase: {
+      'bullet_record': 'Bullet Record',
+      'BulletRecord': 'Bullet Record',
+      'bullet web service': 'Bullet Web Service',
+      'Bullet Web Service': 'Bullet Web Service',
+      'Bullet web service': 'Bullet Web Service',
+      'bulletwebservice': 'Bulletwebservice',
+      'Bulletwebservice': 'Bulletwebservice',
+      "pavan's code": "Pavan's Code",
+      "Pavan's code": "Pavan's Code",
+      "pavan's Code": "Pavan's Code"
+    },
+    OrdinalNumbers: {
+      "-1": "-1st",
+      "-2": "-2nd",
+      "-3": "-3rd",
+      "-4": "-4th",
+      "-5": "-5th",
+      "-6": "-6th",
+      "-7": "-7th",
+      "-8": "-8th",
+      "-9": "-9th",
+      "-10": "-10th",
+      "-11": "-11th",
+      "-12": "-12th",
+      "-13": "-13th",
+      "-14": "-14th",
+      "-20": "-20th",
+      "-21": "-21st",
+      "-22": "-22nd",
+      "-23": "-23rd",
+      "-24": "-24th",
+      "-100": "-100th",
+      "-101": "-101st",
+      "-102": "-102nd",
+      "-103": "-103rd",
+      "-104": "-104th",
+      "-110": "-110th",
+      "-111": "-111th",
+      "-112": "-112th",
+      "-113": "-113th",
+      "-1000": "-1000th",
+      "-1001": "-1001st",
+      "0": "0th",
+      "1": "1st",
+      "2": "2nd",
+      "3": "3rd",
+      "4": "4th",
+      "5": "5th",
+      "6": "6th",
+      "7": "7th",
+      "8": "8th",
+      "9": "9th",
+      "10": "10th",
+      "11": "11th",
+      "12": "12th",
+      "13": "13th",
+      "14": "14th",
+      "20": "20th",
+      "21": "21st",
+      "22": "22nd",
+      "23": "23rd",
+      "24": "24th",
+      "100": "100th",
+      "101": "101st",
+      "102": "102nd",
+      "103": "103rd",
+      "104": "104th",
+      "110": "110th",
+      "111": "111th",
+      "112": "112th",
+      "113": "113th",
+      "1000": "1000th",
+      "1001": "1001st"
+    },
+    UnderscoresToDashes: {
+      "street": "street",
+      "street_address": "street-address",
+      "person_street_address": "person-street-address"
+    }
+  };
+
+}).call(this);

+ 87 - 0
node_modules/i/test/inflector/inflections-test.js

@@ -0,0 +1,87 @@
+(function() {
+  var assert, vows;
+
+  vows = require('vows');
+
+  assert = require('assert');
+
+  vows.describe('Module Inflector inflections').addBatch({
+    'Test inflector inflections': {
+      topic: require('../../lib/inflections'),
+      'clear': {
+        'single': function(topic) {
+          topic.uncountables = [1, 2, 3];
+          topic.humans = [1, 2, 3];
+          topic.clear('uncountables');
+          assert.isEmpty(topic.uncountables);
+          return assert.deepEqual(topic.humans, [1, 2, 3]);
+        },
+        'all': function(topic) {
+          assert.deepEqual(topic.humans, [1, 2, 3]);
+          topic.uncountables = [1, 2, 3];
+          topic.clear();
+          assert.isEmpty(topic.uncountables);
+          return assert.isEmpty(topic.humans);
+        }
+      },
+      'uncountable': {
+        'one item': function(topic) {
+          topic.clear();
+          assert.isEmpty(topic.uncountables);
+          topic.uncountable('money');
+          return assert.deepEqual(topic.uncountables, ['money']);
+        },
+        'many items': function(topic) {
+          topic.clear();
+          assert.isEmpty(topic.uncountables);
+          topic.uncountable(['money', 'rice']);
+          return assert.deepEqual(topic.uncountables, ['money', 'rice']);
+        }
+      },
+      'human': function(topic) {
+        topic.clear();
+        assert.isEmpty(topic.humans);
+        topic.human("legacy_col_person_name", "Name");
+        return assert.deepEqual(topic.humans, [["legacy_col_person_name", "Name"]]);
+      },
+      'plural': function(topic) {
+        topic.clear();
+        assert.isEmpty(topic.plurals);
+        topic.plural('ox', 'oxen');
+        assert.deepEqual(topic.plurals, [['ox', 'oxen']]);
+        topic.uncountable('money');
+        assert.deepEqual(topic.uncountables, ['money']);
+        topic.uncountable('monies');
+        topic.plural('money', 'monies');
+        assert.deepEqual(topic.plurals, [['money', 'monies'], ['ox', 'oxen']]);
+        return assert.isEmpty(topic.uncountables);
+      },
+      'singular': function(topic) {
+        topic.clear();
+        assert.isEmpty(topic.singulars);
+        topic.singular('ox', 'oxen');
+        assert.deepEqual(topic.singulars, [['ox', 'oxen']]);
+        topic.uncountable('money');
+        assert.deepEqual(topic.uncountables, ['money']);
+        topic.uncountable('monies');
+        topic.singular('money', 'monies');
+        assert.deepEqual(topic.singulars, [['money', 'monies'], ['ox', 'oxen']]);
+        return assert.isEmpty(topic.uncountables);
+      },
+      'irregular': function(topic) {
+        topic.clear();
+        topic.uncountable(['octopi', 'octopus']);
+        assert.deepEqual(topic.uncountables, ['octopi', 'octopus']);
+        topic.irregular('octopus', 'octopi');
+        assert.isEmpty(topic.uncountables);
+        assert.equal(topic.singulars[0][0].toString(), /(o)ctopi$/i.toString());
+        assert.equal(topic.singulars[0][1], '$1ctopus');
+        assert.equal(topic.plurals[0][0].toString(), /(o)ctopi$/i.toString());
+        assert.equal(topic.plurals[0][1], '$1ctopi');
+        assert.equal(topic.plurals[1][0].toString(), /(o)ctopus$/i.toString());
+        return assert.equal(topic.plurals[1][1].toString(), '$1ctopi');
+      }
+    }
+  })["export"](module);
+
+}).call(this);

+ 348 - 0
node_modules/i/test/inflector/methods-test.js

@@ -0,0 +1,348 @@
+(function() {
+  var assert, cases, vows, util;
+
+  vows = require('vows');
+
+  assert = require('assert');
+
+  util = require('../../lib/util');
+
+  cases = require('./cases');
+
+  vows.describe('Module Inflector methods').addBatch({
+    'Test inflector method': {
+      topic: require('../../lib/methods'),
+      'camelize': {
+        'word': function(topic) {
+          var i, words, _i, _len, _ref, _results;
+          words = cases.CamelToUnderscore;
+          _ref = Object.keys(words);
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            _results.push(assert.equal(topic.camelize(words[i]), i));
+          }
+          return _results;
+        },
+        'word with first letter lower': function(topic) {
+          var i, words, _i, _len, _ref, _results;
+          words = cases.UnderscoreToLowerCamel;
+          _ref = Object.keys(words);
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            _results.push(assert.equal(topic.camelize(i, false), words[i]));
+          }
+          return _results;
+        },
+        'path': function(topic) {
+          var i, words, _i, _len, _ref, _results;
+          words = cases.CamelWithModuleToUnderscoreWithSlash;
+          _ref = Object.keys(words);
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            _results.push(assert.equal(topic.camelize(words[i]), i));
+          }
+          return _results;
+        },
+        'path with first letter lower': function(topic) {
+          return assert.equal(topic.camelize('bullet_record/errors', false), 'bulletRecord.Errors');
+        }
+      },
+      'underscore': {
+        'word': function(topic) {
+          var i, words, _i, _j, _len, _len2, _ref, _ref2, _results;
+          words = cases.CamelToUnderscore;
+          _ref = Object.keys(words);
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            assert.equal(topic.underscore(i), words[i]);
+          }
+          words = cases.CamelToUnderscoreWithoutReverse;
+          _ref2 = Object.keys(words);
+          _results = [];
+          for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
+            i = _ref2[_j];
+            _results.push(assert.equal(topic.underscore(i), words[i]));
+          }
+          return _results;
+        },
+        'path': function(topic) {
+          var i, words, _i, _len, _ref, _results;
+          words = cases.CamelWithModuleToUnderscoreWithSlash;
+          _ref = Object.keys(words);
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            _results.push(assert.equal(topic.underscore(i), words[i]));
+          }
+          return _results;
+        },
+        'from dasherize': function(topic) {
+          var i, words, _i, _len, _ref, _results;
+          words = cases.UnderscoresToDashes;
+          _ref = Object.keys(words);
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            _results.push(assert.equal(topic.underscore(topic.dasherize(i)), i));
+          }
+          return _results;
+        }
+      },
+      'dasherize': {
+        'underscored_word': function(topic) {
+          var i, words, _i, _len, _ref, _results;
+          words = cases.UnderscoresToDashes;
+          _ref = Object.keys(words);
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            _results.push(assert.equal(topic.dasherize(i), words[i]));
+          }
+          return _results;
+        }
+      },
+      'demodulize': {
+        'module name': function(topic) {
+          return assert.equal(topic.demodulize('BulletRecord.CoreExtensions.Inflections'), 'Inflections');
+        },
+        'isolated module name': function(topic) {
+          return assert.equal(topic.demodulize('Inflections'), 'Inflections');
+        }
+      },
+      'foreign_key': {
+        'normal': function(topic) {
+          var i, words, _i, _len, _ref, _results;
+          words = cases.ClassNameToForeignKeyWithoutUnderscore;
+          _ref = Object.keys(words);
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            _results.push(assert.equal(topic.foreign_key(i, false), words[i]));
+          }
+          return _results;
+        },
+        'with_underscore': function(topic) {
+          var i, words, _i, _len, _ref, _results;
+          words = cases.ClassNameToForeignKeyWithUnderscore;
+          _ref = Object.keys(words);
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            _results.push(assert.equal(topic.foreign_key(i), words[i]));
+          }
+          return _results;
+        }
+      },
+      'ordinalize': function(topic) {
+        var i, words, _i, _len, _ref, _results;
+        words = cases.OrdinalNumbers;
+        _ref = Object.keys(words);
+        _results = [];
+        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+          i = _ref[_i];
+          _results.push(assert.equal(topic.ordinalize(i), words[i]));
+        }
+        return _results;
+      }
+    }
+  }).addBatch({
+    'Test inflector inflection methods': {
+      topic: function() {
+        var Inflector;
+        Inflector = require('../../lib/methods');
+        Inflector.inflections["default"]();
+        return Inflector;
+      },
+      'pluralize': {
+        'empty': function(topic) {
+          return assert.equal(topic.pluralize(''), '');
+        },
+        'uncountable': function(topic) {
+          return assert.equal(topic.pluralize('money'), 'money');
+        },
+        'normal': function(topic) {
+          topic.inflections.irregular('octopus', 'octopi');
+          return assert.equal(topic.pluralize('octopus'), 'octopi');
+        },
+        'cases': function(topic) {
+          var i, words, _i, _j, _len, _len2, _ref, _ref2, _results;
+          words = cases.SingularToPlural;
+          _ref = Object.keys(words);
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            assert.equal(topic.pluralize(i), words[i]);
+          }
+          _ref2 = Object.keys(words);
+          _results = [];
+          for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
+            i = _ref2[_j];
+            _results.push(assert.equal(topic.pluralize(util.string.capitalize(i)), util.string.capitalize(words[i])));
+          }
+          return _results;
+        },
+        'cases plural': function(topic) {
+          var i, words, _i, _j, _len, _len2, _ref, _ref2, _results;
+          words = cases.SingularToPlural;
+          _ref = Object.keys(words);
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            assert.equal(topic.pluralize(words[i]), words[i]);
+          }
+          _ref2 = Object.keys(words);
+          _results = [];
+          for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
+            i = _ref2[_j];
+            _results.push(assert.equal(topic.pluralize(util.string.capitalize(words[i])), util.string.capitalize(words[i])));
+          }
+          return _results;
+        }
+      },
+      'singuralize': {
+        'empty': function(topic) {
+          return assert.equal(topic.singularize(''), '');
+        },
+        'uncountable': function(topic) {
+          return assert.equal(topic.singularize('money'), 'money');
+        },
+        'normal': function(topic) {
+          topic.inflections.irregular('octopus', 'octopi');
+          return assert.equal(topic.singularize('octopi'), 'octopus');
+        },
+        'cases': function(topic) {
+          var i, words, _i, _j, _len, _len2, _ref, _ref2, _results;
+          words = cases.SingularToPlural;
+          _ref = Object.keys(words);
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            assert.equal(topic.singularize(words[i]), i);
+          }
+          _ref2 = Object.keys(words);
+          _results = [];
+          for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
+            i = _ref2[_j];
+            _results.push(assert.equal(topic.singularize(util.string.capitalize(words[i])), util.string.capitalize(i)));
+          }
+          return _results;
+        }
+      },
+      'uncountablility': {
+        'normal': function(topic) {
+          var i, words, _i, _j, _k, _len, _len2, _len3, _results;
+          words = topic.inflections.uncountables;
+          for (_i = 0, _len = words.length; _i < _len; _i++) {
+            i = words[_i];
+            assert.equal(topic.singularize(i), i);
+          }
+          for (_j = 0, _len2 = words.length; _j < _len2; _j++) {
+            i = words[_j];
+            assert.equal(topic.pluralize(i), i);
+          }
+          _results = [];
+          for (_k = 0, _len3 = words.length; _k < _len3; _k++) {
+            i = words[_k];
+            _results.push(assert.equal(topic.singularize(i), topic.pluralize(i)));
+          }
+          return _results;
+        },
+        'greedy': function(topic) {
+          var countable_word, uncountable_word;
+          uncountable_word = "ors";
+          countable_word = "sponsor";
+          topic.inflections.uncountable(uncountable_word);
+          assert.equal(topic.singularize(uncountable_word), uncountable_word);
+          assert.equal(topic.pluralize(uncountable_word), uncountable_word);
+          assert.equal(topic.pluralize(uncountable_word), topic.singularize(uncountable_word));
+          assert.equal(topic.singularize(countable_word), 'sponsor');
+          assert.equal(topic.pluralize(countable_word), 'sponsors');
+          return assert.equal(topic.singularize(topic.pluralize(countable_word)), 'sponsor');
+        }
+      },
+      'humanize': {
+        'normal': function(topic) {
+          var i, words, _i, _len, _ref, _results;
+          words = cases.UnderscoreToHuman;
+          _ref = Object.keys(words);
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            _results.push(assert.equal(topic.humanize(i), words[i]));
+          }
+          return _results;
+        },
+        'with rule': function(topic) {
+          topic.inflections.human(/^(.*)_cnt$/i, '$1_count');
+          topic.inflections.human(/^prefix_(.*)$/i, '$1');
+          assert.equal(topic.humanize('jargon_cnt'), 'Jargon count');
+          return assert.equal(topic.humanize('prefix_request'), 'Request');
+        },
+        'with string': function(topic) {
+          topic.inflections.human('col_rpted_bugs', 'Reported bugs');
+          assert.equal(topic.humanize('col_rpted_bugs'), 'Reported bugs');
+          return assert.equal(topic.humanize('COL_rpted_bugs'), 'Col rpted bugs');
+        },
+        'with _id': function(topic) {
+          return assert.equal(topic.humanize('author_id'), 'Author');
+        },
+        'with just _id': function(topic) {
+          return assert.equal(topic.humanize('_id'), '');
+        }
+      },
+      'titleize': {
+        'normal': function(topic) {
+          var i, words, _i, _len, _ref, _results;
+          words = cases.MixtureToTitleCase;
+          _ref = Object.keys(words);
+          _results = [];
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            _results.push(assert.equal(topic.titleize(i), words[i]));
+          }
+          return _results;
+        },
+        'with hyphens': function(topic) {
+          return assert.equal(topic.titleize('x-men: the last stand'), 'X Men: The Last Stand');
+        },
+        'with ampersands': function(topic) {
+          return assert.equal(topic.titleize('garfunkel & oates'), 'Garfunkel & Oates');
+        }
+      },
+      'tableize': function(topic) {
+        var i, words, _i, _len, _ref, _results;
+        words = cases.ClassNameToTableName;
+        _ref = Object.keys(words);
+        _results = [];
+        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+          i = _ref[_i];
+          _results.push(assert.equal(topic.tableize(i), words[i]));
+        }
+        return _results;
+      },
+      'classify': {
+        'underscore': function(topic) {
+          var i, words, _i, _j, _len, _len2, _ref, _ref2, _results;
+          words = cases.ClassNameToTableName;
+          _ref = Object.keys(words);
+          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            i = _ref[_i];
+            assert.equal(topic.classify(words[i]), i);
+          }
+          _ref2 = Object.keys(words);
+          _results = [];
+          for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
+            i = _ref2[_j];
+            _results.push(assert.equal(topic.classify('table_prefix.' + words[i]), i));
+          }
+          return _results;
+        },
+        'normal': function(topic) {
+          topic.inflections.irregular('octopus', 'octopi');
+          return assert.equal(topic.classify('octopi'), 'Octopus');
+        }
+      }
+    }
+  })["export"](module);
+
+}).call(this);

+ 39 - 0
node_modules/i/test/utils/array-test.js

@@ -0,0 +1,39 @@
+(function() {
+  var assert, vows, util;
+
+  vows = require('vows');
+
+  assert = require('assert');
+
+  util = require('../../lib/util');
+
+  vows.describe('Module core extension Array').addBatch({
+    'Testing del': {
+      topic: ['a', 'b', 'c'],
+      'element exists': {
+        'first element': function(topic) {
+          return assert.deepEqual(util.array.del(topic, 'a'), ['b', 'c']);
+        },
+        'middle element': function(topic) {
+          return assert.deepEqual(util.array.del(topic, 'b'), ['a', 'c']);
+        },
+        'last element': function(topic) {
+          return assert.deepEqual(util.array.del(topic, 'c'), ['a', 'b']);
+        }
+      },
+      'element does not exist': function(topic) {
+        return assert.deepEqual(util.array.del(topic, 'd'), ['a', 'b', 'c']);
+      }
+    },
+    'Testing utils': {
+      topic: ['a', 'b', 'c'],
+      'first': function(topic) {
+        return assert.equal(util.array.first(topic), 'a');
+      },
+      'last': function(topic) {
+        return assert.equal(util.array.last(topic), 'c');
+      }
+    }
+  })["export"](module);
+
+}).call(this);

+ 88 - 0
node_modules/i/test/utils/string-test.js

@@ -0,0 +1,88 @@
+(function() {
+  var assert, vows, util;
+
+  vows = require('vows');
+
+  assert = require('assert');
+
+  util = require('../../lib/util');
+
+  vows.describe('Module core extension String').addBatch({
+    'Testing value': {
+      topic: 'bullet',
+      'join the keys': function(topic) {
+        return assert.equal(util.string.value(topic), 'bullet');
+      }
+    },
+    'Testing gsub': {
+      topic: 'bullet',
+      'when no args': function(topic) {
+        return assert.equal(util.string.gsub(topic), 'bullet');
+      },
+      'when only 1 arg': function(topic) {
+        return assert.equal(util.string.gsub(topic, /./), 'bullet');
+      },
+      'when given proper args': function(topic) {
+        return assert.equal(util.string.gsub(topic, /[aeiou]/, '*'), 'b*ll*t');
+      },
+      'when replacement is a function': {
+        'with many groups': function(topic) {
+          var str;
+          str = util.string.gsub(topic, /([aeiou])(.)/, function($) {
+            return "<" + $[1] + ">" + $[2];
+          });
+          return assert.equal(str, 'b<u>ll<e>t');
+        },
+        'with no groups': function(topic) {
+          var str;
+          str = util.string.gsub(topic, /[aeiou]/, function($) {
+            return "<" + $[1] + ">";
+          });
+          return assert.equal(str, 'b<u>ll<e>t');
+        }
+      },
+      'when replacement is special': {
+        'with many groups': function(topic) {
+          return assert.equal(util.string.gsub(topic, /([aeiou])(.)/, '<$1>$2'), 'b<u>ll<e>t');
+        },
+        'with no groups': function(topic) {
+          return assert.equal(util.string.gsub(topic, /[aeiou]/, '<$1>'), 'b<u>ll<e>t');
+        }
+      }
+    },
+    'Testing capitalize': {
+      topic: 'employee salary',
+      'normal': function(topic) {
+        return assert.equal(util.string.capitalize(topic), 'Employee Salary');
+      }
+    },
+    'Testing upcase': {
+      topic: 'bullet',
+      'only first letter should be upcase': function(topic) {
+        return assert.equal(util.string.upcase(topic), 'Bullet');
+      },
+      'letter after underscore': function(topic) {
+        return assert.equal(util.string.upcase('bullet_record'), 'Bullet_Record');
+      },
+      'letter after slash': function(topic) {
+        return assert.equal(util.string.upcase('bullet_record/errors'), 'Bullet_Record/Errors');
+      },
+      'no letter after space': function(topic) {
+        return assert.equal(util.string.upcase('employee salary'), 'Employee salary');
+      }
+    },
+    'Testing downcase': {
+      topic: 'BULLET',
+      'only first letter should be downcase': function(topic) {
+        return assert.equal(util.string.downcase(topic), 'bULLET');
+      },
+      'letter after underscore': function(topic) {
+        return assert.equal(util.string.downcase('BULLET_RECORD'), 'bULLET_rECORD');
+      },
+      'letter after slash': function(topic) {
+        return assert.equal(util.string.downcase('BULLET_RECORD/ERRORS'), 'bULLET_rECORD/eRRORS');
+      }
+    }
+  })["export"](module);
+
+}).call(this);

+ 169 - 0
node_modules/mpvue-echarts/README.md

@@ -0,0 +1,169 @@
+# 在微信小程序中使用 ECharts
+
+> 本项目是 ECharts 的 Mpvue 小程序版本。开发者可以通过熟悉的 ECharts 配置方式及 Vue 语法,快速开发图表,满足各种可视化需求。
+
+[![npm package](https://img.shields.io/npm/v/mpvue-echarts.svg)](https://npmjs.org/package/mpvue-echarts)
+[![npm downloads](https://img.shields.io/npm/dm/mpvue-echarts.svg)](https://npmjs.org/package/mpvue-echarts)
+
+
+## 扫码体验
+![小程序码](./static/qrcode.jpg)
+
+
+## 安装
+
+``` bash
+npm i mpvue-echarts
+```
+
+
+## 使用
+``` vue
+<template>
+  <div class="echarts-wrap">
+    <mpvue-echarts :echarts="echarts" :onInit="onInit" canvasId="demo-canvas" />
+  </div>
+</template>
+
+<script>
+import echarts from 'echarts'
+import mpvueEcharts from 'mpvue-echarts'
+
+let chart = null;
+
+function initChart(canvas, width, height) {
+  chart = echarts.init(canvas, null, {
+    width: width,
+    height: height
+  });
+  canvas.setChart(chart);
+
+  var option = {}; // ECharts 配置项
+
+  chart.setOption(option);
+
+  return chart; // 返回 chart 后可以自动绑定触摸操作
+}
+
+export default {
+  components: {
+    mpvueEcharts
+  },
+  data () {
+    return {
+      echarts,
+      onInit: initChart
+    }
+  }
+}
+</script>
+
+<style scoped>
+.echarts-wrap {
+  width: 100%;
+  height: 300px;
+}
+</style>
+
+```
+
+这对于所有 ECharts 图表都是通用的,用户只需要修改上面 `option` 的内容,即可改变图表。`option` 的使用方法参见 [ECharts 配置项文档](http://echarts.baidu.com/option.html)。对于不熟悉 ECharts 的用户,可以参见 [5 分钟上手 ECharts](http://echarts.baidu.com/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%20ECharts) 教程。
+
+
+## 属性
+
+| 名称         | 类型           | 默认值         | 描述           |
+| -------------|--------------- | ------------- | ------------- |
+| echarts      | Object         | null          | echarts 对象  |
+| canvasId     | String         | ec-canvas     | canvasId      |
+| onInit       | Function       | null          | 初始化函数     |
+| lazyLoad     | Boolean        | false         | 懒加载         |
+| disableTouch | Boolean        | false         | 禁用触摸事件   |
+| throttleTouch| Boolean        | false         | 节流触摸事件   |
+
+
+## FAQ
+
+### [重要] 不要把 chart 实例赋值到 this(vue 实例) 上
+
+### 如何获取图表实例?
+
+`echarts.init` 返回的即为图表实例。
+
+### 打包结果超过小程序大小限制?
+
+使用自定义版 echarts,[官网定制](http://echarts.baidu.com/builder.html)
+
+### 如何延迟加载图表?
+
+参见 [examples/lazyLoad](./examples/src/pages/demos/lazyLoad.vue) 的例子,可以在获取数据后再初始化数据。
+
+### 如何在一个页面中加载多个图表?
+
+参见 [examples/multiCharts](./examples/src/pages/demos/multiCharts.vue) 的例子。
+
+### 图表变空白?
+
+尝试设置 `throttleTouch` 属性为 `true`。
+
+### 如何使用 Tooltip?
+
+目前,本项目已支持 ECharts Tooltip,但是由于 ECharts 相关功能尚未发版,因此当前需要使用原项目中 `ec-canvas/echarts.js`,这个文件包含了可以在微信中使用 Tooltip 的相关代码。目前在 ECharts 官网下载的 `echarts.js` 还不能直接替换使用,等 ECharts 正式发版后即可。
+
+具体使用方法和 ECharts 相同,例子参见 `pages/line/index.js`。
+
+### 文件太大怎么办?
+
+本项目默认提供的 ECharts 文件是最新版本的包含所有组件文件,为了便于开发,提供的是未压缩的版本。远程调试或预览可以下载 [echarts.min.js](https://github.com/apache/incubator-echarts/blob/master/dist/echarts.min.js) 压缩版本。
+
+发布时,如果对文件大小要求更高,可以在 [ECharts 在线定制](http://echarts.baidu.com/builder.html)网页下载仅包含必要组件的包,并且选择压缩。
+
+### 打包时出错 `ERROR in static/js/vendor.js from UglifyJs`
+
+参照以下配置使 babel 处理 mpvue-echarts
+``` js
+// webpack.base.conf.js
+{
+  test: /\.js$/,
+  include: [
+    resolve('src'),
+    resolve('node_modules/mpvue-echarts')
+  ],
+  use: [
+    'babel-loader',
+    {
+      loader: 'mpvue-loader',
+      options: {
+        checkMPEntry: true
+      }
+    }
+  ]
+}
+```
+
+
+## 微信版本要求
+
+支持微信版本 >= 6.6.3,对应基础库版本 >= 1.9.91。尽可能使用更高版本的基础库版本。
+
+调试的时候,需要在微信开发者工具中,将“详情”下的“调试基础库”设为 1.9.91 及以上版本。
+
+发布前,需要在 [https://mp.weixin.qq.com](https://mp.weixin.qq.com) 的“设置”页面,将“基础库最低版本设置”设为 1.9.91。当用户微信版本过低的时候,会提示用户更新。
+
+
+## 暂不支持的功能
+
+ECharts 中的绝大部分功能都支持小程序版本,因此这里仅说明不支持的功能,以及存在的问题。
+
+以下功能尚不支持,如果有相关需求请在 [issue](https://github.com/ecomfe/echarts-for-weixin/issues) 中向我们反馈,对于反馈人数多的需求将优先支持:
+
+- 图片
+- 多个 zlevel 分层
+
+此外,目前还有一些 bug 尚未修复,部分需要小程序团队配合上线支持,但不影响基本的使用。已知的 bug 包括:
+
+- 安卓平台:transform 的问题(会影响关系图边两端的标记位置、旭日图文字位置等)
+- iOS 平台:半透明略有变深的问题
+- iOS 平台:渐变色出现在定义区域之外的地方
+
+如有其它问题,也欢迎在 [issue](https://github.com/ecomfe/echarts-for-weixin/issues) 中向我们反馈,谢谢!

+ 67 - 0
node_modules/mpvue-echarts/package.json

@@ -0,0 +1,67 @@
+{
+  "_from": "mpvue-echarts",
+  "_id": "mpvue-echarts@0.3.2",
+  "_inBundle": false,
+  "_integrity": "sha512-KULGS1DOMNhXu3nBkBv6BtmnqjyHLc+2Dur7eW+2s2aic1NCOygglCMmAmMEU6/TGSR67ttFA2NYxXPUYbNhWQ==",
+  "_location": "/mpvue-echarts",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "mpvue-echarts",
+    "name": "mpvue-echarts",
+    "escapedName": "mpvue-echarts",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/mpvue-echarts/-/mpvue-echarts-0.3.2.tgz",
+  "_shasum": "e08a9dd8233dce306e248a3470bf7f0279422ac2",
+  "_spec": "mpvue-echarts",
+  "_where": "F:\\Lanse\\demo\\zhou-qian\\sancan-miniapp",
+  "author": {
+    "name": "F-loat",
+    "email": "chaimaoyuan@foxmail.com"
+  },
+  "bugs": {
+    "url": "https://github.com/F-loat/mpvue-echarts/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "适用于 Mpvue 的 ECharts 组件",
+  "devDependencies": {
+    "babel-eslint": "^8.2.2",
+    "eslint": "^4.19.1",
+    "eslint-config-airbnb-base": "^12.1.0",
+    "eslint-friendly-formatter": "^4.0.1",
+    "eslint-plugin-html": "^4.0.3",
+    "eslint-plugin-import": "^2.10.0"
+  },
+  "files": [
+    "src",
+    "types"
+  ],
+  "homepage": "https://github.com/F-loat/mpvue-echarts#readme",
+  "keywords": [
+    "mpvue",
+    "echarts",
+    "wxapp"
+  ],
+  "license": "MIT",
+  "main": "src/echarts.vue",
+  "name": "mpvue-echarts",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/F-loat/mpvue-echarts.git"
+  },
+  "scripts": {
+    "lint": "eslint --format node_modules/eslint-friendly-formatter --ext .js,.vue src",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "typings": "types/index.d.ts",
+  "version": "0.3.2"
+}

+ 125 - 0
node_modules/mpvue-echarts/src/echarts.vue

@@ -0,0 +1,125 @@
+<template>  
+<canvas  
+v-if="canvasId"  
+class="ec-canvas"  
+:id="canvasId"  
+:canvasId="canvasId"  
+@touchstart="touchStart"  
+@touchmove="touchMove"  
+@touchend="touchEnd"  
+@error="error"  
+></canvas>  
+</template>  
+<script>  
+import WxCanvas from "./wx-canvas";  
+export default {  
+props: {  
+canvasId: {  
+  type: String,  
+  default: "ec-canvas"  
+},  
+lazyLoad: {  
+  type: Boolean,  
+  default: false  
+},  
+disableTouch: {  
+  type: Boolean,  
+  default: false  
+},  
+throttleTouch: {  
+  type: Boolean,  
+  default: false  
+}  
+},  
+// #ifdef H5  
+mounted() {  
+if (!this.lazyLoad) this.init();  
+},  
+// #endif  
+// #ifndef H5  
+onReady() {  
+if (!this.lazyLoad) this.init();  
+},  
+// #endif  
+methods: {  
+setChart(chart) {  
+  this.chart = chart;  
+},  
+init() {  
+  const { canvasId } = this;  
+  this.ctx = wx.createCanvasContext(canvasId, this);  
+  this.canvas = new WxCanvas(this.ctx, canvasId);  
+  const query = wx.createSelectorQuery().in(this);  
+  query  
+    .select(`#${canvasId}`)  
+    .boundingClientRect(res => {  
+      if (!res) {  
+        setTimeout(() => this.init(), 50);  
+        return;  
+      }  
+      this.$emit("onInit", {  
+        width: res.width,  
+        height: res.height  
+      });  
+    })  
+    .exec();  
+},  
+canvasToTempFilePath(opt) {  
+  const { canvasId } = this;  
+  this.ctx.draw(true, () => {  
+    wx.canvasToTempFilePath({  
+      canvasId,  
+      ...opt  
+    });  
+  });  
+},  
+touchStart(e) {  
+  const { disableTouch, chart } = this;  
+  if (disableTouch || !chart || !e.mp.touches.length) return;  
+  const touch = e.mp.touches[0];  
+  chart._zr.handler.dispatch("mousedown", {  
+    zrX: touch.x,  
+    zrY: touch.y  
+  });  
+  chart._zr.handler.dispatch("mousemove", {  
+    zrX: touch.x,  
+    zrY: touch.y  
+  });  
+},  
+touchMove(e) {  
+  const { disableTouch, throttleTouch, chart, lastMoveTime } = this;  
+  if (disableTouch || !chart || !e.mp.touches.length) return;  
+  if (throttleTouch) {  
+    const currMoveTime = Date.now();  
+    if (currMoveTime - lastMoveTime < 240) return;  
+    this.lastMoveTime = currMoveTime;  
+  }  
+  const touch = e.mp.touches[0];  
+  chart._zr.handler.dispatch("mousemove", {  
+    zrX: touch.x,  
+    zrY: touch.y  
+  });  
+},  
+touchEnd(e) {  
+  const { disableTouch, chart } = this;  
+  if (disableTouch || !chart) return;  
+  const touch = e.mp.changedTouches ? e.mp.changedTouches[0] : {};  
+  chart._zr.handler.dispatch("mouseup", {  
+    zrX: touch.x,  
+    zrY: touch.y  
+  });  
+  chart._zr.handler.dispatch("click", {  
+    zrX: touch.x,  
+    zrY: touch.y  
+  });  
+}  
+}  
+};  
+</script>  
+<style scoped>  
+.ec-canvas {  
+width: 100%;  
+height: 200px;  
+flex: 1;  
+}  
+</style>

+ 73 - 0
node_modules/mpvue-echarts/src/wx-canvas.js

@@ -0,0 +1,73 @@
+export default class WxCanvas {
+  constructor(ctx, canvasId) {
+    this.ctx = ctx;
+    this.canvasId = canvasId;
+    this.chart = null;
+
+    WxCanvas.initStyle(ctx);
+    this.initEvent();
+  }
+
+  getContext(contextType) {
+    return contextType === '2d' ? this.ctx : null;
+  }
+
+  setChart(chart) {
+    this.chart = chart;
+  }
+
+  attachEvent() {
+    // noop
+  }
+
+  detachEvent() {
+    // noop
+  }
+
+  static initStyle(ctx) {
+    const styles = ['fillStyle', 'strokeStyle', 'globalAlpha',
+      'textAlign', 'textBaseAlign', 'shadow', 'lineWidth',
+      'lineCap', 'lineJoin', 'lineDash', 'miterLimit', 'fontSize'];
+
+    styles.forEach((style) => {
+      Object.defineProperty(ctx, style, {
+        set: (value) => {
+          if ((style !== 'fillStyle' && style !== 'strokeStyle')
+            || (value !== 'none' && value !== null)
+          ) {
+            ctx[`set${style.charAt(0).toUpperCase()}${style.slice(1)}`](value);
+          }
+        },
+      });
+    });
+
+    ctx.createRadialGradient = () => ctx.createCircularGradient(arguments);
+  }
+
+  initEvent() {
+    this.event = {};
+    const eventNames = [{
+      wxName: 'touchStart',
+      ecName: 'mousedown',
+    }, {
+      wxName: 'touchMove',
+      ecName: 'mousemove',
+    }, {
+      wxName: 'touchEnd',
+      ecName: 'mouseup',
+    }, {
+      wxName: 'touchEnd',
+      ecName: 'click',
+    }];
+
+    eventNames.forEach((name) => {
+      this.event[name.wxName] = (e) => {
+        const touch = e.mp.touches[0];
+        this.chart.getZr().handler.dispatch(name.ecName, {
+          zrX: name.wxName === 'tap' ? touch.clientX : touch.x,
+          zrY: name.wxName === 'tap' ? touch.clientY : touch.y,
+        });
+      };
+    });
+  }
+}

+ 11 - 0
node_modules/mpvue-echarts/types/echarts.d.ts

@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+/** Echarts Component */
+export declare class Ecahrts extends Vue {
+  echarts: object
+  onInit?: () => object
+  canvasId?: string
+  lazyLoad?: boolean
+  disableTouch?: boolean
+  throttleTouch?: boolean
+}

+ 3 - 0
node_modules/mpvue-echarts/types/index.d.ts

@@ -0,0 +1,3 @@
+import { Ecahrts } from './echarts'
+
+export default Ecahrts

+ 96 - 0
node_modules/prettier/README.md

@@ -0,0 +1,96 @@
+![Prettier Banner](https://raw.githubusercontent.com/prettier/prettier-logo/master/images/prettier-banner-light.png)
+
+<h2 align="center">Opinionated Code Formatter</h2>
+
+<p align="center">
+  <em>
+  JavaScript
+  · Flow
+  · TypeScript
+  · CSS
+  · SCSS
+  · Less
+  · JSX
+  · Vue
+  · GraphQL
+  · JSON
+  · Markdown
+  · <a href="https://prettier.io/docs/en/plugins.html">
+      Your favorite language?
+    </a>
+  </em>
+</p>
+
+<p align="center">
+  <a href="https://gitter.im/jlongster/prettier">
+    <img alt="Gitter" src="https://img.shields.io/gitter/room/jlongster/prettier.svg?style=flat-square">
+  </a>
+  <a href="https://travis-ci.org/prettier/prettier">
+    <img alt="Travis" src="https://img.shields.io/travis/prettier/prettier/master.svg?style=flat-square">
+  </a>
+  <a href="https://codecov.io/gh/prettier/prettier">
+    <img alt="Codecov" src="https://img.shields.io/codecov/c/github/prettier/prettier.svg?style=flat-square">
+  </a>
+  <a href="https://www.npmjs.com/package/prettier">
+    <img alt="npm version" src="https://img.shields.io/npm/v/prettier.svg?style=flat-square">
+  </a>
+  <a href="https://www.npmjs.com/package/prettier">
+    <img alt="monthly downloads" src="https://img.shields.io/npm/dm/prettier.svg?style=flat-square">
+  </a>
+  <a href="#badge">
+    <img alt="code style: prettier" src="https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square">
+  </a>
+  <a href="https://twitter.com/PrettierCode">
+    <img alt="Follow+Prettier+on+Twitter" src="https://img.shields.io/twitter/follow/prettiercode.svg?label=follow+prettier&style=flat-square">
+  </a>
+</p>
+
+## Intro
+
+Prettier is an opinionated code formatter. It enforces a consistent style by parsing your code and re-printing it with its own rules that take the maximum line length into account, wrapping code when necessary.
+
+### Input
+
+<!-- prettier-ignore -->
+```js
+foo(reallyLongArg(), omgSoManyParameters(), IShouldRefactorThis(), isThereSeriouslyAnotherOne());
+```
+
+### Output
+
+```js
+foo(
+  reallyLongArg(),
+  omgSoManyParameters(),
+  IShouldRefactorThis(),
+  isThereSeriouslyAnotherOne()
+);
+```
+
+Prettier can be run [in your editor](http://prettier.io/docs/en/editors.html) on-save, in a [pre-commit hook](https://prettier.io/docs/en/precommit.html), or in [CI environments](https://prettier.io/docs/en/cli.html#list-different) to ensure your codebase has a consistent style without devs ever having to post a nit-picky comment on a code review ever again!
+
+---
+
+**[Documentation](https://prettier.io/docs/en/)**
+
+<!-- prettier-ignore -->
+[Install](https://prettier.io/docs/en/install.html) ·
+[Options](https://prettier.io/docs/en/options.html) ·
+[CLI](https://prettier.io/docs/en/cli.html) ·
+[API](https://prettier.io/docs/en/api.html)
+
+**[Playground](https://prettier.io/playground/)**
+
+---
+
+## Badge
+
+Show the world you're using _Prettier_ → [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
+
+```md
+[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
+```
+
+## Contributing
+
+See [CONTRIBUTING.md](CONTRIBUTING.md).

Diff do ficheiro suprimidas por serem muito extensas
+ 181 - 0
node_modules/prettier/bin-prettier.js


Diff do ficheiro suprimidas por serem muito extensas
+ 178 - 0
node_modules/prettier/index.js


+ 86 - 0
node_modules/prettier/package.json

@@ -0,0 +1,86 @@
+{
+  "_from": "prettier@~1.12.0",
+  "_id": "prettier@1.12.1",
+  "_inBundle": false,
+  "_integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=",
+  "_location": "/prettier",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "prettier@~1.12.0",
+    "name": "prettier",
+    "escapedName": "prettier",
+    "rawSpec": "~1.12.0",
+    "saveSpec": null,
+    "fetchSpec": "~1.12.0"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "http://registry.npm.taobao.org/prettier/download/prettier-1.12.1.tgz",
+  "_shasum": "c1ad20e803e7749faf905a409d2367e06bbe7325",
+  "_spec": "prettier@~1.12.0",
+  "_where": "E:\\weilanwlSVN\\colorui\\github\\ColorUI\\Colorui-UniApp",
+  "author": {
+    "name": "James Long"
+  },
+  "bin": {
+    "prettier": "./bin-prettier.js"
+  },
+  "bugs": {
+    "url": "https://github.com/prettier/prettier/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Prettier is an opinionated code formatter",
+  "devDependencies": {
+    "babel-cli": "6.24.1",
+    "babel-preset-es2015": "6.24.1",
+    "codecov": "2.2.0",
+    "cross-env": "5.0.5",
+    "eslint": "4.18.2",
+    "eslint-config-prettier": "2.9.0",
+    "eslint-friendly-formatter": "3.0.0",
+    "eslint-plugin-import": "2.9.0",
+    "eslint-plugin-prettier": "2.6.0",
+    "eslint-plugin-react": "7.7.0",
+    "jest": "21.1.0",
+    "mkdirp": "0.5.1",
+    "prettier": "1.12.0",
+    "prettylint": "1.0.0",
+    "rimraf": "2.6.2",
+    "rollup": "0.47.6",
+    "rollup-plugin-commonjs": "8.2.6",
+    "rollup-plugin-json": "2.1.1",
+    "rollup-plugin-node-builtins": "2.0.0",
+    "rollup-plugin-node-globals": "1.1.0",
+    "rollup-plugin-node-resolve": "2.0.0",
+    "rollup-plugin-replace": "1.2.1",
+    "shelljs": "0.8.1",
+    "snapshot-diff": "0.2.2",
+    "strip-ansi": "4.0.0",
+    "tempy": "0.2.1",
+    "uglify-es": "3.3.9",
+    "webpack": "2.6.1"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "files": [
+    "*.js"
+  ],
+  "homepage": "https://prettier.io",
+  "license": "MIT",
+  "main": "./index.js",
+  "name": "prettier",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/prettier/prettier.git"
+  },
+  "scripts": {
+    "prepublishOnly": "node -e \"assert.equal(require('.').version, require('..').version)\""
+  },
+  "version": "1.12.1"
+}

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
node_modules/prettier/parser-babylon.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
node_modules/prettier/parser-flow.js


Diff do ficheiro suprimidas por serem muito extensas
+ 109 - 0
node_modules/prettier/parser-glimmer.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
node_modules/prettier/parser-graphql.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
node_modules/prettier/parser-markdown.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
node_modules/prettier/parser-parse5.js


Diff do ficheiro suprimidas por serem muito extensas
+ 3761 - 0
node_modules/prettier/parser-postcss.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
node_modules/prettier/parser-typescript.js


+ 0 - 0
node_modules/prettier/parser-upload.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
node_modules/prettier/parser-vue.js


Diff do ficheiro suprimidas por serem muito extensas
+ 365 - 0
node_modules/prettier/third-party.js


+ 23 - 0
package-lock.json

@@ -0,0 +1,23 @@
+{
+  "name": "clock-front",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "i": {
+      "version": "0.3.7",
+      "resolved": "https://registry.npmmirror.com/i/-/i-0.3.7.tgz",
+      "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q=="
+    },
+    "mpvue-echarts": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/mpvue-echarts/-/mpvue-echarts-0.3.2.tgz",
+      "integrity": "sha512-KULGS1DOMNhXu3nBkBv6BtmnqjyHLc+2Dur7eW+2s2aic1NCOygglCMmAmMEU6/TGSR67ttFA2NYxXPUYbNhWQ=="
+    },
+    "prettier": {
+      "version": "1.12.1",
+      "resolved": "http://registry.npm.taobao.org/prettier/download/prettier-1.12.1.tgz",
+      "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU="
+    }
+  }
+}

+ 22 - 0
package.json

@@ -0,0 +1,22 @@
+{
+  "name": "clock-front",
+  "version": "1.0.0",
+  "description": "<p style=\"text-align: center;\"><img src=\"https://image.weilanwl.com/uni/UniAppReadme.jpg\" alt=\"ColorUI简介\"></img></p>",
+  "main": "main.js",
+  "dependencies": {
+    "i": "^0.3.7",
+    "mpvue-echarts": "^0.3.2",
+    "prettier": "^1.12.1"
+  },
+  "devDependencies": {},
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git@code.aliyun.com:xuntic-group/clock-front.git"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC"
+}

+ 217 - 0
pages.json

@@ -0,0 +1,217 @@
+{
+	"pages": [
+		//pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path" : "pages/index/index",
+			"style" :
+			{
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		},{
+		    "path" : "pages/login/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+		    "path" : "pages/data-filled/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+			"path" : "pages/sample-check-list/index",
+			"style" :
+			{
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		},{
+			"path" : "pages/sample-check-list/sample-detail/index",
+			"style" :
+			{
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		},
+		{
+			"path" : "pages/sample-check-list/home",
+			"style" :
+			{
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		},{
+			"path" : "pages/zf-task-list/index",
+			"style" :
+			{
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		},{
+			"path" : "pages/zf-task-list/taskList",
+			"style" :
+			{
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		},{
+			"path" : "pages/zf-task-list/sampleRandom/index",
+			"style" :
+			{
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		},
+
+		{
+		    "path" : "pages/home/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+		    "path" : "pages/sample-sheet-add/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+		    "path" : "pages/task-list/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+		    "path" : "pages/sample-info-list/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+		    "path" : "pages/sample-detail/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+		    "path" : "pages/sample-list/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+	    {
+	        "path" : "pages/task-detail/index",
+	        "style" :                                                                                    
+	        {
+	            "navigationBarTitleText": "",
+	            "enablePullDownRefresh": false
+	        }
+	        
+	    },
+		{
+		    "path" : "pages/quick-task/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+            "path" : "pages/quick-task/camera",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        },
+		{
+		    "path" : "pages/quick-task/form",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		}
+        ,{
+            "path" : "pages/quick-task/result",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        },
+		{
+		    "path" : "pages/quick-task/list",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+		    "path" : "pages/quick-task/quick-list",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		}
+	
+    ],
+	"permission": {
+	    "scope.userLocation": {
+	      "desc": "你的位置信息将用于小程序位置接口的效果展示" // 高速公路行驶持续后台定位
+	    }
+	  },
+	"globalStyle": {
+			
+			"mp-alipay": {
+				/* 支付宝小程序特有相关 */
+				"transparentTitle": "always",
+				"allowsBounceVertical": "NO"
+			},
+			"navigationBarBackgroundColor": "#0081ff",
+			"navigationBarTitleText": "安徽省质量安全检测监测平台",
+			"navigationStyle": "custom",
+			"navigationBarTextStyle": "white"
+		}
+}

+ 23 - 0
pages/data-filled/data-filled-model.js

@@ -0,0 +1,23 @@
+import {
+	Base
+} from '../../static/util/base.js'
+class DataFilled extends Base {
+	constructor() {
+		super();
+	}
+
+	getAhSampleSheetDetail(id,callBack) {
+		var params = {
+			url: '/ah/ahSampleSheet/'+id,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+}
+
+const _dataFilled = new DataFilled();
+export {
+	_dataFilleds
+}

+ 253 - 0
pages/data-filled/index.vue

@@ -0,0 +1,253 @@
+<template>
+	<view class="home">
+		<cu-custom class="home-custom" bgColor=".bg-sancolor" bgImage="../../static/icons/bg.png" :isBack="true">
+			<block slot="content">皖监测</block>
+		</cu-custom>
+		<view>
+			<view class="cu-list menu content-box">
+				<view class="cu-bar bg-white margin-top">
+					<view class="action">
+						<text class="cuIcon-title text-green"></text>
+						<text>优质农产品监测与评价</text>
+						<span class="filled-instro" data-target="Modal" @tap="filledButton">(填写说明)</span>
+					</view>
+				</view>
+				<form>
+					<view class="cu-form-group ">
+						<view class="title">1.基地名称</view>
+						<input placeholder="请输入基地名称" name="input" ></input>
+					</view>
+					<!-- <view class="cu-form-group ">
+						<view class="title">基地类型</view>
+						<input placeholder="请输入基地类型" name="input"></input>
+						<button class='cu-btn bg-green shadow'>+</button>
+					</view>
+					 -->
+					<view class="cu-form-group "  v-for="(item, index) in jdlx">
+						<view class="title">2.基地类型</view>
+						<picker @change="PickerChange" :value="item.index" :range="picker" v-model="item.name">
+							<view class="picker">
+								{{index>-1?picker[item.index]:'选择基地类型'}}
+							</view>
+						</picker>
+						
+					</view>	
+					<!-- <button class='cu-btn bg-green' @tap="addJdlx" style="margin-left: 5px;">+</button> -->
+					<view class="padding flex flex-direction">
+					  <button class="cu-btn bg-grey lg"  @tap="addJdlx">添加多个基地类型</button>
+					</view>
+					
+					<view  v-for="(item, index) in product">
+					<view class="cu-form-group margin-top">
+						<view class="title">3.主要产品</view>
+						<input placeholder="请输入主要产品" name="input" ></input>
+					</view>
+					<view class="cu-form-group ">
+						<view class="title">4.基地规模</view>
+						<input placeholder="请输入基地规模" name="input"></input>
+					</view>
+					<view class="cu-form-group ">
+						<view class="title">5.产品产量</view>
+						<input placeholder="请输入产品产量" name="input"></input>
+						<view>公斤</view>
+					</view>
+					<view class="cu-form-group ">
+						<view class="title">6.产品产值</view>
+						<input placeholder="请输入产品产值" name="input"></input>
+						<view>元</view>
+					</view>
+					<view class="cu-form-group ">
+						<view class="title">7.产品分类</view>
+						<picker @change="PickerCategoryChange"   :range="category">
+							<view class="picker">
+								{{indexCategory>-1?category[item.index]:'选择产品分类'}}
+							</view>
+						</picker>
+					</view>
+					<view class="cu-form-group ">
+						<view class="title">单位</view>
+						<input placeholder="请输入产品单位" name="input"></input>
+					</view>
+					</view>
+					
+					<view class="padding flex flex-direction">
+					  <button class="cu-btn bg-grey lg"  @tap="addProduct">添加多个产品</button>
+					</view>
+					
+					<view class="cu-form-group margin-top">
+						<view class="title">8.社会信用代码</view>
+						<input placeholder="请输入产品产量" name="input"></input>
+					</view>
+					<view class="cu-form-group ">
+						<view class="title">9.主要联系人</view>
+						<input placeholder="请输入姓名" name="input"></input>
+					</view>
+					<view class="cu-form-group ">
+						<view class="title">10.联系电话</view>
+						<input placeholder="请输入11位手机号" name="input"></input>
+					</view>
+					<view class="cu-form-group ">
+						<view class="title">11.行政区划</view>
+						<input placeholder="请输入行政区划" name="input"></input>
+					</view>
+					<view class="cu-form-group ">
+						<view class="title">12.基地地址</view>
+						<input placeholder="请输入基地详细地址" name="input"></input>
+					</view>
+					<view class="cu-form-group ">
+						<view class="title">13.证书编号</view>
+						<input placeholder="请输入证书编号" name="input"></input>
+					</view>
+					<view class="cu-form-group ">
+						<view class="title">14.证书有效期</view>
+						<input placeholder="请输入证书有效期" name="input"></input>
+					</view>
+				</form>
+				
+				<view class="padding flex flex-direction">
+				  <button class="cu-btn bg-green  lg">保存</button>
+				</view>
+			</view>
+			
+			<view class="cu-modal" :class="modalName=='Modal'?'show':''">
+						<view class="cu-dialog">
+							<view class="cu-bar bg-white justify-end">
+								<view class="content">填写说明</view>
+								<view class="action" @tap="hideModal">
+									<text class="cuIcon-close text-red"></text>
+								</view>
+							</view>
+							<view class="padding-xl" style="text-align: left;">
+								<view><span class="filled-name">1.基地名称:</span>录入基地的准确全称。有固定名称的,填写须与基地取得相关认证登记证书上的名称一致;无固定名称的,按“基地主体+所在乡镇+基地名称”格式填写。</view>
+								<view><span class="filled-name">2.基地类型:</span>分为绿色食品生产基地、有机农产品生产基地、地理标志农产品核心生产基地、良好农业规范认证生产基地、全程质量控制生产基地、名特优新农产品生产基地、绿色食品原料标准化生产基地、省级绿色优质农产品生产基地8个类型。如有多个类型,需逐个录入。</view>
+								<view><span class="filled-name">3.主要产品:</span>录入该基地生产的主要农产品名称。如有多种产品,需逐个录入。</view>
+								<view><span class="filled-name">4.基地规模:</span>依据产品名称,分别录入应对产品规模。</view>
+								<view><span class="filled-name">5.产品产量:</span>上一年度产品产量,公斤。</view>
+								<view><span class="filled-name">6.产品产值:</span>上一年度产品产值,元。</view>
+								<view><span class="filled-name">7.产品分类及单位:</span>①种植类,填写该基地实际种植面积,单位为亩;②畜禽类,填写该基地对应畜禽当前的存栏量,其中猪、牛、羊单位为头,鸡单位为只;③水产类,填写该基地水产品养殖面积,单位为亩。④其他类,指未列入选项的产品品种,单位由县级根据实际品种确定。</view>
+								
+								<view><span class="filled-name">8.社会信用代码/身份证:</span>优先录入主体统一社会信用代码,无统一社会信用代码的,可以录入主体身份号码。如农户或者家庭农场主体可填写身份证号码。</view>
+								<view><span class="filled-name">9.主要联系人:</span>基地联系人姓名。。</view>
+								<view><span class="filled-name">10.联系电话:</span>录入11位电话号码。</view>
+								<view><span class="filled-name">11.行政区划:</span>录入对应的行政区划全称,可查看行政区域字典表。如为直管市、直管县,则两级录入同一个名称。</view>
+								<view><span class="filled-name">12.基地地址:</span>录入基地详细地址。如:红岩村濮岩路219号。</view>
+								<view><span class="filled-name">13.证书编号:</span>录入对应产品的证书编号。</view>
+								<view><span class="filled-name">14.证书有效期:</span>为证书有效期开始日期、截止日期,按照对应证书有效期限填写。</view>
+								
+							</view>
+						</view>
+					</view>
+		</view>
+		</view>
+</template>
+
+
+<script>
+	// import {_dataFilleds} from'./data-filled-model.js'
+	export default {
+
+		data() {
+			return {
+				sampleDetailInfo: null,
+				input_diabled: false,
+				modalName: null,
+				
+				indexCategory:0,
+				picker: ['绿色食品生产基地','有机农产品生产基地','地理标志农产品核心生产基地','良好农业规范认证生产基地','全程质量控制生产基地','名特优新农产品生产基地','绿色食品原料标准化生产基地','省级绿色优质农产品生产基地'],
+				category:['种植类','畜禽类','水产类','其他类'],
+				jdlx:[
+					{
+						name:'',
+						index: 0
+					}
+				],
+				product:[{
+					zycp: '',
+					jdgm: '',
+					cpcl: '',
+					cpcz: '',
+					cpfl: '',
+					dw: '',
+					index:0
+				}]
+			}
+		},
+
+		created() {
+
+		},
+		onLoad(options) {
+
+		},
+
+		mounted() {
+
+		},
+		methods: {
+			filledButton(e){
+				this.modalName = e.currentTarget.dataset.target
+			},
+			hideModal(e) {
+				this.modalName = null
+			},
+			PickerChange(e) {
+				this.index = e.detail.value
+			},
+			PickerCategoryChange(e){
+				this.indexCategory = e.detail.value
+			},
+			addJdlx(){
+				this.jdlx.push({
+					name:''
+				})
+			},
+			addProduct(){
+				this.product.push({
+					zycp: '',
+					jdgm: '',
+					cpcl: '',
+					cpcz: '',
+					cpfl: '',
+					dw: ''
+				})
+			}
+			// rediectHome(){
+			//    uni.redirectTo({
+			//    	url:'/pages/index/index'
+			//    })	
+			// },
+			// toSampleInfoList(id){
+			// 	uni.navigateTo({
+			// 		url:'/pages/sample-info-list/index?id='+id
+			// 	})
+			// },
+			// getSampleInfoDetail(id){
+			// 	_dataFilleds.getAhSampleSheetDetail(id,res=>{
+			// 		console.log(res)
+			// 		this.sampleDetailInfo = res.data.data
+			// 	})
+			// },
+			// saveSampleInfoList(){
+			// 	console.log(11)
+			// }
+		}
+	}
+</script>
+
+<style scoped>
+/* 	.content {
+		padding: 10px;
+	}
+
+	.content-box {
+		margin: 10px;
+		border-radius: 5px;
+	} */
+	.filled-instro{
+		color: cadetblue;
+		text-decoration:underline;
+	}
+	.filled-name{
+		font-weight: bold;
+	}
+</style>

+ 53 - 0
pages/home/home.js

@@ -0,0 +1,53 @@
+import { Base } from "../../static/util/base.js";
+
+class home extends Base {
+
+  constructor() {
+    super();
+  }
+
+
+
+  //获取最近的地块list
+  location(data, callBack) {
+    const params = {
+      url: '/admin/employee/location',
+      type: 'GET',
+      data:data,
+      sCallBack: function (res) {
+        callBack && callBack(res)
+      }
+    }
+    this.request(params);
+  }
+  
+	//上传图片
+	ChooseImage(filePath, callBack) {
+		const params = {
+			url: '/admin/employee/geturl',
+			type: 'POST',
+			name: 'photo',
+			filePath: filePath,
+			sCallBack: function (res) {
+				callBack && callBack(res)
+			}
+		}
+		this.uploadFile(params);
+	}
+  
+	getLandImg(data, callBack) {
+	  const params = {
+			url: '/admin/employee/getLandImg',
+			type:'POST',
+			data:data,
+			sCallBack: function (res) {
+				callBack && callBack(res)
+			}
+	  }
+	  this.request(params);
+	}
+  
+}
+
+const _home = new home();
+export { _home };

+ 349 - 0
pages/home/index.vue

@@ -0,0 +1,349 @@
+<template name="basics">
+  <view>
+    <cu-custom class="home-custom" bgColor=".bg-sancolor"
+               bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/64bdccea7bd72.png">
+      <block slot="content">精准大田专家填报系统</block>
+    </cu-custom>
+    <scroll-view scroll-y class="page">
+
+		<view>
+			<view class=" cu-bar bg-white solid-bottom margin-top" >
+			    <view class="action">
+			        <text class="cuIcon-title text-blue"></text> 信息填报
+			    </view>
+			</view>
+			<view class="cu-list menu margin-top">
+				<view class="cu-form-group">
+					<view class="title must">专家名称</view>
+					<input type="text" :value="userInfo.author">
+				</view>
+			    <view class="cu-form-group">
+			        <view class="title must">位置选择</view>
+					<picker :value="userInfo.site" :range="pickerRange"  @change="caseTypeChange">
+						<view class="picker">
+							{{ userInfo.site ?userInfo.site :'请选择'}}
+						</view>
+					</picker>
+			    </view>
+				
+			    <view class="cu-form-group">
+			        <view class="title must">指导时间</view>
+			        <input type="text" :value="userInfo.pzdt" disabled>
+			    </view>
+			    <view class="cu-bar bg-white ">
+			    	<view class="action must">
+			    		现场图片
+			    	</view>
+			    	<view class="action">
+			    		{{ imgList.length }}/1
+			    	</view>
+			    </view>
+			    <view class="cu-form-group">
+			    	<view class="grid col-4 grid-square flex-sub">
+			    		<view class="bg-img" v-for="(item,index) in imgList" :key="index" @tap="ViewImage" :data-url="imgList[index]">
+			    			<image :src="imgList[index]" mode="aspectFill"></image>
+			    			<view class="cu-tag bg-red" @tap.stop="DelImg" :data-index="index">
+			    				<text class='cuIcon-close'></text>
+			    			</view>
+			    		</view>
+			    		<view class="solids" @tap="ChooseImage" v-if="imgList.length<1">
+			    			<text class='cuIcon-cameraadd'></text>
+			    		</view>
+			    	</view>
+			    </view>
+			</view>
+			
+			<view class="padding  flex flex-direction">
+			    <button class="cu-btn bg-blue lg  margin-tb-sm shadow-blur text-lg"
+			            @click="submit" type="" >提交
+			    </button>
+			</view>
+			
+			
+		</view>
+		
+		
+		
+		
+		<view class="footer">
+			<view>主办单位:安徽省农业农村厅质监处</view>
+			<view>技术支持:安徽省北斗精准农业信息工程实验室</view>
+		</view>
+      <view class="cu-tabbar-height"></view>
+    </scroll-view>
+  </view>
+</template>
+
+<script>
+  import { Messages } from "prettier/parser-postcss";
+  import { _home } from "./home.js";
+  
+
+  export default {
+    name: "basics",
+    data() {
+      return {
+        cardCur: 0,
+        dotStyle: false,
+        towerStart: 0,
+        direction: "",
+		userInfo:{},
+		imgList: [],//图片list
+		caseTypeList:[],//'黑塔镇蒋杨村','韦集镇陈圩村','灵城镇界沟村','支河镇鸭湖村'
+      };
+    },
+	computed: {
+		pickerRange() {
+		  return this.caseTypeList.map(item => item.site);
+		}
+	},
+	created() {
+		const now = new Date();
+		const year = now.getFullYear();
+		const month = now.getMonth() + 1;
+		const day = now.getDate();
+		const today = year + "-" + (month >= 10 ? month : ("0" + month)) + "-" + (day >= 10 ? day : ("0" + day));
+		this.$set(this.userInfo, "pzdt", today);
+		
+		
+		this.getLo();
+		
+		this.$set(this.userInfo,"author",wx.getStorageSync('username'));
+		console.log("缓存"+wx.getStorageSync('username'))
+		
+		this.toNextPage();
+		
+		
+		
+		
+		
+		
+		
+		
+	},
+    methods: {
+		getLocation() {
+			return new Promise((resolve, reject) => {
+				uni.getLocation({
+					type: 'gcj02',
+					success: res => {
+						console.log('当前位置的经度:' + res.longitude);
+						console.log('当前位置的纬度:' + res.latitude);
+						const {latitude: lat, longitude: lng} = res;
+						resolve(res);
+					},
+					fail: err => {
+						this.$msg("位置获取失败");
+						reject("位置获取失败");
+					}
+				});
+			})
+		},
+		getLo(){
+			console.log("1111111")
+			uni.showLoading({
+			    title:'获取位置中...'
+			});
+			this.getLocation().then(res => {
+				console.log(res)
+				_home.location({
+					volatitude:res.latitude,
+					volongitude:res.longitude
+				},res=>{
+					uni.hideLoading();
+					console.log(res)
+					console.log(res.data.data[1].site)
+					var a=[];
+					a=res.data.data;
+					this.caseTypeList=[];
+					for (let i = 0; i < a.length; i++) {
+						
+						this.caseTypeList.push({
+							id:i,
+							site:a[i].site,
+						})
+						
+					}
+				})
+				
+				
+				
+			   /* const {latitude: lat, longitude: lng} = res;
+			    if(!lat || !lng){
+			        this.$msg("位置信息获取失败");
+			        this.disableFirstBtn = false;
+			    }
+			    this.$set(this.checkInfo, "check_lng", lng)
+			    this.$set(this.checkInfo, "check_lat", lat) */
+			})
+		},
+		
+		/**
+		 * 类型选择事件
+		 * **/
+		caseTypeChange(e){
+			console.log(e.detail.value);
+			//this.userInfo.case_type=e.detail.value;
+			this.$set(this.userInfo,"site",this.caseTypeList[e.detail.value].site)
+		},
+		submit(){
+			var that=this;
+			this.$set(this.userInfo,"imgurl",this.imgList.join(','))
+			console.log(this.userInfo);
+			
+			  wx.showModal({
+			    title: '提示', //提示的标题
+			    content: '确定提交吗?', //提示的内容
+			    success: function(res) {
+					if(res.confirm) {
+						_home.getLandImg(that.userInfo,res=>{
+							console.log(res)
+							if(res.data.code===1){
+								that.$msg("上报成功!");
+								
+								delete that.userInfo.imgurl;
+								delete that.userInfo.site;
+								that.imgList=[]
+							}else{
+								that.$msg("上报失败!");
+							}
+						})
+					}
+			    }
+			  })
+			
+			
+			
+			
+			
+		},
+		//照片
+		ChooseImage() {
+			uni.chooseImage({
+				count:3, //默认9
+				sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+				sourceType: ['album', 'camera'], //从相册选择
+				success: (res) => {
+					console.log(res)
+					uni.showLoading({
+						title: '图片上传中'
+					})
+					_home.ChooseImage(res.tempFilePaths[0], res => {
+						console.log('返回的结果',res)
+						let data = res.data
+						data = JSON.parse(data)
+						console.log(data)
+						var url=data.data;
+						console.log(url);
+						
+						if (this.imgList.length !== 0) {
+							this.imgList = this.imgList.concat(data.data)
+						} else {
+							this.imgList = [data.data]
+						}
+						//this.userInfo.report_image.push(url)
+						this.$set(this.userInfo,"imgurl",url)
+						uni.hideLoading()
+					})
+				}
+			});
+		},
+		DelImg(e) {
+			uni.showModal({
+				title: '图片删除',
+				content: '确定要删除图片吗?',
+				cancelText: '取消',
+				confirmText: '确认',
+				success: res => {
+					console.log(res)
+					if (res.confirm) {
+						/* this.infoList.product_images.splice(e.currentTarget.dataset.index, 1);
+						this.imgList.splice(e.currentTarget.dataset.index, 1); */
+						this.imgList.splice(e.currentTarget.dataset.index, 1)
+					}
+				}
+			})
+		},
+		ViewImage(index) {
+		    uni.previewImage({
+		    	urls: this.imgList,
+		    	current: e.currentTarget.dataset.url
+		    });
+		},
+		toNextPage() {
+        console.log("判断登录");
+        //判断有没有登录,没有登录直接跳到登录,登录了 跳到任务详情
+        let username = wx.getStorageSync("username");
+        if (username == "") {
+          //没有登录
+          console.log("没有登录");
+          //跳入登录
+          uni.navigateTo({
+            url: "/pages/login/index"
+          });
+        } else {
+			console.log("已登录")
+          /* let role = uni.getStorageSync("role");
+           console.log(index)
+          if (index == 2 ) { //抽样人员的角色id
+            //表示点了抽样单位且角色是抽样单位
+              if(role === '85f63893de834bb898edc01cfd2cc46c'){
+                  //检测机构人员
+                  uni.navigateTo({
+                      url: "/pages/sample-check-list/home"
+                  });
+              } else if(role === "f35551e4a06647dea5c2c43aaba22c2a"){
+                  uni.navigateTo({
+                      url: "/pages/task-list/index"
+                  });
+              }else{
+                  uni.showToast({
+                      icon: 'error',
+                      title: "当前角色不可查看",
+                      duration: 1500
+                  })
+              }
+
+          }
+
+
+          if (index == 0 && role == "a1cbf841b0514b47bbdd3f50c80b729f") { //快检站的角色
+            //表示点了检测单位且角色是检测单位
+            uni.navigateTo({
+              url: "/pages/quick-task/list"
+            });
+          } 
+		  
+		  if (index == 1) {
+              // && role == "a1cbf841b0514b47bbdd3f50c80b729f"
+			uni.navigateTo({
+			  url: "/pages/quick-task/quick-list"
+			});
+		  } */
+
+        }
+
+      }
+    }
+  };
+</script>
+
+<style>
+    .page {
+        height: 100vh;
+    }
+
+    .footer {
+        position: fixed;
+        text-align: center;
+        line-height: 40px;
+        margin-bottom: 2px;
+        bottom: 10vh;
+        width: 100%;
+        font-size: 12px;
+    }
+
+    .footer view {
+        line-height: 22px;
+    }
+</style>

+ 60 - 0
pages/index/index.vue

@@ -0,0 +1,60 @@
+<template>
+  <view>
+    <home v-if="PageCur=='home'"></home>
+    <my v-if="PageCur=='my'"></my>
+    <view class="cu-bar tabbar bg-white shadow foot">
+      <view class="action" @click="NavChange" data-cur="home">
+        <view class="cuIcon-cu-image">
+          <image :src="'/static/icons/home' + [PageCur=='home'?'_cur':''] + '.png'"></image>
+        </view>
+        <view :class="PageCur=='home'?'text-green':'text-gray'">首页</view>
+      </view>
+      <view class="action" @click="NavChange" data-cur="my">
+        <view class="cuIcon-cu-image">
+          <image :src="'/static/icons/my' + [PageCur == 'my'?'_cur':''] + '.png'"></image>
+        </view>
+        <view :class="PageCur=='my'?'text-green':'text-gray'">我的</view>
+      </view>
+    </view>
+    <!-- 	<view style="position: absolute;bottom:80px;right:40px;">aaa</view> -->
+  </view>
+</template>
+
+<script>
+  import { _login } from "../login/login-model";
+
+  export default {
+    data() {
+      return {
+        PageCur: "home"
+      };
+    },
+    created() {
+      this.loadUserInfo();
+    },
+    methods: {
+      NavChange: function(e) {
+        this.PageCur = e.currentTarget.dataset.cur;
+      },
+      loadUserInfo() {
+        /* _login.userInfo(res => {
+          const { data: { code,data: { user } } } = res;
+          uni.setStorageSync("userInfo", user);
+		  if(code === 401){
+			  this.$msg("登录已过期,请重新登录");
+			  uni.removeStorageSync("userinfo");
+			  uni.removeStorageSync("token");
+			  setTimeout(()=>{
+				  wx.redirectTo({
+					  url: "/pages/login/index"
+				  });
+			  },1500)
+		  }
+        }); */
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 494 - 0
pages/login/index.vue

@@ -0,0 +1,494 @@
+<template>
+    <view class="login" style="background: linear-gradient(to bottom, #FFFFE0, #00FF00);">
+        <!-- <view class="bg">
+            <image src="../../static/icons/bg.png" mode="widthFix"></image>
+        </view> -->
+		
+		<view class="header" style="width: 100%;top: 10%;position: relative;">
+			<view style="font-size: 50px;text-align: center;color: green;">
+				精准大田专家填报系统
+			</view>
+		</view>
+		
+        <view class="padding flex flex-direction" style="margin-top:10vh">
+            <view class="cu-bar btn-group margin-top-sm">
+                <!-- <button class="cu-btn bg-red lg" @tap="handleWxLogin" style="margin-left: 0;">
+                    微信快捷登录
+                </button> -->
+                <!-- <button class="cu-btn bg-green lg" style="width: 60%; margin-right: 0;top: 70%;position: absolute;" @tap="handlePhoneLogin"
+                        data-target="passwordModal">
+                    账号密码登录
+                </button> -->
+				<view class="padding bg-white" style="background: linear-gradient(to bottom, #b7ff98, #b0ffaa);">
+				    <form bindsubmit="userNameLogin" bindtap="handleClick">
+				        <view class="cu-form-group margin-top">
+				            <view class="title">用户名</view>
+				            <input placeholder="请输入用户名" type="text" v-model="username">
+				        </view>
+				        <view class="cu-form-group">
+				            <view class="title">密码</view>
+				            <input placeholder="请输入密码" type="password" v-model="password">
+				        </view>
+				        <view class="padding flex flex-direction margin-top-xl">
+				            <button class="cu-btn bg-blue lg  margin-tb-sm shadow-blur text-lg"
+				                    @click="handleLoginByUsername"
+									style="margin: 0 auto;margin-bottom: 5%;width: 50%;">登录
+				            </button>
+				            <!-- <button class="cu-btn line-red lg shadow-blur text-lg" @tap="hideModal"
+									style="margin-left: 20%;">取消</button> -->
+				        </view>
+				    </form>
+				</view>
+            </view>
+            <!-- <button class="cu-btn bg-blue lg margin-top-sm" @tap="handlePhoneLogin" data-target="bottomModal">
+                手机验证码登录
+            </button> -->
+        </view>
+
+        <view class="footer">
+            <view>主办单位:安徽省农业农村厅</view>
+            <view>技术支持:安徽省北斗精准农业信息工程实验室</view>
+        </view>
+
+        <view class="cu-modal bottom-modal" :class="modalName==='passwordModal'?'show':''" @tap="hideModal">
+            <view class="cu-dialog btDialog" @tap.stop.prevent>
+                <view class="box margin-top-xxl">
+                    <view class="cu-bar justify-center bg-white">
+                        <view class="action sub-title">
+                            <text class="text-xl text-bold text-blue">用户登录</text>
+                            <text class="text-ABC text-blue">login</text>
+                        </view>
+                    </view>
+                </view>
+
+                <!-- <view class="padding bg-white">
+                    <form bindsubmit="userNameLogin" bindtap="handleClick">
+                        <view class="cu-form-group margin-top">
+                            <view class="title">用户名</view>
+                            <input placeholder="请输入用户名" type="text" v-model="username">
+                        </view>
+                        <view class="cu-form-group">
+                            <view class="title">密码</view>
+                            <input placeholder="请输入密码" type="password" v-model="password">
+                        </view>
+                        <view class="padding flex flex-direction margin-top-xl">
+                            <button class="cu-btn bg-blue lg  margin-tb-sm shadow-blur text-lg"
+                                    @click="handleLoginByUsername">登录
+                            </button>
+                            <button class="cu-btn line-red lg shadow-blur text-lg" @tap="hideModal">取消</button>
+                        </view>
+                    </form>
+                </view> -->
+            </view>
+        </view>
+
+        <view class="cu-modal bottom-modal" :class="modalName=='bottomModal'?'show':''" @tap="hideModal">
+            <view class="cu-dialog btDialog" @tap.prevent.stop>
+                <view class="box margin-top-xxl">
+                    <view class="cu-bar justify-center bg-white">
+                        <view class="action sub-title">
+                            <text class="text-xl text-bold text-blue">验证码登录</text>
+                            <text class="text-ABC text-blue">login</text>
+                            <!-- last-child选择器-->
+                        </view>
+                    </view>
+                </view>
+
+                <view class="padding bg-white">
+                    <form bindsubmit="userNameLogin" bindtap="handleClick">
+                        <view class="cu-form-group ">
+                            <view class="title">手机号</view>
+                            <input name="input" placeholder="请输入手机号" type="number" @blur="onPhoneBlur"
+                                   v-model="userPhone"></input>
+                        </view>
+
+                        <view class="cu-form-group">
+                            <view class="title">验证码</view>
+                            <input placeholder="请输入验证码" type="number" v-model="userCode"></input>
+                            <button class="cu-btn bg-green shadow" type="" @tap="handleGetCode"
+                                    :disabled="disableCodeBtn">
+                                {{ showTime ? time + "s" : "验证码" }}
+                            </button>
+                        </view>
+                        <view class="padding flex flex-direction margin-top-xl">
+                            <button class="cu-btn bg-blue lg  margin-tb-sm shadow-blur text-lg"
+                                    @click="handlePhoneCodeLogin">登录
+                            </button>
+                            <button class="cu-btn line-red lg shadow-blur text-lg" @tap="hideModal">取消</button>
+                        </view>
+                    </form>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    import {
+        _login
+    } from "./login-model.js";
+
+    export default {
+        data() {
+            return {
+                nameInputClass: "",
+                pwdInputClass: "",
+                username: wx.getStorageSync('username') || '',
+                password: wx.getStorageSync('password') || '',
+                modalName: null,
+                time: 60,
+                showTime: false,
+                userPhone: "",
+                userCode: "",
+                disableCodeBtn: true
+            };
+        },
+        onLoad() {
+            wx.showShareMenu({
+                withShareTicket: true,
+                //设置下方的Menus菜单,才能够让发送给朋友与分享到朋友圈两个按钮可以点击
+                menus: ["shareAppMessage", "shareTimeline"]
+            });
+        },
+        methods: {
+
+            //失去焦点后判断手机号是否注册过
+            onPhoneBlur() {
+                if (this.userPhone) {
+                    _login.selectphone(this.userPhone, res => {
+                        const { code, message } = res;
+                        if (code !== 200) {
+                            this.toast(message);
+                            return false;
+                        } else {
+                            this.disableCodeBtn = false;
+                        }
+                    });
+                }
+            },
+
+            /**
+             * 获取验证码
+             */
+            handleGetCode() {
+                if (this.showTime) {
+                    return;
+                }
+                if (!this.userPhone) {
+                    uni.showToast({
+                        title: "请输入手机号",
+                        duration: 1500,
+                        icon: "none"
+                    });
+                    return;
+                }
+                this.$loading("发送中...");
+                let timer = null;
+                // 调用获取验证码接口
+                setTimeout(() => {
+                    this.showTime = true;
+                    _login.getVerificCode(this.userPhone, res => {
+                        uni.hideLoading();
+                        if (res.data.code === 200) {
+                            uni.showToast({
+                                title: "验证码发送成功",
+                                duration: 1500,
+                                icon: "none"
+                            });
+                        }
+
+                    });
+
+
+                    timer = setInterval(() => {
+                        if (this.time <= 1) {
+                            clearInterval(timer);
+                            this.showTime = false;
+                            this.time = 60;
+                        }
+                        this.time = this.time - 1;
+                    }, 1000);
+                }, 1000);
+            },
+            /**
+             * 关闭验证码弹框
+             */
+            hideModal() {
+                this.modalName = null;
+            },
+            /**
+             * 手机验证码登录
+             */
+            handlePhoneLogin(e) {
+                this.modalName = e.currentTarget.dataset.target;
+            },
+            /**
+             * 账号密码登录
+             * */
+            handleLoginByUsername() {
+                if (!this.username) {
+                    this.toast("请输入用户名");
+                    return;
+                }
+                if (!this.password) {
+                    this.toast("请输入密码");
+                    return;
+                }
+                this.$loading("登录中...");
+                const data = {
+                    username: this.username,
+                    password: this.password
+                };
+				wx.setStorageSync('username', data.username);
+				wx.setStorageSync('password', data.password);
+				console.log("登陆缓存2:"+ data.username);
+				//将账号信息作为全局变量
+				/* getApp().globalData.username = res.data[0].username
+				uni.setStorageSync('username', res.data[0].username)
+				console.log("全局变量"+usernaem) */
+				/* uni.reLaunch({ //跳转到主页,并携带账号参数
+					url: '../../start_production/start_index/start_index?username=' +
+						res.data[0].username
+				}) */
+                _login.login(data, res => {
+                    this.loginResult(res);
+
+                });
+            },
+            /**
+             * 微信快捷登录
+             */
+            handleWxLogin() {
+                this.$loading("登录中...");
+               /* uni.login({
+                    success: res => {
+                        _login.wxOpenidLogin(res.code, res => {
+                            uni.hideLoading();
+                            // console.log(res);
+                            this.loginResult(res);
+                        });
+                    }
+                }); */
+				uni.hideLoading();
+				wx.redirectTo({
+				    url: "/pages/index/index"
+				});
+				
+            },
+            /**
+             * 跳转注册页面
+             */
+            handleRegister() {
+                uni.navigateTo({
+                    url: "/pages/register/index"
+                });
+            },
+
+            handlePhoneCodeLogin() {
+                if (this.userPhone === null || this.userPhone === "") {
+                    this.toast("手机号不能为空");
+                    return;
+                }
+                if (this.userCode === null || this.userCode === "") {
+                    this.toast("验证码不能为空");
+                    return;
+                }
+                _login.verificationCodeLogin(this.userPhone, this.userCode, res => {
+                    uni.hideLoading();
+                    if (res.code === 1003) {
+                        this.toast("验证码错误");
+                    } else if (res.code === 1001) {
+                        this.toast(res.message);
+                    } else if (res.code === 200 || res.code === 1) {
+                        // 登录成功
+                        this.loginResult(res);
+                    }
+
+
+                });
+            },
+            loginResult(res) {
+
+                const {
+                    code,
+                    data,
+                    msg
+                } = res.data;
+                if (code === 200 || code === 1) {
+                    this.toast("登录成功");
+                    setTimeout(() => {
+						console.log("登陆成功")
+						//console.log("登陆缓存:"+ wx.getStorageSync('username'));
+                        //uni.setStorageSync("token", data.token);
+                        //uni.setStorageSync("tokenHead", data.tokenHead);
+                        //wx.setStorageSync('username', res.data.username);
+						//console.log("登陆缓存:"+ data.username);
+						//wx.setStorageSync("password", data.password);
+						//localStorage.setItem('user',JSON.stringify())
+                        // // uni.setStorageSync("deviceSerial",info.deviceSerial)
+                        // // uni.setStorageSync('mark',info.mark)
+                        // uni.setStorageSync('info',info)
+                        wx.redirectTo({
+                            url: "/pages/index/index"
+                        });
+                    }, 500);
+                } else {
+                    this.toast(msg);
+                }
+
+            },
+            toast(message) {
+                uni.showToast({
+                    icon: "none",
+                    title: message,
+                    duration: 1000
+                });
+            }
+        },
+        onShareAppMessage(res) {
+            return {
+                title: "欢迎使用农监宝",
+                path: "/pages/login/index"
+            };
+        }
+    };
+</script>
+
+<style scoped>
+    .login {
+        width: 100%;
+        height: 100%;
+        padding: 0;
+        margin: 0;
+        background-color: #FFF;
+    }
+
+    .cu-form-group .title {
+        min-width: calc(4em + 30upx);
+    }
+
+    .bg {
+        width: 100%;
+        position: relative;
+
+    }
+
+    .bg image {
+        width: 100%;
+    }
+
+    .bg-text {
+        position: absolute;
+        width: 100%;
+        height: 100%;
+        top: 10%;
+        text-align: center;
+        display: flex;
+        justify-content: center;
+        flex-direction: column;
+        align-items: center;
+    }
+
+    .bg-text-title {
+        width: 152px;
+        height: 53px;
+        font-size: 38px;
+        color: #FFFFFF;
+    }
+
+    .bg-text-desc {
+        width: 276px;
+        height: 30px;
+        font-family: PingFangSC-Regular;
+        font-size: 22px;
+        margin-top: 5px;
+        color: #FFFFFF;
+    }
+
+    .login-form {
+        width: 100%;
+        justify-content: center;
+        padding-top: 16%;
+
+    }
+
+    .btDialog {
+        height: 85vh;
+        padding-top: 10vh;
+        border-radius: 30upx 30upx 0 0 !important;
+        overflow: hidden;
+    }
+
+    /*.login-form input {
+          width: 84%;
+          margin-left: 8%;
+          font-size: 17px;
+          height: 50px;
+          font-weight: 400;
+          border-bottom: 1px solid rgba(190, 190, 190, 1);
+          margin-bottom: 30px;
+      }
+
+      .login-form .focus {
+          border-bottom: 1px solid #00B525;
+      }*/
+    /*
+          button {
+              width: 84%;
+              margin-left: 8%;
+              background-image: linear-gradient(90deg, #10A32D 0%, #007230 100%);
+              border-radius: 4px;
+              font-family: PingFangSC-Medium;
+              font-size: 17px;
+              color: #FFFFFF;
+              font-weight: 500;
+              margin-bottom: 10px;
+          }*/
+
+    .footer {
+        position: fixed;
+        text-align: center;
+        line-height: 40px;
+        margin-bottom: 2px;
+        bottom: 5vh;
+        width: 100%;
+        font-size: 12px;
+    }
+
+    .footer view {
+        line-height: 22px;
+    }
+
+    .register {
+        padding: 0 8%;
+        text-align: right;
+        font-size: 12px;
+    }
+
+    .register text {
+        text-decoration: underline;
+    }
+
+    .wx-login-btn {
+        background-image: none;
+        background-color: #007aff;
+        margin-top: 26%;
+        margin-bottom: 30px;
+    }
+
+    .login-popup {
+        width: 100%;
+        height: 50vh;
+        background-color: #FFF;
+    }
+
+    .login .cu-form-group input {
+        text-align: left;
+    }
+
+    .code-span {
+        display: inline-block;
+        width: 70px;
+        color: #0081ff;
+    }
+</style>

+ 100 - 0
pages/login/login-model.js

@@ -0,0 +1,100 @@
+import { Base } from "../../static/util/base.js";
+
+class Login extends Base {
+
+  constructor() {
+    super();
+  }
+
+  /**
+   * 账号密码登录
+   * @param data
+   * @param callBack
+   */
+  login(data, callBack) {
+    var params = {
+      url: "/admin/employee/login",
+      type: "POST",
+      data: {
+        username: data.username,
+        password: data.password
+      },
+
+      sCallBack: function(res) {
+        callBack && callBack(res);
+      }
+    };
+    this.request(params);
+  }
+
+  //获取手机验证码
+  getVerificCode(phone, callBack) {
+    const params = {
+      url: '/auth/sendCode',
+      type: 'GET',
+      data:{phone},
+      sCallBack: function (res) {
+        callBack && callBack(res)
+      }
+    }
+    this.request(params);
+  }
+
+  //短信验证码登录
+  verificationCodeLogin(phone, code, callBack) {
+    const params = {
+      url: "/auth/login",
+      type: "PUT",
+      data: {
+        phone,
+        code
+      },
+      sCallBack: function(res) {
+        callBack && callBack(res);
+      }
+    };
+    this.request(params);
+  }
+
+  //验证手机号是否注册
+  selectphone(phone, callBack) {
+    const params = {
+      url: '/auth/selectPhone',
+      data: {
+        phone
+      },
+      sCallBack: function (res) {
+        callBack && callBack(res.data)
+      }
+    }
+    this.request(params);
+  }
+
+  //微信openid直接登录
+  wxOpenidLogin(code,callBack){
+    const params = {
+      url: '/auth/loginByWx',
+      data:{
+        code:code
+      },
+      sCallBack: function (res) {
+        callBack && callBack(res)
+      }
+    }
+    this.request(params);
+  }
+
+  userInfo(callBack) {
+    var params = {
+      url: "/user/userinfo",
+      type: "get",
+      sCallBack: function(res) {
+        callBack && callBack(res);
+      }
+    };
+    this.request(params);
+  }
+}
+
+const _login = new Login();
+export { _login };

+ 178 - 0
pages/my/index.vue

@@ -0,0 +1,178 @@
+<template>
+    <view>
+        <cu-custom class="home-custom" bgColor=".bg-sancolor"
+                   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/64bdccea7bd72.png">
+            <block slot="content">个人中心</block>
+        </cu-custom>
+
+        <scroll-view scroll-y class="scrollPage">
+            <view class="userInfo">
+                <view class="userPhoto">
+                    <view class="cu-avatar round lg"
+                          style="background-image:url('https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/64bdccd118a88.jpg');">
+                        <view class="cu-tag badge bg-orange" v-if="userInfo.person_group != null">
+                            <block>{{ userInfo.person_group }}</block>
+                        </view>
+                    </view>
+                </view>
+                <view class="content">
+                    <view class="text-white">{{ userInfo.name }}</view>
+                    <view class="subText padding-top-sm">{{ userInfo.unitId }}</view>
+                </view>
+            </view>
+        </scroll-view>
+        <view class="cu-list menu card-menu margin-top-xl margin-bottom-xl shadow-lg radius text-xxl">
+            <view class="cu-item arrow">
+                <navigator class="content" url="/pages/my/modifyUserInfo" hover-class="none">
+                    <text class="cuIcon-myfill text-green text-xl"></text>
+                    <text class="text-grey">个人信息</text>
+                </navigator>
+            </view>
+            <view class="cu-item arrow">
+                <navigator class="content" url="/pages/my/modifyPassword" hover-class="none">
+                    <text class="cuIcon-commandfill text-red text-xl"></text>
+                    <text class="text-grey">密码修改</text>
+                </navigator>
+            </view>
+            <!-- <view class="cu-item arrow">
+                <view class="content" @tap="bendWechat">
+                    <text class="cuIcon-weixin text-cyan text-xl"></text>
+                    <text class="text-grey">微信绑定</text>
+                    <text class="text-grey" style="float: right" v-if="!userInfo.openid">未绑定</text>
+                    <text class="text-grey" style="float: right" v-if="!!userInfo.openid">已绑定</text>
+                </view>
+            </view> -->
+        </view>
+        <view class="cu-list menu card-menu margin-top-xl margin-bottom-xl shadow-lg radius text-xxl">
+            <view class="cu-item">
+                <button class="cu-btn content" @tap="outLogin">
+                    <text class="cuIcon-exit text-cyan text-xl"></text>
+                    <text class="text-grey">退出登录</text>
+                </button>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    import {_my} from "./my-model";
+    export default {
+        data() {
+            return {
+                userInfo:{}
+            };
+        },
+        created() {
+            // this.getRoleName();
+            const userInfo = uni.getStorageSync('userInfo');
+            if (userInfo) {
+                console.log(userInfo);
+                this.userInfo = userInfo
+            }
+        },
+        methods: {//微信号绑定
+            getRoleName() {
+                let role = uni.getStorageSync("role");
+                if (role == "") {
+                    console.log("未登录");
+                } else {
+                    console.log("已经登录");
+                }
+            },
+
+            bendWechat() {
+                let _this = this;
+                uni.showModal({
+                    title: "微信绑定",
+                    content: "确定要绑定当前微信么?",
+                    cancelText: "取消",
+                    confirmText: "确认",
+                    success: res => {
+                        if (res.confirm) {
+                            uni.login({
+                                success:res=> {
+                                    _my.bandWxOpenid(res.code, res => {
+                                        console.log(res);
+                                        if (res.code === 200) {
+                                            uni.showToast({
+                                                icon: "none",
+                                                title: "绑定成功",
+                                                duration: 1000
+                                            });
+                                        } else {
+                                            this.$msg("绑定失败");
+                                        }
+                                    });
+                                }
+                            });
+                        }
+                    }
+                });
+
+            },
+            outLogin() {
+                uni.showModal({
+                    title: "退出登录",
+                    content: "确定要退出当前账号么?",
+                    cancelText: "取消",
+                    confirmText: "退出",
+                    success: res => {
+						if(res.confirm){
+							//uni.clearStorageSync();
+							uni.navigateTo({
+							    url: "/pages/login/index"
+							});
+							console.log("全局变量:"+wx.getStorageSync('username'));
+						}else if(res.cancel){
+							console.log("取消退出");
+						}
+                        
+                    }
+                });
+            }
+        }
+    };
+</script>
+
+<style>
+    .iconfont {
+        margin-right: 10upx;
+        width: 1.6em;
+        text-align: center;
+    }
+
+    .userInfo {
+        background: rgb(73, 182, 75);
+        /*border-radius:0,0,100upx,0;*/
+        border-bottom-right-radius: 140upx 40upx;
+        padding: 40upx;
+        display: flex;
+    }
+
+    .userPhoto {
+        width: 150upx;
+        height: 150upx;
+        background-color: rgba(255, 255, 255, 0.3);
+        border-radius: 50%;
+    }
+
+    .cu-avatar.lg {
+        margin: 10upx;
+        width: 130upx;
+        height: 130upx;
+    }
+
+    .userInfo .content {
+        padding-left: 50upx;
+        font-size: 36upx;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+    }
+
+    .subText {
+        font-size: 30upx;
+        color: #d5d5d5;
+    }
+</style>

+ 50 - 0
pages/my/my-model.js

@@ -0,0 +1,50 @@
+import {Base} from '../../static/util/base.js';
+
+class My extends Base {
+
+    constructor() {
+        super();
+    }
+
+    //修改密码
+    editPassword(data, callBack) {
+        const params = {
+            url: '/editPassword',
+            type: 'POST',
+            data: data,
+            sCallBack: function (res) {
+                callBack && callBack(res)
+            }
+        }
+        this.request(params);
+    }
+
+//修改个人信息
+    editUserInfo(data, callBack) {
+        const params = {
+            url: '/editUserInfo',
+            type: 'POST',
+            data: data,
+            sCallBack: function (res) {
+                callBack && callBack(res)
+            }
+        }
+        this.request(params);
+    }
+
+    //绑定openid
+    bandWxOpenid(code, callBack) {
+        const params = {
+            url: '/auth/bandWxOpenid?code=' + code,
+            type: 'GET',
+            sCallBack: function (res) {
+                callBack && callBack(res.data)
+            }
+        }
+        this.request(params);
+    }
+
+}
+
+const _my = new My();
+export {_my}

+ 142 - 0
pages/quick-task/camera.vue

@@ -0,0 +1,142 @@
+<template>
+	<view>
+		<cu-custom class="home-custom" bgColor=".bg-sancolor"
+		           bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+		    <block slot="content">快速检测</block>
+		</cu-custom>
+		<camera device-position="back" flash="off" @error="error" style="width: 100%; height: 89.5vh;">
+			<cover-view class="float-content">
+				<cover-view class="out-border">
+					<cover-view class="title">二维码</cover-view>
+					<cover-view class="inside-border">
+						<cover-view class="thick-line">
+							<cover-view class="flag">C</cover-view>
+						</cover-view>
+						<cover-view class="thin-line"></cover-view>
+						<cover-view class="thick-line">
+							<cover-view class="flag">T</cover-view>
+						</cover-view>
+					</cover-view>
+				</cover-view>
+				<cover-view class="desc">请将显色区域放入框内</cover-view>
+			</cover-view>
+			<cover-view class="control">
+				<cover-view class="take-photo" @click="takePhoto">
+					<cover-view class="white-circle"></cover-view>
+				</cover-view>
+			</cover-view>
+		</camera>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			takePhoto() {
+				const ctx = uni.createCameraContext();
+				ctx.takePhoto({
+					quality: 'high',
+					success: (res) => {
+						uni.redirectTo({
+							url: '/pages/quick-task/result?pic=' + res.tempImagePath
+						});
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+.control{
+	position: absolute;
+	bottom: 0;
+	height: 15vh;
+	width: 100%;
+	background: rgba(0, 0, 0, 0.42);
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+.take-photo{
+	width: 10vh;
+	height: 10vh;
+	border-radius: 50%;
+	background: #b4b4b4;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+.white-circle{
+	width: 8vh;
+	height: 8vh;
+	border-radius: 50%;
+	background: #fff;
+}
+.float-content{
+	width: 100%;
+	height: 75vh;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+}
+.out-border{
+	width: 40%;
+	height: 55vh;
+	border: 2px solid #FFF;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+}
+.out-border .title{
+	margin-top: -40%;
+	color: red;
+	font-size: 26px;
+	margin-bottom: 5vh;
+	font-weight: bold;
+}
+.desc{
+	color: red;
+	font-size: 16px;
+	margin-top: 3vh;
+	font-weight: bold;
+}
+
+.inside-border{
+	border: 2px solid red;
+	width: 40%;
+	height: 10vh;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+}
+.thick-line{
+	width: 80%;
+	height: 2px;
+	background: red;
+	position: relative;
+}
+
+.thick-line .flag{
+	font-size: 20px;
+	position: absolute;
+	right: -25px;
+	top: -12px;
+	margin-top: 0;
+	font-weight: bold;
+}
+.thin-line{
+	width: 80%;
+	height: 1px;
+	background: red;
+	margin: 2.5vh 0;
+}
+</style>

+ 504 - 0
pages/quick-task/form.vue

@@ -0,0 +1,504 @@
+<template>
+	<view class="form">
+		<view class="DrawerPage" :class="modalName=='DrawerModalL'?'show':''">
+			<cu-custom class="home-custom" bgColor=".bg-sancolor"
+			           bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png"
+			           :isBack="true">
+			    <block slot="content">胶体金检测</block>
+			</cu-custom>
+			<view>
+				<view>
+					<view class="cu-bar bg-white margin-top-sm solid-bottom">
+					    <view class="action">
+					        <text class="cuIcon-titles text-green"></text>
+					        <text>产品信息</text>
+					    </view>
+					</view>
+				    <view class="cu-form-group">
+				        <view class="title">所属区域</view>
+				
+				        <picker mode="multiSelector" :range="regionArray" @change="RegionChange"
+				                :value="regionIndex"
+				                @columnchange="columnchange">
+				            <view class="picker">
+				                {{ queryXzq }}
+				            </view>
+				        </picker>
+				    </view>
+					<view class="cu-form-group" @tap="showModal"
+					      :data-target="'DrawerModalL'">
+					    <view class="title">单位名称</view>
+					    <picker disabled="disabled">
+					        <view class="picker">
+					            {{ companyDetailInfo.bySampleUnitName || "请选择单位" }}
+					        </view>
+					    </picker>
+					</view>
+					<view class="cu-form-group" @tap="showModal"
+					      :data-target="'SampleModelL'">
+					    <view class="title">样品名称</view>
+					    <picker disabled="disabled">
+					        <view class="picker">
+					            {{ sampleDetailInfo.productName || "请选择样品" }}
+					        </view>
+					    </picker>
+					</view>
+					<view class="cu-form-group" @tap="showModal"
+					      :data-target="'JTJModelL'">
+					    <view class="title">胶体金类型</view>
+					    <picker disabled="disabled">
+					        <view class="picker">
+					            {{ JTJDetailInfo.name || "请选择胶体金类型" }}
+					        </view>
+					    </picker>
+					</view>
+					
+					<view class="padding flex flex-direction padding-bottom-xl fixedFootBtn bg-white padding-top-xs">
+					    <button class="cu-btn bg-green lg margin-top-sm shadow-blur" type="" @tap="nextSetp">
+					        上报
+					    </button>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="DrawerClose" :class="modalName==='DrawerModalL'?'show':''" @tap="hideModal">
+		    <text class="cuIcon-pullright"></text>
+		</view>
+		<scroll-view scroll-y class="DrawerWindow solid-right" :class="modalName==='DrawerModalL'?'show':''">
+		    <view class="bg-white padding-bottom" style="min-height: 100vh">
+		        <cu-custom class="home-custom" bgColor=".bg-sancolor"
+		                   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png">
+		            <block slot="content">企业列表</block>
+		        </cu-custom>
+		        <view class="cu-list menu text-left">
+		            <view class="cu-bar search bg-white">
+		                <view class="search-form round">
+		                    <text class="cuIcon-search"></text>
+		                    <input type="text" placeholder="输入企业名称搜索" confirm-type="search" v-model="enterprisesName" />
+		                </view>
+		                <view class="action">
+		                    <button class="cu-btn bg-green shadow-blur round" @tap="searchEnterPrise">搜索</button>
+		                </view>
+		            </view>
+		        </view>
+		        <view class="cu-list menu bg-white margin-top-sm" v-for="(item,index) in qyList" :key="item.qydm"
+		              @tap="choseQy(index)">
+		            <view class="cu-item">
+		                <view class="action">
+		                    <text class="cuIcon-titles text-green"></text>
+		                    {{ item.enterprisesName }}
+		                </view>
+		            </view>
+		            <view class="cu-item">
+		                所属区域:<!-- {{ item.enterprisesAddress.split(" ")[0].replaceAll(",", "-") }} -->
+		            </view>
+		        </view>
+		        <view class="cu-load bg-green light text-sm" v-show="pageTotal !==0" @tap="getEnterPriseList"
+		              :class="pageNum > pageTotal?'over':'more'"></view>
+		        <view class="radius shadow-warp bg-white margin-top text-lg" v-show="pageTotal === 0">
+		            <view class="cu-list menu-avatar">
+		                <view class="cu-item">
+		                    <view class="content">
+		                        <view class="text-sm text-center" style="justify-content: center;">
+		                            <text class="text-cut text-lg">
+		                                <text class="cuIcon-warn text-yellow margin-right-xs text-xl"></text>
+		                                未查询到相关数据
+		                            </text>
+		                        </view>
+		                    </view>
+		                </view>
+		            </view>
+		        </view>
+		    </view>
+		</scroll-view>
+		
+		<view class="DrawerClose" :class="modalName==='SampleModelL'?'show':''" @tap="hideModal">
+		    <text class="cuIcon-pullright"></text>
+		</view>
+		<scroll-view scroll-y class="DrawerWindow solid-right" :class="modalName==='SampleModelL'?'show':''">
+		    <view class="bg-white padding-bottom" style="min-height: 100vh">
+		        <cu-custom class="home-custom" bgColor=".bg-sancolor"
+		                   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png">
+		            <block slot="content">样品列表</block>
+		        </cu-custom>
+		        <view class="cu-list menu bg-white margin-top-sm" v-for="(item,index) in sampleList" :key="item.qydm"
+		              @tap="choseSample(index)">
+		            <view class="cu-item">
+		                <view class="action">
+		                    <text class="cuIcon-titles text-green"></text>
+		                    {{ item.productName }}
+		                </view>
+		            </view>
+		        </view>
+		        <view class="cu-load bg-green light text-sm" v-show="spageTotal !==0" @tap="getSampleList"
+		              :class="spageNum > spageTotal?'over':'more'"></view>
+		        <view class="radius shadow-warp bg-white margin-top text-lg" v-show="spageTotal === 0">
+		            <view class="cu-list menu-avatar">
+		                <view class="cu-item">
+		                    <view class="content">
+		                        <view class="text-sm text-center" style="justify-content: center;">
+		                            <text class="text-cut text-lg">
+		                                <text class="cuIcon-warn text-yellow margin-right-xs text-xl"></text>
+		                                未查询到相关数据
+		                            </text>
+		                        </view>
+		                    </view>
+		                </view>
+		            </view>
+		        </view>
+		    </view>
+		</scroll-view>
+		
+		
+		<view class="DrawerClose" :class="modalName==='JTJModelL'?'show':''" @tap="hideModal">
+		    <text class="cuIcon-pullright"></text>
+		</view>
+		<scroll-view scroll-y class="DrawerWindow solid-right" :class="modalName==='JTJModelL'?'show':''">
+		    <view class="bg-white padding-bottom" style="min-height: 100vh">
+		        <cu-custom class="home-custom" bgColor=".bg-sancolor"
+		                   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png">
+		            <block slot="content">胶体金类型</block>
+		        </cu-custom>
+				<view class="cu-list menu text-left">
+				    <view class="cu-bar search bg-white">
+				        <view class="search-form round">
+				            <text class="cuIcon-search"></text>
+				            <input type="text" placeholder="输入胶体金类型搜索" confirm-type="search" v-model="JTJName" />
+				        </view>
+				        <view class="action">
+				            <button class="cu-btn bg-green shadow-blur round" @tap="searchJTJ">搜索</button>
+				        </view>
+				    </view>
+				</view>
+		        <view class="cu-list menu bg-white margin-top-sm" v-for="(item,index) in JTJList" :key="item.qydm"
+		              @tap="choseJTJ(index)">
+		            <view class="cu-item">
+		                <view class="action">
+		                    <text class="cuIcon-titles text-green"></text>
+		                    {{ item.name }}
+		                </view>
+		            </view>
+		        </view>
+		        <view class="cu-load bg-green light text-sm" v-show="jpageTotal !==0" @tap="getJTJList"
+		              :class="jpageNum > jpageTotal?'over':'more'"></view>
+		        <view class="radius shadow-warp bg-white margin-top text-lg" v-show="jpageTotal === 0">
+		            <view class="cu-list menu-avatar">
+		                <view class="cu-item">
+		                    <view class="content">
+		                        <view class="text-sm text-center" style="justify-content: center;">
+		                            <text class="text-cut text-lg">
+		                                <text class="cuIcon-warn text-yellow margin-right-xs text-xl"></text>
+		                                未查询到相关数据
+		                            </text>
+		                        </view>
+		                    </view>
+		                </view>
+		            </view>
+		        </view>
+		    </view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import { _sampleDetail } from "../sample-detail/sample-detail-model.js";
+	export default {
+	    data() {
+	        return {
+				regionArray: [],
+				regionIndex: [],
+				queryXzq: "请选择",
+				xzqObjList: [],
+				qyList: [],
+				companyDetailInfo: {},
+				modalName: null,
+				enterprisesName: null,
+				pageNum: 1,
+				pageSize: 10,
+				pageTotal: 1,
+				
+				sampleName: '',
+				sampleList: [],
+				spageNum: 1,
+				spageSize: 10,
+				spageTotal: 1,
+				sampleDetailInfo: {},
+				
+				JTJName: '',
+				JTJList: [],
+				jpageNum: 1,
+				jpageSize: 100,
+				jpageTotal: 1,
+				JTJDetailInfo: {},
+			}
+		},
+		mounted() {
+		    this.initRange();
+		},
+		methods: {
+			nextSetp() {
+				if(!this.queryXzqdm) {
+					this.$msg("请先选择所属区域");
+					return false;
+				}
+				if(!this.companyDetailInfo.qydm) {
+					this.$msg("请先选择单位");
+					return false;
+				}
+				if(!this.sampleDetailInfo.productName) {
+					this.$msg("请先选择样品");
+					return false;
+				}
+				if(!this.JTJDetailInfo.name) {
+					this.$msg("请先选择胶体金类型");
+					return false;
+				}
+				uni.navigateTo({
+				  url: "/pages/quick-task/index"
+				});
+			},
+			async initRange() {
+			    const { unitId,name } = uni.getStorageSync("userInfo");
+          let role = uni.getStorageSync("role");
+          let  xzqdm;
+          if(role=="f35551e4a06647dea5c2c43aaba22c2a"){
+            xzqdm = unitId.substring(4, 13);
+          }
+          if(role=="a1cbf841b0514b47bbdd3f50c80b729f"){
+            xzqdm = unitId
+
+          }
+
+			    let level = 0;
+			    if (xzqdm.endsWith("0000000")) { //省
+			        level = 3;
+			    } else if (xzqdm.endsWith("00000")) { //市
+			        level = 2;
+			    } else if (xzqdm.endsWith("000")) { //县
+			        level = 1;
+			    }
+          const xzqlist = await this.getSubXzqList(xzqdm);
+          if(level!==0){
+
+            xzqlist.unshift({
+              xzqdm: "",
+              xzqmc: "请选择"
+            });
+
+            this.regionArray.splice(0, this.regionArray.length, xzqlist.map(v => v.xzqmc));
+            this.xzqObjList.splice(0, this.xzqObjList.length, xzqlist);
+            this.regionIndex.splice(0, this.regionIndex.length, 0);
+
+            for (let i = 0; i < level - 1; i++) {
+              this.regionArray.push(["请选择"]);
+              this.xzqObjList.push({ xzqdm: "", xzqmc: "请选择" });
+              this.regionIndex.push(0);
+            }
+          }else{
+            xzqlist.unshift({
+              xzqdm: unitId,
+              xzqmc: name
+            });
+            this.regionArray.push([name]);
+            this.xzqObjList.push({ xzqdm: unitId, xzqmc: name });
+            this.regionIndex.push(0);
+          }
+
+
+			},
+			getSubXzqList(xzqdm) {
+			    return new Promise(resolve => {
+			        _sampleDetail.getSubXzqList(xzqdm, res => {
+			            resolve(res);
+			        });
+			    });
+			},
+			RegionChange(e) {
+			    this.regionIndex = e.detail.value;
+			    let xzqdm = "", xzqmc = [];
+			    for (let i = 0; i <= this.regionIndex.length - 1; i++) {
+			        if (this.regionArray[i][this.regionIndex[i]] !== "请选择") {
+			            xzqmc.push(this.regionArray[i][this.regionIndex[i]]);
+			            xzqdm = this.xzqObjList[i][this.regionIndex[i]].xzqdm;
+			        }
+			    }
+			    this.queryXzqdm = xzqdm;
+			    this.queryXzq = xzqmc.join("/");
+			},
+			async columnchange(e) {
+			    const { column, value } = e.detail;
+			    const xzqdm = this.xzqObjList[column][value]["xzqdm"];
+			    if (xzqdm) {
+			        if (column <= this.regionIndex.length - 2) {
+			            const subList = await this.getSubXzqList(xzqdm);
+			            subList.unshift({
+			                xzqdm: "",
+			                xzqmc: "请选择"
+			            });
+			            this.xzqObjList.splice(column + 1, 1, subList); //逐级push-乡镇
+			            this.regionIndex.splice(column + 1, 1, 0);
+			            this.regionArray.splice(column + 1, 1, subList.map(v => v.xzqmc));
+			            for (let i = column + 2; i < this.regionIndex.length; i++) {
+			                this.xzqObjList.splice(i, 1, [{ xzqdm: "", xzqmc: "请选择" }]); //逐级push-乡镇
+			                this.regionIndex.splice(i, 1, 0);
+			                this.regionArray.splice(i, 1, ["请选择"]);
+			            }
+			        }
+			    } else {
+			        for (let i = column + 1; i < this.regionIndex.length; i++) {
+			            this.xzqObjList.splice(i, 1, [{ xzqdm: "", xzqmc: "请选择" }]); //逐级push-乡镇
+			            this.regionIndex.splice(i, 1, 0);
+			            this.regionArray.splice(i, 1, ["请选择"]);
+			        }
+			    }
+			
+			},
+			showModal(e) {
+			    const modalName = e.currentTarget.dataset.target;
+			    if (modalName === "DrawerModalL") {
+					if(!this.queryXzqdm) {
+						this.$msg("请先选择所属区域");
+						return false;
+					}
+			        this.getEnterPriseList();
+			    } else if (modalName === "SampleModelL") {
+					if(!this.companyDetailInfo.qydm) {
+						this.$msg("请先选择单位");
+						return false;
+					}
+					this.getSampleList()
+            console.log(this.sampleList)
+				} else if (modalName === "JTJModelL") {
+					this.getJTJTypeList()
+				}
+			    this.modalName = modalName;
+			},
+			choseQy(index) {
+			    const {
+			        enterprisesName: bySampleUnitName,
+			        qydm,
+			    } = this.qyList[index];
+			    this.companyDetailInfo.bySampleUnitName = bySampleUnitName;
+			    this.companyDetailInfo.qydm = qydm;
+			    this.modalName = null;
+				uni.setStorageSync("enterprisesInfo", {
+					enterprisesName: bySampleUnitName,
+					qydm
+				});
+			},
+			choseSample(index) {
+				this.sampleDetailInfo = {
+					...this.sampleList[index]
+				}
+				this.modalName = null;
+				uni.setStorageSync("sampleInfo", this.sampleDetailInfo);
+			},
+			choseJTJ(index) {
+				this.JTJDetailInfo = {
+					...this.JTJList[index]
+				}
+				this.modalName = null;
+				uni.setStorageSync("JTJInfo", this.JTJDetailInfo);
+			},
+			hideModal(e) {
+			    this.modalName = null;
+			},
+			searchEnterPrise() {
+			    this.pageNum = 1;
+			    this.pageTotal = 1;
+			    this.getEnterPriseList();
+			},
+			searchJTJ() {
+				this.jpageNum = 1;
+				this.jpageTotal = 1;
+				this.getJTJTypeList();
+			},
+			getEnterPriseList() {
+			    const param = {
+			        pageNum: this.pageNum,
+			        pageSize: this.pageSize,
+			        towns: this.queryXzqdm
+			    };
+			    if (this.enterprisesName) {
+			        param.enterprisesName = this.enterprisesName;
+			    }
+			    _sampleDetail.getEnterPriseList(param, res => {
+			        const { data, message, code } = res;
+			        if (code === 200) {
+			            const { records, total } = data;
+			            this.pageTotal = Math.ceil(total / this.pageSize);
+			            if (this.pageNum === 1) {
+			                this.qyList = records;
+			            } else {
+			                this.qyList = this.qyList.concat(records);
+			            }
+			            this.pageNum++;
+			        } else {
+			            uni.showToast({
+			                icon: "none",
+			                title: message,
+			                duration: 1000
+			            });
+			        }
+			    });
+			},
+			getSampleList() {
+				const param = {
+				    pageNum: this.spageNum,
+				    pageSize: this.spageSize,
+				    qydm: this.companyDetailInfo.qydm
+				};
+				_sampleDetail.getSampleByCompany(param, res => {
+				    const { data, message, code } = res;
+
+				    if (code === 200) {
+				        const { records, total } = data;
+                console.log(records)
+				        this.spageTotal = Math.ceil(total / this.spageSize);
+				        if (this.spageNum === 1) {
+				            this.sampleList = records;
+                    console.log(this.sampleList)
+				        } else {
+				            this.sampleList = this.sampleList.concat(records);
+				        }
+				        this.spageNum++;
+				    } else {
+				        uni.showToast({
+				            icon: "none",
+				            title: message,
+				            duration: 1000
+				        });
+				    }
+				});
+			},
+			getJTJTypeList() {
+				const param = {
+					pageNum: this.jpageNum,
+					pageSize: this.jpageSize
+				}
+				_sampleDetail.getJTJTypeList(param, res => {
+					const { data, message, code } = res;
+					if (code === 200) {
+					    const { records, total } = data;
+					    this.jpageTotal = Math.ceil(total / this.jpageSize);
+					    if (this.jpageNum === 1) {
+					        this.JTJList = records;
+					    } else {
+					        this.JTJList = this.JTJList.concat(records);
+					    }
+					    this.jpageNum++;
+					} else {
+					    uni.showToast({
+					        icon: "none",
+					        title: message,
+					        duration: 1000
+					    });
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 63 - 0
pages/quick-task/index.vue

@@ -0,0 +1,63 @@
+<template>
+	<view class="quick-task" style="padding-bottom: 150upx">
+		<cu-custom class="home-custom" bgColor=".bg-sancolor"
+		           bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+		    <block slot="content">胶体金检测</block>
+		</cu-custom>
+		<view class="content">
+			<view v-if="step === 'first'" class="first-step">
+				<image src="../../static/icons/reagent.png" mode="aspectFit"></image>
+				<button class="cu-btn bg-green lg margin-top-sm shadow-blur" type="" @tap="startCheck">
+				    开始检测
+				</button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+		    return {
+		       step: 'first',
+		    };
+		},
+		created() {
+		   
+		},
+		methods: {
+			startCheck() {
+				uni.navigateTo({
+				  url: "/pages/quick-task/camera"
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+.quick-task{
+	background: #fff;
+	height: 100%;
+	width: 100%;
+}
+.content{
+	height: 80vh;
+}
+.first-step{
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+	padding-top: 20vh;
+}
+.first-step button {
+	width: 90%;
+	margin-top: 20vh;
+}
+.first-step image {
+	width: 60vw;
+	margin-left: 10vw;
+}
+</style>

+ 298 - 0
pages/quick-task/list.vue

@@ -0,0 +1,298 @@
+<template>
+	<view class="quick-task" style="padding-bottom: 150upx">
+		<cu-custom class="home-custom" bgColor=".bg-sancolor"
+			bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+			<block slot="content">胶体金检测</block>
+		</cu-custom>
+		<!-- 搜索部分 -->
+		<view class="search-Top"
+			style="position: fixed;z-index: 999; width: 100%;box-shadow: 0 5px 10px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04);">
+			<view class="cu-bar search bg-white">
+				<view class="search-form radius">
+					<text class="cuIcon-search"></text>
+					<input type="text" placeholder="输入企业名称搜索" confirm-type="search" v-model="enterprisesName" />
+					<text class="cuIcon cuIcon-close endClass text-xxl text-bold" @tap="resetEnterprisesQuery"
+						v-show="enterprisesName !== ''"></text>
+				</view>
+				<view class="action">
+					<!-- 全部的按钮 -->
+					<picker mode="multiSelector" :range="regionArray" @change="RegionChange" :value="regionIndex"
+						@columnchange="columnchange">
+						<view class="picker">
+							{{queryXzq}}
+						</view>
+					</picker>
+					<text class="cuIcon-triangledownfill"></text>
+				</view>
+			</view>
+			<view class="cu-bar search bg-white">
+				<view class="search-form radius">
+					<text class="cuIcon-search"></text>
+					<input type="text" placeholder="输入样本名称搜索" confirm-type="search" v-model="productName" />
+					<text class="cuIcon cuIcon-close endClass text-xxl text-bold" @tap="resetProductQuery"
+						v-show="productName !== ''"></text>
+				</view>
+				<view class="action">
+					<!-- 全部的按钮 -->
+					<button class="cu-btn bg-green shadow-blur" style="margin-right: 22px;" @tap="search">搜索</button>
+				</view>
+			</view>
+		</view>
+		<!-- 列表部分 -->
+		<view class="padding-sm quick-list">
+			<view class="cu-list menu margin-top taskDetail bg-white" v-for="(item, index) in listData" :key="index">
+				<view class="cu-item">
+					<view class="title text-black text-bold text-lg">
+						<text class="cuIcon-titles text-green"></text>
+						{{ item.jcxm }}
+					</view>
+					<view class="action">
+						<view class="text-gray">
+							{{ [1,2].includes(item.jcjg) ? '阴性' : '阳性' }}
+						</view>
+
+					</view>
+				</view>
+				<view class="content padding-sm detail solid-bottom">
+					<view>检测编号:{{ item.jcbh }}</view>
+					<view>检测站名称:{{ item.jczmc }}</view>
+					<view>被检单位:{{ item.enterprisesName }}</view>
+					<view>样本名称:{{ item.productName }}</view>
+					<view>产品批次号:{{ item.batchId }}</view>
+				</view>
+			</view>
+		</view>
+		<view class="padding flex flex-direction padding-bottom-xl fixedFootBtn padding-top-xs">
+			<button class="cu-btn bg-green lg margin-top-sm shadow-blur" type="" @tap="nextSetp">
+				新增检测
+			</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		_sampleDetail
+	} from "../sample-detail/sample-detail-model.js";
+	export default {
+		data() {
+			return {
+				listData: [],
+				regionArray: [],
+				regionIndex: [],
+				xzqObjList: [],
+				queryXzq:"全部",
+				queryXzqdm: null,
+				pageNum: 1,
+				pageSize: 10,
+				pageTotal: 1,
+				unitId: '',
+				enterprisesName: '',
+				productName: '',
+				inSearching: false,
+			};
+		},
+		onLoad() {
+			const { unitId } = uni.getStorageSync("userInfo");
+			this.unitId = unitId;
+			this.queryXzqdm = unitId;
+			this.getList()
+			this.initRange();
+		},
+		methods: {
+			search() {
+				this.pageNum = 1;
+				this.getList()
+			},
+			resetEnterprisesQuery(){
+			    this.enterprisesName = "";
+			},
+			resetProductQuery() {
+				this.productName = "";
+			},
+			getList() {
+				this.inSearching = true
+				_sampleDetail.getJTJList({
+					xzqCode: this.queryXzqdm,
+					enterprisesName: this.enterprisesName,
+					productName: this.productName,
+					pageNum: this.pageNum,
+					pageSize: this.pageSize
+				}, res => {
+					const { records, total } = res.data
+					if (this.pageNum === 1) {
+						this.listData = records
+					} else {
+						this.listData = this.listData.concat(records) 
+					}
+					this.pageTotal = total
+					this.inSearching = false
+					if (records.length > 0) {
+						this.pageNum++
+					}
+				})
+			},
+			onReachBottom() {
+			    this.getList();
+			},
+			getSubXzqList(xzqdm) {
+			    return new Promise(resolve => {
+			        _sampleDetail.getSubXzqList(xzqdm, res => {
+			            resolve(res);
+			        });
+			    });
+			},
+			async initRange() {
+				const {
+					unitId,
+					name
+				} = uni.getStorageSync("userInfo");
+				let role = uni.getStorageSync("role");
+				let xzqdm;
+				if (role == "f35551e4a06647dea5c2c43aaba22c2a") {
+					xzqdm = unitId.substring(4, 13);
+				}
+				if (role == "a1cbf841b0514b47bbdd3f50c80b729f") {
+					xzqdm = unitId
+
+				}
+
+				let level = 0;
+				if (xzqdm.endsWith("0000000")) { //省
+					level = 3;
+				} else if (xzqdm.endsWith("00000")) { //市
+					level = 2;
+				} else if (xzqdm.endsWith("000")) { //县
+					level = 1;
+				}
+				const xzqlist = await this.getSubXzqList(xzqdm);
+				if (level !== 0) {
+
+					xzqlist.unshift({
+						xzqdm: "",
+						xzqmc: "请选择"
+					});
+
+					this.regionArray.splice(0, this.regionArray.length, xzqlist.map(v => v.xzqmc));
+					this.xzqObjList.splice(0, this.xzqObjList.length, xzqlist);
+					this.regionIndex.splice(0, this.regionIndex.length, 0);
+
+					for (let i = 0; i < level - 1; i++) {
+						this.regionArray.push(["请选择"]);
+						this.xzqObjList.push({
+							xzqdm: "",
+							xzqmc: "请选择"
+						});
+						this.regionIndex.push(0);
+					}
+				} else {
+			 	xzqlist.unshift({
+						xzqdm: unitId,
+						xzqmc: name
+					});
+					this.regionArray.push([name]);
+					this.xzqObjList.push({
+						xzqdm: unitId,
+						xzqmc: name
+					});
+					this.regionIndex.push(0);
+				}
+
+
+			},
+			async columnchange(e) {
+			    const { column, value } = e.detail;
+			    const xzqdm = this.xzqObjList[column][value]["xzqdm"];
+			    if (xzqdm) {
+			        if (column <= this.regionIndex.length - 2) {
+			            const subList = await this.getSubXzqList(xzqdm);
+			            subList.unshift({
+			                xzqdm: "",
+			                xzqmc: "请选择"
+			            });
+			            this.xzqObjList.splice(column + 1, 1, subList); //逐级push-乡镇
+			            this.regionIndex.splice(column + 1, 1, 0);
+			            this.regionArray.splice(column + 1, 1, subList.map(v => v.xzqmc));
+			            for (let i = column + 2; i < this.regionIndex.length; i++) {
+			                this.xzqObjList.splice(i, 1, [{ xzqdm: "", xzqmc: "请选择" }]); //逐级push-乡镇
+			                this.regionIndex.splice(i, 1, 0);
+			                this.regionArray.splice(i, 1, ["请选择"]);
+			            }
+			        }
+			    } else {
+			        for (let i = column + 1; i < this.regionIndex.length; i++) {
+			            this.xzqObjList.splice(i, 1, [{ xzqdm: "", xzqmc: "请选择" }]); //逐级push-乡镇
+			            this.regionIndex.splice(i, 1, 0);
+			            this.regionArray.splice(i, 1, ["请选择"]);
+			        }
+			    }
+			
+			},
+			RegionChange(e){
+			    this.regionIndex = e.detail.value;
+			    let xzqdm = "", xzqmc = [];
+			    for (let i = 0; i <= this.regionIndex.length - 1; i++) {
+			        if (this.regionArray[i][this.regionIndex[i]] !== "请选择") {
+			            xzqmc.push(this.regionArray[i][this.regionIndex[i]]);
+			            xzqdm = this.xzqObjList[i][this.regionIndex[i]].xzqdm;
+			        }
+			    }
+			    this.queryXzqdm = xzqdm || this.unitId;
+			    this.queryXzq = xzqmc.join("/") || '全部';
+				this.pageNum = 1
+			    this.getList();//查询
+			},
+			nextSetp() {
+				uni.navigateTo({
+					url: "/pages/quick-task/form"
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.quick-task {
+		background: #fff;
+		height: 100%;
+		width: 100%;
+	}
+
+	.first-step {
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		padding-top: 20vh;
+	}
+
+	.first-step button {
+		width: 90%;
+		margin-top: 20vh;
+	}
+
+	.first-step image {
+		width: 60vw;
+		margin-left: 10vw;
+	}
+
+	.quick-list {
+		padding-top: 100px;
+		padding-bottom: 100px;
+	}
+
+	.detail view {
+		height: 1.8em;
+		line-height: 1.8em !important;
+		border: none;
+		color: gray;
+	}
+
+	.taskDetail {
+		/*border: 1rpx solid #8799a3;*/
+		box-shadow: 0 0 25upx #aaa;
+		border-radius: 10rpx;
+		overflow: hidden;
+	}
+</style>

+ 334 - 0
pages/quick-task/quick-list.vue

@@ -0,0 +1,334 @@
+<template>
+	<view class="quick-task" style="padding-bottom: 150upx">
+		<cu-custom class="home-custom" bgColor=".bg-sancolor"
+			bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+			<block slot="content">快速检测</block>
+		</cu-custom>
+		<!-- 搜索部分 -->
+		<view class="search-Top"
+			style="position: fixed;z-index: 999; width: 100%;box-shadow: 0 5px 10px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04);">
+			<view class="cu-bar search bg-white">
+                <view class="action">
+                    <!-- 全部的按钮 -->
+                    <picker mode="multiSelector" :range="regionArray" @change="RegionChange" :value="regionIndex"
+                            @columnchange="columnchange">
+                        <view class="picker">
+                            {{queryXzq}}
+                        </view>
+                    </picker>
+                    <text class="cuIcon-triangledownfill"></text>
+                </view>
+				<view class="search-form radius">
+					<text class="cuIcon-search"></text>
+					<input type="text" placeholder="输入企业名称搜索" confirm-type="search" v-model="enterprisesName" />
+					<text class="cuIcon cuIcon-close endClass text-xxl text-bold" @tap="resetEnterprisesQuery"
+						v-show="enterprisesName !== ''"></text>
+				</view>
+                <view class="action">
+                    <!-- 全部的按钮 -->
+                    <button class="cu-btn bg-green shadow-blur" @tap="search">搜索</button>
+                </view>
+			</view>
+			<view class="cu-form-group">
+                <view class="title">
+                    <text class="padding-right-sm"><text class="cuIcon-filter"></text>筛选更多</text>
+                    <view class="cu-tag bg-orange light">测试</view></view>
+                <view>
+                    <view class="text-bold text-df">
+                        <text class="cuIcon-close"></text>
+                        重置</view>
+                </view>
+<!--				<view class="search-form radius">
+					<text class="cuIcon-search"></text>
+					<input type="text" placeholder="输入样本名称搜索" confirm-type="search" v-model="productName" />
+					<text class="cuIcon cuIcon-close endClass text-xxl text-bold" @tap="resetProductQuery"
+						v-show="productName !== ''"></text>
+				</view>-->
+			</view>
+		</view>
+		<!-- 列表部分 -->
+		<view class="padding-sm quick-list">
+			<view class="cu-list menu margin-top-sm taskDetail bg-white" v-for="(item, index) in listData" :key="index">
+				<view class="cu-item">
+					<view class="title text-black text-bold text-lg">
+						<text class="cuIcon-titles text-green"></text>
+						{{ item.jcxm }}
+					</view>
+					<view class="action">
+						<view class="radius text-lg text-bold" :class="item.jcjg ? 'text-green':'text-red'">
+							{{ item.jcjg ? '合格' : '不合格' }}
+						</view>
+					</view>
+				</view>
+				<view class="content padding-sm detail solid-bottom">
+					<view>检测任务编号:{{ item.rwbh }}</view>
+					<view>检测站名称:{{ item.jczmc }}</view>
+					<view>被检企业名称:{{ item.enterprisesName }}</view>
+					<view>样本名称:{{ item.ybmc }}</view>
+					<view>产品批次号:{{ item.productBatchId }}</view>
+					<view>检测时间:{{ item.jcTime }}</view>
+					<view>检测值:{{ item.jcz }}{{ item.jczUnit }}</view>
+					<view>检测类型:{{ typeMap[item.type] }}</view>
+					<view>创建时间:{{ item.createTime }}</view>
+				</view>
+			</view>
+		</view>
+        <view class="cu-modal" :class="modalName==='filterDlg'?'show':''">
+            <view class="cu-dialog">
+<!--                <view class="cu-bar bg-white justify-end">
+                    <view class="content" style="width: 100%">添加抽样单</view>
+                    <view class="action" @tap="hideModal">
+                        <text class="cuIcon-close text-red"></text>
+                    </view>
+                </view>-->
+                <view class="padding-lr-lg bg-white padding-bottom">
+                    <view class="cu-list menu">
+                        <view class="cu-form-group ">
+                            <view class="title">样品名称</view>
+                            <input name="input" v-model="productName" placeholder="请输入抽样人员1">
+                        </view>
+                        <view class="cu-form-group ">
+                            <view class="title">检测结果</view>
+                            <input name="input" v-model="options.samplingPeopleSecond" placeholder="请输入抽样人员2">
+                        </view>
+                    </view>
+                    <view class="padding flex flex-direction">
+                        <button class="cu-btn bg-blue lg" @tap="submitSampleSheet">提交</button>
+                    </view>
+                </view>
+            </view>
+        </view>
+	</view>
+</template>
+
+<script>
+	import {
+		_sampleDetail
+	} from "../sample-detail/sample-detail-model.js";
+	export default {
+		data() {
+			return {
+				listData: [],
+				regionArray: [],
+				regionIndex: [],
+				xzqObjList: [],
+				queryXzq:"全部",
+				queryXzqdm: null,
+                modalName: null,
+				pageNum: 1,
+				pageSize: 10,
+				pageTotal: 1,
+				unitId: '',
+				enterprisesName: '',
+				productName: '',
+				inSearching: false,
+				typeMap: {
+					1: '农残',
+					2: '畜禽',
+					3: '水产'
+				}
+			};
+		},
+		onLoad() {
+			const { unitId } = uni.getStorageSync("userInfo");
+			this.unitId = unitId;
+			this.queryXzqdm = unitId;
+			this.getList()
+			this.initRange();
+		},
+		methods: {
+			search() {
+				this.pageNum = 1;
+				this.getList()
+			},
+			resetEnterprisesQuery(){
+			    this.enterprisesName = "";
+			},
+			resetProductQuery() {
+				this.productName = "";
+			},
+			getList() {
+				this.inSearching = true
+				_sampleDetail.getQuickList({
+					xzqCode: this.queryXzqdm.substring(4, 13),
+					enterprisesName: this.enterprisesName,
+					ybmc: this.productName,
+					pageNum: this.pageNum,
+					pageSize: this.pageSize
+				}, res => {
+					const { records, total } = res.data
+					if (this.pageNum === 1) {
+						this.listData = records
+					} else {
+						this.listData = this.listData.concat(records) 
+					}
+					this.pageTotal = total
+					this.inSearching = false
+					if (records.length > 0) {
+						this.pageNum++
+					}
+				})
+			},
+			onReachBottom() {
+			    this.getList();
+			},
+			getSubXzqList(xzqdm) {
+			    return new Promise(resolve => {
+			        _sampleDetail.getSubXzqList(xzqdm, res => {
+			            resolve(res);
+			        });
+			    });
+			},
+			async initRange() {
+				const {
+					unitId,
+					name
+				} = uni.getStorageSync("userInfo");
+				let role = uni.getStorageSync("role");
+				let xzqdm;
+				if (role == "f35551e4a06647dea5c2c43aaba22c2a") {
+					xzqdm = unitId.substring(4, 13);
+				}
+				if (role == "a1cbf841b0514b47bbdd3f50c80b729f") {
+					xzqdm = unitId
+
+				}
+
+				let level = 0;
+				if (xzqdm.endsWith("0000000")) { //省
+					level = 3;
+				} else if (xzqdm.endsWith("00000")) { //市
+					level = 2;
+				} else if (xzqdm.endsWith("000")) { //县
+					level = 1;
+				}
+				const xzqlist = await this.getSubXzqList(xzqdm);
+				if (level !== 0) {
+
+					xzqlist.unshift({
+						xzqdm: "",
+						xzqmc: "请选择"
+					});
+
+					this.regionArray.splice(0, this.regionArray.length, xzqlist.map(v => v.xzqmc));
+					this.xzqObjList.splice(0, this.xzqObjList.length, xzqlist);
+					this.regionIndex.splice(0, this.regionIndex.length, 0);
+
+					for (let i = 0; i < level - 1; i++) {
+						this.regionArray.push(["请选择"]);
+						this.xzqObjList.push({
+							xzqdm: "",
+							xzqmc: "请选择"
+						});
+						this.regionIndex.push(0);
+					}
+				} else {
+			 	xzqlist.unshift({
+						xzqdm: unitId,
+						xzqmc: name
+					});
+					this.regionArray.push([name]);
+					this.xzqObjList.push({
+						xzqdm: unitId,
+						xzqmc: name
+					});
+					this.regionIndex.push(0);
+				}
+
+
+			},
+			async columnchange(e) {
+			    const { column, value } = e.detail;
+			    const xzqdm = this.xzqObjList[column][value]["xzqdm"];
+			    if (xzqdm) {
+			        if (column <= this.regionIndex.length - 2) {
+			            const subList = await this.getSubXzqList(xzqdm);
+			            subList.unshift({
+			                xzqdm: "",
+			                xzqmc: "请选择"
+			            });
+			            this.xzqObjList.splice(column + 1, 1, subList); //逐级push-乡镇
+			            this.regionIndex.splice(column + 1, 1, 0);
+			            this.regionArray.splice(column + 1, 1, subList.map(v => v.xzqmc));
+			            for (let i = column + 2; i < this.regionIndex.length; i++) {
+			                this.xzqObjList.splice(i, 1, [{ xzqdm: "", xzqmc: "请选择" }]); //逐级push-乡镇
+			                this.regionIndex.splice(i, 1, 0);
+			                this.regionArray.splice(i, 1, ["请选择"]);
+			            }
+			        }
+			    } else {
+			        for (let i = column + 1; i < this.regionIndex.length; i++) {
+			            this.xzqObjList.splice(i, 1, [{ xzqdm: "", xzqmc: "请选择" }]); //逐级push-乡镇
+			            this.regionIndex.splice(i, 1, 0);
+			            this.regionArray.splice(i, 1, ["请选择"]);
+			        }
+			    }
+			
+			},
+			RegionChange(e){
+			    this.regionIndex = e.detail.value;
+			    let xzqdm = "", xzqmc = [];
+			    for (let i = 0; i <= this.regionIndex.length - 1; i++) {
+			        if (this.regionArray[i][this.regionIndex[i]] !== "请选择") {
+			            xzqmc.push(this.regionArray[i][this.regionIndex[i]]);
+			            xzqdm = this.xzqObjList[i][this.regionIndex[i]].xzqdm;
+			        }
+			    }
+			    this.queryXzqdm = xzqdm || this.unitId;
+			    this.queryXzq = xzqmc.join("/") || '全部';
+				this.pageNum = 1
+			    this.getList();//查询
+			},
+			nextSetp() {
+				uni.navigateTo({
+					url: "/pages/quick-task/form"
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.quick-task {
+		background: #fff;
+		height: 100%;
+		width: 100%;
+	}
+
+	.first-step {
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		padding-top: 20vh;
+	}
+
+	.first-step button {
+		width: 90%;
+		margin-top: 20vh;
+	}
+
+	.first-step image {
+		width: 60vw;
+		margin-left: 10vw;
+	}
+
+	.quick-list {
+		padding-top: 100px;
+	}
+
+	.detail view {
+		height: 1.8em;
+		line-height: 1.8em !important;
+		border: none;
+		color: gray;
+	}
+
+	.taskDetail {
+		/*border: 1rpx solid #8799a3;*/
+		box-shadow: 0 0 25upx #aaa;
+		border-radius: 10rpx;
+		overflow: hidden;
+	}
+</style>

+ 148 - 0
pages/quick-task/result.vue

@@ -0,0 +1,148 @@
+<template>
+	<view class="result">
+		<cu-custom class="home-custom" bgColor=".bg-sancolor"
+		           bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+		    <block slot="content">胶体金检测</block>
+		</cu-custom>
+		<image :src="tempImage" mode="aspectFit"></image>
+		<view class="result-icon">
+			<view class="success-icon" v-if="[1, 2].includes(status)">
+				<image class="icon" src="../../static/icons/result-icon.svg" mode="aspectFit"></image>
+				<text>阴性</text>
+			</view>
+			<view class="fail-icon" v-else-if="[3, 4].includes(status)">
+				<image class="icon" src="../../static/icons/fail-icon.svg" mode="aspectFit"></image>
+				<text>阳性</text>
+			</view>
+			<view class="cancel-icon" v-else-if="-1 === status">
+				<image class="icon" src="../../static/icons/cancel-icon.svg" mode="aspectFit"></image>
+				<text>无效</text>
+			</view>
+		</view>
+		
+		<view class="padding flex flex-direction padding-bottom-xl fixedFootBtn padding-top-xs">
+		    <button class="cu-btn bg-green lg margin-top-sm shadow-blur" type="" @tap="nextSetp">
+		        完成
+		    </button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { _sampleDetail } from "../sample-detail/sample-detail-model.js";
+	export default {
+		data() {
+			return {
+				tempImage: '',
+				status: null,
+			}
+		},
+		onLoad(option) {
+			if (option.pic) {
+				uni.showLoading({
+					title: '识别中'
+				});
+				this.tempImage = option.pic
+				_sampleDetail.submitJTJImage(option.pic, (res) => {
+					const { data, message, code } = JSON.parse(res);
+					console.log('code:', data, code)
+					if (code === 200) {
+						const { image, jcjg } = data;
+						this.status = jcjg;
+						uni.hideLoading()
+						// 如果检测成功了,需要保存结果,暂时没有接口
+						// if ([1,2,3,4].includes(jcjg)) {
+							this.saveResult({
+								image,
+								jcjg
+							})
+						// }
+					}
+				})
+			}
+		},
+		methods: {
+			saveResult({ jcjg, image }) {
+				const { unitId: jczbh, name: jczmc } = uni.getStorageSync("userInfo");
+				const { enterprisesName, qydm } = uni.getStorageSync("enterprisesInfo");
+				const { batchId, productName, productType } = uni.getStorageSync("sampleInfo");
+				const { name: jcxm } = uni.getStorageSync("JTJInfo");
+				_sampleDetail.saveResult({
+					  batchId,
+					  enterprisesName,
+					  image,
+					  "jcbh": "",
+					  jcjg,
+					  jcxm,
+					  jczbh,
+					  jczmc,
+					  productName,
+					  productType,
+					  qydm
+				}, res => {
+					
+				})
+			},
+			nextSetp() {
+				uni.redirectTo({
+					url: '/pages/index/index'
+				});
+			}
+		}
+	}
+</script>
+
+<style>
+.result-icon{
+	position: absolute;
+	top: 10px;
+	left: 10px;
+	z-index: 100;
+	width: 100vw;
+	height: 100vh;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+.result-icon .icon{
+	width: 200px;
+	height: 200px;
+}
+.result image{
+	width: 100vw;
+	height: 89vh;
+}
+.fail-icon,
+.success-icon,
+.cancel-icon{
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+.success-icon text{
+	color: #80d185;
+	font-size: 30px;
+	font-weight: bold;
+	position: absolute;
+	transform: rotate(-35deg);
+}
+.fail-icon text{
+	color: #d81e06;
+	font-size: 30px;
+	font-weight: bold;
+	position: absolute;
+	transform: rotate(-35deg);
+}
+
+.cancel-icon text{
+	color: #515151;
+	font-size: 30px;
+	font-weight: bold;
+	position: absolute;
+	transform: rotate(-35deg);
+}
+.fixedFootBtn{
+	border: none;
+	z-index: 1000;
+}
+</style>

+ 89 - 0
pages/sample-check-list/check-model.js

@@ -0,0 +1,89 @@
+import {
+	Base
+} from '../../static/util/base.js'
+class CheckModel extends Base {
+	constructor() {
+		super();
+	}
+
+	getSampleListByNJB(data,callBack) {
+		var params = {
+			url: '/ah/ahSampleSheet/getSampleListByNJB',
+			data:data,
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	getSampleInfoByNJB(sampleSheetNumber,callBack) {
+		var params = {
+			url: '/ah/ahSampleSheet/getSampleInfoByNJB',
+			data:{sampleSheetNumber},
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	submitSampleSheetNJB(id,callBack) {
+		var params = {
+			url: '/ah/ahSampleSheet/submitSampleSheetNJB',
+			data:{id},
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	submitSampleSheet(data,callBack) {
+		var params = {
+			url: '/ah/ahCheckNak/submitSampleSheet',
+			data:data,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	/**
+	 * 查询抽样单详情
+	 * @param id
+	 * @param callBack
+	 */
+
+	getAhSampleSheetDetail(id,callBack) {
+		var params = {
+			url: '/ah/ahSampleSheet/'+id,
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	/**
+	 * 获取本抽样单下面所有样品详细信息
+	 */
+
+	getSampleSheetDetailData(data,callBack){
+		const params = {
+			url: '/ah/ahSampleDetail/list',
+			type: 'get',
+			data:data,
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+}
+
+const _checkModel = new CheckModel();
+export {
+	_checkModel
+}

+ 69 - 0
pages/sample-check-list/home.vue

@@ -0,0 +1,69 @@
+<template name="basics">
+    <view>
+        <cu-custom class="home-custom" bgColor=".bg-sancolor"
+                   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+            <view slot="backText">返回</view>
+            <block slot="content">第三方检测</block>
+        </cu-custom>
+        <scroll-view scroll-y class="page">
+            <view class="nav-list" style="margin-top: 40upx;">
+                <view hover-class="none" @tap="toNextPage" :data-path="item.path" class="nav-li"
+                      :class="'bg-'+item.color"
+                      :style="[{animation: 'show ' + ((index+1)*0.2+1) + 's 1'}]" v-for="(item,index) in elements"
+                      :key="index">
+                    <view class="nav-title">{{ item.title }}</view>
+                    <view class="nav-name">{{ item.subTitle }}</view>
+
+                </view>
+            </view>
+        </scroll-view>
+    </view>
+</template>
+
+<script>
+
+    export default {
+        data() {
+            return {
+                elements: [
+                    {
+                        title: "监督抽查",
+                        name: "layout",
+                        color: "green",
+                        subTitle: "监督",
+                        path: "/pages/sample-check-list/index"
+                    },
+                    {
+                        title: "例行监测",
+                        name: "background",
+                        color: "mauve",
+                        subTitle: "例行",
+                        path: "/pages/zf-task-list/taskList"
+                    }
+                ]
+            };
+        },
+        onShow() {
+            /**/
+            const userInfo = uni.getStorageSync("userInfo");
+            if ((userInfo.level !== "乡镇级" && userInfo.person_group !== "组长") && this.elements.length === 1) {
+                this.elements.push({
+                    title: "网格员审核",
+                    name: "background",
+                    color: "red",
+                    subTitle: "Review",
+                    path: "/pages/grid/view"
+                });
+            }
+        },
+        methods: {
+            toNextPage(e) {
+                // console.log();
+                //判断有没有登录,没有登录直接跳到登录,登录了 跳到任务详情
+                uni.navigateTo({
+                    url: e.currentTarget.dataset.path
+                });
+            }
+        }
+    };
+</script>

+ 254 - 0
pages/sample-check-list/index.vue

@@ -0,0 +1,254 @@
+<template>
+    <view class="quick-task" style="padding-bottom: 150upx">
+        <cu-custom class="home-custom" bgColor=".bg-sancolor"
+                   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+            <block slot="content">定量检测</block>
+        </cu-custom>
+        <view class="cu-bar search bg-white">
+            <view class="text-center text-xxl text-bold padding-left-sm" @tap="scanQrCode">
+                <text class="cuIcon-scan text-orange lg"></text>
+            </view>
+            <view class="search-form">
+                <text class="cuIcon-search"></text>
+                <input type="text" placeholder="输入抽样单号查询新抽样单" v-model="sampleSheetNumber" style="padding-right: 0;">
+                <text class="cuIcon cuIcon-close endClass text-xxl text-bold" @tap="sampleSheetNumber = ''"
+                                                                                                v-show="sampleSheetNumber !== ''"></text>
+            </view>
+            <view class="action">
+                <button class="cu-btn bg-green shadow-blur round" @tap="searchNewSample">查询</button>
+            </view>
+        </view>
+        <view class="padding-sm quick-list" v-if="!searchSample.id">
+            <view class="cu-list menu bg-white shadow" v-for="(item, index) in listData" :key="index">
+                <view class="cu-item">
+                    <view class="title text-black text-bold text-lg">
+                        <text class="cuIcon-titles text-green"></text>
+                        {{ item.ahSampleDetailList.map(v => v.name).join(",") }}
+                    </view>
+                    <view class="action">
+                        <text class="text-orange text-bold text-lg"
+                              v-if="item.sampleStatus==='WAIT_ENTERPRISES_SUBMIT'">待确认
+                        </text>
+                    </view>
+                </view>
+                <view class="content padding-sm detail solid-bottom">
+                    <!--                    <view>抽检产品:{{  }}</view>-->
+                    <view>抽样任务:{{ item.ahTasks.taskName }}</view>
+                    <view>任务编号:{{ item.ahTasks.taskNumber }}</view>
+                    <view>年度/季度:{{ item.ahTasks.taskYear.substr(0, 4) }}-{{
+                            item.ahTasks.taskBatch
+                        }}
+                    </view>
+                    <view>发布单位:{{ item.publishUnitName }}</view>
+                    <view>抽样单位:{{ item.sampleUnitName }}</view>
+                    <view class="text-gray">抽样人员:{{ item.samplingPeopleFirst }}、{{ item.samplingPeopleSecond }}</view>
+                    <view>抽样时间:{{ item.ahSampleDetailList[0].createTime }}</view>
+                </view>
+                <view class="tools padding-sm">
+                    <view>
+                    </view>
+                    <view style="display: flex;justify-content: space-between;gap:30upx">
+                        <view class="tool" @tap="toSampleDetail(item)">
+                            <view class="cu-btn bg-blue light text-df text-bold">
+                                {{ item.sampleStatus === 'WAIT_ENTERPRISES_SUBMIT' ? '去确认' : '查看' }}
+                                <text class="cuIcon-right lg"></text>
+                            </view>
+                        </view>
+                    </view>
+                </view>
+            </view>
+            <view class="radius shadow-warp bg-white text-lg" v-if="listData.length === 0">
+                <view class="cu-list menu-avatar">
+                    <view class="cu-item">
+                        <view class="content">
+                            <view class="text-sm text-center" style="justify-content: center;">
+                                <text class="text-cut text-lg">
+                                    <text class="cuIcon-warn text-yellow margin-right-xs text-xl"></text>
+                                    未查询到相关数据
+                                </text>
+                            </view>
+                        </view>
+                    </view>
+                </view>
+            </view>
+
+        </view>
+        <view class="padding-sm quick-list" v-if="searchSample.id">
+            <view class="cu-list menu bg-white shadow">
+                <view class="cu-item">
+                    <view class="title text-black text-bold text-lg">
+                        <text class="cuIcon-titles text-green"></text>
+                        {{ searchSample.bySampleUnitName }}
+                    </view>
+                    <view class="action">
+                        <!--                        <text class="text-orange text-bold text-lg"
+                                                      v-if="item.sampleStatus==='WAIT_ENTERPRISES_SUBMIT'">待确认
+                                                </text>-->
+                    </view>
+                </view>
+                <view class="content padding-sm detail solid-bottom">
+                    <view>抽样单编号:{{ searchSample.samplingNumber }}</view>
+                    <view>抽样样品:{{ searchSample.mustProductName }}</view>
+                    <view>抽样单位:{{ searchSample.sampleUnitName }}</view>
+                    <view class="text-gray">抽样人员:{{ searchSample.samplingPeopleFirst }}、{{ searchSample.samplingPeopleSecond }}</view>
+                    <view>抽样时间:{{ searchSample.updateTime }}</view>
+                </view>
+                <view class="tools padding-sm">
+                    <view>
+                    </view>
+                    <view style="display: flex;justify-content: space-between;gap:30upx">
+                        <view class="tool" @tap="toSampleDetail(searchSample.id)">
+                            <view class="cu-btn bg-blue light text-df text-bold">
+                                {{ searchSample.sampleStatus === 'WAIT_ENTERPRISES_SUBMIT' ? '去确认' : '查看' }}
+                                <text class="cuIcon-right lg"></text>
+                            </view>
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </view>
+
+    </view>
+</template>
+
+<script>
+    import {
+        _checkModel
+    } from "./check-model";
+
+    export default {
+        data() {
+            return {
+                curIndex: 1,
+                listData: [],
+                modalName: null,
+                pageNum: 1,
+                pageSize: 10,
+                pageTotal: 1,
+                sampleSheetNumber:'',
+                searchSample:{}
+            };
+        },
+        onShow() {
+            this.pageNum = 1;
+            this.pageSize = 10
+            this.getList();
+        },
+        methods: {
+            search() {
+                this.pageNum = 1;
+                this.getList()
+            },
+            getList() {
+                // this.inSearching = true
+                _checkModel.getSampleListByNJB({
+                    pageNum: this.pageNum,
+                    pageSize: this.pageSize
+                }, res => {
+                    console.log(res);
+                    const {records, total} = res.data
+                    if (this.pageNum === 1) {
+                        this.listData = records
+                    } else {
+                        this.listData = this.listData.concat(records)
+                    }
+                    this.pageTotal = total
+                    // this.inSearching = false
+                    if (records.length > 0) {
+                        this.pageNum++
+                    }
+                })
+            },
+            onReachBottom() {
+                this.getList();
+            },
+            toSampleDetail(item) {
+                // uni.setStorageSync("sampleDetail", item);
+                uni.navigateTo({
+                    url: "/pages/sample-check-list/sample-detail/index?id="+item.id
+                })
+
+            },
+            scanQrCode(){
+                uni.scanCode({
+                    scanType:["qrCode"],
+                    success: res=>{
+                        this.sampleSheetNumber = res.result;
+                        this.searchNewSample();
+                    }
+                });
+            },
+            searchNewSample(){
+                if(!this.sampleSheetNumber){
+                    this.$msg("请输入或扫描抽样单号");
+                    return
+                }
+                _checkModel.getSampleInfoByNJB(this.sampleSheetNumber,res=>{
+                    const {code,data,message} = res;
+                    if(code === 200){
+                        if(data && data.ahSampleSheet){
+                            this.searchSample = data.ahSampleSheet;
+                        }else{
+                            this.$msg("未查询到抽样单信息");
+                        }
+                    }else{
+                        this.$msg(message);
+                    }
+                })
+            }
+        }
+    }
+</script>
+
+<style scoped>
+
+    .quick-task {
+        height: 100%;
+        width: 100%;
+    }
+
+
+    .first-step {
+        height: 100%;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+        padding-top: 20vh;
+    }
+
+    .first-step button {
+        width: 90%;
+        margin-top: 20vh;
+    }
+
+    .first-step image {
+        width: 60vw;
+        margin-left: 10vw;
+    }
+
+    /*.quick-list {
+        padding-top: 100px;
+    }*/
+
+    .tools {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 20 upx;
+    }
+
+    .detail view {
+        height: 1.8em;
+        line-height: 1.8em !important;
+        border: none;
+        color: gray;
+    }
+
+    .taskDetail {
+        /*border: 1rpx solid #8799a3;*/
+        box-shadow: 0 0 25 upx #aaa;
+        border-radius: 10 rpx;
+        overflow: hidden;
+    }
+</style>

+ 377 - 0
pages/sample-check-list/sample-detail/index.vue

@@ -0,0 +1,377 @@
+<template>
+    <view class="page">
+        <view class="DrawerPage" :class="modalName=='DrawerModalL'?'show':''">
+            <scroll-view scroll-y style="height: 100vh;z-index: 3">
+                <cu-custom class="home-custom" bgColor=".bg-sancolor"
+                           bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png"
+                           :isBack="true">
+                    <block slot="content">抽样单详情</block>
+                </cu-custom>
+                <view :style="'z-index:2;position: sticky;top:calc('+CustomBar+'px - 80rpx)' ">
+                    <view class="cu-list menu">
+                        <view class="cu-item" style="min-height: 80rpx">
+                            <view class="content">
+                                <text class="cuIcon-formfill text-black lg"></text>
+                                <text class="text-black">编号:{{ sampleDetailInfo.samplingNumber }}</text>
+                            </view>
+                        </view>
+                    </view>
+                    <view class="bg-white nav solid-bottom">
+                        <view class="flex text-center">
+                            <view class="cu-item flex-sub" :class="pageIndex === 0?'text-blue cur':''"
+                                  @tap="pageIndex = 0">
+                                抽样基本信息
+                            </view>
+                            <view class="cu-item flex-sub" :class="pageIndex === 1?'text-blue cur':''"
+                                  @tap="pageIndex = 1">
+                                抽样样品信息
+                            </view>
+                            <view class="cu-item flex-sub" :class="pageIndex === 2?'text-blue cur':''"
+                                  @tap="pageIndex = 2">
+                                现场照片
+                            </view>
+                        </view>
+                    </view>
+
+                </view>
+                <view style="margin-bottom: 130rpx">
+                    <!--基本信息-->
+                    <view v-show="pageIndex === 0">
+                        <view class="cu-list menu">
+                            <view class="cu-bar bg-white margin-top-sm solid-bottom">
+                                <view class="action">
+                                    <text class="cuIcon-titles text-green"></text>
+                                    <text>被抽查单位信息</text>
+                                </view>
+                            </view>
+                            <form>
+                                <view class="cu-form-group">
+                                    <view class="title">单位名称</view>
+                                    <view>
+                                        {{ sampleDetailInfo.bySampleUnitName}}
+                                    </view>
+                                    <!--                        <input :disabled="input_diabled" placeholder="请输入单位名称" name="input"
+                                                                   v-model="sampleDetailInfo.bySampleUnitName"></input>-->
+                                </view>
+                                <view class="cu-form-group ">
+                                    <view class="title">单位地址</view>
+                                    <input placeholder="请输入单位地址"
+                                           name="input"
+                                           v-model="sampleDetailInfo.bySampleAddress" disabled></input>
+                                </view>
+                                <view class="cu-form-group ">
+                                    <view class="title">联系人</view>
+                                    <input placeholder="请输入联系人" name="input"
+                                           v-model="sampleDetailInfo.bySampleContactName" disabled></input>
+                                </view>
+                                <view class="cu-form-group ">
+                                    <view class="title">电话</view>
+                                    <input placeholder="请输入电话" name="input"
+                                           v-model="sampleDetailInfo.bySampleContactPhone" disabled></input>
+                                </view>
+                            </form>
+                            <view class="cu-bar bg-white margin-top-sm solid-bottom">
+                                <view class="action">
+                                    <text class="cuIcon-titles text-green"></text>
+                                    <text>抽样单位信息</text>
+                                </view>
+                            </view>
+                            <form>
+                                <view class="cu-form-group">
+                                    <view class="title">单位名称</view>
+                                    <input placeholder="请输入单位名称" name="input"
+                                           v-model="sampleDetailInfo.sampleUnitName" disabled></input>
+                                </view>
+                                <view class="cu-form-group ">
+                                    <view class="title">单位地址</view>
+                                    <input placeholder="请输入单位地址" name="input"
+                                           v-model="sampleDetailInfo.sampleAddress" disabled></input>
+                                </view>
+                                <view class="cu-form-group ">
+                                    <view class="title">联系人</view>
+                                    <input placeholder="请输入联系人" name="input"
+                                           v-model="sampleDetailInfo.sampleContactName" disabled></input>
+                                </view>
+                                <view class="cu-form-group">
+                                    <view class="title">电话</view>
+                                    <input placeholder="请输入电话" name="input"
+                                           v-model="sampleDetailInfo.sampleContactPhone" disabled></input>
+                                </view>
+                                <view class="cu-form-group  align-start">
+                                    <view class="title">备注</view>
+                                    <textarea placeholder="抽样备注" name="input"
+                                           v-model="sampleDetailInfo.samplingMask" disabled></textarea>
+                                </view>
+                            </form>
+
+                            <!--                        <view class="padding flex flex-direction">
+                                                        <button class="cu-btn bg-green  lg" @tap="toSampleInfoList(sampleDetailInfo.id)">管理样品
+                                                        </button>
+                                                    </view>-->
+
+                        </view>
+                    </view>
+                    <view v-show="pageIndex === 1">
+                        <view class="cu-bar bg-white margin-top-sm solid-bottom">
+                            <view class="action">
+                                <text class="cuIcon-titles text-green"></text>
+                                <text>抽样基地信息</text>
+                            </view>
+                        </view>
+                        <form>
+                            <view class="cu-form-group">
+                                <view class="title">抽样地点</view>
+                                <input placeholder="请选择抽样地点" name="input"
+                                       v-model="sampleDetailInfo.samplingAddress" disabled>
+                            </view>
+
+                        </form>
+                        <view class="cu-bar bg-white margin-top-sm solid-bottom">
+                            <view class="action">
+                                <text class="cuIcon-titles text-green"></text>
+                                <text>抽样信息</text>
+                            </view>
+                        </view>
+                        <view class="padding-sm" style="padding-bottom: 180upx">
+                            <view class="cu-list menu bg-white"
+                                  v-for="(item, index) in ahSampleDetailList" :key="index">
+                                <view class="cu-item">
+                                    <view class="title text-black text-bold text-lg">
+                                        <text class="cuIcon-titles text-green"></text>
+                                        {{ index + 1 }}.{{ item.name }}
+                                    </view>
+                                    <view class="action">
+                                        {{ item.samplingDate }}
+                                    </view>
+                                </view>
+                                <view class="content detail padding-sm solid-bottom">
+                                    <view class="text-gray">样品来源:{{ item.source }}</view>
+                                    <view class="text-gray">抽样数量:{{ item.samplingNumber }}{{ item.samplingType }}</view>
+                                    <view class="text-gray">抽样基数:{{ item.samplingBase }}{{ item.samplingType }}</view>
+                                    <view class="text-gray">生产日期:{{ item.manufactureDate }}</view>
+                                </view>
+                            </view>
+                            <view class="radius shadow-warp bg-white text-lg" v-if="ahSampleDetailList.length === 0">
+                                <view class="cu-list menu-avatar">
+                                    <view class="cu-item">
+                                        <view class="content">
+                                            <view class="text-sm text-center" style="justify-content: center;">
+                                                <text class="text-cut text-lg">
+                                                    <text class="cuIcon-warn text-yellow margin-right-xs text-xl"></text>
+                                                    未查询到样本数据
+                                                </text>
+                                            </view>
+                                        </view>
+                                    </view>
+                                </view>
+                            </view>
+                        </view>
+                        <view class="padding flex flex-direction padding-bottom-xl fixedFootBtn bg-white padding-top-xs" v-if="!sampleDetailInfo.commitPeopleId">
+                            <button class="cu-btn bg-blue lg margin-top-sm shadow-blur" type=""  v-if="input_diabled"
+                                    @tap="submitSampleSheet">确认抽样单
+                            </button>
+                        </view>
+                    </view>
+                    <view v-show="pageIndex === 2">
+                        <view class="cu-list menu">
+                            <view class="cu-bar bg-white margin-top-sm solid-bottom">
+                                <view class="action">
+                                    <text class="cuIcon-titles text-green"></text>
+                                    <text>抽样单照片</text>
+                                </view>
+                            </view>
+                            <view class="cu-form-group">
+                                <view class="grid col-3 grid-square flex-sub">
+                                    <view class="bg-img" @tap="ViewImage(sampleDetailInfo.sampleSheetPhoto)" v-if="sampleDetailInfo.sampleSheetPhoto">
+                                        <image :src='sampleDetailInfo.sampleSheetPhoto' mode='aspectFill'></image>
+                                    </view>
+                                    <view class="solids"  v-if="!sampleDetailInfo.sampleSheetPhoto">
+                                        <text>未上传</text>
+                                    </view>
+                                </view>
+                            </view>
+                            <view class="cu-bar bg-white margin-top-sm solid-bottom">
+                                <view class="action">
+                                    <text class="cuIcon-titles text-green"></text>
+                                    <text>封样照片</text>
+                                </view>
+                            </view>
+                            <view class="cu-form-group">
+                                <view class="grid col-3 grid-square flex-sub">
+                                    <view class="bg-img" @tap="ViewImage(sampleDetailInfo.sealingPhoto)" v-if="sampleDetailInfo.sealingPhoto">
+                                        <image :src='sampleDetailInfo.sealingPhoto' mode='aspectFill'></image>
+                                    </view>
+                                    <view class="solids" v-if="!sampleDetailInfo.sealingPhoto">
+                                        <text>未上传</text>
+                                    </view>
+                                </view>
+                            </view>
+                            <view class="cu-bar bg-white margin-top-sm solid-bottom">
+                                <view class="action">
+                                    <text class="cuIcon-titles text-green"></text>
+                                    <text>抽样人员合影照片</text>
+                                </view>
+                            </view>
+                            <view class="cu-form-group">
+                                <view class="grid col-3 grid-square flex-sub">
+                                    <view class="bg-img" @tap="ViewImage(sampleDetailInfo.groupPhoto)" v-if="sampleDetailInfo.groupPhoto">
+                                        <image :src='sampleDetailInfo.groupPhoto' mode='aspectFill'></image>
+                                    </view>
+                                    <view class="solids" v-if="!sampleDetailInfo.groupPhoto">
+                                        <text>未上传</text>
+                                    </view>
+                                </view>
+                            </view>
+                        </view>
+
+                    </view>
+                </view>
+                <view class="padding flex flex-direction padding-bottom-xl fixedFootBtn bg-white padding-top">
+                    <button class="cu-btn bg-blue lg shadow-blur" type="" @tap="submitSampleSheet">确认抽样单</button>
+                </view>
+            </scroll-view>
+        </view>
+    </view>
+</template>
+
+
+<script>
+    import { _checkModel } from "../check-model";
+
+    export default {
+
+        data() {
+            return {
+                CustomBar: this.CustomBar,
+                pageIndex: 0,
+                sampleDetailInfo: {},
+                ahSampleDetailList: [],
+            };
+        },
+        onLoad(options) {
+            this.getSampleInfoDetail(options.id);
+        },
+        methods: {
+            getSubXzqList(xzqdm) {
+                return new Promise(resolve => {
+                    _checkModel.getSubXzqList(xzqdm, res => {
+                        resolve(res);
+                    });
+                });
+            },
+            getSampleInfoDetail(id) {
+                _checkModel.getAhSampleSheetDetail(id, res => {
+                    const {code,data,message} = res;
+                    if(code === 200){
+                        console.log("getAhSampleSheetDetail",data);
+                        this.sampleDetailInfo = data.ahSampleSheet;
+                        //查询抽样样品信息
+                        this.getSampleSheetDetailData();
+                    }else{
+                        this.$msg(message);
+                        this.input_diabled = true;
+                    }
+
+                });
+            },
+            submitSampleSheet(){
+                uni.showModal({
+                    title: "提示",
+                    content: "确认完成当前抽样单",
+                    cancelText: "取消",
+                    confirmText: "确认",
+                    success: res => {
+                        if (res.confirm) {
+                            _checkModel.submitSampleSheetNJB(this.sampleDetailInfo.id,res=>{
+                                const {code,message} = res;
+                                if(code === 200){
+                                    this.$msg("确认成功");
+                                    setTimeout(() => {
+                                        uni.navigateTo({
+                                            url: '/pages/sample-check-list/index'
+                                        })
+                                    }, 1500)
+                                } else {
+                                    this.$msg(message);
+                                }
+                            })
+                        }
+                    }})
+
+            },
+
+            getSampleSheetDetailData() {
+                _checkModel.getSampleSheetDetailData({
+                    sampleSheetId: this.sampleDetailInfo.id,
+                    pageNum: 1,
+                    pageSize: 100
+                }, res => {
+                    const { code, message, data: { records } } = res;
+                    if (code === 200) {
+                        this.ahSampleDetailList = records;
+                    } else {
+                        this.$msg(message);
+                    }
+                });
+            },
+            ViewImage(url) {
+                uni.previewImage({
+                    urls: [url],
+                    current: url
+                });
+            },
+
+        }
+    };
+
+</script>
+
+<style scoped>
+    .page {
+        /*background-image: var(--gradualBlue);*/
+        background-image: linear-gradient(45deg, #0081ff, #1cbbb4);
+        width: 100vw;
+        overflow: hidden;
+    }
+
+    .DrawerPage .nav .cu-item.cur {
+        border-bottom: 4rpx solid;
+    }
+
+    .DrawerPage .nav .cu-item.cur::after {
+        content: none;
+    }
+
+    /*.nav .cu-item{
+        height: 70rpx;
+        line-height: 70rpx;
+    }*/
+    .cu-modal.drawer-modal .cu-dialog {
+        min-width: 85vw;
+    }
+
+    .btDialog {
+        min-height: 80vh;
+    }
+
+    .detail view {
+        height: 1.8em;
+        line-height: 1.8em !important;
+        border: none;
+        color: gray;
+    }
+
+    .tools {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 20upx;
+    }
+    .fixedFootBtn {
+        border-top: 1px solid #ddd;
+        position: fixed;
+        width: 100vw;
+        bottom: 0;
+        z-index: 1000;
+    }
+</style>

+ 1017 - 0
pages/sample-detail/index.vue

@@ -0,0 +1,1017 @@
+<template>
+    <view class="page">
+        <view class="DrawerPage" :class="modalName=='DrawerModalL'?'show':''">
+            <scroll-view scroll-y style="height: 100vh;z-index: 3">
+                <cu-custom class="home-custom" bgColor=".bg-sancolor"
+                           bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png"
+                           :isBack="true">
+                    <block slot="content">填报抽样单</block>
+                </cu-custom>
+                <view :style="'z-index:2;position: sticky;top:calc('+CustomBar+'px - 80rpx)' ">
+                    <view class="cu-list menu">
+                        <view class="cu-item" style="min-height: 80rpx">
+                            <view class="content">
+                                <text class="cuIcon-formfill text-black lg"></text>
+                                <text class="text-black">编号:{{ sampleDetailInfo.samplingNumber }}</text>
+                            </view>
+                        </view>
+                    </view>
+                    <view class="bg-white nav solid-bottom">
+                        <view class="flex text-center">
+                            <view class="cu-item flex-sub" :class="pageIndex === 0?'text-blue cur':''"
+                                  @tap="pageIndex = 0">
+                                抽样单信息
+                            </view>
+                            <view class="cu-item flex-sub" :class="pageIndex === 1?'text-blue cur':''"
+                                  @tap="pageIndex = 1">
+                                抽样填报
+                            </view>
+							<view class="cu-item flex-sub" :class="pageIndex === 2?'text-blue cur':''"
+								  @tap="pageIndex = 2">
+								现场照片
+							</view>
+                        </view>
+                    </view>
+
+                </view>
+                <view style="padding-bottom: 180rpx;">
+                    <!--基本信息-->
+                    <view v-show="pageIndex === 0">
+                        <view class="cu-list menu">
+                            <view class="cu-bar bg-white margin-top-sm solid-bottom">
+                                <view class="action">
+                                    <text class="cuIcon-titles text-green"></text>
+                                    <text>被抽查单位信息</text>
+                                </view>
+                            </view>
+                            <form>
+                                <view class="cu-form-group">
+                                    <view class="title">单位名称</view>
+                                    <view>
+                                        {{ sampleDetailInfo.bySampleUnitName}}
+                                    </view>
+                                    <!--                        <input :disabled="input_diabled" placeholder="请输入单位名称" name="input"
+                                                                   v-model="sampleDetailInfo.bySampleUnitName"></input>-->
+                                </view>
+                                <view class="cu-form-group ">
+                                    <view class="title">单位地址</view>
+                                    <input placeholder="请输入单位地址"
+                                           name="input"
+                                           v-model="sampleDetailInfo.bySampleAddress" disabled></input>
+                                </view>
+                                <view class="cu-form-group ">
+                                    <view class="title">联系人</view>
+                                    <input placeholder="请输入联系人" name="input"
+                                           v-model="sampleDetailInfo.bySampleContactName" disabled></input>
+                                </view>
+                                <view class="cu-form-group ">
+                                    <view class="title">电话</view>
+                                    <input placeholder="请输入电话" name="input"
+                                           v-model="sampleDetailInfo.bySampleContactPhone" disabled></input>
+                                </view>
+                            </form>
+                            <view class="cu-bar bg-white margin-top-sm solid-bottom">
+                                <view class="action">
+                                    <text class="cuIcon-titles text-green"></text>
+                                    <text>抽样单位信息</text>
+                                </view>
+                            </view>
+                            <form>
+                                <view class="cu-form-group">
+                                    <view class="title">单位名称</view>
+                                    <input placeholder="请输入单位名称" name="input"
+                                           v-model="sampleDetailInfo.sampleUnitName" disabled></input>
+                                </view>
+                                <view class="cu-form-group ">
+                                    <view class="title">单位地址</view>
+                                    <input placeholder="请输入单位地址" name="input"
+                                           v-model="sampleDetailInfo.sampleAddress" disabled></input>
+                                </view>
+                                <view class="cu-form-group ">
+                                    <view class="title">联系人</view>
+                                    <input placeholder="请输入联系人" name="input"
+                                           v-model="sampleDetailInfo.sampleContactName" disabled></input>
+                                </view>
+                                <view class="cu-form-group">
+                                    <view class="title">电话</view>
+                                    <input placeholder="请输入电话" name="input"
+                                           v-model="sampleDetailInfo.sampleContactPhone" disabled></input>
+                                </view>
+                                <view class="cu-form-group  align-start">
+                                    <view class="title">备注</view>
+                                    <textarea placeholder="请输入抽样备注" name="input"
+                                           v-model="sampleDetailInfo.samplingMask" :disabled="input_diabled"></textarea>
+                                </view>
+                            </form>
+
+                            <!--                        <view class="padding flex flex-direction">
+                                                        <button class="cu-btn bg-green  lg" @tap="toSampleInfoList(sampleDetailInfo.id)">管理样品
+                                                        </button>
+                                                    </view>-->
+
+<!--                            <view class="padding flex flex-direction">
+&lt;!&ndash;                                <button class="cu-btn bg-green lg  shadow-blur" @tap="saveSampleInfoList">保存</button>&ndash;&gt;
+                                <button class="cu-btn bg-green lg  shadow-blur" @tap="pageIndex = 1">填报抽样信息</button>
+                            </view>-->
+                        </view>
+                    </view>
+                    <view v-show="pageIndex === 1">
+                        <view class="cu-bar bg-white margin-top-sm solid-bottom">
+                            <view class="action">
+                                <text class="cuIcon-titles text-green"></text>
+                                <text>抽样基地信息</text>
+                            </view>
+                        </view>
+                        <form>
+                            <view class="cu-form-group">
+                                <view class="title">基地名称</view>
+                                <picker @tap="showBaseSelect" @change="baseSelectChange" :value="baseSelectIndex" :range="baseSelectList" :disabled="disabledBaseSelect">
+                                    <view class="picker">
+                                        {{ baseSelectList[baseSelectIndex] || "请选择抽样地点" }}
+                                    </view>
+                                </picker>
+
+                            </view>
+                            <view class="cu-form-group">
+                                <view class="title">抽样地点</view>
+                                <input placeholder="请选择抽样地点" name="input"
+                                       v-model="sampleDetailInfo.samplingAddress" disabled></input>
+                            </view>
+
+                        </form>
+                        <view class="cu-bar bg-white margin-top-sm solid-bottom">
+                            <view class="action">
+                                <text class="cuIcon-titles text-green"></text>
+                                <text>抽样信息</text>
+                            </view>
+                            <view class="action">
+                                <button class="cu-btn bg-green" type="" @tap="addSampleProduct" v-if="!input_diabled"> 增加样品</button>
+                            </view>
+                        </view>
+                        <view class="padding-sm">
+                            <view class="cu-list menu bg-white"
+                                  v-for="(item, index) in ahSampleDetailList" :key="index">
+                                <view class="cu-item">
+                                    <view class="title text-black text-bold text-lg">
+                                        <text class="cuIcon-titles text-green"></text>
+                                        {{ index + 1 }}.{{ item.name }}
+                                    </view>
+                                    <view class="action">
+                                        {{ item.samplingDate }}
+                                    </view>
+                                </view>
+                                <view class="content detail padding-sm solid-bottom">
+                                    <div class="text-gray">样品来源:{{ item.source }}</div>
+                                    <div class="text-gray">抽样数量:{{ item.samplingNumber }}{{ item.samplingType }}</div>
+                                    <div class="text-gray">抽样基数:{{ item.samplingBase }}{{ item.samplingType }}</div>
+                                    <div class="text-gray">生产日期:{{ item.manufactureDate }}</div>
+                                </view>
+                                <view class="tools padding-sm" v-if="!input_diabled">
+                                    <view @tap="delSampleDetail(item.id)">
+                                        <view class="cu-tag radius line-red padding-lr-sl">
+                                            <text class="cuIcon-deletefill text-lg padding-right-xs"></text>
+                                            删除
+                                        </view>
+                                    </view>
+                                    <view class="tool"
+                                          @tap="editSampleDetail(index)">
+                                        <view class="cu-tag bg-blue light text-df text-bold">
+                                            <text class="cuIcon-edit text-lg padding-right-xs"></text>
+                                            修改
+                                        </view>
+                                    </view>
+                                </view>
+                            </view>
+                            <view class="radius shadow-warp bg-white text-lg" v-if="ahSampleDetailList.length === 0">
+                                <view class="cu-list menu-avatar">
+                                    <view class="cu-item">
+                                        <view class="content">
+                                            <view class="text-sm text-center" style="justify-content: center;">
+                                                <text class="text-cut text-lg">
+                                                    <text class="cuIcon-warn text-yellow margin-right-xs text-xl"></text>
+                                                    未查询到样本数据
+                                                </text>
+                                            </view>
+                                        </view>
+                                    </view>
+                                </view>
+                            </view>
+                        </view>
+                    </view>
+					<view v-show="pageIndex === 2">
+						<view class="cu-list menu">
+							<view class="cu-form-group margin-top-sm">
+								<view class="title">同行抽检员</view>
+								<picker :disabled="true" @tap="showSecondCyUserChoose">
+								<view class="picker">
+									{{ sampleDetailInfo.samplingPeopleSecond || '请选择' }}
+								</view>
+							</picker>
+
+							</view>
+							<view class="cu-bar bg-white margin-top-sm solid-bottom">
+								<view class="action">
+									<text class="cuIcon-titles text-green"></text>
+									<text>抽样单照片</text>
+								</view>
+							</view>
+							<view class="cu-form-group">
+								<view class="grid col-3 grid-square flex-sub">
+									<view class="bg-img" @tap="ViewImage(photo.sampleSheetPhoto)" v-if="photo.sampleSheetPhoto">
+										<image :src='photo.sampleSheetPhoto' mode='aspectFill'></image>
+										<view class="cu-tag bg-red" @tap="DelImg('sampleSheetPhoto')">
+											<text class="cuIcon-close"></text>
+										</view>
+									</view>
+									<view class="solids" @tap="ChooseImage('sampleSheetPhoto')" v-if="!photo.sampleSheetPhoto">
+										<text class="cuIcon-cameraadd"></text>
+									</view>
+								</view>
+							</view>
+							<view class="cu-bar bg-white margin-top-sm solid-bottom">
+								<view class="action">
+									<text class="cuIcon-titles text-green"></text>
+									<text>封样照片</text>
+								</view>
+							</view>
+							<view class="cu-form-group">
+								<view class="grid col-3 grid-square flex-sub">
+									<view class="bg-img" @tap="ViewImage(photo.sealingPhoto)" v-if="photo.sealingPhoto">
+										<image :src='photo.sealingPhoto' mode='aspectFill'></image>
+										<view class="cu-tag bg-red" @tap="DelImg('sealingPhoto')">
+											<text class="cuIcon-close"></text>
+										</view>
+									</view>
+									<view class="solids" @tap="ChooseImage('sealingPhoto')" v-if="!photo.sealingPhoto">
+										<text class="cuIcon-cameraadd"></text>
+									</view>
+								</view>
+							</view>
+							<view class="cu-bar bg-white margin-top-sm solid-bottom">
+								<view class="action">
+									<text class="cuIcon-titles text-green"></text>
+									<text>抽样人员合影照片</text>
+								</view>
+							</view>
+							<view class="cu-form-group">
+								<view class="grid col-3 grid-square flex-sub">
+									<view class="bg-img" @tap="ViewImage(photo.groupPhoto)" v-if="photo.groupPhoto">
+										<image :src='photo.groupPhoto' mode='aspectFill'></image>
+										<view class="cu-tag bg-red" @tap="DelImg('groupPhoto')">
+											<text class="cuIcon-close"></text>
+										</view>
+									</view>
+									<view class="solids" @tap="ChooseImage('groupPhoto')" v-if="!photo.groupPhoto">
+										<text class="cuIcon-cameraadd"></text>
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+                    <view class="padding flex flex-direction padding-bottom-xl fixedFootBtn bg-white padding-top-xs" v-if="!sampleDetailInfo.filledPeopleId">
+                        <button class="cu-btn bg-blue lg margin-top-sm shadow-blur" type=""  v-if="!input_diabled" :disabled="!disabledBaseSelect"
+                                @tap="publishSampleSheet">上报抽样单
+                        </button>
+                    </view>
+
+                </view>
+
+            </scroll-view>
+        </view>
+
+        <view class="cu-modal bottom-modal" :class="modalName==='addSimpleInfo'?'show':''" @tap="hideModal">
+            <view class="cu-dialog btDialog padding-bottom-lg" @tap.stop.prevent>
+                <view class="cu-bar bg-white padding-lr solid-bottom">
+                    <view></view>
+                    <view class="action text-orange" @tap="hideModal">关闭</view>
+                </view>
+                <!--                <view class="box">
+                                    <view class="cu-bar justify-center bg-white">
+                                        <view class="action sub-title">
+                                            <text class="text-xl text-bold text-blue">添加样品</text>
+                                            <text class="text-ABC text-blue">sample</text>
+                                            &lt;!&ndash; last-child选择器&ndash;&gt;
+                                        </view>
+                                    </view>
+                                </view>-->
+
+                <view class="padding-lr bg-white">
+                    <view class="cu-form-group">
+                        <view class="title">样品名称</view>
+                        <picker @change="productSelectChange" data-target="name" :value="ahSampleDetail.name"
+                                :range="productList">
+                            <view class="picker">
+                                {{ ahSampleDetail.name || "请选择样品名称" }}
+                            </view>
+                        </picker>
+                    </view>
+                    <view class="cu-form-group">
+                        <view class="title">样品来源</view>
+                        <radio-group class="block" @change="sourceTypeChange">
+                            <view>
+                                <checkbox class="radio" id="zc" :value="1" :checked="''+sourceType === '1'"></checkbox>
+                                <label class="title margin-left-sm" for="zc">自产</label>
+                                <checkbox class="radio" id="qt" :value="2" :checked="''+sourceType === '2'"></checkbox>
+                                <label class="title margin-left-sm" for="qt">其他</label>
+                            </view>
+                        </radio-group>
+                    </view>
+                    <view class="cu-form-group" v-show="''+sourceType === '2'">
+                        <view class="title">详细地址</view>
+                        <input placeholder="请输入详细地址" type="text" v-model="ahSampleDetail.source">
+                    </view>
+                    <view class="cu-form-group">
+                        <view class="title">抽样日期</view>
+                        <picker mode="date" :value="ahSampleDetail.samplingDate" data-target="samplingDate"
+                                start="2000-01-01" :end="nowDate" @change="dateChange">
+                            <view class="picker">
+                                {{ ahSampleDetail.samplingDate || "请选择抽样日期" }}
+                            </view>
+                        </picker>
+                    </view>
+                    <view class="cu-form-group">
+                        <view class="title">抽样数量</view>
+                        <input placeholder="请输入抽样数量" type="digit" v-model="ahSampleDetail.samplingNumber">
+                    </view>
+                    <view class="cu-form-group">
+                        <view class="title">抽样基数</view>
+                        <input placeholder="请输入抽样基数" type="digit" v-model="ahSampleDetail.samplingBase">
+                    </view>
+                    <view class="cu-form-group">
+                        <view class="title">样品单位</view>
+                        <picker @change="unitChange" data-target="samplingType" :value="ahSampleDetail.samplingType"
+                                :range="dictTypeList">
+                            <view class="picker">
+                                {{ ahSampleDetail.samplingType || "请选择样品单位" }}
+                            </view>
+                        </picker>
+                    </view>
+                    <view class="cu-form-group solid-bottom">
+                        <view class="title">生产日期</view>
+                        <picker mode="date" :value="ahSampleDetail.manufactureDate" data-target="manufactureDate"
+                                start="2000-01-01" :end="nowDate" @change="dateChange">
+                            <view class="picker">
+                                {{ ahSampleDetail.manufactureDate || "请选择生产日期" }}
+                            </view>
+                        </picker>
+                    </view>
+                    <view class="padding flex flex-direction">
+                        <button class="cu-btn bg-blue lg margin-tb-sm shadow-blur text-lg"
+                                @click="createAhSampleDetail">保存
+                        </button>
+                        <!--                            <button class="cu-btn line-red lg shadow-blur text-lg" @tap="hideModal">取消</button>-->
+                    </view>
+                </view>
+            </view>
+        </view>
+
+		<view class="cu-modal bottom-modal" :class="modalName==='userListModal'?'show':''">
+			<view class="cu-dialog" @tap.stop.prevent>
+				<view class="cu-bar bg-white">
+					<view class="action text-blue" @tap="hideModal">取消</view>
+					<view class="content text-bold">选择抽样人员</view>
+				</view>
+				<view class="bg-white">
+					<view class="cu-bar search bg-white">
+						<view class="search-form radius text-left">
+							<text class="cuIcon-search"></text>
+							<input type="text" placeholder="输入样品名称搜索" confirm-type="search"
+								   v-model="queryUserName" />
+							<text class="cuIcon cuIcon-close endClass text-xxl text-bold" @tap="resetQymcQuery"
+								  v-show="queryUserName !== ''"></text>
+						</view>
+						<view class="action"><!-- 全部的按钮 -->
+							<button class="cu-btn bg-green shadow-blur round" @tap="searchProduct">搜索</button>
+						</view>
+					</view>
+					<scroll-view scroll-y class="productScroll padding" @scrolltolower="getCyUserList">
+						<radio-group @change="cyUserChange" style="width: 100%">
+							<view class="flex flex-wrap text-left">
+								<view class="basis-df padding-xs text-left" v-for="(item,index) in cyUserList"
+									  :key="index">
+									<checkbox :value="item.id" class="radio" :id="'productName'+index"
+											  :checked="sampleDetailInfo.samplingPeopleSecondId === item.id"></checkbox>
+									<label :for="'productName'+index">{{ item.name }}</label>
+								</view>
+							</view>
+						</radio-group>
+					</scroll-view>
+
+				</view>
+			</view>
+		</view>
+    </view>
+</template>
+
+
+<script>
+    import { _sampleDetail } from "./sample-detail-model.js";
+
+    export default {
+
+        data() {
+            return {
+                CustomBar: this.CustomBar,
+                pageIndex: 0,
+				photo: {
+					sampleSheetPhoto: null,
+					sealingPhoto: null,
+					groupPhoto: null,
+				},
+                basicsList: [{
+                    icon: "usefullfill",
+                    name: "开始"
+                }, {
+                    icon: "formfill",
+                    name: "检查信息"
+                }],
+                sampleDetailInfo: {},
+                regionArray: [],
+                regionIndex: [],
+                xzqObjList: [],
+                queryXzq: "请选择",
+                queryXzqdm: "",
+                input_diabled: false,
+                modalName: null,
+                pageNum: 1,
+                pageSize: 100,
+                pageTotal: 1,
+				cyUserList:[],
+                enterprisesName: null,
+                qyList: [],
+                ahSampleDetail: {},
+                nowDate: null,
+                dictTypeList: [],
+                baseList: [], //基地列表
+                baseSelectList: [],
+                baseSelectIndex: 0,
+                productList: [],
+                serviceProductList: [],
+                productIndex: 0,
+                sourceType: null, //样品来源类型
+                ahSampleDetailList: [],
+                userinfo:{},
+                id:null,
+				queryUserName:""
+            };
+        },
+        onLoad(options) {
+            this.id = options.id;
+			this.userinfo = uni.getStorageSync("userInfo");
+			const now = new Date();
+			this.nowDate = now.getFullYear() + "-" + ("" + (now.getMonth())).padStart(2, "0") + "-" + ("" + now.getDate()).padStart(2, "0");
+			this.getDictTypeList();
+			this.getCyUserList();
+			this.getSampleInfoDetail(this.id);
+        },
+        computed:{
+          disabledBaseSelect(){
+              return this.ahSampleDetailList.length >= 1
+          }
+        },
+        methods: {
+			ChooseImage(name) {
+				uni.chooseImage({
+					count: 1, //默认9
+					sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+					sourceType: ['album'], //从相册选择
+					success: (res) => {
+						uni.showLoading({
+							title: '图片上传中'
+						})
+						_sampleDetail.uploadPhoto(res.tempFilePaths[0], res => {
+							const {code, data, message} = JSON.parse(res);
+							uni.hideLoading()
+							if (code === 200) {
+								this.$set(this.photo,name,data);
+							} else {
+								this.$msg(message);
+							}
+							console.log(this.photo);
+						})
+					}
+				});
+			},
+			ViewImage(url) {
+				uni.previewImage({
+					urls: [url],
+					current: url
+				});
+			},
+			DelImg(name) {
+				uni.showModal({
+					title: '图片删除',
+					content: '确定要删除图片吗?',
+					cancelText: '取消',
+					confirmText: '确认',
+					success: res => {
+						if (res.confirm) {
+							this.photo[name] = null
+						}
+					}
+				})
+			},
+            showBaseSelect(){
+                if(this.ahSampleDetailList.length >= 1){
+                    this.$msg("已上传抽样样品,基地信息不可修改")
+                    return
+                }
+            },
+            addSampleProduct(){
+                if(!this.sampleDetailInfo.baseNumber){
+                    this.$msg("请选择检查基地");
+                } else {
+                    if(this.ahSampleDetailList.length >= 3){
+                        this.$msg("一个抽样单最多仅可添加3个样本");
+                        return
+                    }
+                    this.modalName = 'addSimpleInfo'
+                }
+
+            },
+            getSubXzqList(xzqdm) {
+                return new Promise(resolve => {
+                    _sampleDetail.getSubXzqList(xzqdm, res => {
+                        resolve(res);
+                    });
+                });
+            },
+            /**
+             * 获取单位选项
+             */
+            getDictTypeList() {
+                _sampleDetail.getDictTypeList(res => {
+                    const { code, data: { records } } = res;
+                    if (code === 200) {
+                        this.dictTypeList = records.map(v => v.type);
+                    } else {
+                        this.$msg("单位获取失败");
+                    }
+                });
+            },
+            /**
+             * 样品单位改变
+             * @param e
+             */
+            unitChange(e) {
+                this.setDateHandle(this.ahSampleDetail, "samplingType", this.dictTypeList[e.detail.value]);
+            },
+            /**
+             * 样品名称选择
+             * @param e
+             */
+            productSelectChange(e) {
+                // this.ahSampleDetail.name = ;
+                const index = e.detail.value;
+                if(index >= 1){
+                    this.setDateHandle(this.ahSampleDetail, "name", this.serviceProductList[index].productName);
+                }else{
+                    this.setDateHandle(this.ahSampleDetail, "name", null);
+                }
+
+            },
+            /**
+             * 日期选择回调
+             * @constructor
+             */
+            dateChange(e) {
+                const { target } = e.currentTarget.dataset;
+                const value = e.detail.value;
+                if (this.ahSampleDetail.hasOwnProperty(target)) {
+                    this.ahSampleDetail[target] = value;
+                } else {
+                    this.$set(this.ahSampleDetail, target, value);
+                }
+            },
+            /**
+             * 样品来源类型选择
+             * @param e
+             */
+            sourceTypeChange(e) {
+                this.sourceType = e.detail.value;
+            },
+            /**
+             * 基地选择回调
+             */
+            baseSelectChange(e) {
+                const value = e.detail.value;
+                if ("" + value !== "0") {
+                    this.baseSelectIndex = value;
+                    const base = this.baseList[value];
+                    this.sampleDetailInfo.samplingAddress = base.city + base.county + base.towns + base.village;
+                    this.sampleDetailInfo.baseNumber = base.baseNumber;
+                    this.getProductBatchList(base);
+                } else {
+                    this.$msg("请选择地址");
+                    this.sampleDetailInfo.samplingAddress = "";
+                }
+
+            },
+            getSampleInfoDetail(id) {
+                _sampleDetail.getAhSampleSheetDetail(id, res => {
+                    const {code,data,message} = res;
+                    if(code === 200){
+                        this.sampleDetailInfo = res.data.ahSampleSheet;
+                        this.sampleDetailInfo.sampleUnitName = this.sampleDetailInfo.sampleUnitName || res.data.AhZoneSampleCheck.checkUnitName;
+                        this.sampleDetailInfo.sampleAddress = this.sampleDetailInfo.sampleAddress || res.data.AhDictCheck.address;
+                        this.sampleDetailInfo.sampleId =this.sampleDetailInfo.sampleId || res.data.AhZoneSampleCheck.checkId;
+                        this.sampleDetailInfo.sampleContactName = this.sampleDetailInfo.sampleContactName || this.userinfo.name;
+                        this.sampleDetailInfo.sampleContactPhone =this.sampleDetailInfo.sampleContactPhone || res.data.AhDictCheck.phone;
+						this.photo.groupPhoto = this.sampleDetailInfo.groupPhoto;
+						this.photo.sealingPhoto = this.sampleDetailInfo.sealingPhoto;
+						this.photo.sampleSheetPhoto = this.sampleDetailInfo.sampleSheetPhoto;
+                        const status = this.sampleDetailInfo.sampleStatus;
+                        const filledPeopleId = this.sampleDetailInfo.filledPeopleId;
+                        const commitPeopleId = this.sampleDetailInfo.commitPeopleId;
+                        // this.submitSampleSheet();
+                        if((filledPeopleId && this.userinfo.id !== filledPeopleId) || commitPeopleId){
+                            this.input_diabled = true;
+                        }
+                        if(this.sampleDetailInfo.qydm){
+                            //加载主体的基地信息
+                            this.getBaseByCheckList(this.sampleDetailInfo.qydm);
+                            //加载产品信息
+                            if(this.sampleDetailInfo.baseNumber){
+                                this.getProductBatchList({
+                                    qydm: this.sampleDetailInfo.qydm,
+                                    baseNumber: this.sampleDetailInfo.baseNumber
+                                });
+                            }
+                        }
+                        //status === "SAMPLE_FILLED" ||
+                        /*if (status === "SAMPLE_REPORT" || status === "CHECK_REPORT") {
+                            this.input_diabled = true;
+                        } else {
+                            this.input_diabled = false;
+                        }*/
+                        //查询抽样样品信息
+                        this.getSampleSheetDetailData();
+                    }else{
+                        this.$msg(message);
+                        this.input_diabled = true;
+                    }
+
+                });
+            },
+            saveSampleInfoList() {
+                _sampleDetail.updateAhSampleSheet(this.sampleDetailInfo, res => {
+                    const { code, message } = res;
+                    if (code !== 200) {
+                        this.$msg(message);
+                    }
+                });
+            },
+            publishSampleSheet(){
+                if(!this.ahSampleDetailList.some(v=>v.name === this.sampleDetailInfo.mustProductName)){
+                    this.$msg("抽样样本必须包含"+this.sampleDetailInfo.mustProductName);
+                    return
+                }
+
+				if (!this.sampleDetailInfo.samplingPeopleSecondId) {
+					this.$msg("请选择同行抽样人员");
+					return
+				}
+
+				if (!this.photo.sampleSheetPhoto) {
+					this.$msg("请上传抽样单照片");
+					return
+				}
+				if (!this.photo.sealingPhoto) {
+					this.$msg("请上传封样照片");
+					return
+				}
+				if (!this.photo.groupPhoto) {
+					this.$msg("请上传抽样人员合影照片");
+					return
+				}
+
+				const data = Object.assign(this.sampleDetailInfo, this.photo);
+                uni.showModal({
+                    title: "提示",
+                    content: "确定上报当前抽样单",
+                    cancelText: "取消",
+                    confirmText: "确认",
+                    success: res => {
+                        if (res.confirm) {
+							_sampleDetail.uploadCheckPhoto(data, res => {
+								const {code, message} = res;
+								if (code === 200) {
+									_sampleDetail.publishSampleSheet(this.sampleDetailInfo.id,saveRes=>{
+										const {code,message} = saveRes;
+										if(code === 200){
+											this.$msg("上报成功");
+											setTimeout(()=>{
+												uni.navigateBack({
+													delta: 1
+												});
+											},1500)
+										} else {
+											this.$msg(message);
+										}
+									})
+								}else{
+									this.$msg(message);
+								}
+							});
+
+                        }
+                    }})
+
+            },
+            submitSampleSheet(){
+                uni.showModal({
+                    title: "提示",
+                    content: "确认完成当前抽样单",
+                    cancelText: "取消",
+                    confirmText: "确认",
+                    success: res => {
+                        if (res.confirm) {
+                            _sampleDetail.submitSampleSheet(this.sampleDetailInfo.id,res=>{
+                                const {code,message} = res;
+                                if(code === 200){
+                                    this.$msg("确认成功");
+                                    setTimeout(()=>{
+                                        uni.navigateBack({
+                                            delta: 1
+                                        });
+                                    },1500)
+                                } else {
+                                    this.$msg(message);
+                                }
+                            })
+                        }
+                    }})
+
+            },
+            /**
+             * 新增样品信息
+             */
+            createAhSampleDetail() {
+                if(this.ahSampleDetailList.length <= 0){
+                    this.saveSampleInfoList();
+                }
+                const ahSampleDetail = this.ahSampleDetail;
+                if(!ahSampleDetail.name){
+                    this.$msg("请选择抽样产品");
+                    return
+                }
+                if(this.ahSampleDetailList.filter(v=>v.name === ahSampleDetail.name).length >= 2){
+                    this.$msg("同一产品最多可抽2个样");
+                    return
+                }
+                ahSampleDetail.sampleSheetId = this.sampleDetailInfo.id;
+                if (!this.sourceType) {
+                    this.$msg("请选择样品来源");
+                    return false;
+                }
+                if ("" + this.sourceType === "1") {
+                    ahSampleDetail.source = "自产";
+                }
+                if ("" + this.sourceType !== "1" && !ahSampleDetail.source) {
+                    this.$msg("请输入来源详细地址");
+                    return false;
+                }
+                if (ahSampleDetail.hasOwnProperty("id")) {
+                    _sampleDetail.updateAhSampleDetail(this.ahSampleDetail, res => {
+                        const { code, message } = res;
+                        if (code === 200) {
+                            this.$msg("保存成功");
+                            this.modalName = null;
+                            this.getSampleSheetDetailData();
+                            this.ahSampleDetail= {};
+                        } else {
+                            this.$msg(message);
+                        }
+                    });
+                } else {
+                    _sampleDetail.createAhSampleDetail(this.ahSampleDetail, res => {
+                        const { code, message } = res;
+                        if (code === 200) {
+                            this.$msg("保存成功");
+                            this.modalName = null;
+                            this.getSampleSheetDetailData();
+                            this.ahSampleDetail= {};
+                        } else {
+                            this.$msg(message);
+                        }
+                    });
+                }
+
+            },
+            hideModal(e) {
+                this.modalName = null;
+            },
+            getBaseByCheckList(qydm) {
+                _sampleDetail.getBaseByCheckList(qydm, res => {
+                    const {data} = res;
+                    if (data.length === 0) {
+                        this.$msg("该主体未上报基地信息");
+                    } else {
+                        data.unshift({
+                            baseNumber: "",
+                            baseName: "请选择"
+                        });
+                        this.baseList = data;
+                        this.baseSelectList = data.map(v => v.baseName);
+                        if (this.sampleDetailInfo.qydm === qydm && !!this.sampleDetailInfo.baseNumber) {
+                            this.baseSelectIndex = data.findIndex(v => v.baseNumber === this.sampleDetailInfo.baseNumber);
+                            if (this.baseSelectIndex < 0) this.baseSelectIndex = 0;
+                        }
+                    }
+
+                });
+            },
+            /**
+             * 根据主体和基地查询产品列表
+             */
+            getProductBatchList({ qydm, baseNumber }) {
+                _sampleDetail.getProductBatchList({ qydm, baseNumber }, res => {
+                    const {data} = res;
+                    if (data.length === 0) {
+                        this.$msg("该基地未上传产品信息");
+                    } else {
+                        this.productList = data.map(v => v.productName+"("+v.batchId+")");
+                        this.productList.unshift("请选择");
+                        this.serviceProductList = data;
+                        this.serviceProductList.unshift({
+                            pproductName:"请选择"
+                        });
+                    }
+                });
+            },
+            setDateHandle(data, target, value) {
+                if (data.hasOwnProperty(target)) {
+                    data[target] = value;
+                } else {
+                    this.$set(data, target, value);
+                }
+            },
+            getSampleSheetDetailData() {
+                _sampleDetail.getSampleSheetDetailData({
+                    sampleSheetId: this.sampleDetailInfo.id,
+                    pageNum: 1,
+                    pageSize: 100
+                }, res => {
+                    const { code, message, data: { records } } = res;
+                    if (code === 200) {
+                        this.ahSampleDetailList = records;
+                    } else {
+                        this.$msg(message);
+                    }
+                });
+            },
+            /**
+             * 删除抽样样品
+             * @param id
+             * @param callBack
+             */
+            delSampleDetail(id) {
+                uni.showModal({
+                    title: "提示",
+                    content: "确定要删除当前样本么",
+                    cancelText: "取消",
+                    confirmText: "确认",
+                    success: res => {
+                        if (res.confirm) {
+                            _sampleDetail.delSampleDetail(id, res => {
+                                const {code,message} = res;
+                                if(code === 200){
+                                    this.getSampleSheetDetailData();
+                                }else{
+                                    this.$msg(message);
+                                }
+                            });
+                        }
+                    }
+                });
+
+            },
+            editSampleDetail(index) {
+                this.ahSampleDetail = this.ahSampleDetailList[index];
+                if (this.ahSampleDetail.source !== "自产") {
+                    this.sourceType = "2";
+                } else {
+                    this.sourceType = "1";
+                }
+                this.modalName = "addSimpleInfo";
+            },
+			showSecondCyUserChoose() {
+				this.sampleDetailInfo.samplingPeopleSecond = null;
+				this.modalName = "userListModal";
+			},
+			cyUserChange(e){
+				const peopleId = e.detail.value;
+				if (peopleId) {
+					const person = this.cyUserList.find(v=>v.id === peopleId);
+					this.sampleDetailInfo.samplingPeopleSecond = person.name;
+					this.sampleDetailInfo.samplingPeopleSecondId = person.id;
+					this.modalName = null;
+				}else{
+					this.sampleDetailInfo.samplingPeopleSecond = null;
+					this.sampleDetailInfo.samplingPeopleSecondId = null;
+
+				}
+
+			},
+			searchProduct() {
+				this.pageNum = 1;
+				this.pageTotal = 1;
+				this.getCyUserList();
+			},
+			resetQymcQuery() {
+				this.queryUserName = "";
+				this.pageNum = 1;
+				this.pageTotal = 1;
+				this.getCyUserList();
+			},
+			getCyUserList() {
+				if (this.pageNum === 1 || (this.pageNum <= this.pageTotal)) {
+					_sampleDetail.getCyUserList({
+						pageNum: this.pageNum,
+						pageSize: this.pageSize,
+						name: this.queryUserName
+					}, res => {
+						const { data, message, code } = res;
+						if (code === 200) {
+							this.cyUserList = data;
+							/*const { list, total } = data;
+							this.totalCount = total;
+							this.pageTotal = Math.ceil(total / this.pageSize);
+							if (this.pageNum === 1) {
+								this.cyUserList = list;
+							} else {
+								this.cyUserList = this.cyUserList.concat(list);
+							}
+							this.pageNum++;*/
+						} else {
+							uni.showToast({
+								icon: "none",
+								title: message,
+								duration: 1000
+							});
+						}
+					});
+				}
+			},
+        }
+    };
+
+</script>
+
+<style scoped>
+    .page {
+        /*background-image: var(--gradualBlue);*/
+        background-image: linear-gradient(45deg, #0081ff, #1cbbb4);
+        width: 100vw;
+        overflow: hidden;
+    }
+
+    .DrawerPage .nav .cu-item.cur {
+        border-bottom: 4rpx solid;
+    }
+
+    .DrawerPage .nav .cu-item.cur::after {
+        content: none;
+    }
+
+    /*.nav .cu-item{
+        height: 70rpx;
+        line-height: 70rpx;
+    }*/
+    .cu-modal.drawer-modal .cu-dialog {
+        min-width: 85vw;
+    }
+
+    .btDialog {
+        min-height: 80vh;
+    }
+
+    .detail view {
+        height: 1.8em;
+        line-height: 1.8em !important;
+        border: none;
+        color: gray;
+    }
+
+	label {
+		padding-left: .5em;
+	}
+
+	.productScroll {
+		height: 30em;
+		max-height: 60vh;
+	}
+    .tools {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 20upx;
+    }
+    .fixedFootBtn {
+        border-top: 1px solid #ddd;
+        position: fixed;
+        width: 100vw;
+        bottom: 0;
+        z-index: 1000;
+    }
+</style>

+ 291 - 0
pages/sample-detail/sample-detail-model.js

@@ -0,0 +1,291 @@
+import {
+	Base
+} from '../../static/util/base.js'
+class SampleDetail extends Base {
+	constructor() {
+		super();
+	}
+
+	getAhSampleSheetDetail(id,callBack) {
+		var params = {
+			url: '/ah/ahSampleSheet/'+id,
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	getSubXzqList(xzqCode,callBack){
+		var params = {
+			url: '/jg/tZdXzq/list',
+			type: 'get',
+			data: {xzqCode},
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.jgRequest(params);
+	}
+
+	getEnterPriseList(param,callBack){
+		var params = {
+			url: '/jg/tEnterprises/list',
+			type: 'get',
+			data: param,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.jgRequest(params);
+	}
+
+	updateAhSampleSheet(param,callBack){
+		const params = {
+			url: '/ah/ahSampleSheet/'+param.id,
+			type: 'PUT',
+			data: param,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	uploadCheckPhoto(param,callBack){
+		const params = {
+			url: '/ah/ahSampleSheet/updateSampleSheet',
+			type: 'post',
+			data: param,
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	publishSampleSheet(id,callBack){
+		const params = {
+			url: '/ah/ahSampleSheet/publishSampleSheetByCheck',
+			type: 'POST',
+			data: {id},
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+	submitSampleSheet(id,callBack){
+		const params = {
+			url: '/ah/ahSampleSheet/submitSampleSheet',
+			type: 'POST',
+			data: {id},
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	createAhSampleDetail(param,callBack){
+		const params = {
+			url: '/ah/ahSampleDetail/create',
+			type: 'post',
+			data: param,
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+	updateAhSampleDetail(param,callBack){
+		const params = {
+			url: '/ah/ahSampleDetail/'+param.id,
+			type: 'put',
+			data: param,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+	getBaseByCheckList(qydm,callBack){
+		const params = {
+			url: '/jg/tBase/getBaseByCheckList',
+			type: 'get',
+			data: {qydm},
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.jgRequest(params);
+	}
+
+	/**
+	 * 查询单位列表
+	 */
+	getDictTypeList(callBack){
+		const params = {
+			url: '/ah/ahDictType/list',
+			type: 'get',
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+	/**
+	 * 根据主体和基地查询产品列表
+	 */
+	getProductBatchList({qydm,baseNumber},callBack){
+		const params = {
+			url: '/ahjg/tProductBatch/getProductBatchList?qydm='+qydm+"&base_number="+baseNumber,
+			type: 'get',
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.jgRequest(params);
+	}
+	//获取本抽样单下面所有样品详细信息
+	getSampleSheetDetailData(data,callBack){
+		const params = {
+			url: '/ah/ahSampleDetail/list',
+			type: 'get',
+			data:data,
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	/**
+	 * 删除抽样样品
+	 * @param id
+	 * @param callBack
+	 */
+	delSampleDetail(id,callBack){
+		const params = {
+			url: '/ah/ahSampleDetail/'+id,
+			type: 'delete',
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+	
+	/**
+	 * 根据企业信息获取样品列表
+	*/
+	getSampleByCompany(data, callBack) {
+		const params = {
+			url: '/ahjg/tProductBatch/getProductBatchInfo',
+			type: 'get',
+			data:data,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.jgRequest(params);
+	}
+	
+	/**
+	 * 获取胶体金检测类型
+	 */
+	getJTJTypeList(data, callBack) {
+		const params = {
+			url: '/ah/ah-colloid-dictionary/list',
+			type: 'get',
+			data:data,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+	
+	/**
+	 * 提交胶体金检测图片
+	 */
+	submitJTJImage(image, callBack){
+		const params = {
+			url: '/ah/ah-jtj-data/uploadImage',
+			type: 'POST',
+			name: 'image',
+			filePath: image,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.uploadFileByServer(params);
+	}
+	// 保存识别结果
+	saveResult(param,callBack) {
+		const params = {
+			url: '/ah/ah-jtj-data/add',
+			type: 'post',
+			data: param,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+	// 查询胶体金检测列表
+	getJTJList(data, callBack) {
+		const params = {
+			url: '/ah/ah-jtj-data/list',
+			type: 'get',
+			data:data,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+	
+	// 查询胶体金检测列表
+	getQuickList(data, callBack) {
+		const params = {
+			url: '/ah-check-station-record/list',
+			type: 'get',
+			data:data,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+	// 上传图片
+	uploadPhoto(filePath, callBack) {
+		var params = {
+			url: '/ah/fileUpload/upload',
+			type: 'POST',
+			name: 'file',
+			filePath: filePath,
+			sCallBack: function (res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.uploadFileByServer(params,false,"file");
+	}
+
+	getCyUserList(data,callBack){
+		const params = {
+			url:"/cmu/cmUser/getUserListByRole",
+			data:data,
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.request(params);
+	}
+
+}
+
+const _sampleDetail = new SampleDetail();
+export {
+	_sampleDetail
+}

+ 76 - 0
pages/sample-info-list/index.vue

@@ -0,0 +1,76 @@
+<template>
+    <view class="home">
+        <cu-custom class="home-custom" bgColor=".bg-sancolor"
+                   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+            <block slot="content">安徽省农产品检测监测平台</block>
+        </cu-custom>
+        <view>
+            <view class="cu-list menu content-box" v-for="(item, index) in sampleInfoDataList">
+                <view class="cu-item" :class="menuArrow?'arrow':''">
+                    <view class="content">
+                        <div class="text-gray">样品名称:{{ item.name }}</div>
+                        <div class="text-gray">样品来源:{{ item.source }}</div>
+                        <div class="text-gray">抽样数量:{{ item.samplingNumber }}{{ item.samplingType }}</div>
+                        <div class="text-gray">抽样基数:{{ item.samplingBase }}{{ item.samplingType }}</div>
+                        <div class="text-gray">生产日期:{{ item.manufactureDate }}</div>
+                        <div class="text-gray">抽样日期:{{ item.samplingDate }}</div>
+                    </view>
+                </view>
+            </view>
+            <!-- <view class="home-fixed" @tap="rediectHome">首页</view> -->
+        </view>
+
+    </view>
+</template>
+
+
+<script>
+
+    import { _sampleInfo } from "./sample-info-model.js";
+
+    export default {
+
+        data() {
+            return {
+                sampleInfoDataList: []
+            };
+        },
+
+        created() {
+
+        },
+
+        onLoad(options) {
+            this.getSampleInfoList(options.id);
+        },
+
+        mounted() {
+
+        },
+        methods: {
+            rediectHome() {
+                uni.redirectTo({
+                    url: "/pages/index/index"
+                });
+            },
+            getSampleInfoList(id) {
+                _sampleInfo.getAhSampleDetail(id, res => {
+                    this.sampleInfoDataList = res.data.data.records;
+                    console.log(this.sampleInfoDataList);
+                });
+            }
+        }
+    };
+
+</script>
+
+<style scoped>
+    .content {
+        padding: 10px;
+    }
+
+    .content-box {
+        margin: 20px;
+        border-radius: 5px;
+    }
+</style>

+ 22 - 0
pages/sample-info-list/sample-info-model.js

@@ -0,0 +1,22 @@
+import {
+	Base
+} from '../../static/util/base.js'
+class SampleInfo extends Base {
+	constructor() {
+		super();
+	}
+	getAhSampleDetail(id,callBack) {
+		var params = {
+			url: '/ah/ahSampleDetail/list?sampleSheetId='+id,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+}
+
+const _sampleInfo = new SampleInfo();
+export {
+	_sampleInfo
+}

+ 309 - 0
pages/sample-list/index.vue

@@ -0,0 +1,309 @@
+<template>
+    <view class="home" style="padding-bottom: 150upx">
+        <cu-custom class="home-custom" bgColor=".bg-sancolor"
+                   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+            <block slot="content">抽样列表</block>
+        </cu-custom>
+        <view class="padding">
+<!--            @tap="toSampleDetail(item.id,item.sampleStatus)"-->
+            <view class="cu-list menu bg-white" v-for="(item, index) in sampleSheetDataList">
+                <view class="cu-item solids-bottom">
+                    <view class="title">
+                        <text class="cuIcon-titles text-green"></text>
+                        <text class="text-black text-bold text-lg">{{ index + 1 }}.{{ item.samplingNumber }}</text>
+                    </view>
+                    <view class="action">
+                        <view class="text-blue" v-show="item.sampleStatus === 'SAMPLE_FILLED'">已填报</view>
+                        <view class="text-gray" v-show="item.sampleStatus === 'SAMPLE_REPORT'">已上报</view>
+                        <view class="text-red" v-show="item.sampleStatus === 'SAMPLE_WAIT_FILL'">待填报</view>
+                    </view>
+                </view>
+                <view class="cu-item">
+                    <view class="content detail padding-bottom">
+                        <!-- 	<image src="/static/logo.png" class="png" mode="aspectFit"></image> -->
+                        <div class="text-gray" v-if="item.samplingPeopleFirst">抽样人员1:{{ item.samplingPeopleFirst }}</div>
+                        <div class="text-gray" v-if="item.samplingPeopleSecond">抽样人员2:{{ item.samplingPeopleSecond }}</div>
+                        <div class="text-gray">创建时间:{{ item.createTime }}</div>
+                        <div class="text-gray">更新时间:{{ item.updateTime }}</div>
+<!--                        <div class="text-gray">状态:{{ setSampleStatus(item.sampleStatus) }}</div>-->
+                    </view>
+                </view>
+                <view class="tools padding-sm">
+                    <view @tap="deleteAhSampleSheet(item.id)">
+                        <view class="btn-item text-black text-bold">
+                            <text class="cuIcon-deletefill lg"></text>
+                            <text class="text-sm">删除</text>
+                        </view>
+                    </view>
+                    <view style="display: flex;justify-content: space-between;gap:30upx">
+                        <view class="tool margin-left-sm" @tap="exportFile(item.id)"  v-if="item.sampleStatus === 'SAMPLE_FILLED'">
+                            <view class="cu-tag bg-green light text-df text-bold">
+                                <text class="cuIcon-newshotfill lg"></text>
+                                导出抽样单
+                            </view>
+                        </view>
+
+                        <view class="tool" @tap="toSampleDetail(item.id)">
+                            <view class="cu-tag bg-blue light text-df text-bold">
+                                去填报
+                                <text class="cuIcon-right lg"></text>
+                            </view>
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </view>
+        <view class="reviewBtn" @tap="addSheet" v-if="showUpBtn">
+            <view class="subBtn bg-green">
+                添加
+            </view>
+        </view>
+        <view class="padding flex flex-direction padding-bottom-xl fixedFootBtn bg-white padding-top-xs" v-if="sampleSheetDataList.length >= 1 && showUpBtn">
+            <button class="cu-btn bg-green lg margin-top-sm shadow-blur" type="" @tap="upSheet">
+                上报
+            </button>
+        </view>
+
+        <view class="cu-modal" :class="modalName==='addSample'?'show':''">
+            <view class="cu-dialog">
+                <view class="cu-bar bg-white justify-end">
+                    <view class="content" style="width: 100%">添加抽样单</view>
+                    <view class="action" @tap="hideModal">
+                        <text class="cuIcon-close text-red"></text>
+                    </view>
+                </view>
+                <view class="padding-lr-lg bg-white padding-bottom">
+                    <view class="cu-list menu">
+                        <view class="cu-form-group ">
+                            <view class="title">抽样人员1</view>
+                            <input name="input" v-model="options.samplingPeopleFirst" placeholder="请输入抽样人员1">
+                        </view>
+                        <view class="cu-form-group ">
+                            <view class="title">抽样人员2</view>
+                            <input name="input" v-model="options.samplingPeopleSecond" placeholder="请输入抽样人员2">
+                        </view>
+                    </view>
+                    <view class="padding flex flex-direction">
+                        <button class="cu-btn bg-blue lg" @tap="submitSampleSheet">提交</button>
+                    </view>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+
+<script>
+    import {
+        _sampleList
+    } from "./sample-list-model.js";
+    import {
+        _taskList
+    } from "../task-list/task-list-model.js";
+    import {_sampleSheetAdd} from '../sample-sheet-add/sample-sheet-add-model.js'
+
+    export default {
+
+        data() {
+            return {
+                sampleSheetDataList: [],
+                sampleStatus: [],
+                addBackground: "background-color:#c0c0c0",
+                uploadBackground: "background-color:#c0c0c0",
+                options: {},
+                modalName:null,
+                showUpBtn:true
+            };
+        },
+
+        onLoad(options) {
+            if (options.status === "SAMPLE_SUCCESS" || options.status === "CHECK_PROCESS" || options.status === "SAMPLE_CHECK_SUCCESS") {
+                this.addBackground = "background-color: #c0c0c0";
+                this.uploadBackground = "background-color: #c0c0c0";
+                this.showUpBtn = false;
+            } else {
+                this.addBackground = "background-color: #00B525";
+                this.uploadBackground = "background-color: #0081ff";
+            }
+            this.options = options;
+            this.getSampleStatus();
+        },
+
+        onShow() {
+            this.getAhSampleSheetList(this.options);
+        },
+        methods: {
+            //添加
+            addSheet() {
+                if (this.options.status === "SAMPLE_SUCCESS" || this.options.status === "CHECK_PROCESS" || this.options.status === "SAMPLE_CHECK_SUCCESS") {
+                    console.log("不可添加");
+                } else {
+                    console.log("调用添加弹窗");
+                    console.log(this.options);
+                    this.modalName = "addSample"
+                    /*uni.navigateTo({
+                        url: "/pages/sample-sheet-add/index?checkId=" + this.options.checkId + "&sampleId=" + this.options.sampleId
+                            + "&taskId=" + this.options.taskId + "&zoneId=" + this.options.zoneId
+                    });*/
+                }
+            },
+            //新建抽样单
+            submitSampleSheet(){
+                if(!this.options.samplingPeopleFirst && !this.options.samplingPeopleSecond){
+                    this.$msg("请填写抽样人员");
+                    return false;
+                }
+                _sampleSheetAdd.createAhSampleSheet(this.options, res=>{
+                    console.log(res.data)
+                    const {data:{code,message}} = res;
+                    if(code===200){
+                        this.$success("添加成功");
+                        delete this.options.samplingPeopleFirst;
+                        delete this.options.samplingPeopleSecond;
+                        this.getAhSampleSheetList(this.options);
+                        this.modalName = null;
+                    }else{
+                        this.$msg(message);
+                    }
+                })
+            },
+            /**
+             * 上报抽样单
+             */
+            upSheet() {
+                if (this.options.status === "SAMPLE_SUCCESS" || this.options.status === "CHECK_PROCESS" || this.options.status === "SAMPLE_CHECK_SUCCESS") {
+                    console.log("不可上报");
+                    this.$msg("不可重复上报");
+                } else {
+                    _sampleList.upBatchSampleSheet(this.options,res=>{
+                        console.log(res);
+                        const {code,message} = res;
+                        if(code === 200){
+                            this.$success("上报成功");
+                            this.getAhSampleSheetList(this.options);
+                            this.showUpBtn = false;
+                        }else{
+                            this.$msg(message);
+                        }
+                    })
+                }
+            },
+            /**
+             * 删除抽样单
+             */
+            deleteAhSampleSheet(id){
+                uni.showModal({
+                    title: "提示",
+                    content: "确定要删除当前样本么",
+                    cancelText: "取消",
+                    confirmText: "确认",
+                    success: res => {
+                        if (res.confirm) {
+                            _sampleList.deleteAhSampleSheet(id, res => {
+                                const {code,message} = res;
+                                if(code === 200){
+                                    this.$success("删除成功");
+                                    this.getAhSampleSheetList(this.options);
+                                }else{
+                                    this.$msg(message);
+                                }
+                            });
+                        }
+                    }
+                });
+            },
+            toSampleDetail(id, status) {
+                uni.navigateTo({
+                    url: "/pages/sample-detail/index?id=" + id + "&status=" + status
+                });
+            },
+            exportFile(id) {
+                _sampleList.exportSampleSheetPdf(id,res=>{
+                    const {code,message} = res;
+                    if(code === 200){
+                        uni.downloadFile({
+                            url: res.data, //仅为示例,并非真实的资源
+                            success:res=> {
+                                // 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容
+                                if (res.statusCode === 200) {
+                                    /*wx.playVoice({
+                                        filePath: res.tempFilePath
+                                    })*/
+                                    this.$msg(JSON.stringify(res),100000);
+                                    const filePath = res.tempFilePath
+                                    uni.openDocument({
+                                        filePath: filePath,
+                                        showMenu:true,
+                                        fileType:"pdf",
+                                        success: ()=>{
+                                            console.log('打开文档成功')
+                                        },
+                                        fail:(err)=>{
+                                            this.$msg("文件查看失败");
+                                            console.log("文件查看失败,err:",err)
+                                        }
+                                    })
+                                }
+                            },
+                            fail:(err)=>{
+                                this.$msg("文件下载失败");
+                                console.log("文件下载失败,err:",err)
+                            }
+                        })
+                    }else{
+                        this.$msg("文件下载失败");
+                        console.log("文件生成失败,message:",message)
+                    }
+
+                })
+            },
+            getAhSampleSheetList(item) {
+                _sampleList.getAhSampleSheet(item, res => {
+                    this.sampleSheetDataList = res.data.data.records;
+                });
+            },
+            getSampleStatus() {
+                _taskList.getDictionary("SAMPLE_SHEET_STATUS", res => {
+                    this.sampleStatus = res.data.data;
+                });
+            },
+            setSampleStatus(value) {
+                let sampleStatus = this.sampleStatus;
+                for (let i = 0; i < sampleStatus.length; i++) {
+                    if (sampleStatus[i].itemValue === value) {
+                        return sampleStatus[i].itemKey;
+                    }
+                }
+            },
+            hideModal(){
+                this.modalName = "";
+            },
+        }
+    };
+</script>
+
+<style scoped>
+    .detail view {
+        height: 1.8em;
+        line-height: 1.8em !important;
+        border: none;
+        color: gray;
+    }
+
+    .tools {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 20upx;
+    }
+    .btn-item{
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+    }
+    /*.cu-tag{
+        !*padding: 20upx;*!
+        border-radius: 10upx 10upx;
+    }*/
+</style>

+ 79 - 0
pages/sample-list/sample-list-model.js

@@ -0,0 +1,79 @@
+import {
+	Base
+} from '../../static/util/base.js'
+class SampleList extends Base {
+	constructor() {
+		super();
+	}
+
+	getAhSampleSheet(item,callBack) {
+		var params = {
+			url: '/ah/ahSampleSheet/list?pageNum=1&pageSize=100&zoneId='+item.zoneId+
+			'&sampleId='+item.sampleId+'&taskId='+item.taskId+'&checkId='+item.checkId,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	/**
+	 * 上报全部抽样单
+	 * @param taskId
+	 * @param zoneId
+	 * @param checkId
+	 * @param sampleId
+	 * @param callBack
+	 */
+	upBatchSampleSheet({taskId,zoneId,checkId,sampleId},callBack){
+		var params = {
+			url: '/ah/ahSampleSheet/upBatchSampleSheet?zoneId='+zoneId+
+				'&sampleId='+sampleId+'&taskId='+taskId+'&checkId='+checkId,
+			type:"POST",
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	/**
+	 * 删除抽样单
+	 * @param id
+	 * @param callBack
+	 */
+	deleteAhSampleSheet(id,callBack){
+		const params = {
+			url: '/ah/ahSampleSheet/'+id,
+			type:"delete",
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+	/**
+	 * 获取抽样单下载地址
+	 * @param id
+	 * @param callBack
+	 */
+exportSampleSheetPdf(id,callBack){
+		const params = {
+			url: '/ah/ahSampleSheet/exportSampleSheetPdf?sampleSheetId='+id,
+			sCallBack: function(res) {
+				callBack && callBack(res.data)
+			}
+		}
+		this.serviceRequest(params);
+	}
+
+
+
+
+}
+
+const _sampleList = new SampleList();
+export {
+	_sampleList
+}

+ 55 - 0
pages/sample-sheet-add/index.vue

@@ -0,0 +1,55 @@
+<template>
+	<view class="home">
+		<cu-custom class="home-custom" bgColor=".bg-sancolor" bgImage="../../static/icons/bg.png" :isBack="true">
+			<block slot="content">安徽省农产品检测监测平台</block>
+		</cu-custom>
+	
+		<view class="cu-list menu content-box">
+			<form>
+				<view class="cu-form-group">
+					<view class="title">抽样人员1</view>
+					<input placeholder="请输入抽样人员1" name="input" v-model="options.samplingPeopleFirst"></input>
+				</view>
+				<view class="cu-form-group">
+					<view class="title">抽样人员2</view>
+					<input placeholder="请输入抽样人员2" name="input" v-model="options.samplingPeopleSecond"></input>
+				</view>
+				<view class="padding flex flex-direction">
+				  <button class="cu-btn bg-green  lg" @tap="submitSampleSheet()">提交</button>
+				</view>
+			</form>
+		</view>
+		
+	</view>
+	
+</template>
+
+
+<script>
+	import {_sampleSheetAdd} from './sample-sheet-add-model.js'
+	export default{
+		data(){
+			return{
+				options:[]
+			}
+		},
+		onLoad(options){
+			this.options = options
+		},
+		methods:{
+			//提交抽样单
+			submitSampleSheet(){
+				_sampleSheetAdd.createAhSampleSheet(this.options, res=>{
+					console.log(res.data)
+					if(res.data.code==200){
+						uni.navigateBack()
+					}
+				})
+			}
+		}
+	}
+	
+</script>
+
+<style>
+</style>

+ 26 - 0
pages/sample-sheet-add/sample-sheet-add-model.js

@@ -0,0 +1,26 @@
+import {
+	Base
+} from '../../static/util/base.js'
+class SampleSheetAdd extends Base {
+	constructor() {
+		super();
+	}
+	
+	createAhSampleSheet(data, callBack){
+		var params = {
+			url: '/ah/ahSampleSheet/create',
+			type: 'POST',
+			data:data,
+			sCallBack: function(res) {
+				callBack && callBack(res)
+			}
+		}
+		this.serviceRequest(params);
+	}
+}
+
+
+const _sampleSheetAdd = new SampleSheetAdd();
+export {
+	_sampleSheetAdd
+}

+ 79 - 0
pages/task-detail/index.vue

@@ -0,0 +1,79 @@
+<template>
+  <view class="home">
+    <cu-custom class="home-custom" bgColor=".bg-sancolor" bgImage="../../static/icons/bg.png">
+      <block slot="content">农产品检测监测平台</block>
+    </cu-custom>
+		<view>
+		<view class="cu-list menu content-box">
+			<view class="cu-item" :class="menuArrow?'arrow':''">
+				<view class="content">
+					<text class="cuIcon-circlefill text-black"></text>
+					<text class="text-black" style="font-weight: bold;">任务名称:xxxx</text>
+				</view>
+			</view>
+			<view class="cu-item" :class="menuArrow?'arrow':''">
+				<view class="content">
+				<!-- 	<image src="/static/logo.png" class="png" mode="aspectFit"></image> -->
+					<div class="text-gray">任务编号:</div>
+					<div class="text-gray">任务类别:</div>
+					<div class="text-gray">年度/季度:</div>
+					<div class="text-gray">开始时间:</div>
+					<div class="text-gray">截至时间:</div>
+					<div class="text-gray">执行标准:</div>
+					<div class="text-gray">抽检分离:</div>
+					<div class="text-gray">发布单位:</div>
+					<div class="text-gray">抽样单位:</div>
+					<div class="text-gray">检测单位:</div>
+					<div class="text-gray">创建时间:</div>
+					<div class="text-gray">更新时间:</div>
+					<div class="text-gray">状态:</div>
+				</view>
+			</view>
+			<view class="padding flex flex-direction">	
+			  <button class="cu-btn bg-green margin-tb-sm lg" @tap="toSmapleList">管理抽样单	</button>
+			</view>
+			</view>
+	    </view>
+		
+
+		
+</view>
+</template>
+
+
+<script>
+export default {
+
+data() {
+	return {
+
+	}
+},
+
+	created() {	
+
+	},
+
+	mounted() {
+
+	},
+	methods:{
+		toSmapleList(){
+			uni.navigateTo({
+				url:'/pages/sample-list/index'
+			})
+		}
+	}
+}
+
+</script>
+
+<style scoped>
+.content{
+	padding: 10px;
+}
+.content-box{
+	margin: 10px;
+	border-radius: 5px;
+}
+</style>

+ 209 - 0
pages/task-list/index.vue

@@ -0,0 +1,209 @@
+<template>
+    <view class="home padding-bottom">
+        <cu-custom class="home-custom" bgColor=".bg-sancolor"
+                   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+            <block slot="content">任务列表</block>
+        </cu-custom>
+        <view class="padding-sm">
+            <view class="cu-list menu margin-top taskDetail bg-white"
+                  v-for="(item, index) in taskListData" :key="index">
+                <view class="cu-item">
+                    <view class="title text-black text-bold text-lg">
+                        <text class="cuIcon-titles text-green"></text>
+                        {{ item.ahTasksList[0].taskName }}
+                        <view class="cu-tag round bg-cyan light margin-left-sm text-sm">
+                            {{ setTaskType(item.taskType) }}
+                        </view>
+                    </view>
+                    <view class="action">
+                        <view class="text-gray">
+                            {{ setTaskStatus(item.status) }}
+                        </view>
+
+                    </view>
+                </view>
+                <view class="content padding-sm detail solid-bottom">
+                    <view>任务编号:{{ item.ahTasksList[0].taskNumber }}</view>
+                    <view>年度/季度:{{ item.ahTasksList[0].taskYear.substr(0, 4) }}-{{ item.ahTasksList[0].taskBatch }}</view>
+                    <view>发布单位:{{ item.publishName }}</view>
+                    <view>任务时间:{{ item.ahTasksList[0].startTime }}至{{ item.ahTasksList[0].endTime }}</view>
+                </view>
+                <view class="tools" style="justify-content: space-between">
+                    <view @tap.stop.capture="showModal" data-target="Modal" :data-taskId="item.taskId">
+<!--                        <view class="cu-tag radius line-black padding-lr-sl">
+                            <text class="cuIcon-attentionfill text-lg padding-right-xs"></text>
+                            抽样项目
+                        </view>-->
+                        <view class="btn-item text-black text-bold">
+                            <text class="cuIcon-tagfill lg"></text>
+                            <text class="text-sm">抽样项目</text>
+                        </view>
+                    </view>
+                    <view class="tool" v-if="item.ahTasksList[0].status ==='TASK_RUNNING'"
+                          @tap="handleTaskDetail(item)">
+                        <view class="cu-tag bg-blue light text-df text-bold">去抽样 >></view>
+                    </view>
+                </view>
+            </view>
+        </view>
+
+        <view class="cu-modal" :class="modalName=='Modal'?'show':''">
+            <view class="cu-dialog">
+                <view class="cu-bar bg-white justify-end">
+                    <view class="content" style="width: 100%">抽样项</view>
+                    <view class="action" @tap="hideModal">
+                        <text class="cuIcon-close text-red"></text>
+                    </view>
+                </view>
+                <view class="padding-xl">
+                    <view class="cu-list menu" v-for="(item, index) in taskDetailList">
+                        <div class="cu-form-group">
+                            <view class="title">抽查样品名称</view>
+                            <span class="text-gray">{{ item.productName }}</span>
+                        </div>
+                        <div class="cu-form-group">
+                            <view class="title">检测参数</view>
+                            <span class="text-gray">{{ item.productHazard }}</span>
+                        </div>
+                    </view>
+                </view>
+            </view>
+        </view>
+    </view>
+
+</template>
+
+
+<script>
+    import {
+        _taskList
+    } from "./task-list-model.js";
+
+    export default {
+
+        data() {
+            return {
+                taskListData: [],
+                taskTypeList: [],
+                taskDetailList: [],
+                taskStatus: [],
+                modalName: null
+            };
+        },
+
+        created() {
+            this.getTaskType();
+            this.getTaskStatus();
+        },
+        onShow(){
+            this.getTask();
+        },
+        methods: {
+            rediectHome() {
+                uni.redirectTo({
+                    url: "/pages/index/index"
+                });
+            },
+            showModal(e) {
+                this.modalName = e.currentTarget.dataset.target;
+                console.log(e.currentTarget.dataset.taskid);
+                _taskList.getTaskSampleDetail(e.currentTarget.dataset.taskid, res => {
+
+                    this.taskDetailList = res.data.data.records;
+                });
+            },
+            hideModal(e) {
+                this.modalName = null;
+            },
+            getTask() {
+                _taskList.getTaskList(res => {
+                    console.log(res);
+                    this.taskListData = res.data.data.records;
+                    console.log(this.taskListData);
+                });
+
+            },
+            handleTaskDetail(item) {
+                uni.navigateTo({
+                    url: "/pages/sample-list/index?zoneId=" + item.zoneId +
+                        "&sampleId=" + item.sampleId + "&taskId=" + item.taskId + "&checkId=" + item.checkId + "&status=" + item.status
+
+                });
+            },
+            getTaskType() {
+                _taskList.getDictionary("TASK_TYPE", res => {
+                    this.taskTypeList = res.data.data;
+                });
+            },
+            setTaskType(taskType) {
+                const taskTypeList = this.taskTypeList;
+                for (let i = 0; i < taskTypeList.length; i++) {
+                    if (taskTypeList[i].itemValue === taskType) {
+                        return taskTypeList[i].itemKey;
+                    }
+                }
+            },
+            getTaskStatus() {
+                _taskList.getDictionary("SAMPLE_CHECK_STATUS", res => {
+                    this.taskStatus = res.data.data;
+                });
+            },
+            setTaskStatus(value) {
+                console.log(value);
+                let taskStatus = this.taskStatus;
+                for (let i = 0; i < taskStatus.length; i++) {
+                    if (taskStatus[i].itemValue === value) {
+                        return taskStatus[i].itemKey;
+                    }
+                }
+            },
+            setItemColor(value) {
+                let taskStatus = this.taskStatus;
+                const statusItem = taskStatus.find(v => v.itemValue === value);
+                let color;
+                const name = statusItem.itemKey;
+                if (name.includes("执行中")) {
+                    color = "green";
+                } else if (name.includes("已完成")) {
+                    color = "blue";
+                } else if (name.includes("已转发")) {
+                    color = "orange";
+                }
+                return color;
+            }
+
+        }
+    };
+</script>
+
+<style scoped>
+    .detail view {
+        height: 1.8em;
+        line-height: 1.8em !important;
+        border: none;
+        color: gray;
+    }
+    .tools{
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 20upx;
+    }
+
+    .taskDetail {
+        /*border: 1rpx solid #8799a3;*/
+        box-shadow: 0 0 25upx #aaa;
+        border-radius: 10rpx;
+        overflow: hidden;
+    }
+    .btn-item{
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+    }
+    .cu-tag{
+        padding: 20upx;
+        border-radius: 10upx;
+    }
+</style>

+ 46 - 0
pages/task-list/task-list-model.js

@@ -0,0 +1,46 @@
+import { Base } from '../../static/util/base.js'
+class TaskList extends Base {
+
+  constructor() {
+    super();
+  }
+  
+ getTaskList(callBack){
+  	var params = {
+  	  url: '/ah/ahZoneSampleCheck/getSampleTasksList?pageNum=1&pageSize=100',
+  	  sCallBack: function (res) {
+  	    callBack && callBack(res)
+  	  }
+  	}
+  	this.serviceRequest(params);  
+  }
+  
+  getDictionary(type, callBack){
+   	var params = {
+   	  url: '/ah/ahDictionary/listType?type='+type,
+   	  sCallBack: function (res) {
+   	    callBack && callBack(res.data)
+   	  }
+   	}
+   	this.serviceRequest(params);  
+   }
+   
+   
+   getTaskSampleDetail(taskId,callBack){
+	   var params = {
+		 url: '/ah/ahTaskDetail/list?pageNum=1&pageSize=100&taskId='+taskId,
+		 sCallBack: function (res) {
+		   callBack && callBack(res)
+		 }
+	   }
+	   this.serviceRequest(params);  
+   }
+   
+}
+
+
+
+
+  
+	const _taskList = new TaskList();
+	export { _taskList }

+ 176 - 0
pages/zf-task-list/index.vue

@@ -0,0 +1,176 @@
+<template>
+    <view class="home padding-bottom">
+        <cu-custom class="home-custom" bgColor=".bg-sancolor"
+                   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+            <block slot="content">任务列表</block>
+        </cu-custom>
+        <view class="padding-sm">
+            <view class="cu-list menu margin-top taskDetail bg-white"
+                  v-for="(item, index) in taskListData" :key="index">
+                <view class="cu-item">
+                    <view class="title text-black text-bold text-lg">
+                        <text class="cuIcon-titles text-green"></text>
+                        抽样区域:{{ item.sampleUnitName }}
+                    </view>
+                </view>
+                <view class="content padding-sm detail solid-bottom">
+                    <view>
+                        <text class="text-green">
+                            抽样批次数:
+                            <text class="text-xl text-bold">{{ item.batchNumber }}</text>
+                        </text>
+                    </view>
+                    <view>分配单位:{{ item.publishUnitName }}</view>
+                    <view>分配人员:{{ item.publishName }}</view>
+                    <view>分配时间:{{item.ahTasks.updateTime}}
+                    </view>
+                </view>
+                <view class="tools" style="justify-content: space-between">
+                    <view>
+                    </view>
+                    <view class="tool"
+                          @tap="handleRandomCmp(item)">
+                        <view class="text-blue text-df text-bold text">
+                            抽取检查企业>>
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </view>
+        <view class="cu-load bg-green light text-sm" v-show="pageTotal > 0"
+              :class="page > pageTotal?'over':'loading'"></view>
+        <view class="radius shadow-warp bg-white margin-top text-lg" v-show="pageTotal === 0">
+            <view class="cu-list menu-avatar">
+                <view class="cu-item">
+                    <view class="content">
+                        <view class="text-sm text-center" style="justify-content: center;">
+                            <text class="text-cut">
+                                <text class="cuIcon-warn text-yellow margin-right-xs text-xl"></text>
+                                未查询到相关数据
+                            </text>
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </view>
+    </view>
+
+</template>
+
+
+<script>
+    import {
+        _zfyTaskList
+    } from "./zf-task-list-model.js";
+
+    export default {
+
+        data() {
+            return {
+                page: 1,
+                size: 10,
+                pageTotal: 1,
+                taskListData: [],
+                curTask: {},
+                taskId:null
+            };
+        },
+        onReachBottom() {
+        },
+        onShow() {
+            this.page = 1;
+            this.pageTotal = 1;
+            this.getCheckTaskListBySample();
+        },
+        onLoad(option){
+            this.taskId = option.taskId;
+        },
+        methods: {
+            getCheckTaskListBySample() {
+                if (this.page === 1 || (this.page <= this.pageTotal)) {
+                    _zfyTaskList.getCheckTaskListBySample({
+                        pageNum: this.page,
+                        pageSize: this.size,
+                        taskId:this.taskId
+                    }, res => {
+                        const {data, message, code} = res;
+                        if (code === 200) {
+                            const {records, total} = data;
+                            this.pageTotal = Math.ceil(total / this.size);
+                            if (this.page === 1) {
+                                this.taskListData = records;
+                            } else {
+                                this.taskListData = this.taskListData.concat(records);
+                            }
+                            this.page++;
+                        } else {
+                            this.$msg(message);
+                        }
+                    });
+                }
+            },
+            handleRandomCmp(item) {
+                uni.navigateTo({
+                    url: "/pages/zf-task-list/sampleRandom/index?taskId=" + item.taskId +
+                        "&sampleCheckId=" + item.id+"&batchNumber="+ item.batchNumber+"&sampleId="+item.sampleId
+                });
+            },
+            formatDate(dateTime) {
+                return dateTime.substring(0, 10)
+            }
+
+        }
+    };
+</script>
+
+<style scoped>
+    .detail view {
+        height: 2em;
+        line-height: 2em !important;
+        border: none;
+        color: gray;
+    }
+
+    .tools {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 30upx;
+
+    }
+    .tool .text{
+        font-size: 1.1em!important;
+    }
+
+    .taskDetail {
+        /*border: 1rpx solid #8799a3;*/
+        box-shadow: 0 0 25upx #aaa;
+        border-radius: 10rpx;
+        overflow: hidden;
+    }
+
+    .btn-item {
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+    }
+
+    .cu-tag {
+        padding: 20upx;
+        border-radius: 10upx;
+    }
+
+    label {
+        padding-left: .5em;
+    }
+
+    .text-content {
+        line-height: 2em;
+        white-space: pre-line;
+        text-align: left;
+        max-height: 60vh;
+        overflow-y: scroll;
+        /*padding-bottom: 100rpx;*/
+    }
+</style>

+ 534 - 0
pages/zf-task-list/sampleRandom/index.vue

@@ -0,0 +1,534 @@
+<template>
+	<view class="home padding-bottom">
+		<cu-custom class="home-custom" bgColor=".bg-sancolor"
+				   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+			<block slot="content">企业抽检</block>
+		</cu-custom>
+		<view class="cu-form-group solid-bottom">
+			<view class="title text-xl text-bold">
+				<text class="cuIcon cuIcon-titles text-blue"></text>
+				抽样主体列表
+			</view>
+			<view>抽样批次数:
+				<text class="text-bold text-lg">{{ batchNumber }}</text>
+			</view>
+		</view>
+		<view class="padding-sm" style="margin-bottom: 130rpx">
+			<view class="cu-list menu margin-top-sm taskDetail bg-white"
+				  v-for="(item, index) in sampleList" :key="index">
+				<view class="cu-item">
+					<view class="content text-black text-bold">
+						<text class="cuIcon-titles text-green">{{ index + 1 }}.</text>
+						{{ item.bySampleUnitName }}
+					</view>
+					<view class="action">
+
+					</view>
+				</view>
+				<view class="content padding-sm detail solid-bottom">
+					<view class="text-bold text-orange">当前状态:{{ setSampleStatus(item.sampleStatus) }}</view>
+					<view>抽检样品:{{ item.mustProductName }}
+					</view>
+					<view>负责人:{{ item.bySampleContactName }}</view>
+					<view>联系电话:{{ item.bySampleContactPhone }}</view>
+					<view style="height: auto">企业地址:{{ item.bySampleAddress.replaceAll(",", "").replaceAll(" ", "")
+						}}
+					</view>
+				</view>
+				<view class="tools" style="justify-content: space-between">
+					<view>
+					</view>
+					<!--                    <view class="tool" v-if="item.ahTasks.status ==='TASK_RUNNING'"
+											  @tap="handleTaskDetail(item)">
+											<view class="cu-tag bg-blue light text-df text-bold">去抽样 >></view>
+										</view>-->
+
+					<view class="tool" @tap="toFillSample(item)">
+						<view class="text-blue text-df text-bold text">
+							{{ getBtnName(item.sampleStatus) }}>>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="radius shadow-warp bg-white text-lg" v-if="sampleList.length === 0">
+				<view class="cu-list menu-avatar">
+					<view class="cu-item">
+						<view class="content">
+							<view class="text-sm text-center" style="justify-content: center;">
+								<text class="text-cut text-lg">
+									<text class="cuIcon-warn text-yellow margin-right-xs text-xl"></text>
+									未添加抽检主体数据
+								</text>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<view class="padding flex flex-direction padding-bottom-xl fixedFootBtn bg-white padding-top">
+			<button class="cu-btn bg-blue lg shadow-blur" type="" @tap="showFirstProductChoose"
+					:disabled="sampleList.length >= batchNumber">抽取抽检主体
+			</button>
+		</view>
+		<view class="cu-modal bottom-modal" :class="modalName==='productListModal'?'show':''">
+			<view class="cu-dialog" @tap.stop.prevent>
+				<view class="cu-bar bg-white">
+					<view class="action text-blue" @tap="hideModal">取消</view>
+					<view class="content text-bold">选择抽检样品</view>
+				</view>
+				<view class="bg-white">
+					<view class="cu-bar search bg-white">
+						<view class="search-form radius text-left">
+							<text class="cuIcon-search"></text>
+							<input type="text" placeholder="输入样品名称搜索" confirm-type="search"
+								   v-model="queryProName" />
+							<text class="cuIcon cuIcon-close endClass text-xxl text-bold" @tap="resetQymcQuery"
+								  v-show="queryProName !== ''"></text>
+						</view>
+						<view class="action"><!-- 全部的按钮 -->
+							<button class="cu-btn bg-green shadow-blur round" @tap="searchProduct">搜索</button>
+						</view>
+					</view>
+					<scroll-view scroll-y class="productScroll padding" @scrolltolower="getProductList">
+						<radio-group @change="productNameChange">
+							<view class="flex flex-wrap">
+								<view class="basis-df padding-xs text-left" v-for="(item,index) in productList"
+									  :key="index">
+									<checkbox :value="item.productName" class="radio" :id="'productName'+index"
+											  :checked="sampleRandom.productName === item.productName"></checkbox>
+									<label :for="'productName'+index">{{ item.productName }}</label>
+								</view>
+							</view>
+						</radio-group>
+					</scroll-view>
+
+				</view>
+			</view>
+		</view>
+		<view class="cu-modal" :class="modalName==='SureProductNameModal'?'show':''">
+			<view class="cu-dialog">
+				<view class="cu-bar bg-white justify-end">
+					<view class="content">抽检企业</view>
+					<view class="action" @tap="hideModal">
+						<text class="cuIcon-close text-red"></text>
+					</view>
+				</view>
+				<view class="padding-left padding-right padding-bottom-sm cu-list menu bg-white">
+					<view class="cu-form-group">
+						<view class="title">抽样样品名称</view>
+						<picker :disabled="true" @tap="modalName = 'productListModal'">
+							<view class="picker">
+								{{ sampleRandom.productName }}
+							</view>
+						</picker>
+					</view>
+					<view class="cu-form-group" v-if="!isCounty">
+						<view class="title">所属区域</view>
+						<picker :range="regionArray" @change="RegionChange"
+								:value="selectIndex">
+							<view class="picker">
+								{{ regionArray[selectIndex] || "请选择区域" }}
+							</view>
+						</picker>
+					</view>
+					<view class="cu-form-group solid-bottom">
+						<view class="title">抽检主体数量</view>
+						<input type="number" v-model.trim="sampleRandom.enterprisesNum"
+							   placeholder="请输入抽检主体数量">
+					</view>
+					<view class="text-right padding-right text-gray padding-top-sm"
+						  v-show="lastCmpNum !== null && lastCmpNum >= 0">
+						<text>剩余可抽取主体:
+							<text class="text-bold text-lg">{{ lastCmpNum }}</text>
+							家
+						</text>
+					</view>
+				</view>
+				<view class="padding flex flex-direction">
+					<button class="cu-btn bg-green lg shadow-blur" type="" @tap="getEnterprisesList"
+							:disabled="lastCmpNum == null || lastCmpNum === 0">抽取
+					</button>
+				</view>
+			</view>
+		</view>
+		<view class="cu-modal" :class="modalName=='onSureSampleEnterpriseModel'?'show':''">
+			<view class="cu-dialog">
+				<view class="cu-bar bg-white justify-end">
+					<view class="content">待确认抽检主体</view>
+					<view class="action" @tap="hideModal">
+						<text class="cuIcon-close text-red"></text>
+					</view>
+				</view>
+				<view class="padding-left padding-right padding-bottom-sm cu-list menu bg-white">
+					<scroll-view class="text-content" scroll-y>
+						<view class="cu-item">
+							<view class="title text-black text-bold text-lg text-left"
+								  v-for="(item,index) in onSureEnterpriseList"
+								  :key="index">
+								<text class="cuIcon-title text-green margin-right-xs"></text>
+								<text>{{ item.enterprisesName }}</text>
+							</view>
+						</view>
+					</scroll-view>
+				</view>
+				<view class="cu-bar bg-green light" @tap="createSampleSheetList">
+					<view class="action margin-0 flex-sub">确认</view>
+				</view>
+			</view>
+		</view>
+	</view>
+
+
+</template>
+
+
+<script>
+import {
+	_sampleRandom
+} from "./sample-random-model";
+import { _taskList } from "../../task-list/task-list-model";
+
+export default {
+	data() {
+		return {
+			taskId: null,
+			sampleCheckId: null,
+			batchNumber: 0,
+			sampleRandom: {
+				productName: "",
+				enterprisesNum: ""
+			},
+			onSureEnterpriseList: [],
+			productList: [],
+			taskListData: [],
+			taskTypeList: [],
+			taskDetailList: [],
+			taskStatus: [],
+			modalName: null,
+			xzqdm: null,
+			pageTotal: 1,
+			totalCount: 0,
+			page: 1,
+			size: 40,
+			samplePage: 1,
+			sampleSize: 10,
+			samplePageTotal: 1,
+			sampleTotalCount: 0,
+			sampleList: [],
+			zfrSelected: [],
+			serviceZfrSelected: [],
+			queryProName: "",
+			subXzqList: [],
+			selectIndex: null,
+			lastCmpNum: null,
+			sampleStatus: [],
+			isCounty:false
+		};
+	},
+	onLoad(param) {
+		this.page = 1;
+		this.pageTotal = 1;
+		this.taskId = param.taskId;
+		this.batchNumber = param.batchNumber;
+		this.sampleCheckId = param.sampleCheckId;
+		this.xzqdm = param.sampleId;
+		if (this.xzqdm.endsWith("000") && !this.xzqdm.endsWith("00000")) {
+			this.isCounty = true;
+		}
+		this.getProductList();
+		this.getSampleCheckList();
+		this.initXzqRange();
+		this.getSampleStatus();
+	},
+	computed: {
+		regionArray() {
+			return this.subXzqList.map(v => v.xzqmc);
+		},
+		selectXzqCode() {
+			if(this.isCounty){
+				return this.xzqdm;
+			} else {
+				if (this.selectIndex !== null) {
+					return this.subXzqList[this.selectIndex].xzqdm;
+				}
+			}
+
+		}
+	},
+	methods: {
+		showFirstProductChoose() {
+			this.sampleRandom.enterprisesNum = null;
+			this.sampleRandom.productName = null;
+			this.modalName = "productListModal";
+		},
+		getSampleCheckList() {
+			if (this.samplePage === 1 || (this.samplePage <= this.samplePageTotal)) {
+				_sampleRandom.getSampleCheckList({
+					pageNum: this.samplePage,
+					pageSize: this.sampleSize,
+					sampleCheckId: this.sampleCheckId
+				}, res => {
+					const { data, message, code } = res;
+					if (code === 200) {
+						const { records, total } = data;
+						this.sampleTotalCount = total;
+						this.samplePageTotal = Math.ceil(total / this.sampleSize);
+						if (this.samplePage === 1) {
+							this.sampleList = records;
+						} else {
+							this.sampleList = this.sampleList.concat(records);
+						}
+						this.samplePage++;
+					} else {
+						uni.showToast({
+							icon: "none",
+							title: message,
+							duration: 1000
+						});
+					}
+				});
+			}
+		},
+
+		searchProduct() {
+			this.page = 1;
+			this.pageTotal = 1;
+			this.getProductList();
+		},
+		resetQymcQuery() {
+			this.queryProName = "";
+			this.searchProduct();
+		},
+		getProductList() {
+			if (this.page === 1 || (this.page <= this.pageTotal)) {
+				_sampleRandom.getProductList({
+					pageNum: this.page,
+					pageSize: this.size,
+					xzqCode: this.xzqdm,
+					productName: this.queryProName
+				}, res => {
+					const { data, message, code } = res;
+					if (code === 200) {
+						const { list, total } = data;
+						this.totalCount = total;
+						this.pageTotal = Math.ceil(total / this.size);
+						if (this.page === 1) {
+							this.productList = list;
+						} else {
+							this.productList = this.productList.concat(list);
+						}
+						this.page++;
+					} else {
+						uni.showToast({
+							icon: "none",
+							title: message,
+							duration: 1000
+						});
+					}
+				});
+			}
+		},
+		getEnterPrisesNum() {
+			if (this.selectXzqCode !== "" && this.selectXzqCode !== null && this.sampleRandom.productName) {
+				_sampleRandom.getEnterPrisesNum({
+					xzqCode: this.selectXzqCode,
+					productName: this.sampleRandom.productName
+				}, res => {
+					this.lastCmpNum = res.data;
+				});
+			} else {
+				this.lastCmpNum = null;
+			}
+
+		},
+		showModal(e) {
+			this.modalName = e.currentTarget.dataset.target;
+			_sampleRandom.getTaskSampleDetail(e.currentTarget.dataset.taskid, res => {
+				this.taskDetailList = res.data.records;
+			});
+		},
+		hideModal(e) {
+			this.curTask = null;
+			this.modalName = null;
+		},
+		createSampleSheetList() {
+			if (this.onSureEnterpriseList.length <= 0) {
+				this.$msg("抽检企业为空");
+				return;
+			}
+			const postData = this.onSureEnterpriseList.map(v => {
+				return {
+					bySampleAddress: v.enterprisesAddress,
+					bySampleContactName: v.fzrName,
+					bySampleContactPhone: v.fzrPhone,
+					bySampleUnitName: v.enterprisesName,
+					mustProductName: this.sampleRandom.productName,
+					qydm: v.qydm,
+					taskId: this.taskId,
+					sampleCheckId: this.sampleCheckId
+				};
+			});
+			_sampleRandom.createSampleSheetList(postData, res => {
+				const { code, message } = res;
+				if (code === 200) {
+					this.$msg("添加成功");
+					this.modalName = null;
+					this.samplePage = 1;
+					this.samplePageTotal = 1;
+					this.getSampleCheckList();
+				} else {
+					this.$msg(message);
+				}
+			});
+		},
+		getEnterprisesList() {
+			// this.onSureEnterpriseList = true;
+			if (!this.isCounty && this.selectIndex === null) {
+				this.$msg("请选择抽样区域");
+				return;
+			}
+			const postData = Object.assign({}, this.sampleRandom);
+			if (!postData.productName) {
+				this.$msg("请选择抽样样品名称");
+				return;
+			}
+			if (parseInt(postData.enterprisesNum) <= 0 || "" + parseInt(postData.enterprisesNum) === "NaN") {
+				this.$msg("请输入抽检主体数量");
+				return;
+			}
+			if (parseInt(postData.enterprisesNum) + this.sampleList.length > this.batchNumber) {
+				this.$msg("抽取企业总数不可超过抽样批次数");
+				return;
+			}
+			if (parseInt(postData.enterprisesNum) > parseInt(this.lastCmpNum)) {
+				this.$msg("抽检主体数量应小于等于剩余主体数量");
+				return;
+			}
+			postData.xzqCode = this.selectXzqCode;
+			postData.taskId = this.taskId;
+			_sampleRandom.getEnterprisesList(postData, res => {
+				if (!res.data || res.data.length === 0) {
+					this.$msg("当前地区无可抽取企业");
+				} else {
+					this.onSureEnterpriseList = res.data;
+					this.modalName = "onSureSampleEnterpriseModel";
+				}
+
+			});
+
+		},
+		setTaskType(taskType) {
+			const taskTypeList = this.taskTypeList;
+			for (let i = 0; i < taskTypeList.length; i++) {
+				if (taskTypeList[i].itemValue === taskType) {
+					return taskTypeList[i].itemKey;
+				}
+			}
+		},
+		setTaskStatus(value) {
+			let taskStatus = this.taskStatus;
+			for (let i = 0; i < taskStatus.length; i++) {
+				if (taskStatus[i].itemValue === value) {
+					return taskStatus[i].itemKey;
+				}
+			}
+		},
+		formatDate(dateTime) {
+			return dateTime.substring(0, 10);
+		},
+		productNameChange(e) {
+			const productName = e.detail.value;
+			if (productName) {
+				this.sampleRandom.productName = productName;
+				this.getEnterPrisesNum();
+				this.modalName = "SureProductNameModal";
+			}
+		},
+		initXzqRange() {
+			_sampleRandom.getXzqdmSubLists(this.xzqdm, city_res => {
+				const { code, data } = city_res;
+				if (code === 200) {
+					this.subXzqList = data;
+				}
+			});
+		},
+		RegionChange(e) {
+			this.selectIndex = e.detail.value;
+			this.getEnterPrisesNum();
+		},
+		getSampleStatus() {
+			_taskList.getDictionary("SAMPLE_SHEET_STATUS", res => {
+				this.sampleStatus = res.data;
+			});
+		},
+		setSampleStatus(value) {
+			console.log("setSampleStatus",value);
+			let sampleStatus = this.sampleStatus;
+			for (let i = 0; i < sampleStatus.length; i++) {
+				if (sampleStatus[i].itemValue === value) {
+					return sampleStatus[i].itemKey;
+				}
+			}
+		},
+		toFillSample(item) {
+			uni.navigateTo({
+				url: "/pages/sample-detail/index?id=" + item.id
+			});
+		},
+		getBtnName(status) {
+			let name = "查看";
+			if (status === "WAIT_SAMPLE") {
+				name = "填报抽样单";
+			}
+			return name;
+		}
+	}
+};
+</script>
+
+<style scoped>
+.detail view {
+	font-size: 31rpx;
+	height: 1.8em;
+	line-height: 1.8em !important;
+	border: none;
+}
+
+.taskDetail {
+	/*border: 1rpx solid #8799a3;*/
+	box-shadow: 0 0 25upx #aaa;
+	border-radius: 10rpx;
+	overflow: hidden;
+}
+
+label {
+	padding-left: .5em;
+}
+
+.productScroll {
+	height: 30em;
+	max-height: 60vh;
+}
+
+.fixedFootBtn {
+	border-top: 1px solid #ddd;
+	position: fixed;
+	width: 100vw;
+	bottom: 0;
+	z-index: 1000;
+}
+
+.tools {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 30upx;
+
+}
+
+.tool .text {
+	font-size: 1.1em !important;
+}
+
+</style>

+ 113 - 0
pages/zf-task-list/sampleRandom/sample-random-model.js

@@ -0,0 +1,113 @@
+import {Base} from '../../../static/util/base.js'
+
+class SampleRandomModel extends Base {
+
+    constructor() {
+        super();
+    }
+
+    getEnterprisesList(data,callBack) {
+        var params = {
+            url: '/ah/ah-task-zf-user/getEnterprisesList',
+            data:data,
+            sCallBack: function (res) {
+                callBack && callBack(res.data)
+            }
+        }
+        this.serviceRequest(params);
+    }
+
+    getProductList(data,callBack) {
+        var params = {
+            url: '/ah/ah-task-zf-user/getProductList',
+            data:data,
+            sCallBack: function (res) {
+                callBack && callBack(res.data)
+            }
+        }
+        this.serviceRequest(params);
+    }
+
+    getEnterPrisesNum(data,callBack) {
+        var params = {
+            url: '/ah/ah-task-zf-user/getEnterPrisesNum',
+            data:data,
+            sCallBack: function (res) {
+                callBack && callBack(res.data)
+            }
+        }
+        this.serviceRequest(params);
+    }
+
+
+    getTaskSampleDetail(taskId, callBack) {
+        var params = {
+            url: '/ah/ahTaskDetail/list?pageNum=1&pageSize=100&taskId=' + taskId,
+            sCallBack: function (res) {
+                callBack && callBack(res.data)
+            }
+        }
+        this.serviceRequest(params);
+    }
+    getZfUserById(id, callBack) {
+        var params = {
+            url: '/ah/ah-task-zf-user/getZfUserById',
+            data:{id},
+            sCallBack: function (res) {
+                callBack && callBack(res.data)
+            }
+        }
+        this.serviceRequest(params);
+    }
+
+    updateZfyInfo(data, callBack) {
+        var params = {
+            url: '/ah/ahSampleSheet/updateZfyInfo',
+            data:data,
+            type:"POST",
+            sCallBack: function (res) {
+                callBack && callBack(res.data)
+            }
+        }
+        this.serviceRequest(params);
+    }
+    createSampleSheetList(data,callBack){
+        var params = {
+            url: '/ah/ahSampleSheet/createSampleSheet',
+            data:data,
+            type:"POST",
+            sCallBack: function (res) {
+                callBack && callBack(res.data)
+            }
+        }
+        this.serviceRequest(params);
+    }
+    getSampleCheckList(data,callBack){
+        var params = {
+            url: '/ah/ahSampleSheet/listByCheckSample',
+            data:data,
+            sCallBack: function (res) {
+                callBack && callBack(res.data)
+            }
+        }
+        this.serviceRequest(params);
+    }
+    /* 获取改xzqdm下的地点 */
+    getXzqdmSubLists(xzqCode,callBack){
+        var params = {
+            url: '/jg/tZdXzq/list',
+            type: 'GET',
+            data: {xzqCode},
+            header: {
+                'content-type': 'application/x-www-form-urlencoded'
+            },
+            sCallBack: function (res) {
+                callBack && callBack(res)
+            }
+        }
+        this.jgRequest(params);
+    }
+
+}
+const _sampleRandom = new SampleRandomModel();
+export {_sampleRandom}

+ 162 - 0
pages/zf-task-list/taskList.vue

@@ -0,0 +1,162 @@
+<template>
+    <view class="home padding-bottom">
+        <cu-custom class="home-custom" bgColor=".bg-sancolor"
+                   bgImage="https://ahwgh.oss-cn-hangzhou.aliyuncs.com/enterprise/6525f808df760.png" :isBack="true">
+            <block slot="content">例行监测</block>
+        </cu-custom>
+        <view class="padding-sm">
+            <view class="cu-list menu margin-top taskDetail bg-white"
+                  v-for="(item, index) in taskListData" :key="index" @click="navigateToDetail(item.ahTasks.id)">
+                <view class="cu-item arrow">
+                    <view class="title text-black text-bold text-lg">
+                        <text class="cuIcon-titles text-green"></text>
+                        {{ item.ahTasks.taskName }}
+                    </view>
+                </view>
+                <view class="content padding-sm detail solid-bottom padding-bottom padding-left">
+                    <view>任务编号:{{ item.ahTasks.taskNumber }}
+                    </view>
+                    <view>年度/季度:{{ item.ahTasks.taskYear.substr(0, 4) }}/{{
+                            item.ahTasks.taskBatch
+                        }}
+                    </view>
+                    <view>发布单位:{{ item.ahTasks.publishUnitName }}</view>
+                    <view>任务时间:{{
+                            formatDate(item.ahTasks.startTime)
+                        }}至{{ formatDate(item.ahTasks.endTime) }}
+                    </view>
+                </view>
+            </view>
+        </view>
+        <view class="cu-load bg-green light text-sm" v-show="pageTotal > 0"
+              :class="page > pageTotal?'over':'loading'"></view>
+        <view class="radius shadow-warp bg-white margin-top text-lg" v-show="pageTotal === 0">
+            <view class="cu-list menu-avatar">
+                <view class="cu-item">
+                    <view class="content">
+                        <view class="text-sm text-center" style="justify-content: center;">
+                            <text class="text-cut">
+                                <text class="cuIcon-warn text-yellow margin-right-xs text-xl"></text>
+                                未查询到相关数据
+                            </text>
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </view>
+    </view>
+
+</template>
+
+
+<script>
+    import {
+        _zfyTaskList
+    } from "./zf-task-list-model.js";
+
+    export default {
+        data() {
+            return {
+                page: 1,
+                size: 10,
+                pageTotal: 1,
+                taskListData: []
+            };
+        },
+        onReachBottom() {
+            this.getCheckTaskList();
+        },
+        onShow() {
+            this.page = 1;
+            this.pageTotal = 1;
+            this.getCheckTaskList();
+        },
+        methods: {
+            getCheckTaskList() {
+                if (this.page === 1 || (this.page <= this.pageTotal)) {
+                    _zfyTaskList.getCheckTaskList({
+                        pageNum: this.page,
+                        pageSize: this.size,
+						taskType:"TASK_COMMON"
+                    }, res => {
+                        const {data, message, code} = res;
+                        if (code === 200) {
+                            const {records, total} = data;
+                            this.pageTotal = Math.ceil(total / this.size);
+                            if (this.page === 1) {
+                                this.taskListData = records;
+                            } else {
+                                this.taskListData = this.taskListData.concat(records);
+                            }
+                            this.page++;
+                        } else {
+                            this.$msg(message);
+                        }
+                    });
+                }
+            },
+            navigateToDetail(taskId) {
+                uni.navigateTo({
+                    url: "/pages/zf-task-list/index?taskId=" + taskId
+                });
+            },
+
+            formatDate(dateTime) {
+                return dateTime.substring(0, 10)
+            }
+        }
+    };
+</script>
+
+<style scoped>
+    .detail view {
+        font-size: 30rpx;
+        height: 2em;
+        line-height: 2em !important;
+        border: none;
+        color: gray;
+    }
+
+    .tools {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 30upx;
+
+    }
+    .tool .text{
+        font-size: 1.1em!important;
+    }
+
+    .taskDetail {
+        /*border: 1rpx solid #8799a3;*/
+        box-shadow: 0 0 25upx #aaa;
+        border-radius: 10rpx;
+        overflow: hidden;
+    }
+
+    .btn-item {
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+    }
+
+    .cu-tag {
+        padding: 20upx;
+        border-radius: 10upx;
+    }
+
+    label {
+        padding-left: .5em;
+    }
+
+    .text-content {
+        line-height: 2em;
+        white-space: pre-line;
+        text-align: left;
+        max-height: 60vh;
+        overflow-y: scroll;
+        /*padding-bottom: 100rpx;*/
+    }
+</style>

+ 43 - 0
pages/zf-task-list/zf-task-list-model.js

@@ -0,0 +1,43 @@
+import {Base} from '../../static/util/base.js'
+
+class ZfTaskList extends Base {
+
+    constructor() {
+        super();
+    }
+
+    /**
+     * 查询检测机构执法人员全部任务
+     * @param data
+     * @param callBack
+     */
+    getCheckTaskList(data,callBack) {
+        var params = {
+            url: '/ah/ahZoneSampleCheck/getCheckTaskList',
+            data:data,
+            sCallBack: function (res) {
+                callBack && callBack(res.data)
+            }
+        }
+        this.serviceRequest(params);
+    }
+
+    /**
+     * 查询检测机构执法人员需执行的任务
+     * @param data
+     * @param callBack
+     */
+    getCheckTaskListBySample(data,callBack) {
+        var params = {
+            url: '/ah/ahZoneSampleCheck/getCheckTaskListBySample',
+            data:data,
+            sCallBack: function (res) {
+                callBack && callBack(res.data)
+            }
+        }
+        this.serviceRequest(params);
+    }
+
+}
+const _zfyTaskList = new ZfTaskList();
+export {_zfyTaskList}

+ 55 - 0
project.config.json

@@ -0,0 +1,55 @@
+{
+    "description": "项目配置文件",
+    "packOptions": {
+        "ignore": [],
+        "include": []
+    },
+    "setting": {
+        "urlCheck": true,
+        "es6": true,
+        "enhance": false,
+        "postcss": true,
+        "preloadBackgroundData": false,
+        "minified": true,
+        "newFeature": false,
+        "coverView": true,
+        "nodeModules": false,
+        "autoAudits": false,
+        "showShadowRootInWxmlPanel": true,
+        "scopeDataCheck": false,
+        "uglifyFileName": false,
+        "checkInvalidKey": true,
+        "checkSiteMap": true,
+        "uploadWithSourceMap": true,
+        "compileHotReLoad": false,
+        "lazyloadPlaceholderEnable": false,
+        "useMultiFrameRuntime": true,
+        "useApiHook": true,
+        "useApiHostProcess": true,
+        "babelSetting": {
+            "ignore": [],
+            "disablePlugins": [],
+            "outputPath": ""
+        },
+        "useIsolateContext": true,
+        "userConfirmedBundleSwitch": false,
+        "packNpmManually": false,
+        "packNpmRelationList": [],
+        "minifyWXSS": true,
+        "disableUseStrict": false,
+        "minifyWXML": true,
+        "showES6CompileOption": false,
+        "useCompilerPlugins": false,
+        "ignoreUploadUnusedFiles": true
+    },
+    "compileType": "miniprogram",
+    "libVersion": "2.16.0",
+    "appid": "wxc2e631ceccd34482",
+    "projectname": "mini-app",
+    "condition": {},
+    "editorSetting": {
+        "tabIndent": "insertSpaces",
+        "tabSize": 4
+    }
+
+}

+ 7 - 0
project.private.config.json

@@ -0,0 +1,7 @@
+{
+    "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
+    "projectname": "check-miniapp",
+    "setting": {
+        "compileHotReLoad": true
+    }
+}

+ 22 - 0
static/common/common.js

@@ -0,0 +1,22 @@
+import { Base } from '../../static/util/base.js'
+class Common extends Base {
+
+  constructor() {
+    super();
+  }
+  
+  getDictionary(type, callBack){
+   	var params = {
+   	  url: '/ah/ahDictionary/listType?type='+type,
+   	  sCallBack: function (res) {
+   	    callBack && callBack(res)
+   	  }
+   	}
+   	this.serviceRequest(params);  
+   }
+   
+   
+}
+
+const _common = new Common();
+export { _common }

BIN
static/icons/bg.png


Diff do ficheiro suprimidas por serem muito extensas
+ 2 - 0
static/icons/cancel-icon.svg


Diff do ficheiro suprimidas por serem muito extensas
+ 2 - 0
static/icons/fail-icon.svg


BIN
static/icons/home.png


BIN
static/icons/home_cur.png


BIN
static/icons/my.png


Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff