zhouna 6 vuotta sitten
commit
89241c0b53
100 muutettua tiedostoa jossa 10002 lisäystä ja 0 poistoa
  1. 3 0
      .browserslistrc
  2. 16 0
      .eslintrc.js
  3. 21 0
      .gitignore
  4. 5 0
      Dockerfile
  5. 26 0
      README.md
  6. 14 0
      app/app.js
  7. 12 0
      app/cross-domain.js
  8. 1 0
      app/dist/css/app.f28ca325.css
  9. 1 0
      app/dist/css/chunk-vendors.976ee29b.css
  10. BIN
      app/dist/favicon.ico
  11. BIN
      app/dist/fonts/element-icons.2fad952a.woff
  12. BIN
      app/dist/fonts/element-icons.6f0a7632.ttf
  13. BIN
      app/dist/img/bg.9c520ef5.jpg
  14. BIN
      app/dist/img/left.61476a2c.jpg
  15. BIN
      app/dist/img/robot_icon.33468cde.png
  16. BIN
      app/dist/img/verify1.9de4e090.png
  17. BIN
      app/dist/img/verify2.d51bbb32.png
  18. 1 0
      app/dist/index.html
  19. 2 0
      app/dist/js/app.7f1da06a.js
  20. 1 0
      app/dist/js/app.7f1da06a.js.map
  21. 35 0
      app/dist/js/chunk-vendors.cdbf55c8.js
  22. 1 0
      app/dist/js/chunk-vendors.cdbf55c8.js.map
  23. 5 0
      babel.config.js
  24. 19 0
      default.conf
  25. 7 0
      docker-compose.yml
  26. 35 0
      package.json
  27. 9 0
      platformFront.iml
  28. 5 0
      postcss.config.js
  29. BIN
      public/favicon.ico
  30. 18 0
      public/index.html
  31. 97 0
      src/App.vue
  32. 147 0
      src/api/admin.js
  33. 51 0
      src/api/base64.js
  34. 96 0
      src/api/config.js
  35. 108 0
      src/api/index.js
  36. 135 0
      src/api/user.js
  37. 56 0
      src/api/utils.js
  38. BIN
      src/assets/logo.png
  39. 252 0
      src/components/admin/AddAdmin.vue
  40. 209 0
      src/components/admin/AddOrganization.vue
  41. 214 0
      src/components/admin/AddProductLine.vue
  42. 396 0
      src/components/admin/AuthedAdmin.vue
  43. 216 0
      src/components/admin/ChangePwd.vue
  44. 110 0
      src/components/admin/Console.vue
  45. 139 0
      src/components/admin/ModifinedOrga.vue
  46. 216 0
      src/components/admin/OrganizationInfo.vue
  47. 343 0
      src/components/admin/PersonCenter.vue
  48. 122 0
      src/components/admin/ProductDetail.vue
  49. 458 0
      src/components/admin/ProductLines.vue
  50. 256 0
      src/components/admin/ProductLinesManage.vue
  51. 196 0
      src/components/admin/RegisterAdmin.vue
  52. 290 0
      src/components/admin/Renew.vue
  53. 308 0
      src/components/admin/SuperAdmin.vue
  54. 45 0
      src/components/base/LtBadge.vue
  55. 101 0
      src/components/common/Banner.vue
  56. 51 0
      src/components/common/Crumbs.vue
  57. 161 0
      src/components/common/HomePage.vue
  58. 41 0
      src/components/common/Menu.vue
  59. 26 0
      src/components/common/MiniTile.vue
  60. 0 0
      src/components/common/banner.less
  61. 430 0
      src/components/forgetPassword/FindPassword.vue
  62. 156 0
      src/components/forgetPassword/findPassword.less
  63. 209 0
      src/components/login/Login.vue
  64. 122 0
      src/components/login/login.less
  65. 436 0
      src/components/register/Register.vue
  66. 134 0
      src/components/register/register.less
  67. 174 0
      src/components/user/AddServiceProduct.vue
  68. 301 0
      src/components/user/AlreadyToken.vue
  69. 717 0
      src/components/user/Console.vue
  70. 315 0
      src/components/user/CreatedToken.vue
  71. 113 0
      src/components/user/HomePage.vue
  72. 312 0
      src/components/user/Information.vue
  73. 276 0
      src/components/user/ManageService.vue
  74. 398 0
      src/components/user/MoreService.vue
  75. 284 0
      src/components/user/OpenedProduct.vue
  76. 9 0
      src/components/user/Power.vue
  77. 76 0
      src/components/user/SafetySetting.vue
  78. 340 0
      src/components/user/TrialUser.vue
  79. 123 0
      src/components/user/UserSetting.vue
  80. BIN
      src/images/2steps-1.png
  81. BIN
      src/images/2steps-2.png
  82. BIN
      src/images/3steps-1.png
  83. BIN
      src/images/3steps-2.png
  84. BIN
      src/images/3steps-3.png
  85. BIN
      src/images/Group 3.png
  86. BIN
      src/images/add_big.png
  87. BIN
      src/images/bg.jpg
  88. BIN
      src/images/close.png
  89. BIN
      src/images/complete.png
  90. BIN
      src/images/complete_org.png
  91. BIN
      src/images/dot.png
  92. BIN
      src/images/left.jpg
  93. BIN
      src/images/must.png
  94. BIN
      src/images/numb_back.png
  95. BIN
      src/images/numb_next.png
  96. BIN
      src/images/overTime.png
  97. BIN
      src/images/return.png
  98. BIN
      src/images/robot_icon.png
  99. BIN
      src/images/stop.png
  100. 0 0
      src/images/title.png

+ 3 - 0
.browserslistrc

@@ -0,0 +1,3 @@
+> 1%
+last 2 versions
+not ie <= 8

+ 16 - 0
.eslintrc.js

@@ -0,0 +1,16 @@
+module.exports = {
+  root: false,
+  env: {
+    node: false
+  },
+  'extends': [
+    'plugin:vue/essential'
+  ],
+  rules: {
+    'no-console': process.env.NODE_ENV === 'production' ? 'off' : 'off',
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'off' : 'off'
+  },
+  parserOptions: {
+    parser: 'babel-eslint'
+  }
+}

+ 21 - 0
.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*

+ 5 - 0
Dockerfile

@@ -0,0 +1,5 @@
+FROM nginx:latest
+MAINTAINER lantone
+RUN rm /etc/nginx/conf.d/default.conf
+ADD default.conf /etc/nginx/conf.d/
+COPY dist/  /usr/share/nginx/html/

+ 26 - 0
README.md

@@ -0,0 +1,26 @@
+# platform
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Run your tests
+```
+npm run test
+```
+
+### Lints and fixes files
+```
+npm run lint
+```

+ 14 - 0
app/app.js

@@ -0,0 +1,14 @@
+const fs = require('fs');
+const path = require('path');
+const express = require('express');
+const chalk = require('chalk')
+const app = express();
+app.use(express.static(path.resolve(__dirname, './dist')))
+
+app.get('*', function(req, res) {
+  const html = fs.readFileSync(path.resolve(__dirname, './dist/index.html'), 'utf-8')
+  res.send(html)
+})
+app.listen(8082, res => {
+  console.log(chalk.yellow('Start Service On 8082'));
+});

+ 12 - 0
app/cross-domain.js

@@ -0,0 +1,12 @@
+const cors = require('koa2-cors');
+
+module.exports=cors({
+    origin: function (ctx) {
+        return '*';
+    },
+    exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
+    maxAge: 5,
+    credentials: true,
+    allowMethods: ['GET', 'POST', 'DELETE'],
+    allowHeaders: ['Content-Type', 'Authorization', 'Accept']
+});

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 0
app/dist/css/app.f28ca325.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 0
app/dist/css/chunk-vendors.976ee29b.css


BIN
app/dist/favicon.ico


BIN
app/dist/fonts/element-icons.2fad952a.woff


BIN
app/dist/fonts/element-icons.6f0a7632.ttf


BIN
app/dist/img/bg.9c520ef5.jpg


BIN
app/dist/img/left.61476a2c.jpg


BIN
app/dist/img/robot_icon.33468cde.png


BIN
app/dist/img/verify1.9de4e090.png


BIN
app/dist/img/verify2.d51bbb32.png


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 0
app/dist/index.html


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 2 - 0
app/dist/js/app.7f1da06a.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 0
app/dist/js/app.7f1da06a.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 35 - 0
app/dist/js/chunk-vendors.cdbf55c8.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 0
app/dist/js/chunk-vendors.cdbf55c8.js.map


+ 5 - 0
babel.config.js

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

+ 19 - 0
default.conf

@@ -0,0 +1,19 @@
+server {
+	listen       80;
+	server_name  localhost;
+	location / {
+		root   /usr/share/nginx/html;
+		index  index.html index.htm;
+	}
+	location ^~/api/ {
+		rewrite ^/(.*)$ /$1 break;
+		proxy_set_header   Host             $host;
+		proxy_set_header   x-forwarded-for  $remote_addr;
+		proxy_set_header   X-Real-IP        $remote_addr;
+		proxy_pass http://192.168.2.241:80;
+	}
+	error_page   500 502 503 504  /50x.html;
+	location = /50x.html {
+		root   /usr/share/nginx/html;
+	}
+}

+ 7 - 0
docker-compose.yml

@@ -0,0 +1,7 @@
+version: "3"
+services:
+  vue-docker:
+    image: vue-docker
+    ports:
+      - "88:80"
+    restart: always

+ 35 - 0
package.json

@@ -0,0 +1,35 @@
+{
+  "name": "platform",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "dev": "vue-cli-service serve --open",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "js-md5": "^0.7.3",
+    "vue": "^2.5.17"
+  },
+  "eslintConfig": {
+    "env": {
+      "browser": false,
+      "node": false
+    }
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^3.0.4",
+    "@vue/cli-plugin-eslint": "^3.0.4",
+    "@vue/cli-service": "^3.0.4",
+    "@vue/eslint-config-standard": "^3.0.4",
+    "axios": "^0.18.0",
+    "element-ui": "^2.4.7",
+    "js-md5": "^0.7.3",
+    "less": "^3.8.1",
+    "less-loader": "^4.1.0",
+    "path": "^0.12.7",
+    "qs": "^6.5.2",
+    "vue-router": "^3.0.1",
+    "vue-template-compiler": "^2.5.17"
+  }
+}

+ 9 - 0
platformFront.iml

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

+ 5 - 0
postcss.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  plugins: {
+    autoprefixer: {}
+  }
+}

BIN
public/favicon.ico


+ 18 - 0
public/index.html

@@ -0,0 +1,18 @@
+<!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>platform</title>
+</head>
+<body>
+<noscript>
+    <strong>We're sorry but platform 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>

+ 97 - 0
src/App.vue

@@ -0,0 +1,97 @@
+<template>
+    <div id="app">
+        <router-view></router-view>
+    </div>
+</template>
+
+<script>
+  import '@less/base.less';
+  import axios from 'axios';
+  import utils from '@api/utils.js';
+  import api from './api/user.js';
+  document.title='朗通云平台';         //修改标签页标题
+  export default {
+    name: 'app',
+    created() {
+      this.getUserEnumsData();
+      this.getDiagbotManEnumsData();
+      //请求拦截器,添加token
+      axios.interceptors.request.use((req) => {
+        const tokenStr = localStorage.getItem('token');
+        if (tokenStr) {
+          const tokenInfo = utils.isJsonStr(tokenStr) && JSON.parse(tokenStr);
+          req.headers.Authorization = `Bearer ${tokenInfo.accessToken}`;
+          return req;
+        } else {
+          return req;
+        }
+      }, (error) => {
+        return Promise.reject(error);
+      });
+      //请求响应拦截,401则调到登录页
+      axios.interceptors.response.use(
+        response => {
+          const code = response.data.code;
+          if(code ==="10020011"){       //token过期,清除token信息并跳转到登录页面
+            localStorage.removeItem('token');
+            this.logOut();
+            return;
+          }
+          return response;
+        },
+        error => {
+          if (error.response) {
+            switch (error.response.status) {
+              case 401:
+                // 返回 401 清除token信息并跳转到登录页面
+                localStorage.removeItem('token');
+                this.logOut();
+                return;
+              case 500:
+                // 返回 500
+                this.message({
+                  message:'该服务正在升级,请稍后再试',
+                  type:'warning'
+                });
+                return;
+            }
+          }
+          return Promise.reject(error)   // 返回接口返回的错误信息
+        });
+      
+    },
+    methods: {
+      logOut(){
+        this.$alert('账号异常,请重新登录', '提示', {
+          confirmButtonText: '确定',
+          callback: action => {
+            window.location.href='/';
+          }
+        });
+      },
+      getUserEnumsData() {
+        api.getUserEnumsData().then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            localStorage.setItem('enumsData', JSON.stringify(data));
+          }
+        });
+      },
+      getDiagbotManEnumsData(){
+        api.getDiagbotManEnumsData().then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            localStorage.setItem('productEnumsData', JSON.stringify(data));
+          }
+        });
+      }
+    }
+  }
+</script>
+
+<style>
+    #app {
+        width: 100%;
+        height: 100%;
+    }
+</style>

+ 147 - 0
src/api/admin.js

@@ -0,0 +1,147 @@
+import axios from 'axios';
+import config from './config.js';
+
+const urls = config.urls;
+export default {
+  getPersonInfo() {
+    return axios.post(urls.getPersonInfo);
+  },
+  updatePersonInfo(data) {
+    return axios.post(urls.updatePersonInfo,{
+      "dept": data.dept,
+      "email": data.email,    
+      "linkman":data.linkman,
+      "phone": data.phone,
+      "position": data.position,
+    });
+  },
+  midifyPassword(data) {
+    return axios.post(urls.midifyPassword,{
+      "password": data.password,
+      "modifyPassword": data.modifyPassword,
+      })
+  },
+
+  getOrderNum() {
+    return axios.post(urls.waitExamOrderCou);
+  },
+  getAuthNum() {
+    return axios.post(urls.waitAuthen);
+  },
+  getProductLines(data) {
+    return axios.post(urls.getAllProductOrder, data);
+  },
+  getAuthentication(data) {
+    return axios.post(urls.queryAuthentication, data);
+  },
+  getAuthenticated(data) {
+    return axios.post(urls.getAuthenticated, data);
+  },
+  addAdmin(param) {
+    return axios.post(urls.addUserInfo, param);
+  },
+  updateUserInfoAll(param){
+    return axios.post(urls.updateUserInfoAll, param);
+  },
+  getOrgList(param) {
+    return axios.post(urls.getOrgList, param);
+  },
+  exportProductLines(param) {
+    return axios.post(urls.exportProductOrderInfo, param, {
+      responseType: 'blob'
+    });
+  },
+  exportSuperAdmin(param) {
+    return axios.post(urls.exportAdminInfo, param, {
+      responseType: 'blob'
+    });
+  },
+	queryUserInfo(param) {
+		return axios.post(urls.queryUserInfo, param);
+	},
+	exportUserInfo(param) {  // 导出注册用户信息
+		return axios.post(urls.exportUserInfo, param, {
+			responseType: 'blob'
+		});
+	},
+	exportKema(param) {  // 导出认证中
+		return axios.post(urls.exportKema, param, {
+			responseType: 'blob'
+		});
+	},
+	exportVerified(param) {  // 导出注册用户
+		return axios.post(urls.exportVerified, param, {
+			responseType: 'blob'
+		});
+	},
+	renewalsInfos(param) {  //续费列表数据获取
+		return axios.post(urls.renewalsInfos, param);
+	},
+	modifyOpeningTime(param) {  //续费添加
+		return axios.post(urls.modifyOpeningTime, param);
+	},
+	deleteRenewalsInfos(param) {  //删除续费
+		return axios.post(urls.deleteRenewalsInfos, param);
+	},
+  exportOrganizeInfo(param){//导出结构信息
+    return axios.post(urls.exportOrganizeInfo, param, {
+      responseType: 'blob'
+    });
+  },
+  getOrganizationInfo(data){//机构信息
+    return axios.post(urls.getOrganizationInfo,data)
+  },
+  addOrganization(param){//添加机构信息
+    return axios.post(urls.addOrganization,param)
+  },
+  modifineOrganization(param){//修改机构信息
+    return axios.post(urls.modifineOrganization,param)
+  },
+  exportAuthedAdmin(param){     //导出已认证超管
+    return axios.post(urls.exportAuthedAdmin, param, {
+      responseType: 'blob'
+    });
+  },
+  auditUserInfoAll(param){
+    return axios.post(urls.auditUserInfoAll, param);
+  },
+  auditUserInfoAllPass(param){
+    return axios.post(urls.auditUserInfoAllPass, param);
+  },
+  getProductLinesManage(param){
+    return axios.post(urls.getProductLinesManage, param);
+  },
+  delProductLine(param){
+    return axios.post(urls.delProductLine, param);
+  },
+  addProductLine(param){
+    return axios.post(urls.addProductLine, param);
+  },
+  editProductLine(param){
+    return axios.post(urls.editProductLine, param);
+  },
+  proDetails(param){
+    return axios.post(urls.proDetails, param);
+  },
+  getProductDetail(param){
+    return axios.post(urls.getProductDetail, param);
+  },
+  reBuyProduct(param){
+    return axios.post(urls.contineBuy, param);
+  },
+  delSuperAdmin(param){
+    return axios.post(urls.delSuperAdmin, param);
+  },
+  updateServiceStatus(param){
+    return axios.post(urls.updateServiceStatus, param);
+  },
+  startAndendByuserId(param){
+    return axios.post(urls.startAndendByuserId, param);
+  },
+  delAdminDetail(param){
+    return axios.post(urls.delInformationAvailable, param);
+  },
+  auditProductStatus(param){
+    return axios.post(urls.auditProductStatus, param);
+  }
+}

+ 51 - 0
src/api/base64.js

@@ -0,0 +1,51 @@
+// base64 加密方法
+   var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+ 
+    // public method for encoding
+    const encode = function(input){
+        var output = "";
+        var chr1=null, chr2=null, chr3=null, enc1=null, enc2=null, enc3=null, enc4=null;
+        var i = 0;
+        input = _utf8_encode(input);
+        while (i < input.length) {
+            chr1 = input.charCodeAt(i++);
+            chr2 = input.charCodeAt(i++);
+            chr3 = input.charCodeAt(i++);
+            enc1 = chr1 >> 2;
+            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+            enc4 = chr3 & 63;
+            if (isNaN(chr2)) {
+                enc3 = enc4 = 64;
+            } else if (isNaN(chr3)) {
+                enc4 = 64;
+            }
+            output = output +
+            _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
+            _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
+        }
+        return output;
+    }
+
+     // private method for UTF-8 encoding
+   const _utf8_encode =  function(string) {
+        string = string.replace(/\r\n/g,"\n");
+        var utftext = "";
+        for (var n = 0; n < string.length; n++) {
+            var c = string.charCodeAt(n);
+            if (c < 128) {
+                utftext += String.fromCharCode(c);
+            } else if((c > 127) && (c < 2048)) {
+                utftext += String.fromCharCode((c >> 6) | 192);
+                utftext += String.fromCharCode((c & 63) | 128);
+            } else {
+                utftext += String.fromCharCode((c >> 12) | 224);
+                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
+                utftext += String.fromCharCode((c & 63) | 128);
+            }
+ 
+        }
+        return utftext;
+    }
+
+    export default encode;

+ 96 - 0
src/api/config.js

@@ -0,0 +1,96 @@
+export default {
+  host:'http://192.168.3.100:5050',
+  urls: {
+    /* 登录注册相关接口 */
+    'getImgVerification': '/api/user/userver/getImgVerification',
+    'verifyImgVerification': '/api/user/userver/verifyImgVerification',
+    'login': 'api/user/user/getJwt',
+    'getSmsWithRegister': '/api/user/userver/getSmsWithRegister',
+    // 'getSmsWithRegister': 'http://192.168.3.117:5050/api/user/userver/getSmsWithRegister',
+    'verifySmsVerification': '/api/user/userver/verifySmsVerification',
+    'checkTel': '/api/user/user/verifyNoUsername',//注册验证手机号
+    'checkForgetTel': '/api/user/user/verifyExistUsername',//忘记密码验证手机号
+    'registry': '/api/user/user/registry',
+    'getSmsWithResetPassword': '/api/user/userver/getSmsWithResetPassword',
+    'resetPassword': '/api/user/user/resetPassword',
+    'getAccessdMenu': '/api/user/user/getUserOrgMenu',  //获取左侧菜单项
+    'getUserEnumsData': '/api/user/getUserEnumsData',   //获取用户枚举数据
+    'getDiagbotManEnumsData':'/api/diagbotman/getDiagbotManEnumsData',      //获取产品枚举类型
+    /* 朗通后台相关接口 */
+    'getUserAuthenticationStatus': '/api/user/userAuthentication/getUserAuthenticationStatus',         //获取用户认证状态
+		'getPersonInfo':'/api/user/user/getPersonInfo',
+		'updatePersonInfo':'/api/user/user/updatePersonInfo',
+		'midifyPassword':'/api/user/user/midifyPassword',
+    'queryUserInfo': '/api/user/userInfo/queryUserInformation', //注册用户
+    'exportUserInfo': '/api/user/report/exportUserInfo', //导出用户信息
+    'exportKema': '/api/user/report/exportKema', //导出认证中用户
+    'exportVerified': '/api/user/report/exportVerified', //导出已认证用户
+    'renewalsInfos': '/api/diagbotman/userRenewals/renewalsInfos', // 续费列表
+    'modifyOpeningTime': '/api/diagbotman/productOrder/modifyOpeningTime', //确定续费
+    'deleteRenewalsInfos': '/api/diagbotman/userRenewals/cancelRenewalsInfos', //取消续费
+    'getOrganizationInfo':'/api/user/userInfo/queryMechanismInformation',//获取机构信息
+    'addOrganization':'/api/user/userInfo/addOrganization',//添加机构信息
+    'modifineOrganization':'/api/user/userInfo/updateOrganizations',//修改机构信息
+		'getuserAuthenticationInfo' : '/api/user/userAuthentication/getuserAuthenticationInfo',
+		'userAuthentication':'/api/user/userAuthentication/userAuthentication',   //用户认证
+    'waitExamOrderCou': '/api/diagbotman/productOrder/waitExamOrderCou',
+    'waitAuthen': '/api/user/userAuthentication/waitAuthen',
+    'getAllProductOrder': '/api/diagbotman/productOrder/getAllProductOrder',  //获取产品线列表
+    'queryAuthentication': '/api/user/userInfo/queryAuthentication',  //获取未认证超管信息列表
+    'addUserInfo': '/api/user/userInfo/addUserInfo',    //添加超管
+    'getOrgList': '/api/user/userInfo/findOrganization',      //获取未绑定超管的机构列表
+    'exportProductOrderInfo': '/api/diagbotman/reporExcel/exportProductOrderInfo',  //导出产品线列表
+    'exportAdminInfo': '/api/user/report/exportUserInfo',         //导出超管信息
+    'auditUserInfoAll':'/api/user/userInfo/auditUserInfoAllNopass',     //超管审核不通过
+    'auditUserInfoAllPass':'/api/user/userInfo/auditUserInfoAllPass',     //超管审核通过
+    'getAuthenticated':'/api/user/userInfo/queryVerifiedUserOrganizationProduct',  //已认证超管信息    //获取已认证超管信息
+    'getProductLinesManage':'/api/diagbotman/diagLantoneProduct/selectProduct',  //产品线管理列表,
+    'delProductLine':'/api/diagbotman/diagLantoneProduct/deleteProduct',  //产品线删除
+    'updateServiceStatus':'/api/diagbotman/diagLantoneProduct/updateServiceStatus',    //产品线启用停用
+    'exportAuthedAdmin':'/api/user/report/exportVerified',   //导出已认证超管
+    'delSuperAdmin':'/api/user/userInfo/updateDeleted',     //删除已认证超管
+    'updateUserInfoAll':'/api/user/userInfo/updateUserInfo',  //修改超管
+    'startAndendByuserId':'/api/diagbotman/productOrder/startAndendByuserId',    //已认证超管展开-启用停用
+    'delInformationAvailable':'/api/diagbotman/productOrder/delInformationAvailable',   //已认证超管展开-删除
+    'auditProductStatus':'/api/diagbotman/diagOrderDetails/auditStatus',   //产品线审核
+    'addProductLine':'/api/diagbotman/diagLantoneProduct/addProducts',    //添加产品线
+    'editProductLine':'/api/diagbotman/diagLantoneProduct/updateProduct',       //修改产品线
+    'getProductDetail':'/api/diagbotman/diagLantoneProduct/opendedProduct',    //产品线详情
+    'contineBuy':'/api/diagbotman/productOrder/modifyOpeningTime',    //已认证超管-续费
+    'proDetails':'/api/diagbotman/diagOrderDetails/getAllOrderDetials',      //产品申请-详情
+    /* 用户后台相关接口 */
+    'getTrialProduct': '/api/diagbotman/morServices/showProductInfo',//更多服务
+    'exportOrganizeInfo': '/api/user/report/exportOrganization',//导出机构信息
+    'addOrder': '/api/diagbotman/morServices/addOrder',//立即开通
+    'opendedProduct': '/api/diagbotman/diagLantoneProduct/opendedProductByCurrentUser',//已开通产品
+    'getService': '/api/diagbotman/serviceInfo/getServiceListByCurrentUser',//获取已建立的服务端
+    'addService': '/api/diagbotman/serviceInfo/createService',//添加服务端
+    'manageService': '/api/diagbotman/serviceInfo/getServiceListPageByCurrentUser',//管理服务端
+    'deleteService': '/api/diagbotman/serviceInfo/delService',//管理服务端-删除
+    'createServiceToken': '/api/diagbotman/serviceToken/createServiceToken',//生成令牌
+    'alreadyServiceToken': '/api/diagbotman/productService/getProductServiceByCurrentUser',//已生成令牌
+    'delProductService': '/api/diagbotman/productService/deleteProductService',//已生成令牌-删除
+    'detailProductService': '/api/diagbotman/serviceToken/getTokenByProductServiceId',//已生成令牌-查看
+    'delServiceToken': '/api/diagbotman/serviceToken/deleteTokenByProductServiceId',//删除令牌
+    'disableToken': '/api/diagbotman/serviceToken/disableToken',   //   禁用令牌
+    'enableToken': '/api/diagbotman/serviceToken/enableToken',   //    启用令牌
+		'getConsoleOnTrial': '/api/diagbotman/productOrder/getConsoleOnTrial', //可试用产品
+		'openUpOnTrial': '/api/diagbotman/productOrder/openUpOnTrial', //  立即试用请求
+		'productAuthProgress': '/api/diagbotman/productOrder/productAuthProgress', //产品开通进度
+		'getConsoleOpened': '/api/diagbotman/productOrder/getConsoleOpened', // 控制台--已开通产品
+		'enShowOption': '/api/diagbotman/productOrder/enShowOption', //控制台--是否显示选项
+        'addRenewalsInfo': '/api/diagbotman/morServices/addRenewalsInfo', // 控制台--续费
+        'getAuthenProgress': '/api/user/userAuthentication/queryAuthProgress', // 控制台--账号认证进度
+		'intoVerify': '/api/diagbotman/productOrder/openProductCheck', // 控制台--进入验证
+	},
+	menuIconList: { //菜单对应图标
+		'YH-KZT': 'el-icon-menu',
+		'YH-GDFW': 'el-icon-service',
+		'YH-JGZX': 'el-icon-goods',
+		'LT-KHZX': 'el-icon-document',
+		'LT-KZT': 'el-icon-edit-outline',
+		'LT-DDXT': 'el-icon-setting',
+		'LT-CPXGL': 'el-icon-upload',
+		'LT-GRZX': 'el-icon-news'
+	}
+}

+ 108 - 0
src/api/index.js

@@ -0,0 +1,108 @@
+import axios from 'axios';
+import config from './config.js';
+
+axios.default.timeout = 5000;
+axios.defaults.headers.post['Content-Type'] = "application/json;charset=utf-8";
+
+const urls = config.urls;
+export default {
+  getImgCode() {//获取图片验证码
+    return axios.post(urls.getImgVerification, {})
+  },
+  vertifyImgCode(data) {//校验图片验证码
+    return axios.post(
+      urls.verifyImgVerification,
+      {
+        'code': data.imgCode,
+        'imgId': data.imgId
+      }
+    )
+  },
+  loginMess(data) {
+    return axios.post(urls.login,
+      {
+        'username': data.username,
+        'password': data.password
+      }
+    )
+  },
+  checkTel(data){//注册
+    return axios.post(urls.checkTel,{
+      'username':data
+    })
+  },
+  checkForgetTel(data){//忘记密码
+    return axios.post(urls.checkForgetTel,{
+      'username':data
+    })
+  },
+  getMobileCode(data) {//获取短信验证码
+    return axios.post(
+      urls.getSmsWithRegister,
+      {
+        'code': data.imgCode,
+        'imgId': data.imgId,
+        'mobile': data.mobile
+      }
+    )
+  },
+  vertifyMobileCode(data) {//验证短信验证码
+    return axios.post(
+      urls.verifySmsVerification,
+      {
+        'code': data.imgCode,
+        'imgId': data.imgId,
+        'mobile': data.mobile,
+        'smsCode': data.smsCode
+      }
+    )
+  },
+  regidtry(data) {//注册
+    return axios.post(
+      urls.registry,
+      {
+        "code": data.code,
+        "email": data.email,
+        "gmtCreate": '',
+        "gmtModified": '',
+        "id": 0,
+        "imgId": data.imgId,
+        "isDeleted": '',
+        "linkman": data.linkman,
+        "modifier": '',
+        "organization": data.organization,
+        "password": data.password,
+        "username": data.username
+      }
+    )
+  },
+
+  /**************************找回密码****************************/
+
+  forgetPswGetMobileCode(data) {//忘记密码获取短信验证码
+    return axios.post(
+      urls.getSmsWithResetPassword,
+      {
+        'code': data.imgCode,
+        'imgId': data.imgId,
+        'mobile': data.mobile
+      }
+    )
+  },
+  resetPsw(data) {
+    return axios.post(
+      urls.resetPassword,
+      {
+        'password': data.password,
+        'username': data.username,
+        'diffPassword':data.diffPassword
+      }
+    )
+  },
+  getAccessdMenu() {
+    return axios.post(urls.getAccessdMenu);
+  },
+  getUserEnumsData() {
+    return axios.post(urls.getUserEnumsData);
+  }
+}

+ 135 - 0
src/api/user.js

@@ -0,0 +1,135 @@
+import axios from 'axios';
+import config from '@api/config.js';
+import qs from 'qs'
+
+const urls = config.urls;
+
+export default {
+	open(data) {
+		return axios.post(urls.addOrder, {
+			'productId': data.idList
+		})
+	},
+	getUserAuthStatus() {
+		return axios.post(urls.getUserAuthenticationStatus);
+	},
+	getUserAuthInfo() { //账户信息
+		return axios.post(urls.getuserAuthenticationInfo);
+	},
+	getUserAuthcation() {
+		return axios.post(urls.userAuthentication);
+	},
+	getUserEnumsData() {    //枚举数据
+		return axios.post(urls.getUserEnumsData,{
+		});
+	},
+	userAuthentication(data) { //用户认证
+		return axios.post(urls.userAuthentication, {
+			"organization": data.organizationName,
+			"username": data.username,
+			"position": data.position,
+			"organizationAddress": data.organizationAddress,
+			"organizationPrincipal": data.organizationPrincipal,
+			"organizationType": data.organizationTypeNum,
+			"subOrganizationNum": data.subOrganizationNum
+		});
+	},
+	createServiceToken(data) { //生成令牌
+		return axios.post(urls.createServiceToken, {
+			'productId': data.productId,
+			'serviceId': data.serviceId
+		})
+	},
+	alreadyServiceToken(data) { //已生成令牌
+		return axios.post(urls.alreadyServiceToken, {
+			'current': data.current,
+			'size': data.size
+		})
+	},
+  getTrialProduct() {//更多服务产品展示
+    return axios.post(urls.getTrialProduct)
+  },
+  opendedProduct() {//用户已开通产品
+    return axios.post(urls.opendedProduct)
+  },
+  getService() {//获取服务端
+    return axios.post(urls.getService)
+  },
+  addService(data) {//添加服务端
+    return axios.post(urls.addService, {
+      'description': data.desc,
+      'name': data.name
+    })
+  },
+  manageService(data) {//管理服务端
+    return axios.post(urls.manageService, {
+      'current': data.current,
+      'size': data.size
+    })
+  },
+  deleteService(id) {//删除服务端
+    return axios.post(urls.deleteService + '?serviceId=' + id)
+  },
+  createServiceToken(data) {//生成令牌
+    return axios.post(urls.createServiceToken, {
+      'productId': data.productId,
+      'serviceId': data.serviceId
+    })
+  },
+  alreadyServiceToken(data) {//已生成令牌
+    return axios.post(urls.alreadyServiceToken, {
+      'current': data.current,
+      'size': data.size
+    })
+  },
+  /*delProductService(data) {//已生成令牌-删除
+    return axios.post(urls.delProductService, {
+      'productId': data.productId,
+      'serviceId': data.serviceId
+    })
+  },*/
+  delProductService(id) {//已生成令牌-删除
+    return axios.post(urls.delProductService + '?productServiceId=' + id)
+  },
+  detailProductService(id){//已生成令牌-查看
+    return axios.post(urls.detailProductService + '?productServiceId=' + id)
+  },
+  delServiceToken(id) {//删除令牌
+    return axios.post(urls.delServiceToken + '?productServiceId=' + id)
+  },
+  forbidServiceToken(id) {//禁用令牌
+    return axios.post(urls.disableToken + '?productServiceId=' + id)
+  },
+  openServiceToken(id) {//启用令牌
+    return axios.post(urls.enableToken + '?productServiceId=' + id)
+  },
+	getConsoleOnTrial() {//可试用
+		return axios.post(urls.getConsoleOnTrial)
+	},
+	openUpOnTrial(data) { //立即试用
+		return axios.post(urls.openUpOnTrial, {
+			'productId': data.productId
+		})
+	},
+	productAuthProgress() { //申请进度
+		return axios.post(urls.productAuthProgress)
+	},
+	getConsoleOpened() { // 控制台--已开通产品
+		return axios.post(urls.getConsoleOpened)
+	},
+	enShowOption() { 
+		return axios.post(urls.enShowOption)
+	},
+	addRenewalsInfo(params) { //控制台--续费
+		return axios.post(urls.addRenewalsInfo,params)
+	},
+	getDiagbotManEnumsData(){
+		return axios.post(urls.getDiagbotManEnumsData);
+	},
+  getAuthenProgress(){
+    return axios.post(urls.getAuthenProgress);
+  },
+  intoVerify(params){//进入权限校验
+    return axios.post(urls.intoVerify,params)
+  }
+}

+ 56 - 0
src/api/utils.js

@@ -0,0 +1,56 @@
+export default {
+  //判断字符串是否能转成json
+  isJsonStr(str) {
+    if (typeof str === 'string') {
+      try {
+        const myStr = str.replace(/^\s*/, '');
+        const obj = JSON.parse(str);
+        if (myStr[0] === '{') {
+          return true;
+        } else {
+          return false;
+        }
+      } catch (e) {
+        return false;
+      }
+    }
+  },
+  //获取两个时间间隔天数
+  getTimeRangeDay(timeArr) {
+    if(!timeArr||timeArr.length==0){
+      return null;
+    }
+    return (new Date(timeArr[1]) - new Date(timeArr[0])) / (1000 * 60 * 60 * 24);
+  },
+  //导出接口返回流下载
+  downloadExportedData(data, fileName) {
+    var blob = new Blob([data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'}); //application/vnd.openxmlformats-officedocument.spreadsheetml.sheet这里表示xlsx类型
+    var downloadElement = document.createElement('a');
+    var href = window.URL.createObjectURL(blob); //创建下载的链接
+    downloadElement.href = href;
+    downloadElement.download = fileName; //下载后文件名
+    document.body.appendChild(downloadElement);
+    downloadElement.click(); //点击下载
+    document.body.removeChild(downloadElement); //下载完成移除元素
+    window.URL.revokeObjectURL(href);
+  },
+  emailReg: /^([a-zA-Z0-9_\.-]+)@([\da-zA-Z\.-]+)\.([a-z\.]{2,6})$/,
+  // pswReg: /^(?![0-9]+$)(?![a-zA-Z]+$)/,
+  pswReg: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z\W_]{6,16}$/,//与后台保持一致
+  phoneReg: new RegExp(/^((13|14|15|16|17|18|19)\d{9})$/),
+  url:/[a-zA-z]+:\/\/[^\s]*/,
+	getDateStr(string,str){
+	  var str_before = string.split(str)[0];
+	  var str_after = string.split(str)[1];
+	},
+  exportCondition(time){
+    const rangeDay = this.getTimeRangeDay(time);
+    if (!time||time.length==0) {
+      return '请先选择导出时间';
+    }
+    if (rangeDay > 30) {
+      return '目前只能导出30天内数据,请重新筛选时间';
+    }
+    return true;
+  }
+}

BIN
src/assets/logo.png


+ 252 - 0
src/components/admin/AddAdmin.vue

@@ -0,0 +1,252 @@
+<template>
+    <div>
+        <!-------------面包屑-------------->
+        <crumbs :title="`超级管理员信息-${isEdit?'修改':'添加'}超管`" :linkTo="link" :curPage="curPage">
+        </crumbs>
+        <!--------------表单--------------->
+        <div class="contents">
+            <el-form ref="form" :model="form" :rules="rules" label-width="80px" class="add-admin-form">
+                <h4>基本信息</h4>
+                <el-form-item label="机构名称" prop="organizationId">
+                    <el-select v-if="!isEdit" v-model="form.organizationId" placeholder="请选择机构">
+                        <el-option v-for="item in orgList" :key="item.id" :label="item.name" :value="item.id">
+                        </el-option>
+                    </el-select>
+                    <el-input v-if="isEdit" v-model="orgName" placeholder="请输入手机号" :disabled="true"></el-input>
+                </el-form-item>
+                <el-form-item label="手机号" prop="userName" required>
+                    <el-input v-model="form.userName" placeholder="请输入手机号" :disabled="isEdit?true:false" maxlength="11"></el-input>
+                </el-form-item>
+                <el-form-item label="密码" prop="passWord" v-if="!isEdit" required>
+                    <el-input v-model="form.passWord" placeholder="请输入密码"></el-input>
+                </el-form-item>
+                <el-form-item label="姓名" prop="linkman" required>
+                    <el-input v-model="form.linkman" placeholder="请输入姓名"></el-input>
+                </el-form-item>
+                <el-form-item label="所属岗位" prop="position" required>
+                    <el-input v-model="form.position" placeholder="请输入所属岗位" ></el-input>
+                </el-form-item>
+                <el-form-item label="邮箱" prop="email" required>
+                    <el-input v-model="form.email" placeholder="请输入邮箱"></el-input>
+                </el-form-item>
+                <el-form-item>
+                    <el-button size="small" v-if="!isEdit" type="primary" @click="addAdmin">确定添加</el-button>
+                    <el-button size="small" v-if="isEdit" type="primary" @click="editAdmin">确定修改</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+    </div>
+</template>
+
+<script>
+  import api from '@api/admin.js';
+  import utils from '@api/utils.js';
+
+  export default {
+    name: 'add-admin',
+    data: function () {
+      const psdVaild = (rule,value,callback)=>{
+        if (!value) {
+          return callback(new Error('请输入密码'));
+        }
+        if (value.length > 16) {
+           this.form.passWord = value.substr(0, 16);
+           this.$message({
+             showClose: true,
+             type: 'warning',
+             message: '密码最多可输入16个字'
+           })
+        }
+        const pswReg = utils.pswReg;
+        if (value.length<6||!pswReg.test(value)) {
+          return callback(new Error('您设置的密码不符合规则~'));
+        }
+        
+        callback();
+      };
+      const userNameVaild = (rule, value, callback) => {
+        if (!value) {
+          return callback(new Error('请输入姓名'));
+        }
+        if (value.length > 10) {
+           this.form.linkman = value.substr(0, 10);
+           this.$message({
+             showClose: true,
+             type: 'warning',
+             message: '姓名最多可输入10个字'
+           })
+        }
+        const contactReg = new RegExp(/[^\u4e00-\u9fa5]$/g);
+        if (contactReg.test(value)) {
+          return callback(new Error('姓名只能输入中文'));
+        }else{
+          callback();
+        }
+      };
+      const phoneVaild = (rule, value, callback) => {
+        if (!value) {
+          return callback(new Error('请输入手机号'));
+        }
+        const phoneReg = utils.phoneReg;
+        if (!phoneReg.test(value)) {
+          return callback(new Error('请输入正确的手机号~'));
+        }
+        callback();
+      };
+      const positionVaild = (rule, value, callback) => {
+        if (!value) {
+          return callback(new Error('请输入所属岗位'));
+        }
+        if (value.length > 20) {
+           this.form.position = value.substr(0, 20);
+           this.$message({
+             showClose: true,
+             type: 'warning',
+             message: '所属岗位最多可输入20个字'
+           })
+        }
+        callback();
+      };
+      const emailVaild = (rule, value, callback) => {
+        if (!value) {
+          return callback(new Error('请输入邮箱'));
+        }
+        const emailReg = utils.emailReg;
+        if (!emailReg.test(value)) {
+          return callback(new Error('请输入正确的邮箱'));
+        }
+        callback();
+      };
+      return {
+        orgList: [],
+        isEdit:false,
+        userId:'',
+        link:'/admin/LT-KHZX-CGXX',
+        curPage:'1',
+        orgName:'',
+        form: {
+          email: '',
+          linkman: '',
+          organizationId: '',
+          passWord: '',
+          position: '',
+          userName: ''
+        },
+        rules: {
+          organizationId:[
+            { required: true, message: '请选择机构名称', trigger: 'change' }
+          ],
+          linkman:[
+            { validator: userNameVaild, trigger: ['blur', 'change'] }
+          ],
+          passWord:[
+            { validator: psdVaild, trigger: ['blur', 'change'] }
+          ],
+          position:[
+            { validator: positionVaild, trigger: ['blur', 'change'] }
+          ],
+          userName: [
+            {validator: phoneVaild, trigger: ['blur', 'change']}
+          ],
+          email: [
+            {validator: emailVaild, trigger: ['blur', 'change']}
+          ]
+        }
+      }
+    },
+    created() {
+      this.getOrgList();
+      const info = this.$route.params.info;
+      const cur = this.$route.params&&this.$route.params.currentPage;
+      if(cur){
+        this.curPage = cur;
+      }
+      if(info){
+        this.isEdit = true;
+        this.orgName = info.orgName;
+        this.link='/admin/LT-YRZCGXX';
+        this.form.email = info.email;
+        this.form.linkman = info.linkman;
+        this.form.organizationId = info.orgId;
+        this.form.position = info.position;
+        this.form.userName = info.userName;
+        this.form.userId = info.userId;
+      }
+    },
+    methods: {
+      getOrgList() {       //获取机构列表
+        api.getOrgList({organizationName: ''}).then((res) => {
+          if (res.data.code == '0') {
+            this.orgList = res.data.data;
+          }
+        });
+      },
+      editAdmin(){
+        this.$refs.form.validate((valid)=> {
+          if (valid) {
+            api.updateUserInfoAll(this.form).then((res) => {
+              if (res.data.code == '0') {
+                this.$message({showClose: true,message: "修改成功", type: 'success'});
+                this.$router.push({path: '/admin/LT-YRZCGXX'});
+              } else {
+                this.$message({
+                  showClose: true,
+                  message: res.data.msg,
+                  type: 'warning'
+                });
+              }
+            }).catch((error) => {
+              this.$message({
+                showClose: true,
+                message: "服务器正忙...",
+                type: 'warning'
+              });
+            })
+          }
+        });
+      },
+      addAdmin() {
+        this.$refs.form.validate((valid)=>{
+          if(valid){
+            api.addAdmin(this.form).then((res) => {
+              if (res.data.code == '0') {
+                this.$message({showClose: true,message: "添加成功", type: 'success'});
+                this.$router.push({path: '/admin/LT-YRZCGXX'});
+              } else {
+                this.$message({
+                  message: res.data.msg,
+                  type: 'warning'
+                });
+              }
+            }).catch((error) => {
+              this.$message({
+                showClose: true,
+                message: '服务器正忙...',
+                type: 'warning'
+              });
+            })
+            }
+          });
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+    @import "../../less/admin.less";
+
+    .add-admin-form {
+        background: #fff;
+        padding: 20px 10px 30px;
+
+    &> div {
+        margin-left: 9px;
+    }
+
+    }
+    h4 {
+        text-indent: 20px;
+        font-size: 15px;
+        margin-bottom: 20px;
+    }
+</style>

+ 209 - 0
src/components/admin/AddOrganization.vue

@@ -0,0 +1,209 @@
+<!-- 添加机构信息 By_liucf -->
+<template>
+    <div>
+        <crumbs title="机构信息-添加机构" linkTo="/admin/LT-KHZX-JGXX">
+        </crumbs>
+        <div class="contents">
+          <!--<img src="../../images/return.png" height="18" width="18" class="back" @click="back">-->
+            <el-form ref="form" :model="form" :rules="rules" label-width="120" class="add-admin-form">
+                <h4>基本信息</h4>
+                <el-form-item label="机构名称:" prop="organizationName">
+                    <el-input v-model="form.organizationName" placeholder="请输入机构名称"></el-input>
+                </el-form-item>
+                <el-form-item label="机构负责人:" prop="principal" required>
+                    <el-input v-model="form.principal" placeholder="请输入机构负责人姓名"></el-input>
+                </el-form-item>
+                <el-form-item label="机构所在地:" prop="address" >
+                    <el-input v-model="form.address" placeholder="请输入机构所在地"></el-input>
+                </el-form-item>
+                <el-form-item label="机构属性:" prop="type">
+                    <el-select v-model="form.type" placeholder="请选择机构">
+                        <el-option v-for="item in orgList" :key="item.key" :label="item.name" :value="item.key">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="下属机构数量:" prop="subNum">
+                    <el-input v-model="form.subNum" placeholder="请输入下属机构数量" @change="handleNumInput"></el-input>
+                </el-form-item>
+                <el-button size="small" type="primary" @click="addOrga">确定添加</el-button>
+            </el-form>
+        </div>
+    </div>
+</template>
+
+<script>
+  import adminApi from '@api/admin.js';
+  import utils from '@api/utils.js';
+
+  export default {
+    name: 'AddOrganization',
+    data(){
+      const principalVaild = (rule, value, callback) => {
+        if (!value) {
+          return callback(new Error('请输入机构负责人'));
+        }
+        if (value.length > 10) {
+           this.form.principal = value.substr(0, 10);
+           this.$message({
+             showClose: true,
+             type: 'warning',
+             message: '机构负责人最多可输入10个字'
+           })
+        }
+        callback();
+      };
+      const addressVaild = (rule, value, callback) => {
+        if (!value) {
+          return callback(new Error('请输入机构所在地'));
+        }
+        if (value.length > 60) {
+           this.form.address = value.substr(0, 60);
+           this.$message({
+             showClose: true,
+             type: 'warning',
+             message: '机构所在地最多可输入60个字'
+           })
+        }
+        callback();
+      };
+      const organizationNameVaild = (rule, value, callback) => {
+        if (!value) {
+          return callback(new Error('请输入机构名称'));
+        }
+        if (value.length > 20) {
+           this.form.organizationName = value.substr(0, 20);
+           this.$message({
+             showClose: true,
+             type: 'warning',
+             message: '机构名称最多可输入20个字'
+           })
+        }
+        callback();
+      };
+      const subNumVaild = (rule, value, callback) => {
+        const numReg = new RegExp(/[^\d]/g);
+        if(numReg.test(value) || this.form.subNum < 0){
+          this.form.subNum = null;
+        }
+        if (value && value.length > 5) {
+           this.form.subNum = value.substr(0, 5);
+           this.$message({
+             showClose: true,
+             type: 'warning',
+             message: '下属机构数量超出最大限制'
+           })
+        }
+        callback();
+      };
+      return {
+        orgList:[],
+        form: {
+          principal: '',//负责人
+          address: '',
+          subNum: null,
+          organizationName: '',
+          type: ''
+        },
+        rules: {
+          principal:[
+            { validator: principalVaild, trigger: ['blur', 'change'] }
+          ],
+          address:[
+            { required: true, validator: addressVaild, trigger: ['blur', 'change'] }
+          ],
+          organizationName:[
+            { required: true, validator: organizationNameVaild, trigger: ['blur', 'change'] },
+            { required: true, message: '请输入机构名称', trigger: ['blur', 'change'] }
+          ],
+          type:[
+            { required: true, message: '请选择机构属性', trigger: ['blur', 'change'] }
+          ],
+          subNum: [
+            { validator: subNumVaild, trigger: ['blur', 'change'] }
+          ]
+        }
+      }
+    },
+    created() {
+      const enumsList = JSON.parse(localStorage.getItem('enumsData'));
+      this.orgList = enumsList.organizationTypeEnum;
+    },
+    methods: {
+      handleNumInput(){//机构数量只能数字
+        const numReg = new RegExp(/[^\d]/g);
+        if(numReg.test(this.form.subNum) || this.form.subNum < 0){
+          this.form.subNum = null;
+        }
+      },
+      addOrga() {
+        this.$refs.form.validate((valid)=> {
+          if (valid) {
+            adminApi.addOrganization(this.form).then((res) => {
+              if (res.data.code == '0') {
+                this.$message({showClose: true,message: "添加成功", type: 'success'});
+                this.$router.push({path: 'LT-KHZX-JGXX'});
+              } else {
+                this.$message({
+                  showClose: true,
+                  message: res.data.msg,
+                  type: 'warning'
+                });
+              }
+            }).catch((error) => {
+              this.$message({
+                showClose: true,
+                message: "服务器正忙...",
+                type: 'warning'
+              });
+            })
+          }
+        });
+      },
+      back(){
+        this.$router.go(-1);
+      },
+      handleNumInput(){//机构数量只能数字
+        const numReg = new RegExp(/[^\d]/g);
+        if(numReg.test(this.form.subNum) || this.form.subNum < 0){
+          this.form.subNum = null;
+        }
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+    @import "../../less/admin.less";
+
+    .add-admin-form {
+        background: #fff;
+        padding: 20px 10px 30px;
+
+    &
+    > div {
+        margin-left: 9px;
+    }
+
+    }
+    h4 {
+        text-indent: 20px;
+        font-size: 15px;
+        margin-bottom: 20px;
+    }
+  .el-button{
+    margin: 30px 0 0 20px;
+  }
+  .el-dropdown{
+    margin-bottom: 15px;
+  }
+  .contents{
+    position: relative;
+    .back{
+      position: absolute;
+      top: 10px;
+      left: 5px;
+      z-index: 7;
+      cursor: pointer;
+    }
+  }
+</style>

+ 214 - 0
src/components/admin/AddProductLine.vue

@@ -0,0 +1,214 @@
+<template>
+    <div>
+        <!-------------面包屑-------------->
+        <crumbs :title="`产品线管理-${isEdit?'修改':'添加'}产品线`" linkTo="/admin/LT-CPXGL">
+        </crumbs>
+        <!--------------表单--------------->
+        <div class="contents">
+            <el-form ref="form" :rules="rules" :model="form" label-width="80px" class="add-product-form">
+                <h4>基本信息</h4>
+                <el-form-item label="产品名称" required prop="name">
+                    <el-input class="inp" v-model="form.name" size="small"></el-input>
+                </el-form-item>
+                <el-form-item label="URL" prop="url" size="small" style="margin-top: 15px;" required>
+                    <el-input class="inp" v-model="form.url" :disabled="isEdit?true:false" maxlength="2083"></el-input>
+                </el-form-item>
+                <el-form-item label="是否试用" prop="trialStatus" required style="margin-bottom: 16px;">
+                    <el-radio-group v-model="form.trialStatus" :disabled="isEdit?true:false">
+                        <el-radio :label="1">是</el-radio>
+                        <el-radio :label="0">否</el-radio>
+                    </el-radio-group>
+                </el-form-item>
+                <el-form-item v-if="form.trialStatus=='1'" label="试用URL" prop="trialUrl" size="small" style="margin-top: 10px;" required>
+                    <el-input class="inp" v-model="form.trialUrl" :disabled="isEdit?true:false" maxlength="2083"></el-input>
+                </el-form-item>
+                <el-form-item label="产品描述" prop="decription" required class="adjust-error">
+                    <el-input type="textarea"
+                              v-model="form.decription"
+                              placeholder="请填写描述文档"
+                              style="width: 300px;"
+                            ></el-input>
+                </el-form-item>
+                <el-form-item label="接入模式" required prop="accessType">
+                    <el-checkbox-group v-model="form.accessType" :disabled="isEdit?true:false">
+                        <el-checkbox v-for="(it,index) in accessType" :label="it.key+''" name="accessType">{{it.name}}</el-checkbox>
+                    </el-checkbox-group>
+                </el-form-item>
+                <el-form-item label="收费模式" required prop="chargeType" style="margin-bottom: 10px;">
+                    <el-checkbox-group v-model="form.chargeType" :disabled="isEdit?true:false">
+                        <el-checkbox  v-for="(it,index) in chargeType" :label="it.key+''" name="chargeType">{{it.name}}</el-checkbox>
+                    </el-checkbox-group>
+                </el-form-item>
+                <el-form-item>
+                    <el-button size="small" type="primary" @click="addProductLine">确定{{isEdit?'修改':'添加'}}</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+    </div>
+</template>
+
+<script>
+  import api from '@api/admin.js';
+  import utils from '@api/utils.js';
+
+  export default {
+    name: 'add-product-line',
+    data: function () {
+      const urlValidate = (rule,value,callback)=>{
+        if(!value){
+          return callback(new Error('请输入URL'));
+        }
+        if(!utils.url.test(value)){
+          return callback(new Error('请输入正确的URL'));
+        }
+        callback();
+      };
+      const nameValidate = (rule, value, callback) => {
+        if (!value) {
+          return callback(new Error('请输入产品名称'));
+        }
+        if (value.length > 44) {
+           this.form.name = value.substr(0, 44);
+           this.$message({
+             showClose: true,
+             type: 'warning',
+             message: '产品名称最多可输入44个字'
+           })
+        }
+        callback();
+      };
+      const decriptionValidate = (rule, value, callback) => {
+        if (!value) {
+          return callback(new Error('请输入产品描述'));
+        }
+        if (value.length > 200) {
+           this.form.decription = value.substr(0, 200);
+           this.$message({
+             showClose: true,
+             type: 'warning',
+             message: '产品描述最多可输入200个字'
+           })
+        }
+        callback();
+      };
+      return {
+        accessType:[],
+        accessType:[],
+        isEdit:false,
+        form: {
+          name: '',
+          url: '',
+          accessType: [],
+          chargeType: [],
+          decription: '',
+          trialStatus: '',
+          trialUrl:''
+        },
+        rules:{
+            name:[
+                { required: true,  validator: nameValidate, trigger: ['blur', 'change'] }
+            ],
+            accessType:[
+                { required: true, message: '请选择接入模式', trigger: ['blur', 'change'] }
+            ],
+            chargeType:[
+                { required: true, message: '请选择收费模式', trigger: ['blur', 'change'] }
+            ],
+            decription:[
+                { required: true, validator: decriptionValidate, trigger: ['blur', 'change'] }
+            ],
+            trialStatus:[
+                { required: true, message: '请选择是否试用', trigger: ['blur', 'change'] }
+            ],
+            trialUrl:[
+              { validator: urlValidate, trigger: ['blur', 'change'] }
+            ],
+            url:[
+              { validator: urlValidate, trigger: ['blur', 'change'] }
+            ],
+        }
+      }
+    },
+    created() {
+      //获取枚举类型
+      const enums = JSON.parse(localStorage.getItem('enumsData'));
+      this.accessType = enums.accessTypeEnum;
+      this.chargeType = enums.chargeTypeEnum;
+      //编辑时获取参数
+      console.log(this.$route.params);
+      const info = this.$route.params.info;
+      if(info){
+        this.isEdit = true;
+        this.form.accessType = info.accessType.split(",");
+        this.form.chargeType = info.chargeType.split(",");
+        this.form.decription = info.decription;
+        this.form.url = info.url;
+        this.form.name = info.name;
+        this.form.trialStatus = info.trialStatus;
+        this.form.id = info.id;
+        this.form.trialUrl = info.trialUrl;
+      }
+    },
+    methods: {
+      addProductLine() {
+        this.$refs.form.validate((valid)=>{
+          if(valid){
+            const req = this.isEdit?api.editProductLine:api.addProductLine;
+            let param = Object.assign({},this.form);
+            param.accessType = this.form.accessType.join(",");
+            param.chargeType = this.form.chargeType.join(",");
+            req(param).then((res) => {
+              if (res.data.code == '0') {
+                this.$message({showClose: true,message: "操作成功", type: 'success'});
+                this.$router.push({path: '/admin/LT-CPXGL'});
+              }else {
+                this.$message({
+                  showClose: true,  
+                  message: res.data.msg,
+                  type: 'warning'
+                });
+                if(res.data.code == '00020001'){        //产品不存在,跳转到产品线管理页面
+                  this.$router.push({path:'/admin/LT-CPXGL'});
+                }
+              }
+            }).catch((error) => {
+              this.$message({
+                showClose: true,
+                message: "服务器正忙...",
+                type: 'warning'
+              });
+            })
+        }
+      });
+      }
+    }
+  }
+</script>
+
+<style lang="less">
+    .add-product-form .adjust-error{
+        margin-bottom:10px;
+    .el-form-item__error{
+        top:100%;
+    }
+    }
+</style>
+
+<style lang="less" scoped>
+    @import "../../less/admin.less";
+    .add-product-form {
+        background: #fff;
+        padding: 20px 10px 30px;
+    .inp{
+        width: 300px;
+    }
+    & > div {
+          margin-left: 9px;
+      }
+    }
+    h4 {
+        text-indent: 20px;
+        font-size: 15px;
+        margin-bottom: 20px;
+    }
+</style>

+ 396 - 0
src/components/admin/AuthedAdmin.vue

@@ -0,0 +1,396 @@
+<template>
+    <div>
+        <crumbs title="已认证超管信息">
+            <el-form :inline="true">
+                <el-form-item label="审核时间:">
+                    <el-date-picker v-model="filter.time"
+                                    size="mini"
+                                    value-format="yyyy-MM-dd HH:mm:ss"
+                                    :default-time="['00:00:01', '23:59:59']"
+                                    type="daterange"
+                                    start-placeholder="开始日期"
+                                    end-placeholder="结束日期"></el-date-picker>
+                </el-form-item>
+                <el-form-item label="机构名称:">
+                    <el-input v-model="filter.orgName" clearable size="mini" placeholder="机构名称"></el-input>
+                </el-form-item>
+                <el-form-item label="手机号:">
+                    <el-input v-model="filter.userName" clearable size="mini" placeholder="手机号"></el-input>
+                </el-form-item>
+                <el-form-item>
+                    <el-button size="mini" @click="filterDatas">确认</el-button>
+                    <el-button size="mini" type="primary" @click="exportData">导出</el-button>
+                </el-form-item>
+            </el-form>
+        </crumbs>
+        <div class="contents">
+            <el-table :data="list"
+                      border
+                      @expand-change="showPickup"
+                      :row-class-name="proLineRow">
+                <el-table-column
+                        type="index"
+                        :index="indexMethod"
+                        label="编号"
+                        width="60">
+                </el-table-column>
+                <el-table-column
+                        prop="userGmtCreate"
+                        label="注册时间"
+                        :show-overflow-tooltip="true"
+                        width="120">
+                </el-table-column>
+                <el-table-column
+                        prop="passauthTime"
+                        :show-overflow-tooltip="true"
+                        label="审核通过时间"
+                        width="120">
+                </el-table-column>
+                <el-table-column
+                        prop="linkman"
+                        label="超管名称">
+                </el-table-column>
+                <el-table-column
+                        prop="orgName"
+                        label="所在机构"
+                        width="120"
+                >
+                </el-table-column>
+                <el-table-column
+                        prop="position"
+                        label="岗位名称">
+                </el-table-column>
+                <el-table-column
+                        prop="userName"
+                        label="手机号"
+                        :show-overflow-tooltip="true"
+                        width="100">
+                </el-table-column>
+                <el-table-column
+                        prop="email"
+                        :show-overflow-tooltip="true"
+                        width="140"
+                        label="邮箱">
+                </el-table-column>
+                <el-table-column
+                        prop="authStatusStr"
+                        label="状态">
+                </el-table-column>
+                <el-table-column
+                        label="操作"
+                        width="100">
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="toEditAdmin(scope.row)">修改</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button type="text" size="small" @click="showDelDialog(scope.row.userId)">删除</el-button>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                        label="已开通功能"
+                        width="100">
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" :disabled="!scope.row.userAndProdutUDTO||scope.row.userAndProdutUDTO.length==0">{{scope.row.isExpand?"收起":"展开"}}</el-button>
+                    </template>
+                </el-table-column>
+                <el-table-column type="expand" width="15">
+                    <!---------详情展开内容------------>
+                    <template slot-scope="scope" v-if="scope.row.userAndProdutUDTO&&scope.row.userAndProdutUDTO.length>0">
+                        <el-table :data="scope.row.userAndProdutUDTO">
+                            <el-table-column label="编号"
+                                             type="index"
+                                             width="60"
+                                             :index="indexMethod"></el-table-column>
+                            <!--<el-table-column label="开通时间" prop="startTime" width="180"></el-table-column>-->
+                            <el-table-column label="接入方式">
+                                <template slot-scope="access">
+                                    {{access.row.accessType.join(',')}}
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="结算方式">
+                                <template slot-scope="charge">
+                                    {{charge.row.chargeType.join(',')}}
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="开通功能" prop="productName"></el-table-column>
+                            <el-table-column label="产品服务有效期" prop="endTime" width="260">
+                                <template slot-scope="times">
+                                    {{times.row.startTime.substr(0,10)}}~{{times.row.endTime.substr(0,10)}}
+                                </template>
+                            </el-table-column>
+                            <!--<el-table-column label="操作">
+                                <template slot-scope="detail">
+                                    <el-popover
+                                            placement="top-start"
+                                            width="180"
+                                            trigger="click">
+                                        <el-form label-position="top" :inline="true">
+                                            <el-form-item label="服务开始时间">
+                                                <el-date-picker size="mini" type="date"
+                                                           :value-format="yyyy-MM-dd"
+                                                           placeholder="选择开始时间"
+                                                           v-model="startT"
+                                                           style="width: 100%;"></el-date-picker>
+                                            </el-form-item>
+                                            <el-form-item label="服务结束时间">
+                                                <el-date-picker size="mini" type="date"
+                                                           value-format="yyyy-MM-dd"
+                                                           placeholder="选择结束时间"
+                                                           v-model="endT"
+                                                           style="width: 100%;"></el-date-picker>
+                                            </el-form-item>
+                                            <div style="text-align: center">
+                                                <el-button type="primary" size="mini" @click="reBuyProduct(scope.row.productId,scope.row.userId)">确定</el-button>
+                                            </div>
+                                        </el-form>
+                                        <el-button slot="reference" size="mini">续费</el-button>
+                                    </el-popover>
+                                    <el-button type="text" size="small" @click="showDelDetail(detail.row,scope.row.userAndProdutUDTO,detail.$index)">删除功能</el-button>
+                                </template>
+                            </el-table-column>-->
+                            <el-table-column label="状态" width="80">
+                                <template slot-scope="scope">
+                                    <span v-if="scope.row.serviceStatus==0">已停用</span>
+                                    <span v-if="scope.row.serviceStatus==1">已启用</span>
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="操作" width="60">
+                                <template slot-scope="scope">
+                                    <el-button v-if="scope.row.serviceStatus==0" type="text" size="small" @click="updateServiceStatus(scope.row,1)">启用</el-button>
+                                    <el-button v-if="scope.row.serviceStatus==1" type="text" size="small" @click="updateServiceStatus(scope.row,0)">停用</el-button>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+                    </template>
+                    <!---------详情展开内容end------------>
+                </el-table-column>
+            </el-table>
+        </div>
+        <el-pagination v-if="total>pageSize"
+                       :current-page.sync="currentPage"
+                       @current-change="currentChange"
+                       background
+                       :page-size="pageSize"
+                       layout="total,prev, pager, next, jumper"
+                       :total="total">
+        </el-pagination>
+    </div>
+</template>
+
+<script>
+  import api from '@api/admin.js';
+  import utils from '@api/utils.js';
+
+  export default {
+    name: 'authed-admin',
+    data: function () {
+      return {
+        dialogFormVisible: false,
+        rejectReason: '',
+        startT:'',
+        endT:'',
+        type:'',
+        currentId: '',
+        status:'',
+        list: [],
+        cacheData: {},
+        currentPage: 1,
+        pageSize: 10,
+        total: 0,
+        filter: {
+          time: [],
+          orgName: '',
+          userName: ''
+        }
+      }
+    },
+    created() {
+      const cur = this.$route.params&&this.$route.params.currentPage;
+      if(cur){
+        this.currentPage = cur;
+      }
+      this.getDataList();
+    },
+    methods: {
+      showPickup(row){
+        row.isExpand = !row.isExpand;
+      },
+      proLineRow(row){
+        const disable = row.row.userAndProdutUDTO&&row.row.userAndProdutUDTO.length>0;
+        if(!disable){         //不能展开
+          return 'pro-line-disable';
+        }else{
+          return '';
+        }
+      },
+      warning(msg,type){
+        this.$message({
+          showClose: true,
+          message:msg,
+          type:type||'warning'
+        })
+      },
+      showConfirmDialog(msg,resolve){
+        this.$alert(msg, '提示', {
+          confirmButtonText: '确定',
+          type: 'warning'
+        }).then(() => {
+          resolve();
+        }).catch(() => {});
+      },
+      reBuyProduct(productId,userId){
+        const param = {
+          productId,
+          userId,
+          endTime:this.endT
+        };
+        api.reBuyProduct(param).then((res) => {
+          if (res.data.code == '0') {
+            this.warning(res.data.msg || '操作成功', 'success');
+          } else {
+            this.warning(res.data.msg || '操作失败');
+          }
+        }).catch((error) => {
+          this.warning("服务器正忙...");
+        });
+      },
+      showDelDetail(row,data,index){
+        this.showConfirmDialog('确定要删除该功能吗?',()=> {
+          api.delAdminDetail({productId:row.productId, userId:row.userId}).then((res) => {
+            if (res.data.code == '0') {
+              this.warning(res.data.msg || '操作成功', 'success');
+              data.splice(index,1);         //删除成功后删除数据
+            } else {
+              this.warning(res.data.msg || '操作失败');
+            }
+          }).catch((error) => {
+            this.warning("服务器正忙...");
+          });
+        });
+      },
+      updateServiceStatus(row,serviceStatus){
+        const status=serviceStatus==0?'停用':'启用';
+        this.showConfirmDialog('确定要'+status+'该功能吗?',()=> {
+          api.startAndendByuserId({productId:row.productId,userId: row.userId, serviceStatus}).then((res) => {
+            if (res.data.code == '0') {
+              row.serviceStatus = serviceStatus;
+              this.warning(res.data.msg || '操作成功', 'success');
+            } else {
+              this.warning(res.data.msg || '操作失败');
+            }
+          }).catch((error) => {
+            this.warning("服务器正忙...");
+          });
+        });
+      },
+      toEditAdmin(row){
+        //传参必须用命名路由
+        this.$router.push({
+          name:'addAdmin',
+          params:{info:row,currentPage:this.currentPage}
+        })
+      },
+      showDelDialog(id){
+        this.$alert('确定要删除吗?', '提示', {
+          confirmButtonText: '确定',
+          callback: action => {
+            if(action == 'confirm'){
+              api.delSuperAdmin({id}).then((res)=>{
+                if(res.data.code=='0'){
+                  this.warning(res.data.msg||'操作成功','success');
+                  this.getDataList(); //操作成功刷新列表
+                }else{
+                  this.warning(res.data.msg);
+                }
+              }).catch((error)=>{
+                this.warning("服务器正忙...");
+              });
+
+            }
+          }
+        });
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      filterDatas(){
+        this.currentPage = 1;
+        this.getDataList();
+      },
+      getDataList() {
+        const param = this.getFilterItems();
+        api.getAuthenticated(param).then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            this.list = data.records;       //当前页显示的数据
+            this.cacheData[param.current] = data.records;       //缓存数据
+            this.total = data.total;
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      currentChange(next) {          //切换当前页
+        this.currentPage = next;
+        if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
+          this.list = this.cacheData[next];
+        } else {
+          this.getDataList();
+        }
+      },
+      getFilterItems() {           //筛选
+        const time = this.filter.time;
+        const startTime = time&&time[0]||undefined;
+        const endTime = time&&time[1]||undefined;
+        const param = {
+          startTime,
+          endTime,
+          userName: this.filter.userName||undefined,
+          orgName: this.filter.orgName||undefined,
+          current: this.currentPage,
+          size: this.pageSize
+        };
+        return param;
+      },
+      exportData() {             //导出
+        const canExport = utils.exportCondition(this.filter.time);
+        if(typeof canExport == 'string'){
+          this.$message({
+            showClose: true,
+            message:canExport,
+            type:'warning'
+          });
+          return;
+        }
+        let param = this.getFilterItems();
+        param.autStatus = 1;        //已认证
+        api.exportAuthedAdmin(param).then((res) => {
+          if (res.data.code = '0') {
+            utils.downloadExportedData(res.data, '已认证超管信息表.xls');
+            this.$message({showClose: true,message: "导出成功", type: 'success'});
+          } else {
+            this.$message({
+              showClose: true,
+              message: res.data.msg,
+              type: 'warning'
+            });
+          }
+        }).catch((error) => {
+          this.$message({
+            showClose: true,
+            message: "服务器正忙...",
+            type: 'warning'
+          });
+        });
+      }
+    }
+  }
+</script>
+
+<style lang="less">
+    @import "../../less/admin.less";
+    .pro-line-disable{
+        .el-table__expand-column .cell{
+            display: none;
+        }
+    }
+</style>

+ 216 - 0
src/components/admin/ChangePwd.vue

@@ -0,0 +1,216 @@
+<template>
+	<div class="changePwds">
+		<MiniTitle>
+			<div slot="mini" class="miniTit">
+			<img src="../../images/return.png" height="18" width="18" class="back" @click="back">
+			个人中心——修改密码
+			</div>
+		</MiniTitle>
+	<div class="changePwd">
+		<h4>账户安全</h4>
+		<div class="contentPwd">
+			<el-form :model="ruleForm2" :rules="rules2" ref="ruleForm2" label-width="100px" class="demo-ruleForm">
+				<el-form-item label="旧密码" prop="pass">
+					<el-input type="password" ref="pass" v-model="ruleForm2.pass" autocomplete="off" clearable></el-input>
+				</el-form-item>
+				<el-form-item label="新密码" prop="checkPass">
+					<el-input type="password" ref="checkPass" v-model="ruleForm2.checkPass" autocomplete="off" clearable></el-input>
+				</el-form-item>
+				<el-form-item label="再次输入密码" prop="newPass">
+					<el-input type="password" ref="newPass" v-model="ruleForm2.newPass" clearable></el-input>
+				</el-form-item>
+				<el-form-item>
+					<button class="subBtn" @click="submitForm('ruleForm2')">确定</button>
+					<!-- <button class="subBtn2" @click="resetForm('ruleForm2')">重置</button> -->
+				</el-form-item>
+			</el-form>
+		</div>
+	</div>
+	</div>
+</template>
+
+<script>
+	import api from '../../api/admin.js';
+	import MiniTitle from '../common/MiniTile.vue';
+    import md5 from 'js-md5';
+	
+	export default {
+		components: {
+			MiniTitle
+		},
+		data() {
+			var validatePass = (rule, value, callback) => {
+				if (value.trim() == '') {
+					callback(new Error('请输入旧密码'));
+					this.ruleForm2.pass = "";
+				} else if (value.length < 6) {
+					callback(new Error('密码长度不少于6位'));
+				} else if (value.length > 16) {
+                  callback(new Error('密码长度不大于16位'));
+                } else {
+					callback();
+				}
+			};
+			var validatePass2 = (rule, value, callback) => {
+				const numreg = /^(?![0-9]+$)(?![a-zA-Z]+$)/;
+				if (value.trim() == '') {
+					callback(new Error('请输入新密码'));
+					this.ruleForm2.checkPass = "";
+				} else if (value.length < 6) {
+					callback(new Error('密码长度不少于6位'));
+				} else if (value.length > 16) {
+                  callback(new Error('密码长度不大于16位'));
+                } else if (value == this.ruleForm2.pass) {
+					callback(new Error('新旧密码不能相同!'));
+				} else if (!numreg.test(value)) {
+				 	callback(new Error('密码不能为纯数字或纯英文'));
+				} else {
+					callback();
+				}
+			};
+			var validatePass3 = (rule, value, callback) => {
+				if (value === '' || value === ' ') {
+					callback(new Error('请再次输入新密码'));
+					this.ruleForm2.newPass = "";
+				} else if (value !== this.ruleForm2.checkPass) {
+					callback(new Error('两次输入密码不一致!'));
+					console.log(this.ruleForm2.checkPass)
+				} else {
+					callback();
+				}
+			};
+			return {
+				ruleForm2: {
+					pass: '',
+					checkPass: '',
+					newPass: ''
+				},
+				rules2: {
+					pass: [{
+						required: true,
+						validator: validatePass,
+						trigger: ['blur', 'change']
+					}],
+					checkPass: [{
+						required: true,
+						validator: validatePass2,
+						trigger: ['blur', 'change']
+					}],
+					newPass: [{
+						required: true,
+						validator: validatePass3,
+						trigger: ['blur', 'change']
+					}]
+				}
+			};
+		},
+		computed: {
+
+		},
+		methods: {
+			  back(){
+				this.$router.go(-1);
+			  },
+			submitForm(formName) {
+				const params = {
+					"password": md5(this.ruleForm2.pass), //req
+					"modifyPassword": md5(this.ruleForm2.checkPass), //req
+				};
+				this.$refs[formName].validate((valid) => {
+					if (valid) {
+						api.midifyPassword(params).then((res) => {
+							if (res.data.code == '0') {
+								this.$message({
+									showClose: true,
+									message: '密码修改成功!',
+									type: 'success',
+									duration: 1000
+								});
+                              	this.$router.push({path: '/'})
+							}else{
+								this.$message({
+									showClose: true,
+									message: res.data.msg,
+									type: 'error'
+								});
+							}
+						}).catch((error) => {
+							console.log(error)
+						});
+					} else {
+						console.log('error');
+						return false;
+					}
+				});
+			},
+			resetForm(formName) {
+				this.$refs[formName].resetFields();
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+
+	.back{
+		vertical-align: middle;
+		cursor: pointer;
+	}
+	.changePwd {
+		margin-left: 20px !important;
+		background-color: #fff;
+		margin-right: 20px !important;
+		margin-top: 20px !important;
+		font-size: 12px !important;
+
+		h4 {
+			font-size: 14px;
+			padding-top: 20px;
+			margin-left: 30px;
+			margin-bottom: 35px;
+		}
+
+		.contentPwd {
+			width: 300px;
+			padding-bottom: 30px;
+		}
+
+		.el-input__inner {
+			height: 35px;
+		}
+
+		.el-form-item__label {
+			font-size: 12px;
+		}
+		.subBtn{
+			width: 80px;
+			height: 30px;
+			background: #409eff;
+			font-size: 12px;
+			color: #fff;
+			border-radius: 3px;
+			border: 0;
+			outline: none;
+			cursor: pointer;
+		}
+		.subBtn2{
+			width: 80px;
+			height: 30px;
+			border: 1px solid #ccc;
+			background: #fff;
+			color: #606266;
+			font-size: 12px;
+			border-radius: 3px;
+			outline: none;
+			cursor: pointer;
+			margin-left: 20px;
+		}
+	}
+	.changePwds{
+		.miniTit{
+			font-size: 14px;
+			font-weight: bold;
+			margin-left: 20px;
+		}
+	}
+</style>

+ 110 - 0
src/components/admin/Console.vue

@@ -0,0 +1,110 @@
+<template>
+    <div>
+        <crumbs title="控制台"></crumbs>
+        <div class="console">
+            <h2>平台数据</h2>
+            <el-row :gutter="20">
+                <el-col :span="6">
+                    <router-link to="/admin/LT-DDXT-CPXSQLB" query="{status:'0'}">
+                        <div class="card">
+                            <h3>待审核订单数量</h3>
+                            <div class="count">
+                                <span>总计</span>
+                                <span class="num"><b>{{orderCount}}</b>个</span>
+                            </div>
+                        </div>
+                    </router-link>
+                </el-col>
+                <el-col :span="6">
+                    <router-link to="/admin/LT-KHZX-CGXX">
+                        <div class="card">
+                            <h3>待认证账号数量</h3>
+                            <div class="count">
+                                <span>总计</span>
+                                <span class="num"><b>{{authCount}}</b>个</span>
+                            </div>
+                        </div>
+                    </router-link>
+                </el-col>
+            </el-row>
+        </div>
+    </div>
+</template>
+
+<script>
+  import api from '@api/admin.js';
+
+  export default {
+    name: 'admin-console',
+    data: function () {
+      return {
+        orderCount: '...',
+        authCount: '...'
+      }
+    },
+    created() {
+      api.getOrderNum().then((res) => {
+        const result = res.data;
+        if (result.code == '0') {
+          this.orderCount = result.data.count;
+        }
+      }).catch((error) => {
+        console.log(error)
+      });
+      api.getAuthNum().then((res) => {
+        const result = res.data;
+        if (result.code == '0') {
+          this.authCount = result.data.count;
+        }
+      }).catch((error) => {
+        console.log(error)
+      });
+
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+    @import '../../less/common.less';
+
+    .console {
+        padding: 60px 20px 0;
+    }
+
+    h2 {
+        color: #999;
+        font-size: 14px;
+        font-weight: normal;
+        margin-bottom: 15px;
+    }
+
+    .card {
+        border: 1px @gray solid;
+        box-shadow: 0 0 1px @shadowColor;
+        border-radius: @borderWidth;
+        padding: 15px;
+        background: #fff;
+        cursor: pointer;
+        color: @baseFontColor;
+    }
+
+    .count {
+        font-size: 12px;
+        color: #aaa;
+
+    .num {
+        color: @adminBase;
+
+    b {
+        font-size: 30px;
+        margin: 0 5px;
+    }
+
+    }
+
+    }
+    h3 {
+        font-size: 14px;
+        margin-bottom: 15px;
+    }
+</style>

+ 139 - 0
src/components/admin/ModifinedOrga.vue

@@ -0,0 +1,139 @@
+<!-- 添加机构信息 By_liucf -->
+<template>
+    <div>
+        <crumbs title="机构信息-修改机构" linkTo="/admin/LT-KHZX-JGXX">
+        </crumbs>
+        <div class="contents">
+            <el-form ref="form" :model="form" :rules="rules" label-width="110px" class="add-admin-form">
+                <h4>基本信息</h4>
+                <el-form-item label="机构名称:"><el-input v-model="form.orgName" :disabled="true"></el-input></el-form-item>
+                <el-form-item label="机构负责人:" ><el-input v-model="form.orgPrincipal" :disabled="true"></el-input></el-form-item>
+                <el-form-item label="机构所在地:" prop="orgAddress" required >
+                    <el-input v-model="form.orgAddress" placeholder="请输入机构所在地"></el-input>
+                </el-form-item>
+                <el-form-item label="机构属性:" required>
+                    <el-select v-model="form.orgType" placeholder="请选择机构">
+                        <el-option v-for="item in orgList" :key="item.key" :label="item.name" :value="item.key">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="下属机构数量:">
+                    <!--<el-input v-model="form.orgSubNum" placeholder="请输入下属机构数量" @blur="handleNumInput"></el-input>-->
+                    {{form.orgSubNum}}
+                </el-form-item>
+                <el-button size="small" type="primary" @click="modifineOrga">确定修改</el-button>
+            </el-form>
+        </div>
+    </div>
+</template>
+
+<script>
+  import api from '../../api/index.js';
+  import adminApi from '@api/admin.js';
+  import utils from '@api/utils.js';
+
+  export default {
+    name: 'ModifinedOrga',
+    data(){
+      return {
+        orgList:[],
+        form: {
+          orgPrincipal: '',//负责人
+          orgAddress: '',
+          orgSubNum: null,
+          orgName: '',
+          orgType: '',
+          orgId:''
+        },
+        rules: {
+          orgAddress: [
+            {required:true, message: '请输入机构所在地', trigger: ['blur', 'change']}
+          ]
+        }
+      }
+    },
+    created() {
+      const info = this.$route.query.info;console.log(info)
+      this.form.orgId = info.orgId;
+      this.form.orgName = info.orgName;
+      this.form.orgPrincipal = info.orgPrincipal;
+      this.form.orgAddress = info.orgAddress;
+      this.form.orgType = info.orgType;
+      this.form.orgSubNum = info.orgSubNum;
+      const enumsList = JSON.parse(localStorage.getItem('enumsData'));
+      this.orgList = enumsList.organizationTypeEnum;
+    },
+    methods: {
+      modifineOrga() {
+        if(this.form.orgAddress && this.form.orgAddress.trim() && this.form.orgType!==''){
+          adminApi.modifineOrganization(this.form).then((res) => {
+          if (res.data.code == '0') {
+            this.$message({showClose: true, message: "修改成功", type: 'success'});
+            this.$router.push({path: 'LT-KHZX-JGXX'});
+          } else {
+            this.$message({
+              showClose: true,
+              message: res.data.msg,
+              type: 'warning'
+            });
+          }
+        }).catch((error) => {
+          this.$message({
+            showClose: true,
+            message: "服务器正忙...",
+            type: 'warning'
+          });
+        })
+      }else{
+        this.$message({
+          showClose: true,
+          message: '请完整填写机构信息',
+          type: 'warning'
+        });
+      }
+      },
+      handleNumInput(){//机构数量只能数字
+        const numReg = new RegExp(/[^\d]/g);
+        if(numReg.test(this.form.orgSubNum) || this.form.orgSubNum < 0){
+          this.form.orgSubNum = null;
+        }
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+    @import "../../less/admin.less";
+
+    .add-admin-form {
+        background: #fff;
+        padding: 20px 10px 30px;
+
+    &
+    > div {
+        margin-left: 9px;
+    }
+
+    }
+    h4 {
+        text-indent: 20px;
+        font-size: 15px;
+        margin-bottom: 20px;
+    }
+  .el-button{
+    margin: 30px 0 0 20px;
+  }
+  .el-dropdown{
+    margin-bottom: 15px;
+  }
+  .contents{
+    position: relative;
+    .back{
+      position: absolute;
+      top: 10px;
+      left: 5px;
+      z-index: 7;
+      cursor: pointer;
+    }
+  }
+</style>

+ 216 - 0
src/components/admin/OrganizationInfo.vue

@@ -0,0 +1,216 @@
+<!-- 机构信息 By_liucf -->
+<template>
+    <div>
+        <crumbs title="机构信息">
+            <el-form :inline="true" class="demo-form-inline">
+                <el-form-item label="注册时间:">
+                    <el-date-picker v-model="time" size="mini" type="daterange" value-format="yyyy-MM-dd HH:mm:ss" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']"></el-date-picker>
+                </el-form-item>
+                <el-form-item label="机构名称:">
+                    <el-input size="mini" v-model="name" clearable placeholder="机构名称" @keyup.enter.native="getSearch"></el-input>
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button size="mini" @click="getSearch">确认</el-button>
+                    <el-button size="mini" type="warning" @click="addOrganization">添加机构</el-button>
+                    <el-button size="mini" type="primary" @click="exportOrganizeInfo">导出</el-button>
+                </el-form-item>
+            </el-form>
+        </crumbs>
+        <div class="contents">
+            <el-table :data="list"
+                      border
+                      style="width: 100%">
+                <el-table-column
+                        type="index"
+                        :index="indexMethod"
+                        label="编号"
+                        width="60">
+                </el-table-column>
+                <el-table-column
+                        prop="orgGmtCreate"
+                        label="注册时间"
+                        :show-overflow-tooltip="true">
+                </el-table-column>
+                <el-table-column
+                        prop="orgName"
+                        label="注册机构">
+                </el-table-column>
+                <el-table-column
+                        prop="orgPrincipal"
+                        label="机构负责人">
+                </el-table-column>
+                <el-table-column
+                        prop="orgType"
+                        label="机构属性"
+                        :formatter="formatType">
+                </el-table-column>
+                <el-table-column
+                        prop="orgAddress"
+                        label="机构地址">
+                </el-table-column>
+                <el-table-column
+                        prop="linkman"
+                        label="超管名称">
+                </el-table-column>
+                <el-table-column
+                        fixed="right"
+                        label="操作"
+                        width="100">
+                    <template slot-scope="scope">
+                        <el-button v-if="scope.row.authStatus==1" type="text" size="small" @click="handleModifined(scope.$index, scope.row)">修改</el-button>
+                        <el-button v-else type="text" size="small" style="color: #c9c9c9;cursor: text;">修改</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination v-if="total>pageSize"
+                           :current-page.sync="currentPage"
+                           @current-change="currentChange"
+                           background
+                           :page-size="pageSize"
+                           layout="total,prev, pager, next, jumper"
+                           :total="total">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+
+<script>
+  import api from '@api/admin.js';
+  import utils from '@api/utils.js';
+  export default {
+    name: 'OrganizationInfo',
+    data: function () {
+      return {
+        list: [],
+        status: [],
+        cacheData: {},
+        cachePage: null,
+        currentPage: 1,
+        pageSize: 10,
+        total: 0,
+        time:'',
+        name:'',
+        includedComponents: "OrganizationInfo"
+      }
+    },
+    created() {
+      let page = Number(sessionStorage.getItem('cachePage'));
+      if(page){
+        this.currentPage = page;
+        this.getDataList();
+        sessionStorage.setItem('cachePage',null);
+      }else{
+        this.getDataList();
+      }
+    },
+    methods: {
+      apiMethods(params){
+        api.getOrganizationInfo(params).then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            this.list = data.records;
+            this.total = data.total;
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      getDataList() {//获取机构信息
+        let param = {};
+        if(this.time){
+          param = {
+            'size':this.pageSize,
+            'current':this.currentPage,
+            'startTime':this.time[0],
+            'endTime':this.time[1],
+            'orgName':this.name.trim(),
+          };
+        }else{
+          param = {
+            'size':this.pageSize,
+            'current':this.currentPage,
+            'orgName':this.name.trim(),
+          };
+        }
+        this.apiMethods(param);
+        
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        this.getDataList();
+      },
+      addOrganization(){//添加机构
+        this.$router.push({path:'LT-KHZX-TJJG'});
+      },
+      exportOrganizeInfo() {//导出
+        const canExport = utils.exportCondition(this.time);
+        if(typeof canExport == 'string'){
+          this.$message({
+            showClose: true,
+            message:canExport,
+            type:'warning'
+          });
+          return;
+        }
+          const searchTime = this.time;
+          const param = {
+            "endTime": searchTime[1],
+            "startTime": searchTime[0],
+            "orgName": this.name||undefined
+          };
+          api.exportOrganizeInfo(param).then((res) => {
+            if (res.data.code = '0') {
+              utils.downloadExportedData(res.data, '机构信息表.xls');
+              this.$message({showClose: true, message: "导出成功", type: 'success'});
+            } else {
+              this.$message({
+                showClose: true,
+                message: res.data.msg,
+                type: 'warning'
+              });
+            }
+          }).catch((error) => {
+            this.$message({
+              showClose: true,
+              message: "服务器正忙...",
+              type: 'warning'
+            });
+          });
+      },
+      formatType:function(row,column,cellValue){//处理机构属性
+        if(cellValue ==0){
+          return "连锁医疗结构";
+        }else if(cellValue ==1){
+          return "卫计局";
+        }else if(cellValue ==2){
+          return "基础医疗单位";
+        }else if(cellValue ==3){
+          return "医疗诊所";
+        }else if(cellValue ==99){
+          return "其他";
+        }else{
+          return null;
+        }
+
+      },
+      handleModifined(index,colData){
+        // this.cachePage = this.currentPage;
+        sessionStorage.setItem('cachePage',this.currentPage);
+        this.$router.push({path:'LT-KHZX-XGJG',query:{info:colData}});
+      },
+      getSearch(){//搜索
+        this.currentPage = 1;//重置
+        this.getDataList();   
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+    @import "../../less/admin.less";
+</style>

+ 343 - 0
src/components/admin/PersonCenter.vue

@@ -0,0 +1,343 @@
+<template>
+	<div class="personCon">
+		<MiniTitle>
+			<div slot="mini" class="miniTit">个人中心</div>
+		</MiniTitle>
+	<div class="conPerson">
+		<div class="personCenter">
+			<h4>基本信息</h4>
+			<div class="detailInfo">
+				<el-row>
+					<el-col :span="2">
+						<div class="" ref="perfect" v-bind:class="{title: isActive}">姓名:</div>
+					</el-col>
+					<el-col :span="21">
+						<div class="" v-if="person">{{linkman}}</div>
+						<el-input placeholder="请输入姓名" v-if="personNo" clearable v-model="linkman"></el-input>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="2">
+						<div class="" v-bind:class="{title: isActive}">所属部门:</div>
+					</el-col>
+					<el-col :span="21">
+						<div class="" v-if="person">{{dept}}</div>
+						<el-input placeholder="请输入所属部门" v-if="personNo" clearable v-model="dept"></el-input>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="2">
+						<div class="" v-bind:class="{title: isActive}">所属岗位:</div>
+					</el-col>
+					<el-col :span="21">
+						<div class="" v-if="person">{{position}}</div>
+						<el-input placeholder="请输入所在岗位" v-if="personNo" clearable v-model="position"></el-input>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="2">
+						<div class="" v-bind:class="{title: isActive}">手机号:</div>
+					</el-col>
+					<el-col :span="21">
+						<div class="" v-if="person">{{phone}}</div>
+						<el-input placeholder="请输入手机号" v-if="personNo" maxlength="11" clearable v-model="phone"></el-input>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="2">
+						<div class="" v-bind:class="{title: isActive}">邮箱:</div>
+					</el-col>
+					<el-col :span="21">
+						<div class="" v-if="person">{{email}}</div>
+						<el-input placeholder="请输入邮箱" v-if="personNo" clearable v-model="email"></el-input>
+					</el-col>
+				</el-row>
+				<!--<button type="success" class="adminChange" @click="adminChange()" v-if="this.personNo==false">修改</button>
+				<button type="success" class="adminChange2" @click="changeQue()" v-else-if="this.personNo == true">确定</button>-->
+			</div>
+			<div class="txtHeight"></div>
+		</div>
+		<div class="safChange">
+			<h4>账号安全</h4>
+			<div class="leftCon">
+				<p class="radio"><i class="el-icon-circle-check-outline"></i>登录密码</p>
+				<!-- <el-radio v-model="radio" label="1" class="radio">登录密码</el-radio> -->
+				<p class="text">安全性高的密码可以使账号更安全。建议您定期更换密码,设置一个不能由纯数字、字母组成且长度在6位~16位的密码</p>
+			</div>
+			<div class="rigCon">
+				<i class="el-icon-circle-check-outline"></i><span >已设置</span><span class="changeTxt" @click="changeText()">修改</span>
+			</div>
+		</div>
+	</div>
+	</div>
+</template>
+<script>
+	import api from '../../api/admin.js';
+	import MiniTitle from '../common/MiniTile.vue'
+
+	export default {
+		name: 'user-information',
+		components: {
+			MiniTitle
+		},
+		data: function() {
+			return {
+				radio: '',
+				radio2: '',
+				personNo: false,
+				person: true,
+				username: null,
+				phone: null,
+				linkman: null,
+				email: null,
+				isActive: false,
+				dept: null,
+				position: null
+			}
+		},
+		created: function() {
+			this.getUserInfo();
+		},
+		methods: {
+			getUserInfo() {
+				//获取当前账户信息
+				api.getPersonInfo().then((res) => {
+					if (res.data.code == '0') {
+						const data = res.data.data;
+
+						if (data.phone !== '' || data.phone !== null || data.phone !== 0 ? this.phone = data.phone :
+							this.phone = '待完善');
+						if (data.linkman !== '' || data.linkman !== null || data.linkman !== 0 ? this.linkman = data.linkman : this.linkman =
+							'待完善');
+						if (data.dept !== '' || data.dept !== null || data.dept !== 0 ? this.dept = data.dept : this.dept = '待完善');
+						if (data.position !== '' || data.position !== null || data.position !== 0 ? this.position = data.position :
+							this.position = '待完善');
+						if (data.email !== '' || data.email !== null || data.email !== 0 ? this.email = data.email : this.email = '待完善')
+						;
+					}
+				}).catch((error) => {
+					console.log(error)
+				});
+			},
+			adminChange() {
+				this.personNo = true;
+				this.person = false;
+				this.isActive = true;
+			},
+			changeQue() {
+				const myreg = /^1[0-9]{10}$/;
+				const params = {
+					"linkman": this.linkman, //req
+					"dept": this.dept, //req
+					"position": this.position,
+					"phone": this.phone,
+					"email": this.email,
+				};
+				if(this.phone == ''){
+					this.$message.error("手机号不能为空");
+				}else if(!myreg.test(this.phone)){
+					this.$message.error("请输入正确的手机号")
+				}else{
+					api.updatePersonInfo(params).then((res) => {
+						console.log(res.data.code)
+						if (res.data.code == '0') {
+							this.$message({
+								showClose: true,
+								message: '修改成功!',
+								type: 'success',
+								duration: 1000,
+								onClose: function() {
+									this.personNo = false;
+									this.person = true;
+									this.getUserInfo();
+								}.bind(this)
+							});
+						}
+					}).catch((error) => {
+						console.log(error);
+					});
+				}
+			},
+			changeText() {
+				console.log('000')
+				this.$router.push({
+					path: 'LT-GRZX/CHANGE'
+				});
+			}
+		}
+	}
+</script>
+<style lang="less">
+	.conPerson {
+		.personCenter {
+			margin-left: 20px !important;
+			background-color: #fff;
+			margin-right: 20px !important;
+			margin-top: 20px !important;
+			height: auto;
+			box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.13);
+			position: relative;
+
+			h4 {
+				font-size: 14px;
+				padding-top: 20px;
+				margin-left: 30px;
+			}
+
+			.title {
+				margin-top: 4px;
+			}
+
+			.txtHeight {
+				height: 30px;
+			}
+
+			.detailInfo {
+				.el-col {
+					margin-top: 35px;
+					color: #424243;
+					font-size: 12px;
+
+				}
+
+				.el-col-2 {
+					text-align: right;
+					width: 10%;
+				}
+
+				.el-col-21 {
+					margin-left: 30px;
+					width: 175px;
+				}
+			}
+
+			.adminChange {
+				width: 80px;
+				height: 30px;
+				background: #22ccc8;
+				font-size: 12px;
+				color: #fff;
+				border-radius: 3px;
+				border: 0;
+				outline: none;
+				cursor: pointer;
+				position: absolute;
+				right: 30px;
+				top: 10px;
+			}
+
+			.adminChange2 {
+				width: 80px;
+				height: 30px;
+				background: #ffb03b;
+				font-size: 12px;
+				color: #fff;
+				border-radius: 3px;
+				border: 0;
+				outline: none;
+				cursor: pointer;
+				position: absolute;
+				right: 30px;
+				top: 10px;
+			}
+
+			.el-input__inner {
+				width: 175px;
+				height: 30px;
+				line-height: 30px;
+				font-size: 12px;
+			}
+
+			.el-input__icon {
+				line-height: 25px;
+			}
+		}
+
+		.safChange {
+			height: 150px;
+			background: #fff;
+			margin: 20px 20px 0 20px;
+			box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.13);
+
+			h4 {
+				font-size: 14px;
+				padding-top: 20px;
+				margin-left: 30px;
+				padding-bottom: 20px;
+			}
+
+			.el-radio__label {
+				font-size: 12px !important;
+			}
+
+			.leftCon {
+				float: left;
+				background: #fff;
+				margin-left: 30px;
+				
+				.radio {
+					margin-bottom: 15px;
+					font-size: 12px;
+					color: #606266;
+				}
+
+				.text {
+					font-size: 12px;
+					color: #606266;
+				}
+			}
+
+			.rigCon {
+				float: right;
+				margin-right: 30px;
+				font-size: 12px;
+				color: #606266;
+
+				.radio2 {
+					margin-right: 30px;
+				}
+
+				.changeTxt {
+					cursor: pointer;
+					margin-left: 30px;
+					&:hover {
+						color: #409EFF;
+					}
+				}
+			}
+
+			.el-radio {
+				cursor: auto;
+			}
+
+			.el-radio__inner {
+				cursor: auto;
+			}
+
+			.el-radio__inner:hover {
+				border-color: #9b9b9b;
+			}
+
+			.el-radio__input {
+				cursor: auto;
+			}
+
+			.el-radio__input.is-checked .el-radio__inner {
+				border-color: #9b9b9b;
+				background: #fff;
+			}
+
+			.el-radio__input.is-checked+.el-radio__label {
+				color: #606266;
+			}
+		}
+		
+	}
+	.personCon{
+		.miniTit{
+			font-size: 14px;
+			font-weight: bold;
+			margin-left: 20px;
+		}
+	}
+</style>

+ 122 - 0
src/components/admin/ProductDetail.vue

@@ -0,0 +1,122 @@
+<template>
+    <div>
+        <crumbs title="产品线管理-产品线详情" linkTo="/admin/LT-CPXGL">
+            <el-form :inline="true" class="demo-form-inline">
+                <el-form-item label="机构名称:">
+                    <el-input size="mini" v-model="filter.orgName" placeholder="机构名称"></el-input>
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button size="mini" @click="getDataList">确认</el-button>
+                </el-form-item>
+            </el-form>
+        </crumbs>
+        <div class="contents">
+            <el-table :data="list"
+                      border
+                      style="width: 100%">
+                <el-table-column
+                        type="index"
+                        :index="indexMethod"
+                        label="编号"
+                        width="100">
+                </el-table-column>
+                <el-table-column
+                        prop="orderTime"
+                        label="申请时间">
+                </el-table-column>
+                <el-table-column
+                        prop="orgName"
+                        label="接入机构">
+                </el-table-column>
+                <el-table-column
+                        prop="subNum"
+                        label="下属机构接入数量">
+                </el-table-column>
+                <el-table-column
+                        prop="endTime"
+                        label="服务到期时间">
+                </el-table-column>
+            </el-table>
+            <el-pagination v-if="total>pageSize"
+                           :current-page.sync="currentPage"
+                           @current-change="currentChange"
+                           background
+                           :page-size="pageSize"
+                           layout="total,prev, pager, next, jumper"
+                           :total="total">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+
+<script>
+  import api from '@api/admin.js';
+  import utils from '@api/utils.js';
+
+  export default {
+    name: 'product-detail',
+    data: function () {
+      return {
+        list: [],
+        status: [],
+        cacheData: {},
+        currentPage: 1,
+        pageSize: 10,
+        total: 0,
+        proId:'',
+        filter: {
+          orgName: ''
+        }
+      }
+    },
+    created() {
+      this.proId = this.$route.params.productId;
+      this.getDataList();
+    },
+    methods: {
+      getDataList() {
+        const param = this.getFilterItems();
+        api.getProductDetail(param).then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            this.list = data.records;
+            this.cacheData[param.current] = data.records;
+            this.total = data.total;
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      getFilterItems() {
+        const param = {
+          productId: this.proId,
+          orgName: this.filter.orgName||undefined,
+          current: this.currentPage,
+          size: this.pageSize
+        };
+        return param;
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
+          this.list = this.cacheData[next];
+        } else {
+          this.getDataList();
+        }
+      }
+    }
+  }
+</script>
+
+<style lang="less">
+    @import "../../less/admin.less";
+    .status-span{
+        font-size: 14px;
+        margin-right:10px;
+    }
+</style>

+ 458 - 0
src/components/admin/ProductLines.vue

@@ -0,0 +1,458 @@
+<template>
+    <div>
+        <crumbs title="产品申请列表" style="min-width: 1085px">
+            <el-form :inline="true" class="demo-form-inline">
+                <el-form-item label="申请时间:">
+                    <el-date-picker v-model="filter.time" size="mini" value-format="yyyy-MM-dd HH:mm:ss" :default-time="['00:00:01', '23:59:59']"
+                                    type="daterange"
+                                    start-placeholder="开始日期"
+                                    end-placeholder="结束日期"></el-date-picker>
+                </el-form-item>
+                <el-form-item label="订单号:">
+                    <el-input size="mini" v-model="filter.orderNum" placeholder="订单号" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="机构名称:">
+                    <el-input size="mini" v-model="filter.orgName" placeholder="机构名称" clearable></el-input>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="申请状态:">
+                    <el-select size="mini" v-model="filter.status" placeholder="申请状态" clearable>
+                        <el-option v-for="item in status" :label="item.name" :value="item.key"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button size="mini" @click="filterDatas">确认</el-button>
+                    <el-button size="mini" type="primary" @click="exportProductLines">导出</el-button>
+                </el-form-item>
+            </el-form>
+        </crumbs>
+        <div class="contents">
+            <el-table :data="list"
+                      border
+                      @expand-change="showPickup"
+                      :row-class-name="proLineRow"
+                      width="100%"
+                      class="pro-line-table">
+                <el-table-column
+                        type="index"
+                        :index="indexMethod"
+                        label="编号"
+                        width="60">
+                </el-table-column>
+                <el-table-column
+                        prop="time"
+                        label="申请时间"
+                        :show-overflow-tooltip="true">
+                </el-table-column>
+                <el-table-column
+                        prop="num"
+                        label="订单号"
+                        :show-overflow-tooltip="true">
+                </el-table-column>
+                <el-table-column
+                        prop="orgName"
+                        label="申请机构" width="100">
+                </el-table-column>
+                <el-table-column
+                        prop="linkman"
+                        label="申请人" width="100">
+                </el-table-column>
+                <el-table-column
+                        prop="username"
+                        label="手机号">
+                </el-table-column>
+                <el-table-column
+                        prop="email"
+                        label="邮箱"
+                        :show-overflow-tooltip="true">
+                </el-table-column>
+                <el-table-column
+                        label="操作" width="120">
+                    <template slot-scope="scope">
+                        <span class="status-span" v-if="scope.row.auditStatus==0">不通过</span>
+                        <span class="status-span" v-if="scope.row.auditStatus==1">通过</span>
+                        <el-button v-if="scope.row.auditStatus==2" type="text" size="small">{{scope.row.isExpand?"收起":"待审核"}}</el-button>
+                        <span class="status-span" v-if="scope.row.auditStatus==3">部分通过</span>
+                        <el-button v-if="scope.row.auditStatus==4" type="text" size="small">{{scope.row.isExpand?"收起":"部分审核"}}</el-button>
+                        <el-button type="text" size="small" :disabled="scope.row.auditStatus==2||scope.row.auditStatus==4">{{scope.row.isExpand&&(scope.row.auditStatus!=2&&scope.row.auditStatus!=4)?"收起":"查看"}}</el-button>
+                    </template>
+                </el-table-column>
+                <el-table-column type="expand">
+                    <!---------详情展开内容------------>
+                    <template slot-scope="scope">
+                        <el-table :data="scope.row.orderDetial">
+                            <el-table-column label="编号"
+                                             type="index"
+                                             width="60"
+                                             :index="indexMethod"></el-table-column>
+                            <el-table-column label="申请时间"
+                                             prop="orderTime"
+                                             :show-overflow-tooltip="true"></el-table-column>
+                            <el-table-column label="开通功能" prop="productName"></el-table-column>
+                            <el-table-column label="付款状态" prop="payStatusName"></el-table-column>
+                            <el-table-column label="审核状态" width="130">
+                                <template slot-scope="detail">
+                                    <el-popover
+                                            v-if="detail.row.auditStatus==2"
+                                            placement="top-start"
+                                            width="260"
+                                            v-model="detail.row.visible"
+                                            >
+                                        <el-form label-position="top" :inline="true" >
+                                            <span class="closeDate"  @click="detail.row.visible = false">×</span>
+                                            <el-form-item label="服务开始时间">
+                                                <el-date-picker size="mini" type="date"
+                                                                value-format="yyyy-MM-dd"
+                                                                placeholder="选择开始时间"
+                                                                :picker-options="startPicker"
+                                                                v-model="detailParam.startTime"
+                                                                style="width: 100%;"></el-date-picker>
+                                            </el-form-item>
+                                            <el-form-item label="服务结束时间">
+                                                <el-date-picker size="mini" type="date"
+                                                                value-format="yyyy-MM-dd"
+                                                                :picker-options="endPicker"
+                                                                placeholder="选择结束时间"
+                                                                v-model="detailParam.endTime"
+                                                                style="width: 100%;"></el-date-picker>
+                                            </el-form-item>
+                                            <div style="text-align: center">
+                                                <el-button type="primary" size="mini" @click="handleAuthStatus(detail.row,1,scope.row)">确定</el-button>
+                                            </div>
+                                        </el-form>
+                                        <el-button slot="reference" size="mini"> 通过</el-button>
+                                    </el-popover>
+                                    <span v-if="detail.row.auditStatus==2" style="margin:0 3px;">|</span>
+                                    <el-popover
+                                            v-if="detail.row.auditStatus==2"
+                                            placement="bottom-start"
+                                            width="380"
+                                            v-model="detail.row.visible2"
+                                            >
+                                        <el-form>
+                                          <span class="closeDate"  @click="detail.row.visible2 = false">×</span>
+                                            <h4>原因说明</h4>
+                                            <el-form-item>
+                                                <el-radio-group v-model="detailParam.rejectType" @change="detailParam.rejectReason = ''">
+                                                    <p v-for="(it,index) in reasons" style="margin: 10px 0;">
+                                                        <el-radio :label="it.key">{{it.name}}</el-radio>
+                                                    </p>
+                                                </el-radio-group>
+                                            </el-form-item>
+                                            <el-form-item>
+                                                <el-input v-model="detailParam.rejectReason" @focus="detailParam.rejectType=-1" type="textarea" placeholder="其他原因说明"></el-input>
+                                            </el-form-item>
+                                            <el-form-item>
+                                                <el-button type="primary" @click="handleAuthStatus(detail.row,0,scope.row)">完成</el-button>
+                                            </el-form-item>
+                                        </el-form>
+                                        <el-button slot="reference" size="mini">不通过</el-button>
+                                    </el-popover>
+                                    <span class="status-span" v-if="detail.row.auditStatus==1">通过</span>
+                                    <span class="status-span" v-if="detail.row.auditStatus==0">不通过</span>
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="产品服务有效期" width="250">
+                                <template slot-scope="scope">
+                                    {{scope.row.startTime&&scope.row.startTime.substr(0,10)}}~{{scope.row.endTime&&scope.row.endTime.substr(0,10)}}
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="不通过说明" width="180">
+                                <template slot-scope="scope">
+                                    {{scope.row.rejectReason||scope.row.rejectTypeName}}
+                                </template>
+                            </el-table-column>
+                        </el-table>
+                    </template>
+                    <!---------详情展开内容end------------>
+                </el-table-column>
+            </el-table>
+        </div>
+        <el-pagination v-if="total>pageSize"
+                       :current-page.sync="currentPage"
+                       @current-change="currentChange"
+                       background
+                       :page-size="pageSize"
+                       layout="total,prev, pager, next, jumper"
+                       :total="total">
+        </el-pagination>
+    </div>
+</template>
+
+<script>
+  import api from '@api/admin.js';
+  import utils from '@api/utils.js';
+
+  export default {
+    name: 'product-lines',
+    data: function () {
+      return {
+        visible: false,
+        visible2: false,
+        list: [],
+        status: [],
+        cacheData: {},
+        endPicker:{
+          disabledDate:(current)=>{   //小于开始时间或今天之前不可选
+            const today = new Date(new Date(new Date().toLocaleDateString()).getTime());
+            return current<new Date(this.detailParam.startTime)||current<today;
+          }
+        },
+        startPicker:{
+          disabledDate:(current)=>{         //大于结束时间或今天之前不能选
+            const today = new Date(new Date(new Date().toLocaleDateString()).getTime());
+            return current > new Date(new Date(this.detailParam.endTime).getTime()-1000*60*60*24)||current<today;
+          }
+        },
+        reasons:[],
+        detailParam:{
+          endTime:'',
+          rejectReason:'',
+          rejectType:-1,
+          auditStatus:'',
+          startTime:''
+        },
+        currentPage: 1,
+        pageSize: 10,
+        total: 0,
+        filter: {
+          orderNum: '',
+          orgName: '',
+          status: '',
+          time:[]
+        }
+      }
+    },
+    created() {
+      this.getDataList();
+      const enums = JSON.parse(localStorage.getItem('productEnumsData'));
+      this.reasons = enums&&enums.notPassEnum;          //审核不通过原因枚举
+      this.status = enums&&enums.auditStatusEnum;       //申请状态枚举
+    },
+    methods: {
+      showPickup(row){
+        row.isExpand = !row.isExpand;
+      },
+      proLineRow(row){
+        const status = row.row.auditStatus;
+        if(status==2||status==4){         //查看
+          return 'pro-line-auth';
+        }else{                  //待审核
+          return 'pro-line-view';
+        }
+      },
+      filterDatas(){
+        this.currentPage = 1;
+        this.getDataList();
+      },
+      getDataList() {
+        const param = this.getFilterItems();
+        api.getProductLines(param).then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            this.list = data.records.map((item) =>{
+              let orderDetial = item.orderDetial.map((detail) => {
+                return {...detail, visible: false, visible2: false}
+              })
+              return {...item, orderDetial}
+            });
+            this.cacheData[param.current] = data.records;
+            this.total = data.total;
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      clearStatus(){
+        this.detailParam.rejectReason = '';
+        this.detailParam.rejectType = -1;
+        this.detailParam.endTime = '';
+        this.detailParam.startTime = '';
+      },
+      handleAuthStatus(row,status,parent){
+        this.detailParam.id = row.id;
+        this.detailParam.auditStatus = status;
+        if(status==1){      //通过参数
+          if(!this.detailParam.endTime||!this.detailParam.startTime){
+            this.$message({
+              showClose: true,
+              message:'请填写服务时间',
+              type:'warning'
+            });
+            return;
+          }
+          this.detailParam.rejectReason = undefined;
+          this.detailParam.rejectType = undefined;
+        }else{              //不通过参数
+          if(this.detailParam.rejectType===-1&&this.detailParam.rejectReason===''){
+            this.$message({
+              showClose: true,
+              message:'请选择/填写不通过原因',
+              type:'warning'
+            });
+            return;
+          }
+          if(this.detailParam.rejectReason.length>100){
+            this.$message({
+              showClose: true,
+              message:'不通过原因最多可输入100字',
+              type:'warning'
+            });
+            return;
+          }
+          this.detailParam.startTime = undefined;
+          this.detailParam.endTime = undefined;
+        }
+        api.auditProductStatus(this.detailParam).then((res)=>{
+          if(res.data.code=='0'){
+            row.auditStatus = this.detailParam.auditStatus;   //通过后修改显示状态
+            //判断详情中审核状态-修改父级审核状态
+            const details = parent.orderDetial;
+            const unAuth = details.filter((it)=>{
+              return it.auditStatus ==2;
+            });
+            const pass = details.filter((it)=>{
+              return it.auditStatus ==1;
+            });
+            const unPass = details.filter((it)=>{
+              return it.auditStatus ==0;
+            });
+            if(unAuth.length>0){        //部分审核
+              parent.auditStatus = 4;
+            }else if(pass.length==details.length){      //全部通过
+              parent.auditStatus = 1;
+            }else if(unPass.length==details.length){      //全部不通过
+              parent.auditStatus = 0;
+            }else{      //部分通过
+              parent.auditStatus = 3;
+            }
+
+            if(status==1){      //通过成功
+              row.startTime = this.detailParam.startTime;
+              row.endTime = this.detailParam.endTime;
+              row.payStatusName = '已付款';
+            }else{              //不通过成功
+              if(this.detailParam.rejectReason===''){
+                const reason = this.reasons.filter((it)=>{
+                  return it.key === this.detailParam.rejectType;
+                }); 
+                row.rejectTypeName = reason[0]&&reason[0].name;
+              }else{
+                row.rejectTypeName = this.detailParam.rejectReason;console.log(this.detailParam.rejectReason)
+              }
+            }
+            this.$message({
+              showClose: true,
+              message:'操作成功',
+              type:'success'
+            });
+            //this.getDataList(); //操作成功刷新列表
+          }else{
+            this.$message({
+              showClose: true,
+              message:res.data.msg,
+              type:'warning'
+            });
+            this.getDataList();//操作成功刷新列表
+          }
+          this.clearStatus();
+        });
+      },/*
+      getDetailTable(row){
+        const param = {
+          orderNum: row.num
+        };
+        api.proDetails(param).then((res)=>{
+          if(res.data.code=='0'){
+            this.detail = res.data.data;        //对象被修改不会更新vue数据,所以单独用一个变量来引起变化
+            this.detailData[row.num] = res.data.data;
+          }else{
+            this.$message({
+              showClose: true,
+              message: res.data.msg,
+              type: 'warning'
+            });
+          }
+        }).catch((error)=>{
+          this.$message({
+            showClose: true,
+            message: error,
+            type: 'warning'
+          });
+        });
+      },*/
+      getFilterItems() {
+        const time = this.filter.time;
+        const startTime = time&&time[0]||undefined;
+        const endTime = time&&time[1]||undefined;
+        const param = {
+          startTime,
+          endTime,
+          num: this.filter.orderNum,
+          orgName: this.filter.orgName,
+          auditStatus: this.filter.status,
+          current: this.currentPage,
+          size: this.pageSize
+        };
+        return param;
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
+          this.list = this.cacheData[next];
+        } else {
+          this.getDataList();
+        }
+      },
+      exportProductLines() {
+        const canExport = utils.exportCondition(this.filter.time)
+        if(typeof canExport == 'string'){
+          this.$message({
+            showClose: true,
+            message:canExport,
+            type:'warning'
+          });
+          return;
+        }
+        const param = this.getFilterItems();
+        api.exportProductLines(param).then((res) => {
+          if (res.data.code = '0') {
+            utils.downloadExportedData(res.data,'产品申请列表.xls');
+            this.$message({showClose: true,message: "导出成功", type: 'success'});
+          } else {
+            this.$message({
+              showClose: true,
+              message: res.data.msg,
+              type: 'warning'
+            });
+          }
+        }).catch((error) => {
+          this.$message({
+            showClose: true,
+            message: "服务器正忙...",
+            type: 'warning'
+          });
+        });
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+    @import "../../less/admin.less";
+    .status-span{
+        font-size: 14px;
+        margin-right:10px;
+        color: #aaa;
+    }
+    .closeDate {
+      position: absolute;
+      top: 0px;
+      right: 7px;
+      cursor: pointer;
+      font-size: 20px;
+    }
+</style>

+ 256 - 0
src/components/admin/ProductLinesManage.vue

@@ -0,0 +1,256 @@
+<template>
+    <div>
+        <crumbs title="产品线管理">
+            <el-form :inline="true" class="demo-form-inline">
+                <el-form-item label="产品名称:">
+                    <el-input size="mini" v-model="filter.proName" placeholder="产品名称"></el-input>
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button size="mini" @click="filterDatas">确认</el-button>
+                    <router-link to="/admin/LT-CPXGL-TJCPX" style="margin:0 10px">
+                        <el-button size="mini" type="warning">添加产品线</el-button>
+                    </router-link>
+                </el-form-item>
+            </el-form>
+        </crumbs>
+        <div class="contents">
+            <el-table :data="list"
+                      border
+                      style="width: 100%">
+                <el-table-column
+                        type="index"
+                        :index="indexMethod"
+                        label="编号"
+                        width="60">
+                </el-table-column>
+                <el-table-column
+                        prop="gmtCreate"
+                        label="建立时间"
+                        :show-overflow-tooltip="true">
+                </el-table-column>
+                <el-table-column
+                        prop="name"
+                        label="产品名称">
+                </el-table-column>
+                <el-table-column
+                        prop="url"
+                        label="URL"
+                        width="180">
+                </el-table-column>
+                <el-table-column
+                        prop="decription"
+                        label="描述" width="120">
+                </el-table-column>
+                <el-table-column
+                        prop="accessTypeName"
+                        label="接入方式"
+                        :show-overflow-tooltip="true">
+                    <!--<template slot-scope="scope">
+                        <span v-for="item in linkIn" class="status-span">{{item.name}},</span>
+                    </template>-->
+                </el-table-column>
+                <el-table-column
+                        prop="chargeTypeName"
+                        label="收费模式"
+                        :show-overflow-tooltip="true">
+                    <!--<template slot-scope="scope">
+                        <span v-for="item in pays" class="status-span">{{item.name}},</span>
+                    </template>-->
+                </el-table-column>
+                <el-table-column
+                        prop="oppendedNum"
+                        label="开通机构数量">
+                </el-table-column>
+                <el-table-column
+                        prop="trialStatusName"
+                        label="试用状态">
+                </el-table-column>
+                <el-table-column
+                        prop="trialUrl"
+                        label="试用URL"
+                        width="180">
+                </el-table-column>
+                <el-table-column
+                        label="状态">
+                    <template slot-scope="scope">
+                        <span v-if="scope.row.serviceStatus == 0">已停用</span>
+                        <span v-if="scope.row.serviceStatus == 1">已启用</span>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                        label="操作" width="150">
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="toEditProduct(scope.row)">修改</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button type="text" size="small" @click="showDelDialog(scope.row.id)">删除</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button type="text" size="small" v-if="scope.row.serviceStatus == 0" @click="updateServiceStatus(scope.row.id,1)">启用</el-button>
+                        <el-button type="text" size="small" v-if="scope.row.serviceStatus == 1" @click="updateServiceStatus(scope.row.id,0)">停用</el-button>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                        label="接入明细">
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="getDetailList(scope.row.id)">详情</el-button>
+                        <!-- <router-link :to="{name:'productDetail', params:{productId:scope.row.id}}"><el-button type="text" size="small">详情</el-button></router-link> -->
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination v-if="total>pageSize"
+                           :current-page.sync="currentPage"
+                           @current-change="currentChange"
+                           background
+                           :page-size="pageSize"
+                           layout="total,prev, pager, next, jumper"
+                           :total="total">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+
+<script>
+  import api from '@api/admin.js';
+  import utils from '@api/utils.js';
+
+  export default {
+    name: 'product-lines-manage',
+    data: function () {
+      return {
+        list: [],
+        cacheData: {},
+        currentPage: 1,
+        pageSize: 10,
+        total: 0,
+        linkIn:[],
+        pays:[],
+        filter: {
+          proName: ''
+        }
+      }
+    },
+    created() {
+      this.getDataList();
+      /*const enums = JSON.parse(localStorage.getItem('enumsData'));
+      this.linkIn = enums&&enums.accessTypeEnum;
+      this.pays = enums&&enums.chargeTypeEnum;*/
+    },
+    methods: {
+      toEditProduct(row){
+        this.$router.push({
+          name:'editProductLine',
+          params: {info:row}
+        })
+      },
+      filterDatas(){
+        this.currentPage = 1;
+        this.getDataList();
+      },
+      getDataList() {
+        const param = this.getFilterItems();
+        api.getProductLinesManage(param).then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            this.list = data.records;
+            this.cacheData[param.current] = data.records;
+            this.total = data.total;
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      getDetailList(id) {
+        const param = {productId: id,};
+        api.getProductDetail(param).then((res) => {
+          if (res.data.code == '0') {
+            this.$router.push({name:'productDetail', params:{productId: id}})
+          } else {
+            this.$message({
+              showClose: true,
+              message:res.data.msg,
+              type:'warning'
+            });
+            this.getDataList()  //刷新列表
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      getFilterItems() {
+        const param = {
+          name: this.filter.proName,
+          current: this.currentPage,
+          size: this.pageSize
+        };
+        return param;
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
+          this.list = this.cacheData[next];
+        } else {
+          this.getDataList();
+        }
+      },
+      updateServiceStatus(id,serviceStatus){
+        const txt = serviceStatus==0?'停用':'启用';
+        this.showConfirmDialog('确定要'+txt+'该产品线吗?',()=>{
+          api.updateServiceStatus({id,serviceStatus}).then((res)=>{
+            if(res.data.code=='0'){
+              this.getDataList();
+              this.warning(res.data.msg||'操作成功','success');
+            }else{
+              this.warning(res.data.msg);
+              this.getDataList();
+            }
+          }).catch((error)=>{
+            this.warning(error);
+          });
+        });
+
+      },
+      warning(msg,type){
+        this.$message({
+          showClose: true,
+          message:msg,
+          type:type||'warning'
+        })
+      },
+      showConfirmDialog(msg,resolve){
+        this.$alert(msg, '提示', {
+          confirmButtonText: '确定',
+          type: 'warning'
+        }).then(() => {
+          resolve();
+        }).catch(() => {});
+      },
+      showDelDialog(id){
+        this.showConfirmDialog('确定要删除该产品线吗?',()=>{
+          api.delProductLine({id}).then((res)=>{
+            if(res.data.code=='0'){
+              this.warning(res.data.msg||'操作成功','success');
+              this.getDataList();
+            }else{
+              this.warning(res.data.msg);
+            }
+          }).catch((error)=>{
+            this.warning(error);
+          })
+        });
+      }
+    }
+  }
+</script>
+
+<style lang="less">
+    @import "../../less/admin.less";
+    .status-span{
+        font-size: 12px;
+        margin-right:10px;
+        color: unset;
+    }
+</style>

+ 196 - 0
src/components/admin/RegisterAdmin.vue

@@ -0,0 +1,196 @@
+<template>
+    <div class="regiBox">
+        <crumbs title="注册中心">
+            <el-form :inline="true" class="demo-form-inline">
+                <el-form-item label="注册时间:">
+                    <el-date-picker v-model="filter.time"
+                                    size="mini"
+                                    type="daterange"
+                                    start-placeholder="开始日期"
+                                    end-placeholder="结束日期"
+                                    value-format="yyyy-MM-dd HH:mm:ss"
+                                    :default-time="['00:00:00', '23:59:59']"></el-date-picker>
+                </el-form-item>
+				<el-form-item label="认证状态:">
+					<el-select size="mini" v-model="filter.status" placeholder="认证状态" clearable>
+						<el-option v-for="item in status" :label="item.name" :value="item.key"></el-option>
+					</el-select>
+				</el-form-item>
+                <el-form-item label="手机号:">
+                    <el-input size="mini" v-model="filter.username" clearable placeholder="手机号" @keyup.enter.native="searchUserInfo"></el-input>
+                    </el-select>
+                </el-form-item>
+                
+                <el-form-item>
+                    <el-button size="mini" @click="searchUserInfo">确认</el-button>
+                    <el-button size="mini" type="primary" @click="exportAdminLines()">导出</el-button>
+                </el-form-item>
+            </el-form>
+        </crumbs>
+        <div class="contents">
+            <el-table :data="list"
+                      border
+                      style="width: 100%">
+                <el-table-column
+                        type="index"
+                        :index="indexMethod"
+                        label="编号"
+                        width="60">
+                </el-table-column>
+                <el-table-column
+                        prop="userGmtCreate"
+                        label="注册时间"
+                        :show-overflow-tooltip="true">
+                </el-table-column>
+                <el-table-column
+                        prop="linkman"
+                        label="联系人">
+                </el-table-column>
+                <el-table-column
+                        prop="authStatusStr"
+                        label="状态"
+                        width="80">
+                </el-table-column>
+                <el-table-column
+                        prop="userName"
+                        label="手机号"
+                        width="130">
+                </el-table-column>
+                <el-table-column
+                        prop="email"
+                        label="邮箱">
+                </el-table-column>
+                <el-table-column
+                        fixed="right"
+												prop="orgName"
+                        label="注册机构"
+                        width="130">
+                </el-table-column>
+            </el-table>
+            <el-pagination v-if="total>pageSize"
+                           :current-page.sync="currentPage"
+                           @current-change="currentChange"
+                           background
+                           :page-size="pageSize"
+                           layout="total,prev, pager, next, jumper"
+                           :total="total">
+            </el-pagination>
+        </div>
+    </div>
+</template>
+
+<script>
+  import api from '@api/admin.js';
+	import userApi from '@api/user.js';
+	import utils from '@api/utils.js';
+
+  
+  export default {
+    name: 'register-admin',
+    data () {
+      return {
+        list: [],
+        status: [],
+        cacheData: {},
+        currentPage: 1,
+        pageSize: 10,
+        total: 0,
+        filter: {
+          orderNum: '',
+          username:'',
+          status: '',
+          time:'',
+        }
+      }
+    },
+    created() {
+      this.queryUserInfo();
+      const enumsList = JSON.parse(localStorage.getItem('enumsData'));
+      const status = enumsList.authStatusEnum;
+      for (var i = 0; i < status.length; i++) {
+        this.status.push(status[i])
+      }
+    },
+    methods: {
+      queryUserInfo(){
+        const time = this.filter.time;
+        const startTime = time&&time[0]||undefined;
+        const endTime = time&&time[1]||undefined;
+        const params = {
+				'userName' : this.filter.username.trim(),       //用户名
+				'authStatus' : this.filter.status,  // 认证状态
+				'current' : this.currentPage,      //分页
+				'size': this.pageSize,   //条数
+				'startTime':startTime,
+				'endTime':endTime
+			}
+			api.queryUserInfo(params).then((res) => {
+				if (res.data.code == '0') {
+					const data = res.data.data;
+					this.list = data.records;
+					this.total = data.total;
+				}
+			}).catch((error) => {
+				console.log(error);
+			});
+		},
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
+          this.list = this.cacheData[next];
+        } else {
+          this.queryUserInfo();
+        }
+      },
+      searchUserInfo(){//搜索
+        this.currentPage = 1;
+        this.queryUserInfo();
+      },
+      exportAdminLines() {
+        const time = this.filter.time;
+        const canExport = utils.exportCondition(time);
+        if(typeof canExport == 'string'){
+          this.$message({
+            showClose: true,
+            message:canExport,
+            type:'warning'
+          });
+          return;
+        }
+        const startTime = time && time[0] || undefined;
+        const endTime = time && time[1] || undefined;
+        const params = {
+          'userName': this.filter.username.trim(),       //用户名
+          'authStatus': this.filter.status,  // 认证状态
+          'startTime': startTime,
+          'endTime': endTime
+        };
+        api.exportUserInfo(params).then((res) => {
+          if (res.data.code = '0') {
+            utils.downloadExportedData(res.data, '注册用户信息.xls');
+            this.$message({showClose: true,message: "导出成功", type: 'success'});
+          } else {
+            this.$message({
+              showClose: true,
+              message: res.data.msg,
+              type: 'warning'
+            });
+          }
+        }).catch((error) => {
+          this.$message({
+            showClose: true,
+            message: "服务器正忙...",
+            type: 'warning'
+          });
+        });
+      }
+    }
+  }
+</script>
+
+<style lang="less">
+    @import "../../less/admin.less";
+</style>

+ 290 - 0
src/components/admin/Renew.vue

@@ -0,0 +1,290 @@
+<template>
+	<div class="regiBox">
+		<crumbs title="产品续费列表">
+			<el-form :inline="true" class="demo-form-inline">
+				<el-form-item label="申请时间:">
+					<el-date-picker v-model="filter.time" size="mini" type="daterange"
+									start-placeholder="开始日期"
+									end-placeholder="结束日期"
+									value-format="yyyy-MM-dd HH:mm:ss"
+					 :default-time="['00:00:00', '23:59:59']"></el-date-picker>
+				</el-form-item>
+				<el-form-item label="机构名称:">
+					<el-input size="mini" v-model="filter.orgName" placeholder="请输入机构名称" clearable></el-input>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="续费状态:">
+					<el-select size="mini" v-model="filter.renewalsStatus" placeholder="续费状态" clearable >
+						<el-option v-for="item in status" :label="item.name" :value="item.key"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item>
+					<el-button size="mini" @click="filterData">确认</el-button>
+				</el-form-item>
+			</el-form>
+		</crumbs>
+		<div class="contents">
+			<el-table :data="list" border style="width: 100%">
+				<el-table-column type="index" :index="indexMethod" label="编号" width="60">
+				</el-table-column>
+				<el-table-column prop="applyTime" label="申请时间"
+								 :show-overflow-tooltip="true">
+				</el-table-column>
+				<el-table-column prop="renewalsNo" label="续费订单号" :show-overflow-tooltip="true">
+				</el-table-column>
+				<el-table-column prop="orgName" label="申请机构">
+				</el-table-column>
+				<el-table-column prop="linkman" label="申请人">
+				</el-table-column>
+				<el-table-column prop="username" label="手机号" width="120">
+				</el-table-column>
+				<el-table-column prop="productName" label="申请产品">
+				</el-table-column>
+				<el-table-column label="到期时间"
+								 :show-overflow-tooltip="true"
+								  width="100">
+					<template slot-scope="scope">
+						{{scope.row.endTime&&scope.row.endTime.substr(0,10)}}
+					</template>
+				</el-table-column>
+				<el-table-column prop="renewalsStatusName" label="续费状态">
+				</el-table-column>
+				<el-table-column prop="id" label="操作" width="130">
+					<template slot-scope="scope">
+						<el-popover
+								v-if="scope.row.renewalsStatus != '1'"
+								placement="top-start"
+								width="180"
+								v-model="scope.row.visible"
+								>
+							<span class="closeDate" @click="scope.row.visible = !scope.row.visible">×</span>
+							<el-form label-position="top" :inline="true">
+								<!--<el-form-item label="服务开始时间">
+									<el-date-picker size="mini" type="date"
+													value-format="yyyy-MM-dd"
+													placeholder="选择开始时间"
+													v-model="startTime"
+													style="width: 100%;"></el-date-picker>
+								</el-form-item>-->
+								<el-form-item label="服务结束时间">
+									<el-date-picker size="mini" type="date"
+													:picker-options="endPicker"
+													value-format="yyyy-MM-dd"
+													placeholder="选择结束时间"
+													v-model="endTime"
+													style="width: 100%;"></el-date-picker>
+								</el-form-item>
+								<div style="text-align: center">
+									<el-button type="primary" size="mini" @click="reBuyProduct(scope.row)">确定续费</el-button>
+								</div>
+							</el-form>
+							<el-button slot="reference" size="mini" class="pop-btn">续费</el-button>
+						</el-popover>
+						<span v-if="scope.row.renewalsStatus == '1'">续费</span>
+						<span style="margin:0 3px;">|</span>
+						<span v-if="scope.row.renewalsStatus == '1'">取消续费</span>
+						<el-button type="text" size="small" v-if="scope.row.renewalsStatus != '1'" @click="closeBtn(scope.row.id)">取消续费</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<el-pagination v-if="total>pageSize" :current-page.sync="currentPage" @current-change="currentChange" background
+			 :page-size="pageSize" layout="total,prev, pager, next, jumper" :total="total">
+			</el-pagination>
+		</div>
+	</div>
+</template>
+
+<script>
+	import api from '@api/admin.js';
+	import userApi from '@api/user.js';
+	import utils from '@api/utils.js';
+
+
+	export default {
+		name: 'product-lines',
+		data() {
+			return {
+				list: [],
+				status: [],
+				cacheData: {},
+              	/*startTime:'',*/
+			  	endTime:'',
+				currentPage: 1,
+				pageSize: 10,
+				total: 0,
+				username: null,
+				endPicker:{
+					disabledDate:(current)=>{   //今天之前不可选
+                      const today = new Date(new Date(new Date().toLocaleDateString()).getTime());
+					  return current<today;
+					}
+				},
+				filter: {
+					orderNum: '',
+					orgName: '',
+					username: '',
+					orgName: '',
+					renewalsStatus: '',
+					time: '',
+				}
+			}
+		},
+		created() {
+			this.queryUserInfo();
+		  	const enums = JSON.parse(localStorage.getItem('productEnumsData'));
+		  	this.status = enums&&enums.renewalsEnum;       //续费状态枚举
+		},
+		methods: {
+          filterData(){
+            this.currentPage = 1;
+            this.queryUserInfo();
+		  },
+			queryUserInfo() { //续费列表数据获取
+				const time = this.filter.time;
+				const startTime = time&&time[0]||undefined;
+				const endTime = time&&time[1]||undefined;
+				const params = {
+					'orgName': this.filter.orgName, // 机构名称
+					'renewalsStatus': this.filter.renewalsStatus, // 续费状态
+					'current': this.currentPage, //分页
+					'size': this.pageSize, //条数
+					'startTime': startTime,
+					'endTime': endTime
+				};
+				api.renewalsInfos(params).then((res) => {
+					if (res.data.code == '0') {
+						const data = res.data.data;
+						this.list = data.records.map((item) => {
+							return {...item, visible: false}
+						});
+						this.total = data.total;
+					}
+				}).catch((error) => {
+					console.log(error);
+				});
+			},
+			indexMethod(index) {
+				return ((this.currentPage - 1) * this.pageSize) + index + 1;
+			},
+			currentChange(next) {
+				this.currentPage = next;
+				if (this.cacheData[next]) { //如果已请求过该页数据,则使用缓存不重复请求
+					this.list = this.cacheData[next];
+				} else {
+					this.queryUserInfo();
+				}
+			},
+          	reBuyProduct(row) {  //确定续费
+				const params = {
+					'productId': row.productId,
+					'endTime': this.endTime,
+					'userId': row.userId,
+					'renewalsNo': row.renewalsNo
+				};
+				if(!this.endTime){
+                  this.$message({
+					showClose: true,
+                    message: '请先选择服务结束时间',
+                    type: 'warning'
+                  });
+                  return ;
+				}
+				api.modifyOpeningTime(params).then((res) => {
+					if (res.data.code == '0') {
+						this.$message({
+							showClose: true,
+							message: '操作成功!',
+							type: 'success'
+						});
+					  row.endTime = this.endTime;
+                      row.renewalsStatus = '1';
+                      row.renewalsStatusName = '已续费';
+					}else{
+                      this.$message({
+						showClose: true,
+                        message: res.data.msg,
+                        type: 'warning'
+                      });
+					}
+                  this.endTime = '';		//操作后清空状态
+				}).catch((error) => {
+                  this.$message({
+					showClose: true,
+                    message: "服务器正忙...",
+                    type: 'error'
+                  });
+                  this.endTime = '';
+				});
+			},
+			closeBtn(id) {
+				const cloId = id;
+				const params = {
+					'id': cloId
+				};
+				this.$confirm('确定取消此产品的续费服务?', '提示', {
+					confirmButtonText: '确定',
+					cancelButtonText: '取消',
+					cancelButtonClass:'cancelColor',
+					type: 'warning'
+				}).then(() => {
+					api.deleteRenewalsInfos(params).then((res) => {
+						if (res.data.code == '0') {
+							this.$message({
+								showClose: true,
+								message: '取消成功!',
+								type: 'success'
+							});
+						}else{
+                          this.$message({
+							showClose: true,
+                            message: res.data.msg,
+                            type: 'warning'
+                          });
+						}
+                      this.queryUserInfo();
+					}).catch((error) => {
+                      this.$message({
+						showClose: true,
+                        message: "服务器正忙...",
+                        type: 'warning'
+                      });
+					});
+				}).catch(() => {
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+	.regiBox {
+		.pop-btn{
+			padding: 0 1px;
+		}
+		.el-dialog {
+			width: 500px;
+			margin-top: 255px !important;
+		}
+		.reGary{
+			color: #ccc;
+			cursor: auto;
+		}
+	}
+    .cancelColor{
+		color: #22ccc8 !important;
+	}
+	.el-message-box__btns button:nth-child(2) {
+		color: #fff !important;
+	}
+	.el-input__prefix{
+		left: 5px;
+		right: auto;
+	}
+	.closeDate {
+		position: absolute;
+		top: 0px;
+		right: 7px;
+		cursor: pointer;
+		font-size: 20px;
+	}
+</style>

+ 308 - 0
src/components/admin/SuperAdmin.vue

@@ -0,0 +1,308 @@
+<template>
+    <div>
+        <crumbs title="超管信息">
+            <el-form :inline="true" class="demo-form-inline">
+                <el-form-item label="注册时间:">
+                    <el-date-picker v-model="filter.time"
+                                    value-format="yyyy-MM-dd HH:mm:ss"
+                                    :default-time="['00:00:01', '23:59:59']"
+                                    size="mini"
+                                    start-placeholder="开始日期"
+                                    end-placeholder="结束日期"
+                                    type="daterange"></el-date-picker>
+                </el-form-item>
+                <el-form-item label="机构名称:">
+                    <el-input v-model="filter.orgName" clearable size="mini" placeholder="机构名称"></el-input>
+                </el-form-item>
+                <el-form-item label="手机号:">
+                    <el-input v-model="filter.userName" clearable size="mini" placeholder="手机号"></el-input>
+                </el-form-item>
+                <el-form-item>
+                    <el-button size="mini" @click="filterDatas">确认</el-button>
+                    <router-link to="/admin/LT-DDXT-TJCG" style="margin:0 10px">
+                        <el-button size="mini" type="warning">添加超管</el-button>
+                    </router-link>
+                    <el-button size="mini" type="primary" @click="exportData">导出</el-button>
+                </el-form-item>
+            </el-form>
+        </crumbs>
+        <div class="contents">
+            <el-table :data="list"
+                      border
+                      style="width: 100%">
+                <el-table-column
+                        type="index"
+                        :index="indexMethod"
+                        label="编号"
+                        width="60">
+                </el-table-column>
+                <el-table-column
+                        prop="orgGmtCreate"
+                        label="注册时间"
+                        width="180">
+                </el-table-column>
+                <el-table-column
+                        prop="orderNum"
+                        label="认证申请单号"
+                        width="180">
+                </el-table-column>
+                <el-table-column
+                        prop="linkman"
+                        label="超管名称">
+                </el-table-column>
+                <el-table-column
+                        prop="orgName"
+                        label="所在机构"
+                        width="120"
+                >
+                </el-table-column>
+                <el-table-column
+                        prop="position"
+                        label="岗位名称">
+                </el-table-column>
+                <el-table-column
+                        prop="userName"
+                        label="手机号"
+                        width="140">
+                </el-table-column>
+                <el-table-column
+                        prop="email"
+                        label="邮箱">
+                </el-table-column>
+                <el-table-column
+                        prop="authStatusStr"
+                        label="状态">
+                </el-table-column>
+                <el-table-column
+                        label="审核状态"
+                        width="110">
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="showPassDialog(scope.row,1)">通过</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-popover placement="bottom-start"
+                                width="380"
+                                v-model="scope.row.visible"
+                        >
+                            <el-form>
+                                <span class="closeDate" @click="scope.row.visible= !scope.row.visible">×</span>
+                                <h4>原因说明</h4>
+                                <el-form-item>
+                                    <el-radio-group v-model="type" @change="rejectReason=''" v-if="reasons&&reasons.length">
+                                        <p v-for="(it,index) in reasons" style="margin: 10px 0;">
+                                            <el-radio :label="it.key">{{it.name}}</el-radio>
+                                        </p>
+                                    </el-radio-group>
+                                </el-form-item>
+                                <el-form-item>
+                                    <el-input v-model="rejectReason" @focus="type=''" type="textarea" placeholder="其他原因说明"></el-input>
+                                </el-form-item>
+                                <el-form-item>
+                                    <el-button type="primary" @click="handleApply(scope.row,0)">完成</el-button>
+                                </el-form-item>
+                            </el-form>
+                            <el-button slot="reference" size="mini" >不通过</el-button>
+                        </el-popover>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination v-if="total>pageSize"
+                           :current-page.sync="currentPage"
+                           @current-change="currentChange"
+                           background
+                           :page-size="pageSize"
+                           layout="total,prev, pager, next, jumper"
+                           :total="total">
+            </el-pagination>
+        </div>
+    </div>
+</template>
+
+<script>
+  import api from '@api/admin.js';
+  import utils from '@api/utils.js';
+
+  export default {
+    name: 'super-admin',
+    data: function () {
+      return {
+        visible: false,
+        reasons: [],
+        rejectReason: '',
+        type:'',
+        currentId: '',
+        status:'',
+        list: [],
+        cacheData: {},
+        currentPage: 1,
+        pageSize: 10,
+        total: 0,
+        filter: {
+          time: '',
+          orgName: '',
+          userName: ''
+        }
+      }
+    },
+    created() {
+      this.getDataList();
+      const enums = JSON.parse(localStorage.getItem('enumsData'));      //审核不通过原因枚举
+      this.reasons = enums&&enums.accdenEnum;
+    },
+    methods: {
+      showPassDialog(row,status){        //打开通过弹窗
+        this.$alert('操作不可逆!确定要通过审核吗?', '提示', {
+          confirmButtonText: '确定',
+          callback: action => {
+            if(action == 'confirm'){
+              this.currentId = row.userId;
+              this.status = status;
+              const param = {
+                userId: row.userId,
+                orderNum: row.orderNum
+              };
+              api.auditUserInfoAllPass(param).then((res)=>{
+                if(res.data.code=='0'){
+                  this.currentPage = 1;
+                  this.$message({
+                    message:'操作成功',
+                    type:'success'
+                  });
+                  this.getDataList(); //操作成功刷新列表
+                }else{
+                  this.$message({
+                    message:res.data.msg,
+                    type:'warning'
+                  });
+                }
+              });
+            }
+          }
+        });
+      },
+      handleApply(row){
+        const param = {
+          rejectComment: this.rejectReason,
+          rejectType: this.type,
+          userId: row.userId,
+          orderNum:row.orderNum
+        };
+        if(this.type===''&&this.rejectReason===''){
+          this.$message({
+            showClose: true,
+            message:'请选择/填写不通过原因',
+            type:'warning'
+          });
+          return;
+        }
+        if(this.rejectReason.length>100){
+          this.$message({
+            showClose: true,
+            message:'不通过原因最多可输入100字',
+            type:'warning'
+          });
+          return;
+        }
+        api.auditUserInfoAll(param).then((res)=>{
+          if(res.data.code=='0'){
+            this.currentPage = 1;
+            this.$message({
+              showClose: true,
+              message:'操作成功',
+              type:'success'
+            });
+
+          }else{
+            this.$message({
+              showClose: true,
+              message:res.data.msg,
+              type:'warning'
+            });
+          }
+          this.getDataList(); //操作后刷新列表
+        });
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      filterDatas(){
+        this.currentPage = 1;
+        this.getDataList();
+      },
+      getDataList() {
+        const param = this.getFilterItems();
+        api.getAuthentication(param).then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            this.list = data.records.map((item) => {
+              return {...item, visible:false}
+            });       //当前页显示的数据
+            this.cacheData[param.current] = data.records;       //缓存数据
+            this.total = data.total;
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      currentChange(next) {          //切换当前页
+        this.currentPage = next;
+        if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
+          this.list = this.cacheData[next];
+        } else {
+          this.getDataList();
+        }
+      },
+      getFilterItems() {           //筛选
+        const time = this.filter.time;
+        const startTime = time&&time[0]||undefined;
+        const endTime = time&&time[1]||undefined;
+        const param = {
+          startTime,
+          endTime,
+          userName: this.filter.userName||undefined,
+          orgName: this.filter.orgName||undefined,
+          current: this.currentPage,
+          size: this.pageSize
+        };
+        return param;
+      },
+      exportData() {             //导出
+        const canExport = utils.exportCondition(this.filter.time);
+        if(typeof canExport == 'string'){
+          this.$message({
+            message:canExport,
+            type:'warning'
+          });
+          return;
+        }
+        const param = this.getFilterItems();
+        api.exportKema(param).then((res) => {
+          if (res.data.code = '0') {
+            utils.downloadExportedData(res.data, '审核超管信息表.xls');
+            this.$message({message: "导出成功", type: 'success'});
+          } else {
+            this.$message({
+              message: res.data.msg,
+              type: 'warning'
+            });
+          }
+        }).catch((error) => {
+          this.$message({
+            message: "服务器正忙...",
+            type: 'warning'
+          });
+        });
+      }
+    }
+  }
+</script>
+
+<style lang="less">
+    @import "../../less/admin.less";
+    .closeDate {
+      position: absolute;
+      top: 0px;
+      right: 7px;
+      cursor: pointer;
+      font-size: 20px;
+    }
+</style>

+ 45 - 0
src/components/base/LtBadge.vue

@@ -0,0 +1,45 @@
+<template>
+    <span class="lt-badge" @click="toAuth">
+        <slot></slot>
+    </span>
+</template>
+
+<script>
+  export default {
+    name: 'lt-badge',
+    props:['authStatus'],
+    methods:{
+        toAuth(){
+            if(this.authStatus=="0"){
+                this.$router.push({path:'YH-JGZX-ZHXX'});
+            }
+        }
+    },
+    
+  }
+</script>
+
+<style>
+    .userInfo .lt-badge {
+        display: inline-block;
+        height: 15px;
+        line-height: 15px;
+        font-size: 10px;
+        color: #fff;
+        padding: 1px 6px;
+        border-radius: 2px;
+        margin-left: 5px;
+    }
+
+    .green {
+        background: #32b16c;
+    }
+
+    .warn {
+        background: #ffb03b;
+    }
+
+    .gray {
+        background: #c9c9c9;
+    }
+</style>

+ 101 - 0
src/components/common/Banner.vue

@@ -0,0 +1,101 @@
+<template>
+    <div class="container">
+        <div class="banner">
+            <div class="logo fl">
+                <img src="../../images/robot_icon.png" alt="朗通logo"/>
+                <img class="img-title" src="../../images/title.png"/>
+            </div>
+            <div class="consult fr">
+                <span>咨询热线:{{phone}} &nbsp;</span> |
+                <span>服务时间:{{workTime}}</span>
+                <span class="toLogin" v-show="route=='/register'">已有账号?<b @click="toLogin">立即登录</b></span>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+  // import '@components/login/login.less';
+  export default {
+    template: '#banner-template',
+    data() {
+      return {
+        phone: '400-600-1919',
+        workTime: '09:00-17:30'
+      }
+    },
+    computed:{
+        route(){
+            return this.$route.path;
+        } 
+    },
+    methods:{
+        toLogin(){
+            this.$router.push({path:'/'});
+        }
+    }
+  };
+</script>
+<style lang="less">
+    * {
+        margin: 0;
+        padding: 0;
+    }
+
+    html, body {
+        width: 100%;
+        height: 100%;
+        /* 		background-image:url(/src/images/bg.jpg);
+                background-size: 100% 100%;
+                background-repeat: no-repeat; */
+    }
+
+    .container {
+        width: 100%;
+        height: 100%;
+        background-image: url(../../images/bg.jpg);
+        background-size: 100% 100%;
+        background-repeat: no-repeat;
+
+    .banner {
+        height: 60px;
+        background: #fff;
+        line-height: 60px;
+    }
+
+    .banner img {
+        display: inline-block;
+        margin-top: 10px;
+        margin-left: 30px;
+    }
+
+    .img-title {
+        margin-left: 10px !important;
+    }
+
+    .consult {
+        margin-right: 30px;
+        color: #424243;
+        font-size: 14px;
+        float: right;
+    }
+
+    .logo {
+        display: inline-block;
+    }
+
+    .consult {
+        display: inline-block;
+    }
+    .toLogin{
+        margin-left: 10px;
+        >b{
+            color:#1774f0;
+            cursor: pointer;
+        }
+    }
+
+    }
+
+
+</style>

+ 51 - 0
src/components/common/Crumbs.vue

@@ -0,0 +1,51 @@
+<template>
+    <div class="container clearfix">
+        <img v-if="linkTo" class="return-btn fl" src="../../images/return.png" alt="返回按钮" @click="goBack">
+        <h4 class="fl">{{title}}</h4>
+        <div class="contents fr">
+            <slot></slot>
+        </div>
+    </div>
+</template>
+
+<script>
+  export default {
+    name: 'crumbs',
+    props: ['title','linkTo'],
+    data: function () {
+      return {}
+    },
+    methods:{
+      goBack(){
+        this.$router.push({
+          path:this.linkTo,
+          query:this.curPage
+        });
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+    @import "../../less/common.less";
+
+    div.container {
+        width: calc(100% - 50px);
+        height: 40px;
+        background: #fff;
+        padding: 0 20px 0 30px;
+        margin-bottom: 20px;
+        line-height: 40px;
+        position: absolute;
+        z-index: 5;
+        min-width: 980px;
+    }
+
+    .return-btn{
+        margin: 11px 5px 0 0;
+    }
+
+    h4 {
+        font-size: 15px;
+    }
+</style>

+ 161 - 0
src/components/common/HomePage.vue

@@ -0,0 +1,161 @@
+<template>
+    <el-container :class="getRole">
+        <el-aside>
+            <div class="logo">
+                <p v-if="userLoginDTO&&userLoginDTO.type=='1'"><b>朗通后台管理系统</b></p>
+                <p v-if="userLoginDTO&&userLoginDTO.type=='0'"><b>DiagbotCloud</b></p>
+                <p v-if="userLoginDTO&&userLoginDTO.type=='0'"><b>后台管理系统</b></p>
+            </div>
+                 <lt-menu v-if="menuWrappers&&menuWrappers.length" v-bind:role="getRole"
+                 v-bind:data="menuWrappers"></lt-menu>
+        </el-aside>
+        <el-container>
+            <el-header class="clearfix">
+                <div class="title fl">
+                    <h2>{{organization&&organization.name}}</h2>
+                </div>
+                <div class="userInfo fr">
+                    <span class="username" @click="goCenter">{{userLoginDTO&&userLoginDTO.linkman}}</span>
+                    <lt-badge v-if="getRole=='user'" class="green" :authStatus="authStatus">
+                        {{authStatusName}}
+                    </lt-badge>
+                    <el-button type="info" size="small" plain @click="logout">退出</el-button>
+                </div>
+            </el-header>
+            <el-main>
+              <router-view v-on:status-change="changeStatus"></router-view>
+            </el-main>
+        </el-container>
+    </el-container>
+</template>
+
+<script>
+  import LtMenu from '../common/Menu.vue';
+  import LtBadge from '@base/LtBadge.vue';
+  import api from '@api/index.js';
+  import userApi from '@api/user.js';
+  import Console from '@components/user/Console.vue';
+
+  export default {
+    name: 'homepage',
+    components: {
+      'lt-badge': LtBadge,
+      'lt-menu': LtMenu,
+			'console': Console
+    },
+    data: function () {
+      return {
+        menuWrappers: null,
+        organization: null,
+        userLoginDTO: null,
+        authStatus: null,
+        authStatusName:''
+      }
+    },
+    computed: {
+      getRole: function () {
+        return this.userLoginDTO && this.userLoginDTO.type == '0' ? 'user' : 'admin';
+      }
+    },
+    created() {
+      //获取菜单
+      api.getAccessdMenu().then((res) => {
+        if (res.data.code == '0') {
+          const data = res.data.data;
+          this.menuWrappers = data.menuWrappers;
+          this.organization = data.organization;
+          this.userLoginDTO = data.userLoginDTO;
+          data.userLoginDTO && data.userLoginDTO.type == '0' && this.getAuthStatus();
+        }
+      }).catch((error) => {
+        console.log(error);
+      });
+
+    },
+    methods: {
+      changeStatus(text){       //账号信息中提交认证后修改状态
+        this.authStatus = 2;
+        this.authStatusName = text;
+      },
+      goCenter(){
+        const url = this.getRole=='user'?'':'/admin/LT-GRZX';
+        this.$router.push({path:url});
+      },
+      getAuthStatus() {
+        //获取用户认证状态
+        userApi.getUserAuthStatus().then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            // this.authStatus = data[0];
+            this.authStatusName = data.authStatusName;
+            this.authStatus = data.authStatus;
+          }
+        }).catch((error) => {
+          console.log(error)
+        });
+      },
+      logout(){//退出
+        localStorage.removeItem('token');
+        this.$router.push({path:'/'});
+      }
+    }
+  }
+</script>
+
+<style lang="less">
+
+    @import '../../less/common.less';
+
+    .user .el-menu-item.is-active {
+        color: @userBase;
+    }
+
+    .admin .el-menu-item.is-active {
+        color: @adminBase;
+    }
+    .admin .username{
+        cursor: pointer;
+    }
+</style>
+<style lang="less" scoped>
+    @import '../../less/common.less';
+    .user .logo {
+        background: @userBase;
+
+    p {;
+        font-size: 16px;
+        line-height: normal
+    }
+
+    }
+    .admin .logo {
+        background: @adminBase;
+
+    p {
+        font-size: 18px;
+        line-height: 40px;
+    }
+
+    }
+    .title {
+
+    h2 {
+        display: inline-block;
+        line-height: 60px;
+        font-size: 18px;
+    }
+
+    }
+    .block {
+        height: 40px;
+        width: 100%;
+        background: #fff;
+        box-shadow: 0px 1px 2px #c9c9c9;
+    }
+		.el-main{
+			padding: 0;
+		}
+    .el-button{
+      margin-left: 15px;
+    }
+</style>

+ 41 - 0
src/components/common/Menu.vue

@@ -0,0 +1,41 @@
+<template>
+    <el-menu :router="true"
+            :default-active="defaultMItem"
+            class="el-menu-vertical-demo">
+        <template v-for="(item,index) in data">
+            <el-menu-item :index="'/'+role+'/'+item.code" v-if="item.subMenuList.length==0">
+                <i v-bind:class="icons[item.code]"></i>
+                <span slot="title">{{item.name}}</span>
+            </el-menu-item>
+            <el-submenu v-if="item.subMenuList.length>0" :index="index+1+''">
+                <template slot="title">
+                    <i class="el-icon-location"></i>
+                    <span>{{item.name}}</span>
+                </template>
+                <el-menu-item v-for="(sub,i) in item.subMenuList" :index="'/'+role+'/'+sub.code">{{sub.name}}</el-menu-item>
+            </el-submenu>
+        </template>
+    </el-menu>
+</template>
+
+<script>
+  import config from '@api/config.js';
+
+  export default {
+    name: 'lt-menu',
+    props: ['data', 'role'],
+    data: function () {
+      return {
+        icons: config.menuIconList
+      }
+    },
+    computed:{
+        defaultMItem:function () {
+            let route = this.$route.path;
+            return route;
+        }
+    },
+    methods: {
+    }
+  }
+</script>

+ 26 - 0
src/components/common/MiniTile.vue

@@ -0,0 +1,26 @@
+<!-- 主页顶部的副标题组件,需要在使用组件中引用base.less中的.miniTitle。-->
+<template>
+    <div class="miniBox">
+        <slot name="mini"></slot>
+        <slot name="info"></slot>
+    </div>
+</template>
+<script type="text/javascript">
+  export default {
+    name: 'MiniTile',
+    data() {
+      return {}
+    }
+  }
+</script>
+<style lang="less" scoped>
+  .miniBox{
+    width: 100%;
+    height: 40px;
+    line-height: 40px;
+    background: #fff;
+    display: flex;
+    justify-content: space-between;
+    border-bottom: 1px solid #c9c9c9;
+  }
+</style>

+ 0 - 0
src/components/common/banner.less


+ 430 - 0
src/components/forgetPassword/FindPassword.vue

@@ -0,0 +1,430 @@
+<template>
+    <div class="contentBo">
+        <div class="find-container">
+            <Banner></Banner>
+            <div class="box">
+                <h3>
+                  <img v-show="showText=='修改密码'" src="../../images/return.png" height="18" width="18" @click="back">
+                  {{showText}}
+                </h3>
+                <div class="main">
+                    <div class="progress">
+                        <p class="progress-info">
+                            <span class="finished">输入验证信息</span>
+                            <span :class="['unfinished',{'finished':newPawComplete}]">输入新密码</span>
+                            <span :class="['unfinished',{'finished':complete}]">完成设置</span>
+                        </p>
+                        <p :class="['progress-pic',{'progress-new':newPawComplete,'progress-fin':complete}]"></p>
+                    </div>
+                    <form>
+                        <div class="first" v-if="flag==1">
+                            <input type="tel" name="" v-model="phone" maxlength="11" @input="handleTelInput"
+                                   placeholder="手机号" @blur="checkPhone">
+                            <div class="yanzm" maxlength="11">
+                                <input type="text" name="" v-model="picCode" @blur="checkImgCode" maxlength="4"
+                                       placeholder="图形验证码">
+
+                                <img :src='"data:image/png;base64,"+imgCode' @click="refreshCode">
+                            </div>
+                            <div class="yanzm">
+                                <input type="text" name="" v-model="msgCode" maxlength="6" placeholder="短信验证码" @blur="checkMsgCode">
+                                <div v-if="timerFlag" type="primary" class="getMsg disabled">{{time + 's后重新发送'}}</div>
+                                <div v-else class="getMsg" @click="getMsgCode">点击获取验证码</div>
+                            </div>
+                            <span class="tips" v-show="imgCodeErr">{{codeErrText}}</span>
+                        </div>
+                        <div class="second" v-if="flag == 2">
+                            <input type="password" name="" placeholder="新密码(6-16位字母、数字组合)" v-model="newPsw"
+                                   @blur="checkPsw" maxlength="16">
+                            <input type="password" name="" placeholder="确认新密码(6-16位字母、数字组合)" v-model="newPswAgain"  maxlength="16">
+                        </div>
+                        <div class="third" v-if="flag == 3">
+                            <p class="suc">恭喜,登录密码已修改成功!</p>
+                        </div>
+                        <div class="next" v-if="changCor">{{nextText}}</div>
+                        <div :class="['next nextCor',{'goLogin':flag == 3}]" @click="toNext(flag)" v-else>{{nextText}}
+                        </div>
+
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+<script type="text/javascript">
+  import api from '../../api/index.js';
+  import utils from '@api/utils.js';
+  import '@components/forgetPassword/findPassword.less';
+  import Banner from '@components/common/Banner.vue';
+  import md5 from 'js-md5'
+
+  export default {
+    name: 'FindPassword',
+    data() {
+      return {
+        showText:'找回密码',
+        phone: '',
+        picCode: '',//用户输入
+        msgCode: '',
+        imgCode: '',//流
+        imgId: '',
+        flag: 1,//切换下一页
+        nextText: '下一步',
+        changCor: true,
+        imgCodeErr: false,
+        time: 60,
+        timer: null,
+        timerFlag: false,//倒计时标识
+        newPawComplete: false,//进度条1
+        complete: false, //进度条2
+        newPsw: '',
+        newPswAgain: '',
+        picTimer: null,//图形验证码时限
+        picTime: 600,
+        msgCodeTimer:null,//短信验证码
+        msgCodeTime:180,
+        codeErrText:'',
+        modifiPsw:'',//修改密码
+
+      }
+    },
+    created() {
+      //localStorage.removeItem('token');
+      this.getPicCode();
+      const type = document.URL;
+      if(type.indexOf('?')>=0){
+        this.showText = "修改密码";
+        this.modifiPsw = "Y";
+      }else{
+        this.showText = "忘记密码";
+        this.modifiPsw = "";
+      }
+    },
+    beforeDestroy() {
+      window.clearInterval(this.picTimer);
+      window.clearInterval(this.msgCodeTimer);
+    },
+    methods: {
+      back(){
+        this.$router.go(-1);
+      },
+      CalcuMD5(password){
+        // password = password.toUpperCase();
+        password = md5(password);
+        return password;
+      },
+      handleTelInput(e) {//手机号输入验证
+        this.phone = e.target.value.replace(/[^\d]/g, ''); //限制只能输入数字
+        let firstNum = this.phone.substring(0, 1);//第一位1
+        if (firstNum != 1) {
+          this.phone = "";
+        }
+      },
+      getPicCode() {//获取图形验证码
+        api.getImgCode().then((res) => {
+          if (+res.data.code == 0) {
+            const imgCodeInfo = res.data.data;
+            this.imgCode = imgCodeInfo.imgByte;
+            this.imgId = imgCodeInfo.imgId;
+
+            let that = this;
+            this.picTimer = window.setInterval(() => {
+              if ((that.picTime--) <= 0) {
+                this.$message({
+                  message: '图形验证码已过期',
+                  type: 'warning'
+                });
+                that.picCode = '';
+                that.picTime = 600//图形验证码过期时间10分钟;
+                window.clearInterval(that.picTimer);
+                that.getPicCode();//过期刷新验证码
+              }
+            }, 1000);
+
+          } else {
+            this.$message({
+              message: res.data.msg,
+              type: 'warning'
+            });
+
+          }
+        }).catch((err) => {
+          console.log(err);
+        })
+      },
+      refreshCode() {//刷新图形验证码
+        window.clearInterval(this.picTimer);
+        this.picTime = 600;//图形验证码过期时间10分钟;
+        this.getPicCode();
+      },
+      checkImgCode() {//验证图片验证码
+        if (this.picCode.trim()) {//定义参数
+          const params = {
+            imgCode: this.picCode,
+            imgId: this.imgId
+          }
+          api.vertifyImgCode(params).then((res) => {
+            if (+res.data.code != 0) {//验证失败
+              this.imgCodeErr = true
+              this.codeErrText = "图形验证码错误";
+            } else {
+              this.imgCodeErr = false
+              /*window.clearInterval(this.picTimer);
+              this.picTime = 600*/
+            }
+          }).catch((err) => {
+            console.log(err);
+          })
+        }
+
+      },
+      checkPhone() {//验证手机号
+        // const reg = new RegExp(/^((13|14|15|16|17|18|19)\d{9})$/);
+        const reg = utils.phoneReg;
+        if(this.phone.trim()){
+          if (!reg.test(this.phone)) {
+            /*this.$message({
+              message: '手机格式不正确',
+              type: 'warning'
+            });*/
+            this.imgCodeErr = true;
+            this.codeErrText = "手机格式不正确";
+            this.phone = "";
+          }else{//验证手机号是否注册
+            this.imgCodeErr = false;
+            api.checkForgetTel(this.phone).then((res)=>{
+              if(+res.data.code == 0){
+                
+              }else{
+                this.$message({
+                  message: res.data.msg,
+                  type: 'warning'
+                });
+                this.phone = "";
+              }
+            })
+          }
+        }
+      },
+      getMsgCode() {//获取短信验证码
+        if(!this.phone){
+          /*this.$message({
+            message: '手机号不能为空',
+            type: 'warning'
+          });*/
+          this.imgCodeErr = true;
+          this.codeErrText = "手机号不能为空";
+        }else if(!this.picCode){
+          this.imgCodeErr = true
+          this.codeErrText = "图形验证码不能为空";
+        }else{
+          //调请求接口
+          if(!this.imgCodeErr){
+            this.imgCodeErr = false;
+            const params = {
+              imgCode: this.picCode,
+              imgId: this.imgId,
+              mobile: this.phone
+            }
+            api.forgetPswGetMobileCode(params).then((res) => {
+              if (+res.data.code == 0) {
+
+                this.$message({
+                  message: '验证码发送成功',
+                  type: 'success'
+                });
+                //按钮倒计时
+                this.timerFlag = true;
+                let that = this;
+                this.timer = window.setInterval(() => {
+                  if ((that.time--) <= 0) {
+                    that.time = 60;
+                    that.timerFlag = false;
+                    window.clearInterval(that.timer);
+                  }
+                }, 1000)
+
+                //短信验证码180s过期时间
+                this.msgCodeTimer = window.setInterval(() => {
+                  if ((that.msgCodeTime--) <= 0) {
+                    this.$message({
+                      message: '短信验证码已过期,请重新获取',
+                      type: 'warning'
+                    });
+                    that.msgCode = '';
+                    that.msgCodeTime = 180;
+                    window.clearInterval(that.msgCodeTimer);
+                  }
+                }, 1000);
+
+              } else {
+                console.log(res.data);
+                this.$message({
+                  message: res.data.msg,
+                  type: 'warning'
+                });
+                // return
+              }
+            }).catch((err) => {
+              console.log(err);
+            })
+          }
+        }
+
+      },
+      checkPsw() {//校验密码
+        // const pswlReg = /^(?![0-9]+$)(?![a-zA-Z]+$)/;
+        const pswlReg = utils.pswReg;
+        const psw = this.psw;
+        if (psw) {
+          if (psw.trim().length < 6 || psw.trim().length > 16) {
+            this.imgCodeErr = true;
+            this.codeErrText = "密码长度为6-16位";
+            this.psw = "";
+          }
+          else if (!pswlReg.test(psw)) {
+            this.imgCodeErr = true;
+            this.codeErrText = "密码过于简单";
+            this.psw = "";
+          }else{
+            this.imgCodeErr = false;
+          }
+        }
+
+      },
+      checkMsgCode(){
+        const params = {
+            imgCode: this.picCode,
+            imgId: this.imgId,
+            mobile: this.phone,
+            smsCode: this.msgCode
+          }
+          api.vertifyMobileCode(params).then((res) => {
+            // 验证成功,切换下一页
+            if (+res.data.code == 0) {
+              // this.flag = 2;//切换下一页
+              // this.newPawComplete = true;
+              this.imgCodeErr = false;
+            } else {
+              // this.$message.error('短信验证码错误');
+              this.imgCodeErr = true;
+              this.codeErrText = "短信验证码错误";
+              this.msgCode = "";
+            }
+          }).catch((err) => {
+            console.log(err);
+          })
+      },
+      toNext(flag) {//点下一步验证短信验证码
+        //掉验证接口
+        if (flag == 1) {//验证第一页数据
+          const params = {
+            imgCode: this.picCode,
+            imgId: this.imgId,
+            mobile: this.phone,
+            smsCode: this.msgCode
+          }
+          api.vertifyMobileCode(params).then((res) => {
+            // 验证成功,切换下一页
+            if (+res.data.code == 0) {
+              this.flag = 2;//切换下一页
+              this.newPawComplete = true;
+              this.imgCodeErr = false;
+            } else {
+              // this.$message.error('短信验证码错误');
+              this.imgCodeErr = true;
+              this.codeErrText = "短信验证码错误";
+              this.msgCode = "";
+            }
+          }).catch((err) => {
+            console.log(err);
+          })
+
+        }
+
+        if (flag == 2) {//验证两次输入是否一致
+          if (this.newPsw && this.newPswAgain) {
+            if (this.newPsw.trim() == this.newPswAgain.trim()) {
+              const mdPsw = this.CalcuMD5(this.newPsw);
+              //调接口
+              const params = {
+                password: mdPsw,
+                username: this.phone,
+                diffPassword:this.modifiPsw
+              }
+              api.resetPsw(params).then((res) => {
+                if (+res.data.code == 0) {
+                  this.flag = 3;
+                  this.complete = true;
+                  //修改成功清除定时器
+                  // window.clearInterval(this.picTimer);
+                }else {
+                  this.$message({
+                    message: res.data.msg,
+                    type: 'warning'
+                  });
+                  this.newPsw = "";
+                  this.newPswAgain = "";
+                }
+              }).catch((err) => {
+                console.log(err);
+              })
+
+            } else {
+              this.$message({
+                message: '两次密码不一致',
+                type: 'warning'
+              });
+            }
+          }
+
+        }
+        if (flag == 3) {
+          this.$router.push({path: '/'})
+        }
+
+
+      },
+    },
+    computed: {
+      nextButton() {
+        const {phone, picCode, msgCode, flag, newPsw, newPswAgain,imgCodeErr} = this;
+        return {
+          phone,
+          picCode,
+          msgCode,
+          flag,
+          newPsw,
+          newPswAgain,
+          imgCodeErr
+        }
+      }
+    },
+    watch: {
+      nextButton: {
+        handler: function (val) {//所有数据不为空,且手机格式正确、图形验证码正确
+          if (val.flag == 3) {
+            this.nextText = "去登录";
+          }
+          if (val.phone.trim() && val.picCode.trim() && val.msgCode.trim() && !val.imgCodeErr && val.flag == 1) {
+          // if (val.phone.trim() && val.picCode.trim() && val.msgCode.trim() && val.flag == 1) {
+            this.changCor = false;
+          } else {
+            this.changCor = true;
+          }
+
+          if (val.newPsw.trim() && val.newPswAgain.trim()) {
+            this.changCor = false;
+
+          } else {
+            // this.changCor = true;
+          }
+        },
+        deep: true
+      }
+    },
+    components: {
+      Banner
+    },
+  }
+</script>

+ 156 - 0
src/components/forgetPassword/findPassword.less

@@ -0,0 +1,156 @@
+.contentBo {
+  width: 100%;
+  height: 100%;
+}
+
+.find-container {
+  width: 100%;
+  height: 100%;
+  .box {
+    width: 460px;
+    // box-shadow: 0 0 5px #979597;
+    box-shadow: 0 0 5px rgba(151, 149, 151, 0.44);
+    background: #fff;
+    position: absolute;
+    left: 50%;
+    top: 47%;
+    transform: translate(-50%, -50%);
+    //margin: 0 auto;
+    //margin-top: 10%;
+    overflow: hidden;
+    font-size: 12px; //默认字体
+    color: #424243; //默认颜色
+    box-sizing: border-box;
+    h3 {
+      width: 100%;
+      height: 36px;
+      line-height: 36px;
+      background: #eee;
+      text-align: left;
+      padding-left: 15px;
+      font-size: 14px;
+      margin: 0;
+      img{
+        vertical-align: middle;
+        cursor: pointer;
+      }
+    }
+    .main {
+      width: 100%;
+      .progress {
+        width: 290px;
+        margin: auto;
+        .progress-info {
+          display: flex;
+          justify-content: space-between;
+          margin: 25px 0 8px;
+        }
+        .unfinished {
+          color: #aaa;
+        }
+        .finished {
+          color: #f8b551;
+          font-weight: bold;
+        }
+        .progress-pic {
+          height: 14px;
+          background: url(../../images/3steps-1.png) no-repeat center;
+          margin-bottom: 20px;
+        }
+        .progress-new {
+          background: url(../../images/3steps-2.png) no-repeat center;
+        }
+        .progress-fin {
+          background: url(../../images/3steps-3.png) no-repeat center;
+        }
+      }
+      form {
+        width: 292px;
+        margin: auto;
+        input {
+          width: 285px;
+          height: 34px;
+          outline: none;
+          border: none;
+          border: 1px solid #c9c9c9;
+          margin-bottom: 10px;
+          padding-left: 5px;
+        }
+        input::-webkit-input-placeholder {
+          color: #c9c9c9;
+        }
+        input::-moz-placeholder { /* Mozilla Firefox 19+ */
+          color: #c9c9c9;
+        }
+        input:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
+          color: #c9c9c9;
+        }
+        input:-ms-input-placeholder { /* Internet Explorer 10-11 */
+          color: #c9c9c9;
+        }
+        .tips{
+          display: inline-block;
+          font-size: 12px;
+          color: #dd0f0f;
+          position: absolute;
+        }
+        .yanzm {
+          input {
+            width: 150px;
+          }
+          .getMsg {
+            display: inline-block;
+            width: 125px;
+            height: 34px;
+            line-height: 34px;
+            text-align: center;
+            color: #2485c4;
+            border: 1px solid #2485c4;
+            background: #dde8ef;
+            cursor: pointer;
+            vertical-align: middle;
+            margin: -3px 0 0 4px;
+          }
+          img {
+            width: 125px;
+            height: 34px;
+            display: inline-block;
+            vertical-align: middle;
+            margin: -3px 0 0 4px;
+            cursor: pointer;
+          }
+          .disabled {
+            background: #c9c9c9;
+            border: none;
+          }
+        }
+
+        .next {
+          width: 290px;
+          height: 40px;
+          line-height: 40px;
+          text-align: center;
+          background: #c9c9c9;
+          color: #fff;
+          margin: 30px auto 20px;
+          // margin: 12px auto 20px;
+          cursor: pointer;
+        }
+        .nextCor {
+          background: #2485c4;
+        }
+        .suc {
+          font-size: 16px;
+          text-align: center;
+          margin: 80px 0 65px;
+        }
+        .second {
+          margin-bottom: 76px;
+        }
+        .goLogin {
+          margin-bottom: 32px;
+        }
+      }
+    }
+  }
+}

+ 209 - 0
src/components/login/Login.vue

@@ -0,0 +1,209 @@
+<template>
+    <div class="login-container">
+        <banner></banner>
+        <div class="login-box">
+            <div class="box-le"><img src="../../images/left.jpg"/></div>
+            <div class="box-ri">
+                <h3>账号登录</h3>
+                <div class="ri-center">
+                    <el-form :model="ruleForm2" :rules="rules2" ref="ruleFormReg">
+                        <el-form-item prop="tel">
+                            <el-input v-model="ruleForm2.tel" name="username" autocomplete="off" maxlength="11"
+                                      placeholder="请输入用户名或手机号"
+                                      clearable class="ri-tel" @keyup.enter.native="submitForm('ruleForm2')"
+                                      ref="username"></el-input>
+                        </el-form-item>
+                        <div style="height: 30px;"></div>
+                        <el-form-item prop="pwd">
+                            <el-input v-model="ruleForm2.pwd" name="password" autocomplete="off" maxlength="16"
+                                      placeholder="请输入密码"
+                                      clearable type="password" class="ri-pwd"
+                                      @keyup.enter.native="submitForm('ruleForm2')" ref="password"></el-input>
+                        </el-form-item>
+                        <el-form-item>
+                            <span class="num" @click="toRegister">注册账号</span>
+                            <span class="pwd" @click="toForgetPsw">忘记密码</span>
+                        </el-form-item>
+                        <el-form-item>
+                            <el-button plain v-if="otherCor" @click="submitForm('ruleForm2')">登录</el-button>
+                            <el-button ref="btn" v-else class="otherCor" plain @click="submitForm('ruleForm2')">登录
+                            </el-button>
+                        </el-form-item>
+                    </el-form>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+  import Vue from 'vue';
+  import banner from '../common/Banner.vue';
+  import api from '../../api/index.js';
+  import './login.less';
+  import md5 from 'js-md5'
+	
+  export default {
+    name: 'Login',
+    data() {
+      //手机号码验证
+      var myreg = /^1[0-9]{10}$/;
+      //密码验证 纯字母纯英文
+      var numreg = /^(?![0-9]+$)(?![a-zA-Z]+$)/;
+      //密码验证 密码长度
+      var lengreg = /^[0-9A-Za-z]{6,16}$/;
+      var validatePass = (rule, value, callback) => {
+        // if(isNaN(value) == false){   //手机号
+        // 正常情况
+
+        if (value.trim() == '') {
+          callback(new Error('用户名不能为空'));
+          this.$refs.username.value = "";
+        }
+        // 手机号
+        if (isNaN(value) == false) {
+          if (value.length !== 11 || !myreg.test(value)) {
+            callback(new Error('请输入正确的手机号码'));
+          } else {
+            callback();
+          }
+        } else if (isNaN(value) == true) {
+          callback();
+        }
+      };
+      var validatePass2 = (rule, value, callback) => {
+        if (value.trim() == '') {
+          callback(new Error('密码不能为空'));
+          this.$refs.password.value = "";
+        } else if (value.length < 6) {
+          callback(new Error('密码长度应为6位至16位之间'));
+        } else if (!numreg.test(value)) {
+          callback(new Error('密码不能为纯数字或纯英文'));
+        } else {
+          callback();
+        }
+      };
+      return {
+        otherCor: true,
+        ruleForm2: {
+          tel: '',
+          pwd: ''
+        },
+        rules2: {
+          tel: [{
+            required: true,
+            validator: validatePass,
+            trigger: 'blur'
+          }],
+          pwd: [{
+            required: true,
+            validator: validatePass2,
+            trigger: 'blur'
+          }],
+        }
+      };
+    },
+    mounted() {
+      if (window.history && window.history.pushState) {
+        history.pushState(null, null, document.URL);
+        window.addEventListener('popstate', function () {
+            history.pushState(null, null, document.URL);
+        });
+      }
+    },
+    computed: {
+      nextButton() {
+        const {
+          tel,
+          pwd
+        } = this.ruleForm2;
+        return {
+          tel,
+          pwd
+        }
+      }
+    },
+    watch: {
+      nextButton: {
+        handler: function (val) {
+          if (val.tel.trim() && val.pwd.trim()) {
+            this.otherCor = false;
+          } else {
+            this.otherCor = true;
+          }
+        },
+        deep: true
+      }
+    },
+    methods: {
+      CalcuMD5(password){
+        // password = password.toUpperCase();
+        password = md5(password);
+        return password;
+      },
+      submitForm: function () {
+        const username = this.ruleForm2.tel;
+        const password = this.CalcuMD5(this.ruleForm2.pwd);
+        let params = {
+          "username": username,
+          "password": password
+        }
+        //重新登录清空原有token;
+        //localStorage.removeItem('token');
+        this.$refs.ruleFormReg.validate((valid) => {
+          if (valid) {
+            api.loginMess(params).then((res) => {
+              if (res.status == 200) {
+								// console.log(res)
+                if (res.data.code == '10020000') { //未注册
+                  // this.$message.error(res.data.msg);
+									this.$message.error("该账号或手机号未注册!")
+                } else if (res.data.code == '10020001') { //密码错误
+                  this.$message.error(res.data.msg);
+                } else if (res.data.code == '0') {
+                  const token = JSON.stringify(res.data.data);
+                  localStorage.setItem("token", token);
+                  this.$message({
+                    message: '登录成功!',
+                    type: 'success',
+                    duration: 1000,
+                    onClose: function () {
+                      const type = res.data.data.type;
+                      if (type == 0) {
+                        this.$router.push({
+                          path: '/user/YH-KZT'
+                        });
+                      } else if (type == 1) {
+                        this.$router.push({
+                          path: '/admin/LT-KZT'
+                        });
+                      }
+                    }.bind(this)
+                  });
+                }
+              }
+            }).catch((err) => {
+              console.log(err);
+            })
+          } else {
+            console.log('faild')
+            return false;
+          }
+        });
+      },
+      toRegister() { //点击注册
+        this.$router.push({
+          path: '/register'
+        });
+      },
+      toForgetPsw() {//忘记密码
+        this.$router.push({
+          path: '/forgetPassword'
+        });
+      }
+    },
+    components: {
+      'banner': banner
+    },
+  }
+</script>

+ 122 - 0
src/components/login/login.less

@@ -0,0 +1,122 @@
+.login-container {
+  width: 100%;
+  height: 100%;
+  min-width: 700px;
+  .box-le {
+    /* position: relative; */
+    float: left;
+  }
+  .login-box {
+    width: 580px;
+    position: absolute;
+    left: 50%;
+    top: 47%;
+    transform: translate(-50%, -50%);
+  }
+
+  .box-le img {
+    width: 230px;
+    height: 380px;
+    border-top-left-radius: 2px;
+    border-bottom-left-radius: 2px
+  }
+
+  .box-ri {
+    width: 350px;
+    height: 380px;
+    background: #fff;
+    float: left;
+    border-top-right-radius: 2px;
+    border-bottom-right-radius: 2px
+  }
+
+  .box-ri h3 {
+    font-size: 20px;
+    margin: 25px 0 50px 30px;
+    color: #595959;
+  }
+
+  .ri-center {
+    text-align: center;
+  }
+
+  .ri-center .el-input__inner {
+    width: 290px;
+    border-top: none;
+    border-right: none;
+    border-left: none;
+    border-radius: 0;
+    outline: none;
+    color: #424243;
+    font-size: 14px;
+    padding: 0px;
+    /* margin-top: 20px; */
+  }
+
+  .ri-center .el-input__inner::-webkit-input-placeholder {
+    color: #c9c9c9;
+    font-size: 14px;
+    margin-bottom: 10px;
+    text-align: left;
+  }
+  .ri-center .el-form-item {
+    padding-bottom: 0px;
+    margin-bottom: 0px;
+  }
+  .ri-pwd {
+    /* padding-top: 10px; */
+    width: 290px;
+  }
+  .ri-tel {
+    width: 290px;
+    /* margin-bottom: 20px; */
+  }
+  .num {
+    float: left;
+    margin-left: 30px;
+    font-size: 12px;
+    color: #454545;
+    margin-top: 6px;
+    cursor: pointer;
+  }
+  .pwd {
+    float: right;
+    margin-right: 30px;
+    font-size: 12px;
+    color: #454545;
+    margin-top: 6px;
+    cursor: pointer;
+  }
+  .login-box .el-button {
+    color: #fff !important;
+    width: 290px;
+    height: 40px;
+    font-weight: bold;
+    background: #c9c9c9;
+    margin-top: 42px;
+    outline: none;
+    cursor: auto;
+		border: 0 !important;
+  }
+  .otherCor {
+    background: #2485c4 !important;
+  }
+  .login-box .el-form-item.is-success .el-input__inner {
+    border-color: #dcdfe6;
+  }
+  .login-box .el-button.is-plain:focus, .el-button.is-plain:hover {
+    border-color: #dcdfe6 !important;
+		opacity: 1;
+  }
+  .login-box .el-button .is-disabled:hover {
+    cursor: auto !important;
+  }
+  .login-box .el-form-item__error {
+    left: 29px !important;
+		top: 39px !important;
+    // -webkit-transform: scale(0.91) !important;
+  }
+  .el-message {
+    top: 50px;
+  }
+}

+ 436 - 0
src/components/register/Register.vue

@@ -0,0 +1,436 @@
+<template>
+    <div class="contentBo">
+        <Banner></Banner>
+        <div class="reg-container">
+            <h3>账号注册</h3>
+            <div class="box">
+                <div class="progress">
+                    <span class="apply">申请注册</span>
+                    <!-- <span class="plan"></span> -->
+                    <span :class="['plan plan_bg1',{'plan_bg2':complete}]"></span>
+                    <!-- <span class="finished">完成</span> -->
+                    <span :class="['finished',{'apply':complete}]">完成</span>
+                </div>
+                <form>
+                    <div class="main" v-if="flag">
+                        <p>手机号</p>
+                        <input type="tel" name="" v-model="phone" maxlength="11" @input="handleTelInput"
+                               @blur="checkPhone">
+                        <p>密码</p>
+                        <input type="password" name="" v-model="psw" minlength="6" maxlength="16" @blur="checkPsw">
+                        <p>联系人</p>
+                        <!-- <input type="text" name="" v-model="contact" @input="handleContInput"> -->
+                        <input type="text" name="" v-model="contact" maxlength="10" @blur="handleContInput">
+                        <div class="yanzm">
+                            <p>图形验证码</p>
+                            <input type="text" name="" v-model="picCode" @blur="checkImgCode" maxlength="4">
+                            <img :src='"data:image/png;base64,"+imgCode' @click="refreshCode">
+                        </div>
+                        <div class="yanzm">
+                            <p>短信验证码</p>
+                            <!-- <input type="text" name="" v-model="msgCode" maxlength="6" @input="handleMsg"> -->
+                            <input type="text" name="" v-model="msgCode" maxlength="6" @blur="cheeckMsgCode">
+                            <div v-if="timerFlag" type="primary" class="getMsg disabled">{{time + 's后重新发送'}}</div>
+                            <div v-else class="getMsg" @click="getMsgCode">点击获取验证码</div>
+
+                        </div>
+                        <!-- <span class="tips" v-show="imgCodeErr">图形验证码错误</span> -->
+                        <span class="tips" v-show="imgCodeErr">{{codeErrText}}</span>
+
+                        <div class="next" v-if="changCor">下一步</div>
+                        <div class="next nextCor" @click="toNext" v-else>下一步</div>
+                    </div>
+
+                    <div class="main" v-else>
+                        <p>联系邮箱</p>
+                        <input type="email" name="" v-model="email" @blur="checkEmail">
+                        <p>机构名称</p>
+                        <input type="text" name="" v-model="agencyName" maxlength="20">
+                        <div class="next" v-if="submitCor">立即注册</div>
+                        <div class="next nextCor" @click="submit" v-else>立即注册</div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+  import api from '@api/index.js';
+  import utils from '@api/utils.js';
+
+  import '@components/register/register.less';
+  import Banner from '@components/common/Banner.vue';
+  import md5 from 'js-md5'
+
+  export default {
+    name: 'Register',
+    data() {
+      return {
+        phone: '',
+        contact: '',//联系人
+        agencyName: '',
+        email: '',
+        psw: '',
+        picCode: '',//用户输入
+        msgCode: '',
+        imgCode: '',//流
+        imgId: '',
+        flag: true,//切换下一页
+        changCor: true,
+        submitCor: true,
+        imgCodeErr: false,
+        time: 60,
+        timer: null,//按钮倒计时
+        timerFlag: false,//倒计时标识
+        complete: false, //注册进度条
+        picTimer: null,//图形验证码
+        picTime: 600,
+        msgCodeTimer:null,//短信验证码
+        msgCodeTime:180,
+        codeErrText:'',
+        phoneRg:null
+      }
+    },
+    created() {
+      //localStorage.removeItem('token');
+      this.getPicCode();
+    },
+    beforeDestroy() {
+      window.clearInterval(this.picTimer);
+      window.clearInterval(this.msgCodeTimer);
+    },
+    methods: {
+      CalcuMD5(password){
+        // password = password.toUpperCase();
+        password = md5(password);
+        return password;
+      },
+      handleTelInput(e) {//手机号输入验证
+        this.phone = e.target.value.replace(/[^\d]/g, ''); //只能输入数字
+        let firstNum = this.phone.substring(0, 1);//第一位1
+        if (firstNum != 1) {
+          this.phone = "";
+        }
+      },
+      handleContInput() {//联系人--提示只能输入汉字
+        // this.contact = e.target.value.replace(/[^\u4e00-\u9fa5]/g, '');
+        const contactReg = new RegExp(/[^\u4e00-\u9fa5]$/g);
+        // if (!contactReg.test(this.contact)) {
+        if (contactReg.test(this.contact)) {
+          /*this.$message({
+            message: '联系人只能输入中文',
+            type: 'warning'
+          });*/
+          this.imgCodeErr = true;
+          this.codeErrText = "联系人只能输入中文";
+          this.contact = '';
+        }else{
+          this.imgCodeErr = false;
+        }
+      },
+      handleMsg(e) {//短信验证码输入验证
+        this.phone = e.target.value.replace(/[^\d]{6}/g, '');
+      },
+      getPicCode() {//获取图形验证码
+        api.getImgCode().then((res) => {
+          if (+res.data.code == 0) {
+            const imgCodeInfo = res.data.data;
+            this.imgCode = imgCodeInfo.imgByte;
+            this.imgId = imgCodeInfo.imgId;
+
+            let that = this;
+            this.picTimer = window.setInterval(() => {
+              if ((that.picTime--) <= 0) {
+                this.$message({
+                  message: '图形验证码已过期',
+                  type: 'warning'
+                });
+                that.picCode = '';
+                that.picTime = 600//图形验证码过期时间10分钟;
+                window.clearInterval(that.picTimer);
+                that.getPicCode();//过期刷新验证码
+              }
+            }, 1000);
+
+          } else {
+            console.log(res.data.msg);
+          }
+        }).catch((err) => {
+          console.log(err);
+        })
+      },
+      refreshCode() {//刷新图形验证码
+        window.clearInterval(this.picTimer);
+        this.picTime = 600//图形验证码过期时间10分钟;
+        this.getPicCode();
+      },
+      checkImgCode() {//验证图片验证码
+        if (this.picCode) {
+          const params = {
+            imgCode: this.picCode,
+            imgId: this.imgId
+          }
+          api.vertifyImgCode(params).then((res) => {
+            if (+res.data.code != 0) {//验证失败
+              this.imgCodeErr = true
+              this.codeErrText = "图形验证码错误";
+            } else {
+              this.imgCodeErr = false
+            }
+          }).catch((err) => {
+            console.log(err);
+          })
+        }
+
+      },
+      checkPhone() {//验证手机号
+        // const reg = new RegExp(/^((13|14|15|16|17|18|19)\d{9})$/);
+        const reg = utils.phoneReg;
+        if(this.phone.trim()){
+          if (!reg.test(this.phone)) {
+            this.$message({
+              message: '手机格式不正确',
+              type: 'warning'
+            });
+           /* this.imgCodeErr = true;
+            this.codeErrText = "手机格式不正确";*/
+            this.phone = "";
+            this.phoneRg = 1;
+          }else{
+            this.phoneRg = null;
+            // this.imgCodeErr = false;
+            api.checkTel(this.phone).then((res)=>{
+              if(+res.data.code == 0){
+                
+              }else{
+                this.$message({
+                  message: res.data.msg,
+                  type: 'warning'
+                });
+                this.phone = "";
+              }
+            })
+          }
+        }else{
+          /*this.$message({
+            message: '手机号不能为空',
+            type: 'warning'
+          });*/
+        }
+      },
+      getMsgCode() {//获取短信验证码
+        //手机号、密码、联系人、图形验证码不为空且符合规则且图形验证码正确--shenq10.26
+        if(!this.phone.trim() && !this.phoneRg){
+          this.imgCodeErr = true;
+          this.codeErrText = "手机号不能为空";
+          /*this.$message({
+            message: '手机号不能为空',
+            type: 'warning'
+          });*/
+        }else if(!this.psw.trim()){
+          this.imgCodeErr = true;
+          this.codeErrText = "密码不能为空";
+        }else if(!this.contact.trim()){
+          this.imgCodeErr = true;
+          this.codeErrText = "联系人不能为空";
+        }else if(!this.picCode.trim()){
+          this.imgCodeErr = true;
+          this.codeErrText = "图形验证码不能为空";
+        }else{//调请求接口
+          this.imgCodeErr = false;
+          const params = {
+            imgCode: this.picCode,
+            imgId: this.imgId,
+            mobile: this.phone
+          }
+          api.getMobileCode(params).then((res) => {
+            if (+res.data.code == 0) {
+
+              this.$message({
+                message: '验证码发送成功',
+                type: 'success'
+              });
+
+              //按钮倒计时
+              this.timerFlag = true;
+              let that = this;
+              this.timer = window.setInterval(() => {
+                if ((that.time--) <= 0) {
+                  that.time = 60;
+                  that.timerFlag = false;
+                  window.clearInterval(that.timer);
+                }
+              }, 1000)
+
+
+              //短信验证码180s过期时间
+              this.msgCodeTimer = window.setInterval(() => {
+                if ((that.msgCodeTime--) <= 0) {
+                  this.$message({
+                    message: '短信验证码已过期,请重新获取',
+                    type: 'warning'
+                  });
+                  that.msgCode = '';
+                  that.msgCodeTime = 180;
+                  window.clearInterval(that.msgCodeTimer);
+                }
+              }, 1000);
+
+
+            } else {
+              console.log(res.data);
+              this.$message({
+                message: res.data.msg,
+                type: 'warning'
+              });
+              // return
+            }
+          }).catch((err) => {
+            console.log(err);
+          })
+        }
+
+        
+
+      },
+      checkPsw() {//校验密码
+        const pswlReg = utils.pswReg;
+        const psw = this.psw;
+        if (psw) {
+          if (psw.trim().length < 6 || psw.trim().length > 16) {
+            this.imgCodeErr = true;
+            this.codeErrText = "密码长度为6-16位";
+            this.psw = "";
+          }
+          else if (!pswlReg.test(psw)) {
+            this.imgCodeErr = true;
+            this.codeErrText = "密码过于简单";
+            this.psw = "";
+          }else{
+            this.imgCodeErr = false;
+          }
+        }
+
+      },
+      cheeckMsgCode(){//验证短信验证码
+        const params = {
+          imgCode: this.picCode,
+          imgId: this.imgId,
+          mobile: this.phone,
+          smsCode: this.msgCode
+        }
+        api.vertifyMobileCode(params).then((res) => {
+          // 验证成功,切换下一页
+          if (+res.data.code == 0) {
+            // this.flag = false;
+            this.imgCodeErr = false;
+          } else {
+            // this.$message.error('短信验证码错误');
+            this.imgCodeErr = true;
+            this.codeErrText = "短信验证码错误";
+            this.msgCode = "";
+          }
+        }).catch((err) => {
+          console.log(err);
+        })
+      },
+      toNext() {
+        this.flag = false;
+      },
+      checkEmail() {
+        const emailReg = utils.emailReg;
+        const email = this.email;
+        if (email.trim()) {
+          if (!emailReg.test(email)) {
+            /*this.$message({
+              message: '邮箱格式不正确',
+              type: 'warning'
+            });*/
+            this.imgCodeErr = true;
+            this.codeErrText = "邮箱格式不正确";
+            this.email = "";
+          }else{
+            this.imgCodeErr = false;
+          }
+        }
+      },
+      submit() {
+        //清除图形验证码定时器
+        const mdPsw = this.CalcuMD5(this.psw);
+        const params = {
+          code: this.picCode,
+          email: this.email,
+          gmtCreate: '',
+          gmtModified: '',
+          id: 0,
+          imgId: this.imgId,
+          isDeleted: '',
+          linkman: this.contact,
+          modifier: '',
+          organization: this.agencyName,
+          // password: this.psw,
+          password: mdPsw,
+          username: this.phone
+        }
+
+        api.regidtry(params).then((res) => {
+          if (+res.data.code == 0) {
+            this.$message({
+              message: '恭喜您,注册成功!',
+              type: 'success'
+            });
+            //注册成功,跳转登录
+            this.$router.push({path: '/'})
+          } else {
+            this.submitCor = true;//注册失败,按钮变灰
+            this.$message({
+              message: res.data.msg,
+              type: 'warning'
+            });
+          }
+        }).catch((err) => {
+          console.log(err);
+        })
+      },
+
+    },
+    computed: {
+      nextButton() {
+        const {phone, psw, contact, picCode, msgCode, email, agencyName,imgCodeErr} = this;
+        return {
+          phone,
+          psw,
+          contact,
+          picCode,
+          msgCode,
+          email,
+          agencyName,
+          imgCodeErr
+        }
+      }
+    },
+    watch: {
+      nextButton: {
+        handler: function (val) {//所有数据不为空,且手机格式正确、图形验证码正确
+          if (val.phone.trim() && val.psw.trim() && val.contact.trim() && val.picCode.trim() && val.msgCode.trim() && !val.imgCodeErr) {
+            this.changCor = false;
+          } else {
+            this.changCor = true;
+          }
+
+          if (val.email.trim() && val.agencyName.trim()) {
+            this.submitCor = false;
+            this.complete = true;//完成
+          } else {
+            this.submitCor = true
+          }
+        },
+        deep: true
+      }
+    },
+    filters: {},
+    components: {
+      Banner
+    },
+  }
+</script>

+ 134 - 0
src/components/register/register.less

@@ -0,0 +1,134 @@
+.contentBo {
+  width: 100%;
+  height: 100%;
+}
+
+.reg-container {
+  width: 380px;
+  //height: 54%;//适配Firefox
+  // margin: 0 auto;
+  // margin-top: 10%;
+  height: 425px;//适配笔记本360
+  position: absolute;
+  left: 50%;
+  top: 47%;
+  transform: translate(-50%, -50%);
+  font-size: 12px; //默认字体
+  color: #424243; //默认颜色
+  box-sizing: border-box;
+  h3 {
+    text-align: center;
+    font-size: 20px;
+    margin-bottom: 20px;
+  }
+  .box {
+    background: #fff;
+    width: 380px;
+    // height: 100%;
+    height: 472px;
+    position: relative;
+    box-shadow: 0 0 5px rgba(151, 149, 151, 0.44);
+  }
+  .progress {
+    height: 40px;
+    line-height: 40px;
+    text-align: center;
+    border-bottom: 1px dashed #9c9c9c;
+    font-size: 12px;
+    margin-bottom: 10px;
+    .plan {
+      display: inline-block;
+      width: 149px;
+      height: 14px;
+      vertical-align: middle;
+    }
+    .plan_bg1 {
+      background-image: url(../../images/2steps-1.png);
+    }
+    .plan_bg2 {
+      background-image: url(../../images/2steps-2.png);
+    }
+    .finished {
+      color: #aaa;
+      margin-left: 4px;
+    }
+    .apply {
+      color: #f8b551;
+      font-weight: bold;
+      margin-right: 4px;
+    }
+
+  }
+  form {
+    width: 292px;
+    margin: auto;
+    input {
+      outline: none;
+      width: 285px;
+      height: 34px;
+      margin-bottom: 10px;
+      border: none;
+      border: 1px solid #c9c9c9;
+      padding-left: 5px;
+    }
+    p {
+      margin-bottom: 6px;
+      color: #aaa;
+      font-size: 12px;
+    }
+    .yanzm {
+      input {
+        width: 150px;
+      }
+      // button{
+      .getMsg {
+        display: inline-block;
+        width: 125px;
+        height: 34px;
+        line-height: 34px;
+        text-align: center;
+        color: #2485c4;
+        border: 1px solid #2485c4;
+        background: #dde8ef;
+        cursor: pointer;
+        vertical-align: middle;
+        margin: -3px 0 0 4px;
+      }
+      img {
+        width: 125px;
+        height: 34px;
+        display: inline-block;
+        vertical-align: middle;
+        margin: -3px 0 0 4px;
+        cursor: pointer;
+      }
+      .disabled {
+        background: #c9c9c9;
+        border: none;
+      }
+    }
+    .next {
+      width: 290px;
+      height: 40px;
+      line-height: 40px;
+      text-align: center;
+      background: #c9c9c9;
+      color: #fff;
+      // margin: 30px auto 20px;
+      // margin: 12px auto 20px;
+      cursor: pointer;
+      margin-top: 22px;
+    }
+    .nextCor {
+      background: #2485c4;
+    }
+    .tips {
+      display: inline-block;
+      font-size: 12px;
+      color: #dd0f0f;
+      // margin-top: 4px;
+      position: absolute;
+      bottom: 68px;
+    }
+  }
+}

+ 174 - 0
src/components/user/AddServiceProduct.vue

@@ -0,0 +1,174 @@
+<!-- 添加服务端 By_liucf-->
+<template>
+  <div class="servicePro">
+    <MiniTitle>
+      <div slot="mini" class="miniTit">
+        <img src="../../images/return.png" height="18" width="18" class="back" @click="back">
+        机构设置——管理服务端——添加服务端
+      </div>
+    </MiniTitle>
+    <!-- <div class="box">
+      <h3>请添加服务端</h3>
+      <div class="name">
+        <span>产品名称:</span>
+        <input type="text" name="" placeholder="请填写产品名称" class="nameInput" v-model="name">
+      </div>
+      <div class="desc">
+        <span>产品简介:</span>
+        <textarea placeholder="请填写产品简介" v-model="description"></textarea>
+      </div>
+      
+      <div class="btn" @click="finish">完成</div>
+    </div> -->
+    <el-form ref="form" :model="form" :rules="rules" label-width="110px" class="add-server-form">
+        <h3>请添加服务端</h3>
+        <el-form-item label="服务端名称:" prop="name" style="margin: 34px 0 30px">
+            <el-input v-model="form.name" placeholder="请填写服务端名称" class="nameInput" style="width: 165px"></el-input>
+        </el-form-item>
+        <el-form-item class="description" label="服务端简介:" prop="description" style="margin-bottom: 50px">
+            <el-input type="textarea" placeholder="请填写服务端简介" v-model="form.description" ></el-input>
+        </el-form-item>
+        <el-button size="small" type="primary" @click="finish">完成</el-button>
+      </el-form>
+  </div>
+</template>
+<script type="text/javascript">
+  import MiniTitle from '../common/MiniTile.vue'
+  import api from '../../api/user.js'
+  export default {
+    name:'AddServiceProduct',
+    data(){
+      return{
+        name:'',
+        description:'',
+        form: {
+          name: '',//负责人
+          description: ''
+        },
+        rules: {
+          name: [
+            { required: true, message: '产品名称不能为空', trigger: 'blur' },
+          ],
+          description: [
+            { required: true, message: '产品简介不能为空', trigger: 'blur' },
+          ]
+        }
+      }
+    },
+    components:{
+      MiniTitle
+    },
+    methods:{
+      back(){
+        this.$router.go(-1);
+      },
+      finish(){
+        let proName = this.form.name;
+        let proDesc = this.form.description;
+        // if(!proName.trim()){
+        //   this.$message({
+        //     message: '产品名称不能为空',
+        //     type: 'warning'
+        //   });
+        // }else if(!proDesc.trim()){
+        //   this.$message({
+        //     message: '产品简介不能为空',
+        //     type: 'warning'
+        //   });
+        // }else{
+        //   const params = {
+        //     'desc':proDesc,
+        //     'name':proName
+        //   }
+        //   api.addService(params).then((res)=>{
+        //     let result = res.data;
+        //     if(+result.code == 0){
+        //       this.$router.go(-1);
+        //     }else{
+        //       //客户端已建立的判断和提示
+        //       this.$message({
+        //         message: result.msg,
+        //         type: 'warning'
+        //       });
+        //     }
+        //   })
+        // }
+
+        this.$refs.form.validate((valid) => {
+          const params = {
+            'desc':proDesc,
+            'name':proName
+          }
+          if (valid) {
+            api.addService(params).then((res)=>{
+            let result = res.data;
+            if(+result.code == 0){
+              this.$router.go(-1);
+            }else{
+              //客户端已建立的判断和提示
+              this.$message({
+                message: result.msg,
+                type: 'warning'
+              });
+            }
+          })
+          }
+        })
+      }
+    }
+  }
+</script>
+<style lang="less" scoped>
+  @import '../../less/user.less';
+  
+  .servicePro{
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    .base;
+    .miniTit{
+      .miniTitle;  
+    }
+    .back{
+      vertical-align: middle;
+      cursor: pointer;
+    }
+    // .box{
+    //   margin: 20px;
+    //   padding: 20px;
+    //   background: #fff;
+    //   border-radius: 2px;
+    //   .name{
+    //     margin: 34px 0 30px;
+    //     .nameInput{
+    //       width: 165px;
+    //       height:30px;
+    //       .border;
+    //       border-radius: 2px;
+    //       margin-left: 30px;
+    //       padding-left: 10px;
+         
+    //     }
+    //   }
+    //   .desc{
+    //     margin-bottom: 50px;
+    //     textarea{
+    //       width: 510px;
+    //       height:160px;
+    //       padding:10px;
+    //       .border;
+    //       border-radius: 2px;
+    //       margin-left: 30px;
+    //       resize: none;
+    //       vertical-align:top;
+    //     }
+    //   }
+    //   .btn{
+    //     .button;
+    //     color: #fff;
+    //     background-color: #1774f0;
+    //   }
+
+    // }
+  }
+</style>

+ 301 - 0
src/components/user/AlreadyToken.vue

@@ -0,0 +1,301 @@
+<!-- 已生成令牌 By_liucf -->
+<template>
+  <div class="management">
+    <MiniTitle>
+      <div slot="mini" class="miniTit">
+        机构中心——已生成令牌
+      </div>
+    </MiniTitle>
+    <div class="box">
+      <el-table
+        :data="serviceList"
+        style="width: 100%">
+        <el-table-column
+          prop="index"
+          label="编号"
+          width="120"
+          align="center">
+        </el-table-column>
+        <el-table-column
+          prop="gmtCreate"
+          label="建立时间"
+          width="160"
+          align="center">
+        </el-table-column>
+        <el-table-column
+          prop="productName"
+          label="接入产品名称"
+          align="center">
+        </el-table-column>
+        <el-table-column
+          prop="serviceName"
+          label="服务端名称"
+          align="center">
+        </el-table-column>
+        <el-table-column
+          prop="serviceDescription"
+          label="服务端描述"
+          align="center">
+        </el-table-column>
+        <!-- <el-table-column
+          label="操作"
+          align="center"
+          width="160">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="danger"
+              @click="handleDelete(scope.$index, serviceList)">删除</el-button>
+          </template>
+        </el-table-column> -->
+        <el-table-column
+          label="查看令牌"
+          align="center"
+          width="160">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="primary"
+              @click="handleLook(scope.$index, serviceList)">查看</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      
+      <!-- 弹窗 -->
+      <div :class="[{'hide':toast},'mark']">
+        <div class="toast">
+          <i class="el-icon-close" @click="close"></i>
+          <p>{{ text }}</p>
+          <div class="bbtn toast-btn" @click="confirn">立即删除</div>
+        </div>
+    </div>
+    </div>
+    <div class="block" v-if="total>size">
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          :page-size="size"
+          layout="prev, pager, next, jumper"
+          :total="total">
+        </el-pagination>
+        <!-- <div class="btn btnConfirm" @click="handleCurrentChange">确定</div> -->
+      </div>
+  </div>
+</template>
+<script type="text/javascript">
+  import MiniTitle from '../common/MiniTile.vue'
+  import api from '../../api/user.js'
+  export default{
+    name:'AlreadyToken',
+    data(){
+      return{
+        serviceList:[],
+        currentPage:1,
+        size:10,
+        total:1,
+        del:'删除',
+        toast:true,
+        text:'您确定要删除该服务端?删除该服务端可能无法使用朗通产品,可能会影响现有业务。',
+        serviceIndex:null
+      }
+    },
+    created(){
+      let page = Number(sessionStorage.getItem('tokenPage'));
+      if(page){
+        this.currentPage = page;
+        this.getInfoList();
+        sessionStorage.setItem('tokenPage',null);
+      }else{
+        this.getInfoList();
+      }
+      
+    },
+    components:{
+      MiniTitle
+    },
+    methods:{
+      getInfoList(){//获取服务端列表
+        const params = {
+          'current':this.currentPage,
+          'size':this.size
+        }
+        api.alreadyServiceToken(params).then((res)=>{
+          let result = res.data;
+          if(+result.code == 0){
+            let dataList = result.data.records;
+            dataList.forEach((item,index)=>{
+              item.index = (index+1)+(this.currentPage-1)*this.size;
+              return item
+            });
+            this.serviceList  = dataList;
+            this.total = result.data.total;
+          }
+          
+        })
+      },
+      handleSizeChange(val) {
+        console.log(`每页 ${val} 条`);
+      },
+      handleCurrentChange(val) {
+        this.currentPage = val;
+        this.getInfoList();
+      },
+      handleDelete(index, rows) {
+        this.serviceIndex = index;
+        this.toast = false;
+      },
+      handleLook(index,data){//查看令牌携带参数
+        sessionStorage.setItem('tokenPage',this.currentPage);
+        let id = data[index].id;
+        this.$router.push({path:'CKLPXQ',query:{id:id}});   
+      },
+      confirn(){//确认删除
+        this.toast = true;
+        const index = this.serviceIndex;
+        const params = {
+          'productId':this.serviceList[index].productId,
+          'serviceId':this.serviceList[index].serviceId
+        }
+        const id = this.serviceList[index].id;
+        // api.delProductService(params).then((res)=>{//删除接口-传参修改-10月15 zhaops
+        api.delProductService(id).then((res)=>{
+          let result = res.data;
+          if(+result.code == 0){
+            // this.serviceList.splice(index,1);//前端删除
+            this.getInfoList();//重新获取,更新数据
+            this.$message({
+              message: '删除成功',
+              type: 'success'
+            });
+            this.serviceIndex = null;
+          }else{
+            this.$message({
+              message: result.msg,
+              type: 'warning'
+            });
+          }
+        })
+      },
+      close(){
+        this.toast = true;
+        this.serviceIndex = null;
+      },
+    }
+  }
+</script>
+<style lang="less" scoped>
+@import '../../less/user.less';
+  .management{
+    width: 100%;
+    /*height: 100%;*/
+    height: 93%;
+    box-sizing: border-box;
+    .base;
+
+    .miniTit{
+      .miniTitle;  
+    }
+    .btn{
+        .button;
+      }
+      .bbtn{
+        width: 80px;
+        height: 30px;
+        line-height: 30px;
+        color: #fff;
+        background: #1774f0;
+        text-align: center;   
+        border-radius: 2px;
+        position: absolute;
+        bottom: 20px;
+        right: 25px;
+        cursor: pointer;
+      }
+    .btnBox{
+      margin-right: 20px;
+      .lingpai{
+        width: 90px;
+        height:24px;
+        line-height: 24px;
+        margin-left: 10px;
+        color:#fff;
+        background-color: #1774f0;
+      }
+    }
+    .box{
+      height:70%;
+      background: #fff;
+      position: relative;
+      padding: 20px 20px 40px;
+      margin: 20px;
+      border-radius: 2px;
+      overflow-y: auto;
+      .el-table{
+        text-align: center;
+      }
+    }
+    .block{ 
+      height:60px;
+      line-height: 60px;
+      text-align: right;
+      margin: 20px;
+      border-radius:2px;
+      background:#fff;
+    }
+    .btnConfirm{
+      color:#fff;
+      background-color: #1774f0;
+      position: absolute;
+      right: 8px;
+      bottom: 0;
+    }
+    .el-pagination{
+      /*position: absolute;
+      width: 97.7%;*/
+      padding: 15px;
+    }
+
+    .mark{
+      width: 100%;
+      height:100%;
+      position: fixed;
+      top: 0;
+      left:0;
+      background-color:rgba(0,0,0,0.4);
+      z-index: 55;
+    }
+  .toast{
+    width: 280px;
+    height:150px;
+    background:#fff;
+    border-radius:2px;
+    position: absolute;
+    top: 50%;
+    left:50%;
+    transform:translate(-50%,-50%);
+    z-index: 56;
+    padding:35px;
+    text-align: center;
+    p{
+      margin-top: 40px;
+    }
+  }
+  .el-icon-close{
+    font-size: 16px;
+    cursor: pointer;
+    position: absolute;
+    top: 16px;
+    right: 16px;
+  }
+  .hide{
+    display:none;
+  }
+  .toast-btn{
+    width: 90px;
+    bottom:35px;
+    right:130px;
+  }
+     
+  }
+</style>

+ 717 - 0
src/components/user/Console.vue

@@ -0,0 +1,717 @@
+<template>
+	<div class="userConsole" v-if="moreProBox">
+		<MiniTitle>
+			<div slot="mini" class="miniTit">控制台</div>
+		</MiniTitle>
+		<div class="con-main">
+			<div v-if="authProgress|| openedCount || productApplyCount || failCount ||authRejectCount" class="progress">
+				<p class="userTitles">开通进度</p>
+				<div ref="isNo" class="openTo">
+					<div class="userOpen" v-if="authProgress != 0">
+						<p class="openTxt">账号认证申请</p>
+						<p class="openImg"><img class="rzImg" src="../../images/verify.png" /><img class="rzLine" src="../../images/2steps-1.png" /><img
+							 class="rzEnd" src="../../images/complete.png" /></p>
+						<p class="text">认证中</p>
+					</div>
+
+					<div class="productOpen" v-if="passProduct.length!=0">
+						<!-- 付费产品 -->
+						<p class="openTxt">产品接入申请</p>
+							<div class="sonProduct" v-for="i in passProduct">
+								<!-- <p class="titlePro">{{i.name}}<span>订单号:{{i.num}}</span></p> -->
+								<p class="titlePro">
+									<el-tooltip class="item" effect="dark" :content="i.name" placement="top" v-if="i.name.length > 12">
+							      <span>{{i.name.slice(0,12)+'...'}}</span>
+							    </el-tooltip>
+							    <span v-else>{{i.name}}</span>
+									<span class="num">订单号:{{i.num}}</span>
+								</p>
+								<p class="openImg" v-if="i.auditStatusMsg === '待审核'"><img class="rzImg" src="../../images/verify1.png" /><img
+									 class="rzLine" src="../../images/2steps-1.png" /><img class="rzEnd" src="../../images/complete.png" /></p>
+								<p class="openImg" v-else="i.auditStatusMsg === '通过'"><img class="rzImg" src="../../images/verify1.png" /><img
+									 class="rzLine" src="../../images/2steps-2.png" /><img class="rzEnd" src="../../images/verify2.png" /></p>
+								<p class="text">{{i.auditStatusMsg}}</p>
+							</div>
+					</div>
+
+						<!-- 调接口queryAuthProgress 验证是否认证失败 -->
+					<div class="faildBox" v-if="authRejectCount !=0 || failProduct.length !=0">
+						<div class="regBo" v-show="authRejectCount !=0">
+							<p class="openTxt">账号认证失败原因</p>
+							<!-- 失败原因type和Comment二选一 -->
+							<p class="failper">原因:{{rejectType?rejectType:rejectComment}}</p>
+						</div>
+
+						<div v-if="failProduct.length !=0">
+							<p class="openTxt2">产品申请失败原因</p>
+							<div class="pproFaild" v-for="failure in failProduct">
+								<p class="failTitlt">{{failure.name}}</p>
+								<p class="failper">原因 : {{failure.rejectReason}}</p>
+							</div>
+						</div>
+					</div>
+				</div>
+				<!-- 已开通产品 -->
+				<div class="reaOpen" v-if="openedCount">
+					<p class="userTitles">已开通产品</p>
+					<!-- <div class="openItem" v-for="op in openList"> -->
+					<div v-for="op in openList" :class="['openItem',{'grays':op.isExpire==0||op.serviceStatus == 0}]" >
+						<div class="openItBox">
+							<el-tooltip class="item" :disabled="op.name.length > 44 ? false : true" effect="dark" :content="op.name" placement="top">
+								<span class="openIt">{{op.name}}</span>
+							</el-tooltip>
+						</div>
+							
+						<!-- <p class="openIt">{{op.name}}</p> -->
+						<div class="leftCo">
+							<p>服务模式 :</p>
+							<p :class="['produceN',{'grays':op.isExpire==0 ||op.serviceStatus == 0}]">{{op.accessTypeMsg}}</p>
+						</div>
+						<div class="rightCo">
+							<p>产品服务有效时间 : </p>
+							<p :class="['proDate',{'grays':op.isExpire==0 ||op.serviceStatus == 0}]">{{op.startTime}}~{{op.endTime}}</p>
+						</div>
+						<div class="emp"></div>
+						<div class="rit">
+							<!-- 停用 过期都不能点击生成令牌 -->
+							<div v-if="op.isExpire==0 || op.serviceStatus == 0">
+								<button v-show="op.isInto==1" class="proBtn grayHu">进入</button>
+								<button v-show="op.isCreateToken==1" class="proBtn grayHu">生成令牌</button>
+								<button class="proBtn grayHu" v-if="op.serviceStatus == 0">续费</button>
+								<button class="proBtn" @click="morePros(op.productId)" v-else-if="op.renewalsStutas == 0">续费</button>
+								<button class="proBtn orgCol" v-else-if="op.renewalsStutas == 1">续费中</button>
+							</div>
+							<div v-else>
+								<button v-show="op.isInto==1" class="proBtn" @click="intoProduct(op.url,op.appKeyId,op.appKeySecret,op.isBegin,op.productId,op.openId)">进入</button>
+								<button v-show="op.isCreateToken==1" class="proBtn" @click="tokenCheck()">生成令牌</button>
+								<button class="proBtn" @click="morePros(op.productId)" v-if="op.renewalsStutas == 0">续费</button>
+								<button class="proBtn orgCol" v-else-if="op.renewalsStutas == 1">续费中</button>
+							</div>
+						</div>
+						<img v-if="op.isExpire==0 && op.serviceStatus != 0" src="../../images/overTime.png" height="54" width="54" class="overTime">
+						<img v-else-if="op.serviceStatus == 0" src="../../images/stop.png" height="50" width="50" class="overTime">
+					</div>
+					<div class="openItem" style="cursor:pointer" @click="morePro()">
+						<p class="moreTxt">更多服务</p>
+						<div class="imBox">
+							<img src="../../images/add_big.png" />
+						</div>
+					</div>
+				</div>
+			</div>
+			<!-- 可试用产品 -->
+			<div class="trialProd" v-if="onTrialCount" ref="trialProd">
+				<trial-pro></trial-pro>
+			</div>
+			<!-- 弹窗 -->
+			<div class="mask" v-if="isMask">
+				<div class="conmask">
+					<p class="maskTxt">您是否需要续费该产品?</p>
+					<div class="btn2">
+						<button class="primary left" @click="saleBtn()">确认续费</button>
+						<button class="primary right" @click="queBtn()">不续费</button>
+					</div>
+				</div>
+			</div>
+		</div>
+		
+	</div>
+</template>
+
+<script>
+	import userApi from '@api/user.js';
+	import encode from '@api/base64.js';
+	import TrialUser from '@components/user/TrialUser.vue';
+	import MiniTitle from '../common/MiniTile.vue'
+
+	export default {
+		name: 'user-console',
+		components: {
+			'trial-pro': TrialUser,
+			MiniTitle
+		},
+		data() {
+			return {
+				passProduct:[],
+				failProduct:[],
+				toast: true,
+				hide: false,
+				isMask: false,
+				moreProBox: true,
+				isHidd: true,
+				it: [],
+				item: [],
+				authStatus: null,
+				auditStatusMsg: null,
+				openList: [],
+				onTrialCount: null,
+				openedCount: null,
+				productApplyCount: null,//产品接入数量
+				failCount: null,
+				authProgress:null,
+				authRejectCount:null,
+				rejectType:'',//账号认证被拒原因
+				rejectComment: null,//补充信息
+				maskId: null,
+				showAuthenReject:false,
+			}
+		},
+		created: function() {
+			this.productAuthProgress();
+			this.enShowOption();
+			this.getConsoleOpened();
+			if(this.authRejectCount != 0){
+				this.getAuthenProgress();
+			}
+		},
+		methods: {
+			getAuthenProgress(){//账号认证进度
+				userApi.getAuthenProgress().then((res)=>{
+					const result = res.data;
+					if(+result.code ==0){
+						this.authStatus = result.data.userStatus;
+						if(result.data.userStatus==0 && result.data.isReject==0){
+							this.showAuthenReject = true;
+							this.rejectComment = result.data.rejectComment;
+							this.rejectType = result.data.rejectType;
+						}
+												
+					}else{
+						console.log(result.msg);
+					}
+				}).catch((error) => {
+					console.log(error)
+				});
+			},
+			queBtn() {
+				this.isMask = false;
+			},
+			enShowOption() {
+				userApi.enShowOption().then((res) => {
+					if (res.data.code == '0') {
+						const data = res.data.data;
+						this.openedCount = data.openedCount;
+						this.onTrialCount = data.onTrialCount;
+						this.productApplyCount = data.orderCount;
+						this.failCount = data.orderAuthFailCount;
+						this.authProgress = data.authIngCount;
+						this.authRejectCount = data.authRejectCount;
+					}
+				}).catch((error) => {
+					console.log(error)
+				});
+			},
+			productAuthProgress() { //申请进度
+				userApi.productAuthProgress().then((res) => {
+					if (res.data.code == '0') {
+						const data = res.data.data;
+						this.failProduct = data.failProduct;
+						this.passProduct = data.passProduct;
+					}
+				}).catch((error) => {
+					console.log(error)
+				});
+			},
+			getConsoleOpened() { //已开通产品
+				userApi.getConsoleOpened().then((res) => {
+					if (res.data.code == '0') {
+						this.openList= res.data.data;
+					}
+				}).catch((error) => {
+					console.log(error)
+				});
+			},
+			morePro() { //更多服务跳转
+				this.$router.push({
+					path: 'YH-GDFW'
+				});
+			},
+
+			saleBtn() { //续费确定
+				const params = {
+					'productId': this.maskId
+				}
+				userApi.addRenewalsInfo(params).then((res) => {
+					if (res.data.code == '0') {
+						this.isMask = false;
+						this.$message({
+							message: '提交成功!',
+							type: 'success'
+						});
+						this.getConsoleOpened();
+					}else{
+						this.$message.error(res.data.msg);
+					}
+				}).catch((error) => {
+					console.log(error)
+				});
+			},
+			morePros(id) { // 蒙层出现
+				this.isMask = true;
+				this.maskId = id;
+			},
+			tokenCheck() { //查看令牌
+				this.$router.push({
+						path: 'YH-JGZX-YKTCP'
+					});
+			},
+			openWin(url){//创建a标签打开新窗口
+				let abtn = document.createElement('a');
+				abtn.id = "openPro";
+				abtn.href = url;
+				abtn.target = "_blank";
+				document.body.appendChild(abtn);
+				document.getElementById("openPro").click();
+				document.body.removeChild(abtn);
+			},
+			intoProduct(url,appKeyId,appKeySecret,isBegin,id,openId){//进入产品页
+				/*this.setCookie("appKeyId",keyId,1);
+				this.setCookie("appKeySecret",keySecret,1);
+				window.open(url);*/
+				if(isBegin==0){//未到开通时间
+					this.$message({
+						message: '产品未到服务有效期',
+						type: 'warning'
+					});
+				}else if(isBegin==1){
+					let params = {
+						'productId':id,
+						'openId':openId
+					}
+					let newWindow = window.open();
+					const tempTime = new Date().getTime().toString();//加密时间戳
+    			const securityCode = encode(tempTime);
+
+					userApi.intoVerify(params).then((res)=>{
+						if(res.data.code == 0){
+							// const linkURL = url.indexOf("?")>-1? url + "&appKeyId="+appKeyId+"&appKeySecret="+appKeySecret : url + "?appKeyId="+appKeyId+"&appKeySecret="+appKeySecret;
+							const linkURL = url.indexOf("?")>-1? url + "&appI="+appKeyId+"&appS="+appKeySecret + "&code=" + securityCode : url + "?appI="+appKeyId+"&appS="+appKeySecret + "&code=" + securityCode;
+							// this.openWin(linkURL);
+							newWindow.location.href = linkURL;
+						}else{
+							this.$message({
+								message: res.data.msg,
+								type: 'warning'
+							});
+							newWindow.close();
+						}
+
+					})
+					
+				}
+			},
+			setCookie(name,value,day){
+				var expires = day * 24 * 60 * 60 * 1000;
+			  var exp = new Date();
+			  exp.setTime(exp.getTime() + expires);
+			  document.cookie = name + "=" + value + ";expires=" + exp.toUTCString();
+			},
+		}
+	}
+</script>
+<style lang="less" scoped>
+	.userConsole {
+		min-width: 1127px;
+		height:100%;
+		.miniTit {
+			margin-left: 20px;
+			font-weight: bold;
+		}
+		
+		.con-main{
+			height:92%;
+			overflow-y: auto;
+		}
+		/*.progress{
+			height: 21%;
+	    max-height: 350px;
+	    min-height: 165px;
+		}*/
+		.grayHu {
+			background: #999 !important;
+			cursor: auto !important;
+		}
+		.orgCol{
+			background-color: #8CBDF4 !important;
+			cursor: auto !important;
+		}
+
+		.hidd {
+			display: none;
+		}
+
+		.mask {
+			width: 100%;
+			height: 100%;
+			position: fixed;
+			top: 0;
+			left: 0;
+			background-color: rgba(0, 0, 0, 0.4);
+			z-index: 55;
+
+			.conmask {
+				background: #fff;
+				width: 350px;
+				height: 200px;
+				position: absolute;
+				left: 50%;
+				top: 50%;
+				transform: translate(-50%, -50%);
+				border-radius:2px;
+
+				.maskTxt {
+					background: #fff;
+					border-radius: 2px;
+					text-align: center;
+					margin-left: 53px;
+					margin-right: 53px;
+					margin-top: 50px;
+					font-size: 14px;
+				}
+
+				.left {
+					margin-left: 63px;
+					cursor: pointer;
+				}
+
+				.right {
+					background: #fff !important;
+					border: 1px solid #1774f0 !important;
+					color: #1774f0 !important;
+					cursor: pointer;
+				}
+
+				.primary {
+					width: 80px;
+					height: 28px;
+					border-radius: 3px;
+					border: 0;
+					background: #1774f0;
+					color: #fff;
+					margin-top: 40px;
+					margin-right: 60px;
+				}
+			}
+
+		}
+		.grays {
+			color: #aaa !important;
+		}
+		.toast-btn2 {
+			width: 90px;
+			bottom: 35px;
+			right: 130px;
+		}
+
+		/*.pproFaild {
+			height: 155px;
+		}*/
+
+		/*.regBo {
+			height: 125px;
+			line-height: 40px;
+		}*/
+
+		.reaOpen {
+			display: inline-block;
+			width: 100%;
+			margin-top: 10px;
+		}
+		.trialProd{
+			display:inline-block;
+		}
+		.userTrial .trialBox .felx .flex_item {
+			width: 31%;
+			min-width: 348px;
+			max-width: 31%;
+		}
+
+		.imBox {
+			text-align: center;
+
+			img {
+				width: 70px;
+				height: 70px;
+				cursor: pointer;
+			}
+		}
+
+		.moreTxt {
+			font-size: 14px;
+			font-weight: bold;
+			padding-top: 20px;
+			margin-left: 20px;
+		}
+
+		.morePro {
+			width: 31%;
+			height: 150px;
+			background: #fff;
+			margin-left: 20px;
+			margin-top: 20px;
+			display: inline-block;
+
+		}
+
+		.openTo {
+			/*height: 350px;*/
+			height: 21%;
+	    max-height: 350px;
+	    min-height: 160px;
+		}
+
+		.emp {
+			height: 1px;
+			background: #c9c9c9;
+			margin-top: 58px;
+		}
+
+		.rit {
+			font-size: 12px;
+			float: right;
+			margin-right: 5px;
+			margin-top: 8px;
+		}
+
+		.proBtn {
+			width: 70px;
+			height: 24px;
+			border-radius: 2px;
+			border: 0;
+			display: inline-block;
+			background: #1774f0;
+			color: #fff;
+			cursor: pointer;
+			margin-right: 10px;
+			font-size: 12px;
+			outline: none;
+		}
+
+		.proDate {
+			margin-top: 10px;
+			color: #1774f0;
+		}
+
+		.rightCo {
+			font-size: 12px;
+			float: right;
+			margin-right: 15px;
+
+		}
+
+		.produceN {
+			margin-top: 10px;
+			color: #1774f0;
+		}
+
+		.leftCo {
+			font-size: 12px;
+			margin-left: 20px;
+			float: left;
+		}
+		.openItBox {
+			height: 51px;
+			line-height: 18px;
+			overflow: hidden;
+		}
+		.openIt {
+			display: -webkit-box;
+			-webkit-box-orient: vertical;
+			-webkit-line-clamp: 2;
+			font-size: 14px;
+			font-weight: bold;
+			padding: 15px 20px 0 0;
+			margin: 0 0 0px 20px;
+		}
+
+		.openTxt {
+			font-size: 12px;
+			height: 30px;
+			line-height: 30px;
+			border-bottom: 1px solid #c9c9c9;
+			padding-left: 10px;
+			font-weight: bold;
+
+		}
+
+		.openTxts {
+			font-size: 12px;
+			height: 30px;
+			line-height: 30px;
+			border-top: 1px solid #c9c9c9;
+			border-bottom: 1px solid #c9c9c9;
+			padding-left: 10px;
+      font-weight: bold;
+		}
+
+		.openTxt2 {
+			font-size: 12px;
+			height: 30px;
+			line-height: 30px;
+			border-bottom: 1px solid #c9c9c9;
+			padding-left: 10px;
+      font-weight: bold;
+		}
+
+		.userTitles {
+			margin: 20px 0 15px 20px;
+			font-size: 14px;
+			color: #999;
+		}
+
+		.userOpen {
+			display: inline-block;
+			width: 31%;
+			min-width:334px;
+			background: #fff;
+			margin-left: 20px;
+			float: left;
+
+			.openImg {
+				margin-top: 25px;
+				text-align: center;
+			}
+
+			.text {
+				font-size: 12px;
+				text-align: center;
+				margin-top: -15px;
+				padding-bottom: 30px;
+			}
+
+			.rzLine {
+				width: 210px;
+				margin-left: 15px;
+				margin-right: 15px;
+				margin-bottom: 10px;
+			}
+
+			.rzEnd {
+				width: 40px;
+				height: 40px;
+			}
+
+			.rzImg {
+				width: 40px;
+				height: 40px;
+			}
+
+			img {
+				display: inline-block;
+			}
+		}
+
+		.productOpen {
+			display: inline-block;
+			background: #fff;
+			width: 31.9%;
+			min-width:334px;
+			margin-left: 20px;
+			float: left;
+			height: 334px;
+			overflow-y: auto;
+
+			.openTxt {
+				font-size: 12px;
+				height: 30px;
+				line-height: 30px;
+				border-bottom: 1px solid #c9c9c9;
+				padding-left: 10px;
+
+				span {
+					float: right;
+					display: inline-block;
+					margin-right: 10px;
+				}
+			}
+
+			.openImg {
+				text-align: center;
+				margin: 10px 15px 20px 10px;
+			}
+
+			.text {
+				font-size: 12px;
+				text-align: center;
+				margin-top: -30px;
+				padding-bottom: 15px;
+			}
+
+			.rzLine {
+				width: 50%;
+				margin-left: 15px;
+				margin-right: 15px;
+				margin-bottom: 10px;
+			}
+
+			.rzEnd {
+				width: 40px;
+				height: 40px;
+			}
+
+			.rzImg {
+				width: 40px;
+				height: 40px;
+			}
+
+			img {
+				display: inline-block;
+			}
+
+			.titlePro {
+				font-size: 12px;
+				margin-left: 10px;
+				display: flex;
+    		justify-content: space-between;
+				.num {
+					margin-right: 15px;
+				}
+			}
+		}
+
+		.faildBox {
+			width: 31%;
+			min-width:334px;
+			background: #fff;
+			float: left;
+			margin-left: 20px;
+			height: 334px;
+			overflow-y: auto;
+		}
+
+		.failTitlt {
+			font-size: 12px;
+			margin-top: 15px;
+			margin-left: 10px;
+			margin-bottom: 15px;
+		}
+
+		.failper {
+			font-size: 12px;
+			margin-left: 10px;
+			margin-bottom: 20px;
+			line-height: 20px;
+		}
+
+		.sonProduct {
+			padding-top: 10px;
+		}
+
+		.openItem {
+			width: 31%;
+			min-width: 348px;
+			height: 150px;
+			background: #fff;
+			margin-left: 20px;
+			display: inline-block;
+			margin-bottom: 20px;
+			float: left;
+			position: relative;
+			.overTime{
+				position: absolute;
+				top: 10px;
+				right: 10px;
+			}
+		}
+	}
+</style>

+ 315 - 0
src/components/user/CreatedToken.vue

@@ -0,0 +1,315 @@
+<!-- 机构中心-已生成令牌查看详情 By_liucf -->
+<template>
+  <div class="token">
+    <MiniTitle>
+      <div slot="mini" class="miniTit">
+        <img src="../../images/return.png" height="18" width="18" class="back" @click="back">
+        机构中心——已生成令牌——已有令牌
+      </div>
+    </MiniTitle>
+    <div class="box">
+      <h3>{{info.productName}}</h3>
+      <div class="btn delBtn" @click="delKey">删除</div>
+      <p>令牌生成时间:{{info.gmtCreate}}</p>
+      <!-- 默认为1-启用 -->
+      <p v-if="info.status==1" class="tokenBtn">{{info.serviceName}}令牌 
+        <span class="start grayCol">启用</span>
+        <span class="forbid" @click="forbid">禁用</span>
+      </p>
+      <p v-else-if="info.status==0" class="tokenBtn">{{info.serviceName}}令牌 
+        <span class="start" @click="open">启用</span>
+        <span class="forbid grayCol">禁用</span>
+      </p>
+      <table class="keyText">
+        <tr class="tr">
+          <td class="info">AppKeyId:</td>
+          <!-- <td width="80%"><input type="text" name="" v-model="keyId" readonly id="appkey"></td> -->
+          <td width="80%"><input type="text" name="" :value="info.appKeyId" readonly :disabled="info.status==0?true:false" id="appkey"></td>
+          <td class="info1">
+            <span v-if="info.status==1" class="btn copyBtn" @click="copy('appkey')">复制</span>
+            <span v-else class="btn copyBtn disable">复制</span>
+            
+          </td>
+        </tr>
+        <tr class="tr">
+          <td class="info">AppKeySecret:</td>
+          <td><input type="text" name="" :value="info.appKeySecret" readonly :disabled="info.status==0?true:false" id="appsecret"></td>
+          <td class="info1">
+            <span v-if="info.status==1" class="btn copyBtn" @click="copy('appsecret')">复制</span>
+            <span v-else class="btn copyBtn disable">复制</span>  
+          </td>
+        </tr>
+      </table>
+        <!-- 弹窗 -->
+      <div :class="[{'hide':toast},'mark']">
+        <div class="toast">
+          <i class="el-icon-close" @click="close"></i>
+          <p>{{ text }}</p>
+          <div class="bbtn toast-btn" @click="confirn">{{btnText}}</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script type="text/javascript">
+  import MiniTitle from '../common/MiniTile.vue'
+  import api from '../../api/user.js'
+  export default {
+    name:'CreatedToken',
+    data(){
+      return{
+        info:{},
+        product:'',
+        service:'',
+        id:'',
+        toast:true,
+        text:'',
+        btnText:'',
+        btnFlag:null,//1删除,2禁用
+      }
+    },
+    created(){
+      this.id = this.$route.query.id;
+      this.getTokenData();
+    },
+    methods:{
+      getTokenData(){
+        const id = this.id;
+        api.detailProductService(id).then((res)=>{
+          let result = res.data;
+          if(+result.code == 0){
+            this.info = result.data;
+          }else{
+            this.$message.error(result.msg);
+          }
+        })
+      },
+      back(){
+        this.$router.go(-1);
+      },
+      copy(id){
+        let keyDom = document.getElementById(id);
+        keyDom.select();
+        document.execCommand("Copy");
+        this.$message({
+          message: '复制成功',
+          type: 'success',
+        });
+      },
+      delKey(){
+        this.toast = false;
+        this.text = "您确定要删除该令牌吗?删除该令牌可能无法使用朗通产品,可能会影响现有业务。";
+        this.btnText = "立即删除";
+        this.btnFlag = 1;
+      },
+      open(){//开启令牌
+        api.openServiceToken(this.id).then((res)=>{
+          let result = res.data;
+          if(+result.code == 0){
+            this.info.status = 1;
+            this.$message({
+              message: '已经启用',
+              type: 'success'
+            });
+          }else{
+            this.$message({
+              message: result.msg,
+              type: 'warning'
+            });
+          }
+        })
+      },
+      forbid(){//禁用令牌
+        this.toast = false;
+        this.text = "您确定要禁用该令牌?禁用该令牌可能导致该服务端无法使用,影响现有业务。";
+        this.btnText = "立即禁用";
+        this.btnFlag = 2;
+      },
+      confirn(){
+        this.toast = true;
+        const id = this.id;
+        const params = {
+          'productId':this.info.productId,
+          'serviceId':this.info.serviceId
+        }
+        if(this.btnFlag == 1){//删除
+          // api.delServiceToken(id).then((res)=>{
+            // api.delProductService(params).then((res)=>{//调用外层删除接口-10月12 zhaops
+            api.delProductService(id).then((res)=>{//调用外层删除接口-传参修改-10月15 zhaops
+            let result = res.data;
+            if(+result.code == 0){
+              this.$message({
+                message: '删除成功',
+                type: 'success'
+              });
+              this.$router.go(-1);//返回上一页
+            }else{
+              this.$message.error(result.msg);
+            }
+          })
+        }else if(this.btnFlag == 2){//禁用
+          api.forbidServiceToken(id).then((res)=>{
+            let result = res.data;
+            if(+result.code == 0){
+              this.info.status = 0;
+              this.$message({
+                message: '禁用成功',
+                type: 'success'
+              });
+            }else{
+              this.$message.error(result.msg);
+            }
+          })
+        }
+      },
+      close(){
+        this.toast = true;
+      },
+    },
+    components:{
+      MiniTitle
+    },
+  }
+</script>
+<style lang="less">
+  @import '../../less/user.less';
+  .token{
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    .base;    
+    .btn{
+      .button;
+      .border;
+    }
+    .miniTit{
+      .miniTitle;  
+    }
+    .back{
+      vertical-align: middle;
+      cursor: pointer;
+    }
+    .box{
+      margin: 20px;
+      padding: 20px;
+      position: relative;
+      margin-bottom: 20px;
+      background: #fff;
+      border-radius: 2px;
+      h3{
+        font-size: 14px;
+        font-weight: bold;
+        margin-bottom: 10px;
+      }
+      .tokenBtn{
+        margin:20px 0 20px;
+        .start{
+          color:#1774f0;
+          margin-left: 20px;
+          cursor: pointer;
+        }
+        .forbid{
+          color: #dd0f0f;
+          margin-left: 20px;
+          cursor: pointer;
+        }
+        .grayCol{
+          color:#c9c9c9;
+        }
+      }
+      .delBtn{
+        color: #fff;
+        background-color: #ffb03b;
+        border: none;
+        position: absolute;
+        top: 20px;
+        right: 20px;
+      }
+      .keyText{
+          width: 100%;
+          input{
+            height: 30px;
+            width: 99%;
+            margin-left: 15px;
+            padding-left: 10px;
+          }
+          .copyBtn{
+            border-color: #1774f0;
+            color: #1774f0;
+            margin-left: 30px;
+          }
+          .disable{
+            border-color: #ccc;
+            background:#ccc;
+            color:#fff;
+            cursor:text;
+          }
+          .tr{
+            height:50px;
+          }
+        }
+        .info{
+          width: 10%;
+          text-align: right;  
+        }
+        .info1{
+          width: 10%;
+          text-align: left;  
+        }
+
+        .mark{
+            width: 100%;
+            height:100%;
+            position: fixed;
+            top: 0;
+            left:0;
+            background-color:rgba(0,0,0,0.4);
+            z-index: 55;
+          }
+        .toast{
+          width: 280px;
+          height:150px;
+          background:#fff;
+          border-radius:2px;
+          position: absolute;
+          top: 50%;
+          left:50%;
+          transform:translate(-50%,-50%);
+          z-index: 56;
+          padding:35px;
+          text-align: center;
+          p{
+            margin-top: 40px;
+          }
+        }
+        .el-icon-close{
+          font-size: 16px;
+          cursor: pointer;
+          position: absolute;
+          top: 16px;
+          right: 16px;
+        }
+        .hide{
+          display:none;
+        }
+        .bbtn{
+          width: 80px;
+          height: 30px;
+          line-height: 30px;
+          color: #fff;
+          background: #1774f0;
+          text-align: center;   
+          border-radius: 2px;
+          position: absolute;
+          bottom: 20px;
+          right: 25px;
+          cursor: pointer;
+        }
+        .toast-btn{
+          width: 90px;
+          bottom:35px;
+          right:130px;
+        }
+    }
+  }
+</style>

+ 113 - 0
src/components/user/HomePage.vue

@@ -0,0 +1,113 @@
+<template>
+    <el-container class="user">
+        <el-aside>
+            <div class="logo">
+                <p><b>朗通后台管理系统</b></p>
+            </div>
+            <lt-menu v-if="data&&data.menuWrappers.length" v-bind:data="data.menuWrappers"></lt-menu>
+        </el-aside>
+        <el-container>
+            <el-header class="clearfix">
+                <div class="title fl">
+                    <h2>机构名称</h2>
+                    <lt-badge class="green">试用中</lt-badge>
+                </div>
+                <div class="userInfo fr">
+                    <img src="" alt="">
+                    <span class="username">用户名</span>
+                    <lt-badge class="green">已认证</lt-badge>
+                </div>
+            </el-header>
+            <div class="block">控制台</div>
+            <el-main>
+                <trial-user></trial-user>
+            </el-main>
+        </el-container>
+    </el-container>
+</template>
+
+<script>
+  import LtMenu from './Menu.vue';
+  import LtBadge from '@base/LtBadge.vue';
+  import TrialUser from '@components/user/TrialUser.vue';
+  import api from '@api/index.js';
+
+  export default {
+    name: 'homepage',
+    components: {
+      'lt-badge': LtBadge,
+      'lt-menu': LtMenu,
+      'trial-user': TrialUser
+    },
+    data: function () {
+      return {
+        data: null
+      }
+    },
+    created() {
+//       api.getAccessdMenu().then((res) => {
+//         if (res.data.code == '0') {
+//           const data = res.data.data;
+//           this.data = data;
+//         }
+//       }).catch((error) => {
+//         console.log(error);
+//       })
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+    @import '../../less/common.less';
+
+    .user {
+        height: 100%;
+    }
+
+    .logo {
+        background: @userBase;
+
+    p {
+        font-size: 18px;
+        line-height: 40px;
+    }
+
+    }
+    .title {
+
+    h2 {
+        display: inline-block;
+        line-height: 60px;
+        font-size: 18px;
+    }
+
+    }
+    .userInfo {
+
+    }
+
+    .block {
+        height: 40px;
+        width: 100%;
+        background: #fff;
+        box-shadow: 0px 1px 2px #c9c9c9;
+        line-height: 40px;
+    }
+
+    .el-menu-item.is-active {
+        color: @userBase;
+    }
+
+    .el-main {
+        background: #dee2ea;
+        width: 100%;
+        height: 100%;
+        padding: 0;
+    }
+
+    .el-container[data-v-2c8bad12] {
+        height: 100%;
+    }
+
+
+</style>

+ 312 - 0
src/components/user/Information.vue

@@ -0,0 +1,312 @@
+<template>
+	<div class="info_container">
+		<MiniTitle>
+			<div slot="mini" class="miniTit">账号认证</div>
+		</MiniTitle>
+		<div class="infoBox">
+				<el-form ref="form" :label-position="labelPosition" :model="form" :rules="rules" label-width="120" class="add-admin-form">
+          <h4>基本信息</h4>
+          <el-form-item label="手机号码:">
+              <div>{{form.username}}</div>
+          </el-form-item>
+          <el-form-item label="姓名:">
+              <div>{{linkman}}</div>
+          </el-form-item>
+          <el-form-item label="机构名称:">
+              <div>{{form.organizationName}}</div>
+          </el-form-item>
+          <el-form-item label="邮箱:">
+              <div>{{email}}</div>
+          </el-form-item>
+        	<el-form-item :class="{toshow:!person}" label="所属岗位:">
+            <div>{{positionInfo}}</div>
+        	</el-form-item>
+          <el-form-item :class="{toshow: person}" label="所属岗位:" prop="position">
+              <el-input placeholder="请输入岗位名称" clearable v-model="form.position"></el-input>
+          </el-form-item>
+          <h4>机构信息</h4>
+          <el-form-item :class="{toshow:!person}" label="机构负责人:">
+            <div>{{principal}}</div>
+        	</el-form-item>
+          <el-form-item :class="{toshow: person}" label="机构负责人:" prop="organizationPrincipal">
+              <el-input placeholder="请输入机构负责人姓名" clearable v-model="form.organizationPrincipal"></el-input>
+          </el-form-item>
+          <el-form-item :class="{toshow:!person}" label="机构所在地:">
+            <div>{{address}}</div>
+        	</el-form-item>
+          <el-form-item :class="{toshow: person}" label="机构所在地:" prop="organizationAddress">
+              <el-input v-model="form.organizationAddress" placeholder="请输入机构所在地"></el-input>
+          </el-form-item>
+          <el-form-item :class="{toshow:!person}" label="机构属性:">
+            <div>{{organizationType}}</div>
+        	</el-form-item>
+          <el-form-item :class="{toshow: person}" label="机构属性:" prop="organizationTypeNum">
+              <el-select  v-model="form.organizationTypeNum" placeholder="请选择机构">
+                  <el-option v-for="item in options" :key="item.key" :label="item.name" :value="item.key">
+                  </el-option>
+              </el-select>
+          </el-form-item>
+          <el-form-item :class="{toshow:!person}" label="下属机构数量:">
+            <div>{{subNum}}</div>
+        	</el-form-item>
+          <el-form-item :class="{toshow: person}" label="下属机构数量:" prop="subOrganizationNum">
+              <el-input v-model="form.subOrganizationNum" placeholder="请输入下属机构数量" @change="handleNumInput"></el-input>
+          </el-form-item>
+          <div class="changeBtn">
+					<el-button type="primary" v-bind:class="{btn: isBtn}" class="emp" v-if="this.authStatusName == '认证中'"></el-button>
+					<!--认证中  同意-->
+					<el-button type="primary" v-bind:class="{btn: isBtn}" v-else-if="this.authStatusName == '未认证' && this.isReject == null"
+					 @click="submitAuth()">立即认证</el-button>
+					<el-button type="primary" v-bind:class="{btn: isBtn}" v-else-if="this.authStatusName == '未认证' && this.isReject == 0"
+					 @click="submitAuth()">立即认证</el-button>
+					<el-button type="primary" v-bind:class="{btn: isBtn}" v-else-if="this.authStatusName == '未认证' && this.isReject == 1"
+					 @click="submitAuth()">立即认证</el-button>
+					<el-button type="primary" class="chen" v-if="queBtn" @click="anthSubmit()">确定</el-button>
+				</div>
+      </el-form>
+		</div>
+	</div>
+</template>
+
+<script>
+	import api from '../../api/user.js';
+	import userApi from '@api/user.js';
+	import MiniTitle from '../common/MiniTile.vue';
+	export default {
+		name: 'user-information',
+		components: {
+			MiniTitle
+		},
+		data: function() {
+			return {
+				labelPosition: 'right',
+				form: {
+					position:'',
+          organizationPrincipal: '',//负责人
+          organizationAddress: '',
+          subOrganizationNum: null,
+          organizationName: '',
+          organizationTypeNum: null,
+          username:'',
+        },
+        rules: {
+          organizationPrincipal:[
+            { required: true, message: '请输入机构负责人', trigger: ['blur','change'] }
+          ],
+          organizationAddress:[
+            { required: true, message: '请输入机构所在地', trigger: ['blur','change'] }
+          ],
+          organizationName:[
+            { required: true, message: '请输入机构名称', trigger: ['blur','change']}
+          ],
+          organizationTypeNum:[
+            { required: true, message: '请选择机构属性', trigger: 'change' }
+          ],
+          position:[
+          	{ required: true, message: '请输入所属岗位', trigger: ['blur','change'] }
+          ]
+        },
+				username: null,
+				linkman: null,
+				email: null,
+				authStatusName: null,
+				authStatusName: null,
+				positionInfo: null,
+				subNum: null,
+				principal: null,
+				isReject: null,
+				address: null,
+				showPrise: true,
+				modify: false,
+				person: true,
+				isActive: false,
+				queBtn: false,
+				isBtn: false,
+				isBtns: false,
+				options: [],
+				organization: '',
+				organizationType: '',
+			}
+		},
+		computed: {},
+		created: function() {
+			this.getUserInfo();
+			const enumsList = JSON.parse(localStorage.getItem('enumsData'));
+			const organizationTypeEnum = enumsList.organizationTypeEnum;
+			for (var i = 0; i < organizationTypeEnum.length; i++) {
+				this.options.push(organizationTypeEnum[i])
+			}
+		},
+		methods: {
+			getUserInfo() {
+				//获取当前账户信息
+				userApi.getUserAuthInfo().then((res) => {
+					if (res.data.code == '0') {
+						const data = res.data.data;
+						this.isReject = data.isReject;
+						this.form.username = data.username;
+						this.linkman = data.linkman;
+						this.email = data.email;
+						this.form.organizationName = data.organizationName;
+						// data.organizationName ? this.form.organizationName = data.organizationName:this.organizationName = '待完善';
+						data.position ? this.form.position = this.positionInfo = data.position:this.positionInfo = '待完善';
+						data.principal ? this.form.organizationPrincipal = this.principal = data.principal:this.principal = '待完善';
+						data.address ? this.form.organizationAddress = this.address = data.address:this.address = '待完善';
+						if(data.subNum == 0 || data.subNum){
+							this.subNum = data.subNum;
+							this.form.subOrganizationNum = data.subNum;
+						}else{
+							this.subNum = '待完善';
+						}
+						
+						//认证状态 虚拟数据
+						data.authStatusName ? this.authStatusName = data.authStatusName:this.authStatusName = '待完善'; //认证状态
+						//下拉框
+						if(data.organizationType == 0 || data.organizationType){
+							const opLeng = this.options;
+							for (var i = 0; i < opLeng.length; i++) {
+								if (opLeng[i].key == data.organizationType) {
+									this.organizationType = opLeng[i].name;
+									this.form.organizationTypeNum = opLeng[i].key;
+								}
+							}
+
+						}else{
+							this.organizationType = '待完善';
+						}
+					}
+				}).catch((error) => {
+					console.log(error)
+				});
+			},
+			handleNumInput(){//机构数量只能数字
+              const numReg = new RegExp(/[^\d]/g);
+              if(numReg.test(this.form.subOrganizationNum) || this.form.subOrganizationNum < 0){
+                this.form.subOrganizationNum = null;
+              }
+            },
+			submitAuth: function() {
+				this.person = false;
+				this.isActive = true;
+				this.queBtn = true;
+				this.isBtn = true;
+				this.organizationType = '';
+			},
+			anthSubmit: function() {
+				this.$refs.form.validate((valid)=> {
+                  if (valid) {
+                    api.userAuthentication(this.form).then((res) => {
+                      if (+res.data.code == 0) {
+						this.$message({
+							message: '提交成功',
+							type: 'success'
+						});
+						this.getUserInfo();
+						this.queBtn = false;
+						this.person = true;
+						this.isActive = false;
+						this.$router.push({path:'/user/YH-JGZX-ZHXX'});
+						this.$emit('status-change','认证中');
+                      }else {
+                        this.$message({
+                          message: res.data.msg,
+                          type: 'warning'
+                        });
+                      }
+                    }).catch((error) => {
+                      console.log(error)
+                    });
+                  }
+                });
+			}
+		}
+	}
+</script>
+<style lang="less" scoped>
+@import '../../less/base.less';
+@import '../../less/user.less';
+	.info_container{
+		.base;
+	  width: 100%;
+	  height:100%;
+		
+		.el-button--primary{
+			background:#409EFF;
+		}
+		
+		h4 {
+			font-size: 14px;
+			padding-top: 20px;
+			margin-bottom: 20px;
+		}
+	}
+	.toshow{
+			display:none;
+		}
+	.miniTit {
+		margin-left: 20px;
+		font-weight: bold;
+		font-size: 16px;
+	}
+	
+	.infoBox {
+		height:91%;
+		max-height: 800px;
+		overflow-y: auto;
+		margin: 20px 20px 0;
+		background-color: #fff;	
+		.el-form{
+			padding-left: 30px;
+			.el-form-item{
+				margin-bottom: 15px;
+			}
+			.el-form-item__label,.el-form-item__content{
+				font-size: 12px !important;
+			}	
+		}
+
+		.changeBtn {
+			margin: 50px 0 22px 35px;
+		}
+
+		.emp {
+			display: none;
+		}
+
+		.inp {
+			width: 175px;
+			height: 30px;
+		}
+
+		.el-input__inner {
+			width: 175px;
+			height: 30px;
+			line-height: 30px;
+			font-size: 12px;
+		}
+
+		.el-input__icon {
+			line-height: 25px;
+		}
+
+		.title {
+			margin-top: 4px;
+		}
+		.subNum{
+			margin-top: 4px;
+		}
+
+		.chen {
+			background: #ffb03b;
+			border-color: #fff;
+		}
+
+		.btn {
+			display: none;
+		}
+
+		.btns {
+			display: block;
+		}
+	}
+</style>

+ 276 - 0
src/components/user/ManageService.vue

@@ -0,0 +1,276 @@
+<!-- 机构设置-管理服务端 By_liucf -->
+<template>
+  <div class="management">
+    <MiniTitle>
+      <div slot="mini" class="miniTit">
+        <!-- <img src="../../images/return.png" height="18" width="18" class="back" @click="back"> -->
+        机构中心——管理服务端
+      </div>
+      <div slot="info" class="btnBox">
+        <span class="btn lingpai" @click="addService">添加服务端</span>
+      </div>
+    </MiniTitle>
+    <div class="box">
+      <el-table
+        :data="serviceList"
+        style="width: 100%">
+        <el-table-column
+          prop="index"       
+          label="编号"
+          width="120"
+          align="center">
+        </el-table-column>
+        <el-table-column
+          prop="gmtCreate"
+          label="建立时间"         
+          align="center">
+        </el-table-column>
+        <el-table-column
+          prop="name"
+          label="服务端名称"
+          align="center">
+        </el-table-column>
+        <el-table-column
+          prop="description"
+          label="服务端描述"
+          align="center">
+        </el-table-column>
+        <el-table-column
+          label="操作"
+          align="center"
+          width="160">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="danger"
+              @click="handleDelete(scope.$index, serviceList)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      
+      <!-- 弹窗 -->
+      <div :class="[{'hide':toast},'mark']">
+        <div class="toast">
+          <i class="el-icon-close" @click="close"></i>
+          <p>{{ text }}</p>
+          <div class="bbtn toast-btn" @click="confirn">立即删除</div>
+        </div>
+    </div>
+    </div>
+    <!-- <div class="block"> -->
+    <div class="page" v-if="total>size">
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          :page-size="size"
+          layout="prev, pager, next, jumper"
+          :total="total">
+        </el-pagination>
+        <!-- <div class="btn btnConfirm" @click="handleCurrentChange">确定</div> -->
+      </div>
+  </div>
+</template>
+<script type="text/javascript">
+  import MiniTitle from '../common/MiniTile.vue'
+  import api from '../../api/user.js'
+  export default{
+    name:'ManageService',
+    data(){
+      return{
+        serviceList:[],
+        currentPage:1,
+        size:10,
+        total:1,
+        del:'删除',
+        toast:true,
+        text:'您确定要删除该服务端?删除该服务端可能无法使用朗通产品,可能会影响现有业务。',
+        serviceIndex:null
+      }
+    },
+    created(){
+      this.getInfoList();
+    },
+    components:{
+      MiniTitle
+    },
+    methods:{
+      getInfoList(){//获取服务端列表
+        const params = {
+          'current':this.currentPage,
+          'size':this.size
+        }
+        api.manageService(params).then((res)=>{
+          let result = res.data;
+          if(+result.code == 0){
+            let dataList = result.data.records;
+            dataList.forEach((item,index)=>{
+              item.index = (index+1)+(this.currentPage-1)*this.size;
+              return item
+            });
+            this.serviceList  = dataList;
+            this.total = result.data.total;
+          }
+          
+        })
+      },
+      handleSizeChange(val) {
+        console.log(`每页 ${val} 条`);
+      },
+      handleCurrentChange(val) {
+        this.currentPage = val;
+        this.getInfoList();
+      },
+      handleDelete(index, rows) {
+        this.serviceIndex = index;
+        this.toast = false;
+      },
+      confirn(){
+        this.toast = true;
+        const index = this.serviceIndex;
+        const id = this.serviceList[index].id;
+        api.deleteService(id).then((res)=>{
+          let result = res.data;
+          if(+result.code == 0){
+            // this.serviceList.splice(index,1);//前端删除
+            this.getInfoList();
+            this.serviceIndex = null;
+            this.$message({
+              message: '删除成功',
+              type: 'success'
+            });
+          }else{
+            this.$message({
+              message: result.msg,
+              type: 'warning'
+            });
+          }
+        })
+      },
+      close(){
+        this.toast = true;
+        this.serviceIndex = null;
+      },
+      addService(){
+        this.$router.push({path:'TJFWD'});//跳转到添加服务端
+      }
+    }
+  }
+</script>
+<style lang="less" scoped>
+@import '../../less/user.less';
+  .management{
+    width: 100%;
+    /*height: 100%;*/
+    height: 93%;
+    box-sizing: border-box;
+    .base;
+    
+    .miniTit{
+      .miniTitle;  
+    }
+    .back{
+      vertical-align: middle;
+      cursor: pointer;
+    }
+    .btn{
+        .button;
+      }
+      .bbtn{
+        width: 80px;
+        height: 30px;
+        line-height: 30px;
+        color: #fff;
+        background: #1774f0;
+        text-align: center;   
+        border-radius: 2px;
+        position: absolute;
+        bottom: 20px;
+        right: 25px;
+        cursor: pointer;
+      }
+    .btnBox{
+      margin-right: 20px;
+      .lingpai{
+        width: 90px;
+        height:24px;
+        line-height: 24px;
+        margin-left: 10px;
+        color:#fff;
+        background-color: #1774f0;
+      }
+    }
+    .box{
+      height:70%;
+      background: #fff;
+      position: relative;
+      padding: 20px 20px 40px;
+      margin: 20px;
+      border-radius: 2px;
+      overflow-y: auto;
+      .el-table{
+        text-align: center;
+      }
+    }
+    .page{ 
+      height:60px;
+      line-height: 60px;
+      text-align: right;
+      margin: 20px;
+      border-radius:2px;
+      background:#fff;
+    }
+    .btnConfirm{
+      color:#fff;
+      background-color: #1774f0;
+      position: absolute;
+      right: 8px;
+      bottom: 0;
+    }
+    .el-pagination{
+      padding: 15px 30px 0 0;
+    }
+
+    .mark{
+      width: 100%;
+      height:100%;
+      position: fixed;
+      top: 0;
+      left:0;
+      background-color:rgba(0,0,0,0.4);
+      z-index: 55;
+    }
+  .toast{
+    width: 280px;
+    height:150px;
+    background:#fff;
+    border-radius:2px;
+    position: absolute;
+    top: 50%;
+    left:50%;
+    transform:translate(-50%,-50%);
+    z-index: 56;
+    padding:35px;
+    text-align: center;
+    p{
+      margin-top: 40px;
+    }
+  }
+  .el-icon-close{
+    font-size: 16px;
+    cursor: pointer;
+    position: absolute;
+    top: 16px;
+    right: 16px;
+  }
+  .hide{
+    display:none;
+  }
+  .toast-btn{
+    width: 90px;
+    bottom:35px;
+    right:130px;
+  }
+     
+  }
+</style>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 398 - 0
src/components/user/MoreService.vue


+ 284 - 0
src/components/user/OpenedProduct.vue

@@ -0,0 +1,284 @@
+<!-- 用户已开通产品 By_liucf -->
+<template>
+  <div class="opened">
+    <MiniTitle>
+      <div slot="mini" class="miniTit">
+        <span>机构中心——已经开通的产品</span>
+      </div>
+    </MiniTitle>
+    <div class="main-box">
+      <!-- <div class="box" v-for="(item,index) in product" :key="item.id"> -->
+      <div v-for="(item,index) in product" :key="item.id" :class="['box',{'grayCol':item.isExpired || item.serviceStatus ==0 || item.openedServiceStatus==0}]">
+        <h3>{{item.name}}</h3>
+        <p class="expired">产品服务有效期:
+          <span v-if="item.isExpired" class="red">{{item.startTime|dataFormat}} ~ {{item.endTime|dataFormat}} (已过期)</span>
+          <span v-else>{{item.startTime|dataFormat}} ~ {{item.endTime|dataFormat}}</span>
+        </p>
+        <p>产品申请时间:{{item.gmtCreate|dataFormat}}</p>
+        <p>产品申请机构名称:{{item.organizationName}}</p>
+        <p>服务模式:<span v-for="acc in item.accessTypeArray" class="accType">{{acc}}</span></p>
+        <p class="chooseService">选择建立的服务端:
+          <span v-if="!!item.serviceInfos && item.serviceInfos.length != 0" :class="{'hide':item.isExpired || item.onlyOnline || item.serviceStatus ==0 || item.openedServiceStatus==0}">
+            <el-radio v-for="i in item.serviceInfos" v-model="radio" :label="i.id+','+i.name+','+index">{{i.name}}</el-radio>
+          </span>
+          <!-- 产品未到开通时间 以及已过期 或被停用 或产品自身停用 或单独线上模式 都不显示! -->
+          <!-- <span v-show="!item.isExpired && !item.unStarted && !item.onlyOnline && item.openedServiceStatus!=0 && item.serviceStatus !=0" class="btn addBtn" @click="addProductInfo">添加</span> -->
+          <span v-show="!item.isExpired && !item.onlyOnline && item.openedServiceStatus!=0 && item.serviceStatus !=0" class="btn addBtn" @click="addProductInfo">添加</span>
+        </p>
+        <p class="tokenInfo">产品令牌</p>
+        <p>用户请求接口时用户验证是否符合身份信息,请妥善保存</p> 
+        <!-- <div v-show="(new Date(item.endTime))>time && item.openedServiceStatus!=0 && item.serviceStatus !=0"> -->
+        <!-- <div v-show="!item.isExpired && !item.unStarted && !item.onlyOnline && item.openedServiceStatus!=0 && item.serviceStatus !=0"> -->
+        <div v-show="!item.isExpired && !item.onlyOnline && item.openedServiceStatus!=0 && item.serviceStatus !=0">
+          <div v-if="item.selectFlag" class="btn blueBtn" @click="creatService(item.id,index)">点击生成</div>
+          <div v-else class="btn createBtn">点击生成</div>
+        </div>
+        <img src="../../images/stop.png" height="54" width="54" class="overTime" v-if="item.openedServiceStatus==0 || item.serviceStatus ==0">
+        <img src="../../images/overTime.png" height="54" width="54" class="overTime" v-else-if="item.isExpired">
+      </div>
+      <div v-show="noProduct" class="box">
+        <h4>您尚未开通任何产品!</h4>
+      </div>
+    </div>
+  </div>
+</template>
+<script type="text/javascript">
+  import MiniTitle from '../common/MiniTile.vue'
+  import api from '../../api/user.js'
+  export default {
+    name:'OpenedProduct',
+    data(){
+      return {
+        product:[],
+        noProduct:false,
+        accType:{
+          '1':'线上模式',
+          '2':'接口方式',
+          '3':'嵌入式',
+        },
+        radio:'',//对应服务id和name
+        radioName:'',
+        serviceData:[],
+        flag:false,
+        keyId:'',
+        keySecret:'',
+        // time:new Date(),
+      }
+    },
+    created(){
+      this.getProduct();
+    },
+    methods:{
+      getProduct(){//获取已开通的产品
+        const key = 'selectFlag';//服务端选中标识
+        const value = false;
+        const showKey = 'showKey';//令牌展示标识
+        const keyValue = false;
+        api.opendedProduct().then((res)=>{
+          let result = res.data;
+          if(+result.code == 0){ 
+            let productData = result.data;                
+            if(productData.length != 0){
+              for(var k in productData){
+                productData[k][key] = value;
+                productData[k][showKey] = keyValue;
+                this.product.push(productData[k]);
+              }
+            } else{//没有开通产品
+              this.noProduct = true;
+            } 
+          }
+        })
+      },
+      addProductInfo(){
+        this.$router.push({path:'TJFWD'});//跳转到添加服务端
+      },
+      creatService(id,index){//点击生成
+        this.radioName = this.radio.split(',')[1];
+        const params = {
+          'productId':id,
+          'serviceId':this.radio.split(',')[0]
+        }
+        api.createServiceToken(params).then((res)=>{
+          let result = res.data;
+          if(+result.code == 0){//生成成功后直接跳转到已生成令牌详情 10-16-shenqiang
+            const tokenMsg = result.data.serviceToken;
+            const tokenId = tokenMsg.productServiceId;
+            this.$router.push({path:'CKLPXQ',query:{id:tokenId}});
+
+          }else{
+            this.$message({
+              message: result.msg,
+              type: 'warning'
+            });
+          }
+        })
+      },
+      copy(id){//点击复制
+        let keyDom = document.getElementById(id);
+        keyDom.select();
+        document.execCommand("Copy");
+        this.$message({
+          message: '复制成功',
+          type: 'success'
+        });
+      }
+    },
+    components:{
+      MiniTitle
+    },
+    filters:{
+      dataFormat(val){
+        let time = val;
+        let date = new Date(time);
+        let year = date.getFullYear();
+        let month = (date.getMonth()+1).toString().padStart(2,'0');
+        let day = date.getDate().toString().padStart(2,'0');
+        let hour = date.getHours().toString().padStart(2,'0');
+        let minute = date.getMinutes().toString().padStart(2,'0');
+        let times = year+'.'+month+'.'+day+' '+hour+':'+minute;
+        return times;
+      }
+    },
+    computed:{},
+    watch:{//监听生成按钮
+      radio:function(val){
+        if(val){
+          const index = this.radio.split(',')[2];
+          for(let i in this.product){
+            this.product[i].selectFlag = false
+          }
+          return this.product[index].selectFlag = true;
+        } 
+      }
+    }
+  }
+</script>
+<style lang="less" scoped>
+  @import '../../less/user.less';
+  .opened{
+    width: 100%;
+    height: 95%;
+    box-sizing: border-box;
+    .base; 
+    .main-box{
+      height:100%;
+      overflow-y: scroll;
+    } 
+    
+    .btn{
+        .button;
+        .border;
+      }
+    .miniTit{
+      .miniTitle;
+    }
+    .btnBox{
+      margin-right: 20px;
+      .lingpai{
+        width: 90px;
+        height:24px;
+        line-height: 24px;
+        margin-left: 10px;
+        border-color: #1774f0;
+        color: #1774f0; 
+      }
+    }
+    .box{
+      position: relative;
+      padding: 20px;
+      margin: 20px;
+      background: #fff;
+      border-radius: 2px;
+      min-width: 575px;
+      h3{
+        font-size: 14px;
+        font-weight: bold;
+        margin-bottom: 10px;
+      }
+      >p{
+        margin-top: 24px;
+      }
+      .chooseService{
+        line-height: 30px;
+        margin-top: 19px;
+        .el-radio__inner{
+          border: 1px solid #9b9b9b!important;
+        }
+      }
+      .overTime{
+        position: absolute;
+        top: 6px;
+        right: 395px;
+      }
+      .accType{
+        margin-right: 10px;
+      }
+      .expired{
+        position: absolute;
+        top: 20px;
+        right: 20px;
+        margin-top: 0;
+      }
+      .tokenInfo{
+        margin-top: 30px;
+        margin-bottom: -9px;
+      }
+      
+      .addBtn{ 
+        border-color: #1774f0;
+        color: #1774f0;
+        margin: -8px 0 0 15px;
+      }
+      .createBtn{
+        color:#fff;
+        background:#c9c9c9;
+        margin-top: 34px;
+        border: none;
+      }
+      .blueBtn{
+        color:#fff;
+        background:#1774f0;
+        margin-top: 34px;
+        border: none;
+      }
+      .copyBtn{
+        border-color: #1774f0;
+        color: #1774f0;
+        margin-left: 30px;
+      }
+      .key{
+        margin-top: 30px;
+        padding-top: 25px;
+        border-top: 1px dashed #c9c9c9;
+        .keyText{
+          width: 100%;
+          input{
+            height: 30px;
+            width: 99%;
+            margin-left: 15px;
+            padding-left: 10px;
+          }
+          .tr{
+            height:50px;
+          }
+        }
+        .info{
+          width: 10%;
+          text-align: right;  
+        }
+        .info1{
+          width: 10%;
+          text-align: left;  
+        }
+      }
+      .red{
+        color:red;
+      }
+      .hide{
+        display: none;
+      }
+
+    }
+  }
+</style>

+ 9 - 0
src/components/user/Power.vue

@@ -0,0 +1,9 @@
+<template>
+    <div>user power</div>
+</template>
+
+<script>
+  export default {
+    name: 'user-power'
+  }
+</script>

+ 76 - 0
src/components/user/SafetySetting.vue

@@ -0,0 +1,76 @@
+<!-- 个人中心 安全设置 By_liucf -->
+<template>
+  <div class="safe">
+    <MiniTitle>
+      <div slot="mini" class="miniTit">安全设置</div>
+    </MiniTitle>
+    <div class="box">
+      <h3>账号安全</h3> 
+      <div class="set">
+        <p><i class="el-icon-circle-check-outline"></i>登录密码</p>
+        <p>
+          <i class="el-icon-circle-check-outline"></i>
+          <span class="setted">已设置</span>
+          <span class="modifine" @click="modifinePsw">修改</span>
+        </p>
+      </div>
+      <p>安全性高的密码可以使账号更安全。建议您定期更换密码 ,设置一个不能由纯数字、字母组成且长度在6位~16位的密码。</p>
+    </div>
+  </div>
+</template>
+<script type="text/javascript">
+  import MiniTitle from '../common/MiniTile.vue'
+  export default {
+    name:'SafetySetting',
+    data(){
+      return{}
+    },
+    methods:{
+      modifinePsw(){
+        this.$router.push({path:'/forgetPassword',query:{type:1}});
+      }
+    },
+    components:{
+      MiniTitle
+    },
+  }
+</script>
+<style lang="less" scoped>
+  @import '../../less/user.less';
+  .safe{
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    .base;
+    .miniTit{
+      .miniTitle;  
+    }
+    .box{
+
+      padding: 20px 30px 30px;
+      margin: 20px;
+      
+      background: #fff;
+      border-radius: 2px;
+      h3{
+        font-size: 14px;
+        font-weight: bold;
+        margin-bottom: 10px;
+      }
+      .set{
+        display: flex;
+        justify-content: space-between;
+        margin: 20px 0 15px 0;
+      }
+      .modifine{
+        margin-left: 30px;
+        cursor: pointer;
+      }
+      .el-icon-circle-check-outline{
+        font-size: 16px;
+        margin-right: 8px;
+        vertical-align: middle;
+      }
+    }
+  }
+</style>

+ 340 - 0
src/components/user/TrialUser.vue

@@ -0,0 +1,340 @@
+<!-- 试用用户 -->
+<template>
+	<div class="userTrial">
+		<p class="userTitle">可试用产品</p>
+		<div class="trialBox">
+			<div class="felx">
+				<!-- 一行1 -->
+				<div class="flex_item" v-for="item in items" :key="item.key" :label="item.name" :value="item.key">
+					<div>
+						<div class="leftC">
+							<div :class="['productTi',{'grays':item.isUsed == 'N'}]">
+								<!-- {{item.name}} -->
+								<!-- <span class="title"> -->
+									<el-tooltip class="item" :disabled= "item.name.length < 32 ? true : false" effect="dark" :content="item.name" placement="top">
+										<span class="title">{{item.name}}</span>
+									</el-tooltip>
+								<!-- </span> -->
+								<span v-if="item.isUsed == 'Y' && item.startingDate != null">试用剩余时间: {{item.surplusTime}}</span>
+							</div>
+							<div :class="['pattern',{'grays':item.isUsed == 'N'}]">
+								<span>服务模式 :</span>
+								<span :class="['type',{'grays':item.isUsed == 'N'}]">{{item.accessTypeMsg}}</span>
+							</div>
+						</div>
+						<div class="endAg" v-if="item.isUsed == 'N'"><img src="../../images/trial_end.png" /></div>
+					</div>
+					<div calss="clear"></div>
+					<div class="userBtn">
+						<button class="trialBtn grayto" v-if="item.isUsed == 'N'">试用</button>
+						<button class="trialBtn cur" v-else-if="item.isUsed == 'Y'" @click="trialOpen(item.id)">试用</button>
+						<!-- <button class="trialBtn cur" v-else-if="item.isUsed == 'Y' && item.appKeyId != null" @click="trialUrl(item.trialUrl,item.appKeyId,item.appKeySecret)">试用</button> -->
+						<button class="trialOpen" @click="toOpen()">咨询开通</button>
+					</div>
+				</div> <!-- 一行1 -->
+			</div>
+		</div>
+	</div>
+</template>
+<script>
+	import userApi from '@api/user.js';
+	import encode from '@api/base64.js';
+	import '@api/utils.js';
+
+	export default {
+		template: '',
+		data() {
+			return {
+				isGray: false,
+				isGrayTo: false,
+				items: [],
+			}
+		},
+		created: function() {
+			this.getConsoleOnTrial();
+		},
+		methods: {
+			getConsoleOnTrial() {
+				userApi.getConsoleOnTrial().then((res) => {
+					if (res.data.code == '0') {
+						this.items = res.data.data;
+					}
+				}).catch((error) => {
+					console.log(error)
+				});
+			},
+			contrast(o){
+				console.log(o)
+			},
+			toOpen() {
+				this.$router.push({
+					path: 'YH-GDFW'
+				});
+			},
+			/*openWin(url){//创建a标签打开新窗口
+				let abtn = document.createElement('a');
+				abtn.id = "openPro";
+				abtn.href = url;
+				abtn.target = "_blank";
+				document.body.appendChild(abtn);
+				// document.getElementById("openPro").click();
+				if(document.all){//IE
+					document.getElementById("openPro").click();
+				}else {//其他浏览器
+					let e = document.createEvent("MouseEvents");
+					e.initEvent("click",true,true);
+					document.getElementById("openPro").dispatchEvent(e);
+				}
+				document.body.removeChild(abtn);
+			},*/
+			trialOpen(proId) {
+				//试用接口
+				const params = {
+					'productId' : proId
+				}
+				let newWindow = window.open();
+				const tempTime = new Date().getTime().toString();//加密时间戳
+    		const securityCode = encode(tempTime);
+				userApi.openUpOnTrial(params).then((res) => {
+					if (res.data.code == '0') {
+						const result = res.data.data;
+
+						const appKeyId = result.appKeyId;
+						const appKeySecret = result.appKeySecret;
+						const trialUrl = result.trialUrl;
+						const linkURL = trialUrl.indexOf("?")>-1? trialUrl + "&appI="+appKeyId+"&appS="+appKeySecret + "&code=" + securityCode : trialUrl + "?appI="+appKeyId+"&appS="+appKeySecret + "&code=" + securityCode;
+						
+						newWindow.location.href = linkURL;
+						// window.open(openUrl); //此方式会遭到拦截,故改成a标签形式 
+						// this.openWin(openUrl); //a标签形式的形式也会被拦截
+						 
+						this.$message({
+							message: '试用成功!',
+							type: 'success',
+							duration:1000,
+							onClose: function () {
+								this.items=[];
+								this.getConsoleOnTrial()
+							}.bind(this)
+						});
+						
+					}else{
+						newWindow.close();
+						this.$message({
+							message: res.data.msg,
+							type: 'warning',
+							duration:1000,
+							onClose: function () {
+								window.location.reload();
+							}.bind(this)
+						})
+						
+					}
+				}).catch((error) => {
+					console.log(error)
+				});
+			},
+		}
+	};
+</script>
+<style lang="less">
+	html {
+		min-width: 1280px;
+	}
+
+	.el-container[data-v-2c8bad12] {
+		height: 100%;
+	}
+
+	.userTrial {
+		/*margin-left: 20px !important;
+		min-width: 1127px;*/
+		display: inline-block;
+		.userTitle {
+			margin: 20px 0 15px 20px;
+			font-size: 14px;
+			color: #999;
+		}
+
+		.trialBox {
+			width: 100%;
+
+			.felx {
+				width: 100%;
+				display: flex;
+				display: -webkit-flex;
+				flex-wrap: wrap;
+				-webkit-flex-wrap: wrap;
+				flex-direction: row;
+
+				.flex_item {
+					// -webkit-box-flex: 1;
+					// -webkit-flex: 1;
+					// flex: 1;
+					list-style-type: none;
+					background: #fff;
+					margin-left: 20px;
+					width: 31%;
+					min-width: 348px;
+					max-width: 31%;
+					margin-bottom: 20px;
+					height: 150px;
+					position: relative;
+				}
+
+			}
+		}
+
+		.trialCk {
+			width: 47.9%;
+			height: 150px;
+			background: #fff;
+			/*margin-left: 20 px;*/
+			margin-right: 25px;
+			margin-bottom: 20px;
+			display: inline-block;
+		}
+
+		.productTi {
+			width: 89%;
+			font-size: 12px;
+			padding-left: 20px;
+			margin-top: 15px;
+			height: 36px;
+			display:flex;
+			justify-content: space-between;
+			.title{
+				display: -webkit-box;
+				-webkit-box-orient: vertical;
+				-webkit-line-clamp: 2;
+				font-size: 14px;
+				height: 36px;
+				overflow: hidden;
+				font-weight: bold;
+				color: #000;
+			}
+		}
+
+		.pattern {
+
+			/*margin-top: 20 px;*/
+
+			span {
+				display: block;
+				font-size: 12px;
+				margin-left: 20px;
+			}
+
+			.type {
+				color: #1774f0;
+				font-size: 12px;
+				margin-top: 10px;
+				margin-bottom: 20px;
+			}
+
+		}
+
+		.userBtn {
+			height: 44px;
+			line-height: 44px;
+			border-top: 1px solid #c9c9c9;
+			text-align: right;
+			position: absolute;
+			bottom: 0;
+			width: 100%;
+		}
+
+		.trialBtn {
+			width: 74px;
+			height: 26px;
+			border: 1px solid #1774f0;
+			background: #fff;
+			color: #1774f0;
+			font-size: 12px;
+			-webkit-transform: scale(0.9);
+			border-radius: 4px;
+			outline: none;
+			// cursor: pointer;
+		}
+
+		.trialOpen {
+			width: 70px;
+			height: 24px;
+			border: 0px;
+			background: #1774f0;
+			color: #fff;
+			border-radius: 4px;
+			font-size: 12px;
+			margin-right: 20px;
+			margin-left: 10px;
+			outline: none;
+			cursor: pointer;
+		}
+
+		.el-col {
+			border-radius: 4px;
+			margin-right: 20px;
+			padding: 0 !important;
+			margin-right: 30px;
+		}
+
+		.bg-purple-dark {
+			background: #99a9bf;
+		}
+
+		.bg-purple {
+			background: #d3dce6;
+		}
+
+		.bg-purple-light {
+			background: #e5e9f2;
+		}
+
+		.grid-content {
+			border-radius: 4px;
+			min-height: 36px;
+		}
+
+		.grays {
+			color: #aaa !important;
+		}
+
+		.grayto {
+			color: #aaa !important;
+			border: 1px solid #aaa !important;
+			outline: none;
+		}
+
+		.clear {
+			clear: both;
+		}
+
+		.endAg {
+			display: inline-block;
+			float: right;
+			margin-top: -90px;
+			margin-right: 15px;
+
+			img {
+				width: 50px;
+				height: 50px;
+				display: inline-block;
+			}
+		}
+    /*.endDate {
+    			display: inline-block;
+    			float: right;
+    			margin-top: 15px;
+    			margin-right: 15px;
+					font-size: 12px;
+					color: #424243;
+    		}*/
+		.leftC {
+			width: 100%;
+			float: left;
+		}
+		.cur{
+			cursor: pointer;
+		}
+	}
+</style>

+ 123 - 0
src/components/user/UserSetting.vue

@@ -0,0 +1,123 @@
+<template>
+	<div>
+		<MiniTitle>
+			<div slot="mini" class="miniTit">账号认证</div>
+		</MiniTitle>
+	<div class="userSetting">
+		<h4>账号安全</h4>
+		<div class="leftCon">
+			<el-radio v-model="radio" label="1" class="radio">登录密码</el-radio>
+			<p class="text">安全性高的密码可以使账号更安全。建议您定期更换密码,设置一个包含字母,符号或数字中至少两项且长度超过6位的密码</p>
+		</div>
+		<div class="rigCon">
+			<el-radio v-model="radio2" label="1" class="radio2">已设置</el-radio><span class="changeTxt" @click="changeText()">修改</span>
+		</div>
+	</div>
+	</div>
+</template>
+
+<script>
+	import MiniTitle from '../common/MiniTile.vue'
+	export default {
+		name: 'user-information',
+		components: {
+			MiniTitle
+		},
+		data: function() {
+			return {
+				radio: '',
+				radio2: ''
+			}
+		},
+		methods: {
+			changeText() {
+				this.$router.push({
+					path: '/forgetPassword'
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+	.miniTit {
+		margin-left: 20px;
+		font-weight: bold;
+	}
+	.userSetting {
+		margin-left: 20px !important;
+		margin-top: 20px !important;
+		background: #fff;
+		height: 150px;
+		margin-right: 20px !important;
+
+		h4 {
+			font-size: 14px;
+			padding-top: 20px;
+			margin-left: 30px;
+			padding-bottom: 20px;
+		}
+
+		.el-radio__label {
+			font-size: 12px !important;
+		}
+
+		.el-radio {
+			cursor: auto;
+		}
+
+		.el-radio__inner {
+			cursor: auto;
+		}
+    .el-radio__input{
+			cursor: auto;
+		}
+		.el-radio__inner:hover {
+			border-color: #9b9b9b;
+		}
+
+		.el-radio__input.is-checked .el-radio__inner {
+			border-color: #9b9b9b;
+			background: #fff;
+		}
+
+		.el-radio__input.is-checked+.el-radio__label {
+			color: #606266;
+		}
+
+		.leftCon {
+			float: left;
+			background: #fff;
+			margin-left: 30px;
+
+			.radio {
+				margin-bottom: 15px;
+			}
+
+			.text {
+				font-size: 12px;
+				margin-left: 24px;
+				color: #606266;
+			}
+		}
+
+		.rigCon {
+			float: right;
+			margin-right: 30px;
+			font-size: 12px;
+			color: #606266;
+
+			.radio2 {
+				margin-right: 30px;
+			}
+
+			.changeTxt {
+				cursor: pointer;
+
+				&:hover {
+					color: #409EFF;
+				}
+			}
+		}
+	}
+</style>

BIN
src/images/2steps-1.png


BIN
src/images/2steps-2.png


BIN
src/images/3steps-1.png


BIN
src/images/3steps-2.png


BIN
src/images/3steps-3.png


BIN
src/images/Group 3.png


BIN
src/images/add_big.png


BIN
src/images/bg.jpg


BIN
src/images/close.png


BIN
src/images/complete.png


BIN
src/images/complete_org.png


BIN
src/images/dot.png


BIN
src/images/left.jpg


BIN
src/images/must.png


BIN
src/images/numb_back.png


BIN
src/images/numb_next.png


BIN
src/images/overTime.png


BIN
src/images/return.png


BIN
src/images/robot_icon.png


BIN
src/images/stop.png


+ 0 - 0
src/images/title.png


Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä