lihao 4 gadi atpakaļ
vecāks
revīzija
34e3152755
50 mainītis faili ar 2886 papildinājumiem un 473 dzēšanām
  1. 1 1
      dist/client/index.html
  2. 0 0
      dist/client/js/index.4ff7ef56.js
  3. 0 0
      dist/client/js/subpage.1e45d3d6.js
  4. 1 1
      dist/client/subpage.html
  5. 482 285
      package-lock.json
  6. 19 4
      package.json
  7. 66 0
      src/api/screen.js
  8. BIN
      src/assets/images/cardTit.png
  9. BIN
      src/assets/images/fxc_bg.jpg
  10. BIN
      src/assets/images/fxc_bg.png
  11. BIN
      src/assets/images/fxc_bg1.png
  12. BIN
      src/assets/images/fxc_img1.png
  13. BIN
      src/assets/images/fxc_img10.png
  14. BIN
      src/assets/images/fxc_img11.png
  15. BIN
      src/assets/images/fxc_img12.png
  16. BIN
      src/assets/images/fxc_img2.png
  17. BIN
      src/assets/images/fxc_img3.png
  18. BIN
      src/assets/images/fxc_img4.png
  19. BIN
      src/assets/images/fxc_img5.png
  20. BIN
      src/assets/images/fxc_img6.png
  21. BIN
      src/assets/images/fxc_img7.png
  22. BIN
      src/assets/images/fxc_img8.png
  23. BIN
      src/assets/images/fxc_img9.png
  24. BIN
      src/assets/images/fxc_map.png
  25. BIN
      src/assets/images/fxc_tit.png
  26. BIN
      src/assets/images/logo_fxc.png
  27. BIN
      src/assets/images/opt_bg.png
  28. 99 0
      src/assets/styles/btn.scss
  29. 84 0
      src/assets/styles/element-ui.scss
  30. 31 0
      src/assets/styles/element-variables.scss
  31. 191 0
      src/assets/styles/index.scss
  32. 66 0
      src/assets/styles/mixin.scss
  33. 245 0
      src/assets/styles/ruoyi.scss
  34. 223 0
      src/assets/styles/sidebar.scss
  35. 48 0
      src/assets/styles/transition.scss
  36. 44 0
      src/assets/styles/variables.scss
  37. 290 2
      src/components/bigData/index.vue
  38. 122 0
      src/components/fangxincha/barChart.vue
  39. 125 0
      src/components/fangxincha/huan2d.vue
  40. 119 0
      src/components/fangxincha/huan3d.vue
  41. 159 0
      src/components/fangxincha/lineChart.vue
  42. 97 0
      src/components/fangxincha/map.vue
  43. 32 0
      src/components/fangxincha/numberCard.vue
  44. 112 0
      src/components/fangxincha/pie3d.vue
  45. 112 0
      src/components/fangxincha/pie3d2.vue
  46. 55 167
      src/components/signIn/SignIn.vue
  47. 9 0
      src/main.js
  48. 42 0
      src/utils/remoteLoad.js
  49. 7 6
      src/utils/request.js
  50. 5 7
      vue.config.js

+ 1 - 1
dist/client/index.html

@@ -1 +1 @@
-<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title></title><link href="css/about.40acff09.css" rel="prefetch"><link href="js/about.b68feefd.js" rel="prefetch"><link href="css/chunk-vendors.a16c4353.css" rel="preload" as="style"><link href="css/index.69a1ba66.css" rel="preload" as="style"><link href="js/chunk-vendors.bf1c293c.js" rel="preload" as="script"><link href="js/index.457f80e1.js" rel="preload" as="script"><link href="css/chunk-vendors.a16c4353.css" rel="stylesheet"><link href="css/index.69a1ba66.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="js/chunk-vendors.bf1c293c.js"></script><script src="js/index.457f80e1.js"></script></body></html>
+<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title></title><link href="css/about.40acff09.css" rel="prefetch"><link href="js/about.b68feefd.js" rel="prefetch"><link href="css/chunk-vendors.a16c4353.css" rel="preload" as="style"><link href="css/index.69a1ba66.css" rel="preload" as="style"><link href="js/chunk-vendors.bf1c293c.js" rel="preload" as="script"><link href="js/index.4ff7ef56.js" rel="preload" as="script"><link href="css/chunk-vendors.a16c4353.css" rel="stylesheet"><link href="css/index.69a1ba66.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="js/chunk-vendors.bf1c293c.js"></script><script src="js/index.4ff7ef56.js"></script></body></html>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/client/js/index.4ff7ef56.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/client/js/subpage.1e45d3d6.js


+ 1 - 1
dist/client/subpage.html

@@ -1 +1 @@
-<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>zynfcreader</title><link href="css/about.40acff09.css" rel="prefetch"><link href="js/about.b68feefd.js" rel="prefetch"><link href="css/chunk-vendors.a16c4353.css" rel="preload" as="style"><link href="css/subpage.69a1ba66.css" rel="preload" as="style"><link href="js/chunk-vendors.bf1c293c.js" rel="preload" as="script"><link href="js/subpage.dfad6591.js" rel="preload" as="script"><link href="css/chunk-vendors.a16c4353.css" rel="stylesheet"><link href="css/subpage.69a1ba66.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but zynfcreader doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="js/chunk-vendors.bf1c293c.js"></script><script src="js/subpage.dfad6591.js"></script></body></html>
+<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>zynfcreader</title><link href="css/about.40acff09.css" rel="prefetch"><link href="js/about.b68feefd.js" rel="prefetch"><link href="css/chunk-vendors.a16c4353.css" rel="preload" as="style"><link href="css/subpage.69a1ba66.css" rel="preload" as="style"><link href="js/chunk-vendors.bf1c293c.js" rel="preload" as="script"><link href="js/subpage.1e45d3d6.js" rel="preload" as="script"><link href="css/chunk-vendors.a16c4353.css" rel="stylesheet"><link href="css/subpage.69a1ba66.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but zynfcreader doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="js/chunk-vendors.bf1c293c.js"></script><script src="js/subpage.1e45d3d6.js"></script></body></html>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 482 - 285
package-lock.json


+ 19 - 4
package.json

@@ -10,25 +10,36 @@
   "dependencies": {
     "axios": "^0.24.0",
     "core-js": "^3.6.5",
+    "echarts": "4.9.0",
     "element-ui": "^2.15.6",
+    "highcharts": "^9.2.2",
+    "highcharts-vue": "^1.4.0",
+    "highlight.js": "9.18.5",
+    "js-beautify": "1.13.0",
     "js-cookie": "^3.0.1",
     "js-md5": "^0.7.3",
     "jsencrypt": "^3.2.1",
     "less": "^4.1.2",
-    "less-loader": "^5.0.0",
+    "less-loader": "^6.0.0",
+    "sass": "1.32.0",
+    "sass-loader": "10.1.0",
+    "v-charts": "^1.19.0",
     "vue": "^2.6.11",
+    "vue-amap": "^0.5.10",
     "vue-cookies": "^1.7.4",
     "vue-pdf": "^4.3.0",
     "vue-router": "^3.5.3",
     "vuex": "^3.6.2"
   },
   "devDependencies": {
-    "@vue/cli-plugin-babel": "^4.5.0",
-    "@vue/cli-plugin-eslint": "^4.5.0",
-    "@vue/cli-service": "^4.5.0",
+    "@vue/cli-plugin-babel": "4.4.6",
+    "@vue/cli-plugin-eslint": "4.4.6",
+    "@vue/cli-service": "4.4.6",
     "babel-eslint": "^10.1.0",
     "eslint": "^6.7.2",
     "eslint-plugin-vue": "^6.2.2",
+    "sass": "1.32.0",
+    "sass-loader": "10.1.0",
     "vue-template-compiler": "^2.6.11"
   },
   "eslintConfig": {
@@ -45,6 +56,10 @@
     },
     "rules": {}
   },
+  "engines": {
+    "node": ">=8.9",
+    "npm": ">= 3.0.0"
+  },
   "browserslist": [
     "> 1%",
     "last 2 versions",

+ 66 - 0
src/api/screen.js

@@ -0,0 +1,66 @@
+import request from '@/utils/request'
+
+//放芯查登录
+export function loginByPwd(data) {
+  return request({
+    url: '/fxc/login/username',
+    method: 'post',
+    headers:{isToken:false},
+    data: data
+  })
+}
+export function getFxcToken() {
+  return request({
+    url: '/fxc/login/username',
+    method: 'post',
+    headers:{isToken:false},
+    data: {
+      "username": "13153864796",//"admin",
+      "password": "123456",//"t8D!CyUCGlKD",
+    }
+  })
+}
+//放芯查冷链位置查询
+export function getFxclistChainLocal(token) {
+  return request({
+    url: '/fxc/index/listChainLocal',
+    method: 'post',
+    headers:{
+      isToken:false,
+      Authorization:'Bearer '+token
+    },
+  })
+}
+//标签在不同产品中用量统计
+export function getFxcProductChipState(token) {
+  return request({
+    url: '/fxc/index/productChipState',
+    method: 'post',
+    headers:{
+      isToken:false,
+      Authorization:'Bearer '+token
+    },
+  })
+}
+//产品标签使用量总和统计
+export function getFxcProductTypeChipCount(token) {
+  return request({
+    url: '/fxc/index/productTypeChipCount',
+    method: 'post',
+    headers:{
+      isToken:false,
+      Authorization:'Bearer '+token
+    },
+  })
+}
+//冷链运输状态查询,以及预警状态数量
+export function getFxcChainStatus(token) {
+  return request({
+    url: '/fxc/index/getChainStatus',
+    method: 'post',
+    headers:{
+      isToken:false,
+      Authorization:'Bearer '+token
+    },
+  })
+}

BIN
src/assets/images/cardTit.png


BIN
src/assets/images/fxc_bg.jpg


BIN
src/assets/images/fxc_bg.png


BIN
src/assets/images/fxc_bg1.png


BIN
src/assets/images/fxc_img1.png


BIN
src/assets/images/fxc_img10.png


BIN
src/assets/images/fxc_img11.png


BIN
src/assets/images/fxc_img12.png


BIN
src/assets/images/fxc_img2.png


BIN
src/assets/images/fxc_img3.png


BIN
src/assets/images/fxc_img4.png


BIN
src/assets/images/fxc_img5.png


BIN
src/assets/images/fxc_img6.png


BIN
src/assets/images/fxc_img7.png


BIN
src/assets/images/fxc_img8.png


BIN
src/assets/images/fxc_img9.png


BIN
src/assets/images/fxc_map.png


BIN
src/assets/images/fxc_tit.png


BIN
src/assets/images/logo_fxc.png


BIN
src/assets/images/opt_bg.png


+ 99 - 0
src/assets/styles/btn.scss

@@ -0,0 +1,99 @@
+@import './variables.scss';
+
+@mixin colorBtn($color) {
+  background: $color;
+
+  &:hover {
+    color: $color;
+
+    &:before,
+    &:after {
+      background: $color;
+    }
+  }
+}
+
+.blue-btn {
+  @include colorBtn($blue)
+}
+
+.light-blue-btn {
+  @include colorBtn($light-blue)
+}
+
+.red-btn {
+  @include colorBtn($red)
+}
+
+.pink-btn {
+  @include colorBtn($pink)
+}
+
+.green-btn {
+  @include colorBtn($green)
+}
+
+.tiffany-btn {
+  @include colorBtn($tiffany)
+}
+
+.yellow-btn {
+  @include colorBtn($yellow)
+}
+
+.pan-btn {
+  font-size: 14px;
+  color: #fff;
+  padding: 14px 36px;
+  border-radius: 8px;
+  border: none;
+  outline: none;
+  transition: 600ms ease all;
+  position: relative;
+  display: inline-block;
+
+  &:hover {
+    background: #fff;
+
+    &:before,
+    &:after {
+      width: 100%;
+      transition: 600ms ease all;
+    }
+  }
+
+  &:before,
+  &:after {
+    content: '';
+    position: absolute;
+    top: 0;
+    right: 0;
+    height: 2px;
+    width: 0;
+    transition: 400ms ease all;
+  }
+
+  &::after {
+    right: inherit;
+    top: inherit;
+    left: 0;
+    bottom: 0;
+  }
+}
+
+.custom-button {
+  display: inline-block;
+  line-height: 1;
+  white-space: nowrap;
+  cursor: pointer;
+  background: #fff;
+  color: #fff;
+  -webkit-appearance: none;
+  text-align: center;
+  box-sizing: border-box;
+  outline: 0;
+  margin: 0;
+  padding: 10px 15px;
+  font-size: 14px;
+  border-radius: 4px;
+}

+ 84 - 0
src/assets/styles/element-ui.scss

@@ -0,0 +1,84 @@
+// cover some element-ui styles
+
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+  font-weight: 400 !important;
+}
+
+.el-upload {
+  input[type="file"] {
+    display: none !important;
+  }
+}
+
+.el-upload__input {
+  display: none;
+}
+
+.cell {
+  .el-tag {
+    margin-right: 0px;
+  }
+}
+
+.small-padding {
+  .cell {
+    padding-left: 5px;
+    padding-right: 5px;
+  }
+}
+
+.fixed-width {
+  .el-button--mini {
+    padding: 7px 10px;
+    width: 60px;
+  }
+}
+
+.status-col {
+  .cell {
+    padding: 0 10px;
+    text-align: center;
+
+    .el-tag {
+      margin-right: 0px;
+    }
+  }
+}
+
+// to fixed https://github.com/ElemeFE/element/issues/2461
+.el-dialog {
+  transform: none;
+  left: 0;
+  position: relative;
+  margin: 0 auto;
+}
+
+// refine element ui upload
+.upload-container {
+  .el-upload {
+    width: 100%;
+
+    .el-upload-dragger {
+      width: 100%;
+      height: 200px;
+    }
+  }
+}
+
+// dropdown
+.el-dropdown-menu {
+  a {
+    display: block
+  }
+}
+
+// fix date-picker ui bug in filter-item
+.el-range-editor.el-input__inner {
+  display: inline-flex !important;
+}
+
+// to fix el-date-picker css style
+.el-range-separator {
+  box-sizing: content-box;
+}

+ 31 - 0
src/assets/styles/element-variables.scss

@@ -0,0 +1,31 @@
+/**
+* I think element-ui's default theme color is too light for long-term use.
+* So I modified the default color and you can modify it to your liking.
+**/
+
+/* theme color */
+$--color-primary: #1890ff;
+$--color-success: #13ce66;
+$--color-warning: #ffba00;
+$--color-danger: #ff4949;
+// $--color-info: #1E1E1E;
+
+$--button-font-weight: 400;
+
+// $--color-text-regular: #1f2d3d;
+
+$--border-color-light: #dfe4ed;
+$--border-color-lighter: #e6ebf5;
+
+$--table-border:1px solid#dfe6ec;
+
+/* icon font path, required */
+$--font-path: '~element-ui/lib/theme-chalk/fonts';
+
+@import "~element-ui/packages/theme-chalk/src/index";
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+  theme: $--color-primary;
+}

+ 191 - 0
src/assets/styles/index.scss

@@ -0,0 +1,191 @@
+@import './variables.scss';
+@import './mixin.scss';
+@import './transition.scss';
+@import './element-ui.scss';
+@import './sidebar.scss';
+@import './btn.scss';
+
+body {
+  height: 100%;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  text-rendering: optimizeLegibility;
+  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+}
+
+label {
+  font-weight: 700;
+}
+
+html {
+  height: 100%;
+  box-sizing: border-box;
+}
+
+#app {
+  height: 100%;
+}
+
+*,
+*:before,
+*:after {
+  box-sizing: inherit;
+}
+
+.no-padding {
+  padding: 0px !important;
+}
+
+.padding-content {
+  padding: 4px 0;
+}
+
+a:focus,
+a:active {
+  outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+  cursor: pointer;
+  color: inherit;
+  text-decoration: none;
+}
+
+div:focus {
+  outline: none;
+}
+
+.fr {
+  float: right;
+}
+
+.fl {
+  float: left;
+}
+
+.pr-5 {
+  padding-right: 5px;
+}
+
+.pl-5 {
+  padding-left: 5px;
+}
+
+.block {
+  display: block;
+}
+
+.pointer {
+  cursor: pointer;
+}
+
+.inlineBlock {
+  display: block;
+}
+
+.clearfix {
+  &:after {
+    visibility: hidden;
+    display: block;
+    font-size: 0;
+    content: " ";
+    clear: both;
+    height: 0;
+  }
+}
+
+aside {
+  background: #eef1f6;
+  padding: 8px 24px;
+  margin-bottom: 20px;
+  border-radius: 2px;
+  display: block;
+  line-height: 32px;
+  font-size: 16px;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+  color: #2c3e50;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+
+  a {
+    color: #337ab7;
+    cursor: pointer;
+
+    &:hover {
+      color: rgb(32, 160, 255);
+    }
+  }
+}
+
+//main-container全局样式
+.app-container {
+  padding: 20px;
+}
+
+.components-container {
+  margin: 30px 50px;
+  position: relative;
+}
+
+.pagination-container {
+  margin-top: 30px;
+}
+
+.text-center {
+  text-align: center
+}
+
+.sub-navbar {
+  height: 50px;
+  line-height: 50px;
+  position: relative;
+  width: 100%;
+  text-align: right;
+  padding-right: 20px;
+  transition: 600ms ease position;
+  background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
+
+  .subtitle {
+    font-size: 20px;
+    color: #fff;
+  }
+
+  &.draft {
+    background: #d0d0d0;
+  }
+
+  &.deleted {
+    background: #d0d0d0;
+  }
+}
+
+.link-type,
+.link-type:focus {
+  color: #337ab7;
+  cursor: pointer;
+
+  &:hover {
+    color: rgb(32, 160, 255);
+  }
+}
+
+.filter-container {
+  padding-bottom: 10px;
+
+  .filter-item {
+    display: inline-block;
+    vertical-align: middle;
+    margin-bottom: 10px;
+  }
+}
+
+//refine vue-multiselect plugin
+.multiselect {
+  line-height: 16px;
+}
+
+.multiselect--active {
+  z-index: 1000 !important;
+}

+ 66 - 0
src/assets/styles/mixin.scss

@@ -0,0 +1,66 @@
+@mixin clearfix {
+  &:after {
+    content: "";
+    display: table;
+    clear: both;
+  }
+}
+
+@mixin scrollBar {
+  &::-webkit-scrollbar-track-piece {
+    background: #d3dce6;
+  }
+
+  &::-webkit-scrollbar {
+    width: 6px;
+  }
+
+  &::-webkit-scrollbar-thumb {
+    background: #99a9bf;
+    border-radius: 20px;
+  }
+}
+
+@mixin relative {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+
+@mixin pct($pct) {
+  width: #{$pct};
+  position: relative;
+  margin: 0 auto;
+}
+
+@mixin triangle($width, $height, $color, $direction) {
+  $width: $width/2;
+  $color-border-style: $height solid $color;
+  $transparent-border-style: $width solid transparent;
+  height: 0;
+  width: 0;
+
+  @if $direction==up {
+    border-bottom: $color-border-style;
+    border-left: $transparent-border-style;
+    border-right: $transparent-border-style;
+  }
+
+  @else if $direction==right {
+    border-left: $color-border-style;
+    border-top: $transparent-border-style;
+    border-bottom: $transparent-border-style;
+  }
+
+  @else if $direction==down {
+    border-top: $color-border-style;
+    border-left: $transparent-border-style;
+    border-right: $transparent-border-style;
+  }
+
+  @else if $direction==left {
+    border-right: $color-border-style;
+    border-top: $transparent-border-style;
+    border-bottom: $transparent-border-style;
+  }
+}

+ 245 - 0
src/assets/styles/ruoyi.scss

@@ -0,0 +1,245 @@
+ /**
+ * 通用css样式布局处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+ /** 基础通用 **/
+.pt5 {
+	padding-top: 5px;
+}
+.pr5 {
+	padding-right: 5px;
+}
+.pb5 {
+	padding-bottom: 5px;
+}
+.mt5 {
+	margin-top: 5px;
+}
+.mr5 {
+	margin-right: 5px;
+}
+.mb5 {
+	margin-bottom: 5px;
+}
+.mb8 {
+	margin-bottom: 8px;
+}
+.ml5 {
+	margin-left: 5px;
+}
+.mt10 {
+	margin-top: 10px;
+}
+.mr10 {
+	margin-right: 10px;
+}
+.mb10 {
+	margin-bottom: 10px;
+}
+.ml0 {
+	margin-left: 10px;
+}
+.mt20 {
+	margin-top: 20px;
+}
+.mr20 {
+	margin-right: 20px;
+}
+.mb20 {
+	margin-bottom: 20px;
+}
+.m20 {
+	margin-left: 20px;
+}
+
+.el-dialog:not(.is-fullscreen){
+	margin-top: 6vh !important;
+}
+
+.el-table {
+	.el-table__header-wrapper, .el-table__fixed-header-wrapper {
+		th {
+			word-break: break-word;
+			background-color: #f8f8f9;
+			color: #515a6e;
+			height: 40px;
+			font-size: 13px;
+		}
+	}
+	.el-table__body-wrapper {
+		.el-button [class*="el-icon-"] + span {
+			margin-left: 1px;
+		}
+	}
+}
+
+/** 表单布局 **/
+.form-header {
+    font-size:15px;
+	color:#6379bb;
+	border-bottom:1px solid #ddd;
+	margin:8px 10px 25px 10px;
+	padding-bottom:5px
+}
+
+/** 表格布局 **/
+.pagination-container {
+	position: relative;
+	height: 25px;
+	margin-bottom: 10px;
+	margin-top: 15px;
+	padding: 10px 20px !important;
+}
+
+/* tree border */
+.tree-border {
+    margin-top: 5px;
+    border: 1px solid #e5e6e7;
+    background: #FFFFFF none;
+    border-radius:4px;
+}
+
+.pagination-container .el-pagination {
+	right: 0;
+	position: absolute;
+}
+
+.el-table .fixed-width .el-button--mini {
+	padding-left: 0;
+	padding-right: 0;
+	width: inherit;
+}
+
+.el-tree-node__content > .el-checkbox {
+	margin-right: 8px;
+}
+
+.list-group-striped > .list-group-item {
+	border-left: 0;
+	border-right: 0;
+	border-radius: 0;
+	padding-left: 0;
+	padding-right: 0;
+}
+
+.list-group {
+	padding-left: 0px;
+	list-style: none;
+}
+
+.list-group-item {
+	border-bottom: 1px solid #e7eaec;
+	border-top: 1px solid #e7eaec;
+	margin-bottom: -1px;
+	padding: 11px 0px;
+	font-size: 13px;
+}
+
+.pull-right {
+	float: right !important;
+}
+
+.el-card__header {
+	padding: 14px 15px 7px;
+	min-height: 40px;
+}
+
+.el-card__body {
+	padding: 15px 20px 20px 20px;
+}
+
+.card-box {
+	padding-right: 15px;
+	padding-left: 15px;
+	margin-bottom: 10px;
+}
+
+/* button color */
+.el-button--cyan.is-active,
+.el-button--cyan:active {
+  background: #20B2AA;
+  border-color: #20B2AA;
+  color: #FFFFFF;
+}
+
+.el-button--cyan:focus,
+.el-button--cyan:hover {
+  background: #48D1CC;
+  border-color: #48D1CC;
+  color: #FFFFFF;
+}
+
+.el-button--cyan {
+  background-color: #20B2AA;
+  border-color: #20B2AA;
+  color: #FFFFFF;
+}
+
+/* submenu item */
+.el-menu--horizontal > .el-submenu .el-submenu__title {
+	height: 50px !important;
+	line-height: 50px !important;
+}
+
+/* text color */
+.text-navy {
+	color: #1ab394;
+}
+
+.text-primary {
+	color: inherit;
+}
+
+.text-success {
+	color: #1c84c6;
+}
+
+.text-info {
+	color: #23c6c8;
+}
+
+.text-warning {
+	color: #f8ac59;
+}
+
+.text-danger {
+	color: #ed5565;
+}
+
+.text-muted {
+	color: #888888;
+}
+
+/* image */
+.img-circle {
+	border-radius: 50%;
+}
+
+.img-lg {
+	width: 120px;
+	height: 120px;
+}
+
+.avatar-upload-preview {
+	position: absolute;
+	top: 50%;
+	transform: translate(50%, -50%);
+	width: 200px;
+	height: 200px;
+	border-radius: 50%;
+	box-shadow: 0 0 4px #ccc;
+	overflow: hidden;
+}
+
+/* 拖拽列样式 */
+.sortable-ghost{
+	opacity: .8;
+	color: #fff!important;
+	background: #42b983!important;
+}
+
+.top-right-btn {
+	position: relative;
+	float: right;
+}

+ 223 - 0
src/assets/styles/sidebar.scss

@@ -0,0 +1,223 @@
+#app {
+
+  .main-container {
+    min-height: 100%;
+    transition: margin-left .28s;
+    margin-left: $sideBarWidth;
+    position: relative;
+  }
+
+  .sidebar-container {
+    -webkit-transition: width .28s;
+    transition: width 0.28s;
+    width: $sideBarWidth !important;
+    background-color: $menuBg;
+    height: 100%;
+    position: fixed;
+    font-size: 0px;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 1001;
+    overflow: hidden;
+    -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35);
+    box-shadow: 2px 0 6px rgba(0,21,41,.35);
+
+    // reset element-ui css
+    .horizontal-collapse-transition {
+      transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
+    }
+
+    .scrollbar-wrapper {
+      overflow-x: hidden !important;
+    }
+
+    .el-scrollbar__bar.is-vertical {
+      right: 0px;
+    }
+
+    .el-scrollbar {
+      height: 100%;
+    }
+
+    &.has-logo {
+      .el-scrollbar {
+        height: calc(100% - 50px);
+      }
+    }
+
+    .is-horizontal {
+      display: none;
+    }
+
+    a {
+      display: inline-block;
+      width: 100%;
+      overflow: hidden;
+    }
+
+    .svg-icon {
+      margin-right: 16px;
+    }
+
+    .el-menu {
+      border: none;
+      height: 100%;
+      width: 100% !important;
+    }
+
+    .el-menu-item, .el-submenu__title {
+      overflow: hidden !important;
+      text-overflow: ellipsis !important;
+      white-space: nowrap !important;
+    }
+
+    // menu hover
+    .submenu-title-noDropdown,
+    .el-submenu__title {
+      &:hover {
+        background-color: rgba(0, 0, 0, 0.06) !important;
+      }
+    }
+
+    & .theme-dark .is-active > .el-submenu__title {
+      color: $subMenuActiveText !important;
+    }
+
+    & .nest-menu .el-submenu>.el-submenu__title,
+    & .el-submenu .el-menu-item {
+      min-width: $sideBarWidth !important;
+
+      &:hover {
+        background-color: rgba(0, 0, 0, 0.06) !important;
+      }
+    }
+
+    & .theme-dark .nest-menu .el-submenu>.el-submenu__title,
+    & .theme-dark .el-submenu .el-menu-item {
+      background-color: $subMenuBg !important;
+
+      &:hover {
+        background-color: $subMenuHover !important;
+      }
+    }
+  }
+
+  .hideSidebar {
+    .sidebar-container {
+      width: 54px !important;
+    }
+
+    .main-container {
+      margin-left: 54px;
+    }
+
+    .submenu-title-noDropdown {
+      padding: 0 !important;
+      position: relative;
+
+      .el-tooltip {
+        padding: 0 !important;
+
+        .svg-icon {
+          margin-left: 20px;
+        }
+      }
+    }
+
+    .el-submenu {
+      overflow: hidden;
+
+      &>.el-submenu__title {
+        padding: 0 !important;
+
+        .svg-icon {
+          margin-left: 20px;
+        }
+
+      }
+    }
+
+    .el-menu--collapse {
+      .el-submenu {
+        &>.el-submenu__title {
+          &>span {
+            height: 0;
+            width: 0;
+            overflow: hidden;
+            visibility: hidden;
+            display: inline-block;
+          }
+        }
+      }
+    }
+  }
+
+  .el-menu--collapse .el-menu .el-submenu {
+    min-width: $sideBarWidth !important;
+  }
+
+  // mobile responsive
+  .mobile {
+    .main-container {
+      margin-left: 0px;
+    }
+
+    .sidebar-container {
+      transition: transform .28s;
+      width: $sideBarWidth !important;
+    }
+
+    &.hideSidebar {
+      .sidebar-container {
+        pointer-events: none;
+        transition-duration: 0.3s;
+        transform: translate3d(-$sideBarWidth, 0, 0);
+      }
+    }
+  }
+
+  .withoutAnimation {
+
+    .main-container,
+    .sidebar-container {
+      transition: none;
+    }
+  }
+}
+
+// when menu collapsed
+.el-menu--vertical {
+  &>.el-menu {
+    .svg-icon {
+      margin-right: 16px;
+    }
+  }
+
+  .nest-menu .el-submenu>.el-submenu__title,
+  .el-menu-item {
+    &:hover {
+      // you can use $subMenuHover
+      background-color: rgba(0, 0, 0, 0.06) !important;
+    }
+  }
+
+  // the scroll bar appears when the subMenu is too long
+  >.el-menu--popup {
+    max-height: 100vh;
+    overflow-y: auto;
+
+    &::-webkit-scrollbar-track-piece {
+      background: #d3dce6;
+    }
+
+    &::-webkit-scrollbar {
+      width: 6px;
+    }
+
+    &::-webkit-scrollbar-thumb {
+      background: #99a9bf;
+      border-radius: 20px;
+    }
+  }
+}

+ 48 - 0
src/assets/styles/transition.scss

@@ -0,0 +1,48 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+  opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+  transition: all .5s;
+}
+
+.fade-transform-enter {
+  opacity: 0;
+  transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+  opacity: 0;
+  transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+  transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+  opacity: 0;
+  transform: translateX(20px);
+}
+
+.breadcrumb-move {
+  transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+  position: absolute;
+}

+ 44 - 0
src/assets/styles/variables.scss

@@ -0,0 +1,44 @@
+// base color
+$blue:#324157;
+$light-blue:#3A71A8;
+$red:#C03639;
+$pink: #E65D6E;
+$green: #30B08F;
+$tiffany: #4AB7BD;
+$yellow:#FEC171;
+$panGreen: #30B08F;
+
+// sidebar
+$menuText:#bfcbd9;
+$menuActiveText:#409EFF;
+$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951
+
+$menuBg:#304156;
+$menuHover:#263445;
+$sidebarTitle: #ffffff;
+
+$menuLightBg:#ffffff;
+$menuLightHover:#f0f1f5;
+$sidebarLightTitle: #001529;
+
+$subMenuBg:#1f2d3d;
+$subMenuHover:#001528;
+
+$sideBarWidth: 200px;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+  menuText: $menuText;
+  menuActiveText: $menuActiveText;
+  subMenuActiveText: $subMenuActiveText;
+  menuBg: $menuBg;
+  menuHover: $menuHover;
+  menuLightBg: $menuLightBg;
+  menuLightHover: $menuLightHover;
+  subMenuBg: $subMenuBg;
+  subMenuHover: $subMenuHover;
+  sideBarWidth: $sideBarWidth;
+  sidebarTitle: $sidebarTitle;
+  sidebarLightTitle: $sidebarLightTitle
+}

+ 290 - 2
src/components/bigData/index.vue

@@ -1,3 +1,291 @@
 <template>
-    <div>大屏</div>
-</template>
+  <div class="mot_page">
+    <div class="mot_head">放芯查数据展示平台</div>
+    <div class="fxc_top">
+      <div class="fxc_top_item">
+        <img src="../../assets/images/fxc_img2.png">
+        <div class="fxc_top_txt">
+          <div class="fxc_top_num">
+            <numCard v-for="(item,index) in ''+produced" :key="index" :num="item || 0" :color="'#3AB46D'"></numCard>
+          </div>
+          <div class="fxc_top_type">已生产(个)</div>
+        </div>
+      </div>
+      <div class="fxc_top_item">
+        <img src="../../assets/images/fxc_img3.png">
+        <div class="fxc_top_txt">
+          <div class="fxc_top_num">
+            <numCard v-for="(item,index) in ''+finished" :key="index" :num="item || 0" :color="'#EF4598'"></numCard>
+          </div>
+          <div class="fxc_top_type">已结束(个)</div>
+        </div>
+      </div>
+      <div class="fxc_top_item">
+        <img src="../../assets/images/fxc_img4.png">
+        <div class="fxc_top_txt">
+          <div class="fxc_top_num">
+            <numCard v-for="(item,index) in ''+transit" :key="index" :num="item || 0" :color="'#F8B30E'"></numCard>
+          </div>
+          <div class="fxc_top_type">运输中(个)</div>
+        </div>
+      </div>
+      <div class="fxc_top_item">
+        <img src="../../assets/images/fxc_img5.png">
+        <div class="fxc_top_txt">
+          <div class="fxc_top_num">
+            <numCard v-for="(item,index) in ''+used" :key="index" :num="item || 0" :color="'#3E9DFF'"></numCard>
+          </div>
+          <div class="fxc_top_type">已使用(个)</div>
+        </div>
+      </div>
+    </div>
+    <div class="fxc_left">
+      <div class="fxc_tit">温度监测</div>
+      <div class="fxc_left_top">
+        <div class="fxc_lt_item">
+          <div class="fxc_lt_num">
+            <numCard v-for="(item,index) in ''+normal" :key="index" :num="item || 0"></numCard>
+          </div>
+          <div class="fxc_lt_type">正常</div>
+        </div>
+        <div class="fxc_lt_item">
+          <div class="fxc_lt_num">
+            <numCard v-for="(item,index) in ''+warning" :key="index" :num="item || 0" :color="'#3AB46D'"></numCard>
+          </div>
+          <div class="fxc_lt_type">预警</div>
+        </div>
+        <div class="fxc_lt_item">
+          <div class="fxc_lt_num">
+            <numCard v-for="(item,index) in ''+error" :key="index" :num="item || 0" :color="'#3AB46D'"></numCard>
+          </div>
+          <div class="fxc_lt_type">报警</div>
+        </div>
+      </div>
+      <div class="fxc_left_btm">
+        <img class="fxc_left_btm_img" src="../../assets/images/fxc_img11.png">
+        <pie3d :id="'pie3d1'" :value1="1220" :value2="1000" :value3="1200"></pie3d>
+        <div class="fxc_left_btm_txt">预警</div>
+        <div class="fxc_lb_con">
+          <div class="fxc_lb_item">
+            <i></i>全程温度<span>{{1220}}</span>
+          </div>
+          <div class="fxc_lb_item">
+            <i></i>实时温控<span>{{1000}}</span>
+          </div>
+          <div class="fxc_lb_item">
+            <i></i>追溯标签<span>{{1200}}</span>
+          </div>
+        </div>
+      </div>
+      <div class="fxc_left_btm">
+        <img class="fxc_left_btm_img" src="../../assets/images/fxc_img11.png">
+        <pie3d :id="'pie3d2'" :value1="1230" :value2="1100" :value3="1200"></pie3d>
+        <div class="fxc_left_btm_txt">报警</div>
+        <div class="fxc_lb_con">
+          <div class="fxc_lb_item">
+            <i></i>全程温度<span>{{1220}}</span>
+          </div>
+          <div class="fxc_lb_item">
+            <i></i>实时温控<span>{{1000}}</span>
+          </div>
+          <div class="fxc_lb_item">
+            <i></i>追溯标签<span>{{1200}}</span>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="fxc_mid">
+      <div class="fxc_map">
+        <mapPage></mapPage>
+      </div>
+      <div class="fxc_mid_con1">
+        <div class="fxc_win_icon1"></div>
+        <div class="fxc_win_icon2"></div>
+        <div class="fxc_win_icon3"></div>
+        <div class="fxc_win_icon4"></div>
+        <div class="fxc_mc1_txt">
+          检测对象:货物<br>
+          当前温度:42℃<br>
+          最低温度:12℃<br>
+          检测状态:正常<br>
+          更新时间:2021-09-09 12:00
+        </div>
+      </div>
+      <div class="fxc_mid_con2">
+        <div class="fxc_win_icon1"></div>
+        <div class="fxc_win_icon2"></div>
+        <div class="fxc_win_icon3"></div>
+        <div class="fxc_win_icon4"></div>
+        <div class="fxc_mc2_con">
+          <lineChart></lineChart>
+        </div>
+      </div>
+    </div>
+    <div class="fxc_right1">
+      <div class="fxc_tit">储运状态</div>
+      <div class="fxc_right1_con">
+        <barChart></barChart>
+      </div>
+    </div>
+    <div class="fxc_right2">
+      <div class="fxc_tit">监测数量</div>
+      <div class="fxc_right2_con">
+        <huan2d :id="'huan2d1'" :value1="1220" :value2="1000" :value3="1200"></huan2d>
+      </div>
+    </div>
+    <div class="no_login" @click="goLogin">
+        <div>去登录</div>
+    </div>
+  </div>
+</template>
+<script>
+import NumCard from "../../components/fangxincha/numberCard"//
+import Pie3d from "../../components/fangxincha/pie3d2"//
+import Huan3d from "../../components/fangxincha/huan3d"//
+import Huan2d from "../../components/fangxincha/huan2d"//
+import MapPage from "../../components/fangxincha/map"//高德地图
+import LineChart from "../../components/fangxincha/lineChart"//
+import BarChart from "../../components/fangxincha/barChart"//
+import { getFxcToken,getFxclistChainLocal,getFxcProductTypeChipCount,getFxcProductChipState,getFxcChainStatus } from '@/api/screen'
+export default({
+  name:"Shop",
+  components: {
+    NumCard,
+    Pie3d,
+    MapPage,
+    LineChart,
+    BarChart,
+    Huan3d,
+    Huan2d,
+  },
+  data () {
+    return {
+      attrs:["produced","finished","transit","used","normal","warning","error"],
+      produced:6780,
+      finished:6780,
+      transit:6780,
+      used:6780,
+      normal:6780,
+      warning:6780,
+      error:6780,
+    }
+  },
+  created () {
+    this.changeNum()
+    // this.randomNum()
+    this.getLoginToken()
+    // this.$store.dispatch("FxcLogin").then((res)=>{
+    //   var fxcToken = this.$store.getters.fxcToken
+    //   this.getListChainLocal(fxcToken)
+    //   this.getProductTypeChipCount(fxcToken)
+    //   this.getProductChipState(fxcToken)
+    // })
+  },
+  methods: {
+    getLoginToken(){
+      getFxcToken().then(response => {
+        var fxcToken = response.token
+        this.getListChainLocal(fxcToken)
+        this.getProductTypeChipCount(fxcToken)
+        this.getProductChipState(fxcToken)
+        this.getChainStatus(fxcToken)
+      });
+    },
+    getListChainLocal(token){
+      getFxclistChainLocal(token).then(response => {
+        
+      });
+    },
+    getProductChipState(token){
+      getFxcProductChipState(token).then(response => {
+        
+      });
+    },
+    getProductTypeChipCount(token){
+      getFxcProductTypeChipCount(token).then(response => {
+        
+      });
+    },
+    getChainStatus(token){
+      getFxcChainStatus(token).then(response => {
+        
+      });
+    },
+    changeNum(){
+      const that = this
+      var list = that.attrs
+      for(var i in list){
+        that.randomNum(list[i])
+      }
+    },
+    randomNum(key){
+      const that = this
+        that[key+"Timer"] = window.setInterval(()=>{
+          //数字每次变化1-10之间
+          var rdNum = Math.floor(1+Math.random()*9)
+          that[key]=that[key]+rdNum
+        },2000)
+    },
+    goLogin(){
+      this.$router.push({
+        name: 'SignIn',
+      })
+    },
+  }
+})
+</script>
+<style>
+html{ font-size:calc(100vw / 19.2);}
+body{ font-size:14px; background: #031934;}
+.mot_page{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; background: url(../../assets/images/opt_bg.png); background-size: 100% 100%; }
+.fxc_page{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; background: url(../../assets/images/fxc_bg1.png); background-size: 100% 100%; }
+.mot_head{ position: absolute; top: 0; left: 0; width: 100%; height: 11vh; line-height: 11vh; color: #53A0FF; font-size:2vw; text-align: center;font-weight: bold;
+background-image:-webkit-linear-gradient(bottom,#53A0FF,#ffffff);-webkit-background-clip:text;background-clip: text;-webkit-text-fill-color:transparent;
+/*-webkit-text-stroke:1px #ffffff; font-style: italic;*/letter-spacing:1vw;}
+.fxc_head{ position: absolute; top: 0; left: 0; width: 100%; height: 11vh; display: flex; align-items: center; justify-content: center;}
+.fxc_head img{ width: 27vw;}
+.fxc_top{ position: absolute; top: 0; left: 0; right: 0;}
+.fxc_top_item{ position: absolute; left: 2.4vw; top: 3.7vh; width: 12.6vw; height: 11.1vh; background:url(../../assets/images/fxc_img9.png); background-size: 100% 100%;  display: flex; align-items: center; justify-content: center; box-sizing: border-box; padding: 0 0 0 0.6vw;}
+.fxc_top_item img{ width: 2.6vw; height: 2.6vw; margin: 0 0.5vw 0 0;}
+.fxc_top_num{ font-size:1.25vw; line-height: 1em; font-weight: bold; display: flex;}
+.fxc_top_type{ font-size: 1vw; color: #65A3F7;}
+.fxc_top_item:nth-child(2){ left: 16.3vw;}
+.fxc_top_item:nth-child(3){ left: 71.1vw;}
+.fxc_top_item:nth-child(4){ left: 85.1vw;}
+.fxc_left{position: absolute; padding: 2vh 0 0 0; top: 23.1vh; left: 2.7vw; width: 25.8vw; height: 73.4vh; background: rgba(14, 97, 182, 0.14);border: 2px solid;border-image: linear-gradient(90deg, #093B77, #3E8EFF, #0C4480) 2 2;}
+.fxc_tit{ position: absolute; height: 4.4vh; width: 22vw; top: -4.3vh; background: url(../../assets/images/fxc_img1.png); background-size: 100% 100%; left: 50%; font-size: 0.9vw; font-weight: bold; color: #C6DFFF; margin: 0 -11vw; text-align: center; line-height: 4.4vh;}
+.fxc_left_top{ width: 21.7vw; margin: auto; height: 16.5vh; display: flex; justify-content: space-between; align-items: center;background: url(../../assets/images/fxc_img12.png); background-size: 100% 100%;}
+.fxc_left_btm{ width: 90%; height: 26vh; position: relative; margin:0 0;}
+.fxc_lt_item{ flex: auto; width: 100%; text-align: center; border-left: 1px solid #3089F3;}
+.fxc_lt_item:nth-child(1){ border: none;}
+.fxc_lt_num{ display: flex; justify-content: center; align-items: center; font-size: 1.8vw;}
+.fxc_lt_type{ font-size: 1.2vw; color: #75AFFE;}
+.fxc_mid{ position: absolute; top: 17.8vh; left: 29.6vw; width: 44.5vw; height: 78.3vh;background: url(../../assets/images/fxc_map.png) center center no-repeat; background-size:7.5rem 5.21rem;}
+.fxc_mid_con1{ position: absolute; bottom: 0; left: 1.5vw; width: 11.4vw; height: 23.4vh; height: 1.5rem; background: rgba(2,43,145, 0.5); box-sizing: border-box;}
+.fxc_win_icon1::before{ content: ""; position: absolute; top:-4px; left:-4px; width: 2px; height: 1vw; background: #2DC1FF;}
+.fxc_win_icon1::after{ content: ""; position: absolute; top:-4px; left:-4px; height: 2px; width: 1vw; background: #2DC1FF;}
+.fxc_win_icon2::before{ content: ""; position: absolute; bottom:-4px; left:-4px; width: 2px; height: 1vw; background: #2DC1FF;}
+.fxc_win_icon2::after{ content: ""; position: absolute; bottom:-4px; left:-4px; height: 2px; width: 1vw; background: #2DC1FF;}
+.fxc_win_icon3::before{ content: ""; position: absolute; top:-4px; right:-4px; width: 2px; height: 1vw; background: #2DC1FF;}
+.fxc_win_icon3::after{ content: ""; position: absolute; top:-4px; right:-4px; height: 2px; width: 1vw; background: #2DC1FF;}
+.fxc_win_icon4::before{ content: ""; position: absolute; bottom:-4px; right:-4px; width: 2px; height: 1vw; background: #2DC1FF;}
+.fxc_win_icon4::after{ content: ""; position: absolute; bottom:-4px; right:-4px; height: 2px; width: 1vw; background: #2DC1FF;}
+.fxc_mc1_txt{ position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; padding: 0 0 0 1vw; line-height: 3.7vh;line-height: 0.24rem; font-size: 0.6vw; color: #65A3F7;}
+.fxc_mid_con2{ position: absolute; bottom: 0; right: 1.5vw; width: 13.8vw; height: 26.8vh; background: rgba(4,57,217, 0.5); box-sizing: border-box;}
+.fxc_right1{ position: absolute; top: 22vh; right: 2.4vw; width: 22.8vw; height: 34.3vh;background: rgba(14, 97, 182, 0.14);border: 2px solid;border-image: linear-gradient(90deg, #093B77, #3E8EFF, #0C4480) 2 2;}
+.fxc_left_btm_txt{ position: absolute; bottom: 0; left:30%; width: 2rem; margin: 0 0 0 -0.93rem; font-size: 0.16rem; color: #ffffff; text-align: center;}
+
+.fxc_right2{ position: absolute; top:62.1vh; right: 2.4vw; width: 22.8vw; height: 34.3vh;background: rgba(14, 97, 182, 0.14);border: 2px solid;border-image: linear-gradient(90deg, #093B77, #3E8EFF, #0C4480) 2 2;}
+.fxc_lb_con{position: absolute; top: 10px; bottom:20px; right: 10px; display: flex; flex-direction: column; align-items: center; justify-content:center;}
+.fxc_lb_item{ margin: 6px auto; color: #ffffff; font-size: 0.18rem; line-height: 0.18rem;}
+.fxc_lb_item i{ display: inline-block; width:0.2rem; height: 0.12rem; margin-right:0.08rem;}
+.fxc_lb_item span{ margin-left: 0.08rem;}
+.fxc_lb_item:nth-child(1) i{background: #23D9E9;}
+.fxc_lb_item:nth-child(2) i{background: #89D44B;}
+.fxc_lb_item:nth-child(3) i{background: #E82A30;}
+.fxc_lb_item:nth-child(1) span{color: #23D9E9;}
+.fxc_lb_item:nth-child(2) span{color: #89D44B;}
+
+.no_login{ position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.4); z-index: 1; display: flex; justify-content: center; align-items: center;}
+.no_login>div{ width: auto; padding: 20px; background: #ffffff; font-size: 20px; line-height: 36px; border-radius: 5px; color: #2DC1FF;}
+</style>

+ 122 - 0
src/components/fangxincha/barChart.vue

@@ -0,0 +1,122 @@
+<template>
+  <div class="chart_con" id="barchartCon"></div>
+</template>
+<script>
+import { getEvvmChipStatus2 } from '@/api/screen'
+export default {
+  name: 'barChart',
+  methods:{
+    getData(){
+      getEvvmChipStatus2().then(response => {
+        var data = response.data
+        var option = this.option
+        option.series[0].data[0].value = data.used
+        option.series[0].data[1].value = data.act
+        option.series[0].data[2].value = data.noAct
+        this.myChart.setOption(option);
+      });
+    },
+	  myEcharts(){
+		  this.myChart = this.echarts.init(document.getElementById('barchartCon'));
+		  this.option = {
+        color:["#3E9DFF","#EE9C17","#E82A30"],
+			  title: {
+				  show:false
+			  },
+        grid:{
+          top:"12%",
+          left:"12%",
+          right:"5%",
+          bottom:"12%",
+        },
+			  tooltip: {
+				  show:true
+        },
+			  legend: {
+          data:['全程温控', '实时温控', '追溯标签'],
+				  top:5,
+          icon:"rect",
+          itemWidth:12,
+          itemHeight:8,
+          textStyle:{
+            fontSize:8,
+            color:"#ffffff",
+          },
+			  },
+        xAxis: {
+            type: 'category',
+            data: [ '2016', '2017', '2018', '2019', '2020', '2021'],
+            axisLine:{
+              lineStyle:{
+                color:"#0E61B6",
+              }
+            },
+            axisTick:{
+              show:false
+            },
+            axisLabel:{
+              color:"#ffffff",
+              fontSize:8,
+            },
+            splitLine:{
+              show:true,
+              lineStyle:{
+                color:"#0E61B6",
+                opacity:0.2,
+              }
+            },
+        },
+        yAxis: {
+            type: 'value',
+            axisLine:{
+              lineStyle:{
+                color:"#0E61B6",
+              }
+            },
+            axisTick:{
+              show:false
+            },
+            axisLabel:{
+              color:"#ffffff",
+              fontSize:8,
+            },
+            splitLine:{
+              show:true,
+              lineStyle:{
+                color:"#0E61B6",
+                opacity:0.2,
+              }
+            },
+            animationDuration: 300,
+            animationDurationUpdate: 300,
+        },
+			  series: [
+          {
+            name: '全程温控',
+            type: 'bar',
+            data: [120, 132, 101, 134, 90, 230, 210]
+          },
+          {
+            name: '实时温控',
+            type: 'bar',
+            data: [120, 132, 101, 134, 90, 230, 210]
+          },
+          {
+            name: '追溯标签',
+            type: 'bar',
+            data: [120, 132, 101, 134, 90, 230, 210]
+          },
+        ]
+		  };
+      //this.getData();
+		  this.myChart.setOption(this.option);
+    }
+  },
+  mounted() {
+  	this.myEcharts();
+  }
+}
+</script>
+<style>
+  .chart_con{ position: absolute; top: 0; left: 0; right: 0; bottom: 0; color: transparent;}
+</style>

+ 125 - 0
src/components/fangxincha/huan2d.vue

@@ -0,0 +1,125 @@
+<template>
+  <div class="pie3d_con" :id="id"></div>
+</template>
+<script>
+  import Highcharts from "highcharts/highstock";
+  import Highcharts3D from "highcharts/highcharts-3d";
+  Highcharts3D(Highcharts);
+  export default({
+    name: "pie3d",
+    props:{
+      id:{
+        type:String,
+        required:true
+      },
+      value1:{
+        default:1,
+      },
+      value2:{
+        default:1,
+      },
+      value3:{
+        default:1,
+      },
+    },
+    data() {
+      return {
+          
+      }
+    },
+    mounted() {
+      this.moreChart();
+    },
+    watch: {
+      value1(){
+        this.updataChart()
+      },
+      value2(){
+        this.updataChart()
+      },
+      value3(){
+        this.updataChart()
+      },
+    },
+    methods: {
+      updataChart(){
+        const that = this
+        this.chart.series[0].update({
+          data:[
+            ['科兴',that.value1],
+            ['康希诺',that.value2],
+            ['生物',that.value3],
+          ]
+        })
+      },
+      moreChart() {
+        const that = this
+        if (this.chart) {
+          this.chart.destroy();
+        }
+        // 初始化 Highcharts 图表
+        this.chart = new Highcharts.Chart(that.id, {
+          chart: {
+            type: 'pie',
+            backgroundColor:"transparent",
+            options3d: {
+              enabled: true,
+              alpha: 45,
+              beta: 0
+            },
+            spacing:[5,5,5,5]
+          },
+          credits:{enabled:false},
+          colors:["#1D3BFF","#29DDB0","#81D2FF","#FFD157","#FF741F"],
+          title: false,
+          tooltip: {
+            pointFormat: '{name}: <b>{point.percentage:.1f}%</b>'
+          },
+          legend:{
+            layout:"horizontal",
+            align: 'center',
+            verticalAlign: 'top', 
+            // layout:"vertical",
+            // align: 'right',
+            // verticalAlign: 'middle', 
+            labelFormat:"{name} {y}",
+            itemStyle:{
+              "color": "#ffffff"
+            },
+            itemHoverStyle:false
+          },
+          plotOptions: {
+            pie: {
+              cursor: 'pointer',
+              depth: 35,
+              showInLegend: true,
+              dataLabels: {
+                // enabled: false,
+                // distance: -20,
+                color:"#ffffff",
+                format: '{point.percentage:.1f}%',
+              },
+              events:{
+                hide:true
+              },    
+            }
+          },
+          series: [{
+            type: 'pie',
+            innerSize: '60%',
+            center:["50%","50%"],
+            // center:["40%","50%"],
+            data: [
+              ['科兴',that.value1],
+              ['康希诺',that.value2],
+              ['生物',that.value3],
+            ]
+          }]
+        });
+      }
+    }
+  })
+</script>
+<style>
+.pie3d_con{position: absolute; top: 0; left: 0; right: 0; bottom: 0; color: transparent;}
+</style>

+ 119 - 0
src/components/fangxincha/huan3d.vue

@@ -0,0 +1,119 @@
+<template>
+  <div class="pie3d_con" :id="id"></div>
+</template>
+<script>
+  import Highcharts from "highcharts/highstock";
+  import Highcharts3D from "highcharts/highcharts-3d";
+  Highcharts3D(Highcharts);
+  export default({
+    name: "pie3d",
+    props:{
+      id:{
+        type:String,
+        required:true
+      },
+      value1:{
+        default:1,
+      },
+      value2:{
+        default:1,
+      },
+      value3:{
+        default:1,
+      },
+    },
+    data() {
+      return {
+          
+      }
+    },
+    mounted() {
+      this.moreChart();
+    },
+    watch: {
+      value1(){
+        this.updataChart()
+      },
+      value2(){
+        this.updataChart()
+      },
+      value3(){
+        this.updataChart()
+      },
+    },
+    methods: {
+      updataChart(){
+        const that = this
+        this.chart.series[0].update({
+          data:[
+            ['科兴',that.value1],
+            ['康希诺',that.value2],
+            ['生物',that.value3],
+          ]
+        })
+      },
+      moreChart() {
+        const that = this
+        if (this.chart) {
+          this.chart.destroy();
+        }
+        // 初始化 Highcharts 图表
+        this.chart = new Highcharts.Chart(that.id, {
+          chart: {
+            type: 'pie',
+            backgroundColor:"transparent",
+            options3d: {
+              enabled: true,
+              alpha: 45,
+              beta: 0
+            },
+            spacing:[5,5,5,5]
+          },
+          credits:{enabled:false},
+          colors:["#D8585C","#89D44B","#23D9E9"],
+          title: false,
+          tooltip: {
+            pointFormat: '{name}: <b>{point.percentage:.1f}%</b>'
+          },
+          legend:{
+            layout:"vertical",
+            align: 'right',
+            verticalAlign: 'middle', 
+            labelFormat:"{name} {y}",
+            itemStyle:{
+              "color": "#ffffff"
+            },
+            itemHoverStyle:false
+          },
+          plotOptions: {
+            pie: {
+              cursor: 'pointer',
+              depth: 35,
+              showInLegend: true,
+              dataLabels: {
+                // enabled: false,
+                distance: -20,
+                format: '{point.percentage:.1f}%',
+              },
+              events:{
+                hide:true
+              },    
+            }
+          },
+          series: [{
+            type: 'pie',
+            center:["40%","50%"],
+            data: [
+              ['科兴',that.value1],
+              ['康希诺',that.value2],
+              ['生物',that.value3],
+            ]
+          }]
+        });
+      }
+    }
+  })
+</script>
+<style>
+.pie3d_con{position: absolute; top: 0; left: 0; right: 0; bottom: 0; color: transparent;}
+</style>

+ 159 - 0
src/components/fangxincha/lineChart.vue

@@ -0,0 +1,159 @@
+<template>
+  <div class="chart_con" id="lineChartCon"></div>
+</template>
+<script>
+import { getEvvmChipStatus2 } from '@/api/screen'
+export default {
+  name: 'lineChart',
+  methods:{
+    getData(){
+      getEvvmChipStatus2().then(response => {
+        var data = response.data
+        var option = this.option
+        option.series[0].data[0].value = data.used
+        option.series[0].data[1].value = data.act
+        option.series[0].data[2].value = data.noAct
+        this.myChart.setOption(option);
+      });
+    },
+	  myEcharts(){
+		  this.myChart = this.echarts.init(document.getElementById('lineChartCon'));
+		  this.option = {
+        color:["#23D9E9","#EE9C17","#E82A30"],
+			  title: {
+				  show:false
+			  },
+        grid:{
+          top:"12%",
+          left:"12%",
+          right:"5%",
+          bottom:"12%",
+        },
+			  tooltip: {
+				  show:true
+        },
+			  legend: {
+          data:['正常', '预警', '报警'],
+				  top:5,
+          icon:"rect",
+          itemWidth:12,
+          itemHeight:8,
+          textStyle:{
+            fontSize:8,
+            color:"#ffffff",
+          },
+			  },
+        xAxis: {
+            type: 'category',
+            boundaryGap: false,
+            data: ['2015', '2016', '2017', '2018', '2019', '2020', '2021'],
+            axisLine:{
+              lineStyle:{
+                color:"#0E61B6",
+              }
+            },
+            axisTick:{
+              show:false
+            },
+            axisLabel:{
+              color:"#ffffff",
+              fontSize:8,
+            },
+            splitLine:{
+              show:true,
+              lineStyle:{
+                color:"#0E61B6",
+                opacity:0.2,
+              }
+            },
+        },
+        yAxis: {
+            type: 'value',
+            axisLine:{
+              lineStyle:{
+                color:"#0E61B6",
+              }
+            },
+            axisTick:{
+              show:false
+            },
+            axisLabel:{
+              color:"#ffffff",
+              fontSize:8,
+            },
+            splitLine:{
+              show:true,
+              lineStyle:{
+                color:"#0E61B6",
+                opacity:0.2,
+              }
+            },
+            animationDuration: 300,
+            animationDurationUpdate: 300,
+        },
+			  series: [
+          {
+            name: '正常',
+            type: 'line',
+            stack: '总量',
+            smooth: true,
+            areaStyle: {
+              opacity:0.3,
+            },
+            lineStyle : {
+              width:1,
+            },
+            emphasis: {
+                focus: 'series'
+            },
+            data: [120, 132, 101, 134, 90, 230, 210],
+            animationDuration: 5000,
+          },
+          {
+            name: '预警',
+            type: 'line',
+            stack: '总量',
+            smooth: true,
+            areaStyle: {
+              opacity:0.3,
+            },
+            lineStyle : {
+              width:1,
+            },
+            emphasis: {
+                focus: 'series'
+            },
+            data: [120, 132, 101, 134, 90, 230, 210],
+            animationDuration: 5000,
+          },
+          {
+            name: '报警',
+            type: 'line',
+            smooth: true,
+            stack: '总量',
+            areaStyle: {
+              opacity:0.3,
+            },
+            lineStyle : {
+              width:1,
+            },
+            emphasis: {
+                focus: 'series'
+            },
+            data: [120, 132, 101, 134, 90, 230, 210],
+            animationDuration: 5000,
+          },
+        ]
+		  };
+      //this.getData();
+		  this.myChart.setOption(this.option);
+    }
+  },
+  mounted() {
+  	this.myEcharts();
+  }
+}
+</script>
+<style>
+  .chart_con{ position: absolute; top: 0; left: 0; right: 0; bottom: 0; color: transparent;}
+</style>

+ 97 - 0
src/components/fangxincha/map.vue

@@ -0,0 +1,97 @@
+<template>
+  <div class="mappage_con" id="mapCon"></div>
+</template>
+<script>
+  import remoteLoad from '@/utils/remoteLoad.js'
+  import icon1 from '@/assets/images/fxc_img6.png'
+  import icon2 from '@/assets/images/fxc_img7.png'
+  import icon3 from '@/assets/images/fxc_img8.png'
+  import { getEvvmListOffice } from '@/api/screen'
+  export default({
+    name:"MapPage",
+    data () {
+      return {
+        
+      }
+    },
+    async mounted () {
+      var MapKey = this.MapKey
+      // 已载入高德地图API,则直接初始化地图
+      if (window.AMap && window.AMapUI) {
+        this.initMap()
+      // 未载入高德地图API,则先载入API再初始化
+      } else {
+        await remoteLoad(`http://webapi.amap.com/maps?v=1.4.15&key=${MapKey}`)
+        await remoteLoad(`https://webapi.amap.com/ui/1.1/main.js`)
+        // await remoteLoad(`https://a.amap.com/Loca/static/loca-v2/demos/mock_data/events.js`)
+        this.initMap()
+      }
+    },
+    methods: {
+      getList(){
+        getEvvmListOffice().then(response => {
+          var list = response.data
+          this.setMarkers(list)
+        });
+      },
+      initMap () {
+        let AMap = this.AMap = window.AMap
+        let mapConfig = {
+          zoom: 5,
+          mapStyle: 'amap://styles/darkblue',
+          viewMode:'3D',
+          pitch:45,
+          rotation:10,
+          center:[109.591091,33.096726],
+          // showLabel: false //不显示地图文字标记
+        }
+        let map = this.map = new AMap.Map('mapCon', mapConfig)
+        // 添加 3D 罗盘控制
+        AMap.plugin([
+          'AMap.ControlBar',
+        ], function(){
+          map.addControl(new AMap.ControlBar());
+        })
+        this.getList()
+      },
+      setMarkers(list){
+        this.map.clearMap()// 清除地图上所有添加的覆盖物
+        var markers = []
+        for(var i in list){
+          if(list[i].longitude && list[i].latitude){
+            let marker = new AMap.Marker({
+              position: new AMap.LngLat(list[i].longitude,list[i].latitude),  
+              //title: list[i].NAME + '<br>' + list[i].address,
+              //offset: new AMap.Pixel(-20,43),//偏移量,默认以marker左上角位置为基准点
+              icon:new AMap.Icon({
+                  size: new AMap.Size(25,25),    // 图标尺寸
+                  image: [icon1,icon2,icon3][list[i].type],  // Icon的图像
+                  // imageOffset: new AMap.Pixel(0, -60),  // 图像相对展示区域的偏移量,适于雪碧图等
+                  imageSize: new AMap.Size(25, 25)   // 根据所设置的大小拉伸或压缩图片
+              }),
+              clickable:true,
+              extData:list[i],
+            });
+            marker.on("mouseover",function(e){
+              var extData = this.Ce.extData
+              this.setLabel({
+                content:extData.NAME + '<br>' + extData.address,
+                direction:'top'
+              })
+            })
+            marker.on("mouseout",function(e){
+              this.setLabel(null)
+            })
+            markers.push(marker)
+          }
+        }
+        this.map.add(markers)
+      },
+    }
+  })
+</script>
+<style>
+  .mappage_con{ position: absolute; top: 0; left: 0; right: 0; bottom: 0;}
+  .mappage_con .amap-marker-label{background: rgba(35,4,194,0.6);font-size: 0.8vw; border: 1px solid #51FFFF; color: #ffffff; border-radius: 5px;}
+  .amap-logo{ display: none!important;;}
+</style>

+ 32 - 0
src/components/fangxincha/numberCard.vue

@@ -0,0 +1,32 @@
+<template>
+  <div class="nc_con">
+    <div class="nc_wrap" :style="'margin-top:-'+num+'em;color:'+color">
+      <div v-for="i in 10" :key="i">{{i-1}}</div>
+    </div>
+  </div>
+</template>
+<script>
+  export default({
+    name:"NumCard",
+    props:{
+      num:{
+        // type:String,
+        default:0,
+        required:true
+      },
+      color:{
+        type:String,
+        default:"#00EAFF",
+      }
+    },
+    data () {
+      return {
+      }
+    }
+  })
+</script>
+<style>
+.nc_con{ width:0.6em; height:1em; flex: none; overflow: hidden;}
+.nc_wrap{ transition: all 1s ease 0s;}
+.nc_wrap>div{width:0.6em; height:1em; line-height:1em; text-align: center;}
+</style>

+ 112 - 0
src/components/fangxincha/pie3d.vue

@@ -0,0 +1,112 @@
+<template>
+  <div class="pie3d_con" :id="id"></div>
+</template>
+<script>
+  import Highcharts from "highcharts/highstock";
+  import Highcharts3D from "highcharts/highcharts-3d";
+  Highcharts3D(Highcharts);
+  export default({
+    name: "pie3d",
+    props:{
+      id:{
+        type:String,
+        required:true
+      },
+      value1:{
+        default:1,
+      },
+      value2:{
+        default:1,
+      },
+      value3:{
+        default:1,
+      },
+    },
+    data() {
+      return {
+          
+      }
+    },
+    mounted() {
+      this.moreChart();
+    },
+    watch: {
+      value1(){
+        this.updataChart()
+      },
+      value2(){
+        this.updataChart()
+      },
+      value3(){
+        this.updataChart()
+      },
+    },
+    methods: {
+      updataChart(){
+        const that = this
+        this.chart.series[0].update({
+          data:[
+            ['全程温控',that.value1],
+            ['实时温控',that.value2],
+            ['追溯标签',that.value3],
+          ]
+        })
+      },
+      moreChart() {
+        const that = this
+        if (this.chart) {
+          this.chart.destroy();
+        }
+        // 初始化 Highcharts 图表
+        this.chart = new Highcharts.Chart(that.id, {
+          chart: {
+            type: 'pie',
+            backgroundColor:"transparent",
+            options3d: {
+              enabled: true,
+              alpha:50,
+              beta: 0,
+            },
+            margin:[0,0,0,0],
+          },
+          credits:{enabled:false},
+          colors:["#D8585C","#89D44B","#23D9E9"],
+          title: false,
+          tooltip: {
+            pointFormat: '{name}: <b>{point.percentage:.1f}%</b>'
+          },
+          legend:false,
+          plotOptions: {
+            pie: {
+              cursor: 'pointer',
+              depth: 35,
+              dataLabels: {
+                // enabled: false,
+                distance: -20,
+                format: '{point.percentage:.1f}%',
+                shadow:false,
+                verticalAlign:"middle",
+              },
+              events:{
+                hide:true
+              },    
+            }
+          },
+          series: [{
+            type: 'pie',
+            center:["30%","40%"],
+            data: [89
+              ['全程温控',that.value1],
+              ['实时温控',that.value2],
+              ['追溯标签',that.value3],
+            ]
+          }]
+        });
+      }
+    }
+  })
+</script>
+<style>
+.pie3d_con{position: absolute; top: 0; left: 0; right: 0; bottom: 0; color: transparent;}
+.highcharts-text-outline{ display: none;}
+</style>

+ 112 - 0
src/components/fangxincha/pie3d2.vue

@@ -0,0 +1,112 @@
+<template>
+  <div class="pie3d_con" :id="id"></div>
+</template>
+<script>
+  import Highcharts from "highcharts/highstock";
+  import Highcharts3D from "highcharts/highcharts-3d";
+  Highcharts3D(Highcharts);
+  export default({
+    name: "pie3d",
+    props:{
+      id:{
+        type:String,
+        required:true
+      },
+      value1:{
+        default:1,
+      },
+      value2:{
+        default:1,
+      },
+      value3:{
+        default:1,
+      },
+    },
+    data() {
+      return {
+          
+      }
+    },
+    mounted() {
+      this.moreChart();
+    },
+    watch: {
+      value1(){
+        this.updataChart()
+      },
+      value2(){
+        this.updataChart()
+      },
+      value3(){
+        this.updataChart()
+      },
+    },
+    methods: {
+      updataChart(){
+        const that = this
+        this.chart.series[0].update({
+          data:[
+            ['全程温控',that.value1],
+            ['实时温控',that.value2],
+            ['追溯标签',that.value3],
+          ]
+        })
+      },
+      moreChart() {
+        const that = this
+        if (this.chart) {
+          this.chart.destroy();
+        }
+        // 初始化 Highcharts 图表
+        this.chart = new Highcharts.Chart(that.id, {
+          chart: {
+            type: 'pie',
+            backgroundColor:"transparent",
+            options3d: {
+              enabled: true,
+              alpha:50,
+              beta: 0,
+            },
+            margin:[0,0,0,0],
+          },
+          credits:{enabled:false},
+          colors:["#D8585C","#89D44B","#23D9E9"],
+          title: false,
+          tooltip: {
+            pointFormat: '{name}: <b>{point.percentage:.1f}%</b>'
+          },
+          legend:false,
+          plotOptions: {
+            pie: {
+              cursor: 'pointer',
+              depth: 35,
+              dataLabels: {
+                // enabled: false,
+                distance: -20,
+                format: '{point.percentage:.1f}%',
+                shadow:false,
+                verticalAlign:"middle",
+              },
+              events:{
+                hide:true
+              },    
+            }
+          },
+          series: [{
+            type: 'pie',
+            center:["30%","40%"],
+            data: [
+              ['全程温控',that.value1],
+              ['实时温控',that.value2],
+              ['追溯标签',that.value3],
+            ]
+          }]
+        });
+      }
+    }
+  })
+</script>
+<style>
+.pie3d_con{position: absolute; top: 0; left: 0; right: 0; bottom: 0; color: transparent;}
+.highcharts-text-outline{ display: none;}
+</style>

+ 55 - 167
src/components/signIn/SignIn.vue

@@ -5,7 +5,8 @@
       <el-row
         ><el-col :span="24">
           <h1 class="title">
-            <img :src="imgSrc" />
+            <!-- <img :src="imgSrc" /> -->
+            放芯查平台
           </h1>
         </el-col>
       </el-row>
@@ -62,11 +63,6 @@
                     >登录</el-button
                   >
                 </el-form-item>
-                <!-- <el-form-item class="textLeft">
-                  <el-checkbox v-model="ruleForm.checked"
-                    >下次自动登录</el-checkbox
-                  >
-                </el-form-item> -->
               </el-form>
             </el-col>
           </el-row>
@@ -77,11 +73,9 @@
 </template>
 
 <script>
-import md5 from "js-md5";
-import { JSEncrypt } from "jsencrypt";
-import { login } from "../../api/api";
-import axios from 'axios'
-import qs from "qs";
+// import md5 from "js-md5";
+// import { JSEncrypt } from "jsencrypt";
+import { loginByPwd } from '@/api/screen'
 export default {
   name: "SignIn",
   data() {
@@ -101,12 +95,11 @@ export default {
       }
     };
     return {
-      imgSrc: require("../../assets/logo.png"), // logo
+      imgSrc: require("../../assets/images/logo_fxc.png"), // logo
       ruleForm: {
-        telephone: '13000000002', // 手机号
+        telephone: '13153864796', // 手机号
         password: '123456', // 密码
         randYZM: "", // 验证码
-        // checked: false, // 下次自动登录
         imageCode: "", // 图片验证码
       },
       secretKey: "6w3lacP9gmjbMgor",
@@ -125,120 +118,20 @@ export default {
     };
   },
   methods: {
-    //  加密
-    encryptedData(publicKey, data) {
-      // 新建JSEncrypt对象+
-      var val = "";
-      data = encodeURIComponent(data);
-      let arr = Array.apply(null, { length: data.length }).map(
-        (item, index) => {
-          return index;
-        }
-      );
-      for (var i = 0, j = 0; i < data.length, j < data.length; i++, j++) {
-        if (j == publicKey.length) {
-          j = 0;
-        }
-        arr[i] = data.charCodeAt(i) ^ publicKey.charCodeAt(j);
-        var strCipher = arr[i].toString(16);
-        if (strCipher.length == 1) {
-          val += "0" + strCipher;
-        } else {
-          val += strCipher;
-        }
-      }
-      return val;
-    },
-    // 解密
-    decryptData(privateKey, data) {
-      // 新建JSEncrypt对象
-      let decrypt = new JSEncrypt();
-      // 设置私钥
-      decrypt.setPrivateKey(privateKey);
-      // 解密数据
-      return decrypt.decrypt(secretWord);
-    },
-    //登录
     submitForm(formName) {
-      // var a = this.encryptedData("6w3lacP9gmjbMgor", "13312341234");
-      // console.log(a);
-      // 验证
       var _this = this;
       _this.$refs[formName].validate((valid) => {
         if (valid) {
           var newsForm = {
-            telephone: _this.encryptedData(
-              _this.secretKey,
-              _this.ruleForm.telephone
-            ),
-            // telephone: _this.ruleForm.telephone,
-            password: md5(_this.ruleForm.password),
-            // password: _this.ruleForm.password,
-            // pushToken:"6e1c1be58ab4c75f4322963b4b40b7f73bb6c56eea2f0a9fcfdc406e78efbbeb",
-            pushToken: _this.encryptedData(
-              _this.secretKey,
-              _this.ruleForm.telephon
-            ),
-            phoneType: "1",
-            phonemodel: "iPhone12,1",
-            code:_this.ruleForm.randYZM
+            username: _this.ruleForm.telephone,
+            password: _this.ruleForm.password,
           };
-          login(qs.stringify(newsForm)).then(
-            function (data) {
-              if (data.code == 200) {
-                sessionStorage.setItem("token", data.data.token);
-                // 记住密码/不记住密码
-                // _this.$cookies.set("id", data.data.id);
-                // _this.$cookies.set("telephone", _this.ruleForm.telephone);
-                // _this.$cookies.set("password", _this.ruleForm.password);
-                // _this.$cookies.set("userName", data.data.userName);
-                // if (_this.ruleForm.checked) {
-                //   //_this.$cookies.set('remPassword',true,{expires:7});
-                //   _this.$cookies.set("remPassword", true);
-                // } else {
-                //   _this.$cookies.set("remPassword", false, { expires: -1 });
-                // }
-                // 提示信息
-                _this.$message({
-                  message: "登录成功!",
-                  type: "success",
-                });
-                if (_this.id != null || _this.id != undefined) {
-                  let token = data.data.token;
-                  sessionStorage.setItem("token", token);
-                  sessionStorage.setItem("userinfo", JSON.stringify(data.data));
-                  // _this.$cookies.set("factoryList", data.data);
-                  // localStorage.setItem("factoryId", data.data.factoryId);
-                  // roleId 1:超级管理员 19:厂家管理员
-                  if (
-                    data.data.roleId == 3 ||
-                    data.data.roleId == 4 ||
-                    data.data.roleId == 2
-                  ) {
-                    _this.$router.push({
-                      path: "/cardHome",
-                      // query: { roleId: data.data.roleId },
-                    });
-                  } else {
-                    _this.$message({
-                      message: "请确定该用户是否有登录系统权限!",
-                      type: "error",
-                    });
-                  }
-                }
-              } else {
-                _this.$message({
-                  message: data.body.msg,
-                  type: "error",
-                });
-              }
-            },
-            function () {
-              _this.$alert("请求失败,请稍后再试", "提示", {
-                confirmButtonText: "确定",
+          loginByPwd(newsForm).then((res)=>{
+              localStorage.setItem("token", res.token);
+              _this.$router.push({
+                path: "/",
               });
-            }
-          );
+            });
         } else {
           return false;
         }
@@ -248,9 +141,9 @@ export default {
       let code = "";
       let codeLength = 4;
       let random = new Array(
-        0,
-        1,
-        2,
+        // 0,
+        // 1,
+        // 2,
         3,
         4,
         5,
@@ -266,13 +159,13 @@ export default {
         "F",
         "G",
         "H",
-        "I",
+        // "I",
         "J",
         "K",
         "L",
         "M",
         "N",
-        "O",
+        // "O",
         "P",
         "Q",
         "R",
@@ -282,36 +175,39 @@ export default {
         "V",
         "W",
         "X",
-        "Y",
-        "Z"
+        "Y"
+        // "Z"
       ); //随机数
       for (let i = 0; i < codeLength; i++) {
-        let index = Math.floor(Math.random() * 36);
+        let index = Math.floor(Math.random() * random.length);
+        if(index == random.length)index = 0
         code += random[index];
       }
       this.ruleForm.imageCode = code;
     },
   },
   mounted() {
+    console.log(6)
+    this.$message('这是一条消息提示');
     // 获取图片验证码
     this.createCode();
     // 判断初始化时cookies时有效的
-    let telephone = this.$cookies.get("telephone");
-    let password = this.$cookies.get("password");
-    if (telephone != "" && this.$cookies.get("remPassword") == "true") {
-      this.ruleForm.telephone = telephone;
-      this.ruleForm.password = password;
-      this.ruleForm.checked = true;
-      this.ruleForm.randYZM = this.ruleForm.imageCode;
-      this.submitForm("ruleForm"); // 执行登录
-    } else {
-      this.ruleForm.telephone = "";
-      this.ruleForm.password = "";
-      this.ruleForm.randYZM = "";
-      //this.ruleForm.telephone = '13682152685';
-      //this.ruleForm.password = '123456';
-      this.ruleForm.checked = false;
-    }
+    // let telephone = this.$cookies.get("telephone");
+    // let password = this.$cookies.get("password");
+    // if (telephone != "" && this.$cookies.get("remPassword") == "true") {
+    //   this.ruleForm.telephone = telephone;
+    //   this.ruleForm.password = password;
+    //   this.ruleForm.checked = true;
+    //   this.ruleForm.randYZM = this.ruleForm.imageCode;
+    //   this.submitForm("ruleForm"); // 执行登录
+    // } else {
+    //   this.ruleForm.telephone = "";
+    //   this.ruleForm.password = "";
+    //   this.ruleForm.randYZM = "";
+    //   //this.ruleForm.telephone = '13682152685';
+    //   //this.ruleForm.password = '123456';
+    //   this.ruleForm.checked = false;
+    // }
     // window.addEventListener('pywebviewready',function(){
       
     // },)
@@ -320,31 +216,23 @@ export default {
 </script>
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
-<style scoped>
-.bgStyle {
-  background: #3b3b3b;
-  position: fixed;
-  width: 100%;
-  height: 100%;
-}
-.title {
-  color: #ffffff;
-  font-size: 40px;
-  margin: 90px 0 60px 0;
-  text-align:center;
-}
-.title img {
-  display: inline-block;
-  vertical-align: middle;
-  height: 70px;
-}
+<style>
+.bgStyle{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; background: url(../../assets/images/opt_bg.png); background-size: 100% 100%; }
+.title{ position: absolute; top: 0; left: 0; width: 100%; height: 11vh; line-height: 11vh; color: #53A0FF; font-size:2vw; text-align: center;font-weight: bold;
+background-image:-webkit-linear-gradient(bottom,#53A0FF,#ffffff);-webkit-background-clip:text;background-clip: text;-webkit-text-fill-color:transparent;
+/*-webkit-text-stroke:1px #ffffff; font-style: italic;*/letter-spacing:1vw;}
 .contentChild {
-  background: #e6e6e6;
-  border-radius: 3px;
-  padding: 60px 50px;
+  background: #0B133B;
+  border-radius: 10px;
+  border: 1px solid #3591FF;
+  box-shadow: 0px 0px 38px 2px rgba(48, 137, 243, 0.7) inset;
+  width: 50vw; height:60vh;
+  position: absolute; top:50%; left: 50%; margin: -25vh -25vw;
 }
 .contentChild h2{
-  padding: 10px 0;
+   background: url(../../assets/images/cardTit.png); background-size: 100% 100%;
+   width: 18vw; height: 50px; font-size: 20px; color: #ffffff; line-height: 50px; text-align: center;
+   position: absolute; left: 50%; top: -25px; margin: 0 -9vw;
 }
 .btnSty {
   width: 100%;

+ 9 - 0
src/main.js

@@ -7,6 +7,9 @@ Vue.config.productionTip = false
 import router from "./router";
 import store from "./store";
 import VueCookies from 'vue-cookies';
+import Echarts from 'echarts';
+import VCharts from 'v-charts';
+import VueAMap from 'vue-amap';
 window.addEventListener('pywebviewready', function () {
   Vue.prototype.isStatus = true;
   alert('读写器已就绪')
@@ -17,8 +20,14 @@ Vue.prototype.removeEvent = function () {
     alert('读写器已解除')
   });
 }
+Vue.prototype.echarts = Echarts
+Vue.prototype.ossPath = "http://oss.zhongyihz.cn/"
+Vue.prototype.MapKey = "cf8df3568bedd799c309027ff2b9d222"
 Vue.use(Element);
 Vue.use(VueCookies);
+Vue.use(VCharts)
+Vue.use(Echarts)
+Vue.use(VueAMap);
 new Vue({
   store,
   router,

+ 42 - 0
src/utils/remoteLoad.js

@@ -0,0 +1,42 @@
+export default function remoteLoad (url, hasCallback) {
+  return createScript(url)
+
+  function createScript (url) {
+    var scriptElement = document.createElement('script')
+    document.head.appendChild(scriptElement)
+    var promise = new Promise((resolve, reject) => {
+      scriptElement.addEventListener('load', e => {
+        var has = document.body.contains(scriptElement)
+        if(has) removeScript(scriptElement)
+        if (!hasCallback) {
+          resolve(e)
+        }
+      }, false)
+
+      scriptElement.addEventListener('error', e => {
+        removeScript(scriptElement)
+        reject(e)
+      }, false)
+
+      if (hasCallback) {
+        window.____callback____ = function () {
+          resolve()
+          window.____callback____ = null
+        }
+      }
+    })
+
+    if (hasCallback) {
+      url += '&callback=____callback____'
+    }
+
+    scriptElement.src = url
+
+    return promise
+  }
+
+  function removeScript (scriptElement) {
+    document.body.removeChild(scriptElement)
+  }
+
+}

+ 7 - 6
src/utils/request.js

@@ -13,7 +13,7 @@ axios.defaults.withCredentials = true;
 // 创建axios实例
 const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分
-  baseURL: process.env.NODE_ENV == 'development' ? "/api" : "https://bdw.vandh.cn/api/",
+  //baseURL: process.env.NODE_ENV == 'development' ? "/api" : "https://bdw.vandh.cn/api/",
   //  baseURL:'/api',
   // 超时
   timeout: 10000
@@ -21,10 +21,11 @@ const service = axios.create({
 // request拦截器
 service.interceptors.request.use(config => {
   // 是否需要设置 token
-  // const isToken = (config.headers || {}).isToken === false
-  // if (getToken() && !isToken) {
-  //   config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
-  // }
+  const isToken = (config.headers || {}).isToken === false
+  var myToken = localStorage.getItem("myToken")
+  if (!isToken && myToken) {
+    config.headers['Authorization'] = 'Bearer ' + myToken// 让每个请求携带自定义token 请根据实际情况自行修改
+  }
   // get请求映射params参数
   // if (config.method === 'get' && config.params) {
   //   let url = config.url + '?';
@@ -83,7 +84,7 @@ service.interceptors.response.use(res => {
     })
     if(code == 102 || code == 401){
       router.push({
-        path: "/",
+        name: 'SignIn',
       });
       localStorage.removeItem("token");
     }

+ 5 - 7
vue.config.js

@@ -21,21 +21,19 @@ module.exports = {
     extract: true,// 是否使用css分离插件 ExtractTextPlugin
     sourceMap: false,// 开启 CSS source maps
     loaderOptions: {},// css预设器配置项
-    modules: false// 启用 CSS modules for all css / pre-processor files.
+    requireModuleExtension: false// 启用 CSS modules for all css / pre-processor files.
   },
   devServer: {// 环境配置
     host: '0.0.0.0',
     port: 8081,
-    hotOnly: false,
+    hot:true,//自动保存
     open: true, //配置自动启动浏览器
     proxy: {// 配置多个代理(配置一个 proxy: 'http://localhost:4000' )
-      '/api': {
-        // target: `http://monitor.vandh.org:88`,
-        // target: `https://fxc.vandh.cn/prod-api/`,
-        target: `https://bdw.vandh.cn/api/`,
+      '/fxc': {
+        target: `https://fxc.vandh.cn/prod-api/`,
         changeOrigin: true,
         pathRewrite: {
-          '^/api': ""
+          '^/fxc': ""
         }
       }
     }

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels