xtz 4 年 前
コミット
bb82ea88d5
100 ファイル変更26219 行追加0 行削除
  1. 9 0
      answer - 副本/.env.development
  2. 9 0
      answer - 副本/.env.production
  3. 9 0
      answer - 副本/.env.test
  4. 21 0
      answer - 副本/.gitignore
  5. 49 0
      answer - 副本/README.md
  6. 10 0
      answer - 副本/babel.config.js
  7. 13299 0
      answer - 副本/package-lock.json
  8. 58 0
      answer - 副本/package.json
  9. BIN
      answer - 副本/public/img/contest/bg.png
  10. BIN
      answer - 副本/public/img/contest/confirm-bg.png
  11. BIN
      answer - 副本/public/img/contest/success.png
  12. BIN
      answer - 副本/public/img/info/arrow.png
  13. BIN
      answer - 副本/public/img/info/bg.png
  14. BIN
      answer - 副本/public/img/info/button-bg.png
  15. BIN
      answer - 副本/public/img/info/list-bg.png
  16. BIN
      answer - 副本/public/img/info/warning.png
  17. BIN
      answer - 副本/public/img/rank/avatar.png
  18. BIN
      answer - 副本/public/img/rank/bg.png
  19. BIN
      answer - 副本/public/img/rank/page-2.png
  20. BIN
      answer - 副本/public/img/rank/page-3.png
  21. BIN
      answer - 副本/public/img/rank/test-area.png
  22. BIN
      answer - 副本/public/img/rank/top-1.png
  23. BIN
      answer - 副本/public/img/rank/top-2.png
  24. BIN
      answer - 副本/public/img/rank/top-3.png
  25. BIN
      answer - 副本/public/img/score/bg.png
  26. BIN
      answer - 副本/public/img/score/icon-rank.png
  27. BIN
      answer - 副本/public/img/score/icon-share.png
  28. BIN
      answer - 副本/public/img/score/icon-stars.png
  29. BIN
      answer - 副本/public/img/score/main-icon.png
  30. BIN
      answer - 副本/public/img/score/stars-active.png
  31. BIN
      answer - 副本/public/img/score/stars.png
  32. 36 0
      answer - 副本/public/index.html
  33. BIN
      answer - 副本/public/static/favicon.ico
  34. BIN
      answer - 副本/public/static/loginBG.png
  35. BIN
      answer - 副本/public/static/logo.ico
  36. BIN
      answer - 副本/public/static/logo.png
  37. 17 0
      answer - 副本/src/App.vue
  38. 8 0
      answer - 副本/src/api/index.js
  39. 78 0
      answer - 副本/src/api/interceptor.js
  40. BIN
      answer - 副本/src/assets/logo.png
  41. BIN
      answer - 副本/src/common/img/avatr.png
  42. BIN
      answer - 副本/src/common/img/close.png
  43. BIN
      answer - 副本/src/common/img/detail/icon-date.png
  44. BIN
      answer - 副本/src/common/img/detail/icon-location.png
  45. BIN
      answer - 副本/src/common/img/detail/icon-menu.png
  46. BIN
      answer - 副本/src/common/img/detail/icon-personal.png
  47. BIN
      answer - 副本/src/common/img/detail/icon-praise.png
  48. BIN
      answer - 副本/src/common/img/detail/icon-solve.png
  49. BIN
      answer - 副本/src/common/img/head.png
  50. BIN
      answer - 副本/src/common/img/home/chat-active.png
  51. BIN
      answer - 副本/src/common/img/home/chat.png
  52. BIN
      answer - 副本/src/common/img/home/date.png
  53. BIN
      answer - 副本/src/common/img/home/emergency.png
  54. BIN
      answer - 副本/src/common/img/home/empty.png
  55. BIN
      answer - 副本/src/common/img/home/icon-my-active.png
  56. BIN
      answer - 副本/src/common/img/home/icon-my.png
  57. BIN
      answer - 副本/src/common/img/home/icon-read-active.png
  58. BIN
      answer - 副本/src/common/img/home/icon-read.png
  59. BIN
      answer - 副本/src/common/img/home/nav-bg.png
  60. BIN
      answer - 副本/src/common/img/home/not-avatr.png
  61. BIN
      answer - 副本/src/common/img/home/replay.png
  62. BIN
      answer - 副本/src/common/img/home/waiting-active.png
  63. BIN
      answer - 副本/src/common/img/home/waiting.png
  64. BIN
      answer - 副本/src/common/img/home/warning.png
  65. BIN
      answer - 副本/src/common/img/icon-location.png
  66. BIN
      answer - 副本/src/common/img/icon-repair.png
  67. BIN
      answer - 副本/src/common/img/icon-video.png
  68. BIN
      answer - 副本/src/common/img/list.png
  69. BIN
      answer - 副本/src/common/img/pc/icon-del.png
  70. BIN
      answer - 副本/src/common/img/pc/icon-my-active.png
  71. BIN
      answer - 副本/src/common/img/pc/icon-read-active.png
  72. BIN
      answer - 副本/src/common/img/pc/pc-bg-01.png
  73. 58 0
      answer - 副本/src/components/HelloWorld.vue
  74. 79 0
      answer - 副本/src/css/common.css
  75. 1143 0
      answer - 副本/src/css/index.css
  76. 414 0
      answer - 副本/src/css/pc.css
  77. 77 0
      answer - 副本/src/filter/index.js
  78. 61 0
      answer - 副本/src/main.js
  79. 76 0
      answer - 副本/src/reset-sdk.js
  80. 63 0
      answer - 副本/src/router/index.js
  81. 172 0
      answer - 副本/src/views/detail.vue
  82. 280 0
      answer - 副本/src/views/home.vue
  83. 236 0
      answer - 副本/src/views/info.vue
  84. 235 0
      answer - 副本/src/views/pc-detail.vue
  85. 190 0
      answer - 副本/src/views/pc-form.vue
  86. 292 0
      answer - 副本/src/views/pc-list.vue
  87. 68 0
      answer - 副本/src/views/people.vue
  88. 18 0
      answer - 副本/vue.config.js
  89. 8949 0
      answer - 副本/yarn.lock
  90. 23 0
      huaren-cmc-page/.gitignore
  91. 24 0
      huaren-cmc-page/README.md
  92. 5 0
      huaren-cmc-page/babel.config.js
  93. 42 0
      huaren-cmc-page/package.json
  94. BIN
      huaren-cmc-page/public/favicon.ico
  95. 17 0
      huaren-cmc-page/public/index.html
  96. 28 0
      huaren-cmc-page/src/App.vue
  97. BIN
      huaren-cmc-page/src/assets/logo.png
  98. 58 0
      huaren-cmc-page/src/components/HelloWorld.vue
  99. 8 0
      huaren-cmc-page/src/main.js
  100. 0 0
      huaren-cmc-page/yarn.lock

+ 9 - 0
answer - 副本/.env.development

@@ -0,0 +1,9 @@
+// 本地环境
+module.exports={
+  NODE_ENV = development
+  VUE_APP_API = http://118.24.176.28:8766/
+  VUE_APP_IMG = http://cdn.info666.com/
+  VUE_APP_VER = 0.0.1
+  VUE_APP_DAT = new Date().getTime()
+  VUE_APP_DOMAIN = 127.0.0.1
+}

+ 9 - 0
answer - 副本/.env.production

@@ -0,0 +1,9 @@
+// 生产环境
+module.exports={
+  NODE_ENV = production
+  VUE_APP_API = http://api.inet.cmcinc.cn/
+  VUE_APP_IMG = https://cmcoa.oss-cn-shanghai.aliyuncs.com/
+  VUE_APP_VER = 0.0.1
+  VUE_APP_DAT = new Date().getTime()
+  VUE_APP_DOMAIN = cmcinc.cn
+}

+ 9 - 0
answer - 副本/.env.test

@@ -0,0 +1,9 @@
+// 测试环境
+module.exports={
+  NODE_ENV = test
+  VUE_APP_API = http://118.24.176.28:8766/
+  VUE_APP_IMG = http://cdn.info666.com/
+  VUE_APP_VER = 0.0.1
+  VUE_APP_DAT = new Date().getTime()
+  VUE_APP_DOMAIN = info666.com
+}

+ 21 - 0
answer - 副本/.gitignore

@@ -0,0 +1,21 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 49 - 0
answer - 副本/README.md

@@ -0,0 +1,49 @@
+<!--
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-29 10:28:37
+ * @FilePath     : \ambre-admin-noob\README.md
+--> 
+# 
+
+```
+install:yarn install
+```
+```
+dev:yarn serve
+```
+```
+build:yarn test/build
+```
+
+#version
+
+# ⭐AMBRE⭐
+
+## v-input:顶部搜索栏
+
+### 组件引用
+
+```
+<v-input
+:list="list"              // 组件内功能项列表
+@search="search">         // 查询方法
+</v-input>
+```
+
+### 参数说明
+
+```
+{
+  placeholder: '',        //
+  type: 'select',         //
+  props: 'test',          //
+  options: [              //
+    {
+      label: '第一项',
+      value: '1'
+    }
+  ]
+}
+```

+ 10 - 0
answer - 副本/babel.config.js

@@ -0,0 +1,10 @@
+module.exports = {
+  'presets': [
+    [
+      '@babel/preset-env',
+      {
+        'useBuiltIns': 'entry'
+      }
+    ]
+  ]
+}

ファイルの差分が大きいため隠しています
+ 13299 - 0
answer - 副本/package-lock.json


+ 58 - 0
answer - 副本/package.json

@@ -0,0 +1,58 @@
+{
+  "name": "vuecli3",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build --mode production",
+    "test": "vue-cli-service build --mode test",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "axios": "^0.19.0",
+    "babel-polyfill": "^6.26.0",
+    "core-js": "^3.4.3",
+    "css-vars-ponyfill": "^2.3.2",
+    "element-ui": "^2.13.2",
+    "js-cookie": "^2.2.1",
+    "js-cookies": "^1.0.4",
+    "vant": "^2.11.1",
+    "vue": "^2.6.10",
+    "vue-cropper": "^0.5.2",
+    "vue-router": "^3.1.3",
+    "vuex": "^3.1.2"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^4.1.0",
+    "@vue/cli-plugin-eslint": "^4.1.0",
+    "@vue/cli-plugin-router": "^4.1.0",
+    "@vue/cli-plugin-vuex": "^4.1.0",
+    "@vue/cli-service": "^4.1.0",
+    "@vue/eslint-config-standard": "^4.0.0",
+    "babel-eslint": "^10.0.3",
+    "eslint": "^5.16.0",
+    "eslint-plugin-vue": "^5.0.0",
+    "node-sass": "^4.12.0",
+    "sass-loader": "^8.0.0",
+    "vue-template-compiler": "^2.6.10"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "@vue/standard"
+    ],
+    "rules": {},
+    "parserOptions": {
+      "parser": "babel-eslint"
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie < 11"
+  ]
+}

BIN
answer - 副本/public/img/contest/bg.png


BIN
answer - 副本/public/img/contest/confirm-bg.png


BIN
answer - 副本/public/img/contest/success.png


BIN
answer - 副本/public/img/info/arrow.png


BIN
answer - 副本/public/img/info/bg.png


BIN
answer - 副本/public/img/info/button-bg.png


BIN
answer - 副本/public/img/info/list-bg.png


BIN
answer - 副本/public/img/info/warning.png


BIN
answer - 副本/public/img/rank/avatar.png


BIN
answer - 副本/public/img/rank/bg.png


BIN
answer - 副本/public/img/rank/page-2.png


BIN
answer - 副本/public/img/rank/page-3.png


BIN
answer - 副本/public/img/rank/test-area.png


BIN
answer - 副本/public/img/rank/top-1.png


BIN
answer - 副本/public/img/rank/top-2.png


BIN
answer - 副本/public/img/rank/top-3.png


BIN
answer - 副本/public/img/score/bg.png


BIN
answer - 副本/public/img/score/icon-rank.png


BIN
answer - 副本/public/img/score/icon-share.png


BIN
answer - 副本/public/img/score/icon-stars.png


BIN
answer - 副本/public/img/score/main-icon.png


BIN
answer - 副本/public/img/score/stars-active.png


BIN
answer - 副本/public/img/score/stars.png


+ 36 - 0
answer - 副本/public/index.html

@@ -0,0 +1,36 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-06-09 15:30:15
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-08-03 11:07:45
+--> 
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="referrer" content="no-referrer" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="<%= BASE_URL %>static/logo.ico">
+    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Noto+Sans+SC:100,300,400,500,600,700,900">
+    <script src = "https://cdn.jsdelivr.net/npm/proxy-polyfill@0.3.0/proxy.min.js"></script>
+    <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
+    <script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
+    <title>一键报修</title>
+    <style>
+      *{
+        margin: 0;
+        padding: 0;
+      }
+    </style>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but vuecli3 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

BIN
answer - 副本/public/static/favicon.ico


BIN
answer - 副本/public/static/loginBG.png


BIN
answer - 副本/public/static/logo.ico


BIN
answer - 副本/public/static/logo.png


+ 17 - 0
answer - 副本/src/App.vue

@@ -0,0 +1,17 @@
+<template>
+  <div id="app">
+    <router-view />
+         <!-- 报修 -->
+        <!-- 其他(弹出) -->
+    </div>
+</template>
+
+<script>
+export default {
+  name: 'App',
+  data () {
+    return {
+    }
+  }
+}
+</script>

+ 8 - 0
answer - 副本/src/api/index.js

@@ -0,0 +1,8 @@
+import service from './interceptor'
+
+export function postHttps (api, data, mode = 'post') {
+  return service[mode](api, data)
+}
+export function getHttps (api, data, mode = 'get') {
+  return service[mode](api, data)
+}

+ 78 - 0
answer - 副本/src/api/interceptor.js

@@ -0,0 +1,78 @@
+import axios from 'axios'
+import cookie from 'js-cookie'
+import { Toast } from 'vant'
+
+const service = axios.create({
+  baseURL: process.env.VUE_APP_API,
+  timeout: 90000
+})
+// let resLoading = {}
+service.interceptors.request.use(
+  config => {
+    // resLoading = app.$loading({
+    //     lock: true,
+    //     text: 'Loading',
+    //     spinner: 'el-icon-loading',
+    //     background: 'rgba(255, 255, 255, 0.7)'
+    // })
+    let data = {
+      'from': 0,
+      'page': 1,
+      'rows': 10,
+      'userId': cookie.get('userId'),
+      'sidx': '',
+      'sord': '',
+      'token': '',
+      'reqdata': {}
+    }
+    config.data instanceof FormData || (config.data = Object.assign(data, config.data)) // 判断是否上传文件
+    // config.headers['Authorization'] = cookiesDeploy.getToken()
+    return config
+  },
+  error => {
+    Promise.reject(error)
+  }
+)
+
+service.interceptors.response.use(
+  res => {
+    return new Promise((resolve, reject) => {
+      if (res.data.state === 206) {
+        // resLoading.close()
+        alert(206)
+        reject(res.data.msg)
+      } else if (res.status === 200) {
+        // resLoading.close()
+        if (res.data.state !== 100) {
+          reject(res.data.msg)
+        } else {
+          resolve(res.data)
+        }
+      } else {
+        //   if (res.status > 100 && res.status < 200) {
+        //     if (whiteList.indexOf(process.env.NODE_ENV) !== -1) {
+        //     //   let url = `http://monitor.info666.com/monitor/alert?projectAbbr=batterycloud-test&errorMsg=接口:${api}(${res.statusText})&logPath=前端开发环境(${process.env.NODE_ENV})`
+        //     //   axios.get(url)
+        //     }
+        //   }
+        // resLoading.close()
+        reject(res)
+        // }
+      }
+    })
+  },
+  error => {
+    //   loading.close()
+    //   Message({
+    //     message: '请求异常' + error,
+    //     type: 'error',
+    //     duration: 5 * 1000
+    //   })
+    // resLoading.close()
+    Toast({
+      message: error
+    })
+    // console.log(error);
+  }
+)
+export default service

BIN
answer - 副本/src/assets/logo.png


BIN
answer - 副本/src/common/img/avatr.png


BIN
answer - 副本/src/common/img/close.png


BIN
answer - 副本/src/common/img/detail/icon-date.png


BIN
answer - 副本/src/common/img/detail/icon-location.png


BIN
answer - 副本/src/common/img/detail/icon-menu.png


BIN
answer - 副本/src/common/img/detail/icon-personal.png


BIN
answer - 副本/src/common/img/detail/icon-praise.png


BIN
answer - 副本/src/common/img/detail/icon-solve.png


BIN
answer - 副本/src/common/img/head.png


BIN
answer - 副本/src/common/img/home/chat-active.png


BIN
answer - 副本/src/common/img/home/chat.png


BIN
answer - 副本/src/common/img/home/date.png


BIN
answer - 副本/src/common/img/home/emergency.png


BIN
answer - 副本/src/common/img/home/empty.png


BIN
answer - 副本/src/common/img/home/icon-my-active.png


BIN
answer - 副本/src/common/img/home/icon-my.png


BIN
answer - 副本/src/common/img/home/icon-read-active.png


BIN
answer - 副本/src/common/img/home/icon-read.png


BIN
answer - 副本/src/common/img/home/nav-bg.png


BIN
answer - 副本/src/common/img/home/not-avatr.png


BIN
answer - 副本/src/common/img/home/replay.png


BIN
answer - 副本/src/common/img/home/waiting-active.png


BIN
answer - 副本/src/common/img/home/waiting.png


BIN
answer - 副本/src/common/img/home/warning.png


BIN
answer - 副本/src/common/img/icon-location.png


BIN
answer - 副本/src/common/img/icon-repair.png


BIN
answer - 副本/src/common/img/icon-video.png


BIN
answer - 副本/src/common/img/list.png


BIN
answer - 副本/src/common/img/pc/icon-del.png


BIN
answer - 副本/src/common/img/pc/icon-my-active.png


BIN
answer - 副本/src/common/img/pc/icon-read-active.png


BIN
answer - 副本/src/common/img/pc/pc-bg-01.png


+ 58 - 0
answer - 副本/src/components/HelloWorld.vue

@@ -0,0 +1,58 @@
+<template>
+  <div class="hello">
+    <h1>{{ msg }}</h1>
+    <p>
+      For a guide and recipes on how to configure / customize this project,<br>
+      check out the
+      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
+    </p>
+    <h3>Installed CLI Plugins</h3>
+    <ul>
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
+    </ul>
+    <h3>Essential Links</h3>
+    <ul>
+      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
+      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
+      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
+      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
+      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
+    </ul>
+    <h3>Ecosystem</h3>
+    <ul>
+      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
+      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
+      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
+      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
+      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
+    </ul>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'HelloWorld',
+  props: {
+    msg: String
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+h3 {
+  margin: 40px 0 0;
+}
+ul {
+  list-style-type: none;
+  padding: 0;
+}
+li {
+  display: inline-block;
+  margin: 0 10px;
+}
+a {
+  color: #42b983;
+}
+</style>

+ 79 - 0
answer - 副本/src/css/common.css

@@ -0,0 +1,79 @@
+/* #app {
+    animation:myfirst 3s 1;
+}
+@keyframes myfirst{
+
+    0%{opacity: 0;}
+    90%{opacity: 0;}
+    100%{opacity: 1;}
+
+} */
+
+.flex {
+    display: flex;
+} 
+.fg {
+    flex-grow: 1;
+}
+.jc-sb {
+    justify-content: space-between;
+}
+.jc-c {
+    justify-content: center;
+}
+.mt-35 {
+    margin-top: 35px!important;
+}
+.f-g-1 {
+    flex-grow: 1;
+}
+.color-w {
+    color: #6E6E6E;
+}
+.color-o {
+    color: #F5571E;
+}
+.w-100 {
+    width: 100%;
+}
+.w-200 {
+    width: 200px;
+}
+.a-i-c {
+    align-items: center;
+}
+.color-g {  
+    color: #84BD01;
+}
+.color-r {
+    color: #EE2737;
+}
+.color-b {
+    color: #6D819C;
+}
+.pl-10 {
+    padding-left: 10px;
+}
+
+.van-cell__value {
+    position: relative;
+}
+.van-field__word-limit {
+    position: absolute;
+    right: 12px;
+    bottom: 12px;
+    font-size: 10px;
+    font-weight: 400;
+    color: #B3B3B3;
+}
+.van-popup {
+    overflow-y: visible!important;
+}
+.van-uploader__upload , .van-uploader__preview,.van-uploader__preview-image,.van-uploader__input {
+    width: 104px!important;
+    height: 104px!important;
+    border-radius: 6px;
+}
+.el-loading-mask {
+    z-index: 2005!important;
+}

ファイルの差分が大きいため隠しています
+ 1143 - 0
answer - 副本/src/css/index.css


+ 414 - 0
answer - 副本/src/css/pc.css

@@ -0,0 +1,414 @@
+
+::-webkit-scrollbar  
+{  
+    width: 0px;  
+}
+  
+/*定义滚动条轨道 内阴影+圆角*/  
+::-webkit-scrollbar-track  
+{  
+    border-radius: 10px;  
+    background-color: rgba(0,0,0,0.1); 
+} 
+  
+/*定义滑块 内阴影+圆角*/  
+::-webkit-scrollbar-thumb  
+{  
+    border-radius: 10px;  
+    -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);  
+    background-color: rgba(0,0,0,0.1);
+}
+.pc {
+    margin: auto;
+    width: 1440px;
+    min-height: 100vh;
+    background: #F4F6FA;
+    /* background-image: url('../common/img/pc/pc-bg-01.png');
+    background-repeat: no-repeat;
+    background-size: 100%; */
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.pc-bg {
+    width: 1440px;
+    position: relative;
+    z-index: 1;
+}
+.pc-content {
+    margin-top: -36px;
+    width: 1393px;
+    min-height: 500px;
+    position: relative;
+    background: #FFFFFF;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    z-index: 9;
+    margin-bottom: 20px;
+}
+.pc-content .nav-list {
+    margin-top: -25px;
+    display: flex;
+    justify-content: center;
+    margin-bottom: 57px;
+}
+.pc-content .nav-list > div{
+    cursor: pointer;
+    width: 169px;
+    margin: 0 5px;
+    height: 122px;
+    background: #E9EFFE;
+    border-radius: 6px;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+    color: #637BB8;
+}
+.pc-content .nav-list > .is-active{
+    background: #447AFE;
+    color: #FFFFFF;
+}
+.pc-content .nav-item-icon {
+    width: 57px;
+    height: 57px;
+    background: #FFFFFF;
+    border-radius: 7px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    margin-bottom: 12px;
+}
+.pc-content .nav-item-icon img{
+    width: 20px;
+    height: 20px;
+}
+.pc-content .nav-item-text {
+    text-align: center;
+    font-size: 16px;
+    font-weight: 600;
+}
+.pc-content .footer {
+    width: 100%;
+    padding-top: 38px;
+    padding-bottom: 48px;
+    display: flex;
+    justify-content: flex-end;
+}
+
+.pc-content .avatar-uploader .el-upload {
+    width: 104px;
+    height: 104px;
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    /* overflow: hidden; */
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+}
+.pc-content .avatar-uploader .el-upload:hover {
+    border-color: #409EFF;
+}
+.pc-content .uploader-icon {
+    font-size: 14px;
+    font-weight: bold;
+    color: #3E82FE;
+}
+.pc-content .uploader-text {
+    height: 20px;
+    font-size: 13px;
+    font-weight: 400;
+    color: #B3B3B3;
+}
+.pc-content .avatar {
+    width: 104px;
+    height: 104px;
+    display: block;
+}
+.pc-content .uploader-prompt {
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    height: 104px;
+    flex-grow: 1;
+    font-size: 12px;
+    font-weight: 300;
+    color: #9B9B9B;
+}
+.pc-content .uploader-prompt >div{
+    height: 19px;
+    line-height: 19px;
+    text-align: center;
+}
+.pc-content .pc-form {
+    padding-top: 52px;
+    padding-bottom: 107px;
+}
+.pc-content .btn-zdy {
+    width: 136px;
+    height: 40px;
+    cursor: pointer;
+}
+.pc-content .pc-detail {
+    width: 100%;
+    display: flex;
+    padding-top: 36px;
+    justify-content: space-around;
+}
+.pc-content .pc-detail .pc-detail-title {
+    font-size: 22px;
+    font-weight: 500;
+    color: #000000;
+    display: flex;
+    align-items: center;
+    padding-bottom: 28px;
+}
+.pc-content .pc-detail .point {
+    width: 10px;
+    height: 10px;
+    background: #5EA9FF;
+    border-radius: 2px;
+    margin-right: 18px;
+}
+.pc-content .pc-detail .pc-detail-item{
+    padding-left: 28px;
+    padding-bottom: 20px;
+}
+.pc-content .pc-detail .pc-detail-item .item-label{
+    width: 224px;
+    font-size: 14px;
+    font-weight: 300;
+    color: #6E6E6E;
+}
+.pc-content .pc-detail .pc-detail-item .item-value{
+    width: 224px;
+    padding-top: 3px;
+    font-size: 14px;
+    font-weight: 500;
+    color: #161616;
+}
+.pc-content .pc-detail .pc-detail-item .rate-group {
+    display: flex;
+    align-items: center;
+    margin-top: 6px;
+}
+.pc-content .pc-detail .pc-detail-item .rate-group .rate-num{
+    width: 42px;
+    height: 21px;
+    background: #F5A623;
+    border-radius: 11px;
+    height: 17px;
+    line-height: 19px;
+    font-size: 14px;
+    color: #FFFFFF;
+    margin-right: 4px;
+    text-align: center;
+}
+.pc-content .pc-detail .pc-detail-item .item-file-list {
+    max-width: 380px;
+    padding-top: 13px;
+    display: flex;
+    flex-wrap: wrap;
+}
+.pc-content .pc-detail .pc-detail-item .item-file-list .file {
+    width: 104px;
+    height: 104px;
+    border-radius: 6px;
+    margin-right: 22px;
+    margin-bottom: 10px;
+}
+.pc-content .pc-detail .pc-detail-item .item-file-list .file .file-img{
+    width: 104px;
+    height: 104px;
+    border-radius: 6px;
+}
+.pc-content .pc-detail .button-grounp {
+    padding-top: 28px;
+    padding-left: 28px;
+    padding-bottom: 60px;
+    display: flex;
+}
+.pc-content .pc-detail .button-grounp > div{
+    cursor: pointer;
+    width: 136px;
+    text-align: center;
+    line-height: 40px;
+    height: 40px;
+    border-radius: 4px;
+    border: 1px solid #E1E4E8;
+    font-size: 14px;
+    color: #53627C;
+    font-weight: 400;
+    margin-right: 6px;
+}
+.pc-content .pc-detail .button-grounp .button-comments { 
+    background: #0C66FF;
+    color: #FFFFFF;
+}
+.pc-content .pc-detail .avatar {
+    width: 41px;
+    height: 41px;
+    border-radius: 41px;
+    margin-left: 12px;
+}
+.pc-content .pc-detail .log-title {
+    width: 400px;
+    padding-bottom: 25px;
+    padding-top: 66px;
+    font-size: 16px;
+    font-weight: 500;
+    color: #161616;
+}
+.pc-content .pc-detail .log-message {
+    padding: 6px 0 15px 13px;
+    font-size: 14px;
+    font-weight: 400;
+    color: #808EA7;
+}
+.pc-content .pc-detail .log-list {
+    padding-left: 10px;
+    border-left: 1px solid #E8E8E8;
+}
+.pc-content .pc-detail .log-item {
+    display: flex;
+}
+.pc-content .pc-detail .log-icon {
+    width: 7px;
+    background-color: #fff;
+    margin-left: -17px;
+    height: 7px;
+    border: 3px solid #0C66FF;
+    border-radius: 20px;
+    
+}
+.pc-content .pc-detail .log-time {
+    margin-left: 10px;
+    font-size: 12px;
+    font-weight: 400;
+    color: #161616;
+}
+.pc-content .pc-detail .log-text {
+    padding: 6px 0 15px 0;
+    font-size: 14px;
+    font-weight: 400;
+    color: #808EA7;
+}
+
+
+.el-dialog__body .rate-num {
+    width: 42px;
+    height: 21px;
+    background: #F5A623;
+    border-radius: 11px;
+    font-size: 14px;
+    font-family: Helvetica;
+    color: #FFFFFF;
+    line-height: 21px;
+    text-align: center;
+}
+.btn-zdy-02 {
+    width: 150px;
+    height: 40px;
+    border-radius: 4px;
+    border: 1px solid #E1E4E8;
+}
+.pc-file-list {
+    display: flex;
+    flex-wrap: wrap;
+    /* justify-content: space-between; */
+}
+.pc-file-list .file-item {
+    width: 104px;
+    height: 104px;
+    border-radius: 6px;
+    margin-right: 10px;
+    position: relative;
+    margin-bottom: 10px;
+    overflow: hidden;
+}
+.pc-file-list .file-item:nth-child(3n+3)  {
+    padding-right: 0;
+}
+
+.pc-file-list .file-item .file-img {
+    width: 104px!important;
+    height: 104px!important;
+    border-radius: 6px;
+}
+.pc-file-list .file-item .icon-del {
+    position: absolute;
+    top: -8px;
+    right: -10px;
+    width: 33px;
+    height: 33px;
+}
+.pc-file-list .file-item .icon-video {
+    width: 40px;
+    height: 40px;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%,-50%);
+}
+
+.pc-popup {
+    width: 400px;
+    height: 184px;
+    background: #FFFFFF;
+    box-shadow: 0px 26px 26px 0px rgba(10, 31, 68, 0.12), 0px 0px 1px 0px rgba(10, 31, 68, 0.1);
+    border-radius: 6px;
+}
+.pc-popup img{
+    width: 70px;
+    height: 70px;
+    border-radius: 70px;
+    position: absolute;
+    top: -40px;
+    left: 50%;
+    transform: translateX(-50%);
+}
+.pc-popup-text {
+    padding: 68px 0 27px 0;
+    width: 100%;
+    text-align: center;
+    font-size: 14px;
+    font-weight: 400;
+    color: #333333;
+    border-bottom: 1px solid #EFEFEF;
+}
+.pc-button-determine {
+    width: 136px;
+    height: 40px;
+    text-align: center;
+    line-height: 40px;
+    background: #0C66FF;
+    border-radius: 10px;
+    font-size: 14px;
+    font-weight: 400;
+    color: #FFFFFF;
+    margin: 18px auto;
+}
+
+.w-100{
+    width:100% !important;
+  }
+  .h-200 { 
+    height: 200px;
+  }
+.popover-img{
+    object-fit: contain;
+    margin:auto;
+    width:65px;
+    height: 60.5px;
+    display: block;
+    cursor: pointer;
+    border:2px solid rgb(242,243,245);
+}
+
+.color-pick{
+    color: #007AFF;
+}

+ 77 - 0
answer - 副本/src/filter/index.js

@@ -0,0 +1,77 @@
+export function format (time) {
+  let date = new Date(time) || new Date(time && time.replace(/-/g, ''))
+  let y = date.getFullYear()
+  let m = date.getMonth() + 1
+  m = m < 10 ? '0' + m : m
+  let d = date.getDate()
+  d = d < 10 ? '0' + d : d
+  let h = date.getHours()
+  h = h < 10 ? '0' + h : h
+  let minute = date.getMinutes()
+  let second = date.getSeconds()
+  minute = minute < 10 ? '0' + minute : minute
+  second = second < 10 ? '0' + second : second
+  return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second
+}
+// 只显示年月日
+export function formatYMD (time) {
+  let date = new Date(time) || new Date(time && time.replace(/-/g, ''))
+  let y = date.getFullYear()
+  let m = date.getMonth() + 1
+  m = m < 10 ? '0' + m : m
+  let d = date.getDate()
+  d = d < 10 ? '0' + d : d
+  return y + '-' + m + '-' + d
+}
+export function formatYMDh (time) {
+  let date = new Date(time) || new Date(time && time.replace(/-/g, ''))
+  let y = date.getFullYear()
+  let m = date.getMonth() + 1
+  m = m < 10 ? '0' + m : m
+  let d = date.getDate()
+  d = d < 10 ? '0' + d : d
+  let h = date.getHours()
+  h = h < 10 ? '0' + h : h
+  return y + '-' + m + '-' + d + ' ' + h
+}
+export function formatMoney (num) {
+  num = num + ''
+  if (isNaN(num)) { num = '0' }
+  let sign = ((num - 0) === (num = Math.abs(num)))
+  num = Math.floor(num * 100 + 0.50000000001)
+  let cents = num % 100
+  num = Math.floor(num / 100).toString()
+  if (cents < 10) { cents = '0' + cents }
+  for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
+    num = num.substring(0, num.length - (4 * i + 3)) + ',' +
+    num.substring(num.length - (4 * i + 3))
+  }
+  return ((sign) ? '' : '-') + num + '.' + cents
+}
+
+export function formatCountdown (time, defaultTime = 3 * 60 * 60 * 1000) {
+  // let time = '2020-11-13 16:18:09'
+  let leftTime = (new Date(time) || new Date(time.replace(/-/g, '/'))).getTime() + defaultTime - new Date().getTime()
+  if (leftTime > 0) {
+    var hours = parseInt(leftTime / 1000 / 60 / 60, 10)
+    hours = hours > 9 ? hours : '0' + hours
+    var minutes = parseInt(leftTime / 1000 / 60 % 60, 10)
+    minutes = minutes > 9 ? minutes : '0' + minutes
+    var seconds = parseInt(leftTime / 1000 % 60, 10)
+    seconds = seconds > 9 ? seconds : '0' + seconds
+    return hours + '时' + minutes + '分' + seconds + '秒'
+  } else {
+    return '已过期'
+  }
+}
+
+export function strToObj (val) {
+  let obj = {}
+  let str = val.substr(1)
+  let arr = str.split('&')
+  for (let i = 0; i < arr.length; i++) {
+    let newArr = arr[i].split('=')
+    obj[newArr[0]] = newArr[1]
+  }
+  return obj
+}

+ 61 - 0
answer - 副本/src/main.js

@@ -0,0 +1,61 @@
+
+import Vue from 'vue'
+import App from '@/App.vue'
+import vant from 'vant'
+import elementUi from 'element-ui'
+import 'babel-polyfill'
+import router from '@/router'
+
+import Cookies from 'js-cookie'
+
+import * as filters from '@/filter'
+
+import { postHttps, getHttps } from '@/api/index'
+import 'element-ui/lib/theme-chalk/index.css'
+import 'vant/lib/index.css'
+import '@/css/common.css'
+import '@/css/index.css'
+import '@/css/pc.css'
+Object.keys(filters).forEach(key => {
+  Vue.filter(key, filters[key])
+})
+
+Vue.use(vant)
+Vue.use(Cookies)
+Vue.use(elementUi)
+
+Vue.config.productionTip = false
+
+Vue.prototype.imgUrl = process.env.VUE_APP_IMG
+Vue.prototype.apiUrl = process.env.VUE_APP_API
+Vue.prototype.globalUserId = Cookies.get('userId')
+Vue.prototype.postHttps = postHttps
+Vue.prototype.getHttps = getHttps
+
+Vue.prototype.contactOther = function (userId) {
+  userId || this.Toast({ message: '无此联系人!' })
+  alert(userId)
+  window.wx.openEnterpriseChat({
+    // 注意:userIds和externalUserIds至少选填一个。内部群最多2000人;外部群最多500人;如果有微信联系人,最多40人
+    userIds: userId, // 参与会话的企业成员列表,格式为userid1;userid2;...,用分号隔开。
+    // externalUserIds: 'wmEAlECwAAHrbWYDOK5u3Bf13xlYDAAA;wmEAlECwAAHibWYDOK5u3Af13xlYDAAA', // 参与会话的外部联系人列表,格式为userId1;userId2;…,用分号隔开。
+    groupName: '', // 会话名称。单聊时该参数传入空字符串""即可。
+    chatId: '', // 若要打开已有会话,需指定此参数。如果是新建会话,chatId必须为空串
+    success: function () {
+      // var chatId = res.chatId; //返回当前群聊ID,仅当使用agentConfig注入该接口权限时才返回chatId
+      // 回调
+
+    },
+    fail: function (res) {
+      alert(JSON.stringify(res))
+      if (res.errMsg.indexOf('function not exist') > -1) {
+        alert('版本过低请升级')
+      }
+    }
+  })
+}
+
+export default new Vue({
+  router,
+  render: h => h(App)
+}).$mount('#app')

+ 76 - 0
answer - 副本/src/reset-sdk.js

@@ -0,0 +1,76 @@
+import { postHttps, getHttps } from './api/index'
+import vm from './main'
+import Cookie from 'js-cookie'
+import { setTimeout } from 'core-js'
+
+function strToObj (val) {
+  let obj = {}
+  let str = val.substr(1)
+  let arr = str.split('&')
+  for (let i = 0; i < arr.length; i++) {
+    let newArr = arr[i].split('=')
+    obj[newArr[0]] = newArr[1]
+  }
+  return obj
+}
+
+alert('123')
+if (location.search && strToObj(location.search).code) {
+  let reqdata = {
+    url: location.href,
+    type: 1
+  }
+  alert(JSON.stringify(reqdata))
+  setTimeout(() => {
+    postHttps('manage/wx/getWxConfig', { reqdata }).then(r => {
+      alert(JSON.stringify(r))
+      let { object: {
+        agentId: agentid,
+        appId: corpid,
+        nonceStr,
+        signature,
+        timestamp
+      } } = r
+      window.wx.agentConfig({
+        corpid,
+        timestamp,
+        nonceStr,
+        signature,
+        agentid,
+        jsApiList: ['openUserProfile', 'selectEnterpriseContact', 'openEnterpriseChat', 'hideOptionMenu', 'hideMenuItems'],
+        success: async function () {
+          // 回调
+          alert('success')
+          let { code } = strToObj(location.search)
+          let reqdata = {
+            code,
+            type: 1,
+            loginType: window.screen.width > 1000 ? 2 : 1
+          }
+          // let {object:{userId}} = await postHttps('manage/wx/getWxUserInfo',{reqdata})
+          // globalUserId = userId
+          // app.username = username
+          // app.avatar = avatar
+          postHttps('manage/wx/getWxUserInfo', { reqdata }).then(r => {
+            let { object: { userId } } = r
+            Cookie.set('userId', userId)
+            window.screen.width > 1000 ? vm.$router.push('/pc-list') : vm.$router.push('/home')
+          })
+          // window.screen.width>1000? location.href=location.href.split('?')[0] + '/pc' : app.page=11
+        },
+        fail: function (res) {
+          alert(JSON.stringify(res))
+          if (res.errMsg.indexOf('function not exist') > -1) {
+            alert('版本过低请升级')
+          }
+        }
+      })
+    }).catch(r => {
+      alert(r)
+    })
+  }, 1000)
+} else {
+  getHttps('/manage/wx/getUrl/1').then(() => {
+    // location.href = r.object
+  })
+}

+ 63 - 0
answer - 副本/src/router/index.js

@@ -0,0 +1,63 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+Vue.use(Router)
+
+const routes = [
+  {
+    path: '/home',
+    name: 'home',
+    component: () => import('@/views/home')
+  },
+  {
+    path: '/info',
+    name: 'info',
+    component: () => import('@/views/info')
+  },
+  {
+    path: '/detail/:id',
+    name: 'detail',
+    component: () => import('@/views/detail')
+  },
+  {
+    path: '/pc-detail/:id',
+    name: 'pc-detail',
+    component: () => import('@/views/pc-detail')
+  },
+  {
+    path: '/pc-list',
+    name: 'pc-list',
+    component: () => import('@/views/pc-list')
+  },
+  {
+    path: '/pc-form',
+    name: 'pc-form',
+    component: () => import('@/views/pc-form')
+  },
+  {
+    path: '/people',
+    name: 'people',
+    component: () => import('@/views/people')
+  },
+  {
+    path: '/',
+    redirect: '/home'
+  },
+  {
+    path: '*',
+    redirect: '/home'
+  }
+]
+
+const router = new Router({
+  // mode: 'history', // require service support
+  mode: 'hash',
+  routes
+})
+
+// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
+// export function resetRouter () {
+//   const newRouter = createRouter()
+//   router.matcher = newRouter.matcher // reset router
+// }
+
+export default router

+ 172 - 0
answer - 副本/src/views/detail.vue

@@ -0,0 +1,172 @@
+<template>
+    <div class="detail">
+        <div class="details-content">
+            <div class="details-content-list">
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-solve.png" alt="">报修类型:</div>
+                    <div class="value color-text">{{detail.info.repairTypeName}}</div>
+                </div>
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-location.png" alt="">报修位置:</div>
+                    <div class="value color-text">{{detail.info.repairLocation}}</div>
+                </div>
+                <div class="details-content-special">
+                    <div class="label"><img src="../common/img/detail/icon-menu.png" alt="">故障描述:</div>
+                    <div class="text color-text">
+                        {{detail.info.descMalfunction}}
+                    </div>
+                </div>
+                <div class="details-content-item" v-if="detail.info.repairStatus!==3">
+                    <div class="label"><img src="../common/img/detail/icon-date.png" alt="">剩余处理时间:</div>
+                    <div class="value color-b">{{(scope.row.takerTime||scope.row.repairTime)|formatCountdown}}</div>
+                </div>
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-date.png" alt="">报修时间:</div>
+                    <div class="value color-b">{{detail.info.repairTime|format}}</div>
+                </div>
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-personal.png" alt="">报修人:</div>
+                    <div class="value color-b f-g-1">{{detail.info.repairName}}</div>
+                    <img class="chat" src="../common/img/home/chat-active.png" @click="contactOther(detail.info.wxUserId)" alt="">
+                </div>
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-personal.png" alt="">部门:</div>
+                    <div class="value color-b">{{detail.info.deptName}}</div>
+                </div>
+            </div>
+            <div class="file-list" v-if="detail.info.files&&detail.info.files.length">
+                <div class="file-list-title">故障图片或视频</div>
+                <div class="file-list-content" @click="preview(detail.info.files)">
+                    <div class="file-item" v-for="item in detail.info.files"  :key="item.id">
+                        <img class="file-img" :src="imgUrl + item.filePath" alt="">
+                        <img class="icon-video" src="../common/img/icon-video.png" v-if="item.fileType===2" alt="">
+                    </div>
+                </div>
+            </div>
+
+            <div class="segmentation" v-if="detail.info.repairStatus===3"></div>
+            <div class="details-content-list" v-if="detail.info.repairStatus===3">
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-personal.png" alt="">接单人:</div>
+                    <div class="value color-b">{{detail.info.takerName}}</div>
+                </div>
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-personal.png" alt="">被指派人:</div>
+                    <div class="value color-b">{{detail.info.processorName}}</div>
+                </div>
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-personal.png" alt="">处理人:</div>
+                    <div class="value color-b">{{detail.info.processorName}}</div>
+                </div>
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-date.png" alt="">处理完成时间:</div>
+                    <div class="value color-b">{{detail.info.processingTime|format}}</div>
+                </div>
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-solve.png" alt="">处理内容:</div>
+                    <div class="value color-text">{{detail.info.processingContent}}</div>
+                </div>
+            </div>
+
+            <div class="segmentation" v-if="detail.info.extensionReason"></div>
+            <div class="details-content-list" v-if="detail.info.extensionReason">
+                <div class="details-content-special">
+                    <div class="label"><img src="../common/img/detail/icon-menu.png" alt="">延迟理由:</div>
+                    <div class="text color-text">
+                        {{detail.info.extensionReason}}
+                    </div>
+                </div>
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-date.png" alt="">延迟时间:</div>
+                    <div class="value color-b">{{detail.info.extensionTime|format}}</div>
+                </div>
+            </div>
+            <div class="file-list" v-if="detail.info.extensionFiles&&detail.info.extensionFiles.length">
+                <div class="file-list-title">延迟图片或视频</div>
+                <div class="file-list-content" @click="preview(detail.info.extensionFiles)">
+                    <div class="file-item" v-for="item in detail.info.extensionFiles"  :key="item.id">
+                        <img class="file-img" :src="imgUrl + item.filePath" alt="">
+                        <img class="icon-video" src="../common/img/icon-video.png" v-if="item.fileType===2" alt="">
+                    </div>
+                </div>
+            </div>
+
+            <div class="segmentation" v-if="detail.info.processingContent"></div>
+            <div class="details-content-list" v-if="detail.info.processingContent">
+                <div class="details-content-special">
+                    <div class="label"><img src="../common/img/detail/icon-menu.png" alt="">处理结果</div>
+                    <div class="text color-text">
+                        {{detail.info.processingContent}}
+                    </div>
+                </div>
+            </div>
+            <div class="file-list" v-if="detail.info.processorFiles&&detail.info.processorFiles.length">
+                <div class="file-list-title">完成图片或视频</div>
+                <div class="file-list-content" @click="preview(detail.info.processorFiles)">
+                    <div class="file-item" v-for="item in detail.info.processorFiles" :key="item.id">
+                        <img class="file-img" :src="imgUrl + item.filePath" alt="">
+                        <img class="icon-video" src="../common/img/icon-video.png" v-if="item.fileType===2" alt="">
+                    </div>
+                </div>
+            </div>
+
+            <div class="segmentation" v-if="detail.info.repairStatus===3"></div>
+            <div class="details-content-list" v-if="detail.info.repairStatus===3">
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-date.png" alt="">接单时间:</div>
+                    <div class="value color-b">{{detail.info.takerTime|format}}</div>
+                </div>
+                <div class="details-content-item">
+                    <div class="label"><img src="../common/img/detail/icon-date.png" alt="">完成时间:</div>
+                    <div class="value color-b">{{detail.info.processingTime|format}}</div>
+                </div>
+                <div class="details-content-item" v-if="detail.info.assessScore">
+                    <div class="label"><img src="../common/img/detail/icon-praise.png" alt="">用户评价:</div>
+                    <div class="value">
+                        <div class="rate-group flex a-i-c">
+                            <div class="rate-num">{{detail.info.assessScore}}.0</div>
+                            <van-rate :value="detail.info.assessScore" readonly color="#ffd21e" :size="12"/>
+                        </div>
+                    </div>
+                </div>
+                <div class="details-content-special" v-if="detail.info.assessScore">
+                    <div class="label"><img src="../common/img/detail/icon-menu.png" alt="">评论描述:</div>
+                    <div class="text color-text">
+                        {{detail.info.assessSupplement}}
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      detail: {
+        info: {},
+        timeShow: false, // 时间选择器
+        files: [],
+        obj: {}
+      }
+    }
+  },
+  methods: {
+    /**
+         * 详情
+         * @param id 查询详情id
+         */
+    async queryRepairOrderById (id) {
+      // let {object} = await this.postHttps('/manage/repair/queryRepairOrderById',{reqdata:{id:id}})
+      this.postHttps('/manage/repair/queryRepairOrderById', { reqdata: { id: id } }).then(r => {
+        this.$set(this.detail, 'info', r.object)
+      })
+    }
+  },
+  mounted () {
+    const { id } = this.$route.params
+    this.queryRepairOrderById(id)
+  }
+}
+</script>

+ 280 - 0
answer - 副本/src/views/home.vue

@@ -0,0 +1,280 @@
+<template>
+    <div class="home">
+        <div class="home-content">
+            <div class="ongoing" v-if="home.state===1">
+                <template v-if="home.homeLoading || home.dataList.length">
+                    <van-pull-refresh v-model="homeRefreshing" @refresh="homeRefresh">
+                        <van-list
+                        v-model="home.homeLoading"
+                        :finished="home.homeFinished"
+                        finished-text="没有更多了"
+                        @load="queryCompleteRepairOrder(home.state)"
+                        >
+                            <div v-for="(item,index) in home.dataList" class="ongoing-item" :key="item.id">
+                                <div class="ongoing-item-top">
+                                    <div class="flex">
+                                        <img src="../common/img/home/date.png" alt="">
+                                        <div class="pl-10">
+                                            {{['您的报修正在分配','您的报修已被响应','您的报修已被延迟','您的报修负责人已更改',''][item.repairStatus]}}
+                                        </div>
+                                    </div>
+                                    <img src="../common/img/home/replay.png" @click="replay(item.id,index)" :class="item.replayState&&'rotating'" alt="">
+                                </div>
+                                <div class="ongoing-item-content">
+                                    <img class="avatr" :src="item.processorAvatar||headImg" alt="">
+                                    <div class="fg">
+                                        <div class="flex a-i-c">
+                                            <div class="nickname">负责IT:{{item.repairStatus?item.processorName:''}}</div>
+                                            <div class="ongoing-item-loading" v-show="!item.repairStatus">正在分配…(5分钟内确定)</div>
+                                        </div>
+                                        <div style="height:10px"></div>
+                                        <div class="ongoing-item-date" v-if="item.repairStatus!==2">报修时间:{{item.repairTime|format}}</div>
+                                        <div class="ongoing-item-date" v-else-if="item.repairStatus===2">延迟理由:{{item.extensionReason}}</div>
+                                        <div class="ongoing-item-date" v-if="item.repairStatus">当前正在处理订单数:<span style="color:#F5571E;font-size: 16px;">{{item.dealOrderNum}}</span></div>
+                                        <div class="ongoing-item-warning" v-if="!item.repairStatus">
+                                            <img src="../common/img/home/warning.png" alt="">
+                                            等确认IT后就可以发起微信聊天
+                                        </div>
+                                    </div>
+                                    <img src="../common/img/home/chat.png" v-if="!item.repairStatus" class="chat" alt="">
+                                    <img src="../common/img/home/chat-active.png" @click="contactOther(item.repairWxUserId)" v-else class="chat" alt="">
+                                </div>
+                            </div>
+                        </van-list>
+                    </van-pull-refresh>
+                </template>
+                <div v-else>
+                    <div class="empty">
+                        <img src="../common/img/home/empty.png" alt="">
+                        <div class="emply-message">如要提交故障报修,点击“+”</div>
+                    </div>
+
+                    <!-- <img src="./common/img/home/emergency.png" alt=""> -->
+                </div>
+            </div>
+            <div class="complete" v-else>
+                <template v-if="home.homeLoading || home.dataList.length">
+                    <van-pull-refresh v-model="homeRefreshing" @refresh="homeRefresh">
+                        <van-list
+                        v-model="home.homeLoading"
+                        :finished="home.homeFinished"
+                        finished-text="没有更多了"
+                        @load="queryCompleteRepairOrder(home.state)"
+                        >
+                            <div v-for="item in home.dataList" @click="$router.push(`/detail/${item.id}`)" :key="item.id" class="complete-item">
+                                <div class="complete-item-top">
+                                    <div class="title">负责IT</div>
+                                    <div class="button-group">
+                                        <div class="rate" :class="item.assessScore&&'not-rate'" @click.stop="homeEvaluation(item)">评价</div>
+                                        <div class="more" @click.stop="homeMoreWarranty">再次报修</div>
+                                    </div>
+                                </div>
+                                <div class="flex">
+                                    <img class="avatr" :src="item.processorAvatar" alt="">
+                                    <div class="">
+                                        <div class="nickname">{{item.processorName}}</div>
+                                        <div style="height: 11px;" v-if="!item.assessScore"></div>
+                                        <div class="rate-group flex a-i-c" v-else>
+                                            <div class="rate-num">{{item.assessScore}}.0</div>
+                                            <van-rate :value="item.assessScore" readonly color="#ffd21e" :size="12"/>
+                                        </div>
+                                        <div class="item-detail-list">
+                                            <div class="">报修时间:{{item.repairTime|format}}</div>
+                                            <div class="">完成时间:{{item.processingTime|format}}</div>
+                                            <div class="">处理内容:{{item.processingContent}}</div>
+                                        </div>
+
+                                    </div>
+                                </div>
+                            </div>
+                        </van-list>
+                    </van-pull-refresh>
+                </template>
+
+                <div v-else>
+                    <div class="empty">
+                        <img src="../common/img/home/empty.png" alt="">
+                        <div class="emply-message">如要提交故障报修,点击“+”</div>
+                    </div>
+                </div>
+            </div>
+            <div class="emergency" @click="$router.push('/people')">
+                <div>
+                    紧
+                    急
+                    呼
+                    叫
+                </div>
+            </div>
+        </div>
+        <div class="home-nav">
+            <img src="../common/img/home/nav-bg.png" alt="">
+            <div class="nav-item" @click="queryCompleteRepairOrder(1)">
+                <img src="../common/img/home/icon-read-active.png" v-if="home.state===1" alt="">
+                <img src="../common/img/home/icon-read.png" v-else alt="">
+                <div class="nav-title">进行中</div>
+            </div>
+            <div class="nav-add"><van-icon name="plus" :size="20" @click="$router.push('/info')"/></div>
+            <div class="nav-item" @click="queryCompleteRepairOrder(2)">
+                <img src="../common/img/home/icon-my-active.png" v-if="home.state===2" alt="">
+                <img src="../common/img/home/icon-my.png" v-else alt="">
+                <div class="nav-title">已完成</div>
+            </div>
+        </div>
+
+        <van-popup :value="home.show===2" class="main-popup" :close-on-click-overlay="false">
+            <div class="icon"><van-icon name="success" /></div>
+            <div class="message">评论成功</div>
+            <div class="button-detail" @click="closeHomeDia">确定</div>
+        </van-popup>
+
+        <van-popup :value="home.show===1" class="home-popup" :close-on-click-overlay="false">
+            <div class="home-popup-top">
+                <div>
+                    <van-rate
+                        v-model="home.obj.assessScore"
+                        :size="27"
+                        :gutter="15"
+                        color="#ffd21e"
+                        void-icon="star"
+                        void-color="#CDCDCD"
+                    />
+                </div>
+                <div class="popup-top-text">您对此次服务还满意吗?</div>
+            </div>
+            <div class="home-popup-input">
+                <van-field
+                    v-model.trim="home.obj.assessSupplement"
+                    rows="4"
+                    label=""
+                    type="textarea"
+                    maxlength="100"
+                    placeholder="请输入评价内容(非必填)"
+                    show-word-limit
+                />
+            </div>
+            <div class="home-popup-submit" @click="homeSubmit">提交评价</div>
+            <div class="home-popup-close" >
+                <img src="../common/img/close.png" @click="$set(home,'show',0)" alt="">
+            </div>
+        </van-popup>
+    </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      home: {
+        dataList: [],
+        state: 1,
+        show: 0,
+        id: null,
+        obj: {},
+        homeLoading: true,
+        homeFinished: false,
+        page: 0
+      },
+      homeRefreshing: false,
+      headImg: require('../common/img/head.png')
+    }
+  },
+  methods: {
+    /**
+         * 查询数据列表
+         * @param val  1:进行中 2:已完成
+         */
+    async queryCompleteRepairOrder (val = 1) {
+      this.$set(this.home, 'homeFinished', false)
+      if (val === this.home.state) {
+        this.home.page += 1
+      } else {
+        this.home.page = 0
+        this.$set(this.home, 'state', val)
+        this.$set(this.home, 'dataList', [])
+      }
+      let reqdata = {
+        queryType: this.home.state,
+        userId: this.globalUserId
+      }
+      this.$set(this.home, 'homeLoading', true)
+      // let {list,totalpages} = await this.postHttps('manage/repair/queryCompleteRepairOrder',{page:this.home.page,reqdata})
+      // this.$set(this.home,'dataList',[...this.home.dataList,...list])
+      // this.$set(this.home,'homeLoading',false)
+      // this.homeRefreshing = false
+      // totalpages<10&&this.$set(this.home,'homeFinished',true)
+      this.postHttps('manage/repair/queryCompleteRepairOrder', { page: this.home.page, reqdata }).then(r => {
+        let { list, totalpages } = r
+        this.$set(this.home, 'dataList', [...this.home.dataList, ...list])
+        this.$set(this.home, 'homeLoading', false)
+        this.homeRefreshing = false
+        totalpages < 10 && this.$set(this.home, 'homeFinished', true)
+      })
+    },
+    /**
+         * 点击评价
+         * @param item 评论的订单对象
+         */
+    homeEvaluation ({ id, assessScore }) {
+      if (assessScore) return
+      this.home.id = id
+      this.$set(this.home, 'show', 1)
+    },
+    /**
+         * 再次报修
+         */
+    homeMoreWarranty () {
+      this.$router.push('/info')
+    },
+    /**
+         * 提交评价
+         */
+    async homeSubmit () {
+      let { assessScore, assessSupplement } = this.home.obj
+      let { id: repairId } = this.home
+      let reqdata = {
+        assessScore,
+        assessSupplement,
+        repairId
+      }
+      this.postHttps('manage/repair/assessRepairOrder', { reqdata }).then(() => {
+        this.$set(this.home, 'show', 2)
+      })
+    },
+    /**
+         * 下拉刷新
+         */
+    homeRefresh () {
+      this.homeRefreshing = true
+      this.$set(this.home, 'dataList', [])
+      this.home.page = 0
+      this.queryCompleteRepairOrder(this.home.state)
+    },
+    closeHomeDia () {
+      this.$set(this.home, 'show', 0)
+      this.homeRefresh()
+    },
+    /**
+         * 指定刷新
+         * @param id 订单id
+         * @param index 数组下标index
+         */
+    async replay (id, index) {
+      this.$set(this.home.dataList[index], 'replayState', true)
+      setTimeout(() => {
+        this.$set(this.home.dataList[index], 'replayState', false)
+      }, 1000)
+      // let {object} = await this.postHttps('/manage/repair/refreshOrderById',{reqdata:{id}})
+
+      this.postHttps('/manage/repair/refreshOrderById', { reqdata: { id } }).then(r => {
+        let { object } = r
+        this.home.dataList.splice(index, 1, object)
+      })
+    }
+
+  },
+  created () {
+    this.homeRefresh()
+  }
+}
+</script>

+ 236 - 0
answer - 副本/src/views/info.vue

@@ -0,0 +1,236 @@
+<template>
+    <div class="info">
+        <div class="info-cell" @click="queryRepairTypeList">
+            <div class="flex a-i-c"><img src="../common/img/icon-repair.png" alt="">{{info.obj.repairTypeName||'请选择故障类型'}}</div>
+            <van-icon :name="info.state==1?'arrow-down':'arrow'" />
+        </div>
+        <div class="info-cell" @click="queryLocationList">
+            <div class="flex a-i-c"><img src="../common/img/icon-location.png" alt="">{{info.obj.repairLocation||'请选择所在位置'}}</div>
+            <van-icon :name="info.state==2?'arrow-down':'arrow'" />
+        </div>
+        <div class="info-input">
+            <!-- <div>请输入故障描述</div> -->
+            <textarea v-model="info.obj.descMalfunction" autofocus placeholder="请输入故障描述"></textarea>
+            <div class="flex">
+                <div>
+                    <van-uploader v-model="info.files" multiple preview-size="104px" :max-size="10 * 1024 * 1024" @oversize="onOversize"  :after-read="afterRead('info.files',1)" :max-count="6">
+                        <div class="upload-item">
+                            <van-icon name="plus" />
+                            <div class="upload-item-text">上传照片或视频</div>
+                        </div>
+                    </van-uploader>
+                </div>
+                <div class="upload-prompt fg" v-if="!info.files.length">
+                    <div>最多可上传6张照片或视频文件</div>
+                    <div>支持.jpg .mp4格式文件,10M以内</div>
+                </div>
+            </div>
+        </div>
+        <div class="button-determine" @click="infoSubmit">提交报修</div>
+
+        <van-popup :value="!!info.state" position="bottom" :style="{ minHeight: '30%' }" :close-on-click-overlay="false">
+            <van-picker
+                :title="'请选择'+(['','故障类型','所在位置'][info.state]||'')"
+                show-toolbar
+                :value-key="info.state===1?'repairTypeName':'localName'"
+                :columns="info[info.state===1?'repairTypeList':'locationList']"
+                @confirm="infoPickConfirm"
+                @cancel="$set(info,'state',0)"
+            />
+        </van-popup>
+
+        <van-popup :value="info.show===1" class="main-popup" :close-on-click-overlay="false">
+            <div class="icon mt-35" style="background: #000;"><van-icon name="fail" /></div>
+            <div class="text">您有一个处理中的报修申请<br/>
+                请确认是否提交新的申请</div>
+            <div class="button-grounp">
+                <div class="cancel" @click="app.$set(info,'show',0)">取消</div>
+                <div class="determine" @click="saveRepair">确定</div>
+            </div>
+        </van-popup>
+
+        <van-popup :value="info.show===2" class="info-popup" :close-on-click-overlay="false">
+            <img src="../common/img/avatr.png" alt="">
+            <div class="info-popup-top">IT小哥哥收到你的申请啦,会尽快和您联系</div>
+            <div class="button-determine" @click="infoCloseDia">好的</div>
+        </van-popup>
+    </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      info: {
+        locationList: [],
+        repairTypeList: [],
+        state: 0,
+        files: [],
+        obj: {}
+      },
+      loading: null
+    }
+  },
+  methods: {
+    /**
+         * 获取地址列表
+         */
+    // async queryLocationList () {
+    //     this.$set(this.info,'state',2)
+    //     let {list} = await this.postHttps('manage/repair/queryLocationList')
+    //     this.$set(this.info,'locationList',list)
+
+    // },
+    queryLocationList () {
+      this.$set(this.info, 'state', 2)
+      this.postHttps('manage/repair/queryLocationList').then(r => {
+        this.$set(this.info, 'locationList', r.list)
+      })
+    },
+    /**
+         * 获取故障类型列表
+         */
+    // async queryRepairTypeList () {
+    //     this.$set(this.info,'state',1)
+    //     let {list} = await this.postHttps('manage/repair/queryRepairTypeList')
+    //     this.$set(this.info,'repairTypeList',list)
+    // },
+    queryRepairTypeList () {
+      this.$set(this.info, 'state', 1)
+      this.postHttps('manage/repair/queryRepairTypeList').then(r => {
+        this.$set(this.info, 'repairTypeList', r.list)
+      })
+    },
+    /**
+         * pick确定
+         */
+    infoPickConfirm (val) {
+      if (this.info.state === 1) {
+        this.info.obj.repairTypeName = val.repairTypeName
+        this.info.obj.repairType = val.id
+      } else {
+        this.info.obj.repairLocation = val.localName
+      }
+      // this.info[this.info.state===1?'locationList':'repairTypeList'][index].id
+      this.$set(this.info, 'state', 0)
+    },
+    /**
+         * 提交报修
+         */
+    async infoSubmit () {
+      let loading = this.$loading({
+        lock: true,
+        text: 'Loading',
+        spinner: 'el-icon-loading',
+        background: 'rgba(255, 255, 255, 0.7)'
+      })
+      let { descMalfunction, repairLocation, repairType } = this.info.obj
+      if (!descMalfunction) {
+        this.Toast({ message: '请输入故障描述!' })
+        loading.close()
+        return
+      }
+      if (!repairLocation) {
+        this.Toast({ message: '请选择所在位置!' })
+        loading.close()
+        return
+      }
+      if (!repairType) {
+        this.Toast({ message: '请选择故障类型!' })
+        loading.close()
+        return
+      }
+      // let {object} = await this.postHttps('manage/repair/checkPersonalOrder',{reqdata:{id:this.globalUserId}})
+
+      this.postHttps('manage/repair/checkPersonalOrder', { reqdata: { id: this.globalUserId } }).then(r => {
+        loading.close()
+        r.object ? this.$set(this.info, 'show', 1) : this.saveRepair()
+      }).catch(() => loading.close())
+    },
+    /**
+         * 发起报修
+         */
+    async saveRepair () {
+      let { descMalfunction, repairLocation, repairType } = this.info.obj
+      let reqdata = {
+        descMalfunction,
+        repairLocation,
+        repairType,
+        repairTime: new Date().valueOf(),
+        repairUserId: this.globalUserId,
+        files: this.info.files.map(item => ({
+          filePath: item.filePath,
+          fileRepairType: 0,
+          fileType: item.fileType ? 1 : 2
+        }))
+      }
+      // await this.postHttps('manage/repair/saveRepair',{reqdata})
+      this.postHttps('manage/repair/saveRepair', { reqdata }).then(() => this.$set(this.info, 'show', 2))
+    },
+    /**
+         * 关闭弹窗并跳转首页
+         */
+    infoCloseDia () {
+      this.$router.replace('/home')
+    },
+    /**
+       * 文件大小限制提示
+       */
+    onOversize () {
+      this.Toast('文件大小不能超过 10M')
+    },
+    /**
+       * 选择时间
+       * @param name 选择到指定属性
+       * @param type 1故障报修上传 2延期文件上传 3完成维修上传
+       */
+    afterRead (name, type) {
+      return file => {
+        this.loading = this.$loading({
+          lock: true,
+          text: 'Loading',
+          spinner: 'el-icon-loading',
+          background: 'rgba(0, 0, 0, 0.7)'
+        })
+        let files = (Array.isArray(file) ? file : [file]).map(item => item.file)
+        this.uploadImg(files, name, type)
+      }
+    },
+    /**
+       * 递归处理文件上传
+       * @param files 上传文件list
+       * @param name 选择到指定属性
+       * @param type 1故障报修上传 2延期文件上传 3完成维修上传
+       */
+    async uploadImg (files, name, type) {
+      let formData = new FormData()
+      let fileList = [...files]
+      let file = fileList.shift()
+      formData.append('file', file)
+      formData.append('type', type)
+      let nameList = name.split('.')
+      let url = file.type.includes('image') ? 'manage/upload/uploadImg' : 'manage/upload/uploadVideo'
+      //   try {
+      //       let {object} = await this.postHttps(url,formData)
+      //       this.$data[nameList[0]][nameList[1]].forEach(item => {
+      //           item.file === file && (item.filePath = object) && (item.fileType = file.type.includes('image'))
+      //       })
+      //       fileList.length ? this.uploadImg(fileList,name,type) : this.loading.close()
+      //   } catch (error) {
+      //       this.loading.close()
+      //   }
+      this.postHttps(url, formData).then(r => {
+        this.$data[nameList[0]][nameList[1]].forEach(item => {
+          item.file === file && (item.filePath = r.object) && (item.fileType = file.type.includes('image'))
+        })
+        fileList.length ? this.uploadImg(fileList, name, type) : this.loading.close()
+      }).catch(() => this.loading.close())
+    },
+    preview (fileList) {
+      this.ImagePreview({
+        images: fileList.map(item => this.imgUrl + item.filePath)
+      })
+    }
+  }
+}
+</script>

+ 235 - 0
answer - 副本/src/views/pc-detail.vue

@@ -0,0 +1,235 @@
+<template>
+    <div class="pc">
+        <img class="pc-bg" src="../common/img/pc/pc-bg-01.png" alt="">
+        <div class="pc-content">
+            <div class="pc-detail">
+                <div>
+                    <div class="pc-detail-title"><div class="point"></div> 保修详情</div>
+                    <template v-if="detail.repairStatus===3">
+                        <div class="pc-detail-item">
+                            <div class="item-label">报修类型</div>
+                            <div class="item-value">{{detail.repairTypeName}}</div>
+                        </div>
+                        <div class="pc-detail-item">
+                            <div class="item-label">报修位置</div>
+                            <div class="item-value">{{detail.repairLocation}}</div>
+                        </div>
+                        <div class="pc-detail-item">
+                            <div class="item-label">报修时间</div>
+                            <div class="item-value">{{detail.repairTime|format}}</div>
+                        </div>
+                        <div class="pc-detail-item">
+                            <div class="item-label">接单人</div>
+                            <div class="item-value">{{detail.takerName}}</div>
+                        </div>
+                        <div class="pc-detail-item">
+                            <div class="item-label">报修人</div>
+                            <div class="item-value">{{detail.repairName}}</div>
+                        </div>
+                        <div class="pc-detail-item">
+                            <div class="item-label">处理人</div>
+                            <div class="item-value">{{detail.processorName}}</div>
+                        </div>
+                        <div class="pc-detail-item">
+                            <div class="item-label">处理内容</div>
+                            <div class="item-value">{{detail.processingContent}}</div>
+                        </div>
+                        <div class="pc-detail-item">
+                            <div class="item-label">处理时间</div>
+                            <div class="item-value">{{detail.processingTime|format}}</div>
+                        </div>
+                        <div class="pc-detail-item" v-if="detail.assessScore">
+                            <div class="item-label">评价</div>
+                            <div class="rate-group">
+                                <div class="rate-num">{{detail.assessScore}}.0</div>
+                                <van-rate :value="detail.assessScore" readonly color="#ffd21e" :size="12"/>
+                            </div>
+                        </div>
+                        <div class="pc-detail-item" v-if="detail.assessScore">
+                            <div class="item-label">评价内容</div>
+                            <div class="item-value">{{detail.assessSupplement}}</div>
+                        </div>
+                        <div class="pc-detail-item">
+                            <div class="item-label">故障描述</div>
+                            <div class="item-value">{{detail.descMalfunction}}</div>
+                        </div>
+                        <div class="pc-detail-item" v-if="detail.files&&detail.files.length">
+                            <div class="item-label">故障图片或视频</div>
+                            <div class="item-file-list">
+                                <div class="file file-item" v-for="item in detail.files" :key="item.id">
+                                    <el-image
+                                        class="file-img"
+                                        :src="imgUrl + item.filePath"
+                                        :preview-src-list="detail.files.map(item => (imgUrl + item.filePath))">
+                                    </el-image>
+                                    <img class="icon-video" src="../common/img/icon-video.png" v-if="item.fileType===2" alt="">
+                                </div>
+                            </div>
+                        </div>
+                    </template>
+                    <div v-else class="flex">
+                        <img class="avatar" v-if="detail.processorAvatar" :src="detail.processorAvatar" alt="">
+                        <div>
+                            <div class="pc-detail-item" v-if="detail.takerName">
+                                <div class="item-label color-pick">接单人</div>
+                                <div class="item-value">{{detail.takerName}}</div>
+                            </div>
+                            <div class="pc-detail-item" v-if="detail.processorName">
+                                <div class="item-label">指派人</div>
+                                <div class="item-value">{{detail.processorName}}</div>
+                            </div>
+                            <div class="pc-detail-item">
+                                <div class="item-label">报修类型</div>
+                                <div class="item-value">{{detail.repairTypeName}}</div>
+                            </div>
+                            <div class="pc-detail-item">
+                                <div class="item-label">报修位置</div>
+                                <div class="item-value">{{detail.repairLocation}}</div>
+                            </div>
+                            <div class="pc-detail-item">
+                                <div class="item-label">报修时间</div>
+                                <div class="item-value">{{detail.repairTime|format}}</div>
+                            </div>
+                            <div class="pc-detail-item">
+                                <div class="item-label">剩余处理时间</div>
+                                <div class="item-value">{{(scope.row.takerTime||scope.row.repairTime)|formatCountdown}}</div>
+                            </div>
+                            <div class="pc-detail-item">
+                                <div class="item-label">故障描述</div>
+                                <div class="item-value">{{detail.descMalfunction}}</div>
+                            </div>
+                            <div class="pc-detail-item">
+                                <div class="item-label">订单状态</div>
+                                <div class="item-value">{{['未接单', '处理中', '已延后', '已完成', '已取消'][detail.repairStatus]}}</div>
+                            </div>
+                            <div class="pc-detail-item" v-if="detail.files&&detail.files.length">
+                                <div class="item-label">故障图片或视频</div>
+                                <div class="item-file-list">
+                                    <div class="file file-item" v-for="item in detail.files" :key="item.id">
+                                        <!-- <img class="file-img" :src="imgUrl + item.filePath" alt=""> -->
+                                        <el-image
+                                            class="file-img"
+                                            :src="imgUrl + item.filePath"
+                                            :preview-src-list="detail.files.map(item => (imgUrl + item.filePath))">
+                                        </el-image>
+                                        <img class="icon-video" src="../common/img/icon-video.png" v-if="item.fileType===2" alt="">
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="button-grounp">
+                        <div class="button-cancel" @click="$router.back()">返回</div>
+                        <div class="button-comments" v-if="detail.repairStatus===3&&!detail.assessScore" @click="dialogVisible=true">评价</div>
+                        <div class="button-comments" v-if="detail.repairStatus&&detail.repairStatus!==3" @click="contactOther(detail.repairWxUserId)">联系it</div>
+                    </div>
+                </div>
+                <div>
+                    <div class="log-title" v-if="detail.recordList&&detail.recordList.length">操作日志</div>
+                    <div class="log-list">
+                        <div class="log-item" v-for="item in detail.recordList" :key="item.id">
+                            <div class="log-icon"></div>
+                            <div>
+                                <div class="log-time">{{item.createdTime|format}}</div>
+                                <div class="log-text">{{item.operationContent}}</div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <el-dialog
+            title=""
+            :visible.sync="dialogVisible"
+            width="440px"
+            :before-close="handleClose">
+            <template #title></template>
+            <el-form :model="commentsForm" ref="commentsForm" :rules="commentsRules" label-width="40" style="width: 320px;margin: auto;">
+                <el-form-item label="" prop="assessScore">
+                  <div>您对此次报修还满意吗?</div>
+                  <div class="flex a-i-c">
+                    <div style="height: 30px;padding-right: 20px;">
+                        <van-rate v-model="commentsForm.assessScore" gutter="15" color="#ffd21e" :size="27"/>
+                    </div>
+                    <div class="rate-num">{{commentsForm.assessScore||0}}.0</div>
+                  </div>
+                </el-form-item>
+                <el-form-item label="" prop="assessSupplement">
+                    <div>您对本次服务的补充:</div>
+                    <el-input type="textarea" v-model="commentsForm.assessSupplement" style="width: 100%;" :autosize="{ minRows: 4, maxRows: 6}" placeholder="请输入文字(非必填)"></el-input>
+                </el-form-item>
+                <el-form-item label="" >
+                    <el-button class="btn-zdy-02" @click="handleClose">取 消</el-button>
+                    <el-button class="btn-zdy-02" type="primary" @click="pcEvaluation">确 定</el-button>
+                </el-form-item>
+            </el-form>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      dialogVisible: false,
+      detail: {},
+      commentsForm: {},
+      commentsRules: {
+        assessScore: [
+          { required: true, message: '请评分', trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  methods: {
+    handleClose () {
+      this.dialogVisible = false
+    },
+    /**
+         * table点击评价
+         * @param row table 行数据
+         */
+    toEvaluation () {
+      this.dialogVisible = true
+    },
+    /**
+         * 发表评论
+         */
+    pcEvaluation () {
+      this.$refs.commentsForm.validate(async (valid) => {
+        if (valid) {
+          let { assessScore, assessSupplement } = this.commentsForm
+          let reqdata = {
+            assessScore,
+            assessSupplement,
+            repairId: this.$route.params.id
+          }
+          this.postHttps('manage/repair/assessRepairOrder', { reqdata }).then(() => {
+            this.dialogVisible = false
+            this.$message({
+              type: 'success',
+              message: '评论成功!'
+            })
+            this.$router.push('/pc-list')
+          })
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    getDetail (id) {
+      let reqdata = {
+        id
+      }
+      this.postHttps('manage/repair/queryRepairOrderById', { reqdata }).then(r => {
+        this.detail = r.object
+      })
+    }
+  },
+  created () {
+    this.getDetail(this.$route.params.id)
+  }
+}
+</script>

+ 190 - 0
answer - 副本/src/views/pc-form.vue

@@ -0,0 +1,190 @@
+<template>
+    <div class="pc">
+        <img class="pc-bg" src="../common/img/pc/pc-bg-01.png" alt="">
+        <div class="pc-content">
+            <div class="pc-form">
+                <el-form ref="pcForm" style="width: 460px;" :model="form" label-width="120px" :rules="rules">
+                    <el-form-item label="故障类型" prop="repairType">
+                        <el-select v-model="form.repairType" placeholder="请选择" style="width: 100%;">
+                            <el-option v-for="item in repairTypeList" :key="item.id" :label="item.repairTypeName" :value="item.id"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="所在的位置" prop="repairLocation">
+                        <el-select v-model="form.repairLocation" placeholder="请选择" style="width: 100%;">
+                            <el-option v-for="item in locationList" :key="item.id" :label="item.localName" :value="item.localName"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="故障描述" prop="descMalfunction">
+                        <el-input type="textarea" v-model="form.descMalfunction" placeholder="请输入文字" style="width: 100%;" :autosize="{ minRows: 4, maxRows: 6}"></el-input>
+                    </el-form-item>
+                    <el-form-item label="上传照片或视频">
+                        <div class="flex">
+                            <div class="pc-file-list">
+                                <div class="file-item" v-for="(item,index) in fileList" :key="item.id">
+                                    <img class="icon-del" @click="pcRemoveImg(index)" src="../common/img/pc/icon-del.png" alt="">
+                                    <img class="file-img" :src="imgUrl + item.filePath" alt="">
+                                    <img  class="icon-video" src="../common/img/icon-video.png" v-if="item.fileType === 2" alt="">
+                                </div>
+                                <el-upload
+                                    v-if="fileList.length<6"
+                                    class="avatar-uploader"
+                                    :data="{type:1}"
+                                    :action="uploadUrl"
+                                    :file-list="fileList"
+                                    :show-file-list="false"
+                                    :on-success="handleAvatarSuccess"
+                                    :before-upload="beforeAvatarUpload">
+                                    <i class="el-icon-plus uploader-icon"></i>
+                                    <div class="uploader-text">上传照片或视频</div>
+                                </el-upload>
+                            </div>
+
+                            <div v-if="!fileList.length" class="uploader-prompt">
+                                <div>最多可上传6张照片或视频文件</div>
+                                <div>支持.jpg .mp4格式文件,10M以内</div>
+                            </div>
+                        </div>
+                    </el-form-item>
+                    <el-form-item>
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button class="btn-zdy" @click="$router.back()">取消</el-button>
+                        <el-button class="btn-zdy" type="primary" @click="pcSubmit">立即创建</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </div>
+
+        <van-popup :value="show===1" class="main-popup" :close-on-click-overlay="false">
+            <div class="icon mt-35" style="background: #000;"><van-icon name="fail" /></div>
+            <div class="text">您有一个处理中的报修申请<br/>
+                请确认是否提交新的申请</div>
+            <div class="button-grounp">
+                <div class="cancel" @click="show=0">取消</div>
+                <div class="determine" @click="pcSaveRepair">确定</div>
+            </div>
+        </van-popup>
+
+        <van-popup :value="show===2" class="pc-popup" closeable :close-on-click-overlay="false" @click-close-icon="pcCloseDia">
+            <img src="../common/img/avatr.png" alt="">
+            <div class="pc-popup-text">IT小哥哥收到你的申请啦,会尽快和您联系</div>
+            <div class="pc-button-determine" @click="pcCloseDia">好的</div>
+        </van-popup>
+    </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      uploadUrl: '',
+      show: 0,
+      form: {}, // 报修表单
+      fileList: [],
+      locationList: [],
+      repairTypeList: [],
+      rules: {
+        repairType: [
+          { required: true, message: '请选择故障类型', trigger: 'change' }
+        ],
+        repairLocation: [
+          { required: true, message: '请选择所在的位置', trigger: 'change' }
+        ],
+        descMalfunction: [
+          { required: true, message: '请输入故障描述', trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  methods: {
+    /**
+         * 获取位置列表
+         */
+    pcQueryLocationList () {
+      this.postHttps('manage/repair/queryLocationList').then(r => {
+        // this.$set(this.pc,'locationList',r.list)
+        this.locationList = r.list
+      })
+    },
+    /**
+         * 获取故障类型列表
+         */
+    pcQueryRepairTypeList () {
+      this.postHttps('manage/repair/queryRepairTypeList').then(r => {
+        // this.$set(this.pc,'repairTypeList',r.list)
+        this.repairTypeList = r.list
+      })
+    },
+    /**
+         * 提交报修
+         */
+    pcSaveRepair () {
+      let { descMalfunction, repairLocation, repairType } = this.form
+      let reqdata = {
+        descMalfunction,
+        repairLocation,
+        repairType,
+        repairTime: new Date().valueOf(),
+        repairUserId: this.globalUserId,
+        files: this.fileList
+      }
+      this.postHttps('manage/repair/saveRepair', { reqdata }).then(() => {
+        // this.$set(this.pc,'show',2)
+        this.show = 2
+      })
+    },
+    /**
+         * 创建报修前检测用户是否已有报修订单
+         */
+    pcSubmit () {
+      this.$refs.pcForm.validate((valid) => {
+        if (valid) {
+          this.postHttps('manage/repair/checkPersonalOrder', { reqdata: { id: this.globalUserId } }).then(r => {
+            r.object ? this.show = 1 : this.pcSaveRepair()
+          })
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+
+    /**
+         * 关闭弹窗
+         */
+    pcCloseDia () {
+      this.$router.push('/pc-list')
+    },
+
+    handleAvatarSuccess (res, file) {
+      console.log(res, file)
+      this.fileList.push({
+        filePath: res.object,
+        fileRepairType: 0,
+        fileType: file.raw.type.includes('image') ? 1 : 2
+      })
+    },
+    beforeAvatarUpload (file) {
+      console.log(file)
+      const isJPG = file.type.includes('image')
+      return new Promise((resolve) => {
+        this.$nextTick(() => {
+          this.uploadUrl = this.apiUrl + (isJPG ? 'manage/upload/uploadImg' : 'manage/upload/uploadVideo')
+          resolve()
+        })
+      })
+    },
+    /**
+         * 删除当前图片
+         * @param index 删除图片下标
+         */
+    pcRemoveImg (index) {
+      this.fileList.splice(index, 1)
+    }
+  },
+  created () {
+    this.pcQueryLocationList()
+    this.pcQueryRepairTypeList()
+  }
+}
+</script>

+ 292 - 0
answer - 副本/src/views/pc-list.vue

@@ -0,0 +1,292 @@
+<template>
+    <div class="pc">
+        <img class="pc-bg" src="../common/img/pc/pc-bg-01.png" alt="">
+        <div class="pc-content">
+            <div class="nav-list">
+                <div :class="active===1&&'is-active'" @click="$router.push('/pc-form')">
+                    <div class="nav-item-icon"><van-icon name="plus" color="#447AFE" :size="20"/></div>
+                    <div class="nav-item-text">立即发起报修</div>
+                </div>
+                <div :class="active===2&&'is-active'" @click="active=2">
+                    <div class="nav-item-icon"><img src="../common/img/pc/icon-read-active.png" alt=""></div>
+                    <div class="nav-item-text">处理中的报修</div>
+                </div>
+                <div :class="active===3&&'is-active'" @click="active=3">
+                    <div class="nav-item-icon"><img src="../common/img/pc/icon-my-active.png" alt=""></div>
+                    <div class="nav-item-text">已完成的报修</div>
+                </div>
+            </div>
+            <div style="width: 1072px;">
+                <div></div>
+                <el-table
+                :data="tableData"
+                :key="'pc'+active"
+                :header-cell-style="{background:'#F2F3F7',color:'#0A1F44'}"
+                style="width: 100%">
+                    <el-table-column
+                    align="right"
+                    prop="num"
+                    label="编号"
+                    width="65">
+                    </el-table-column>
+                    <el-table-column
+                    align="left"
+                    prop="repairTypeName"
+                    label="报修类型 "
+                    width="100">
+                    </el-table-column>
+                    <el-table-column
+                    align="left"
+                    prop="repairTime"
+                    label="报修时间"
+                    width="125">
+                    <template slot-scope="scope">
+                        <div>{{scope.row.repairTime|format}}</div>
+                    </template>
+                    </el-table-column>
+                    <el-table-column
+                    v-if="active===2"
+                    align="center"
+                    prop="repairStatus"
+                    label="订单状态 "
+                    width="85">
+                    <template slot-scope="scope">
+                        <el-tag :type="['warning','','danger','success','danger'][scope.row.repairStatus]">{{['未接单', '处理中', '已延后', '已完成', '已取消'][scope.row.repairStatus]}}</el-tag>
+                    </template>
+                    </el-table-column>
+                    <el-table-column
+                    align="center"
+                    prop="descMalfunction"
+                    label="故障描述 "
+                    :width="active===2?90:190">
+                    </el-table-column>
+                    <el-table-column
+                    align="center"
+                    prop="imagePath"
+                    label="是否有图片 "
+                    width="110">
+                    <template slot-scope="scope">
+                        <el-popover
+                            v-if="scope.row.imagePath"
+                            placement="left"
+                            width="200"
+                            trigger="hover">
+                            <img slot="reference" class="popover-img" :src="imgUrl+scope.row.imagePath" alt="">
+                            <img class="w-100" :src="imgUrl+scope.row.imagePath" alt="">
+                        </el-popover>
+                        <div v-else>
+                            否
+                        </div>
+                    </template>
+                    </el-table-column>
+                    <el-table-column
+                    v-if="active===2"
+                    align="center"
+                    prop="imagePath"
+                    label="剩余处理时间 "
+                    width="120">
+                    <template slot-scope="scope">
+                        <div>{{(scope.row.takerTime?scope.row.takerTime:scope.row.repairTime)|formatCountdown}}</div>
+                    </template>
+                    </el-table-column>
+                    <el-table-column
+                    v-if="active===2"
+                    align="center"
+                    prop="takerName"
+                    label="报修处理人"
+                    width="100">
+                    <template slot-scope="scope">
+                        <div>{{scope.row.takerName||'待分配'}}</div>
+                    </template>
+                    </el-table-column>
+                    <el-table-column
+                    v-if="active===3"
+                    align="center"
+                    prop="takerName"
+                    label="接单处理人"
+                    width="100">
+                    <template slot-scope="scope">
+                        <div>{{scope.row.takerName||'待分配'}}</div>
+                    </template>
+                    </el-table-column>
+
+                    <el-table-column
+                    align="center"
+                    prop="processorName"
+                    label="被指派处理人"
+                    width="110">
+                    <template slot-scope="scope">
+                        <div>{{scope.row.processorName||'待分配'}}</div>
+                    </template>
+                    </el-table-column>
+                    <el-table-column
+                    v-if="active===3"
+                    align="center"
+                    prop="takerName"
+                    label="完成处理人"
+                    width="100">
+                    <template slot-scope="scope">
+                        <div>{{scope.row.takerName||'待分配'}}</div>
+                    </template>
+                    </el-table-column>
+                    <el-table-column align="center" label="操作" width="167">
+                        <template slot-scope="scope">
+                            <el-link type="primary" :underline="false" @click="contactOther(scope.row.repairWxUserId)" v-if="scope.row.repairStatus&&scope.row.repairStatus!==3">联系IT</el-link>
+                            <el-link type="primary" :underline="false" v-if="active===3&&!scope.row.assessScore" @click="toEvaluation(scope.row)">评价</el-link>
+                            <el-link type="primary" :underline="false" @click="pcGetDetail(scope.row)">查看详情</el-link>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <div class="footer">
+                    <el-pagination
+                        @size-change="handleSizeChange"
+                        @current-change="handleCurrentChange"
+                        :current-page.sync="currentPage"
+                        :page-sizes="[10, 20, 30, 40, 50]"
+                        :page-size="10"
+                        layout="prev, pager, next, sizes, jumper"
+                        :total="total">
+                    </el-pagination>
+                </div>
+            </div>
+        </div>
+        <el-dialog
+            title=""
+            :visible.sync="dialogVisible"
+            width="440px"
+            :before-close="handleClose">
+            <template #title></template>
+            <el-form :model="commentsForm" ref="commentsForm" :rules="commentsRules" label-width="40" style="width: 320px;margin: auto;">
+                <el-form-item label="" prop="assessScore">
+                  <div>您对此次报修还满意吗?</div>
+                  <div class="flex a-i-c">
+                    <div style="height: 30px;padding-right: 20px;">
+                        <van-rate v-model="commentsForm.assessScore" gutter="15" color="#ffd21e" :size="27"/>
+                    </div>
+                    <div class="rate-num">{{commentsForm.assessScore||0}}.0</div>
+                  </div>
+                </el-form-item>
+                <el-form-item label="" prop="assessSupplement">
+                    <div>您对本次服务的补充:</div>
+                    <el-input type="textarea" v-model="commentsForm.assessSupplement" style="width: 100%;" :autosize="{ minRows: 4, maxRows: 6}" placeholder="请输入文字(非必填)"></el-input>
+                </el-form-item>
+                <el-form-item label="" >
+                    <el-button class="btn-zdy-02" @click="handleClose">取 消</el-button>
+                    <el-button class="btn-zdy-02" type="primary" @click="pcEvaluation">确 定</el-button>
+                </el-form-item>
+            </el-form>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      active: 2, // 标识 1:发起报修 2:处理中的报修 3:完成的报修
+      tableData: [],
+      currentPage: 1, // 当前页码
+      total: 0,
+      rows: 10, // 当前页数
+      dialogVisible: false,
+      commentsForm: {},
+      id: null,
+      commentsRules: {
+        assessScore: [
+          { required: true, message: '请评分', trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  methods: {
+
+    /**
+         * 查询数据列表
+         */
+    getTableData () {
+      let reqdata = {
+        queryType: this.active - 1,
+        userId: this.globalUserId
+      }
+      let { rows, currentPage: page } = this
+      this.tableData = []
+      this.postHttps('manage/repair/queryCompleteRepairOrder', { rows, page, reqdata }).then(r => {
+        let { list, totalrecords } = r
+        list.forEach((item, index) => {
+          item.num = index + 1
+        })
+        this.tableData = list
+        this.total = totalrecords
+      })
+    },
+    /**
+         * table点击评价
+         * @param row table 行数据
+         */
+    toEvaluation ({ id }) {
+      this.id = id
+      this.dialogVisible = true
+    },
+    /**
+         * 获取订单详情
+         * @param row table 行数据
+         */
+    pcGetDetail ({ id }) {
+      this.$router.push('pc-detail/' + id)
+    },
+    /**
+         * 改动table页数
+         * @param val 当前页数page size
+         */
+    handleSizeChange (val) {
+      this.rows = val
+      this.getTableData()
+    },
+    /**
+         * 改动table页
+         * @param val 当前页 page
+         */
+    handleCurrentChange (val) {
+      this.currentPage = val
+      this.getTableData()
+    },
+    handleClose () {
+      this.dialogVisible = false
+    },
+    /**
+         * 发表评论
+         */
+    pcEvaluation () {
+      this.$refs.commentsForm.validate(async (valid) => {
+        if (valid) {
+          let { assessScore, assessSupplement } = this.commentsForm
+          let reqdata = {
+            assessScore,
+            assessSupplement,
+            repairId: this.id
+          }
+          this.postHttps('manage/repair/assessRepairOrder', { reqdata }).then(() => {
+            this.dialogVisible = false
+            this.$message({
+              type: 'success',
+              message: '评论成功!'
+            })
+            this.getTableData()
+          })
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    }
+  },
+  created () {
+    this.getTableData()
+  },
+  watch: {
+    active () {
+      this.getTableData()
+    }
+  }
+}
+</script>

+ 68 - 0
answer - 副本/src/views/people.vue

@@ -0,0 +1,68 @@
+<template>
+    <div class="people">
+        <div class="people-content">
+            <!-- <van-radio-group v-model="radio"> -->
+            <div class="people-item" v-for="item in people.peopleList" :key="item.id" @click="contactPeople(item)">
+                <div class="people-item-left">
+                    <img :src="item.avatar" alt="">
+                    <div>
+                        <div class="flex a-i-c">
+                            <div class="people-item-nickName">{{item.repairName}}</div>
+                            <div class="people-item-city"><van-icon name="location" />{{item.location}}</div>
+                        </div>
+                        <div class="skills">范围:{{item.repairScope}}</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+// import wx from 'weixin-js-sdk'
+export default {
+  data () {
+    return {
+      people: {
+        peopleList: []
+      }
+    }
+  },
+  methods: {
+    /**
+         * 查询维修人员列表
+         */
+    // async getRepairMan () {
+    //     let {list} = await this.postHttps('manage/emp/queryRepairMan',{reqdata:{type:1}})
+    //     this.$set(this.people,'peopleList',list)
+    // },
+    getRepairMan () {
+      this.postHttps('manage/emp/queryRepairMan', { reqdata: { type: 1 } }).then(r => {
+        this.$set(this.people, 'peopleList', r.list)
+      })
+    },
+    /**
+         * 打开用户名片
+         * @param item 用户信息
+         */
+    contactPeople ({ repairWxUserId }) {
+      alert(repairWxUserId)
+      window.wx.invoke('openUserProfile', {
+        'type': 1, // 1表示该userid是企业成员,2表示该userid是外部联系人
+        'userid': repairWxUserId // 可以是企业成员,也可以是外部联系人
+      }, (res) => {
+        alert(JSON.stringify(res))
+        if (res.err_msg !== 'openUserProfile:ok') {
+          // 错误处理
+          this.Toast({
+            message: '无此联系人!'
+          })
+        }
+      })
+    }
+  },
+  created () {
+    this.getRepairMan()
+  }
+}
+</script>

+ 18 - 0
answer - 副本/vue.config.js

@@ -0,0 +1,18 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-06-10 15:38:47
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-29 10:45:35
+ * @FilePath     : \batterycloud-admin\vue.config.js
+ */
+module.exports = {
+  transpileDependencies: [/node_modules[/\\\\](vuex|)[/\\\\]/],
+  publicPath: './',
+  runtimeCompiler: true,
+  productionSourceMap: false,
+  devServer: {
+    host: '127.0.0.1',
+    https: false,
+    open: true
+  }
+}

ファイルの差分が大きいため隠しています
+ 8949 - 0
answer - 副本/yarn.lock


+ 23 - 0
huaren-cmc-page/.gitignore

@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 24 - 0
huaren-cmc-page/README.md

@@ -0,0 +1,24 @@
+# huaren-cmc-page
+
+## Project setup
+```
+yarn install
+```
+
+### Compiles and hot-reloads for development
+```
+yarn serve
+```
+
+### Compiles and minifies for production
+```
+yarn build
+```
+
+### Lints and fixes files
+```
+yarn lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 5 - 0
huaren-cmc-page/babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset'
+  ]
+}

+ 42 - 0
huaren-cmc-page/package.json

@@ -0,0 +1,42 @@
+{
+  "name": "huaren-cmc-page",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "core-js": "^3.6.5",
+    "vue": "^2.6.11"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "~4.5.0",
+    "@vue/cli-plugin-eslint": "~4.5.0",
+    "@vue/cli-service": "~4.5.0",
+    "babel-eslint": "^10.1.0",
+    "eslint": "^6.7.2",
+    "eslint-plugin-vue": "^6.2.2",
+    "vue-template-compiler": "^2.6.11"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "eslint:recommended"
+    ],
+    "parserOptions": {
+      "parser": "babel-eslint"
+    },
+    "rules": {}
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not dead"
+  ]
+}

BIN
huaren-cmc-page/public/favicon.ico


+ 17 - 0
huaren-cmc-page/public/index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <title><%= htmlWebpackPlugin.options.title %></title>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 28 - 0
huaren-cmc-page/src/App.vue

@@ -0,0 +1,28 @@
+<template>
+  <div id="app">
+    <img alt="Vue logo" src="./assets/logo.png">
+    <HelloWorld msg="Welcome to Your Vue.js App"/>
+  </div>
+</template>
+
+<script>
+import HelloWorld from './components/HelloWorld.vue'
+
+export default {
+  name: 'App',
+  components: {
+    HelloWorld
+  }
+}
+</script>
+
+<style>
+#app {
+  font-family: Avenir, Helvetica, Arial, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  text-align: center;
+  color: #2c3e50;
+  margin-top: 60px;
+}
+</style>

BIN
huaren-cmc-page/src/assets/logo.png


+ 58 - 0
huaren-cmc-page/src/components/HelloWorld.vue

@@ -0,0 +1,58 @@
+<template>
+  <div class="hello">
+    <h1>{{ msg }}</h1>
+    <p>
+      For a guide and recipes on how to configure / customize this project,<br>
+      check out the
+      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
+    </p>
+    <h3>Installed CLI Plugins</h3>
+    <ul>
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
+    </ul>
+    <h3>Essential Links</h3>
+    <ul>
+      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
+      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
+      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
+      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
+      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
+    </ul>
+    <h3>Ecosystem</h3>
+    <ul>
+      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
+      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
+      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
+      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
+      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
+    </ul>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'HelloWorld',
+  props: {
+    msg: String
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+h3 {
+  margin: 40px 0 0;
+}
+ul {
+  list-style-type: none;
+  padding: 0;
+}
+li {
+  display: inline-block;
+  margin: 0 10px;
+}
+a {
+  color: #42b983;
+}
+</style>

+ 8 - 0
huaren-cmc-page/src/main.js

@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+Vue.config.productionTip = false
+
+new Vue({
+  render: h => h(App),
+}).$mount('#app')

+ 0 - 0
huaren-cmc-page/yarn.lock


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません