소스 검색

Signed-off-by: Changpeng Duan <838560574@qq.com>

Changpeng Duan 5 년 전
부모
커밋
f7d08a7af1
68개의 변경된 파일2650개의 추가작업 그리고 5개의 파일을 삭제
  1. 15 2
      pc/src/components/Navside.vue
  2. 2 2
      pc/src/views/Index.vue
  3. 4 1
      pc/src/views/Main.vue
  4. 5 0
      tv/.idea/codeStyles/codeStyleConfig.xml
  5. 8 0
      tv/.idea/modules.xml
  6. 12 0
      tv/.idea/tv.iml
  7. 6 0
      tv/.idea/vcs.xml
  8. 93 0
      tv/.idea/workspace.xml
  9. 179 0
      tv/README.md
  10. 5 0
      tv/babel.config.js
  11. 37 0
      tv/package.json
  12. BIN
      tv/public/favicon.ico
  13. 17 0
      tv/public/index.html
  14. 25 0
      tv/src/App.vue
  15. 376 0
      tv/src/Global.js
  16. 175 0
      tv/src/Mock/index.js
  17. 223 0
      tv/src/api/Navs.js
  18. 538 0
      tv/src/api/getApiRes.js
  19. BIN
      tv/src/assets/404/back.png
  20. BIN
      tv/src/assets/404/back_w.png
  21. BIN
      tv/src/assets/404/homepage.png
  22. BIN
      tv/src/assets/404/homepage_w.png
  23. BIN
      tv/src/assets/404/man.png
  24. BIN
      tv/src/assets/404/refresh.png
  25. BIN
      tv/src/assets/404/refresh_w.png
  26. 384 0
      tv/src/assets/css/panel.css
  27. BIN
      tv/src/assets/font/UnidreamLED.ttf
  28. BIN
      tv/src/assets/img/border/bbl.png
  29. BIN
      tv/src/assets/img/border/bbr.png
  30. BIN
      tv/src/assets/img/border/btl.png
  31. BIN
      tv/src/assets/img/border/btr.png
  32. BIN
      tv/src/assets/img/header/left.png
  33. BIN
      tv/src/assets/img/header/ltehead.png
  34. BIN
      tv/src/assets/img/header/right.png
  35. BIN
      tv/src/assets/img/icon/addMemo.png
  36. BIN
      tv/src/assets/img/icon/equip.png
  37. BIN
      tv/src/assets/img/icon/header.png
  38. BIN
      tv/src/assets/img/icon/home.png
  39. BIN
      tv/src/assets/img/icon/list.png
  40. BIN
      tv/src/assets/img/icon/location.png
  41. BIN
      tv/src/assets/img/icon/logout.png
  42. BIN
      tv/src/assets/img/icon/qrcode.png
  43. BIN
      tv/src/assets/img/icon/question_icon.png
  44. BIN
      tv/src/assets/img/icon/setting.png
  45. BIN
      tv/src/assets/img/icon/user.png
  46. BIN
      tv/src/assets/img/lessonTable/star.png
  47. BIN
      tv/src/assets/img/login/bg.png
  48. BIN
      tv/src/assets/img/login/logo.png
  49. BIN
      tv/src/assets/img/main/Oval.png
  50. BIN
      tv/src/assets/img/main/appoint.png
  51. BIN
      tv/src/assets/img/main/empty.jpg
  52. BIN
      tv/src/assets/img/main/lesson.png
  53. BIN
      tv/src/assets/img/main/member.png
  54. BIN
      tv/src/assets/img/nav/head.png
  55. BIN
      tv/src/assets/img/nav/home.png
  56. BIN
      tv/src/assets/img/nav/logo.png
  57. BIN
      tv/src/assets/logo.png
  58. BIN
      tv/src/assets/valid.png
  59. 24 0
      tv/src/main.js
  60. 61 0
      tv/src/plugins/axios.js
  61. 68 0
      tv/src/router/index.js
  62. 19 0
      tv/src/store/index.js
  63. 145 0
      tv/src/views/404.vue
  64. 5 0
      tv/src/views/About.vue
  65. 21 0
      tv/src/views/Chart.vue
  66. 174 0
      tv/src/views/Index.vue
  67. 13 0
      tv/src/views/Main.vue
  68. 16 0
      tv/vue.config.js

+ 15 - 2
pc/src/components/Navside.vue

@@ -20,7 +20,6 @@
             text-color="#777777"
             active-text-color="#fff"
             router
-            :collapse="isCollapse"
         >
           <el-menu-item :index="nav.clmid" :route="nav.clmurl" v-for="nav in navs"
                         v-if="nav.show == userLevel">
@@ -249,6 +248,17 @@ export default {
 
 /*ipad only*/
 @media only screen and (max-width: 1366px) {
+  .userContainer {
+    width: 80%;
+  }
+
+  .el-menu-item span {
+    text-align: left;
+    float: left;
+    margin-left: 20px;
+    line-height: 40px;
+  }
+
   .userContainer em {
     width: 100%;
     overflow: hidden;
@@ -269,12 +279,15 @@ export default {
     float: left;
     line-height: 40px;
   }
+
   /deep/ .el-tooltip {
-    padding: 0!important;
+    padding: 0 !important;
   }
+
   .userContainer span {
     font-size: 12px;
   }
+
   .el-menu-item, .el-submenu__title {
     height: 40px;
   }

+ 2 - 2
pc/src/views/Index.vue

@@ -69,7 +69,7 @@ export default {
 }
 
 .shortElaside {
-  width: 60px !important;
+  width: 140px !important;
   overflow: hidden;
   height: 100%;
   float: left;
@@ -166,7 +166,7 @@ export default {
   }
   .el-container.is-vertical {
     position: absolute;
-    left: 60px;
+    left: 140px;
     top: 0;
     right: 0;
     bottom: 0;

+ 4 - 1
pc/src/views/Main.vue

@@ -961,7 +961,10 @@ i {
   }
 
   .top li .liRight {
-    width: 50%;
+    width: 40%;
+  }
+  .btLine {
+    width: 96%;
   }
 
   .btLine em {

+ 5 - 0
tv/.idea/codeStyles/codeStyleConfig.xml

@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+  <state>
+    <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
+  </state>
+</component>

+ 8 - 0
tv/.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/tv.iml" filepath="$PROJECT_DIR$/.idea/tv.iml" />
+    </modules>
+  </component>
+</project>

+ 12 - 0
tv/.idea/tv.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$/.tmp" />
+      <excludeFolder url="file://$MODULE_DIR$/temp" />
+      <excludeFolder url="file://$MODULE_DIR$/tmp" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 6 - 0
tv/.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>

+ 93 - 0
tv/.idea/workspace.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="BranchesTreeState">
+    <expand>
+      <path>
+        <item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
+        <item name="LOCAL_ROOT" type="e8cecc67:BranchNodeDescriptor" />
+      </path>
+      <path>
+        <item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
+        <item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
+      </path>
+      <path>
+        <item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
+        <item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
+        <item name="GROUP_NODE:origin" type="e8cecc67:BranchNodeDescriptor" />
+      </path>
+    </expand>
+    <select />
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" id="c813a37b-038b-4bb1-a925-c03a432a7638" name="Default Changelist" comment="">
+      <change beforePath="$PROJECT_DIR$/../pc/src/components/Navside.vue" beforeDir="false" afterPath="$PROJECT_DIR$/../pc/src/components/Navside.vue" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../pc/src/views/Index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/../pc/src/views/Index.vue" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../pc/src/views/Main.vue" beforeDir="false" afterPath="$PROJECT_DIR$/../pc/src/views/Main.vue" afterDir="false" />
+    </list>
+    <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="1jXXjXdwK5v7WohMBoZDModntXR" />
+  <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="WebServerToolWindowFactoryState" value="false" />
+    <property name="dart.analysis.tool.window.visible" 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="c813a37b-038b-4bb1-a925-c03a432a7638" name="Default Changelist" comment="" />
+      <created>1603951546154</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1603951546154</updated>
+      <workItem from="1603951547210" duration="361000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="3" />
+  </component>
+  <component name="Vcs.Log.Tabs.Properties">
+    <option name="TAB_STATES">
+      <map>
+        <entry key="MAIN">
+          <value>
+            <State />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
+  <component name="WindowStateProjectService">
+    <state x="-1830" y="274" width="1099" height="859" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1603951765981">
+      <screen x="-2560" y="0" width="2560" height="1379" />
+    </state>
+    <state x="-1830" y="274" width="1099" height="859" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.0.1920.1019/-2560.0.2560.1379@-2560.0.2560.1379" timestamp="1603951765981" />
+  </component>
+</project>

+ 179 - 0
tv/README.md

@@ -0,0 +1,179 @@
+#PcBackStage
+
+ /$$$$$$$           /$$$$$$$                      /$$        /$$$$$$   /$$                                  
+| $$__  $$         | $$__  $$                    | $$       /$$__  $$ | $$                                  
+| $$  \ $$ /$$$$$$$| $$  \ $$  /$$$$$$   /$$$$$$$| $$   /$$| $$  \__//$$$$$$    /$$$$$$   /$$$$$$   /$$$$$$ 
+| $$$$$$$//$$_____/| $$$$$$$  |____  $$ /$$_____/| $$  /$$/|  $$$$$$|_  $$_/   |____  $$ /$$__  $$ /$$__  $$
+| $$____/| $$      | $$__  $$  /$$$$$$$| $$      | $$$$$$/  \____  $$ | $$      /$$$$$$$| $$  \ $$| $$$$$$$$
+| $$     | $$      | $$  \ $$ /$$__  $$| $$      | $$_  $$  /$$  \ $$ | $$ /$$ /$$__  $$| $$  | $$| $$_____/
+| $$     |  $$$$$$$| $$$$$$$/|  $$$$$$$|  $$$$$$$| $$ \  $$|  $$$$$$/ |  $$$$/|  $$$$$$$|  $$$$$$$|  $$$$$$$
+|__/      \_______/|_______/  \_______/ \_______/|__/  \__/ \______/   \___/   \_______/ \____  $$ \_______/
+                                                                                         /$$  \ $$          
+                                                                                        |  $$$$$$/          
+                                                                                         \______/           
+                                                                                         
+##常用的后台管理模板  
+
+小飞龙api服务
+http://192.168.0.3:19095/v1/docs/index.html
+
+
+基于 https://panjiachen.github.io/vue-element-admin-site/zh/guide/ 的版本, 只保留常用功能和修改部分UI效果  
+
+##安装:  
+
+###克隆项目  
+
+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
tv/babel.config.js

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

+ 37 - 0
tv/package.json

@@ -0,0 +1,37 @@
+{
+  "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",
+    "qs": "^6.9.4",
+    "v-charts": "^1.19.0",
+    "vue": "^2.6.11",
+    "vue-amap": "^0.5.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-template-compiler": "^2.6.11"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not dead"
+  ]
+}

BIN
tv/public/favicon.ico


+ 17 - 0
tv/public/index.html

@@ -0,0 +1,17 @@
+<!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">
+    <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>

+ 25 - 0
tv/src/App.vue

@@ -0,0 +1,25 @@
+<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;
+    }
+</style>

+ 376 - 0
tv/src/Global.js

@@ -0,0 +1,376 @@
+// 网站基本信息
+companyInfo = {
+    url: 'http://det.shandongewall.com/',
+    main: 'alloutlong',
+    year: new Date().getFullYear(),
+};
+
+headapi = process.env.NODE_ENV === 'development' ? '/api/' : '../';
+
+
+// 常用选项
+globalQuipState = function () {
+    let option = [
+        {
+            value: '',
+            label: '全部'
+        }, {
+            value: '0',
+            label: '新入库'
+        }, {
+            value: '1',
+            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: '半年'
+        },
+    ];
+    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
+};
+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),
+        }
+    })
+    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;
+    }
+}

+ 175 - 0
tv/src/Mock/index.js

@@ -0,0 +1,175 @@
+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)",
+            "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;
+};
+
+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;

+ 223 - 0
tv/src/api/Navs.js

@@ -0,0 +1,223 @@
+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": "lesson",
+        "clmname": "课程管理",
+        "clmurl": "/lesson",
+        "prname": "",
+        "show": 3,
+        "grouplist": "2,5",
+        "icon": "el-icon-collection",
+    }, {
+        "clmid": "4",
+        "clmcode": "lessonTable",
+        "clmname": "课程表模板",
+        "clmurl": "/lessonTable",
+        "prname": "",
+        "show": 3,
+        "grouplist": "2,5",
+        "icon": "el-icon-tickets",
+    }, {
+        "clmid": "5",
+        "clmcode": "lessonManage",
+        "clmname": "课程表管理",
+        "clmurl": "/lessonManage",
+        "prname": "",
+        "show": 3,
+        "grouplist": "2,5",
+        "icon": "el-icon-date",
+    }, {
+        "clmid": "6",
+        "clmcode": "coach",
+        "clmname": "教练管理",
+        "clmurl": "/coach",
+        "prname": "",
+        "show": 999,
+        "grouplist": "2,5",
+        "icon": "el-icon-medal-1",
+    }, {
+        "clmid": "7",
+        "clmcode": "appoint",
+        "clmname": "预约管理",
+        "clmurl": "/appoint",
+        "prname": "",
+        "show": 3,
+        "grouplist": "2,5",
+        "icon": "el-icon-time",
+    }, {
+        "clmid": "8",
+        "clmcode": "record",
+        "clmname": "预约记录",
+        "clmurl": "/record",
+        "prname": "",
+        "show": 3,
+        "grouplist": "2,5",
+        "icon": "el-icon-document-copy",
+    }, {
+        "clmid": "9",
+        "clmcode": "cost",
+        "clmname": "消费记录",
+        "clmurl": "/cost",
+        "prname": "",
+        "show": 3,
+        "grouplist": "2,5",
+        "icon": "el-icon-bank-card",
+    }, {
+        "clmid": "10",
+        "clmcode": "finish",
+        "clmname": "下课管理",
+        "clmurl": "/finish",
+        "prname": "",
+        "show": 3,
+        "grouplist": "2,5",
+        "icon": "el-icon-bell",
+    }, {
+        "clmid": "11",
+        "clmcode": "setting",
+        "clmname": "系统设置",
+        "clmurl": "/setting",
+        "prname": "",
+        "show": 3,
+        "grouplist": "2,5",
+        "icon": "el-icon-setting",
+    }, {
+        "clmid": "12",
+        "clmcode": "shop",
+        "clmname": "店面管理",
+        "clmurl": "/shopManage",
+        "prname": "",
+        "show": 2,
+        "grouplist": "2,5",
+        "icon": "el-icon-s-shop",
+    }, {
+        "clmid": "13",
+        "clmcode": "adminManage",
+        "clmname": "管理员管理",
+        "clmurl": "/adminManage",
+        "prname": "",
+        "show": 2,
+        "grouplist": "2,5",
+        "icon": "el-icon-user",
+    }, {
+        "clmid": "14",
+        "clmcode": "log",
+        "clmname": "操作日志",
+        "clmurl": "/log",
+        "prname": "",
+        "show": 2,
+        "grouplist": "2,5",
+        "icon": "el-icon-s-claim",
+    }, {
+        "clmid": "15",
+        "clmcode": "setting",
+        "clmname": "系统设置",
+        "clmurl": "/adminSetting",
+        "prname": "",
+        "show": 2,
+        "grouplist": "2,5",
+        "icon": "el-icon-setting",
+    },
+    {
+        "clmid": "1",
+        "clmcode": "index",
+        "clmname": "系统首页",
+        "clmurl": "/",
+        "prname": "",
+        "show": 4,
+        "grouplist": "2,5",
+        "icon": "el-icon-house",
+    }, {
+        "clmid": "2",
+        "clmcode": "member",
+        "clmname": "会员管理",
+        "clmurl": "/member",
+        "prname": "",
+        "show": 4,
+        "grouplist": "2,5",
+        "icon": "el-icon-user",
+    }, {
+        "clmid": "3",
+        "clmcode": "lesson",
+        "clmname": "课程管理",
+        "clmurl": "/lesson",
+        "prname": "",
+        "show": 4,
+        "grouplist": "2,5",
+        "icon": "el-icon-collection",
+    }, {
+        "clmid": "5",
+        "clmcode": "lessonManage",
+        "clmname": "课程表管理",
+        "clmurl": "/lessonManage",
+        "prname": "",
+        "show": 4,
+        "grouplist": "2,5",
+        "icon": "el-icon-date",
+    }, {
+        "clmid": "7",
+        "clmcode": "appoint",
+        "clmname": "预约管理",
+        "clmurl": "/appoint",
+        "prname": "",
+        "show": 4,
+        "grouplist": "2,5",
+        "icon": "el-icon-time",
+    }, {
+        "clmid": "8",
+        "clmcode": "record",
+        "clmname": "预约记录",
+        "clmurl": "/record",
+        "prname": "",
+        "show": 4,
+        "grouplist": "2,5",
+        "icon": "el-icon-document-copy",
+    }, {
+        "clmid": "9",
+        "clmcode": "cost",
+        "clmname": "消费记录",
+        "clmurl": "/cost",
+        "prname": "",
+        "show": 4,
+        "grouplist": "2,5",
+        "icon": "el-icon-bank-card",
+    }, {
+        "clmid": "10",
+        "clmcode": "finish",
+        "clmname": "下课管理",
+        "clmurl": "/finish",
+        "prname": "",
+        "show": 4,
+        "grouplist": "2,5",
+        "icon": "el-icon-bell",
+    },
+    {
+        "clmid": "15",
+        "clmcode": "setting",
+        "clmname": "系统设置",
+        "clmurl": "/adminSetting",
+        "prname": "",
+        "show": 4,
+        "grouplist": "2,5",
+        "icon": "el-icon-setting",
+    },
+];
+
+export default navs;

+ 538 - 0
tv/src/api/getApiRes.js

@@ -0,0 +1,538 @@
+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 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);
+}
+
+
+
+
+

BIN
tv/src/assets/404/back.png


BIN
tv/src/assets/404/back_w.png


BIN
tv/src/assets/404/homepage.png


BIN
tv/src/assets/404/homepage_w.png


BIN
tv/src/assets/404/man.png


BIN
tv/src/assets/404/refresh.png


BIN
tv/src/assets/404/refresh_w.png


+ 384 - 0
tv/src/assets/css/panel.css

@@ -0,0 +1,384 @@
+.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 /deep/ h5 {
+    margin: 0;
+    text-align: left;
+    font-size: 18px;
+    font-weight: normal;
+    padding-bottom: 10px;
+    border-bottom: 1px solid #F0F2F5;
+    margin-bottom: 10px;
+}
+
+.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 {
+    text-align: left;
+    float: left;
+    text-indent: 20px;
+}
+
+.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 only screen 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%;
+    }
+}
+

BIN
tv/src/assets/font/UnidreamLED.ttf


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


BIN
tv/src/assets/logo.png


BIN
tv/src/assets/valid.png


+ 24 - 0
tv/src/main.js

@@ -0,0 +1,24 @@
+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);
+
+// 演示版本数据
+require('./Mock/index.js');
+
+new Vue({
+  router,
+  store,
+  render: h => h(App)
+}).$mount('#app');
+

+ 61 - 0
tv/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;

+ 68 - 0
tv/src/router/index.js

@@ -0,0 +1,68 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+// 加载条
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import VueAMap from 'vue-amap';
+
+Vue.use(VueRouter);
+// Vue.use(VueAMap);
+
+// VueAMap.initAMapApiLoader({
+//     key: 'your amap key',
+//     plugin: ['AMap.Autocomplete', 'AMap.PlaceSearch', 'AMap.Scale', 'AMap.OverView', 'AMap.ToolBar', 'AMap.MapType', 'AMap.PolyEditor', 'AMap.CircleEditor'],
+//     // 默认高德 sdk 版本为 1.4.4
+//     v: '1.4.4'
+// });
+
+const routes = [
+    {
+        path: '/',
+        component: () => import( '../views/Index.vue'),
+        children: [
+            {
+                path: '/',
+                name: 'Main',
+                component: () => import('@/views/Main.vue'),
+                meta: {
+                    title: "首页",
+                    clmid: "1",
+                }
+            },
+        ]
+    }, {
+        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");
+        next();
+    }
+});
+
+router.afterEach(() => {
+    NProgress.done()
+})
+
+export default router

+ 19 - 0
tv/src/store/index.js

@@ -0,0 +1,19 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+
+Vue.use(Vuex);
+
+export default new Vuex.Store({
+  state: {
+      userLevel:0
+  },
+  mutations: {
+      setUserLevel(userLevel) {
+          console.log(userLevel);
+      }
+  },
+  actions: {
+  },
+  modules: {
+  }
+})

+ 145 - 0
tv/src/views/404.vue

@@ -0,0 +1,145 @@
+<template>
+    <div class="pages">
+        <div class="container">
+            <div class="row">
+                <div class="lt">
+                    <img src="../assets/404/man.png" alt="">
+                </div>
+                <div class="rt">
+                    <p>啊!啊!啊!页面走丢了!</p>
+                    <p>别走,您可以选择调头返回上一页或者返回首页!</p>
+                    <span>Don't go, you can choose to turn around and go back to the previouspage or homepage!</span>
+                    <em>
+                        <a class="lt_btn btn" onclick="window.history.back(-1);">
+                            返回上一页 <i class="icon_back"></i>
+                        </a>
+                        <a class="rt_btn btn" href="/">
+                            返回首页 <i class="icon_home"></i>
+                        </a>
+                    </em>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+    export default {
+        name: "Main"
+    }
+</script>
+
+<style scoped>
+    .pages {
+        position: absolute;
+        top: 0;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        background: #009FE9;
+    }
+    .container {
+        width: 100%;
+        max-width: 960px;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+    }
+    .row {
+        width: 100%;
+        overflow: hidden;
+        display: block;
+        margin: 0 auto;
+        margin-top: 20%;
+    }
+    em,s {
+        font-style: normal;
+    }
+    a {
+        text-decoration: none;
+    }
+    .row .lt {
+        width: 50%;
+        float: left;
+    }
+
+    .row .rt {
+        width: 50%;
+        float: right;
+        padding-top: 15%;
+        color: #fff;
+    }
+    .row .rt p {
+        max-width: 500px;
+        font-size: 24px;
+        margin-bottom: 20px;
+    }
+    .row .rt span {
+        font-size: 16px;
+    }
+    .row .btn {
+        border: 2px solid #fff;
+        border-radius: 250px;
+        text-align: center;
+        padding: 13px 47px;
+        font-size: 18px;
+        background: #009FE9;
+        color: #fff;
+    }
+    .row .lt_btn {
+        float: left;
+    }
+    .row .rt_btn {
+        float: right;
+    }
+    .row .btn:hover {
+        background: #fff;
+        color: #009FE9;
+    }
+    .row em {
+        width: 100%;
+        overflow: hidden;
+        float: left;
+        max-width: 450px;
+        font-size: 24px;
+        margin-top: 53px;
+    }
+    .rt a {
+        cursor: pointer;
+    }
+
+    /*响应式调整*/
+    @media(min-width:320px) and (max-width: 481px) {
+        .row .lt {
+            display: none;
+        }
+        .row .rt {
+            width: 100%;
+            overflow: hidden;
+            display: block;
+            margin: 0 auto;
+        }
+        .row em {
+            width: 100%;
+            overflow: hidden;
+            display: block;
+            margin: 0 auto;
+            margin-top: 40px;
+        }
+        .row .btn {
+            width: 200px;
+            overflow: hidden;
+            display: block;
+            margin: 0 auto;
+            margin-bottom: 20px;
+            font-size: 14px;
+            float: none;
+        }
+    }
+
+</style>

+ 5 - 0
tv/src/views/About.vue

@@ -0,0 +1,5 @@
+<template>
+  <div class="about">
+    <h1>This is an about page</h1>
+  </div>
+</template>

+ 21 - 0
tv/src/views/Chart.vue

@@ -0,0 +1,21 @@
+<template>
+    <Ring></Ring>
+</template>
+
+<script>
+    import Ring from '@/components/Ring.vue'
+    export default {
+        data() {
+            return {
+                editableTabsValue: '1'
+            }
+        },
+        components: {
+            Ring
+        }
+    }
+</script>
+
+<style scoped>
+
+</style>

+ 174 - 0
tv/src/views/Index.vue

@@ -0,0 +1,174 @@
+<template>
+  <div class="IndexContainer">
+      <el-container>
+        <el-main>
+          <keep-alive>
+            <router-view></router-view>
+          </keep-alive>
+        </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+// @ is an alias to /src
+import Navs from '../api/Navs';
+
+export default {
+  name: 'Home',
+  data() {
+    return {
+      isCollapse: document.body.clientWidth < 1366,
+      aSideState: false,
+      thisClick: 0,
+      tabwildState: 1,
+      navs: Navs,
+      handleTabsList: [{
+        title: '系统首页',
+        name: '1',
+        clmurl: '/',
+      }],
+      editableTabsValue: '1'
+    }
+  },
+  mounted() {
+    // checkScreen
+    if (document.body.clientWidth < 1024) {
+      this.$message.warning('请横屏使用本系统');
+    }
+  },
+  methods: {
+    left_hide() {
+      this.aSideState = !this.aSideState;
+      this.isCollapse = !this.isCollapse;
+    },
+  },
+  components: {
+    Headside,
+    Navside
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style>
+.el-header {
+  padding: 0 !important;
+  height: 72px !important;
+}
+
+.shortElaside {
+  width: 140px !important;
+  overflow: hidden;
+  height: 100%;
+  float: left;
+}
+
+.lognElaside {
+  width: 256px !important;
+  overflow: hidden;
+  height: 100%;
+  float: left;
+}
+
+/deep/ .nav {
+  width: 60px;
+}
+
+.IndexContainer {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background: #F0F2F5;
+}
+
+.IndexContainer > .el-container {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  display: block;
+  margin: 0 auto;
+}
+
+.footer {
+  position: absolute;
+  bottom: 0px;
+  width: 100%;
+  padding: 10px;
+  overflow: hidden;
+  display: block;
+  margin: 0 auto;
+  text-align: center;
+  text-indent: -30%;
+  font-size: 12px;
+  color: #BDBDBD;
+  background: #F0F2F5;
+  z-index: 222;
+}
+
+.el-main {
+  width: 100%;
+  height: 100%;
+  /*min-height: 800px;*/
+  overflow: hidden;
+  display: block;
+  margin: 0 auto;
+  overflow-y: hidden;
+  padding: 10px 20px;
+}
+
+/*ipad only*/
+@media only screen and (max-width: 1366px) {
+  .lognElaside {
+    width: 70px!important;
+  }
+  .logoContainer img {
+    display: none!important;
+  }
+  .el-main {
+    padding: 3px!important;
+    overflow-y: scroll;
+  }
+  .el-main > .context {
+    /*height: 640px;*/
+    /*overflow-y: scroll;*/
+    padding: 6px!important;
+  }
+  .table {
+    /*width: 950px;*/
+    /*overflow-x: scroll;*/
+  }
+  .el-dialog {
+    max-width: 960px;
+  }
+  .el-dialog__body {
+    padding: 3px;
+  }
+  .el-transfer__buttons {
+    width: 60px;
+    padding: 3px;
+  }
+  .el-transfer .el-button + .el-button {
+    float: right;
+  }
+  .el-container.is-vertical {
+    position: absolute;
+    left: 140px;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    height: 100%;
+  }
+  .context {
+    border-radius: 12px;
+    height: 823px!important;
+    overflow-y: scroll;
+  }
+  .el-dialog {
+    padding: 5px;
+    padding-bottom: 15px;
+  }
+}
+</style>

+ 13 - 0
tv/src/views/Main.vue

@@ -0,0 +1,13 @@
+<template>
+<div>main page</div>
+</template>
+
+<script>
+export default {
+name: "Main"
+}
+</script>
+
+<style scoped>
+
+</style>

+ 16 - 0
tv/vue.config.js

@@ -0,0 +1,16 @@
+module.exports = {
+    lintOnSave: false,
+    devServer: {
+        proxy: {
+            '/api': {
+                target: 'http://192.168.0.3:19095/',
+                changeOrigin: true,
+                pathRewrite: {
+                    '^/api': '',
+                }
+            }
+        }
+    },
+    // 输出文件目录
+    outputDir: 'D:/wwwroot/flyLongStaticTv/build',
+};