zhengwei 4 lat temu
commit
ce165fa362
100 zmienionych plików z 6829 dodań i 0 usunięć
  1. BIN
      .DS_Store
  2. 0 0
      .idea/.gitignore
  3. 8 0
      .idea/modules.xml
  4. 12 0
      .idea/pcManagementForBeswell.iml
  5. 6 0
      .idea/vcs.xml
  6. 54 0
      .idea/workspace.xml
  7. 183 0
      README.md
  8. 5 0
      babel.config.js
  9. 41 0
      package.json
  10. BIN
      public/favicon.ico
  11. 22 0
      public/index.html
  12. BIN
      src/.DS_Store
  13. 29 0
      src/App.vue
  14. 455 0
      src/Global.js
  15. 179 0
      src/Mock/index.js
  16. 365 0
      src/api/Navs.js
  17. 1054 0
      src/api/getApiRes.js
  18. BIN
      src/assets/404/back.png
  19. BIN
      src/assets/404/back_w.png
  20. BIN
      src/assets/404/homepage.png
  21. BIN
      src/assets/404/homepage_w.png
  22. BIN
      src/assets/404/man.png
  23. BIN
      src/assets/404/refresh.png
  24. BIN
      src/assets/404/refresh_w.png
  25. 69 0
      src/assets/css/bg.css
  26. 471 0
      src/assets/css/panel.css
  27. BIN
      src/assets/font/UnidreamLED.ttf
  28. BIN
      src/assets/img/birth/birthCrow.png
  29. BIN
      src/assets/img/birth/birthText.png
  30. BIN
      src/assets/img/border/bbl.png
  31. BIN
      src/assets/img/border/bbr.png
  32. BIN
      src/assets/img/border/btl.png
  33. BIN
      src/assets/img/border/btr.png
  34. BIN
      src/assets/img/header/left.png
  35. BIN
      src/assets/img/header/ltehead.png
  36. BIN
      src/assets/img/header/right.png
  37. BIN
      src/assets/img/icon/addMemo.png
  38. BIN
      src/assets/img/icon/equip.png
  39. BIN
      src/assets/img/icon/header.png
  40. BIN
      src/assets/img/icon/home.png
  41. BIN
      src/assets/img/icon/list.png
  42. BIN
      src/assets/img/icon/location.png
  43. BIN
      src/assets/img/icon/logout.png
  44. BIN
      src/assets/img/icon/qrcode.png
  45. BIN
      src/assets/img/icon/question_icon.png
  46. BIN
      src/assets/img/icon/setting.png
  47. BIN
      src/assets/img/icon/user.png
  48. BIN
      src/assets/img/lessonTable/star.png
  49. BIN
      src/assets/img/login/bg.png
  50. BIN
      src/assets/img/login/logo.png
  51. BIN
      src/assets/img/main/Oval.png
  52. BIN
      src/assets/img/main/appoint.png
  53. BIN
      src/assets/img/main/empty.jpg
  54. BIN
      src/assets/img/main/lesson.png
  55. BIN
      src/assets/img/main/member.png
  56. BIN
      src/assets/img/nav/head.png
  57. BIN
      src/assets/img/nav/home.png
  58. BIN
      src/assets/img/nav/logo.png
  59. BIN
      src/assets/logo.png
  60. BIN
      src/assets/valid.png
  61. 778 0
      src/components/Headside.vue
  62. 23 0
      src/components/Map.vue
  63. 430 0
      src/components/Navside.vue
  64. 295 0
      src/components/Radar.vue
  65. 57 0
      src/components/Ring.vue
  66. 70 0
      src/components/Sankey.vue
  67. 69 0
      src/components/Tabs.vue
  68. 294 0
      src/components/cropper.vue
  69. 245 0
      src/components/levelIcon.vue
  70. 35 0
      src/components/power.vue
  71. 188 0
      src/components/preview.vue
  72. 280 0
      src/components/timePart.vue
  73. 207 0
      src/components/upHead.vue
  74. 267 0
      src/components/userRank.vue
  75. 19 0
      src/libs/rem.js
  76. 36 0
      src/main.js
  77. 61 0
      src/plugins/axios.js
  78. 423 0
      src/router/index.js
  79. 18 0
      src/server/app.js
  80. 19 0
      src/server/config.js
  81. BIN
      src/static/img/bg/bg2_1.png
  82. BIN
      src/static/img/bg/bg2_2.png
  83. BIN
      src/static/img/bg/bg2_3.png
  84. BIN
      src/static/img/bg/bg2_4.png
  85. BIN
      src/static/img/bg/bg_1.png
  86. BIN
      src/static/img/bg/bg_2.png
  87. BIN
      src/static/img/bg/bg_3.png
  88. BIN
      src/static/img/bg/bg_4.png
  89. 9 0
      src/static/img/ck.svg
  90. BIN
      src/static/img/heart.png
  91. 3 0
      src/static/img/heart.svg
  92. BIN
      src/static/img/people/flyhead.png
  93. 6 0
      src/static/img/power/power_full.svg
  94. 6 0
      src/static/img/power/power_half.svg
  95. 6 0
      src/static/img/power/power_low.svg
  96. 6 0
      src/static/img/power/power_none.svg
  97. 4 0
      src/static/img/privateSign.svg
  98. 7 0
      src/static/img/rank/king1.svg
  99. 7 0
      src/static/img/rank/king2.svg
  100. 8 0
      src/static/img/rank/king3.svg

BIN
.DS_Store


+ 0 - 0
.idea/.gitignore


+ 8 - 0
.idea/modules.xml

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

+ 12 - 0
.idea/pcManagementForBeswell.iml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/temp" />
+      <excludeFolder url="file://$MODULE_DIR$/.tmp" />
+      <excludeFolder url="file://$MODULE_DIR$/tmp" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 54 - 0
.idea/workspace.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="a3e8c64a-5632-491b-95a6-93c9ec582859" name="Default Changelist" comment="" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
+  <component name="ProjectId" id="1zLenFsF8kSrj8CN3S90RxpiCg8" />
+  <component name="ProjectLevelVcsManager" settingsEditedManually="true" />
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
+  <component name="PropertiesComponent">
+    <property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
+    <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
+    <property name="nodejs_package_manager_path" value="npm" />
+    <property name="vue.rearranger.settings.migration" value="true" />
+  </component>
+  <component name="RunManager">
+    <configuration name="serve" type="js.build_tools.npm" nameIsGenerated="true">
+      <package-json value="$PROJECT_DIR$/package.json" />
+      <command value="run" />
+      <scripts>
+        <script value="serve" />
+      </scripts>
+      <node-interpreter value="project" />
+      <envs />
+      <method v="2" />
+    </configuration>
+  </component>
+  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="a3e8c64a-5632-491b-95a6-93c9ec582859" name="Default Changelist" comment="" />
+      <created>1633931961170</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1633931961170</updated>
+      <workItem from="1633931963456" duration="421000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="3" />
+  </component>
+</project>

+ 183 - 0
README.md

@@ -0,0 +1,183 @@
+#PcBackStage
+
+ /$$$$$$$           /$$$$$$$                      /$$        /$$$$$$   /$$                                  
+| $$__  $$         | $$__  $$                    | $$       /$$__  $$ | $$                                  
+| $$  \ $$ /$$$$$$$| $$  \ $$  /$$$$$$   /$$$$$$$| $$   /$$| $$  \__//$$$$$$    /$$$$$$   /$$$$$$   /$$$$$$ 
+| $$$$$$$//$$_____/| $$$$$$$  |____  $$ /$$_____/| $$  /$$/|  $$$$$$|_  $$_/   |____  $$ /$$__  $$ /$$__  $$
+| $$____/| $$      | $$__  $$  /$$$$$$$| $$      | $$$$$$/  \____  $$ | $$      /$$$$$$$| $$  \ $$| $$$$$$$$
+| $$     | $$      | $$  \ $$ /$$__  $$| $$      | $$_  $$  /$$  \ $$ | $$ /$$ /$$__  $$| $$  | $$| $$_____/
+| $$     |  $$$$$$$| $$$$$$$/|  $$$$$$$|  $$$$$$$| $$ \  $$|  $$$$$$/ |  $$$$/|  $$$$$$$|  $$$$$$$|  $$$$$$$
+|__/      \_______/|_______/  \_______/ \_______/|__/  \__/ \______/   \___/   \_______/ \____  $$ \_______/
+                                                                                         /$$  \ $$          
+                                                                                        |  $$$$$$/          
+                                                                                         \______/           
+                                                                                         
+##常用的后台管理模板  
+
+小飞龙api服务
+http://192.168.0.3:19095/v1/docs/index.html
+
+
+基于 https://panjiachen.github.io/vue-element-admin-site/zh/guide/ 的版本, 只保留常用功能和修改部分UI效果  
+
+## uuid 
+电视 28354  盒子 9e13c 网页309c2 段手机 8e501
+
+
+##安装:  
+
+###克隆项目  
+
+git clone git@git.beswell.com:duanchangpeng/PcBackStage.git  
+
+###进入项目目录  
+
+cd PcBackStage  
+
+
+##安装淘宝源,已安装可忽略
+
+npm install --registry=https://registry.npm.taobao.org
+
+###安装依赖  
+
+cnpm i 
+
+###本地开发 启动项目  
+
+npm run dev
+
+##1.目录结构  
+  
+    ├── build                      # 构建相关
+    ├── mock                       # 项目mock 模拟数据
+    ├── src                        # 源代码
+    │   ├── api                    # 所有请求
+    │   ├── assets                 # 主题 字体等静态资源
+    │   ├── components             # 全局公用组件
+    │   ├── directive              # 全局指令
+    │   ├── icons                  # 项目所有 svg icons
+    │   ├── lang                   # 国际化 language
+    │   ├── layout                 # 全局 layout  todo
+    │   ├── router                 # 路由
+    │   ├── store                  # 全局 store管理  todo
+    │   ├── utils                  # 全局公用方法
+    │   ├── vendor                 # 公用vendor todo
+    │   ├── views                  # views 所有页面
+    │   ├── App.vue                # 入口页面
+    │   ├── main.js                # 入口文件 加载组件 初始化等
+    ├── .env.xxx                   # 环境变量配置
+    ├── .eslintrc.js               # eslint 配置项
+    ├── .babelrc                   # babel-loader 配置
+    ├── .travis.yml                # 自动化CI配置
+    ├── vue.config.js              # vue-cli 配置
+    ├── postcss.config.js          # postcss 配置
+    └── package.json               # package.json
+
+##4.使用方法
+   
+a.增加新页面  
+    在views里新建一个vue文件,将文件名和路径加入router/index.js中,注意文件层级,非系统级别页面应加入main下的同级别里。  
+        
+b.新增接口
+    在api/getApiRes.js里添加方法,在使用页面,首先引入这个文件    
+    import { 新写的方法名 } from '../api/getApiRes.js'    
+    然后再methods里使用 新的方法名(param).then(res => {...})的形式调用  
+        
+c.反向代理
+    修改 vue.config.js 中   target: 'http://192.168.0.162:19080/', 的地址,重启npm run serve后生效
+    
+d.打包
+   配置打包地址,修改 vue.config.js 中  outputDir: 'D:/wwwroot/test/new_back/static_pc', 指向的地址,
+   在执行build命令后生效。
+   
+e.运行
+   使用nginx等程序驱动http服务,指向打包后的index.html文件所在地址即可。
+   (如打开后出现loading情况,均为后端数据源配置错误,搭建相应服务后即可,其他问题如没有配置本地host等)
+   
+   === todo ===   
+  
+  20200907  页面接口实现功能完成情况  
+  
+  1.首页
+    全部todo
+    
+    
+  2. 会员类都是贾的 
+     会员首页统计,消费记录,
+     
+  3.操作日志
+   全部todo 放在最后      
+      
+      
+###
+20200910
+ ClassListByQueryStr 不知道咋用
+
+  
+  1.首页
+    全部todo
+  2.预约类
+   
+今日预约统计(未完成)
+今日课程预约总览(未完成)
+今日会员预约列表查询(未完成)
+
+order
+今日预约统计(未完成)
+今日课程预约总览(未完成)
+今日会员预约列表查询(未完成)
+
+
+20200910
+ 店铺微信预约状态修改(Shop/ShopWxStatusEdit) √
+ 店铺单条查询(Shop/ShopDetailOne) √
+ 
+ 1./Order/OrderCancelByManager √
+    管理员预约取消(未完成)
+ 
+ 2./Order/OrderStatistics
+    今日预约统计(未完成)
+ 
+ 3.(Class/ClassStatistics)
+    课程统计(未完成)
+    
+ 4.课程表模板详情预览(SttPlan/SttPlanPreview)
+ 
+ 5.课程表预览(SchoolTimetable/SchoolTimetablePreview)
+   
+   
+   20200911
+   
+   1.管理员管理 增加新管理员后重新查一遍店铺列表 √
+   2.侧边栏对齐 √
+   3.adminManage 缺少备注 √
+   4.新增管理员所属门店下拉框对齐,调整输入框顺序:账号、密码、姓名、手机号、所属门店、备注。√
+   5.编辑管理员信息时,密码非必填。密码不填不修改密码。输入框顺序同增加管理员。
+   6.会员管理,会员有效期调整,弹窗标题错误。点击确认后,返回成功信息错误。
+     会员类型为”充值“的,点击有效期调整,弹窗中提示”用户不是年费会员,无法调整会员有效期“ √
+   7.会员管理列表,操作中,编辑不是按钮,列表中会员有效期为“0001-01-01“的隐藏不显示。 √
+   8.穿梭框最后一项偏右显示 √
+   9.首页,下课管理中,上课时间应包含上课时间,下课时间 √
+   10.下课管理 确认下课调错接口了√
+      应该调用 SchoolTimeTable/ClassOverConfirm√
+    11.首页下课管理中,点击下课,新页面顶部文字固定√
+12.教练管理列表中,暂时隐藏时长统计√
+
+
+   
+   .课程管理通用设置问题 √
+   .
+    
+    ClassDetailOne 没有返回 WxOrder 状态
+    User/ShopManagerListQuery phone,shopId参数输入后,返回值没有经过筛选
+    
+   
+   99.添加课程表/课程表模板的单条时,选择课程后预填入课时上限。√
+   100.添加单条时,默认值问题√
+
+
+========
+常用键值
+
+wxVisible 0不可见1可见

+ 5 - 0
babel.config.js

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

+ 41 - 0
package.json

@@ -0,0 +1,41 @@
+{
+  "name": "GoAllOut",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build"
+  },
+  "dependencies": {
+    "core-js": "^3.6.5",
+    "echarts": "^4.8.0",
+    "element-ui": "^2.13.2",
+    "mockjs": "^1.1.0",
+    "moment": "^2.27.0",
+    "nprogress": "^0.2.0",
+    "qiniu-js": "^3.1.2",
+    "qs": "^6.9.4",
+    "v-charts": "^1.19.0",
+    "vue": "^2.6.11",
+    "vue-amap": "^0.5.10",
+    "vue-cropper": "^0.5.6",
+    "vue-img-cutter": "^2.1.10",
+    "vue-router": "^3.2.0",
+    "vuex": "^3.4.0"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "~4.4.0",
+    "@vue/cli-plugin-router": "~4.4.0",
+    "@vue/cli-plugin-vuex": "~4.4.0",
+    "@vue/cli-service": "~4.4.0",
+    "axios": "^0.18.0",
+    "vue-cli-plugin-axios": "0.0.4",
+    "vue-img-cutter": "^2.1.10",
+    "vue-template-compiler": "^2.6.11"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not dead"
+  ]
+}

BIN
public/favicon.ico


+ 22 - 0
public/index.html

@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<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">-->
+    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
+    <meta http-equiv="pragram" content="no-cache" />
+    <meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate"  />
+    <meta http-equiv="expires" content="0" />
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <title><%= htmlWebpackPlugin.options.title %></title>
+</head>
+<body>
+<noscript>
+    <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
+        Please enable it to continue.</strong>
+</noscript>
+<div id="app"></div>
+<!-- built files will be auto injected -->
+</body>
+</html>

BIN
src/.DS_Store


+ 29 - 0
src/App.vue

@@ -0,0 +1,29 @@
+<template>
+    <div id="app">
+        <router-view />
+    </div>
+</template>
+
+<style>
+    #app {
+        position: absolute;
+        width: 100%;
+        height: 100%;
+        top: 0;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        font-family: Avenir, Helvetica, Arial, sans-serif;
+        -webkit-font-smoothing: antialiased;
+        -moz-osx-font-smoothing: grayscale;
+        text-align: center;
+        color: #2c3e50;
+    }
+
+    .el-tooltip__popper.is-dark {
+        display: none !important;
+    }
+</style>

+ 455 - 0
src/Global.js

@@ -0,0 +1,455 @@
+// 网站基本信息
+companyInfo = {
+    url: 'http://det.shandongewall.com/',
+    main: 'alloutlong',
+    year: new Date().getFullYear(),
+};
+
+headapi = process.env.NODE_ENV === 'development' ? '/api/' : '../';
+headbpi = process.env.NODE_ENV === 'development' ? '/bpi/' : 'http://cal.beswell.com:85/';
+headcpi = process.env.NODE_ENV === 'development' ? 'http://192.168.0.62:9010/' : 'http://cal.beswell.com:85/DataTransfer/';
+
+
+// 常用课程状态d
+globalQuipState = function () {
+    let option = [
+        {
+            value: '0',
+            label: '未上课'
+        }, {
+            value: '1',
+            label: '已下课'
+        }, {
+            value: '2',
+            label: '已上课'
+        }, {
+            value: '3',
+            label: '准备上课'
+        }, {
+            value: '4',
+            label: '课程已完成'
+        }, {
+            value: '5',
+            label: '课程已关闭'
+        }
+    ];
+    return option
+};
+
+// 开始时间
+globalBt = function () {
+    const et = new Date();
+    const bt = new Date("2019-01-01 00:00:01");
+    return [bt, et];
+};
+
+globalBt2 = function (days) {
+    const et = new Date();
+    const bt = new Date();
+    days = days ? days : 0;
+    bt.setTime(bt.getTime() - 3600 * 1000 * 24 * days);
+    return [bt, et];
+};
+
+// 格式化时间
+globalfmtDate = function (datetime, length) {
+    if ((datetime == '') || (datetime == undefined))
+        return '';
+    if ((datetime == '1900-01-01') || (datetime == '1900-01-01 00:00:00.000'))
+        return '';
+    length = !length ? 10 : length;//缺省参数
+    return (datetime != null) ? datetime.substr(0, length) : '';
+};
+
+getHoursAndMin = function (datetime) {
+    let date = new Date(datetime);
+    h = date.getHours() < 10 ? '0' + date.getHours() + ':' : date.getHours() + ':';
+    m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
+    return h + m;
+}
+
+// 格式化时间去掉T
+nonTfmtDate = function (datetime, length) {
+    if ((datetime == '') || (datetime == undefined))
+        return '';
+    if ((datetime == '1900-01-01') || (datetime == '1900-01-01 00:00:00.000'))
+        return '';
+    length = !length ? 10 : length;//缺省参数
+    datetime = new Date(+new Date(datetime) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '');
+    return datetime
+};
+
+// 格式化时间去掉T
+nonTfmtDatetoLength = function (datetime, length) {
+    if ((datetime == '') || (datetime == undefined))
+        return '';
+    if ((datetime == '1900-01-01') || (datetime == '1900-01-01 00:00:00.000'))
+        return '';
+    length = !length ? 10 : length;//缺省参数
+    datetime = new Date(+new Date(datetime) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '').substr(0, length);
+    return datetime
+};
+
+// 获取当前时间
+globalcurrent = function () {
+    let date = new Date();
+    let seperator1 = "-";
+    let year = date.getFullYear();
+    let month = date.getMonth() + 1;
+    let strDate = date.getDate();
+    if (month >= 1 && month <= 9) {
+        month = "0" + month;
+    }
+    if (strDate >= 0 && strDate <= 9) {
+        strDate = "0" + strDate;
+    }
+    let thisdata = year + seperator1 + month + seperator1 + strDate;
+    return thisdata;
+};
+
+
+
+// 校验内容长度
+globalValid = function (data, mins, maxs, text, that) {
+    let thisVal = data;
+    let thisLeng = thisVal.length;
+    let min = parseInt(mins);
+    let max = parseInt(maxs);
+    let dispalyMin = min + 1;
+    let title = '警告';
+    if (thisVal == '') {
+        that.$message({
+            message: text + '不能为空!',
+            type: 'warning'
+        });
+        return false
+    } else if (thisLeng <= min) {
+        that.$message({
+            message: text + '最少' + dispalyMin + '字符!',
+            type: 'warning'
+        });
+        return false
+    } else if (thisLeng > max) {
+        that.$message({
+            message: text + '超出限制数量!',
+            type: 'warning'
+        });
+        return false
+    } else {
+        return true
+    }
+};
+
+// 手机号码格式
+globalCheckPhone = function (val) {
+    let re = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
+    val = val.toString();
+    if (val.search(re) == -1) {
+        return false;
+    } else {
+        return true;
+    }
+};
+
+getNowDate = function () {
+    let date = new Date();
+    let y = date.getFullYear();
+    let m = date.getMonth() + 1;
+    let d = date.getDate();
+    let H = date.getHours();
+    let mm = date.getMinutes();
+    let s = date.getSeconds()
+    m = m < 10 ? "0" + m : m;
+    d = d < 10 ? "0" + d : d;
+    // H = H < 10 ? "0" + H : H;
+    return y + "年" + m + "月" + d + "日";
+}
+
+globalcurrentWeek = function () {
+    let weeks = new Date().getDay();
+    let d = new Date().getDate();
+    return getNowDate() + ' ' + numberToWeekdays(weeks) + ' 第' + getWeekOfYear() + '周';
+}
+
+getWeekOfYear = function () {
+    var today = new Date();
+    var firstDay = new Date(today.getFullYear(), 0, 1);
+    var dayOfWeek = firstDay.getDay();
+    var spendDay = 1;
+    if (dayOfWeek != 0) {
+        spendDay = 7 - dayOfWeek + 1;
+    }
+    firstDay = new Date(today.getFullYear(), 0, 1 + spendDay);
+    var d = Math.ceil((today.valueOf() - firstDay.valueOf()) / 86400000);
+    var result = Math.ceil(d / 7);
+    return result + 1;
+};
+
+// table配置项目
+
+// 每页选项
+pageOptions = function () {
+    let option = [
+        {
+            value: 10,
+            label: '10'
+        }, {
+            value: 25,
+            label: '25'
+        }, {
+            value: 50,
+            label: '50'
+        }, {
+            value: 100,
+            label: '100'
+        }, {
+            value: 2000,
+            label: '2000'
+        },
+    ];
+    return option
+};
+
+// 到期日
+endTypeOptions = function () {
+    let option = [
+        {
+            value: '',
+            label: '全部'
+        }, {
+            value: 1,
+            label: '当天'
+        }, {
+            value: 7,
+            label: '一周'
+        }, {
+            value: 30,
+            label: '一个月'
+        }, {
+            value: 90,
+            label: '一季度'
+        }, {
+            value: 180,
+            label: '半年'
+        }, {
+            value: -1,
+            label: '已过期'
+        },
+    ];
+    return option
+}
+//会员类型
+vipOptions = function (i) {
+    let option = [];
+    if (i == 0) {
+        option = [
+            {
+                value: '',
+                label: '全部'
+            }, {
+                value: 1,
+                label: '年费会员'
+            }, {
+                value: 2,
+                label: '充值会员'
+            },
+        ];
+    } else {
+        option = [
+            {
+                value: 1,
+                label: '年费会员'
+            }, {
+                value: 2,
+                label: '充值会员'
+            },
+        ];
+    }
+    return option
+}
+
+turnResToOption = function (data) {
+    if (!data) return false
+    let ids = data.map(item => {
+        return {
+            label: item.UserInfo.Name + ' ' + item.UserInfo.Phone,
+            key: parseInt(item.UserInfo.Id),
+            value: parseInt(item.UserInfo.Id),
+        }
+    });
+    return ids
+};
+
+turnResToOptionByViper = function (data) {
+    if (!data) return false;
+    let ids = data.map(item => {
+        return {
+            label: item.Name + ' ' + item.Phone,
+            key: parseInt(item.Id),
+            value: parseInt(item.Id),
+        }
+    });
+    return ids
+};
+turnResToOptionBySimViper = function (data) {
+    if (!data) return false;
+    let ids = data.map(item => {
+        return {
+            label: item.Name + ' ' + item.Usercode,
+            key: parseInt(item.Id),
+            value: parseInt(item.Id),
+            RemainHour: parseInt(item.RemainHour),
+        }
+    });
+    return ids
+};
+
+turnResToOptionByTempUser = function (data) {
+    if (!data) return false;
+    let ids = data.map(item => {
+        return {
+            label: item.UserName + ' ' + item.Phone,
+            key: parseInt(item.TuId),
+            value: parseInt(item.TuId),
+            RemainHour: parseInt(item.RemainHour),
+        }
+    });
+    return ids
+};
+
+turnResToOptionByCoach = function (data) {
+    if (!data) return false;
+    let ids = data.map(item => {
+        return {
+            label: item.Name + ' ' + item.Phone,
+            key: parseInt(item.TeacherId),
+            value: parseInt(item.TeacherId),
+        }
+    });
+    return ids
+};
+
+turnResToOptionByUsers = function (data) {
+    if (!data) return false
+    let ids = data.map(item => {
+        return {
+            label: item.Name + ' ' + item.Phone,
+            key: parseInt(item.Id),
+            value: parseInt(item.Id),
+        }
+    })
+    return ids
+}
+
+turnClassResToOption = function (data) {
+    if (data == null) return false
+    if (!data) return false
+    let ids = data.map(item => {
+        return {
+            label: item.ClassSelf.ClassName,
+            key: parseInt(item.ClassSelf.ClassId),
+            value: parseInt(item.ClassSelf.ClassId),
+            ClassColor: item.ClassSelf.ClassColor,
+        }
+    })
+    return ids
+}
+
+turnShopResToOption = function (data) {
+    if (!data) return false;
+    let ids = data.map(item => {
+        return {
+            label: item.ShopName,
+            key: parseInt(item.ShopID),
+            value: parseInt(item.ShopID)
+        }
+    })
+    return ids
+};
+
+turnStdToOption = function (data) {
+    if (!data) return false
+    let ids = data.map(item => {
+        return {
+            label: item.ClassName + '(' + item.BeginStr + '-' + item.EndStr + ')',
+            key: parseInt(item.StdId),
+            value: parseInt(item.StdId),
+            classId: parseInt(item.ClassId),
+            ConsumeHour:item.ConsumeHour
+        }
+    })
+    return ids
+};
+
+turnActionsResToOption = function (data) {
+    if (data == null) return false
+    if (!data) return false
+    let ids = data.map(item => {
+        return {
+            label: item.EaName,
+            key: parseInt(item.EaId),
+            value: parseInt(item.EaId)
+        }
+    })
+    return ids
+}
+
+turnResToOptionByGroup = function (data) {
+    if (!data) return false;
+    let ids = data.map(item => {
+        return {
+            label: item.GroupName,
+            key: parseInt(item.GroupId),
+            value: parseInt(item.GroupId),
+        }
+    });
+    return ids
+};
+
+numberToWeekdays = function (val) {
+    switch (parseInt(val)) {
+        case 1:
+            return '星期一';
+            break;
+        case 2:
+            return '星期二';
+            break;
+        case 3:
+            return '星期三';
+            break;
+        case 4:
+            return '星期四';
+            break;
+        case 5:
+            return '星期五';
+            break;
+        case 6:
+            return '星期六';
+            break;
+        case 0:
+            return '星期天';
+            break;
+    }
+};
+
+// 获取年份列表
+getyearOptions = function (val) {
+    let num = parseInt(val);
+    let res = [];
+    let item = {};
+    let curYear = new Date().getFullYear();
+    for (var i = 0; i < num; i++) {
+        item[i] = {
+            value: curYear - i, label: curYear - i + '年'
+        }
+    }
+    return item
+};
+
+// 深拷贝
+deepClone = function (obj) {
+    let _obj = JSON.stringify(obj),
+        objClone = JSON.parse(_obj);
+    return objClone
+};
+

+ 179 - 0
src/Mock/index.js

@@ -0,0 +1,179 @@
+import Mock from 'mockjs'
+
+let Random = Mock.Random;
+
+// worldDetail
+let worldDetail = function () {
+    let item = [];
+    for (var i = 0; i < 30; i++) {
+        item.push({
+            "id": "@guid",
+            "name": "@region",
+            "Confirmed": "@integer(36844, 368449)",
+            "Deaths": "@integer(1099, 10993)",
+            "Recovered": "@integer(1986, 19865)",
+        })
+    }
+
+    let res = {
+        Rs: item,
+        Code: 0,
+        Memo: ''
+    };
+    return res;
+};
+
+let testTable = function () {
+    let item = [];
+
+    let members = [
+        {id: 1, name: '霍元甲', userCode: '15253135600', vipType: 1},
+        {id: 2, name: '陈真', userCode: '15253135602', vipType: 2},
+        {id: 3, name: '成龙', userCode: '15253135604', vipType: 1},
+    ]
+
+    for (var i = 0; i < 6; i++) {
+        item.push({
+            "id": "@guid",
+            "userCode": "@integer(15253135600, 15253135699)",
+            "name": "@region",
+            "tel": "@integer(15253135600, 15253135699)",
+            "phone": "@integer(15253135600, 15253135699)",
+            "shop": "@region",
+            "create": "@datetime",
+            "expTime": "@datetime",
+            "valid": "@datetime",
+            "Confirmed": "@integer(36844, 368449)",
+            "Deaths": "@integer(1099, 10993)",
+            "Recovered": "@integer(1986, 9999)",
+            "kick": "@integer(1986, 9999)",
+            "Status": "@integer(1, 2)",
+            "color": "@hex",
+            "memo": "@paragraph(1, 1)",
+            "dialogValue": "@range(1, 3)",
+            "vipType": "@integer(1, 2)",
+            "members": members,
+            "wxVisible": "@integer(0, 1)",
+            "timeLong": "12:00-14:00",
+            "timeScope":  [new Date(2016, 9, 10, 8, 40), new Date(2016, 9, 10, 9, 40)],
+        })
+    }
+
+    let res = {
+        Rs: item,
+        Code: 0,
+        Memo: ''
+    };
+    return res;
+};
+let testTableLong = function () {
+    let item = [];
+
+    let members = [
+        {id: 1, name: '霍元甲', userCode: '15253135600', vipType: 1},
+        {id: 2, name: '陈真', userCode: '15253135602', vipType: 2},
+        {id: 3, name: '成龙', userCode: '15253135604', vipType: 1},
+    ]
+
+    for (var i = 0; i < 70; i++) {
+        item.push({
+            "id": "@guid",
+            "userCode": "@integer(15253135600, 15253135699)",
+            "name": "@region",
+            "tel": "@integer(15253135600, 15253135699)",
+            "shop": "@region",
+            "create": "@datetime",
+            "expTime": "@datetime",
+            "valid": "@datetime",
+            "Confirmed": "@integer(36844, 368449)",
+            "Deaths": "@integer(1099, 10993)",
+            "Recovered": "@integer(1986, 9999)",
+            "kick": "@integer(1986, 9999)",
+            "Status": "@integer(1, 2)",
+            "color": "@hex",
+            "memo": "@paragraph(1, 1)",
+            "dialogValue": "@range(1, 3)",
+            "vipType": "@integer(1, 2)",
+            "members": members,
+            "wxVisible": "@integer(0, 1)",
+            "timeLong": "12:00-14:00",
+            "timeScope":  [new Date(2016, 9, 10, 8, 40), new Date(2016, 9, 10, 9, 40)],
+        })
+    }
+
+    let res = {
+        Rs: item,
+        Code: 0,
+        Memo: ''
+    };
+    return res;
+};
+
+let testSelect = function () {
+    let item = [];
+    for (var i = 0; i < 30; i++) {
+        item.push({
+            "key": i + 1,
+            "value": i + 1,
+            "label": "@region",
+        })
+    }
+
+    let res = {
+        Rs: item,
+        Code: 0,
+        Memo: ''
+    };
+    return res;
+};
+
+let SignIn = function () {
+
+    let Rs = {
+        token: "@guid"
+    };
+    let res = {
+        Rs: Rs,
+        Code: 0,
+        Memo: '登陆成功'
+    };
+    return res;
+};
+
+let editbasicinfo = function () {
+
+    let res = {
+        Code: 0,
+        Memo: '修改成功'
+    };
+    return res;
+};
+
+let modPwd = function () {
+    let res = {
+        Code: 0,
+        Memo: '修改成功'
+    };
+    return res;
+};
+let logout = function () {
+    let res = {
+        Code: 0,
+        Memo: '退出成功'
+    };
+    return res;
+};
+
+var mockState = 0;
+if(mockState == 1){
+    Mock.mock('/api/testSelect', 'post', testSelect());
+    Mock.mock('/api/testTable', 'post', testTable());
+    Mock.mock('/api/testTableLong', 'post', testTableLong());
+    Mock.mock('/api/worldDetail', 'post', worldDetail());
+    Mock.mock('/api/SignIn', 'post', SignIn());//用户登录
+    Mock.mock('/api/editbasicinfo', 'post', editbasicinfo());//用户设置修改
+    Mock.mock('/api/modPwd', 'post', modPwd());//密码修改
+    Mock.mock('/api/logout', 'post', logout());//退出登陆
+}
+
+export default Mock;

+ 365 - 0
src/api/Navs.js

@@ -0,0 +1,365 @@
+// 1 会员 2 系统 3 店铺 4 教练
+let navs = [
+	{
+		clmid: "1",
+		clmcode: "index",
+		clmname: "系统首页",
+		clmurl: "/",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-house",
+	},
+	{
+		clmid: "2",
+		clmcode: "member",
+		clmname: "会员管理",
+		clmurl: "/member",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-user",
+	},
+	{
+		clmid: "3",
+		clmcode: "tempUser",
+		clmname: "临时会员",
+		clmurl: "/tempUser",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-user-solid",
+	},
+	{
+		clmid: "4",
+		clmcode: "region",
+		clmname: "在线上课",
+		clmurl: "/online",
+		prname: "",
+		show: 3, //2
+		grouplist: "2,5",
+		icon: "el-icon-video-camera",
+	},
+	{
+		clmid: "5",
+		clmcode: "lesson",
+		clmname: "课目管理",
+		clmurl: "/lesson",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-collection",
+	},
+	{
+		clmid: "6",
+		clmcode: "lessonTable",
+		clmname: "课程表模板",
+		clmurl: "/lessonTable",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-tickets",
+	},
+	{
+		clmid: "7",
+		clmcode: "lessonManage",
+		clmname: "课程表管理",
+		clmurl: "/lessonManage",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-date",
+	},
+	{
+		clmid: "33",
+		clmcode: "",
+		clmname: "评分管理",
+		clmurl: "/ratingManage",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-edit",
+	},
+	{
+		clmid: "8",
+		clmcode: "coach",
+		clmname: "教练管理",
+		clmurl: "/coach",
+		prname: "",
+		show: 999,
+		grouplist: "2,5",
+		icon: "el-icon-medal-1",
+	},
+	{
+		clmid: "9",
+		clmcode: "appoint",
+		clmname: "预约管理",
+		clmurl: "/appoint",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-time",
+	},
+	{
+		clmid: "10",
+		clmcode: "record",
+		clmname: "预约记录",
+		clmurl: "/record",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-document-copy",
+	},
+	{
+		clmid: "11",
+		clmcode: "cost",
+		clmname: "消费记录",
+		clmurl: "/cost",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-bank-card",
+	},
+	{
+		clmid: "12",
+		clmcode: "courses",
+		clmname: "课程管理",
+		clmurl: "/courses",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-data-analysis",
+	},
+	// {
+	//     "clmid": "10",
+	//     "clmcode": "finish",
+	//     "clmname": "下课管理",
+	//     "clmurl": "/finish",
+	//     "prname": "",
+	//     "show": 3,
+	//     "grouplist": "2,5",
+	//     "icon": "el-icon-bell",
+	// },
+	{
+		clmid: "13",
+		clmcode: "heartEquip",
+		clmname: "心率设备",
+		clmurl: "/heartEquip",
+		prname: "",
+		show: 3, //2
+		grouplist: "2,5",
+		icon: "el-icon-cpu",
+	},
+	{
+		clmid: "14",
+		clmcode: "region",
+		clmname: "区域管理",
+		clmurl: "/region",
+		prname: "",
+		show: 3, //2
+		grouplist: "2,5",
+		icon: "el-icon-map-location",
+	},
+	{
+		clmid: "15",
+		clmcode: "setting",
+		clmname: "系统设置",
+		clmurl: "/setting",
+		prname: "",
+		show: 3,
+		grouplist: "2,5",
+		icon: "el-icon-setting",
+	},
+
+	{
+		clmid: "16",
+		clmcode: "shop",
+		clmname: "店面管理",
+		clmurl: "/shopManage",
+		prname: "",
+		show: 2,
+		grouplist: "2,5",
+		icon: "el-icon-s-shop",
+	},
+	{
+		clmid: "36",
+		clmcode: "classTime",
+		clmname: "教练课时",
+		clmurl: "/classTime",
+		prname: "",
+		show: 2,
+		grouplist: "2,5",
+		icon: "el-icon-date",
+	},{
+		clmid: "37",
+		clmcode: "classChange",
+		clmname: "课时调整",
+		clmurl: "/classChange",
+		prname: "",
+		show: 2,
+		grouplist: "2,5",
+		icon: "el-icon-s-operation",
+	},
+	{
+		clmid: "17",
+		clmcode: "adminManage",
+		clmname: "管理员管理",
+		clmurl: "/adminManage",
+		prname: "",
+		show: 2,
+		grouplist: "2,5",
+		icon: "el-icon-user",
+	},
+	{
+		clmid: "18",
+		clmcode: "log",
+		clmname: "跨店会员",
+		clmurl: "/AcrossVip",
+		prname: "",
+		show: 2,
+		grouplist: "2,5",
+		icon: "el-icon-user-solid",
+	},
+	{
+		clmid: "19",
+		clmcode: "log",
+		clmname: "操作日志",
+		clmurl: "/log",
+		prname: "",
+		show: 2,
+		grouplist: "2,5",
+		icon: "el-icon-s-claim",
+	},
+	{
+		clmid: "20",
+		clmcode: "demoDevice",
+		clmname: "演示设备",
+		clmurl: "/demoDevice",
+		prname: "",
+		show: 2,
+		grouplist: "2,5",
+		icon: "el-icon-video-camera",
+	},
+	{
+		clmid: "21",
+		clmcode: "setting",
+		clmname: "系统设置",
+		clmurl: "/adminSetting",
+		prname: "",
+		show: 2,
+		grouplist: "2,5",
+		icon: "el-icon-setting",
+	},
+	{
+		clmid: "22",
+		clmcode: "index",
+		clmname: "系统首页",
+		clmurl: "/",
+		prname: "",
+		show: 4,
+		grouplist: "2,5",
+		icon: "el-icon-house",
+	},
+	{
+		clmid: "23",
+		clmcode: "member",
+		clmname: "会员管理",
+		clmurl: "/member",
+		prname: "",
+		show: 4,
+		grouplist: "2,5",
+		icon: "el-icon-user",
+	},
+	{
+		clmid: "24",
+		clmcode: "tempUser",
+		clmname: "临时会员",
+		clmurl: "/tempUser",
+		prname: "",
+		show: 4,
+		grouplist: "2,5",
+		icon: "el-icon-user-solid",
+	},
+	{
+		clmid: "25",
+		clmcode: "lesson",
+		clmname: "课目管理",
+		clmurl: "/lesson",
+		prname: "",
+		show: 4,
+		grouplist: "2,5",
+		icon: "el-icon-collection",
+	},
+	{
+		clmid: "26",
+		clmcode: "lessonManage",
+		clmname: "课程表管理",
+		clmurl: "/lessonManage",
+		prname: "",
+		show: 4,
+		grouplist: "2,5",
+		icon: "el-icon-date",
+	},
+	{
+		clmid: "27",
+		clmcode: "appoint",
+		clmname: "预约管理",
+		clmurl: "/appoint",
+		prname: "",
+		show: 4,
+		grouplist: "2,5",
+		icon: "el-icon-time",
+	},
+	{
+		clmid: "28",
+		clmcode: "record",
+		clmname: "预约记录",
+		clmurl: "/record",
+		prname: "",
+		show: 4,
+		grouplist: "2,5",
+		icon: "el-icon-document-copy",
+	},
+	{
+		clmid: "29",
+		clmcode: "cost",
+		clmname: "消费记录",
+		clmurl: "/cost",
+		prname: "",
+		show: 4,
+		grouplist: "2,5",
+		icon: "el-icon-bank-card",
+	},
+
+	{
+		clmid: "30",
+		clmcode: "courses",
+		clmname: "课程管理",
+		clmurl: "/courses",
+		prname: "",
+		show: 4,
+		grouplist: "2,5",
+		icon: "el-icon-data-analysis",
+	},
+	{
+		clmid: "31",
+		clmcode: "heartEquip",
+		clmname: "心率设备",
+		clmurl: "/heartEquip",
+		prname: "",
+		show: 4, //2
+		grouplist: "2,5",
+		icon: "el-icon-cpu",
+	},
+	{
+		clmid: "32",
+		clmcode: "setting",
+		clmname: "系统设置",
+		clmurl: "/adminSetting",
+		prname: "",
+		show: 4,
+		grouplist: "2,5",
+		icon: "el-icon-setting",
+	},
+];
+export default navs;

+ 1054 - 0
src/api/getApiRes.js

@@ -0,0 +1,1054 @@
+import axios from 'axios';
+import global from '../Global.js'
+
+// 基础方法进行封装
+function getApiBasic(url, postdata) {
+    return axios.post(url, postdata).then(function (data) {
+        let json = data.data;
+        return json
+    }, function (response) {
+        console.info(response);
+    })
+}
+
+// 调用的api改写成方法
+export function worldDetail(postdata) {
+    let url = headapi + 'worldDetail';
+    return getApiBasic(url, postdata);
+}
+
+
+export function editbasicinfo(postdata) {
+    let url = headapi + 'editbasicinfo';
+    return getApiBasic(url, postdata);
+}
+
+export function modPwd(postdata) {
+    let url = headapi + 'modPwd';
+    return getApiBasic(url, postdata);
+}
+
+export function logout(postdata) {
+    let url = headapi + 'logout';
+    return getApiBasic(url, postdata);
+}
+
+// 调用的api改写成方法
+export function testTable(postdata) {
+    let url = headapi + 'testTable';
+    return getApiBasic(url, postdata);
+}
+
+export function testTableLong(postdata) {
+    let url = headapi + 'testTableLong';
+    return getApiBasic(url, postdata);
+}
+
+export function testSelect(postdata) {
+    let url = headapi + 'testSelect';
+    return getApiBasic(url, postdata);
+}
+
+// Auth
+
+// 获取验证图片
+export function GenVerifyPic(postdata) {
+    let url = headapi + 'v1/Auth/GenVerifyPic';
+    return getApiBasic(url, postdata);
+}
+
+// 修改密码 √
+export function PassEdit(postdata) {
+    let url = headapi + 'v1/Auth/PassEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 用户登录 √
+export function SignIn(postdata) {
+    let url = headapi + 'v1/Auth/SignIn';
+    return getApiBasic(url, postdata);
+}
+
+// 用户退出
+export function SignOut(postdata) {
+    let url = headapi + 'v1/Auth/SignOut';
+    return getApiBasic(url, postdata);
+}
+
+// 用户添加
+export function SignUp(postdata) {
+    let url = headapi + 'v1/Auth/SignUp';
+    return getApiBasic(url, postdata);
+}
+
+// 用户微信登录
+export function WXSignIn(postdata) {
+    let url = headapi + 'v1/Auth/WXSignIn';
+    return getApiBasic(url, postdata);
+}
+
+// class
+// √ 课程添加
+export function ClassAdd(postdata) {
+    let url = headapi + 'v1/Class/ClassAdd';
+    return getApiBasic(url, postdata);
+}
+
+// 课程统计
+export function ClassStatistics(postdata) {
+    let url = headapi + 'v1/Class/ClassStatistics';
+    return getApiBasic(url, postdata);
+}
+
+// √ 课程颜色修改
+export function ClassColorEdit(postdata) {
+    let url = headapi + 'v1/Class/ClassColorEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 课程单条查询
+export function ClassDetailOne(postdata) {
+    let url = headapi + 'v1/Class/ClassDetailOne';
+    return getApiBasic(url, postdata);
+}
+
+// √ 课程基本信息修改
+export function ClassEdit(postdata) {
+    let url = headapi + 'v1/Class/ClassEdit';
+    return getApiBasic(url, postdata);
+}
+
+// √ 课程列表查询
+export function ClassListQuery(postdata) {
+    let url = headapi + 'v1/Class/ClassListQuery';
+    return getApiBasic(url, postdata);
+}
+
+// √ 课程状态修改
+export function ClassStatusEdit(postdata) {
+    let url = headapi + 'v1/Class/ClassStatusEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 课程会员增删
+export function ClassVipuserEdit(postdata) {
+    let url = headapi + 'v1/Class/ClassVipuserEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 课程会员查询
+export function ClassVipuserQuery(postdata) {
+    let url = headapi + 'v1/Class/ClassVipuserQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 课程微信可见状态修改
+export function ClassVisibleStatusEdit(postdata) {
+    let url = headapi + 'v1/Class/ClassVisibleStatusEdit';
+    return getApiBasic(url, postdata);
+}
+
+// order
+// 最新预约列表查询
+export function LastOrderQuery(postdata) {
+    let url = headapi + 'v1/Order/LastOrderQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 管理员今日预约添加
+export function OrderAddByManager(postdata) {
+    let url = headapi + 'v1/Order/OrderAddByManager';
+    return getApiBasic(url, postdata);
+}
+
+// 管理员今日预约取消
+export function OrderCancelByManager(postdata) {
+    let url = headapi + 'v1/Order/OrderCancelByManager';
+    return getApiBasic(url, postdata);
+}
+
+// 预约记录查询
+export function OrderListQuery(postdata) {
+    let url = headapi + 'v1/Order/OrderListQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 今日预约统计
+export function OrderStatistics(postdata) {
+    let url = headapi + 'v1/Order/OrderStatistics';
+    return getApiBasic(url, postdata);
+}
+
+// 今日课程预约总览
+export function TodayClassOrderQuery(postdata) {
+    let url = headapi + 'v1/Order/TodayClassOrderQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 课程预约列表
+export function ClassOrderQuery(postdata) {
+    let url = headapi + 'v1/Order/ClassOrderQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 今日会员预约列表查询
+export function TodayVipOrderQuery(postdata) {
+    let url = headapi + 'v1/Order/TodayVipOrderQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 会员预约列表查询
+export function VipUserOrderQuery(postdata) {
+    let url = headapi + 'v1/Order/VipUserOrderQuery';
+    return getApiBasic(url, postdata);
+}
+
+// SchoolTimeTable
+
+// 正在进行课程列表
+export function ClassOngoingList(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassOngoingList';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表预览
+export function SchoolTimetablePreview(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/SchoolTimetablePreview';
+    return getApiBasic(url, postdata);
+}
+
+// 课程详情判断是否可删除
+export function STTDetailAllowDelCheck(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/STTDetailAllowDelCheck';
+    return getApiBasic(url, postdata);
+}
+
+// 下课记录详情删除
+export function ClassOverDetailDel(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassOverDetailDel';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表详情微信可预约状态修改
+export function STTDetailWxOrderEdit(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/STTDetailWxOrderEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 某日课程表查询
+export function ClassListByOrderDate(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassListByOrderDate';
+    return getApiBasic(url, postdata);
+}
+
+
+// 确认下课
+export function ClassOverConfirm(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassOverConfirm';
+    return getApiBasic(url, postdata);
+}
+
+// 下课记录详情添加
+export function ClassOverDetailAdd(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassOverDetailAdd';
+    return getApiBasic(url, postdata);
+}
+
+// 下课记录详情列表
+export function ClassOverDetailListQuery(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassOverDetailListQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 下课记录详情状态修改
+export function ClassOverDetailStatusEdit(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassOverDetailStatusEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 待下课课程列表
+export function ClassOverPrepare(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassOverPrepare';
+    return getApiBasic(url, postdata);
+}
+
+// 下课准备
+export function ClassPreFinishListQuery(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassPreFinishListQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表基本信息添加
+export function STTBasicAdd(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/STTBasicAdd';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表基本信息修改
+export function STTBasicEdit(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/STTBasicEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表基本列表查询
+export function STTBasicListQuery(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/STTBasicListQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表上下线状态修改
+export function STTBasicOfflineEdit(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/STTBasicOfflineEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表状态修改
+export function STTBasicStatusEdit(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/STTBasicStatusEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表详情批量保存
+export function STTDetailBatchSave(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/STTDetailBatchSave';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表详情列表查询
+export function STTDetailListQuery(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/STTDetailListQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 复制课程表
+export function SchoolTimeTableCopy(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/SchoolTimeTableCopy';
+    return getApiBasic(url, postdata);
+}
+
+// 今日未上课课程列表查询
+export function WaitingBeginClassList(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/WaitingBeginClassList';
+    return getApiBasic(url, postdata);
+}
+
+// shop
+// √ 店铺添加
+export function ShopAdd(postdata) {
+    let url = headapi + 'v1/Shop/ShopAdd';
+    return getApiBasic(url, postdata);
+}
+
+// 店铺微信预约状态修改
+export function ShopWxStatusEdit(postdata) {
+    let url = headapi + 'v1/Shop/ShopWxStatusEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 店铺单条查询
+export function ShopDetailOne(postdata) {
+    let url = headapi + 'v1/Shop/ShopDetailOne';
+    return getApiBasic(url, postdata);
+}
+
+// √ 店铺详情查询
+export function ShopDetailQuery(postdata) {
+    let url = headapi + 'v1/User/ShopDetailQuery';
+    return getApiBasic(url, postdata);
+}
+
+//  操作日志列表查询
+export function OptLogListQuery(postdata) {
+    let url = headapi + 'v1/User/OptLogListQuery';
+    return getApiBasic(url, postdata);
+}
+
+
+// 店铺修改
+export function ShopEdit(postdata) {
+    let url = headapi + 'v1/Shop/ShopEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 店铺列表查询
+export function ShopListQuery(postdata) {
+    let url = headapi + 'v1/Shop/ShopListQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 店铺状态修改
+export function ShopStatusEdit(postdata) {
+    let url = headapi + 'v1/Shop/ShopStatusEdit';
+    return getApiBasic(url, postdata);
+}
+
+// SttPlan
+// 课程表模板基本信息添加
+export function SttPlanBasicAdd(postdata) {
+    let url = headapi + 'v1/SttPlan/SttPlanBasicAdd';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表模板详情预览
+export function SttPlanPreview(postdata) {
+    let url = headapi + 'v1/SttPlan/SttPlanPreview';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表模板基本信息修改
+export function SttPlanBasicEdit(postdata) {
+    let url = headapi + 'v1/SttPlan/SttPlanBasicEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表模板基本信息列表查询
+export function SttPlanBasicListQuery(postdata) {
+    let url = headapi + 'v1/SttPlan/SttPlanBasicListQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表模板店铺通用修改
+export function SttPlanBasicShopEdit(postdata) {
+    let url = headapi + 'v1/SttPlan/SttPlanBasicShopEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表模板复制
+export function SttPlanCopy(postdata) {
+    let url = headapi + 'v1/SttPlan/SttPlanCopy';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表模板基本信息状态修改
+export function SttPlanBasicStatusEdit(postdata) {
+    let url = headapi + 'v1/SttPlan/SttPlanBasicStatusEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表模板详情列表查询
+export function SttPlanDetailListQuery(postdata) {
+    let url = headapi + 'v1/SttPlan/SttPlanDetailListQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表模板发布
+export function SttPlanPublish(postdata) {
+    let url = headapi + 'v1/SttPlan/SttPlanPublish';
+    return getApiBasic(url, postdata);
+}
+
+// 课程表模板详情批量保存
+export function SttPlanDetailBatchSave(postdata) {
+    let url = headapi + 'v1/SttPlan/SttPlanDetailBatchSave';
+    return getApiBasic(url, postdata);
+}
+
+// teacher
+// 教练信息添加 √
+export function TeacherAdd(postdata) {
+    let url = headapi + 'v1/Teacher/TeacherAdd';
+    return getApiBasic(url, postdata);
+}
+
+// 教练信息修改  √
+export function TeacherEdit(postdata) {
+    let url = headapi + 'v1/Teacher/TeacherEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 教练信息列表查询  √
+export function TeacherListQuery(postdata) {
+    let url = headapi + 'v1/Teacher/TeacherListQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 教练状态修改  √
+export function TeacherStatusEdit(postdata) {
+    let url = headapi + 'v1/Teacher/TeacherStatusEdit';
+    return getApiBasic(url, postdata);
+}
+
+// User
+// √
+export function ManagerSelfQuery(postdata) {
+    let url = headapi + 'v1/User/ManagerSelfQuery';
+    return getApiBasic(url, postdata);
+}
+
+// √ 店铺管理员添加
+export function ShopManagerAdd(postdata) {
+    let url = headapi + 'v1/User/ShopManagerAdd';
+    return getApiBasic(url, postdata);
+}
+
+// 店铺管理员修改
+export function ShopManagerEdit(postdata) {
+    let url = headapi + 'v1/User/ShopManagerEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 店铺管理员列表查询
+export function ShopManagerListQuery(postdata) {
+    let url = headapi + 'v1/User/ShopManagerListQuery';
+    return getApiBasic(url, postdata);
+}
+
+// 店铺管理员状态修改
+export function ShopManagerStatusEdit(postdata) {
+    let url = headapi + 'v1/User/ShopManagerStatusEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 会员用户课时调整
+export function VipUserHourEdit(postdata) {
+    let url = headapi + 'v1/User/VipUserHourEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 会员统计
+export function VipUserStatistics(postdata) {
+    let url = headapi + 'v1/User/VipUserStatistics';
+    return getApiBasic(url, postdata);
+}
+
+// 会员课程增删
+export function VipUserClassEdit(postdata) {
+    let url = headapi + 'v1/User/VipUserClassEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 会员有效期调整
+export function VipUserExpEdit(postdata) {
+    let url = headapi + 'v1/User/VipUserExpEdit';
+    return getApiBasic(url, postdata);
+}
+
+// 会员用户添加
+export function VipUserAdd(postdata) {
+    let url = headapi + 'v1/User/VipUserAdd ';
+    return getApiBasic(url, postdata);
+}
+
+// 会员用户基本信息修改
+export function VipUserEdit(postdata) {
+    let url = headapi + 'v1/User/VipUserEdit ';
+    return getApiBasic(url, postdata);
+}
+
+// 会员消费记录查询
+export function VipUserConsumeListQuery(postdata) {
+    let url = headapi + 'v1/User/VipUserConsumeListQuery ';
+    return getApiBasic(url, postdata);
+}
+// 会员消费记录详情查询
+export function VipUserConsumeDetailQuery(postdata) {
+    let url = headapi + 'v1/User/VipUserConsumeDetailQuery ';
+    return getApiBasic(url, postdata);
+}
+
+// 会员用户列表
+export function VipUserListQuery(postdata) {
+    let url = headapi + 'v1/User/VipUserListQuery';
+    return getApiBasic(url, postdata);
+}
+
+
+// 会员用户基本信息查询
+export function VipUserSimpleQuery(postdata) {
+    let url = headapi + 'v1/User/VipUserSimpleQuery ';
+    return getApiBasic(url, postdata);
+}
+
+// 会员用户状态修改
+export function VipUserStatusEdit(postdata) {
+    let url = headapi + 'v1/User/VipUserStatusEdit ';
+    return getApiBasic(url, postdata);
+}
+
+// 通过Name查询Take用户信息
+export function QueryTakeCustomerByName(postdata) {
+    let url = headapi + 'v1/Take/QueryTakeCustomerByName ';
+    return getApiBasic(url, postdata);
+}
+
+//
+// 绑定Take用户
+export function BindTakeCustomer(postdata) {
+    let url = headapi + 'v1/Take/BindTakeCustomer ';
+    return getApiBasic(url, postdata);
+}
+
+// 查询商家区域
+export function QueryShopVenue(postdata) {
+    let url = headbpi + 'v1/Shop/QueryShopVenue ';
+    return getApiBasic(url, postdata);
+}
+
+// 添加商家区域
+export function AddShopVenue(postdata) {
+    let url = headbpi + 'v1/Shop/AddShopVenue ';
+    return getApiBasic(url, postdata);
+}
+
+// 修改商家区域
+export function EditShopVenue(postdata) {
+    let url = headbpi + 'v1/Shop/EditShopVenue ';
+    return getApiBasic(url, postdata);
+}
+
+// 修改商家区域状态
+export function ShopVenueStatusEdit(postdata) {
+    let url = headbpi + 'v1/Shop/ShopVenueStatusEdit ';
+    return getApiBasic(url, postdata);
+}
+
+// 查询商家区域设备
+export function QueryVenueEquip(postdata) {
+    let url = headbpi + 'v1/Shop/QueryVenueEquip ';
+    return getApiBasic(url, postdata);
+}
+
+// 修改场馆设备状态
+export function ShopVenueEquipEditStatus(postdata) {
+    let url = headbpi + 'v1/Shop/ShopVenueEquipEditStatus ';
+    return getApiBasic(url, postdata);
+}
+
+// 添加场馆设备
+export function AddShopVenueEquip(postdata) {
+    let url = headbpi + 'v1/Shop/AddShopVenueEquip ';
+    return getApiBasic(url, postdata);
+}
+
+// 修改场馆设备
+export function EditShopVenueEquip(postdata) {
+    let url = headbpi + 'v1/Shop/EditShopVenueEquip ';
+    return getApiBasic(url, postdata);
+}
+
+
+// 11/20 新增
+// 待下课课程列表
+export function ClassDetailQuery(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassDetailQuery ';
+    return getApiBasic(url, postdata);
+}
+
+// 上课准备
+export function ClassStartPrepare(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassStartPrepare ';
+    return getApiBasic(url, postdata);
+}
+
+// HrSensors
+// 添加商家公共心率设备
+export function AddHrSensors(postdata) {
+    let url = headapi + 'v1/HrSensors/AddHrSensors ';
+    return getApiBasic(url, postdata);
+}
+
+//
+// 心率带绑定用户
+export function BindHrSensorsToUser(postdata) {
+    let url = headapi + 'v1/HrSensors/BindHrSensorsToUser ';
+    return getApiBasic(url, postdata);
+}
+
+// 修改商家公共心率设备信息
+export function EditHrSensors(postdata) {
+    let url = headapi + 'v1/HrSensors/EditHrSensors ';
+    return getApiBasic(url, postdata);
+}
+
+//
+// 修改商家公共心率设备状态
+export function HrSensorsStatusEdit(postdata) {
+    let url = headapi + 'v1/HrSensors/HrSensorsStatusEdit ';
+    return getApiBasic(url, postdata);
+}
+
+// 查询商家公共心率设备
+export function QueryHrSensors(postdata) {
+    let url = headapi + 'v1/HrSensors/QueryHrSensors ';
+    return getApiBasic(url, postdata);
+}
+
+// 查询未绑定的心率带--下拉框用
+export function SelectHrSensors(postdata) {
+    let url = headapi + 'v1/HrSensors/SelectHrSensors ';
+    return getApiBasic(url, postdata);
+}
+
+// 心率带解绑用户
+export function UnBindHrSensorsToUser(postdata) {
+    let url = headapi + 'v1/HrSensors/UnBindHrSensorsToUser ';
+    return getApiBasic(url, postdata);
+}
+
+// 上课未预约会员绑定心率带后再确认
+export function ClassDetailAndSnAdd(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassDetailAndSnAdd ';
+    return getApiBasic(url, postdata);
+}
+
+
+export function ClassStartConfirm(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassStartConfirm ';
+    return getApiBasic(url, postdata);
+}
+
+//关闭课程
+export function ClassGiveUpConfirm(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassGiveUpConfirm ';
+    return getApiBasic(url, postdata);
+}
+
+// 修改心率系统区域和课程类型
+export function DispPlanInfoEdit(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/DispPlanInfoEdit ';
+    return getApiBasic(url, postdata);
+}
+
+// 查询心率带绑定历史记录
+export function HrSensorsBindHistory(postdata) {
+    let url = headapi + 'v1/HrSensors/HrSensorsBindHistory ';
+    return getApiBasic(url, postdata);
+}
+// 课堂记录(下课后)详情
+export function FinshedDispPlanQuery(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/FinshedDispPlanQuery ';
+    return getApiBasic(url, postdata);
+}
+
+// 11-24  私有心率设备
+
+// 课堂记录(下课后)详情
+export function AddPvtHrSensors(postdata) {
+    let url = headapi + 'v1/HrSensors/AddPvtHrSensors ';
+    return getApiBasic(url, postdata);
+}
+// 查询商家会员私有心率设备
+export function QueryPvtHrSensors(postdata) {
+    let url = headapi + 'v1/HrSensors/QueryPvtHrSensors ';
+    return getApiBasic(url, postdata);
+}
+
+
+// 12/2 关联手机号
+
+// 会员关联手机添加
+export function VipUserAssociatedPhoneAdd(postdata) {
+    let url = headapi + 'v1/User/VipUserAssociatedPhoneAdd ';
+    return getApiBasic(url, postdata);
+}
+
+// 会员关联手机修改
+export function VipUserAssociatedPhoneEdit(postdata) {
+    let url = headapi + 'v1/User/VipUserAssociatedPhoneEdit ';
+    return getApiBasic(url, postdata);
+}
+
+// 会员关联手机号简单查询
+export function VipUserAssociatedPhoneSimpleQuery(postdata) {
+    let url = headapi + 'v1/User/VipUserAssociatedPhoneSimpleQuery ';
+    return getApiBasic(url, postdata);
+}
+
+// 会员关联手机状态修改
+export function VipUserAssociatedPhoneStatusEdit(postdata) {
+    let url = headapi + 'v1/User/VipUserAssociatedPhoneStatusEdit ';
+    return getApiBasic(url, postdata);
+}
+
+// 12/3 跨店管理
+
+
+// 跨店会员查询
+export function AcrossVipUserQuery(postdata) {
+    let url = headapi + 'v1/User/AcrossVipUserQuery ';
+    return getApiBasic(url, postdata);
+}
+
+// 跨店会员删除
+export function AcrossVipUserDel(postdata) {
+    let url = headapi + 'v1/User/AcrossVipUserDel ';
+    return getApiBasic(url, postdata);
+}
+
+// 跨店会员添加
+export function AcrossVipUserAdd(postdata) {
+    let url = headapi + 'v1/User/AcrossVipUserAdd ';
+    return getApiBasic(url, postdata);
+}
+// 12/4 会员基本信息foradmin
+
+// 跨店会员添加
+export function VipUserSimpleQueryByAdmin(postdata) {
+    let url = headapi + 'v1/User/VipUserSimpleQueryByAdmin ';
+    return getApiBasic(url, postdata);
+}
+
+// 商家分组添加
+export function ShopGroupQuery(postdata) {
+    let url = headapi + 'v1/Shop/ShopGroupQuery ';
+    return getApiBasic(url, postdata);
+}
+
+//
+// 剩余课时统计
+export function ClassHourStatistics(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassHourStatistics ';
+    return getApiBasic(url, postdata);
+}
+
+// 根据手机号码判断用户信息
+export function VipUserQueryByPhone(postdata) {
+    let url = headapi + 'v1/User/VipUserQueryByPhone ';
+    return getApiBasic(url, postdata);
+}
+
+// 关联手机号删除
+export function VipUserAssociatedPhoneDel(postdata) {
+    let url = headapi + 'v1/User/VipUserAssociatedPhoneDel ';
+    return getApiBasic(url, postdata);
+}
+export function ClassSimpleQuery(postdata) {
+    let url = headapi + 'v1/Class/ClassSimpleQuery ';
+    return getApiBasic(url, postdata);
+}
+
+// 2020/12/21
+//
+// 临时会员添加
+export function TmpUserAdd(postdata) {
+    let url = headapi + 'v1/User/TmpUserAdd ';
+    return getApiBasic(url, postdata);
+}
+// 临时会员删除
+export function TmpUserDel(postdata) {
+    let url = headapi + 'v1/User/TmpUserDel ';
+    return getApiBasic(url, postdata);
+}
+// 临时会员修改
+export function TmpUserEdit(postdata) {
+    let url = headapi + 'v1/User/TmpUserEdit ';
+    return getApiBasic(url, postdata);
+}
+// 临时会员查询
+export function TmpUserQuery(postdata) {
+    let url = headapi + 'v1/User/TmpUserQuery ';
+    return getApiBasic(url, postdata);
+}
+
+// 2020/12/22
+// 课堂中临时会员添加
+export function ClassOverTmpDetailAdd(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassOverTmpDetailAdd ';
+    return getApiBasic(url, postdata);
+}
+// 课程中临时会员增加后又删除
+export function ClassTmpUserOverDetailDel(postdata) {
+    let url = headapi + 'v1/SchoolTimeTable/ClassTmpUserOverDetailDel ';
+    return getApiBasic(url, postdata);
+}
+// 心率带绑定临时会员
+export function BindHrSensorsToTempUser(postdata) {
+    let url = headapi + 'v1/HrSensors/BindHrSensorsToTempUser ';
+    return getApiBasic(url, postdata);
+}
+// 获取心率带电量
+export function GetHrSensorsPowerPercent(postdata) {
+    let url = headapi + 'v1/HrSensors/GetHrSensorsPowerPercent ';
+    return getApiBasic(url, postdata);
+}
+
+// 2021/01/04
+// 跨店会员用户基本信息查询(排除本店会员)
+export function AcrossUserSimpleQuery(postdata) {
+    let url = headapi + 'v1/User/AcrossUserSimpleQuery ';
+    return getApiBasic(url, postdata);
+}
+
+// 2021/02/02
+// 查询演示设备
+export function QueryDemoVenueEquipByLoallout(postdata) {
+    let url = headbpi + 'v1/Shop/QueryDemoVenueEquipByLoallout';
+    return getApiBasic(url, postdata);
+}
+
+// 小飞龙总管理员查询商家列表
+export function QueryShopListByLoallout(postdata) {
+    let url = headbpi + 'v1/Shop/QueryShopListByLoallout ';
+    return getApiBasic(url, postdata);
+}
+
+// 演示版上课接口
+export function getHello(postdata) {
+    let url = headcpi + 'UserListInfo';
+    return getApiBasic(url, postdata);
+}
+
+// 卡路里场馆统计(分月度、周统计,TV左上角统计)
+export function CalorieStatsQuery(postdata) {
+    let url = headcpi + 'CalorieStatsQuery';
+    return getApiBasic(url, postdata);
+}
+// 卡路里场馆统计(分月度、周统计,TV左上角统计)
+export function ClassUserRank(postdata) {
+    let url = headcpi + 'ClassUserRank';
+    return getApiBasic(url, postdata);
+}
+// 2021/02/10
+export function QueryDemoVenueEquipInOlinClass(postdata) {
+    let url = headbpi + 'v1/Shop/QueryDemoVenueEquipInOlinClass';
+    return getApiBasic(url, postdata);
+}
+// 2021/03/04
+// 教练课时记录查询
+export function TeacherConsumeQuery(postdata) {
+    let url = headapi + 'v1/User/TeacherConsumeQuery';
+    return getApiBasic(url, postdata);
+}
+// 会员课时调整记录查询
+export function ClassHourChgQuery(postdata) {
+    let url = headapi + 'v1/User/ClassHourChgQuery';
+    return getApiBasic(url, postdata);
+}
+// 2021/03/12
+
+//Score组接口-2021/7/12
+//动作分组查询
+export function ActionGroupQuery(postdata) {
+    let url = headapi + 'v1/Score/ActionGroupQuery';
+    return getApiBasic(url, postdata);
+}
+//动作分组添加
+export function ActionGroupAdd(postdata) {
+    let url = headapi + 'v1/Score/ActionGroupAdd';
+    return getApiBasic(url, postdata);
+}
+//动作分组详情修改
+export function ActionGroupEdit(postdata) {
+    let url = headapi + 'v1/Score/ActionGroupEdit';
+    return getApiBasic(url, postdata);
+}
+//动作分组详情查询
+export function AGDetailQuery(postdata) {
+    let url = headapi + 'v1/Score/AGDetailQuery';
+    return getApiBasic(url, postdata);
+}
+//动作分组状态修改
+export function ActionGroupStatusEdit(postdata) {
+    let url = headapi + 'v1/Score/ActionGroupStatusEdit';
+    return getApiBasic(url, postdata);
+}
+//锻炼动作查询
+export function ExerciseActionQuery(postdata) {
+    let url = headapi + 'v1/Score/ExerciseActionQuery';
+    return getApiBasic(url, postdata);
+}
+//动作与节点关联查询
+export function ENRelationQuery(postdata) {
+    let url = headapi + 'v1/Score/ENRelationQuery';
+    return getApiBasic(url, postdata);
+}
+//通过动作分组详情ID查询动作与节点关联
+export function ENRelationQueryByAgdId(postdata) {
+    let url = headapi + 'v1/Score/ENRelationQueryByAgdId';
+    return getApiBasic(url, postdata);
+}
+// 动作与节点关联添加
+export function ENRelationAdd(postdata) {
+    let url = headapi + 'v1/Score/ENRelationAdd';
+    return getApiBasic(url, postdata);
+}
+//动作分组详情修改
+export function AGDetailEdit(postdata) {
+    let url = headapi + 'v1/Score/AGDetailEdit';
+    return getApiBasic(url, postdata);
+}
+//锻炼动作表添加
+export function ExerciseActionAdd(postdata) {
+    let url = headapi + 'v1/Score/ExerciseActionAdd';
+    return getApiBasic(url, postdata);
+}
+//锻炼动作修改
+export function ExerciseActionEdit(postdata) {
+    let url = headapi + 'v1/Score/ExerciseActionEdit';
+    return getApiBasic(url, postdata);
+}
+//修改锻炼动作状态
+export function ExerciseActionStatusEdit(postdata) {
+    let url = headapi + 'v1/Score/ExerciseActionStatusEdit';
+    return getApiBasic(url, postdata);
+}
+//查询身体节点
+export function BodyNodeQuery(postdata) {
+    let url = headapi + 'v1/Score/BodyNodeQuery';
+    return getApiBasic(url, postdata);
+}
+//动作与节点关联修改
+export function ENRelationEdit(postdata) {
+    let url = headapi + 'v1/Score/ENRelationEdit';
+    return getApiBasic(url, postdata);
+}
+//修改动作与节点关联状态
+export function ENRelationStatusEdit(postdata) {
+    let url = headapi + 'v1/Score/ENRelationStatusEdit';
+    return getApiBasic(url, postdata);
+}
+//添加身体节点
+export function BodyNodeAdd(postdata) {
+    let url = headapi + 'v1/Score/BodyNodeAdd';
+    return getApiBasic(url, postdata);
+}
+//修改身体节点
+export function BodyNodeEdit(postdata) {
+    let url = headapi + 'v1/Score/BodyNodeEdit';
+    return getApiBasic(url, postdata);
+}
+//修改身体节点状态
+export function BodyNodeStatusEdit(postdata) {
+    let url = headapi + 'v1/Score/BodyNodeStatusEdit';
+    return getApiBasic(url, postdata);
+}
+//动作与节点关联批量修改
+export function ENRelationBatchEdit(postdata) {
+    let url = headapi + 'v1/Score/ENRelationBatchEdit';
+    return getApiBasic(url, postdata);
+}
+//课程综合评分查询
+export function ScoreClassQuery(postdata) {
+    let url = headapi + 'v1/ScoreClass/ScoreClassQuery';
+    return getApiBasic(url, postdata);
+}
+//课程动作评分详情查询
+export function ScoreClassDetailQuery(postdata) {
+    let url = headapi + 'v1/ScoreClass/ScoreClassDetailQuery';
+    return getApiBasic(url, postdata);
+}
+//动作批量打分
+export function ScoreClassDetailBatchScore(postdata) {
+    let url = headapi + 'v1/ScoreClass/ScoreClassDetailBatchScore';
+    return getApiBasic(url, postdata);
+}
+//动作批量打分 评分结束
+export function ScoreClassScoreFinish(postdata) {
+    let url = headapi + 'v1/ScoreClass/ScoreClassScoreFinish';
+    return getApiBasic(url, postdata);
+}
+//动作分组与动作关联批量修改-orderNo
+export function AGDetailBatchEdit(postdata) {
+    let url = headapi + 'v1/Score/AGDetailBatchEdit';
+    return getApiBasic(url, postdata);
+}
+//动作标签查询
+export function AGDetailCurrStdQuery(postdata) {
+    let url = headapi + 'v1/ScoreClass/AGDetailCurrStdQuery';
+    return getApiBasic(url, postdata);
+}
+//身体节点查询
+export function ENRelationCurrStdQuery(postdata) {
+    let url = headapi + 'v1/ScoreClass/ENRelationCurrStdQuery';
+    return getApiBasic(url, postdata);
+}

BIN
src/assets/404/back.png


BIN
src/assets/404/back_w.png


BIN
src/assets/404/homepage.png


BIN
src/assets/404/homepage_w.png


BIN
src/assets/404/man.png


BIN
src/assets/404/refresh.png


BIN
src/assets/404/refresh_w.png


+ 69 - 0
src/assets/css/bg.css

@@ -0,0 +1,69 @@
+.bgStyle1 {
+    background-color: #028fe1;
+    background: url("../../static/img/bg/bg_1.png");
+    background-size: 100%  100%;
+    background-repeat: no-repeat;
+}
+
+.bgStyle2 {
+    background-color: #028fe1;
+    background: url("../../static/img/bg/bg_2.png");
+    background-size: 100%  100%;
+    background-repeat: no-repeat;
+}
+
+.bgStyle3 {
+    background-color: #028fe1;
+    background: url("../../static/img/bg/bg_3.png");
+    background-size: 100%  100%;
+    background-repeat: no-repeat;
+}
+
+.bgStyle4 {
+    background-color: #028fe1;
+    background: url("../../static/img/bg/bg_4.png");
+    background-size: 100%  100%;
+    background-repeat: no-repeat;
+}
+
+
+/*bg2*/
+.bg2Style1 {
+    background-color: #028fe1;
+    background: url("../../static/img/bg/bg2_1.png");
+    background-size: 100%  100%;
+    background-repeat: no-repeat;
+}
+
+.bg2Style2 {
+    background-color: #028fe1;
+    background: url("../../static/img/bg/bg2_2.png");
+    background-size: 100%  100%;
+    background-repeat: no-repeat;
+}
+
+.bg2Style3 {
+    background-color: #028fe1;
+    background: url("../../static/img/bg/bg2_3.png");
+    background-size: 100%  100%;
+    background-repeat: no-repeat;
+}
+
+.bg2Style4 {
+    background-color: #028fe1;
+    background: url("../../static/img/bg/bg2_4.png");
+    background-size: 100%  100%;
+    background-repeat: no-repeat;
+}
+
+ul, li {
+    list-style: none;
+    margin: 0;
+    padding: 0;
+}
+
+s, em, i {
+    font-style: normal;
+    text-decoration: none;
+}
+

+ 471 - 0
src/assets/css/panel.css

@@ -0,0 +1,471 @@
+.sub_title {
+    width: 96%;
+    overflow: hidden;
+    display: block;
+    margin: 0 auto;
+    margin-top: 10px;
+    text-align: left;
+}
+
+.sub_title em {
+    text-decoration: none;
+    font-style: normal;
+}
+
+.container {
+    width: 100%;
+    overflow: hidden;
+    overflow-y: scroll;
+    display: block;
+    margin: 0 auto;
+}
+
+.panel {
+    width: 100%;
+    overflow: hidden;
+    display: block;
+    margin: 0 auto;
+    /*margin-bottom: 20px;*/
+    background: #ccc;
+    padding: 5px;
+}
+
+.panel h5 {
+    width: 100%;
+    margin: 0;
+    text-align: left;
+    font-size: 16px;
+    font-weight: normal;
+    padding-top: 10px;
+    padding-bottom: 5px;
+    border-bottom: 1px solid #F0F2F5;
+    margin-bottom: 5px;
+    float: left;
+    text-indent: 20px;
+}
+.panel em {
+    font-style: normal;
+}
+.panel /deep/ .el-col em {
+    float: left;
+    text-align: left;
+    line-height: 35px;
+    margin-right: 10px;
+    font-style: normal;
+}
+
+.panel /deep/ .el-input {
+    width: 150px;
+    float: left;
+}
+
+.panel /deep/ .el-select {
+    width: 150px;
+    float: left;
+}
+
+.panel /deep/ .el-input__inner {
+    width: 140px;
+    height: 30px;
+    line-height: 30px;
+    margin-top: 5px;
+    border-radius: 0;
+    float: left;
+    padding-right: 22px;
+}
+
+.panel /deep/ .el-date-editor--daterange {
+    width: 280px;
+}
+
+.panel /deep/ .el-date-editor .el-range-separator {
+    width: 30px;
+}
+
+.panel {
+    width: 100%;
+    overflow: hidden;
+    display: block;
+    margin: 0 auto;
+    background-color: #fff;
+    margin-top: 0px;
+    margin-bottom: 10px;
+    padding: 0 !important;
+}
+
+.panel /deep/ .el-input {
+    width: 140px;
+}
+
+.panel .panel_control em {
+    width: 70px;
+    float: left;
+    text-align: right;
+}
+
+.table_container {
+    width: 100%;
+    overflow: hidden;
+    margin-top: 5px;
+    margin-bottom: 10px;
+    background-color: #fff;
+    float: left;
+    padding: 10px;
+}
+
+.table_container /deep/ .el-input .el-input__inner {
+    height: 30px;
+    line-height: 30px;
+    width: 100px;
+    padding-right: 22px;
+}
+
+.table_container /deep/ .el-select .el-input__inner {
+    height: 30px;
+    line-height: 30px;
+    width: 70px;
+    padding-right: 22px;
+}
+
+.dataTables_length {
+    width: 380px;
+    float: left;
+    margin-bottom: 10px;
+    margin-right: 10px;
+    text-align: left;
+    font-size: 14px;
+}
+
+.dataTables_length /deep/ .el-input {
+    width: 100px;
+}
+
+
+.modal {
+    display: block !important;
+}
+
+.modal ul, .modal li {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+}
+
+.modal li {
+    width: 100%;
+    overflow: hidden;
+    display: block;
+    margin: 0 auto;
+    height: 24px;
+    line-height: 24px;
+    text-align: left;
+}
+
+/deep/ .form-horizontal .col-sm-5 .el-select {
+    width: 100%;
+}
+
+/deep/ .form-horizontal .col-sm-5 .el-input {
+    width: 100%;
+}
+
+/deep/ .el-input-number {
+    width: 100%;
+}
+
+.large {
+    width: 100%;
+    overflow: hidden;
+    display: block;
+    margin: 0 auto;
+}
+
+#pages {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+    overflow-y: scroll;
+    display: block;
+    margin: 0 auto;
+    background-color: #F2F2F2;
+    padding-bottom: 30px;
+}
+
+/*eldialog*/
+.el-dialog__body .form-group {
+    width: 100%;
+    overflow: hidden;
+    display: block;
+    margin: 0 auto;
+    margin-bottom: 10px;
+}
+
+/deep/ .el-dialog__body em {
+    width: 90px;
+    height: 40px;
+    line-height: 40px;
+    text-align: right;
+    float: left;
+    font-style: normal;
+}
+
+/deep/ .el-dialog__body .el-input {
+    width: 70%;
+    float: left;
+}
+
+/deep/ .el-dialog__body .panel_select {
+    width: 70%;
+    float: left;
+}
+
+/deep/ .el-dialog__body .panel_select .el-input--suffix {
+    width: 100%;
+    float: left;
+}
+
+/deep/ .el-dialog__body .el-textarea {
+    width: 70%;
+    float: left;
+}
+
+.table_container .pull-right {
+    margin-left: 10px;
+}
+
+/deep/ .el-table td, .el-table th {
+    padding: 5px;
+}
+
+.mid_time {
+    float: left;
+    margin-left: 5px;
+    margin-right: 5px;
+    line-height: 35px;
+}
+
+.red {
+    color: red;
+}
+
+.green {
+    color: #67c23a;
+}
+
+.yellow {
+    color: yellow;
+}
+
+.red_icon {
+    background: red;
+}
+
+.red_green {
+    background: #67c23a;
+}
+
+.el-dialog__body em {
+    width: 70px;
+    float: left;
+    margin-left: 10px;
+    text-align: right;
+    margin-right: 10px;
+}
+
+.el-dialog__body .el-col {
+    width: 100%;
+    overflow: hidden;
+    display: block;
+    margin: 0 auto;
+    margin-bottom: 10px;
+}
+
+/deep/ .el-select .el-input .el-select__caret {
+    line-height: 20px !important;
+}
+
+.el-table--border th, .el-table__fixed-right-patch {
+    background-color: #F0F2F5 !important;
+}
+
+.panel /deep/ .el-col-4 {
+    padding-left: 3px !important;
+    padding-right: 3px !important;
+}
+
+.panel /deep/ .el-input__icon {
+    line-height: 20px;
+}
+
+.el-transfer__buttons {
+    /*width: 66px;*/
+}
+
+.el-transfer .el-button + .el-button {
+    /*margin-left: 0;*/
+}
+
+/deep/ .el-checkbox {
+    margin-right: 0;
+}
+
+.el-transfer-panel__item.el-checkbox .el-checkbox__label span {
+    /*width: 50%;*/
+    text-align: left;
+}
+
+.el-transfer__buttons button {
+    /*float: right;*/
+}
+
+.el-dialog__body {
+    padding-top: 4px;
+}
+
+/*颜色选择器*/
+.el-color-picker__trigger {
+    border-radius: 250px;
+}
+
+.el-color-picker__color-inner {
+    border-radius: 250px;
+}
+
+.el-color-picker__color {
+    border-radius: 250px;
+}
+
+.el-tabs__item.is-active {
+    color: #fff;
+    background: #409EFF;
+}
+
+/*隐藏调色盘*/
+.el-color-dropdown__main-wrapper {
+    display: none !important;
+}
+
+/deep/ .el-color-dropdown__main-wrapper {
+    display: none !important;
+}
+
+/* 处理input type = number的上下箭头*/
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+    -webkit-appearance: none;
+}
+
+input[type="number"] {
+    -moz-appearance: textfield;
+}
+
+/*ipad only*/
+@media (min-width: 1025px) and (max-width: 1366px) {
+    .panel .panel_control em {
+        font-size: 12px;
+        width: 60px;
+    }
+
+    .panel /deep/ .el-input__inner {
+        /*width: 130px;*/
+    }
+
+    .panel /deep/ .el-date-editor--daterange {
+        width: 100%;
+    }
+
+    .panel /deep/ .el-date-editor .el-range-separator {
+        width: 20px;
+        padding: 0;
+    }
+
+    .panel /deep/ .el-input__inner {
+        padding-right: 3px;
+    }
+
+    .panel .el-date-editor .el-range-input {
+        width: 44%;
+    }
+
+    .panel /deep/ .el-col-4 {
+        padding-left: 1px !important;
+        padding-right: 1px !important;
+    }
+}
+
+.el-checkbox-group .el-checkbox:last-of-type {
+    margin-right: 30px;
+}
+
+table .el-radio {
+    width: 20px;
+    overflow: hidden;
+    display: block;
+    margin: 0 auto;
+    float: none;
+
+}
+
+@media (min-width: 960px) and (max-width: 1024px) {
+    .el-main > .context {
+        padding-bottom: 60px!important;
+    }
+    .panel .panel_control em {
+        font-size: 12px;
+        width: 55px;
+        margin-right: 3px;
+        text-align: right;
+    }
+    .panel /deep/ .el-input {
+        width: 110px;
+    }
+
+    .panel /deep/ .el-select {
+        width: 110px;
+    }
+
+    .panel /deep/ .el-input__inner {
+        width: 110px;
+    }
+
+    .panel /deep/ .el-date-editor--daterange {
+        width: 100%;
+    }
+
+    .panel /deep/ .el-date-editor .el-range-separator {
+        width: 20px;
+        padding: 0;
+    }
+
+    .panel /deep/ .el-input__inner {
+        padding-right: 3px;
+    }
+
+    .panel .el-date-editor .el-range-input {
+        width: 44%;
+    }
+
+    .panel /deep/ .el-col-4 {
+        padding-left: 1px !important;
+        padding-right: 1px !important;
+    }
+    .el-checkbox-group .el-checkbox:last-of-type {
+        margin-right: 30px;
+    }
+
+    table .el-radio {
+        width: 20px;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        float: none;
+
+    }
+
+}
+

BIN
src/assets/font/UnidreamLED.ttf


BIN
src/assets/img/birth/birthCrow.png


BIN
src/assets/img/birth/birthText.png


BIN
src/assets/img/border/bbl.png


BIN
src/assets/img/border/bbr.png


BIN
src/assets/img/border/btl.png


BIN
src/assets/img/border/btr.png


BIN
src/assets/img/header/left.png


BIN
src/assets/img/header/ltehead.png


BIN
src/assets/img/header/right.png


BIN
src/assets/img/icon/addMemo.png


BIN
src/assets/img/icon/equip.png


BIN
src/assets/img/icon/header.png


BIN
src/assets/img/icon/home.png


BIN
src/assets/img/icon/list.png


BIN
src/assets/img/icon/location.png


BIN
src/assets/img/icon/logout.png


BIN
src/assets/img/icon/qrcode.png


BIN
src/assets/img/icon/question_icon.png


BIN
src/assets/img/icon/setting.png


BIN
src/assets/img/icon/user.png


BIN
src/assets/img/lessonTable/star.png


BIN
src/assets/img/login/bg.png


BIN
src/assets/img/login/logo.png


BIN
src/assets/img/main/Oval.png


BIN
src/assets/img/main/appoint.png


BIN
src/assets/img/main/empty.jpg


BIN
src/assets/img/main/lesson.png


BIN
src/assets/img/main/member.png


BIN
src/assets/img/nav/head.png


BIN
src/assets/img/nav/home.png


BIN
src/assets/img/nav/logo.png


BIN
src/assets/logo.png


BIN
src/assets/valid.png


+ 778 - 0
src/components/Headside.vue

@@ -0,0 +1,778 @@
+<template>
+	<div id="headside">
+		<nav class="navbar user-info-navbar" role="navigation">
+			<!-- <i
+                v-if="isCollapse"
+                :class="[{ 'el-icon-s-unfold left_hide_icon': left_panel_state }, { 'el-icon-s-fold left_show_icon': !left_panel_state }]"
+                @click="left_hide"
+            ></i> -->
+			<span class="title">
+				场馆管理系统
+				<em>{{ current }}</em>
+			</span>
+			<div @click="checkNews">
+				<el-badge :value="newnum" class="item" v-if="newnumState">
+					<el-button size="small">
+						<i class="el-icon-message"></i>
+					</el-button>
+				</el-badge>
+			</div>
+
+			<ul class="user-info-menu pull-right  list-unstyled">
+				<!--                        <img class="lteHead" src="../assets/img/header/lteHead.png" height="26" width="26"/>-->
+
+				<span class="customer_serve logoutBtn" @click="logoutClick">
+					<i class="el-icon-switch-button"></i> 退出</span
+				>
+				<!-- <span class="scrren customer_serve" @click="full_screen" v-if="!screen_full"><i
+                        class="el-icon-full-screen"></i>全屏</span>
+                <span class="scrren customer_serve" @click="cancle_screen" v-if="screen_full"><i
+                        class="el-icon-full-screen"></i>缩小</span> -->
+				<span class="el-dropdown-link customer_serve">{{ user.name }}</span>
+				<span class="el-dropdown-link customer_serve shopinfo">
+					<span>{{ ShopName }}</span>
+					<span>{{ userLevelText }}</span>
+				</span>
+			</ul>
+		</nav>
+	</div>
+</template>
+<script>
+import axios from "axios";
+import Global from "../Global.js";
+import { SignOut, ManagerSelfQuery, ShopListQuery } from "../api/getApiRes.js";
+let qs = require("qs");
+export default {
+	data() {
+		return {
+			isCollapse: document.body.clientWidth < 1367,
+			user: {
+				name: "admin",
+			},
+			time: "8:30-17:30",
+			tel: "0000-0079-000",
+			qq: "0000079000",
+			newnum: "",
+			newnumState: false,
+			left_panel_state: true,
+			screen_full: false,
+			ShopName: "",
+			userLevelText: "",
+			current: globalcurrentWeek(),
+		};
+	},
+	mounted() {
+		this.readNewNum();
+		this.getManagerSelfQuery();
+		//            定时轮询news
+		//设置10s刷新一次数据
+		// if (this.timer) {
+		//     clearInterval(this.timer);
+		// }else{
+		//     this.timer = setInterval(() => {
+		//         this.readNewNum();
+		//     },10000)
+		// }
+	},
+	methods: {
+		//            隐藏左侧和显示
+		left_hide: function() {
+			let that = this;
+			that.left_panel_state = !that.left_panel_state;
+			this.$emit("lefthide");
+			// if (!that.left_panel_state) {
+			//     this.$emit('left_hide_func');
+			// } else {
+			//     this.$emit('right_hide_func');
+			// }
+		},
+		getManagerSelfQuery() {
+			let that = this;
+			let param = {
+				token: localStorage.token,
+			};
+			let postdata = qs.stringify(param);
+			ManagerSelfQuery(postdata).then((res) => {
+				let json = res;
+				if (json.Code == 0) {
+					that.user.name = json.Rs.Name;
+					localStorage.shopId = json.Rs.ShopId;
+					localStorage.userLevel = json.Rs.Role.Id;
+					localStorage.ServiceId = json.Rs.Shop.ServiceId;
+					localStorage.ServiceKey = json.Rs.Shop.ServiceKey;
+
+					that.userLevelText = json.Rs.Role.Name;
+					// 1 会员 2 系统 3 店铺 4 教练
+					switch (parseInt(json.Rs.Role.Id)) {
+						case 1:
+							that.userLevel = 1;
+							break;
+						case 2:
+							that.userLevel = 2;
+							break;
+						case 3:
+							that.userLevel = 3;
+							break;
+						case 4:
+							that.userLevel = 4;
+							break;
+					}
+					localStorage.shopId = json.Rs.ShopId;
+					this.panelSelect(json.Rs.ShopId);
+				} else {
+					if (json.Code == 1010) {
+						that.$message.error(json.Memo + " 错误码:" + json.Code);
+						that.$router.push({ path: "/login", query: { status: 1 } });
+						return false;
+					} else {
+						that.$message.error(json.Memo + " 错误码:" + json.Code);
+					}
+				}
+			});
+		},
+		// 获取所属店铺
+		panelSelect(ShopId) {
+			let that = this;
+			let param = {
+				token: localStorage.token,
+			};
+			let postdata = qs.stringify(param);
+			ShopListQuery(postdata).then((res) => {
+				let json = res;
+				if (json.Code == 0) {
+					json.Rs.map(function(item) {
+						if (item.ShopID == ShopId) {
+							that.ShopName = item.ShopName;
+						}
+					});
+				} else {
+					that.$message.error(json.Memo + " 错误码:" + json.Code);
+				}
+			});
+		},
+		//            打开消息提示
+		checkNews: function() {
+			let that = this;
+			const h = this.$createElement;
+			this.$notify({
+				title: "标题名称",
+				position: "top-left",
+				message: h(
+					"i",
+					{ style: "color: teal" },
+					"这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案这是提示文案"
+				),
+				onClose: function() {
+					//关闭时调用已读接口
+				},
+				onClick: function() {
+					//关闭时调用已读接口
+					this.close(); //关闭notify
+					let thisdata = { name: "message", link: "/#/message" };
+					that.$emit("navOpen", thisdata); //跳转新的message
+				},
+			});
+		},
+		//            读取消息提示数量
+		readNewNum: function() {
+			this.newnum = 0;
+			this.newnumState = false;
+			//                ajax todo
+		},
+		// 退出登录
+		logoutClick: function() {
+			let that = this;
+			that
+				.$confirm("此操作将退出当前账号, 是否继续?", "提示", {
+					confirmButtonText: "确定",
+					cancelButtonText: "取消",
+					type: "warning",
+				})
+				.then(() => {
+					let that = this;
+					that.$router.push({ path: "/login", query: { status: 1 } });
+					let param = {
+						token: localStorage.token,
+					};
+					let postdata = qs.stringify(param);
+					SignOut(postdata).then((res) => {
+						let json = res;
+						if (json.Code == 0) {
+							localStorage.clear();
+							// that.$router.push({path: '/login', query: {status: 1}});
+							that.$message({
+								showClose: true,
+								message: "当前用户已退出登陆!",
+								type: "success",
+							});
+						} else {
+							that.$message.error(json.Memo + " 错误码:" + json.Code);
+						}
+					});
+				})
+				.catch(() => {});
+		},
+		// 全屏显示
+		full_screen() {
+			let that = this;
+			this.screen_full = true;
+			let elem = document.getElementById("app");
+			this.full_state = true;
+			if (elem.webkitRequestFullScreen) {
+				elem.webkitRequestFullScreen();
+				that.full_rule();
+			} else if (elem.mozRequestFullScreen) {
+				elem.mozRequestFullScreen();
+				that.full_rule();
+			} else if (elem.requestFullScreen) {
+				elem.requestFullscreen();
+				that.full_rule();
+			} else {
+				this.screen_full = false;
+				that.$message.error(
+					"浏览器不支持全屏API或已被禁用",
+					null,
+					null,
+					null,
+					true,
+					true
+				);
+			}
+		},
+		// 取消全屏
+		cancle_screen() {
+			let that = this;
+			this.screen_full = false;
+			this.full_state = false;
+			var elem = document;
+			if (elem.webkitCancelFullScreen) {
+				elem.webkitCancelFullScreen();
+				that.cancle_full_rule();
+			} else if (elem.mozCancelFullScreen) {
+				elem.mozCancelFullScreen();
+				that.cancle_full_rule();
+			} else if (elem.cancelFullScreen) {
+				elem.cancelFullScreen();
+				that.cancle_full_rule();
+			} else if (elem.exitFullscreen) {
+				elem.exitFullscreen();
+				that.cancle_full_rule();
+			} else {
+				this.screen_full = true;
+				that.$message.error(
+					"浏览器不支持全屏API或已被禁用",
+					null,
+					null,
+					null,
+					true,
+					true
+				);
+			}
+		},
+	},
+	components: {},
+};
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+ul,
+li {
+	list-style: none;
+	padding: 0;
+	margin: 0;
+}
+
+#headside {
+	width: 100%;
+	height: 72px;
+	overflow: hidden;
+	float: right;
+	z-index: 1111;
+	background-color: #0063c9;
+}
+
+.user-info-navbar {
+	width: 100%;
+	overflow: hidden;
+	display: block;
+	margin: 0 auto;
+	min-height: 72px;
+	height: 72px;
+	border: 0;
+	padding: 0;
+	margin-bottom: 0px;
+}
+
+.user-info-navbar .user-info-menu > li > a {
+	position: relative;
+	display: block;
+	padding: 12px 20px;
+	color: #979898;
+	border-bottom: 1px solid #ffffff;
+	top: 1px;
+	z-index: 5;
+}
+
+.user-info-navbar .user-info-menu > li > a .badge {
+	font-size: 9px;
+	position: absolute;
+	top: 3px;
+	right: 10px;
+	padding: 4px;
+	min-width: 18px;
+	line-height: 1;
+}
+
+.user-info-navbar .user-info-menu > li > form {
+	position: relative;
+	display: block;
+	padding: 12px 20px;
+	padding-bottom: 5px;
+	margin: 0;
+	border-bottom: 1px solid #ffffff;
+}
+
+.user-info-navbar .user-info-menu > li.search-form .search-field,
+.navbar.horizontal-menu .navbar-inner > .nav > li.search-form .search-field {
+	position: absolute;
+	top: 25%;
+	right: 15px;
+	margin-top: 0px;
+	line-height: 1;
+	height: 25px;
+	border: 1px solid #dddddd;
+	border: 0;
+	padding: 0 10px;
+	width: 170px;
+	padding-right: 30px;
+	font-size: 12px;
+	z-index: 1;
+	visibility: hidden;
+	background: #f3f3f3;
+	zoom: 1;
+	filter: alpha(opacity=0);
+	-webkit-opacity: 0;
+	-moz-opacity: 0;
+	opacity: 0;
+}
+
+.frm-body {
+	background-color: #eeeeee;
+}
+
+.sidebar-menu {
+	display: table-cell;
+	position: relative;
+	width: 230px;
+	background: #2c2e2f;
+	z-index: 1;
+}
+
+footer.main-footer {
+	padding: 8px 20px 0px 20px;
+	border-top: 1px solid #dddddd;
+	font-size: 12px;
+	margin-left: -30px;
+	margin-right: -30px;
+	margin-top: 10px;
+	margin-bottom: -10px;
+	background-color: #eeeeee;
+}
+
+.panel {
+	position: relative;
+	background: #ffffff;
+	padding: 10px 10px;
+	border: 0;
+	margin-top: 5px;
+	margin-bottom: 0px;
+	-webkit-box-shadow: none;
+	-moz-box-shadow: none;
+	box-shadow: none;
+}
+
+.panel .panel-body {
+	padding: 0;
+	padding-top: 20px;
+	color: #000000;
+}
+
+.panel-title {
+	margin-top: 5px;
+	margin-bottom: 5px;
+}
+
+.panel .panel-heading {
+	position: relative;
+	padding: 0;
+	margin: 0;
+	background: none;
+	font-size: 17px;
+	padding-bottom: 0px;
+	border-bottom: 2px solid #f5f5f5;
+}
+
+.panel.panel-color .panel-heading {
+	margin-top: -10px;
+	margin-left: -10px;
+	margin-right: -10px;
+	padding: 10px 10px;
+	border-bottom: 0;
+}
+
+.panel.panel-color.collapsed > .panel-heading {
+	margin-bottom: -10px;
+}
+
+.xe-widget.xe-progress-counter.xe-progress-counter-huise {
+	background-color: #d7d7d7;
+}
+
+.xe-widget.xe-progress-counter.xe-progress-counter-huise .xe-background {
+	color: #fff;
+}
+
+.xe-widget.xe-progress-counter.xe-progress-counter-huise .xe-upper {
+	background-color: transparent;
+}
+
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfood > tr > td,
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfood > tr > th {
+	padding: 5px 5px 5px 5px;
+}
+
+.input-sm {
+	height: 26px;
+	padding: 5px 10px;
+	font-size: 12px;
+	line-height: 1.5;
+	border-radius: 0;
+}
+
+.col-xs-1,
+.col-sm-1,
+.col-md-1,
+.col-lg-1,
+.col-xs-2,
+.col-sm-2,
+.col-md-2,
+.col-lg-2,
+.col-xs-3,
+.col-sm-3,
+.col-md-3,
+.col-lg-3,
+.col-xs-4,
+.col-sm-4,
+.col-md-4,
+.col-lg-4,
+.col-xs-5,
+.col-sm-5,
+.col-md-5,
+.col-lg-5,
+.col-xs-6,
+.col-sm-6,
+.col-md-6,
+.col-lg-6,
+.col-xs-7,
+.col-sm-7,
+.col-md-7,
+.col-lg-7,
+.col-xs-8,
+.col-sm-8,
+.col-md-8,
+.col-lg-8,
+.col-xs-9,
+.col-sm-9,
+.col-md-9,
+.col-lg-9,
+.col-xs-10,
+.col-sm-10,
+.col-md-10,
+.col-lg-10,
+.col-xs-11,
+.col-sm-11,
+.col-md-11,
+.col-lg-11,
+.col-xs-12,
+.col-sm-12,
+.col-md-12,
+.col-lg-12 {
+	position: relative;
+	min-height: 1px;
+	padding-left: 5px;
+	padding-right: 5px;
+}
+
+.form-horizontal .form-group {
+	margin-left: 0px;
+	margin-right: 0px;
+}
+
+.btn-sm,
+.btn-group-sm > .btn {
+	font-size: 14px;
+	line-height: 1.5;
+	padding: 2px 6px;
+	border-radius: 0px;
+}
+
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_paginate {
+	padding-top: 10px;
+	padding-left: 5px;
+	padding-right: 5px;
+}
+
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter {
+	padding-bottom: 5px;
+	padding-left: 5px;
+	padding-right: 5px;
+}
+
+.comm_style {
+	max-width: 200px;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+	margin: 0 auto;
+}
+
+.img_style {
+	width: 40px;
+	/*height: 40px;*/
+	overflow: hidden;
+	display: block;
+	margin: 0 auto;
+}
+
+#modal_img {
+	width: 300px;
+	height: 300px;
+	overflow: hidden;
+	display: block;
+	margin: 0 auto;
+}
+
+.modal-content {
+	margin: 0 auto;
+	/*width: 50%;*/
+	/*20170623 mefisto*/
+}
+
+.customer_serve {
+	float: right;
+	margin-right: 20px;
+	font-size: 14px;
+	color: #fff;
+	text-align: right;
+	line-height: 72px;
+}
+.logoutBtn {
+	cursor: pointer;
+}
+
+#about_us {
+	color: #03b1ff;
+	cursor: pointer;
+}
+
+.dropdown-menu-list a img {
+	width: 30px;
+	height: 30px;
+}
+
+.user-info-navbar
+	.user-info-menu
+	> li
+	.dropdown-menu
+	.dropdown-menu-list
+	li
+	a
+	.line.desc,
+.navbar.horizontal-menu
+	.navbar-inner
+	> .nav
+	> li
+	.dropdown-menu
+	.dropdown-menu-list
+	li
+	a
+	.line.desc {
+	margin-right: 0;
+}
+
+.user-info-navbar .user-info-menu > li .dropdown-menu .dropdown-menu-list li,
+.navbar.horizontal-menu
+	.navbar-inner
+	> .nav
+	> li
+	.dropdown-menu
+	.dropdown-menu-list
+	li {
+	min-height: 50px;
+}
+
+.empty_li_noti {
+	text-align: center;
+	line-height: 50px !important;
+}
+
+.disagree_invite {
+	background-color: #ff0000;
+}
+
+.agree_invite {
+	background-color: #25cc42;
+}
+
+.disagree_invite:hover {
+	background-color: #d20000;
+}
+
+.agree_invite:hover {
+	background-color: #25cc42;
+}
+
+.invite_msg {
+	width: 95%;
+	overflow: hidden;
+	display: block;
+	margin: 0 auto;
+	margin-top: 34px;
+	margin-top: 10px;
+}
+
+.invite_time {
+	width: 95%;
+	overflow: hidden;
+	display: block;
+	margin: 0 auto;
+	margin-top: 10px;
+}
+
+.left_hide_icon {
+	width: 20px;
+	height: 20px;
+	margin-top: 8px;
+	float: left;
+	margin-left: 15px;
+	cursor: pointer;
+	color: #badcff;
+	font-size: 22px;
+	/*background: url("../assets/img/header/right.png")top center no-repeat;*/
+}
+
+/*.left_hide_icon:hover {*/
+/*    background: #ccc;*/
+/*    color: #fff;*/
+/*}*/
+
+.left_show_icon {
+	width: 20px;
+	height: 20px;
+	margin-top: 8px;
+	float: left;
+	margin-left: 15px;
+	cursor: pointer;
+	color: #badcff;
+	font-size: 22px;
+	/*background: url("../assets/img/header/left.png")top center no-repeat;*/
+}
+
+.item {
+	float: left;
+	margin-left: 10px;
+	margin-top: 10px;
+}
+
+.el-button--small,
+.el-button--small.is-round {
+	padding: 4px 8px;
+}
+
+.user-profile {
+	float: right;
+	cursor: pointer;
+	margin-right: 29px;
+}
+
+.el-dropdown-menu__item {
+	padding: 5px;
+}
+
+.title {
+	float: left;
+	color: #badcff;
+	font-size: 19px;
+	line-height: 72px;
+	margin-left: 23px;
+}
+
+.title em {
+	font-style: normal;
+	font-size: 14px;
+	margin-left: 10px;
+	font-size: 14px;
+}
+
+.lteHead {
+	margin-top: 25px;
+	margin-right: 10px;
+	float: left;
+}
+
+.user-profile span {
+	float: left;
+	color: #fff;
+	font-size: 14px;
+	line-height: 72px;
+}
+
+.shopinfo span {
+	padding-left: 10px;
+}
+
+.pull-right {
+	float: right;
+	height: 40px;
+	line-height: 40px;
+	color: #fff;
+}
+.scrren {
+	cursor: pointer;
+}
+
+@media (min-width: 960px) and (max-width: 1367px) {
+	#headside {
+		height: 40px;
+	}
+
+	.user-info-navbar {
+		min-height: 40px;
+		height: 40px;
+	}
+
+	.title {
+		line-height: 40px;
+	}
+
+	.user-profile span {
+		line-height: 40px;
+	}
+
+	.customer_serve {
+		float: right;
+		margin-right: 20px;
+		font-size: 12px;
+		color: #fff;
+		text-align: right;
+		line-height: 45px;
+	}
+}
+</style>

+ 23 - 0
src/components/Map.vue

@@ -0,0 +1,23 @@
+<template>
+    <div class="amap-wrapper">
+        <el-amap class="amap-box" :vid="'amap-vue'"></el-amap>
+    </div>
+</template>
+
+<script>
+    export default {
+        data () {
+            return {
+                msg: 'vue-amap向你问好!'
+            }
+        }
+    }
+    // 更多配置 参阅https://elemefe.github.io/vue-amap/#/zh-cn/coverings/marker
+</script>
+
+<style scoped>
+    .amap-wrapper {
+        width: 500px;
+        height: 500px;
+    }
+</style>

+ 430 - 0
src/components/Navside.vue

@@ -0,0 +1,430 @@
+<template>
+    <div :class="NavsideClass">
+        <div class="logoContainer">
+            <img src="../assets/img/nav/logo.png" height="40" width="180" />
+            <i :class="[{ 'el-icon-s-unfold left_hide_icon': left_panel_state }, { 'el-icon-s-fold left_show_icon': !left_panel_state }]"
+                @click="left_hide"></i>
+        </div>
+        <div class="userContainer">
+            <!-- <img src="../assets/img/nav/head.png" height="51" width="51" /> -->
+            <!-- <span>{{ ShopName }}</span>
+            <em>{{ userLevelText }}</em>-->
+        </div>
+        <el-row :class="[{ 'shortnav': isCollapse }, { 'longNav': !isCollapse }]">
+            <el-col :span="24">
+                <el-menu :default-active="userLevelDeafult" class="el-menu-vertical-demo" @open="handleOpen"
+                    @close="handleClose" @select="handleSelect" :collapse="isCollapse" background-color="#ffffff"
+                    text-color="#777777" active-text-color="#fff"
+                    
+                    router>
+                    <el-menu-item :index="nav.clmid" :route="nav.clmurl" v-for="nav in navs"
+                    popper-append-to-body="false"
+                        v-if="nav.show == userLevel">
+                        <i :class="nav.icon"></i>
+                        <span slot="title">{{ nav.clmname }}</span>
+                    </el-menu-item>
+                </el-menu>
+            </el-col>
+        </el-row>
+    </div>
+</template>
+<script>
+    import Navs from '../api/Navs';
+    import {
+        ManagerSelfQuery,
+        ShopListQuery
+    } from '../api/getApiRes.js'
+
+    let qs = require('qs');
+    export default {
+        data() {
+            return {
+                isCollapse: document.body.clientWidth < 1366,
+                left_panel_state: true,
+                wildState: 0,
+                navs: [],
+                ShopName: '',
+                userLevelText: '',
+                NavsideClass: 'Navside',
+                userLevel: 0,
+                userLevelDeafult: "",
+            }
+        },
+        // props: ['isCollapse'],
+        mounted() {
+            this.userLevelDeafult = this.$route.meta.clmid;
+            this.getTableQuery();
+            this.getManagerSelfQuery();
+            if (document.body.clientWidth < 1024) {
+                this.NavsideClass = 'NavsideShort'
+            } else {
+                this.NavsideClass = 'Navside'
+            }
+        },
+        watch: {
+            $route(to, from) {
+            },
+        },
+        methods: {
+            //            隐藏左侧和显示
+            left_hide: function () {
+                let that = this;
+                that.left_panel_state = !that.left_panel_state;
+                that.isCollapse = !that.isCollapse;
+                this.$emit('lefthide');
+
+                // if (!that.left_panel_state) {
+                //     this.$emit('left_hide_func');
+                // } else {
+                //     this.$emit('right_hide_func');
+                // }
+            },
+            handleSelect(i, s, t) {
+                // this.$emit('TabsAdd', i);//触发事件
+            },
+            getTableQuery() {
+                // 菜单
+                this.navs = Navs;
+            },
+            getManagerSelfQuery() {
+                let that = this;
+                let param = {
+                    token: localStorage.token,
+                };
+                let postdata = qs.stringify(param);
+                ManagerSelfQuery(postdata).then(res => {
+                    let json = res;
+                    if (json.Code == 0) {
+                        that.userLevelText = json.Rs.Role.Name;
+                        // 1 会员 2 系统 3 店铺 4 教练
+                        switch (parseInt(json.Rs.Role.Id)) {
+                            case 1:
+                                that.userLevel = 1;
+                                break;
+                            case 2:
+                                that.userLevel = 2;
+                                break;
+                            case 3:
+                                that.userLevel = 3;
+                                break;
+                            case 4:
+                                that.userLevel = 4;
+                                break;
+                        }
+                        localStorage.shopId = json.Rs.ShopId;
+                        this.panelSelect(json.Rs.ShopId);
+                    } else {
+                        if (json.Code == 1010) {
+                            that.$message.error(json.Memo + ' 错误码:' + json.Code);
+                            that.$router.push({ path: '/login', query: { status: 1 } });
+                            return false
+                        } else {
+                            that.$message.error(json.Memo + ' 错误码:' + json.Code);
+                        }
+                    }
+                })
+            },
+            // 获取所属店铺
+            panelSelect(ShopId) {
+                let that = this;
+                let param = {
+                    token: localStorage.token,
+                };
+                let postdata = qs.stringify(param);
+                ShopListQuery(postdata).then(res => {
+                    let json = res;
+                    if (json.Code == 0) {
+                        json.Rs.map(function (item) {
+                            if (item.ShopID == ShopId) {
+                                that.ShopName = item.ShopName;
+                            }
+                        })
+                    } else {
+                        that.$message.error(json.Memo + ' 错误码:' + json.Code);
+                    }
+                })
+            },
+            handleOpen(key, keyPath) {
+                // console.log(key, keyPath);
+            },
+            handleClose(key, keyPath) {
+                // console.log(key, keyPath);
+            },
+        },
+    }
+</script>
+<style scoped>
+    /*注释*/
+    .Navside {
+        width: 100%;
+        /* height: 910px; */
+        height: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        overflow-y: scroll;
+        /*overflow-y: hidden;*/
+        background-color: #fff;
+        z-index: 4444;
+    }
+
+    .NavsideShort {
+        width: 100%;
+        height: 100%;
+        /*height: 710px;*/
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        /*overflow-y: scroll;*/
+        overflow-y: scroll;
+        background-color: #fff;
+        z-index: 4444;
+    }
+
+    .Navside::-webkit-scrollbar {
+        /*滚动条整体样式*/
+
+        width: 3px;
+        /*高宽分别对应横竖滚动条的尺寸*/
+
+        height: 1px;
+    }
+
+    .Navside::-webkit-scrollbar-thumb {
+        /*滚动条里面小方块*/
+
+        border-radius: 3px;
+
+        -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
+
+        background: #f5f5f5;
+    }
+
+    .Navside::-webkit-scrollbar-track {
+        /*滚动条里面轨道*/
+
+        -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
+
+        border-radius: 3px;
+
+        background: #f5f5f5;
+    }
+
+    .NavsideShort::-webkit-scrollbar {
+        /*滚动条整体样式*/
+
+        width: 3px;
+        /*高宽分别对应横竖滚动条的尺寸*/
+
+        height: 1px;
+    }
+
+    .NavsideShort::-webkit-scrollbar-thumb {
+        /*滚动条里面小方块*/
+
+        border-radius: 3px;
+
+        -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
+
+        background: #f5f5f5;
+    }
+
+    .NavsideShort::-webkit-scrollbar-track {
+        /*滚动条里面轨道*/
+
+        -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
+
+        border-radius: 3px;
+
+        background: #f5f5f5;
+    }
+
+    .logoContainer {
+        width: 256px;
+        height: 72px;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        background: #3799ff;
+    }
+
+    .logoContainer img {
+        width: 100%;
+        height: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        margin-top: 1px;
+    }
+
+    .userContainer {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        margin-bottom: 16px;
+        padding-top: 19px;
+        padding-bottom: 19px;
+        border-bottom: 1px solid #f0f2f5;
+        background: #fff;
+    }
+
+    .userContainer img {
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        margin-bottom: 16px;
+    }
+
+    .userContainer span {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        color: #565656;
+        font-size: 16px;
+    }
+
+    .userContainer em {
+        width: 125px;
+        height: 26px;
+        line-height: 26px;
+        text-align: center;
+        color: #fff;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        background: #e75296;
+        border-radius: 250px;
+        font-style: normal;
+        margin-top: 8px;
+        font-size: 16px;
+    }
+
+    /deep/ .el-menu {
+        border: none;
+    }
+
+    /deep/ .el-menu-item {}
+
+    /deep/ .el-menu-item span {
+        text-align: left;
+        float: left;
+        margin-left: 70px;
+    }
+
+    /deep/ .el-menu-item.is-active {
+        background-color: #3799ff !important;
+        color: #fff !important;
+    }
+
+    /deep/ .el-menu-item:hover {
+        background-color: #3799ff !important;
+        color: #fff !important;
+    }
+
+    /deep/ .el-menu-item:hover i {
+        color: #fff !important;
+    }
+
+    /deep/ .el-menu-item i {
+        position: inherit;
+        float: left;
+        line-height: 25px;
+        margin-top: 15px;
+        left: 60px;
+    }
+
+    @media (min-width: 960px) and (max-width: 1367px) {
+        .left_hide_icon {
+            width: 20px;
+            height: 20px;
+            margin-top: 8px;
+            float: left;
+            margin-left: 10px;
+            cursor: pointer;
+            color: #badcff;
+            font-size: 22px;
+            /*background: url("../assets/img/header/right.png")top center no-repeat;*/
+        }
+
+        /*.left_hide_icon:hover {*/
+        /*    background: #ccc;*/
+        /*    color: #fff;*/
+        /*}*/
+
+        .left_show_icon {
+            width: 20px;
+            height: 20px;
+            margin-top: 8px;
+            float: left;
+            margin-left: 10px;
+            cursor: pointer;
+            color: #badcff;
+            font-size: 22px;
+            /*background: url("../assets/img/header/left.png")top center no-repeat;*/
+        }
+
+        .logoContainer {
+            height: 40px;
+        }
+
+        .el-container.is-vertical {
+            left: 60px;
+        }
+
+        .el-menu-item span {
+            text-align: left;
+            float: left;
+            margin-left: 5px;
+            line-height: 20px;
+            font-size: 12px;
+            height: 30px;
+            line-height: 30px;
+        }
+
+        .userContainer em {
+            width: 100%;
+            overflow: hidden;
+            display: block;
+            margin: 0 auto;
+            font-size: 12px;
+        }
+
+        .el-menu-item {
+            padding: 0 !important;
+            margin: 0;
+        }
+
+        /deep/ .el-tooltip {
+            padding: 0 !important;
+        }
+
+        .userContainer span {
+            font-size: 12px;
+        }
+
+        .el-menu-item,
+        .el-submenu__title {
+            height: 30px;
+            line-height: 30px;
+        }
+
+        .userContainer img {
+            display: none;
+        }
+
+        /deep/ .el-tooltip i {
+            float: left;
+            left: 10px;
+            line-height: 30px;
+        }
+
+        /deep/ .el-menu-item i {
+            position: inherit;
+            float: left;
+            margin-top: 3px;
+            left: 10px;
+        }
+    }
+</style>

+ 295 - 0
src/components/Radar.vue

@@ -0,0 +1,295 @@
+<template>
+    <div class="container">
+        <div class="animete-box">
+            <div class="animete-boy animete-1 animated heartBeat"></div>
+            <div class="animete-girl animete-2 animated heartBeat"></div>
+            <div class="dot"></div>
+            <div class="pulse"></div>
+            <div class="pulse2"></div>
+            <div class="pulse3"></div>
+        </div>
+    </div>
+</template>
+
+<script>
+    export default {
+        name: "Radar"
+    }
+</script>
+
+<style scoped>
+    html{
+        background: #fff;
+        background-size:7.5rem auto;
+        -webkit-overflow-scrolling: touch;
+        min-height: 100vh;
+    }
+    body{
+        background: #fff;
+        background-size:cover;
+        max-width: 8rem;
+        -webkit-overflow-scrolling: touch;
+        margin: 0 auto;
+        min-height: 100vh;
+    }
+    .animete-box{
+        width: 200px;
+        height: 200px;
+        position: absolute;
+        left: 50%;
+        top: 50%;
+        transform: translate(-50%, -50%);
+        border-radius: 50%;
+    }
+    .container {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+    }
+    /*css3波纹*/
+    .wrap__uc-waves{overflow:hidden;height:1rem;width:100%;position:absolute;bottom:0;}
+    .wrap__uc-waves .wave{width:15rem; transform-origin:center bottom; position:absolute;left:0;bottom:0;}
+    .wrap__uc-waves .w1{
+        background-size:cover; height:.5rem; animation:anim_wave 5s linear infinite;}
+    .wrap__uc-waves .w2{
+        background-size:cover; height:.7rem; animation:anim_wave 6s linear infinite;}
+    @keyframes anim_wave {
+        0% {
+            transform: translateX(0) translateZ(0) scaleY(1)
+        }
+        50% {
+            transform: translateX(-25%) translateZ(0) scaleY(0.55)
+        }
+        100% {
+            transform: translateX(-50%) translateZ(0) scaleY(1)
+        }
+    }
+
+
+    .animete-box:before {
+        content: ' ';
+        display: block;
+        position: absolute;
+        width: 100%;
+        height: 100%;
+        border-radius: 50%;
+    }
+    .animete-box:after {
+        content: ' ';
+        display: block;
+        background-image: linear-gradient(44deg, rgba(0, 255, 51, 0) 50%, green 100%);
+        width: 50%;
+        height: 50%;
+        position: absolute;
+        top: 5px;
+        left: 5px;
+        animation: radar-beam 5s infinite;
+        animation-timing-function: linear;
+        transform-origin: bottom right;
+        border-radius: 100% 0 0 0;
+    }
+
+
+    @keyframes radar-beam {
+        0% {
+            transform: rotate(0deg);
+        }
+        100% {
+            transform: rotate(360deg);
+        }
+    }
+
+    .animete-boy{
+        width: 5px;
+        height: 5px;
+        background: blue;
+        background-size: 50px 50px;
+        border-radius: 250px;
+    }
+    .animete-girl{
+        width: 5px;
+        height: 5px;
+        background: green;
+        background-size: 50px 50px;
+        border-radius: 250px;
+    }
+
+    .animete-1{
+        position: absolute;
+        left: 100px;
+        top: 50px;
+        z-index: 3;
+    }
+    .animete-2{
+        position: absolute;
+        left: 200px;
+        top: 10px;
+        z-index: 3;
+    }
+    .animete-3{
+        position: absolute;
+        left: 300px;
+        top: 300px;
+        z-index: 3;
+    }
+    .animete-4{
+        position: absolute;
+        left: 280px;
+        top: 120px;
+        z-index: 3;
+    }
+    .animete-5{
+        position: absolute;
+        left: 250px;
+        top: 180px;
+        z-index: 3;
+    }
+
+    @keyframes heartBeat {
+        0% {
+            -webkit-transform: scale(1);
+            transform: scale(1);
+        }
+
+        14% {
+            -webkit-transform: scale(1.5);
+            transform: scale(1.5);
+        }
+
+        22% {
+            -webkit-transform: scale(1.2);
+            transform: scale(1.2);
+        }
+
+
+        28% {
+            -webkit-transform: scale(1);
+            transform: scale(1);
+        }
+
+        42% {
+            -webkit-transform: scale(1.2);
+            transform: scale(1.2);
+        }
+
+        54% {
+            -webkit-transform: scale(1.0);
+            transform: scale(1.0);
+        }
+
+        60%{
+            -webkit-transform: scale(1.1);
+            transform: scale(1.1);
+        }
+
+        80%{
+            -webkit-transform: scale(1);
+            transform: scale(1);
+        }
+    }
+
+    .heartBeat {
+        -webkit-animation-name: heartBeat;
+        animation-name: heartBeat;
+        -webkit-animation-duration: 3s;
+        animation-duration: 3s;
+        -webkit-animation-timing-function: ease;
+        animation-timing-function: ease;
+    }
+
+    .animated {
+        -webkit-animation-duration: 1s;
+        animation-duration: 1s;
+        -webkit-animation-fill-mode: both;
+        animation-fill-mode: both;
+    }
+
+
+    @keyframes warn {
+        0% {
+            transform: scale(0);
+            opacity: 0.0;
+        }
+        25% {
+            transform: scale(0.25);
+            opacity: 0.1;
+        }
+        50% {
+            transform: scale(0.5);
+            opacity: 0.3;
+        }
+        75% {
+            transform: scale(0.75);
+            opacity: 0.5;
+        }
+        100% {
+            transform: scale(1);
+            opacity: 0.0;
+        }
+    }
+    /* 保持大小不变的小圆圈  */
+    .dot {
+        position: absolute;
+        background: #e20000;
+        width: 5px;
+        height: 5px;
+        left: 50%;
+        top: 50%;
+        border-radius: 10px;
+        z-index: 2;
+    }
+    /* 产生动画(向外扩散变大)的圆圈  */
+    .pulse {
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        left: 50%;
+        top: 50%;
+        margin-top: -100px;
+        margin-left: -100px;
+        border: 3px solid green;
+        box-shadow: 0px 0px 20px green inset;
+        border-radius: 150px;
+        z-index: 1;
+        opacity: 0;
+        animation: warn 1.8s linear;
+        animation-iteration-count: infinite!important;
+    }
+
+    .pulse2 {
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        left: 50%;
+        top: 50%;
+        margin-top: -100px;
+        margin-left: -100px;
+        border: 3px solid green;
+        box-shadow: 0px 0px 20px green inset;
+        border-radius: 150px;
+        z-index: 1;
+        opacity: 0;
+        animation: warn 1.8s linear;
+        animation-delay:0.6s;
+        animation-iteration-count: infinite!important;
+    }
+
+    .pulse3 {
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        left: 50%;
+        top: 50%;
+        margin-top: -100px;
+        margin-left: -100px;
+        border: 3px solid green;
+        box-shadow: 0px 0px 20px green inset;
+        border-radius: 150px;
+        z-index: 1;
+        opacity: 0;
+        animation: warn 1.8s linear;
+        animation-delay:0.3s;
+        animation-iteration-count: infinite!important;
+    }
+</style>

+ 57 - 0
src/components/Ring.vue

@@ -0,0 +1,57 @@
+<template>
+        <div class="container">
+            <div style="display: inline; float: left; width: 50%; border: #3b4151 solid 1px">
+                <ve-ring :data="chartData" :extend="chartExtend"></ve-ring>
+            </div>
+        </div>
+</template>
+
+<script>
+    export default {
+        data() {
+            return {
+                days: 13,
+                chartData: {
+                    columns: ['日期', '访问用户'],
+                    rows: [
+                        {'日期': '1/1', '访问用户': 1393},
+                        {'日期': '1/2', '访问用户': 3342},
+                        {'日期': '1/3', '访问用户': 1543},
+                        {'日期': '1/4', '访问用户': 2236}
+                    ]
+                },
+                chartExtend:{
+                    color:['#4ad2ff','#ad1453','#333333','#ffffff']
+                }
+            }
+        },
+        mounted() {
+            let that = this;
+            this.timer = setInterval(() => {
+                that.getDate();
+            }, 3300);
+        },
+        methods: {
+            getDate() {
+                let that = this;
+                let newDate1 = that.getRandomInt(1000, 25000);
+                let newDate2 = that.getRandomInt(1000, 2500);
+                let newDate3 = that.getRandomInt(1000, 2500);
+                let newDate4 = that.getRandomInt(1000, 2500);
+                this.chartData.rows = [
+                    {'日期': '1/1', '访问用户': newDate1},
+                    {'日期': '1/2', '访问用户': 2000},
+                    {'日期': '1/3', '访问用户': 2000},
+                    {'日期': '1/4', '访问用户': 2000}
+                ]
+            },
+            getRandomInt(min, max) {
+                return Math.floor(Math.random() * (max - min + 1)) + min;
+            }
+        },
+    }
+</script>
+
+<style scoped>
+
+</style>

+ 70 - 0
src/components/Sankey.vue

@@ -0,0 +1,70 @@
+<template>
+        <div class="container">
+            <div style="display: inline; float: left; width: 50%; border: #3b4151 solid 1px">
+                <ve-sankey :data="chartData" :settings="chartSettings"></ve-sankey>
+            </div>
+        </div>
+</template>
+
+<script>
+    export default {
+        data() {
+            this.chartSettings = {
+                links: [
+                    { source: '首页', target: '列表页a', value: 0.5 },
+                    { source: '首页', target: '列表页b', value: 0.5 },
+                    { source: '列表页a', target: '内容页a-1', value: 0.1 },
+                    { source: '列表页a', target: '内容页a-2', value: 0.4 },
+                    { source: '列表页b', target: '内容页b-1', value: 0.2 },
+                    { source: '列表页b', target: '内容页b-2', value: 0.3 }
+                ]
+            }
+            return {
+                days: 13,
+                chartData: {
+                    columns: ['页面', '访问量'],
+                    rows: [
+                        { '页面': '首页', '访问量': 100000 },
+                        { '页面': '列表页a', '访问量': 20000 },
+                        { '页面': '列表页b', '访问量': 80000 },
+                        { '页面': '内容页a-1', '访问量': 10000 },
+                        { '页面': '内容页a-2', '访问量': 10000 },
+                        { '页面': '内容页b-1', '访问量': 60000 },
+                        { '页面': '内容页b-2', '访问量': 20000 }
+                    ]
+                },
+                chartExtend:{
+                    color:['#4ad2ff','#ad1453','#333333','#ffffff']
+                }
+            }
+        },
+        mounted() {
+            let that = this;
+            this.timer = setInterval(() => {
+                that.getDate();
+            }, 3300);
+        },
+        methods: {
+            getDate() {
+                let that = this;
+                let newDate1 = that.getRandomInt(1000, 25000);
+                let newDate2 = that.getRandomInt(1000, 2500);
+                let newDate3 = that.getRandomInt(1000, 2500);
+                let newDate4 = that.getRandomInt(1000, 2500);
+                // this.chartData.rows = [
+                //     {'日期': '1/1', '访问用户': newDate1},
+                //     {'日期': '1/2', '访问用户': 2000},
+                //     {'日期': '1/3', '访问用户': 2000},
+                //     {'日期': '1/4', '访问用户': 2000}
+                // ]
+            },
+            getRandomInt(min, max) {
+                return Math.floor(Math.random() * (max - min + 1)) + min;
+            }
+        },
+    }
+</script>
+
+<style scoped>
+
+</style>

+ 69 - 0
src/components/Tabs.vue

@@ -0,0 +1,69 @@
+<template>
+    <div class="tabsContainer">
+        <el-tabs v-model="editableTabsValue" type="card" closable @tab-remove="removeTab">
+            <el-tab-pane
+                    v-for="(item, index) in handleTabsList"
+                    :key="item.name"
+                    :label="item.title"
+                    :name="item.name"
+            >
+            </el-tab-pane>
+        </el-tabs>
+    </div>
+</template>
+
+<script>
+    export default {
+        data() {
+            return {
+                tabIndex: 1,
+            }
+        },
+        props: ['handleTabsList','editableTabsValue'],
+        methods: {
+            navOpen: function (data) {
+                let that = this;
+                that.$router.push({path: data.clmurl});
+            },
+            addTab(targetName) {
+                let newTabName = ++this.tabIndex + '';
+                this.editableTabs.push({
+                    title: '系统首页',
+                    name: newTabName,
+                    content: 'New Tab content'
+                });
+                this.editableTabsValue = newTabName;
+            },
+            removeTab(targetName) {
+                let tabs = this.editableTabs;
+                let activeName = this.editableTabsValue;
+                if (activeName === targetName) {
+                    tabs.forEach((tab, index) => {
+                        if (tab.name === targetName) {
+                            let nextTab = tabs[index + 1] || tabs[index - 1];
+                            if (nextTab) {
+                                activeName = nextTab.name;
+                            }
+                        }
+                    });
+                }
+                this.editableTabsValue = activeName;
+                this.editableTabs = tabs.filter(tab => tab.name !== targetName);
+            }
+        }
+    }
+</script>
+
+<style scoped>
+    .tabsContainer {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+
+    }
+
+   .tabsContainer >>> .el-tabs__header {
+        padding-left: 15px;
+    }
+</style>

+ 294 - 0
src/components/cropper.vue

@@ -0,0 +1,294 @@
+<template>
+  <div class="custom-upload">
+    <el-dialog
+        title="图片裁剪"
+        :visible.sync="showCropper"
+        width="50%"
+        height="600"
+        class="cropper-dialog"
+        center
+        append-to-body
+    >
+      <vue-cropper
+          v-if="showCropper"
+          id="corpper"
+          ref="cropper"
+          :class="{'corpper-warp':showCropper}"
+          v-bind="cropper"
+      />
+      <div v-if="showCropper" class="cropper-button">
+        <el-button class="cancel-btn" size="small" @click.native="showCropper=false">取消</el-button>
+        <el-button size="small" type="primary" :loading="loading" @click="uploadCover">完成</el-button>
+      </div>
+    </el-dialog>
+    <input
+        :id="id"
+        type="file"
+        style="display: none"
+        name="single"
+        accept="image/*"
+        @change="onChange($event)"
+    />
+
+    <el-button size="small" type="primary" :loading="loading" @click="handleOpenFile()">
+      <i class="fa fa-upload"/>
+      {{ buttonName }}
+    </el-button>
+    <div v-if="tips" class="tips clear-margin-top">{{ tips }}</div>
+  </div>
+</template>
+
+<script>
+import * as qiniu from 'qiniu-js';
+// 上传文件组件
+import {VueCropper} from 'vue-cropper'
+
+// 定义的接口根据自己项目更换
+// import {uploadImage} from '@/api/upload'
+
+import {isImageFile, isMaxFileSize, readFile} from '@/utils/upload'   // 见下文
+let qs = require('qs');
+export default {
+  components: {
+    VueCropper
+  },
+  props: {
+    // 最大上传文件的大小
+    maxFileSize: {
+      type: Number,
+      default: 50 // (MB)
+    },
+    // 按钮文字
+    buttonName: {
+      type: String,
+      default: '添加图片'
+    },
+    // 提示内容
+    tips: {
+      type: String
+    },
+    // 图片裁剪比列
+    fixedNumber: {
+      type: Array,
+      default: function () {
+        return []
+      }
+    },
+    // 图片文件分辨率的宽度
+    width: {
+      type: Number,
+      default: 460
+    },
+    // 图片文件分辨率的高度
+    height: {
+      type: Number,
+      default: 300
+    }
+  },
+  data() {
+    return {
+      imageUrl: '',
+      token: {},
+      // 七牛云的上传地址,根据自己所在地区选择,我这里是华南区
+      // domain: 'https://up-z1.qiniup.com',
+      // 这是七牛云空间的外链默认域名
+      // qiniuaddr: 'qjzpcd34v.hb-bkt.clouddn.com',
+      // domain: 'https://up-z1.qiniup.com', // 这是七牛云空间的外链默认域名
+      domain: 'https://up-z1.qiniup.com', // 这是七牛云空间的外链默认域名
+      qiniuaddr: 'xhead.beswell.com',//xhead.beswell.com 旧的 qjzpcd34v.hb-bkt.clouddn.com
+      id: 'cropper-input-' + +new Date(),
+      loading: false,
+      showCropper: false,
+      cropper: {
+        img: '',
+        info: true,
+        size: 0.9,
+        outputType: 'png',
+        canScale: true,
+        autoCrop: true,
+        full: true,
+        // 只有自动截图开启 宽度高度才生效
+        autoCropWidth: this.width,
+        autoCropHeight: this.height,
+        fixedBox: false,
+        // 开启宽度和高度比例
+        fixed: true,
+        fixedNumber: this.fixedNumber,
+        canMoveBox: true,
+        canMove: true,
+        outputSize: 1, // 裁剪生成图片的质量
+        outputType: 'png', // 裁剪生成图片的格式
+        full: true, // 是否输出原图比例的截图
+        info: true, // 图片大小信息
+        canScale: true, // 图片是否允许滚轮缩放
+        autoCrop: true, // 是否默认生成截图框
+        autoCropWidth: 200, // 默认生成截图框宽度
+        autoCropHeight: 200, // 默认生成截图框高度
+        canMove: true, // 上传图片是否可以移动
+        fixedBox: true, // 固定截图框大小 不允许改变
+        fixed: false, // 是否开启截图框宽高固定比例
+        canMoveBox: true, // 截图框能否拖动
+        original: false, // 上传图片按照原始比例渲染
+        centerBox: false, // 截图框是否被限制在图片里面
+        height: true,
+        infoTrue: false, // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
+        enlarge: 1, // 图片根据截图框输出比例倍数
+        mode: 'container', // 图片默认渲染方式
+        maxImgSize: 375 // 限制图片最大宽度和高度
+      }
+    }
+  },
+  methods: {
+    // 打开文件
+    handleOpenFile() {
+      const input = document.getElementById(this.id)
+      // 解决同一个文件不能监听的问题
+      input.addEventListener(
+          'click',
+          function () {
+            this.value = ''
+          },
+          false
+      )
+      // 点击input
+      input.click()
+    },
+
+    // 裁剪input 监听1
+    async onChange(e) {
+      let file = e.target.files[0];
+      console.log(file);
+      if (!file) {
+        console.log('选择图片失败');
+        return false
+      }
+      // 验证文件类型
+      if (!isImageFile(file)) {
+        return
+      }
+      try {
+        // 读取文件
+        const src = await readFile(file)
+        this.showCropper = true
+        this.cropper.img = src
+      } catch (error) {
+        console.log(error)
+      }
+    },
+
+    // 封面上传功能
+    uploadCover() {
+      this.$refs.cropper.getCropBlob(async imgRes => {
+        try {
+          // 文件大小限制
+          if (!isMaxFileSize(imgRes, this.maxFileSize)) {
+            return
+          }
+          this.loading = true
+          // this.$emit('subUploadSucceed', url);
+          console.log(imgRes);
+          // 上传图片
+          this.upqiniu(imgRes);
+          this.loading = false
+          this.showCropper = false
+        } catch (error) {
+          this.loading = false
+          this.showCropper = false
+          console.log(error);
+        }
+      })
+    },
+    // 上传文件到七牛云
+    upqiniu(req) {
+      const config = {
+        headers: {'Content-Type': 'multipart/form-data'}
+      };
+      let filetype = 'jpg';
+      // 重命名要上传的文件
+      const keyname = 'GoAllOut' + new Date().valueOf() + Math.floor(Math.random() * 100) + '.' + filetype;
+      // 从后端获取上传凭证token
+      let param = {
+        token: localStorage.token,
+        // token: 'd6398fe970cc64475cfce4041bb327cf',
+      };
+      let postdata = qs.stringify(param);
+      // this.axios.post('http://xfeilong.iyoogo.com:85/v1/QiNiu/GetSimpleQiNiuTokenByCross', postdata).then(res => {
+      this.axios.post(headapi +'v1/QiNiu/GetSimpleQiNiuToken', postdata).then(res => {
+        const formdata = new FormData();
+        console.log(req);
+        formdata.append('file', req);
+        formdata.append('token', res.data.QiNinToken);
+        formdata.append('key', keyname);
+        // 获取到凭证之后再将文件上传到七牛云空间
+        this.axios.post(this.domain, formdata, config).then(res => {
+          this.imageUrl = 'http://' + this.qiniuaddr + '/' + res.data.key
+          this.$emit('subUploadSucceed', this.imageUrl)
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+#corpper {
+  width: 90%;
+  height: 400px;
+  margin: 0 auto;
+  background-image: none;
+  background: #fff;
+  z-index: 1002;
+}
+
+.cropper-dialog {
+  height: 800px;
+  text-align: center;
+}
+
+.el-dialog__header {
+  padding-top: 15px;
+}
+
+.el-dialog--center .el-dialog__body {
+  padding-top: 0;
+  padding-bottom: 15px;
+}
+
+.el-dialog {
+  text-align: center;
+}
+
+.cropper-button {
+  z-index: 1003;
+  text-align: center;
+  margin-top: 20px;
+}
+
+.el-button {
+  font-size: 16px;
+  cursor: pointer;
+  text-align: center;
+}
+
+.cancel-btn {
+  color: #373737;
+}
+
+.el-button:last-child {
+  margin-left: 0px;
+}
+
+.cropper-modal {
+  background-color: rgba(0, 0, 0, 0.5) !important;
+}
+
+.custom-upload .tips {
+  margin-top: 10px;
+  color: red;
+  font-size: 12px;
+}
+
+.custom-upload.clear-margin-top {
+  margin-top: 0;
+}
+</style>

+ 245 - 0
src/components/levelIcon.vue

@@ -0,0 +1,245 @@
+<template>
+    <div :class="[{'levelIconTV':true},{'levelIconTest':true},{'levelIcon':true}]">
+        <ul>
+            <li>
+          <span class="cube">
+             <div>
+                  0%-<br>
+            39%
+             </div>
+          </span>
+                <em>激活放松</em>
+            </li>
+            <li>
+          <span class="cube">
+             <div>
+             40%-<br>54%  </div>
+          </span>
+                <em>动态热身</em>
+            </li>
+            <li>
+          <span class="cube">
+             <div>
+             55%-<br>69%  </div>
+          </span>
+                <em>脂肪燃烧</em>
+            </li>
+            <li>
+          <span class="cube">
+             <div>
+             70%-<br>79%  </div>
+          </span>
+                <em>糖分消耗</em>
+            </li>
+            <li>
+          <span class="cube">
+             <div>
+             80%-<br>89%  </div>
+          </span>
+                <em>心肺训练</em>
+            </li>
+            <li>
+          <span class="cube">
+             <div>
+             ≥90%  </div>
+          </span>
+                <em>峰值锻炼</em>
+            </li>
+        </ul>
+    </div>
+</template>
+
+<style scoped>
+    ul, li {
+        list-style: none;
+        margin: 0;
+        padding: 0;
+    }
+
+    .levelIcon {
+        width: 85%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        height: 5rem;
+    }
+
+    .levelIconTest {
+
+    }
+
+    .levelIconTV {
+    }
+
+    .levelIcon ul {
+        width: 90%;
+        height: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0;
+        margin-left: 2%;
+    }
+
+    .levelIcon li {
+        width: 14.666666666667%;
+        height: 100%;
+        float: left;
+        padding-left: 2.4%;
+    }
+
+    .levelIcon li:nth-child(1) {
+        padding-left: 0;
+    }
+
+    .levelIcon li span {
+        width: 5rem;
+        height: 4rem;
+        overflow: hidden;
+        float: left;
+        background: url("../static/img/t1.svg");
+        background-repeat: no-repeat;
+        background-size: 100% 100%;
+        background-position: top center;
+        font-family: vista;
+        font-weight: normal;
+        font-size: 1.2rem;
+        letter-spacing: -0.05em;
+        text-align: center;
+        color: #fff;
+        line-height: 0.4rem;
+    }
+
+    .levelIcon li span div {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        padding-top: 17%;
+    }
+
+    .levelIcon li:nth-child(2) span {
+        background: url("../static/img/t2.svg");
+        background-size: 100% 100%;
+        background-position: top center;
+    }
+
+    .levelIcon li:nth-child(3) span {
+        background: url("../static/img/t3.svg");
+        background-size: 100% 100%;
+        background-position: top center;
+    }
+
+    .levelIcon li:nth-child(4) span {
+        background: url("../static/img/t4.svg");
+        background-size: 100% 100%;
+        background-position: top center;
+    }
+
+    .levelIcon li:nth-child(5) span {
+        background: url("../static/img/t5.svg");
+        background-size: 100% 100%;
+        background-position: top center;
+    }
+
+    .levelIcon li:nth-child(6) span {
+        background: url("../static/img/t6.svg");
+        background-size: 100% 100%;
+        background-position: top center;
+    }
+
+    .levelIcon li:nth-child(6) span div {
+        margin-top: 13%;
+    }
+
+    .levelIcon li em {
+        float: right;
+        width: 4rem;
+        height: 42px;
+        border-radius: 21px;
+        background: rgba(2, 143, 225, 0.16);
+        border: 1px solid #028fe1;
+        box-shadow: 0px 0px 5px #028fe1;
+        font-family: vista;
+        font-weight: normal;
+        font-size: 24px;
+        text-align: center;
+        color: #fff;
+        font-style: normal;
+        line-height: 42px;
+        margin-top: 15%;
+        margin-left: 1%;
+    }
+
+    .levelIcon li:nth-child(2) em {
+        background: rgba(109, 38, 250, 0.16);
+        border: 1px solid #6d26fa;
+        box-shadow: 0px 0px 5px #6d26fa;
+    }
+
+    .levelIcon li:nth-child(3) em {
+        background: rgba(10, 177, 5, 0.16);
+        border: 1px solid #0ab105;
+        box-shadow: 0px 0px 5px #0ab105;
+
+    }
+
+    .levelIcon li:nth-child(4) em {
+        background: rgba(186, 204, 1, 0.16);
+        border: 1px solid #DFB200;
+        box-shadow: 0px 0px 5px #DFB200;
+    }
+
+    .levelIcon li:nth-child(5) em {
+        background: rgba(234, 136, 19, 0.16);
+        border: 1px solid #ea8813;
+        box-shadow: 0px 0px 5px #ea8813;
+    }
+
+    .levelIcon li:nth-child(6) em {
+        background: rgba(209, 17, 34, 0.16);
+        border: 1px solid #d11122;
+        box-shadow: 0px 0px 5px #d11122;
+    }
+
+    .levelIcon {
+        height: 70px;
+    }
+
+    .levelIcon li span {
+        width: 70px;
+        height: 70px;
+        font-size: 0.2rem;
+    }
+
+    .levelIcon li span div {
+        font-size: 16px;
+        padding-top: 0.19rem;
+        line-height: 22px;
+    }
+
+    .levelIcon ul {
+        width: 98%;
+    }
+
+    .levelIcon li em {
+        width: 45%;
+        height: 30px;
+        line-height: 30px;
+        font-size: 0.2rem;
+        margin-top: 11%;
+        margin-left: 3%;
+        float: left;
+    }
+
+    /*pc part */
+    .levelIcon {
+        padding-top: 10px;
+        padding-bottom: 10px;
+    }
+
+    .levelIcon li span div {
+        padding-top: 15px;
+    }
+
+    /*pc part */
+</style>

+ 35 - 0
src/components/power.vue

@@ -0,0 +1,35 @@
+<template>
+    <div class="powerContainer" v-if="parseInt(curPower) > 0">
+        <img src="../static/img/power/power_full.svg" alt="" v-if="parseInt(curPower) >= 81">
+        <img src="../static/img/power/power_half.svg" alt="" v-if="parseInt(curPower) >= 41 && parseInt(curPower) < 81">
+        <img src="../static/img/power/power_low.svg" alt=""  v-if="parseInt(curPower) >= 21 && parseInt(curPower) < 40">
+        <img src="../static/img/power/power_none.svg" alt="" v-if="parseInt(curPower) <= 20">
+    </div>
+</template>
+
+<script>
+    export default {
+        props: ['curPower'],
+    }
+</script>
+
+<style scoped>
+    .powerContainer {
+        float: right!important;
+        color: #fff;
+        font-size:1rem;
+        width: 3rem!important;
+        overflow: hidden;
+    }
+    .powerContainer img {
+        width:2rem;
+        line-height: 0.3rem;
+    }
+    .powerContainer span {
+        display: inline-block;
+        line-height: 1rem;
+    }
+    .powerContainer em {
+        font-size: 1rem;
+    }
+</style>

+ 188 - 0
src/components/preview.vue

@@ -0,0 +1,188 @@
+<template>
+    <div class="previewContainer">
+        <div class="mainTitle">
+            <h5>
+                {{BigTitle}}
+            </h5>
+            <span>{{smallTitle}}</span>
+        </div>
+        <div class="table">
+            <div class="tableTitle">
+                <span>时间</span>
+                <span>星期一</span>
+                <span>星期二</span>
+                <span>星期三</span>
+                <span>星期四</span>
+                <span>星期五</span>
+                <span>星期六</span>
+                <span>星期日</span>
+            </div>
+            <div class="tableContext">
+                <div class="times">
+                    <span v-for="time in previewDate.SttPlanPreviewTimeList">{{time.BeginStr}}-{{time.EndStr}}</span>
+                    <span v-for="time in previewDate.SttPreviewTimeList">{{time.BeginStr}}-{{time.EndStr}}</span>
+                </div>
+                <!--                1-->
+                <div class="rows" v-for="i in 7">
+                    <em :style="{background:tab.ClassColor}" v-for="tab in previewDate.SttPlanPreviewClassList"
+                        v-if="tab.WeekDay == i">
+                        {{tab.ClassName}}
+                    </em>
+                    <em :style="{background:tab.ClassColor}" v-for="tab in previewDate.SttPreviewClassList"
+                        v-if="tab.WeekDay == i">
+                        {{tab.ClassName}}
+                    </em>
+                </div><!--                2-->
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+    import {
+        ClassListQuery,
+        VipUserListQuery,
+    } from "../api/getApiRes";
+    import Global from '../Global.js'
+
+    let qs = require('qs');
+    export default {
+        data() {
+            return {}
+        },
+        props: ['previewDate','BigTitle','smallTitle'],
+        mounted() {
+        },
+        watch: {
+            // previewDate(val){
+            //     val.SttPlanPreviewClassList.sort((a,b)=>a.ClassIndex-b.ClassIndex);//升序
+            // }
+        },
+    }
+</script>
+
+<style scoped>
+    .mainTitle h5 {
+        font-family: "Source Han Sans CN";
+        font-weight: normal;
+        font-size: 26px;
+        text-align: center;
+        color: #373737;
+        margin: 0;
+    }
+
+    .context {
+        margin: 0;
+        padding: 0;
+    }
+
+    /deep/ .el-dialog__header,
+    /deep/ .el-dialog__body {
+        margin: 0;
+        margin: 0;
+        padding: 0;
+    }
+
+    .table {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+    }
+
+    .mainTitle span {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        font-family: "Source Han Sans CN";
+        font-weight: normal;
+        font-size: 16px;
+        text-align: center;
+        color: #bdbdbd;
+        padding: 3px 0;
+        padding-bottom: 9px;
+    }
+
+    .tableContext {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+    }
+
+    .tableContext .times {
+        width: 112px;
+        text-align: center;
+        font-family: "Source Han Sans CN";
+        font-weight: normal;
+        font-size: 14px;
+        line-height: 40px;
+        color: #545454;
+        float: left;
+        border-right: 1px solid #fff;
+    }
+
+    .times span {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        height:39px;
+        line-height: 39px;
+        background: #82BFFF;
+        border-bottom: 2px solid #fff;
+    }
+
+    .tableTitle {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+    }
+
+    .tableTitle span {
+        width: 112px;
+        height: 45px;
+        line-height: 45px;
+        font-family: "Source Han Sans CN";
+        font-weight: normal;
+        font-size: 12px;
+        text-align: center;
+        color: #222;
+        float: left;
+        background: #F0F2F5;
+        border-right: 1px solid #fff;
+    }
+
+    .rows {
+        width: 112px;
+        height: 100%;
+        overflow: hidden;
+        float: left;
+        border-right: 1px solid #fff;
+    }
+
+    .rows em {
+        width: 112px;
+        height:39px;
+        line-height:39px;
+        font-family: "Source Han Sans CN";
+        font-weight: normal;
+        font-size: 16px;
+        text-align: center;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        border-bottom: 2px solid #fff;
+        background-color: #ccc;
+        font-style: normal;
+    }
+
+    .previewContainer {
+        width: 913px;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+    }
+</style>

+ 280 - 0
src/components/timePart.vue

@@ -0,0 +1,280 @@
+<template>
+    <div class="timePart">
+        <div class="lt">
+            <h5>活动限界 <s>ACTIVE RANGE</s></h5>
+            <P>8:88:88</P>
+            <span>46%</span>
+            <ul>
+                <li>
+                    <em>STOP</em>
+                    <i v-if="i == 1"></i>
+                </li>
+                <li>
+                    <em>SLOW</em>
+                    <i v-if="i == 3"></i>
+                </li>
+                <li>
+                    <em>NORMAL</em>
+                    <i v-if="i == 3"></i>
+                </li>
+                <li>
+                    <em>RACING</em>
+                    <i v-if="i == 4"></i>
+                </li>
+            </ul>
+        </div>
+        <div class="rt">
+            <div class="top">
+                <h5>内部</h5>
+                <s>INTERNAL</s>
+                <i v-if="type==1"></i>
+            </div>
+            <div class="middle">
+                <span>主电源供给</span>
+                <s>MAIN POWER SUPPLE</s>
+            </div>
+            <div class="bottom">
+                <h5>外部</h5>
+                <s>EXTERNAL</s>
+                <i v-if="type==2"></i>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+    export default {
+        data() {
+            return {
+                i: 1,
+                type:1
+            }
+        }
+    }
+</script>
+
+<style scoped>
+
+    @font-face {
+        font-family: UnidreamLED;
+        src: url('../assets/font/UnidreamLED.ttf');
+    }
+
+    ul, li {
+        list-style: none;
+        margin: 0;
+        padding: 0;
+    }
+
+    em, s, i {
+        font-style: normal;
+        text-decoration: none;
+    }
+
+    .timePart {
+        width: 385px;
+        height: 170px;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+
+    }
+
+    .timePart .lt {
+        width: 240px;
+        overflow: hidden;
+
+        float: left;
+    }
+
+    .timePart .rt {
+        width: 140px;
+        overflow: hidden;
+
+        float: right;
+    }
+
+    .timePart .lt h5 {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        font-size: 16px;
+        font-weight: normal;
+        color: #01355B;
+        text-align: left;
+    }
+
+    .timePart .lt s {
+        font-size: 12px;
+    }
+
+    .timePart .lt p {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        font-size: 70px;
+        color: #01355B;
+        text-align: left;
+        font-family: UniDreamLED;
+        letter-spacing:8px;
+    }
+
+    .timePart .lt span {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        font-size: 24px;
+        text-align: right;
+        font-family: UniDreamLED;
+    }
+
+    .timePart .lt ul {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+    }
+
+    .timePart .lt li {
+        width: 23%;
+        height: 25px;
+        background: #01355B;
+        color: #fff;
+        text-align: center;
+        float: left;
+        margin-right: 6px;
+        font-size: 12px;
+        padding-top: 5px;
+        padding-bottom: 5px;
+    }
+
+    .timePart .lt li:nth-child(4) {
+        margin-right: 0;
+    }
+
+    .timePart .lt li i {
+        width: 90%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        margin-top: 5px;
+        height: 5px;
+        background: #fff;
+    }
+
+    .rt .top {
+        width: 100%;
+        height: 50px;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        background: #01355B;
+        color: #fff;
+        padding-top: 3px;
+        padding-bottom: 3px;
+    }
+
+    .rt .top h5 {
+        width: 80px;
+        font-size: 24px;
+        margin: 0;
+        float: left;
+        text-align: left;
+        padding-left: 20px;
+    }
+
+    .rt .top s {
+        float: left;
+        font-size: 12px;
+        text-align: left;
+        padding-left: 20px;
+    }
+
+    .rt .top i {
+        position: relative;
+        top: -20px;
+        right: 10px;
+        float: right;
+        width: 15px;
+        height: 30px;
+        background: aliceblue;
+    }
+
+    .rt .middle {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        margin-top: 6px;
+        margin-bottom: 6px;
+        background: #01355B;
+        color: #fff;
+        padding-top: 3px;
+        padding-bottom: 3px;
+    }
+
+    .middle span {
+        width: 100%;
+        margin: 0 auto;
+        display: block;
+        font-size: 14px;
+        text-align: left;
+        padding-left: 10px;
+    }
+
+    .middle s {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        font-size: 12px;
+    }
+
+    .rt .bottom {
+        width: 100%;
+        height: 50px;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        background: #01355B;
+        color: #fff;
+        padding-top: 3px;
+        padding-bottom: 3px;
+    }
+
+    .rt .bottom h5 {
+        width: 80px;
+        font-size: 24px;
+        margin: 0;
+        float: left;
+        text-align: left;
+        padding-left: 20px;
+    }
+
+    .rt .bottom s {
+        float: left;
+        font-size: 12px;
+        text-align: left;
+        padding-left: 20px;
+    }
+
+    .rt .bottom s {
+        font-size: 12px;
+    }
+
+    .rt .bottom i {
+        position: relative;
+        top: -20px;
+        right: 10px;
+        float: right;
+        width: 15px;
+        height: 30px;
+        background: linear-gradient(135deg,#fff 25%,#005EA2 0,
+        #005EA2 50%,#fff 0,
+        #fff 75%,#005EA2 0);
+        background-size: 12px 12px;
+    }
+</style>

+ 207 - 0
src/components/upHead.vue

@@ -0,0 +1,207 @@
+<template>
+    <div>
+        <!--<div class="upload">-->
+        <!--<el-upload-->
+        <!--class="avatar-uploader"-->
+        <!--:action=domain-->
+        <!--:http-request=upqiniu-->
+        <!--:show-file-list="false"-->
+        <!--:before-upload="beforeUpload">-->
+        <!--<img v-if="imageUrl" :src="imageUrl" class="avatar">-->
+        <!--<i v-else class="el-icon-plus avatar-uploader-icon"></i>-->
+        <!--</el-upload>-->
+        <!--<ImgCutter v-on:cutDown="cutDown"></ImgCutter>-->
+        <!--</div>-->
+        <div class="one-form-item">
+            <el-upload
+                    class="avatar-uploader"
+                    action
+                    :auto-upload="false"
+                    :on-change="uploadFileMethodAnswer"
+                    :show-file-list="false"
+                    :multiple="true"
+                    :before-upload="beforeUpload"
+            >
+                <el-button class="uploader-button" type="primary">上传banner图</el-button>
+            </el-upload>
+        </div>
+
+        <el-dialog title="图片剪裁(为确保剪切后图片的分辨率足够,请尽量不缩放剪切原图)" :visible.sync="dialogVisible" append-to-body width="70%">
+            <div class="cropper-content">
+                <div class="cropper" style="text-align:center">
+                    <vueCropper
+                            ref="cropper"
+                            :img="option.img"
+                            :outputSize="option.size"
+                            :outputType="option.outputType"
+                    ></vueCropper>
+                </div>
+            </div>
+            <div slot="footer" class="dialog-footer">
+                <el-button @click="dialogVisible = false">取 消</el-button>
+                <el-button type="primary" @click="finish" :loading="loading">确认</el-button>
+            </div>
+        </el-dialog>
+
+    </div>
+</template>
+
+<script>
+    import * as qiniu from 'qiniu-js';
+    import ImgCutter from 'vue-img-cutter'
+    import VueCropper from 'vue-cropper'
+    let qs = require('qs');
+    export default {
+        data() {
+            return {
+                imageUrl: '',
+                token: {},
+                // 七牛云的上传地址,根据自己所在地区选择,我这里是华南区
+                // domain: 'https://up-z1.qiniup.com',
+                // 这是七牛云空间的外链默认域名
+                // qiniuaddr: 'qjzpcd34v.hb-bkt.clouddn.com',
+                // domain: 'https://up-z1.qiniup.com', // 这是七牛云空间的外链默认域名
+                domain: 'https://up-z1.qiniup.com', // 这是七牛云空间的外链默认域名
+                qiniuaddr: 'xhead.beswell.com',//xhead.beswell.com 旧的 qjzpcd34v.hb-bkt.clouddn.com
+                option: {
+                    img: "",
+                    outputSize: 1, //剪切后的图片质量(0.1-1)
+                    full: false, //输出原图比例截图 props名full
+                    outputType: "png",
+                    canMove: true,
+                    original: false,
+                    canMoveBox: true,
+                    autoCrop: true,
+                    autoCropWidth: 868,
+                    autoCropHeight: 488,
+                    fixedBox: false,
+                    fixed: true,
+                    maxImgSize: 3000, // 图片最大像素
+                    fixedNumber: [16, 9]
+                },
+                dialogVisible: false,
+                loading: false,
+            };
+        },
+        methods: {
+                finish()
+                {
+                    let _this = this;
+                    this.$refs.cropper.getCropBlob(data => {
+                        let base64Data = null;
+                        let a = new FileReader();
+                        a.onload = function (e) {
+                            base64Data = e.target.result;
+                            _this.loading = true;
+                            const formData = new FormData();
+                            formData.append("imageFile", base64Data);
+                            uploadImg({
+                                formData: formData
+                            })
+                                .then(res => {
+
+                                })
+                                .catch(() => {
+                                    // this.$message.error('图片上传失败!');
+                                });
+                        };
+                        a.readAsDataURL(data);
+                    });
+                }
+            ,
+                uploadFileMethodAnswer()
+                {
+                    this.dialogVisible = true;
+                }
+            ,
+                cutDown(e)
+                {
+                    console.log(e);
+                    this.imageUrl = e.dataURL;
+                    this.upqiniu(e);
+                }
+            ,
+                // 上传文件到七牛云
+                upqiniu(req)
+                {
+                    const config = {
+                        headers: {'Content-Type': 'multipart/form-data'}
+                    };
+                    let filetype = '';
+                    if (req.file.type === 'image/png') {
+                        filetype = 'png'
+                    } else {
+                        filetype = 'jpg'
+                    }
+                    // 重命名要上传的文件
+                    const keyname = 'GoAllOut' + new Date().valueOf() + Math.floor(Math.random() * 100) + '.' + filetype;
+                    // 从后端获取上传凭证token
+                    let param = {
+                        token: localStorage.token,
+                    };
+                    let postdata = qs.stringify(param);
+                    this.axios.post('/api/v1/QiNiu/GetSimpleQiNiuToken', postdata).then(res => {
+                        const formdata = new FormData();
+                        formdata.append('file', req.file);
+                        formdata.append('token', res.data.QiNinToken);
+                        formdata.append('key', keyname);
+                        // 获取到凭证之后再将文件上传到七牛云空间
+                        this.axios.post(this.domain, formdata, config).then(res => {
+                            this.imageUrl = 'http://' + this.qiniuaddr + '/' + res.data.key
+                        })
+                    })
+                }
+            ,
+                // 验证文件合法性
+                beforeUpload(file)
+                {
+                    // const isJPG = file.type === 'image/jpeg' || file.type === 'image/png';
+                    const isLt2M = file.size / 1024 / 1024 < 70;
+                    // if (!isJPG) {
+                    //     this.$message.error('上传头像图片只能是 JPG 格式!')
+                    // }
+                    if (!isLt2M) {
+                        this.$message.error('上传头像图片大小不能超过 70MB!')
+                    }
+                    return isJPG && isLt2M
+                }
+            },
+            components: {
+                ImgCutter, VueCropper
+            }
+        }
+</script>
+
+<style scoped>
+    .cropper-content .cropper {
+        width: auto;
+        height: 500px !important;
+    }
+
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 178px;
+        height: 178px;
+        line-height: 178px;
+        text-align: center;
+    }
+
+    .avatar {
+        width: 178px;
+        height: 178px;
+        display: block;
+    }
+</style>

+ 267 - 0
src/components/userRank.vue

@@ -0,0 +1,267 @@
+<template>
+    <div class="rankContainer">
+        <el-row :gutter="20">
+            <!--卡路里-->
+            <el-col :span="12">
+                <!--          只显示前8个-->
+                <li v-for="(s,i) in students.CalSort" v-if="i <= 7">
+                    <div
+                            :class="['rows',{'row_0':i == 0},{'row_1':i == 1},{'row_2':i == 2},{'row_3':i == 3},{'row_4':i == 4},{'row_5':i == 5},{'row_6':i == 6},{'row_7':i == 7}]">
+                        <div class="head">
+                            <img :src="s.Head" class="headImg" v-if="s.Head">
+                            <img src="../static/img/people/flyhead.png" class="headImg" alt="" v-if="!s.Head">
+                            <img src="../static/img/rank/king1.svg" class="king" alt="" v-if="i == 0">
+                            <img src="../static/img/rank/king2.svg" class="king" alt="" v-if="i == 1">
+                            <img src="../static/img/rank/king3.svg" class="king" alt="" v-if="i == 2">
+                        </div>
+                        <div class="name">
+                            NO.{{ i + 1 }} {{ s.Name }}
+                        </div>
+                        <div class="score">
+                            {{ s.Cle|fmtInt }}
+                            <em>千卡</em>
+                        </div>
+                        <div class="record">
+                            <img src="../static/img/rank/recordIcon.svg" class="king" alt=""
+                                 v-if="s.IsNewUser ==0 && s.IsBreaking == 1">
+                        </div>
+                    </div>
+                </li>
+            </el-col>
+            <!--CK-->
+            <el-col :span="12">
+                <li v-for="(s,i) in students.CkSort" v-if="i <= 7">
+                    <div
+                            :class="['rows',{'row_0':i == 0},{'row_1':i == 1},{'row_2':i == 2},{'row_3':i == 3},{'row_4':i == 4},{'row_5':i == 5},{'row_6':i == 6},{'row_7':i == 7}]">
+                        <div class="head">
+                            <img :src="s.Head" class="headImg" v-if="s.Head">
+                            <img src="../static/img/people/flyhead.png" class="headImg" alt="" v-if="!s.Head">
+                            <img src="../static/img/rank/king1.svg" class="king" alt="" v-if="i == 0">
+                            <img src="../static/img/rank/king2.svg" class="king" alt="" v-if="i == 1">
+                            <img src="../static/img/rank/king3.svg" class="king" alt="" v-if="i == 2">
+                        </div>
+                        <div class="name">
+                            NO.{{ i + 1 }} {{ s.Name }}
+                        </div>
+                        <div class="score">
+                            {{ s.Ck|fmtFloat }}
+                            <em>CK</em>
+                        </div>
+                        <div class="record">
+                            <img src="../static/img/rank/recordIcon.svg" class="king" alt=""
+                                 v-if="s.IsNewUser ==0 && s.IsBreaking == 1">
+                        </div>
+                    </div>
+                </li>
+            </el-col>
+        </el-row>
+    </div>
+</template>
+
+<script>
+    // import {
+    //     ClassUserRank
+    // } from '@/api/getApiRes'
+
+    let qs = require('qs');
+    export default {
+        data() {
+            return {
+                students: {
+                    CkSort: [],
+                    CalSort: [],
+                },
+                rankTimer: null,
+            }
+        },
+        props: ['rankInfo'],
+        watch: {
+            rankInfo: {
+                handler(newName, oldName) {
+                    let that = this;
+                    if (newName) {
+                        // 排序
+                        let CkSort = that.deepClone(newName);
+                        that.students.CkSort = CkSort.sort(function (a, b) {
+                            return b.Ck - a.Ck;
+                        });
+                        let CalSort = that.deepClone(newName);
+                        that.students.CalSort = CalSort.sort(function (a, b) {
+                            return b.Cle - a.Cle;
+                        });
+                    } else {
+                        this.students.CkSort = [];
+                        this.students.CalSort = [];
+                    }
+                },
+                deep: true,
+                immediate: true
+            }
+        },
+        methods:{
+            // 深拷贝
+            deepClone(obj) {
+                let _obj = JSON.stringify(obj),
+                    objClone = JSON.parse(_obj);
+                return objClone
+            }
+    },
+        filters: {
+            fmtNum(val) {
+                if (val == 0) {
+                    return '--'
+                } else {
+                    if (parseInt(val) < 0) return 0;
+                    if (parseInt(val) > 0) return val
+                }
+            },
+            fmtFloat(val) {
+                if (val == 0) {
+                    return '0.0'
+                } else {
+                    return parseFloat(val).toFixed(1);
+                }
+            },
+            fmtInt(val) {
+                if (val == 0) {
+                    return '0'
+                } else {
+                    return parseInt(val);
+                    // return parseFloat(val).toFixed(3);
+                }
+            },
+        },
+    }
+</script>
+
+<style scoped>
+    .rankContainer {
+        width: 100%;
+        overflow: visible;
+        display: block;
+        margin: 0 auto;
+        padding-top: 1rem;
+    }
+
+    li {
+        width: 100%;
+        height: 4rem;
+        display: block;
+        margin: 0 auto;
+        overflow: visible;
+    }
+
+    li .rows {
+        width: 100%;
+        height: 3rem;
+        /*background: #ee191d;*/
+        border-radius: 250rem;
+        overflow: visible;
+        display: block;
+        margin: 0 auto;
+        margin-top: 0.15rem;
+    }
+
+    li .head {
+        width: 3rem;
+        height: 3rem;
+        float: left;
+        margin-left: 0rem;
+        margin-top: 0.15rem;
+        overflow: visible;
+    }
+
+    li .head .headImg {
+        width: 2.8rem;
+        height: 2.8rem;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        border: 2px solid #fff;
+        border-radius: 33rem;
+    }
+
+    li .head .king {
+        position: relative;
+        top: -4rem;
+        left: -0.2rem;
+        width: 2rem;
+        height: 2rem;
+        float: left;
+    }
+
+    li .name {
+        font-weight: normal;
+        font-size: 1.5rem;
+        text-align: left;
+        color: #fff;
+        float: left;
+        margin-left:1rem;
+        line-height: 3rem;
+    }
+
+    li .record {
+        float: right;
+    }
+
+    li .record img {
+        position: relative;
+        top: -0rem;
+        width: 1.2rem;
+    }
+
+    li .score {
+        font-weight: normal;
+        font-size: 1.5rem;
+        color: #fff;
+        float: right;
+        margin-right: 1rem;
+        line-height: 3rem;
+        text-align: right;
+    }
+
+    li .score em {
+        font-size:1rem;
+    }
+
+    .row_0 {
+        background: rgba(238, 25, 29, 0.75);
+    }
+
+    .row_1 {
+        background: rgba(244, 76, 31, 0.75);
+    }
+
+    .row_2 {
+        background: rgba(242, 182, 23, 0.75);
+    }
+
+    .row_3 {
+        background: rgba(112, 238, 21, 0.75);
+    }
+
+    .row_4 {
+        background: rgba(11, 253, 45, 0.75);
+    }
+
+    .row_5 {
+        background: rgba(1, 228, 182, 0.75);
+    }
+
+    .row_6 {
+        background: rgba(0, 207, 230, 0.75);
+    }
+
+    .row_7 {
+        background: rgba(4, 209, 252, 0.75);
+    }
+
+    .tips {
+        position: absolute;
+        right: 3%;
+        top: 1rem;
+        font-size: 0.4rem;
+        color: #fff;
+    }
+
+</style>

+ 19 - 0
src/libs/rem.js

@@ -0,0 +1,19 @@
+// 设置 rem 函数
+function setRem() {
+
+    // 320 默认大小16px; 320px = 20rem ;每个元素px基础上/16
+    let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth;
+
+    //得到html的Dom元素
+    let htmlDom = document.getElementsByTagName('html')[0];
+    //设置根元素字体大小
+    htmlDom.style.fontSize = htmlWidth / 20 + 'px';
+}
+
+// 初始化
+setRem();
+// 改变窗口大小时重新设置 rem
+window.onresize = function () {
+    setRem()
+};
+

+ 36 - 0
src/main.js

@@ -0,0 +1,36 @@
+import Vue from 'vue'
+import './plugins/axios'
+import App from './App.vue'
+import router from './router'
+import store from './store'
+import ElementUI from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+import axios from 'axios'
+
+
+Vue.config.productionTip = false;
+import VCharts from 'v-charts'
+Vue.use(VCharts);
+Vue.use(ElementUI);
+
+let headBpi = 'http://cal.beswell.com:85/';
+if (process.env.NODE_ENV === 'development') {
+    // 显示控制台
+    // let vConsole = new VConsole();
+    // 演示版本数据
+    // require('./Mock/index.js');
+    headBpi = '/bpi/';
+} else {
+    // let vConsole = new VConsole();
+    headBpi = 'http://cal.beswell.com:85/';
+}
+
+// 演示版本数据
+// require('./Mock/index.js');
+
+new Vue({
+    router,
+    store,
+    render: h => h(App)
+}).$mount('#app');
+

+ 61 - 0
src/plugins/axios.js

@@ -0,0 +1,61 @@
+"use strict";
+
+import Vue from 'vue';
+import axios from "axios";
+
+// Full config:  https://github.com/axios/axios#request-config
+// axios.defaults.baseURL = process.env.baseURL || process.env.apiUrl || '';
+// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
+// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+
+let config = {
+  // baseURL: process.env.baseURL || process.env.apiUrl || ""
+  // timeout: 60 * 1000, // Timeout
+  // withCredentials: true, // Check cross-site Access-Control
+};
+
+const _axios = axios.create(config);
+
+_axios.interceptors.request.use(
+  function(config) {
+    // Do something before request is sent
+    return config;
+  },
+  function(error) {
+    // Do something with request error
+    return Promise.reject(error);
+  }
+);
+
+// Add a response interceptor
+_axios.interceptors.response.use(
+  function(response) {
+    // Do something with response data
+    return response;
+  },
+  function(error) {
+    // Do something with response error
+    return Promise.reject(error);
+  }
+);
+
+Plugin.install = function(Vue, options) {
+  Vue.axios = _axios;
+  window.axios = _axios;
+  Object.defineProperties(Vue.prototype, {
+    axios: {
+      get() {
+        return _axios;
+      }
+    },
+    $axios: {
+      get() {
+        return _axios;
+      }
+    },
+  });
+};
+
+Vue.use(Plugin)
+
+export default Plugin;

+ 423 - 0
src/router/index.js

@@ -0,0 +1,423 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+// 加载条
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+
+Vue.use(VueRouter);
+
+const routes = [
+    {
+        path: '/',
+        component: () => import( '../views/Index.vue'),
+        children: [
+            {
+                path: '/',
+                name: 'Main',
+                component: () => import('@/views/Main.vue'),
+                meta: {
+                    title: "首页",
+                    // clmid: "1",
+                }
+            }, {
+                path: '/member',
+                name: 'Member',
+                component: () => import('@/views/Member.vue'),
+                meta: {
+                    title: "会员管理",
+                    // clmid: "2",
+                }
+            },
+            {
+                path: '/tempUser',
+                name: 'tempUser',
+                component: () => import('@/views/tempUser.vue'),
+                meta: {
+                    title: "临时会员",
+                    // clmid: "33",
+                }
+            },{
+                path: '/lesson',
+                name: 'Lesson',
+                component: () => import('@/views/Lesson.vue'),
+                meta: {
+                    title: "课程模板",
+                    // clmid: "3",
+                }
+            }, {
+                path: '/lessonTable',
+                name: 'lessonTable',
+                component: () => import('@/views/LessonTable.vue'),
+                meta: {
+                    title: "课程表模板",
+                    // clmid: "4",
+                }
+            }, {
+                path: '/editLessonTable',
+                name: 'EditLessonTable',
+                component: () => import('@/views/EditLessonTable.vue'),
+                meta: {
+                    title: "编辑课程表模板",
+                    // clmid: "4",
+                }
+            }, {
+                path: '/editLessonManage',
+                name: 'EditLessonManage',
+                component: () => import('@/views/EditLessonManage.vue'),
+                meta: {
+                    title: "编辑课程表",
+                    // clmid: "5",
+                }
+            }, {
+                path: '/adminManage',
+                name: 'AdminManage',
+                component: () => import('@/views/AdminManage.vue'),
+                meta: {
+                    title: "管理员管理",
+                    // clmid: "13",
+                }
+            }, {
+                path: '/log',
+                name: 'Log',
+                component: () => import('@/views/Log.vue'),
+                meta: {
+                    title: "操作日志",
+                    // clmid: "14",
+                }
+            }, {
+                path: '/demoDevice',
+                name: 'demoDevice',
+                component: () => import('@/views/demoDevice.vue'),
+                meta: {
+                    title: "演示设备",
+                    // clmid: "15",
+                }
+            }, {
+                path: '/shopManage',
+                name: 'ShopManage',
+                component: () => import('@/views/ShopManage.vue'),
+                meta: {
+                    title: "店面管理",
+                    // clmid: "12",
+                }
+            }, {
+                path: '/adminSetting',
+                name: 'AdminSetting',
+                component: () => import('@/views/AdminSetting.vue'),
+                meta: {
+                    title: "系统设置",
+                    // clmid: "22",
+                }
+            }, {
+                path: '/lessonManage',
+                name: 'lessonManage',
+                component: () => import('@/views/lessonManage.vue'),
+                meta: {
+                    title: "课程表管理",
+                    // clmid: "5",
+                }
+            }, {
+                path: '/coach',
+                name: 'coach',
+                component: () => import('@/views/coach.vue'),
+                meta: {
+                    title: "教练管理",
+                    // clmid: "6",
+                }
+            }, {
+                path: '/appoint',
+                name: 'appoint',
+                component: () => import('@/views/appoint.vue'),
+                meta: {
+                    title: "预约管理",
+                    // clmid: "7",
+                }
+            }, {
+                path: '/record',
+                name: 'record',
+                component: () => import('@/views/record.vue'),
+                meta: {
+                    title: "预约记录",
+                    // clmid: "8",
+                }
+            }, {
+                path: '/cost',
+                name: 'cost',
+                component: () => import('@/views/cost.vue'),
+                meta: {
+                    title: "消费记录",
+                    // clmid: "9",
+                }
+            }, {
+                path: '/ratingManage',
+                name: 'ratingManage',
+                component: () => import('@/views/ActionGroups.vue'),
+                meta: {
+                    title: "动作分组",
+                    // clmid: "9",
+                }
+            },{
+                path: '/actionExercise',
+                name: 'actionExercise',
+                component: () => import('@/views/ActionExercise.vue'),
+                meta: {
+                    title: "锻炼动作",
+                    // clmid: "9",
+                }
+            },{
+                path: '/actionManage',
+                name: 'actionManage',
+                component: () => import('@/views/ActionManage.vue'),
+                meta: {
+                    title: "动作管理",
+                    // clmid: "9",
+                }
+            },{
+                path: '/actionGroupManage',
+                name: 'actionGroupManage',
+                component: () => import('@/views/ActionGroupManage.vue'),
+                meta: {
+                    title: "动作管理",
+                    // clmid: "9",
+                }
+            },{
+                path: '/bodyNode',
+                name: 'bodyNode',
+                component: () => import('@/views/BodyNode.vue'),
+                meta: {
+                    title: "身体节点",
+                    // clmid: "9",
+                }
+            },{
+                path: '/actionScore',
+                name: 'actionScore',
+                component: () => import('@/views/ActionScore.vue'),
+                meta: {
+                    title: "动作评分",
+                    // clmid: "9",
+                }
+            },{
+                path: '/scoreResult',
+                name: 'scoreResult',
+                component: () => import('@/views/ScoreResult.vue'),
+                meta: {
+                    title: "评分结果",
+                    // clmid: "9",
+                }
+            },{
+                path: '/setting',
+                name: 'setting',
+                component: () => import('@/views/setting.vue'),
+                meta: {
+                    title: "系统设置",
+                    // clmid: "22",
+                }
+            }, {
+                path: '/finish',
+                name: 'finish',
+                component: () => import('@/views/finish.vue'),
+                meta: {
+                    title: "下课管理",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/finishDetail',
+                name: 'finishDetail',
+                component: () => import('@/views/finishDetail.vue'),
+                meta: {
+                    title: "下课管理",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/courses',
+                name: 'courses',
+                component: () => import('@/views/courses.vue'),
+                meta: {
+                    title: "课程管理",
+                    // clmid: "10",
+                }
+            },{
+                path: '/coursesHistory',
+                name: 'coursesHistory',
+                component: () => import('@/views/coursesHistory.vue'),
+                meta: {
+                    title: "课程管理 历史记录",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/classPrepare',
+                name: 'classPrepare',
+                component: () => import('@/views/classPrepare.vue'),
+                meta: {
+                    title: "准备上课",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/classInfoDetail',
+                name: 'classInfoDetail',
+                component: () => import('@/views/classInfoDetail.vue'),
+                meta: {
+                    title: "课程成绩",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/courseEdit',
+                name: 'courseEdit',
+                component: () => import('@/views/courseEdit.vue'),
+                meta: {
+                    title: "课程管理",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/heartEquip',
+                name: 'heartEquip',
+                component: () => import('@/views/heartEquip.vue'),
+                meta: {
+                    title: "心率设备",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/heartEquipPerson',
+                name: 'heartEquipPerson',
+                component: () => import('@/views/heartEquipPerson.vue'),
+                meta: {
+                    title: "私有心率设备",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/heartLog',
+                name: 'heartLog',
+                component: () => import('@/views/heartLog.vue'),
+                meta: {
+                    title: "设备记录",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/bindRecord',
+                name: 'bindRecord',
+                component: () => import('@/views/bindRecord.vue'),
+                meta: {
+                    title: "绑定记录",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/region',
+                name: 'region',
+                component: () => import('@/views/region.vue'),
+                meta: {
+                    title: "区域管理",
+                    // clmid: "10",
+                }
+            },{
+                path: '/test',
+                name: 'Test',
+                component: () => import('@/views/Test.vue'),
+                meta: {
+                    title: "test",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/regionEquip',
+                name: 'regionEquip',
+                component: () => import('@/views/regionEquip.vue'),
+                meta: {
+                    title: "区域设备",
+                    // clmid: "10",
+                }
+            }, {
+                path: '/relevancePhone',
+                name: 'relevancePhone',
+                component: () => import('@/views/relevancePhone.vue'),
+                meta: {
+                    title: "关联手机",
+                    // clmid: "2",
+                }
+            },{
+                path: '/AcrossVip',
+                name: 'AcrossVip',
+                component: () => import('@/views/AcrossVip.vue'),
+                meta: {
+                    title: "跨店会员",
+                    // clmid: "11",
+                }
+            },{
+                path: '/online',
+                name: 'online',
+                component: () => import('@/views/online.vue'),
+                meta: {
+                    title: "在线上课",
+                    // clmid: "3",
+                }
+            },{
+                path: '/versionControlMefisto',
+                name: 'versionControlMefisto',
+                component: () => import('@/views/versionControlMefisto.vue'),
+                meta: {
+                    title: "app版本控制",
+                    // clmid: "999",
+                }
+            },{
+                path: '/versionControlVideo',
+                name: 'versionControlVideo',
+                component: () => import('@/views/versionControlVideo.vue'),
+                meta: {
+                    title: "视频app版本控制",
+                    // clmid: "999",
+                }
+            },{
+                path: '/classTime',
+                name: 'classTime',
+                component: () => import('@/views/ClassTime.vue'),
+                meta: {
+                    title: "课时管理",
+                    // clmid: "999",
+                }
+            },{
+                path: '/classChange',
+                name: 'classChange',
+                component: () => import('@/views/classChange.vue'),
+                meta: {
+                    title: "课时调整",
+                    // clmid: "999",
+                }
+            },
+        ]
+    }, {
+        path: '/login',
+        name: 'Login',
+        component: () => import( '../views/Login.vue')
+    }, , {
+        path: '*',
+        name: '404',
+        component: () => import( '../views/404.vue')
+    },
+]
+
+const originalPush = VueRouter.prototype.push;
+VueRouter.prototype.push = function push(location) {
+    return originalPush.call(this, location).catch(err => err)
+};
+
+const router = new VueRouter({
+    mode: 'history',
+    base: process.env.BASE_URL,
+    routes
+});
+
+// 路由守卫
+router.beforeEach((to, from, next) => {
+    NProgress.start()
+    const isLogin = localStorage.token ? true : false;
+    if (to.path == '/login' || to.path == '/register') {//'login'和'register'相当于是路由白名单
+        next();
+    } else {
+        //如果token存在,就正常跳转,如果不存在,则说明未登陆,则跳转到'login'
+        isLogin ? next() : next("/login");
+    }
+});
+
+router.afterEach(() => {
+    NProgress.done()
+})
+
+export default router

+ 18 - 0
src/server/app.js

@@ -0,0 +1,18 @@
+// 引入包
+const express = require('express');
+const bodyparse = require('body-parser');
+// 创建服务
+const app = express();
+// 解析数据
+app.use(bodyparse.json());
+// 引入七牛云配置
+const qnconfig = require('./config.js');
+// 处理请求
+app.get('/token', (req, res, next) => {
+    // console.log(qnconfig.uploadToken)
+    res.status(200).send(qnconfig.uploadToken)
+});
+// 监听3000端口
+app.listen(3000, () => {
+    console.log('this server are running on localhost:3000!')
+});

+ 19 - 0
src/server/config.js

@@ -0,0 +1,19 @@
+/*
+七牛云配置
+*/
+const qiniu = require('qiniu');
+
+// 创建上传凭证
+const accessKey = 'JvRT6F0pbWwfTwRZOeYCLcTFBwtE_E0CFp6DZklk';//这里填写七牛云的accessKe
+const secretKey = 'vgYd-QjeAk9v5QrIU1z4427xJi_nao4LCuXgWfgJ';//这里填写七牛云的secretKey
+const mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
+const options = {
+    scope: 'beswell',//这里填写七牛云空间名称
+    expires: 7200
+};
+const putPolicy = new qiniu.rs.PutPolicy(options);
+const uploadToken = putPolicy.uploadToken(mac);
+
+module.exports = {
+    uploadToken
+};

BIN
src/static/img/bg/bg2_1.png


BIN
src/static/img/bg/bg2_2.png


BIN
src/static/img/bg/bg2_3.png


BIN
src/static/img/bg/bg2_4.png


BIN
src/static/img/bg/bg_1.png


BIN
src/static/img/bg/bg_2.png


BIN
src/static/img/bg/bg_3.png


BIN
src/static/img/bg/bg_4.png


+ 9 - 0
src/static/img/ck.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="305" height="305" viewBox="0 0 305 305">
+  <g id="组_83" data-name="组 83" transform="translate(-4212 -943)">
+    <g id="椭圆_17" data-name="椭圆 17" transform="translate(4212 943)" fill="none" stroke="#fff" stroke-width="22">
+      <circle cx="152.5" cy="152.5" r="152.5" stroke="none"/>
+      <circle cx="152.5" cy="152.5" r="141.5" fill="none"/>
+    </g>
+    <text id="CK" transform="translate(4360 1151)" fill="#fff" font-size="149" font-family="Arial-BoldMT, Arial" font-weight="700"><tspan x="-107.603" y="0">CK</tspan></text>
+  </g>
+</svg>

BIN
src/static/img/heart.png


+ 3 - 0
src/static/img/heart.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="302.916" height="272.861" viewBox="0 0 302.916 272.861">
+  <path id="路径_64" data-name="路径 64" d="M295.7,155.954A86.33,86.33,0,0,0,173.631,34.4a82.615,82.615,0,0,0-8.029,9.324,82.616,82.616,0,0,0-8.029-9.41A86.33,86.33,0,0,0,35.5,155.954L165,285.449Z" transform="translate(-13.979 -12.589)" fill="#fff"/>
+</svg>

BIN
src/static/img/people/flyhead.png


+ 6 - 0
src/static/img/power/power_full.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="27" height="18" viewBox="0 0 27 18">
+  <g id="电量" transform="translate(-554 -108)">
+    <path id="路径_15" data-name="路径 15" d="M4.571,7.571V20.429h18V7.571ZM3.286,5H23.857a1.286,1.286,0,0,1,1.286,1.286V21.714A1.286,1.286,0,0,1,23.857,23H3.286A1.286,1.286,0,0,1,2,21.714V6.286A1.286,1.286,0,0,1,3.286,5Zm23.143,5.143H29v7.714H26.429Z" transform="translate(552 103)" fill="#fff"/>
+    <rect id="矩形_118" data-name="矩形 118" width="15" height="10" transform="translate(558 112)" fill="#fff"/>
+  </g>
+</svg>

+ 6 - 0
src/static/img/power/power_half.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="27" height="18" viewBox="0 0 27 18">
+  <g id="电量" transform="translate(-554 -108)">
+    <path id="路径_15" data-name="路径 15" d="M4.571,7.571V20.429h18V7.571ZM3.286,5H23.857a1.286,1.286,0,0,1,1.286,1.286V21.714A1.286,1.286,0,0,1,23.857,23H3.286A1.286,1.286,0,0,1,2,21.714V6.286A1.286,1.286,0,0,1,3.286,5Zm23.143,5.143H29v7.714H26.429Z" transform="translate(552 103)" fill="#fff"/>
+    <rect id="矩形_118" data-name="矩形 118" width="12" height="10" transform="translate(558 112)" fill="#fff"/>
+  </g>
+</svg>

+ 6 - 0
src/static/img/power/power_low.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="27" height="18" viewBox="0 0 27 18">
+  <g id="电量" transform="translate(-554 -108)">
+    <path id="路径_15" data-name="路径 15" d="M4.571,7.571V20.429h18V7.571ZM3.286,5H23.857a1.286,1.286,0,0,1,1.286,1.286V21.714A1.286,1.286,0,0,1,23.857,23H3.286A1.286,1.286,0,0,1,2,21.714V6.286A1.286,1.286,0,0,1,3.286,5Zm23.143,5.143H29v7.714H26.429Z" transform="translate(552 103)" fill="#fff"/>
+    <rect id="矩形_118" data-name="矩形 118" width="7.5" height="10" transform="translate(558 112)" fill="#fff"/>
+  </g>
+</svg>

+ 6 - 0
src/static/img/power/power_none.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="27" height="18" viewBox="0 0 27 18">
+  <g id="电量" transform="translate(-554 -108)">
+    <path id="路径_15" data-name="路径 15" d="M4.571,7.571V20.429h18V7.571ZM3.286,5H23.857a1.286,1.286,0,0,1,1.286,1.286V21.714A1.286,1.286,0,0,1,23.857,23H3.286A1.286,1.286,0,0,1,2,21.714V6.286A1.286,1.286,0,0,1,3.286,5Zm23.143,5.143H29v7.714H26.429Z" transform="translate(552 103)" fill="#fff"/>
+    <rect id="矩形_118" data-name="矩形 118" width="3" height="10" transform="translate(558 112)" fill="#ff0017"/>
+  </g>
+</svg>

Plik diff jest za duży
+ 4 - 0
src/static/img/privateSign.svg


+ 7 - 0
src/static/img/rank/king1.svg

@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="57.582" height="55.185" viewBox="0 0 57.582 55.185">
+  <g id="皇冠" transform="translate(409.593 731.711) rotate(-30)">
+    <path id="路径_140" data-name="路径 140" d="M43.035-811.229a1.469,1.469,0,0,1,1.052.4,1.47,1.47,0,0,1,.463,1.025v.034a.466.466,0,0,1-.011.136L41.054-786.1a2.854,2.854,0,0,1,.029-.536,4.466,4.466,0,0,1-2.854,3.573,1.455,1.455,0,0,1,.377-.1c-3.249,1.2-9.552,2.01-16.8,1.968-7.192-.042-13.438-.893-16.6-2.131a1.879,1.879,0,0,1,.395.118,4.438,4.438,0,0,1-2.755-3.625l.013.27L.012-810.326A.686.686,0,0,1,0-810.488a1.462,1.462,0,0,1,.483-1.021,1.462,1.462,0,0,1,1.066-.372,1.223,1.223,0,0,1,.726.2L12.4-802.3l8.174-15.816a2.065,2.065,0,0,1,1.862-1.072,2.029,2.029,0,0,1,1.652.84l7.864,16.337L42-810.823l.047-.047a1.338,1.338,0,0,1,.98-.359Z" transform="translate(0 0)" fill="#fed530"/>
+    <path id="路径_141" data-name="路径 141" d="M310.32-451.958a8.9,8.9,0,0,0-9.019,8.773,8.9,8.9,0,0,0,8.773,9.019,8.9,8.9,0,0,0,9.019-8.773h0A8.9,8.9,0,0,0,310.32-451.958Z" transform="translate(-287.49 -350.578)" fill="#504312" opacity="0.67"/>
+    <text id="_1" data-name="1" transform="translate(18.015 -787.737)" fill="#f4cd38" font-size="15" font-family="Roboto-Regular, Roboto" letter-spacing="-0.05em"><tspan x="0" y="0">1</tspan></text>
+  </g>
+</svg>

+ 7 - 0
src/static/img/rank/king2.svg

@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="57.582" height="55.185" viewBox="0 0 57.582 55.185">
+  <g id="皇冠" transform="translate(409.593 731.711) rotate(-30)">
+    <path id="路径_140" data-name="路径 140" d="M43.035-811.229a1.469,1.469,0,0,1,1.052.4,1.47,1.47,0,0,1,.463,1.025v.034a.466.466,0,0,1-.011.136L41.054-786.1a2.854,2.854,0,0,1,.029-.536,4.466,4.466,0,0,1-2.854,3.573,1.455,1.455,0,0,1,.377-.1c-3.249,1.2-9.552,2.01-16.8,1.968-7.192-.042-13.438-.893-16.6-2.131a1.879,1.879,0,0,1,.395.118,4.438,4.438,0,0,1-2.755-3.625l.013.27L.012-810.326A.686.686,0,0,1,0-810.488a1.462,1.462,0,0,1,.483-1.021,1.462,1.462,0,0,1,1.066-.372,1.223,1.223,0,0,1,.726.2L12.4-802.3l8.174-15.816a2.065,2.065,0,0,1,1.862-1.072,2.029,2.029,0,0,1,1.652.84l7.864,16.337L42-810.823l.047-.047a1.338,1.338,0,0,1,.98-.359Z" transform="translate(0 0)" fill="#bed8ea"/>
+    <path id="路径_141" data-name="路径 141" d="M310.32-451.958a8.9,8.9,0,0,0-9.019,8.773,8.9,8.9,0,0,0,8.773,9.019,8.9,8.9,0,0,0,9.019-8.773h0A8.9,8.9,0,0,0,310.32-451.958Z" transform="translate(-287.49 -350.578)" fill="#184f70" opacity="0.67"/>
+    <text id="_2" data-name="2" transform="translate(18.015 -787.737)" fill="#bed8ea" font-size="15" font-family="Roboto-Regular, Roboto" letter-spacing="-0.05em"><tspan x="0" y="0">2</tspan></text>
+  </g>
+</svg>

+ 8 - 0
src/static/img/rank/king3.svg

@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="57.582" height="55.185" viewBox="0 0 57.582 55.185">
+  <g id="皇冠" transform="translate(409.593 731.711) rotate(-30)">
+    <path id="路径_140" data-name="路径 140" d="M43.035-811.229a1.469,1.469,0,0,1,1.052.4,1.47,1.47,0,0,1,.463,1.025v.034a.466.466,0,0,1-.011.136L41.054-786.1a2.854,2.854,0,0,1,.029-.536,4.466,4.466,0,0,1-2.854,3.573,1.455,1.455,0,0,1,.377-.1c-3.249,1.2-9.552,2.01-16.8,1.968-7.192-.042-13.438-.893-16.6-2.131a1.879,1.879,0,0,1,.395.118,4.438,4.438,0,0,1-2.755-3.625l.013.27L.012-810.326A.686.686,0,0,1,0-810.488a1.462,1.462,0,0,1,.483-1.021,1.462,1.462,0,0,1,1.066-.372,1.223,1.223,0,0,1,.726.2L12.4-802.3l8.174-15.816a2.065,2.065,0,0,1,1.862-1.072,2.029,2.029,0,0,1,1.652.84l7.864,16.337L42-810.823l.047-.047a1.338,1.338,0,0,1,.98-.359Z" transform="translate(0 0)" fill="#f2c987"/>
+    <path id="路径_141" data-name="路径 141" d="M310.32-451.958a8.9,8.9,0,0,0-9.019,8.773,8.9,8.9,0,0,0,8.773,9.019,8.9,8.9,0,0,0,9.019-8.773h0A8.9,8.9,0,0,0,310.32-451.958Z" transform="translate(-287.49 -350.578)" fill="#65420a" opacity="0.67"/>
+    <text id="_3_" data-name="3
+" transform="translate(18.015 -787.737)" fill="#f2c987" font-size="15" font-family="Roboto-Regular, Roboto" letter-spacing="-0.05em"><tspan x="0" y="0">3</tspan><tspan font-family="Roboto-Bold, Roboto" font-weight="700"><tspan x="0" y="1"></tspan></tspan></text>
+  </g>
+</svg>

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików