Selaa lähdekoodia

标准saas车间系统

seyason 6 kuukautta sitten
vanhempi
commit
54b9d20ce0
100 muutettua tiedostoa jossa 19433 lisäystä ja 0 poistoa
  1. 2 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/.env.development
  2. 3 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/.env.production
  3. 22 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/.gitignore
  4. 49 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/README.bak.md
  5. 140 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/README.md
  6. 24 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/babel.config.js
  7. 1 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/build.bat
  8. 13281 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/package-lock.json
  9. 65 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/package.json
  10. 2 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/public/axios.min.js
  11. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/public/favicon.ico
  12. 87 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/public/index.html
  13. 186 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/App.vue
  14. 33 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/app.js
  15. 75 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/collapse.js
  16. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/icon/kefu.png
  17. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/1.jpg
  18. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/jz1.jpg
  19. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/jz2.jpg
  20. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/jz3.jpg
  21. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/jz4.jpg
  22. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/r1.jpg
  23. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/r2.jpg
  24. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/r3.jpg
  25. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/r4.jpg
  26. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/r5.jpg
  27. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/alt.jpg
  28. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/chong.png
  29. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/cover/1.jpg
  30. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/cover/2.jpg
  31. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/cover/3.jpg
  32. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/cover/4.jpg
  33. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/cover/5.jpg
  34. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/hb1.jpg
  35. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/hb2.jpg
  36. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/tx1.jpg
  37. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/tx2.jpg
  38. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/tx3.jpg
  39. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/tx4.jpg
  40. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/banner_1.png
  41. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/banner_2.png
  42. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/banner_3.png
  43. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/check.png
  44. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/edit.png
  45. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/more.png
  46. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/my.png
  47. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/wait.png
  48. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/index/banner4.jpeg
  49. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/index/banner_1.png
  50. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/index/banner_2.png
  51. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/index/banner_3.png
  52. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/kf.jpg
  53. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/login_logo.png
  54. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/logo.png
  55. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/not.jpeg
  56. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/null.png
  57. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/orderList1.jpg
  58. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/orderList2.jpg
  59. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/beij.png
  60. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/cl.png
  61. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/dt.png
  62. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/hb.png
  63. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/head_back.jpg
  64. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/p.png
  65. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/qb.png
  66. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/tg.png
  67. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/tx.jpg
  68. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/userHead.png
  69. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/yhk.png
  70. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/poster/1.jpg
  71. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/poster/2.jpg
  72. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/poster/3.jpg
  73. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/poster/4.jpg
  74. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/qwcode.png
  75. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/qx.png
  76. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/qxbj.png
  77. 1 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/shju.json
  78. 363 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/common.less
  79. 539 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/demo.css
  80. 1706 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/demo_index.html
  81. 279 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.css
  82. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.eot
  83. 1 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.js
  84. 471 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.json
  85. 92 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.svg
  86. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.ttf
  87. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.woff
  88. BIN
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.woff2
  89. 4 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/index.less
  90. 347 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/rerset.less
  91. 719 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/theme.less
  92. 6 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/Element.js
  93. 85 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/Footer.vue
  94. 23 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/NotFound.vue
  95. 38 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/Vant.js
  96. 373 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/chooseSomeone.vue
  97. 41 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/demo.vue
  98. 157 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/main.js
  99. 218 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/router/index.js
  100. 0 0
      fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/store/index.js

+ 2 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/.env.development

@@ -0,0 +1,2 @@
+NODE_ENV="development"
+VUE_APP_URL="http://192.168.5.184:10010"

+ 3 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/.env.production

@@ -0,0 +1,3 @@
+# 配置生产地址,就是你将来发布上线的地址
+NODE_ENV="production"
+VUE_APP_URL="http://192.168.5.184:10010"

+ 22 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/.gitignore

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

+ 49 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/README.bak.md

@@ -0,0 +1,49 @@
+# 知识体系
+
+#### 封装 axios
+
+1. 使用拦截器统一处理请求和响应数据
+2. 挂载到原型上
+
+#### 上拉加载更多
+
+1. vant 的组件
+2. 设置初始高度,不然 bug 很严重
+
+#### 懒加载
+
+1. 懒加载是什么
+2. 如何实现
+
+#### 环境配置
+
+1. 根目录新建 .env.development (测试环境) 文件
+
+   ```
+   VUE_APP_URL="http://132.232.87.95:3000/api"
+   ```
+
+   然后新建。env.production(生产环境)文件
+
+   ```
+   VUE_APP_URL="http://132.232.94.151:3000/api"
+   ```
+
+2. 配置 package.json
+
+   ```
+    "scripts": {
+       "serve": "vue-cli-service serve --model",
+       "build": "vue-cli-service build --model",
+       "lint": "vue-cli-service lint"
+     },
+   ```
+
+3. 项目中通过 process.env.VUE_APP_URL  访问 VUE_APP_URL 的值,不同的环境取到的值不一样
+
+#### 打包部署
+
+#### 移动端适配
+
+1. amfe-flexib 设置 root 元素字体大小
+2. pxtorem  px 转 rem

+ 140 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/README.md

@@ -0,0 +1,140 @@
+# vue 移动端模板
+
+#### 启动项目
+1. npm i 安装依赖
+1. npm run serve 启动项目
+1. cd server  (接口目录)
+1. npm i 
+1. npm run dev
+
+
+>#### 核心知识体系简介
+1. vue-cli3 脚手架
+    * 创建项目
+    * 开发环境和生产环境配置
+    * 配置跨域
+    
+2. vue-router 路由
+    * 路由配置
+    * 子路由配置
+    * 路由守卫,设置页面标题和根据登录状态判断是否允许进入特定页面
+    * 对router-link使用active-class,高亮当前路由
+    
+3. vuex 跨组件通信
+    * vuex 配置
+    * vuex 持久化
+    * vuex 使用
+    
+4. rem 移动端适配
+    * 通过 amfe-flexibe 设置 root 元素的字体大小
+    * 通过 pxtorem 把 px 转成 rem, 无需手动书写 rem
+    
+5. axios 配置
+    * 使用拦截器配置 baseURL 和给请求头加上 token
+    * 使用拦截器对返回的数据进行处理
+    * 挂载到 vue 原型上,方便使用
+    
+6. promise 使用
+    
+    * 在项目中使用 async await 把异步变成同步,编写和阅读更舒服
+    
+7. 有赞 vant-ui 库
+    * 导航栏
+    * 单元格
+    * loading
+    * ......
+    
+8. 使用keep-alive组件缓存某些组件(新增)
+
+9. 添加小型服务器接口,用来编写本项目所需接口
+
+    
+
+>####  vue-cli3 脚手架
+1. 具体操作,请移步[vue-cli3文档官网]( [https://cli.vuejs.org/zh/guide/installation.html](https://links.jianshu.com/go?to=https%3A%2F%2Fcli.vuejs.org%2Fzh%2Fguide%2Finstallation.html)
+)
+2. **开发环境和生产环境配置**
+  * 根目录新建两文件 .env.development => 开发环境配置  .env.production => 生产环境配置
+![image.png](https://upload-images.jianshu.io/upload_images/7177443-4f2c42f1c1bc4439.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+文件内容
+
+```
+// .env.development
+VUE_APP_URL="https://www.easy-mock.com/mock/5cd62747d3a84206275d58d1/huruqing/api"
+```
+
+```
+// .env.production
+VUE_APP_URL="https://www.easy-mock.com/mock/5cd62747d3a84206275d58d1/huruqing/api"
+```
+
+3. **package.json 配置**
+vue-cli3默认已经给你配置好了model, 开发环境对应development, 生产环境对应production,如果你不知道model,请移步[webpack文档官网]([https://www.webpackjs.com/](https://www.webpackjs.com/)
+)
+![image.png](https://upload-images.jianshu.io/upload_images/7177443-5e9e447da363cfca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+4. 在你的项目中,通过  process.env.VUE_APP_URL 可以访问到你在环境配置文件中设置的变量
+![](https://upload-images.jianshu.io/upload_images/7177443-d585aa842e655950.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+![开发环境中的变量](https://upload-images.jianshu.io/upload_images/7177443-02325513adfb846f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>####  vue-router 路由
+这里主要讲一下路由守卫的配置,先上图
+![路由配置](https://upload-images.jianshu.io/upload_images/7177443-5f45913a5d70bf4d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+下面是路由守卫配置
+![路由守卫](https://upload-images.jianshu.io/upload_images/7177443-a935a3506fd9f567.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>####  vuex 跨组件通信
+1. 项目中有以下几个地方用到了 vuex
+    * 设置登录状态
+    * 设置用户名
+    * 保存 token
+2. 以登录为里,做个简单说明
+![](https://upload-images.jianshu.io/upload_images/7177443-825e2e816a49413b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+登录成功时,修改登陆状态为 true
+![image.png](https://upload-images.jianshu.io/upload_images/7177443-906c4cc3e5713830.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+退出登录时,修改登录状态为 false
+![](https://upload-images.jianshu.io/upload_images/7177443-1da2a2e9208c1872.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+4. 获取 store 中 state 设置的变量通过 mapGetters, 看图
+![](https://upload-images.jianshu.io/upload_images/7177443-61be719b7d9c8a43.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+![在模板中使用](https://upload-images.jianshu.io/upload_images/7177443-8b2c372f88a0f59e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+3. vuex 持久化
+    * 使用 vuex-persistedstate 插件对 vuex 的状态持久化
+    * 等你的页面刷新时,状态依然存在
+    * 本质上是这个插件帮你把状态都存到了 localStorage
+配置方法,以下是最简单的配置
+![](https://upload-images.jianshu.io/upload_images/7177443-0aa53dbad9057879.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+使用了 vuex-persistedstate 插件后,store 里的状态都存到了 localStorage
+![image.png](https://upload-images.jianshu.io/upload_images/7177443-9cf6e3db49baf726.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>#### rem 移动端适配
+适配原理我就不多说了,不清楚请看我的另外一篇文章[用rem编写移动端自适应网页](https://www.jianshu.com/p/91ac1690be89)(https://www.jianshu.com/p/91ac1690be89),这里说一下在vue-cli3中是如何配置的
+1. 安装 amfe-flexible 插件 ```npm i amfe-flexible --save-dev```
+2. 在 main.js 中导入
+![ipone6](https://upload-images.jianshu.io/upload_images/7177443-05c1792eb5cfab79.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+3. 此时你的应用的 html 会自动根据手机的尺寸设置了 font-size, 如图
+![](https://upload-images.jianshu.io/upload_images/7177443-5ea467230b5426e0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+![](https://upload-images.jianshu.io/upload_images/7177443-ee3e3fda5ec57b39.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+4. 配置 pxtorem 插件,能帮你自动把 rem 转成 px, 具体配置如下,在项目根目录下的 vue.config.js(没有则新建)
+里进行配置,如图
+![](https://upload-images.jianshu.io/upload_images/7177443-2b6e79201971d86d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>####  axios 配置
+1. axios 拦截器
+能帮我们对数据进行一些统一的处理,比如后台给我们的数据里都是把数据包在 data 对象里面,而使用 axios, 则又会再用 data 把返回的数据再包一层,如果不统一处理以下,用起来很不爽。
+2. 设置请求头,后台识别用户经常使用 token, 我们登陆的时候能拿到后台返回的 token, 然后存入 store 里,当我们发送请求时,我们可以给请求头统一加上 token, 如图
+![](https://upload-images.jianshu.io/upload_images/7177443-2a42eb0010cde4a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+3. 把 axios 的实例挂载到 vue 的实例上
+![](https://upload-images.jianshu.io/upload_images/7177443-5163a952efbac676.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+发请求的时候,只需要使用 this.$axios.get 或者 this.$axios.post 就行了,是不是很方便
+![](https://upload-images.jianshu.io/upload_images/7177443-5a0bd9bbec047aa7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>#### Promise 的使用
+promise 是个好东西,可以把异步变同步,在项目中使用 async await 编写代码,那叫一个爽,具体用法如下:
+![](https://upload-images.jianshu.io/upload_images/7177443-9f357fbd0a04215a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>#### 有赞 vant-ui 库
+有赞是搞电商开发的,在公众号和小程序模板界算是做得比较不错的,vant-ui是他们开源出来的一个ui库,同时他们还有小程序的ui库,感兴趣的小伙伴可以去[看看](https://youzan.github.io/vant/)(https://youzan.github.io/vant/)
+
+>
+
+

+ 24 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/babel.config.js

@@ -0,0 +1,24 @@
+module.exports = {
+  presets: [["@babel/preset-env", { modules: false }]],
+  plugins: [
+    [
+      "import",
+      {
+        libraryName: "vant",
+        libraryDirectory: "es",
+        // 指定样式路径
+        // style: name => `${name}/style/less`
+        style: true,
+      },
+      "vant",
+    ],
+    ["@babel/plugin-syntax-dynamic-import"],
+    [
+      "component",
+      {
+        libraryName: "element-ui",
+        styleLibraryName: "theme-chalk",
+      },
+    ],
+  ],
+};

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/build.bat

@@ -0,0 +1 @@
+npm run build

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 13281 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/package-lock.json


+ 65 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/package.json

@@ -0,0 +1,65 @@
+{
+  "name": "maizuo-h6",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve --model",
+    "dev": "vue-cli-service serve --model",
+    "prod": "vue-cli-service serve --model production",
+    "build": "vue-cli-service build --model",
+    "push": "git add . && git commit -m'xxx' && git push",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+    "babel-plugin-import": "^1.13.3",
+    "core-js": "^2.6.12",
+    "css-loader": "^3.6.0",
+    "dingtalk-jsapi": "^2.13.42",
+    "echarts": "^4.9.0",
+    "element-ui": "^2.15.13",
+    "font-awesome": "^4.7.0",
+    "jquery": "^3.6.1",
+    "pdfh5": "^1.4.2",
+    "style-loader": "^1.3.0",
+    "vue": "^2.6.12",
+    "vuex-persistedstate": "^2.7.1",
+    "weixin-js-sdk": "^1.6.0"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^3.12.1",
+    "@vue/cli-plugin-eslint": "^3.12.1",
+    "@vue/cli-service": "^4.5.13",
+    "amfe-flexible": "^2.2.1",
+    "autoprefixer": "^9.8.6",
+    "axios": "^0.26.1",
+    "babel-eslint": "^10.1.0",
+    "babel-plugin-component": "^1.1.1",
+    "eslint": "^5.16.0",
+    "eslint-plugin-vue": "^5.2.3",
+    "less": "^3.13.1",
+    "less-loader": "^5.0.0",
+    "postcss-loader": "^3.0.0",
+    "postcss-pxtorem": "^4.0.1",
+    "vant": "^2.12.18",
+    "vue-html5-editor": "^1.1.1",
+    "vue-router": "^3.5.1",
+    "vue-template-compiler": "^2.6.12",
+    "vuex": "^3.6.2"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [],
+    "rules": {},
+    "parserOptions": {
+      "parser": "babel-eslint"
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions"
+  ]
+}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 2 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/public/axios.min.js


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/public/favicon.ico


+ 87 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/public/index.html

@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <!-- <meta name="viewport" content="width=device-width,initial-scale=1.0"> -->
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
+    <link rel="shortcut icon" type="image/x-icon" href="./favicon.ico"/>
+    <title>车间生产管家</title>
+    <link rel="stylesheet" href="https://at.alicdn.com/t/font_1456778_1mgn5degp7t.css">
+    <!-- 引入企业微信js -->
+    <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js" referrerpolicy="origin"></script>
+    <script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js" referrerpolicy="origin"></script>
+    <!-- 接入飞书 -->
+    <script type="text/javascript" src="https://lf1-cdn-tos.bytegoofy.com/goofy/lark/op/h5-js-sdk-1.5.16.js"></script>
+    <!-- <script src="https://s.url.cn/qqun/qun/qqweb/m/qun/confession/js/vconsole.min.js "></script> -->
+
+    <script>
+        // function IsPC() { 
+        //     var userAgentInfo = navigator.userAgent;
+        //     var Agents = ["Android", "iPhone",
+        //                 "SymbianOS", "Windows Phone",
+        //                 "iPad", "iPod"];
+        //     var flag = true;
+        //     for (var v = 0; v < Agents.length; v++) {
+        //         if (userAgentInfo.indexOf(Agents[v]) > 0) {
+        //             flag = false;
+        //             break;
+        //         }
+        //     }
+        //     return flag;
+        // }
+        // var urls = window.location.href
+
+        // // 尝试定向回去, 不行要删除
+        // if(urls.indexOf('jsapi/init') != '-1') {
+        //     location.href = urls.split('jsapi/init')[0]
+        // }
+        // // 尝试定向回去, 不行要删除
+
+        // var flag = IsPC(); //true为PC端,false为手机端
+        // if(flag) {
+        //     console.log('触发')
+        //     // 当前地址为车间生产管家移动端就跳转到车间生产管家官网
+        //     if(urls.indexOf('mobworktime.ttkuaiban') != '-1') {
+        //         location.href = 'https://worktime.ttkuaiban.com';
+        //     } else {
+        //         location.href = 'http://mldworktime.ttkuaiban.com:9097/';
+        //     }
+        // }
+    </script>
+    <style>
+        .dateSelectCell .van-cell__value{
+            -webkit-box-flex: 2;
+            -webkit-flex: 2;
+            flex: 2;
+        }
+        /* 清除浮动 */
+        .clearfix:after{
+            content: ""; 
+            display: block; 
+            height: 0; 
+            clear: both; 
+            visibility: hidden;  
+        }
+        .clearfix {
+            /* 触发 hasLayout */ 
+            zoom: 1; 
+        }
+        .popupSearch .van-search__content {
+            background-color: #FFFFFF !important;
+        }
+        .chooseSomeoneo_group .van-radio__label, .chooseSomeoneo_group .van-checkbox__label {
+          flex: 1 !important;
+        }
+    </style>
+</head>
+
+<body>
+    <noscript>
+        <strong>非常抱歉,网页丢了</strong>
+    </noscript>
+    <div id="app"></div>
+    
+</body>
+
+</html>

+ 186 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/App.vue

@@ -0,0 +1,186 @@
+<template>
+    <div class="h100">
+        <keep-alive>
+            <router-view v-if="$route.meta.keepAlive"></router-view>
+        </keep-alive>
+        <router-view v-if="!$route.meta.keepAlive"></router-view>
+    </div>
+</template>
+
+<script>
+import $ from 'jquery'
+export default {
+    name: "app",
+    created() { },
+    mounted() {
+      let width=$("body").width();
+      console.log(width)
+      if(width>=1200){
+        let fontsize=width/1920*40;//fontsize为当前屏幕的基数字体,相对于设计稿计算得到的。
+        $("html").css("font-size",`${fontsize}px`)
+      }
+      if(width<=750){
+        let fontsize=width/400*40;
+        $("html").css("font-size",`${fontsize}px`)
+      }
+      //当加载页面的时候设置生效
+      window.onresize = () => {
+        return (() => {
+          let width=$("body").width();
+          if(width>=1200){
+            let fontsize=width/1920*40;
+            $("html").css("font-size",`${fontsize}px`)
+          }
+          if(width<=750){
+            let fontsize=width/400*40;
+            $("html").css("font-size",`${fontsize}px`)
+          }
+        })()
+      }
+    }
+};
+</script>
+
+<style>
+  * {
+    font-family: '微软雅黑';
+  }
+  .h100 {
+    height: 100vh;
+    box-sizing: border-box;
+  }
+  /* flex */
+  .flexCoum {
+    display: flex;
+    flex-wrap: wrap;
+    flex-direction: column;
+    height: 100%;
+  }
+  /* 超出隐藏 */
+  .textBeyondHiding {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+
+  .flexCoum-box {
+    flex: 1;
+    overflow: auto;
+  }
+  /* 去除滚动条 */
+  .contentRoll::-webkit-scrollbar { width: 0 !important }
+  .contentRoll { -ms-overflow-style: none; }
+  .contentRoll { overflow: -moz-scrollbars-none; }
+
+  .popupDiv {
+    background: #F4F4F4;
+    position: relative;
+    height: 100%;
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+  }
+  .popupSearch {
+    width: 100%;
+  }
+  .popupCon {
+    width: 100%;
+    overflow: auto;
+    position: relative;
+  }
+  .paddingDiv {
+    box-sizing: border-box;
+    margin: 0 15px;
+  }
+  .popupTitle {
+    color: #333333;
+    padding: 0 30px;
+    position: relative;
+    line-height: 20px;
+  }
+  .popupTitle::after {
+    content: '';
+    width: 3px;
+    height: 100%;
+    border-radius: 3px;
+    background: #409eff;
+    position: absolute;
+    top: 0;
+    left: 15px;
+  }
+  .popupItem {
+    background: #FFFFFF;
+    padding: 10px 10px;
+    border-radius: 6px;
+    margin-top: 14px;
+    position: relative;
+  }
+  .marginTop {
+    margin-top: 15px;
+  }
+  .paddingTop {
+    padding-top: 10px;
+  }
+  .popupItem p {
+    width: 100%;
+    overflow: hidden;
+    white-space:nowrap;
+    text-overflow: ellipsis;
+    line-height: 22px;
+  }
+  .popupItemOne {
+    font-size: 15px;
+    color: #333;
+  }
+  .popupItemTwo {
+    font-size: 13px;
+    color: #999;
+    margin-top: 10px;
+  }
+  .popupItemIcon {
+    position: absolute;
+    right: 7px;
+    top: 50%;
+    font-size: 20px;
+    margin-top: -10px;
+    color: #999;
+  }
+
+  .popupConBox {
+    box-sizing: border-box;
+  }
+  .borderNone {
+    border-radius: 0;
+  }
+  .marginNone {
+    margin: 0 !important;
+  }
+  .popupBtn {
+    padding: 0 15px;
+    margin-top: 10px;
+    margin-bottom: 15px;
+  }
+  .conBorder {
+    width: auto !important;
+    margin: 0 15px;
+    border-radius: 10px;
+    box-sizing: border-box;
+  }
+  
+  .userNameClass_left {
+    display: inline-block;
+    width: 100px;
+  }
+  .userNameClass_right {
+    display: inline-block;
+    width: 150px;
+    float: right;
+    text-align: right;
+    overflow: hidden;
+    white-space:nowrap;
+    text-overflow: ellipsis;
+  }
+</style>
+
+
+

+ 33 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/app.js

@@ -0,0 +1,33 @@
+export function  initWxConfig(vm){
+    var url="/api" + "/wxcorp/getCorpWXConfig";
+    var curUrl=location.href.split("#")[0];
+    var user = JSON.parse(localStorage.userInfo);
+    var params="url="+curUrl+"&token="+user.id;
+    
+    
+    vm.$ajax.post(url,params).then(res=>{
+        var data=res.data;
+        wx.config({ 
+          beta: true,
+          debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
+          appId: data.appid, // 必填,公众号的唯一标识 
+          timestamp: data.timestamp, // 必填,生成签名的时间戳 
+          nonceStr: data.noncestr, // 必填,生成签名的随机串 
+          signature: data.signature, // 必填,签名,见附录1 
+          jsApiList: [
+              'chooseImage',
+              'previewImage',
+              'uploadImage',
+              'downloadImage',
+              'previewFile',
+              'getLocation',
+         ] 
+        });
+        wx.error(function (res) {
+            console.log("调用微信jsapi返回的状态:"+res.errMsg);
+        });
+    }).catch(function(error) {
+        //vm.errorToast(error,1000);
+        console.info(error);
+    })
+}

+ 75 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/collapse.js

@@ -0,0 +1,75 @@
+
+const elTransition =
+  "0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out";
+const Transition = {
+  "before-enter"(el) {
+    el.style.transition = elTransition;
+    if (!el.dataset) el.dataset = {};
+ 
+    el.dataset.oldPaddingTop = el.style.paddingTop;
+    el.dataset.oldPaddingBottom = el.style.paddingBottom;
+ 
+    el.style.height = 0;
+    el.style.paddingTop = 0;
+    el.style.paddingBottom = 0;
+  },
+ 
+  enter(el) {
+    el.dataset.oldOverflow = el.style.overflow;
+    if (el.scrollHeight !== 0) {
+      el.style.height = el.scrollHeight + "px";
+      el.style.paddingTop = el.dataset.oldPaddingTop;
+      el.style.paddingBottom = el.dataset.oldPaddingBottom;
+    } else {
+      el.style.height = "";
+      el.style.paddingTop = el.dataset.oldPaddingTop;
+      el.style.paddingBottom = el.dataset.oldPaddingBottom;
+    }
+ 
+    el.style.overflow = "hidden";
+  },
+ 
+  "after-enter"(el) {
+    el.style.transition = "";
+    el.style.height = "";
+    el.style.overflow = el.dataset.oldOverflow;
+  },
+ 
+  "before-leave"(el) {
+    if (!el.dataset) el.dataset = {};
+    el.dataset.oldPaddingTop = el.style.paddingTop;
+    el.dataset.oldPaddingBottom = el.style.paddingBottom;
+    el.dataset.oldOverflow = el.style.overflow;
+ 
+    el.style.height = el.scrollHeight + "px";
+    el.style.overflow = "hidden";
+  },
+ 
+  leave(el) {
+    if (el.scrollHeight !== 0) {
+      el.style.transition = elTransition;
+      el.style.height = 0;
+      el.style.paddingTop = 0;
+      el.style.paddingBottom = 0;
+    }
+  },
+ 
+  "after-leave"(el) {
+    el.style.transition = "";
+    el.style.height = "";
+    el.style.overflow = el.dataset.oldOverflow;
+    el.style.paddingTop = el.dataset.oldPaddingTop;
+    el.style.paddingBottom = el.dataset.oldPaddingBottom;
+  }
+};
+ 
+export default {
+  name: "collapseTransition",
+  functional: true,
+  render(h, { children }) {
+    const data = {
+      on: Transition
+    };
+    return h("transition", data, children);
+  }
+};

BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/icon/kefu.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/1.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/jz1.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/jz2.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/jz3.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/jz4.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/r1.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/r2.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/r3.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/r4.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/MovieDetails/r5.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/alt.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/chong.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/cover/1.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/cover/2.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/cover/3.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/cover/4.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/cover/5.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/hb1.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/hb2.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/tx1.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/tx2.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/tx3.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/group/tx4.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/banner_1.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/banner_2.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/banner_3.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/check.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/edit.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/more.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/my.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/home/wait.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/index/banner4.jpeg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/index/banner_1.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/index/banner_2.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/index/banner_3.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/kf.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/login_logo.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/logo.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/not.jpeg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/null.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/orderList1.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/orderList2.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/beij.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/cl.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/dt.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/hb.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/head_back.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/p.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/qb.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/tg.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/tx.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/userHead.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/personal/yhk.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/poster/1.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/poster/2.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/poster/3.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/poster/4.jpg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/qwcode.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/qx.png


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/img/qxbj.png


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/shju.json


+ 363 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/common.less

@@ -0,0 +1,363 @@
+body {
+  background: #f4f4f4;
+  font-size: 16px !important;
+}
+
+.bd {
+  border: 1px solid;
+}
+
+.bdb {
+  border-bottom: 1px solid #ebebeb;
+}
+
+.ovh {
+  overflow: hidden;
+}
+
+.h100pc {
+  height: 100%;
+}
+
+.w100pc {
+  width: 100%;
+}
+
+.dsn {
+  display: none;
+}
+
+.fixed {
+  position: fixed;
+}
+
+.rel {
+  position: relative;
+}
+
+.abs {
+  position: absolute;
+}
+
+.tac {
+  text-align: center;
+}
+
+.lh15 {
+  line-height: 1.5;
+}
+
+/* 颜色 */
+.f999 {
+  color: #999;
+}
+
+.fff {
+  color: #ffffff;
+}
+
+.orange {
+  color: #ff5f16;
+}
+
+/* 背景颜色 */
+.bg-green {
+  background: green;
+}
+
+.bg-gray {
+  background: gray;
+}
+
+.bg-fff {
+  background: #ffffff;
+}
+
+/* 弹性盒子公共样式 */
+/* 排列方向-横向排列 */
+.flex {
+  display: flex;
+}
+
+/* 纵向排列 */
+.flex2 {
+  display: flex;
+  flex-direction: column;
+}
+
+/* 水平居中,垂直居中 */
+.fcc {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+/* 两端对齐 */
+.jc-sb {
+  justify-content: space-between;
+}
+
+/* 分散对齐 */
+.jc-sa {
+  justify-content: space-around;
+}
+
+/* 垂直居中 */
+.aic {
+  align-items: center;
+}
+
+/* 分配剩余空间 */
+.fg1 {
+  flex-grow: 1;
+}
+
+.fg2 {
+  flex-grow: 2;
+}
+
+
+/* 字体设置 */
+.f0 {
+  font-size: 0px
+}
+
+.f8 {
+  font-size: 8px
+}
+
+.f10 {
+  font-size: 10px
+}
+
+.f12 {
+  font-size: 12px
+}
+
+.f14 {
+  font-size: 14px
+}
+
+.f16 {
+  font-size: 16px
+}
+
+.f18 {
+  font-size: 18px
+}
+
+.f20 {
+  font-size: 20px
+}
+
+.f22 {
+  font-size: 22px
+}
+
+.f24 {
+  font-size: 24px
+}
+
+.f26 {
+  font-size: 26px
+}
+
+/* margin-top设置 */
+.mt-5 {
+  margin-top: 5px;
+}
+
+.mt-10 {
+  margin-top: 10px;
+}
+
+.mt-15 {
+  margin-top: 15px;
+}
+
+.mt-20 {
+  margin-top: 20px;
+}
+
+.mt-25 {
+  margin-top: 25px;
+}
+
+.mt-30 {
+  margin-top: 30px;
+}
+
+/* margin-bottom设置 */
+.mb-5 {
+  margin-bottom: 5px;
+}
+
+.mb-10 {
+  margin-bottom: 10px;
+}
+
+.mb-15 {
+  margin-bottom: 15px;
+}
+
+.mb-20 {
+  margin-bottom: 20px;
+}
+
+.mb-25 {
+  margin-bottom: 25px;
+}
+
+.mb-30 {
+  margin-bottom: 30px;
+}
+
+/* margin-left设置 */
+.ml-5 {
+  margin-left: 5px;
+}
+
+.ml-10 {
+  margin-left: 10px;
+}
+
+.ml-15 {
+  margin-left: 15px;
+}
+
+.ml-20 {
+  margin-left: 20px;
+}
+
+.ml-25 {
+  margin-left: 25px;
+}
+
+.ml-30 {
+  margin-left: 30px;
+}
+
+/* margin-right设置 */
+.mr-5 {
+  margin-right: 5px;
+}
+
+.mr-10 {
+  margin-right: 10px;
+}
+
+.mr-15 {
+  margin-right: 15px;
+}
+
+.mr-20 {
+  margin-right: 20px;
+}
+
+.mr-25 {
+  margin-right: 25px;
+}
+
+.mr-30 {
+  margin-right: 30px;
+}
+
+/* padding-top设置 */
+.pt-5 {
+  padding-top: 5px;
+}
+
+.pt-10 {
+  padding-top: 10px;
+}
+
+.pt-15 {
+  padding-top: 15px;
+}
+
+.pt-20 {
+  padding-top: 20px;
+}
+
+.pt-25 {
+  padding-top: 25px;
+}
+
+.pt-30 {
+  padding-top: 30px;
+}
+
+/* padding-bottom设置 */
+.pb-5 {
+  padding-bottom: 5px;
+}
+
+.pb-10 {
+  padding-bottom: 10px;
+}
+
+.pb-15 {
+  padding-bottom: 15px;
+}
+
+.pb-20 {
+  padding-bottom: 20px;
+}
+
+.pb-25 {
+  padding-bottom: 25px;
+}
+
+.pb-30 {
+  padding-bottom: 30px;
+}
+
+/* padding-left设置 */
+.pl-5 {
+  padding-left: 5px;
+}
+
+.pl-10 {
+  padding-left: 10px;
+}
+
+.pl-15 {
+  padding-left: 15px;
+}
+
+.pl-20 {
+  padding-left: 20px;
+}
+
+.pl-25 {
+  padding-left: 25px;
+}
+
+.pl-30 {
+  padding-left: 30px;
+}
+
+/* padding-right设置 */
+.pr-5 {
+  padding-right: 5px;
+}
+
+.pr-10 {
+  padding-right: 10px;
+}
+
+.pr-15 {
+  padding-right: 15px;
+}
+
+.pr-20 {
+  padding-right: 20px;
+}
+
+.pr-25 {
+  padding-right: 25px;
+}
+
+.pr-30 {
+  padding-right: 30px;
+}

+ 539 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1706 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/demo_index.html


+ 279 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.css

@@ -0,0 +1,279 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 2390497 */
+  src: url('iconfont.woff2?t=1653388410123') format('woff2'),
+       url('iconfont.woff?t=1653388410123') format('woff'),
+       url('iconfont.ttf?t=1653388410123') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.firerock-icondakajilu:before {
+  content: "\e6e1";
+}
+
+.firerock-iconguanlian:before {
+  content: "\e674";
+}
+
+.firerock-iconusers:before {
+  content: "\e70a";
+}
+
+.firerock-iconquanxian1:before {
+  content: "\e615";
+}
+
+.firerock-iconxitong-:before {
+  content: "\e616";
+}
+
+.firerock-iconkehu:before {
+  content: "\e67e";
+}
+
+.firerock-iconwj-qjd:before {
+  content: "\e70e";
+}
+
+.firerock-icondaibanshixiang:before {
+  content: "\ec4e";
+}
+
+.firerock-icondaiban:before {
+  content: "\e64b";
+}
+
+.firerock-icongongshitongji:before {
+  content: "\e614";
+}
+
+.firerock-iconshenhetongguo:before {
+  content: "\e6a0";
+}
+
+.firerock-iconshenhebohui:before {
+  content: "\e6c6";
+}
+
+.firerock-icondaibandengdaishenhe:before {
+  content: "\e612";
+}
+
+.firerock-iconjianzhugongchenglei:before {
+  content: "\e61e";
+}
+
+.firerock-icongantetu:before {
+  content: "\e6a1";
+}
+
+.firerock-iconkehuguanli:before {
+  content: "\e60f";
+}
+
+.firerock-iconliucheng:before {
+  content: "\e634";
+}
+
+.firerock-iconright:before {
+  content: "\e60e";
+}
+
+.firerock-iconApp_New_Line:before {
+  content: "\e6e3";
+}
+
+.firerock-icon0:before {
+  content: "\e609";
+}
+
+.firerock-iconInsertLine:before {
+  content: "\e61d";
+}
+
+.firerock-iconmima:before {
+  content: "\e611";
+}
+
+.firerock-iconmima1:before {
+  content: "\e608";
+}
+
+.firerock-iconyanzhengma:before {
+  content: "\e60d";
+}
+
+.firerock-icondot:before {
+  content: "\e60b";
+}
+
+.firerock-icondot2:before {
+  content: "\e607";
+}
+
+.firerock-iconbaobiao:before {
+  content: "\e636";
+}
+
+.firerock-iconzuzhijiagou1:before {
+  content: "\e698";
+}
+
+.firerock-icontianbao1:before {
+  content: "\e60a";
+}
+
+.firerock-iconzuzhijiagou:before {
+  content: "\e606";
+}
+
+.firerock-iconzuzhijiegou:before {
+  content: "\e670";
+}
+
+.firerock-iconquanxian:before {
+  content: "\e663";
+}
+
+.firerock-iconbaoxiao:before {
+  content: "\e788";
+}
+
+.firerock-iconbaoxiaodan:before {
+  content: "\e644";
+}
+
+.firerock-icontianbao:before {
+  content: "\e726";
+}
+
+.firerock-iconrecord:before {
+  content: "\e605";
+}
+
+.firerock-icondaoru:before {
+  content: "\e613";
+}
+
+.firerock-icondaochu:before {
+  content: "\e6ab";
+}
+
+.firerock-iconexport:before {
+  content: "\e72d";
+}
+
+.firerock-iconqidong:before {
+  content: "\e63c";
+}
+
+.firerock-iconwancheng:before {
+  content: "\e610";
+}
+
+.firerock-iconcaidan:before {
+  content: "\e6b7";
+}
+
+.firerock-iconshenhe:before {
+  content: "\e604";
+}
+
+.firerock-iconicon-:before {
+  content: "\e6ad";
+}
+
+.firerock-iconrenwu:before {
+  content: "\e64c";
+}
+
+.firerock-iconfengxian:before {
+  content: "\e6a2";
+}
+
+.firerock-iconnormal-ico-ok:before {
+  content: "\e70f";
+}
+
+.firerock-iconicon2:before {
+  content: "\e603";
+}
+
+.firerock-iconfile:before {
+  content: "\e60c";
+}
+
+.firerock-iconex:before {
+  content: "\e65c";
+}
+
+.firerock-iconZip:before {
+  content: "\e9ec";
+}
+
+.firerock-iconJPG:before {
+  content: "\e6ed";
+}
+
+.firerock-iconaudio:before {
+  content: "\e602";
+}
+
+.firerock-icontxt:before {
+  content: "\e741";
+}
+
+.firerock-iconvideo:before {
+  content: "\e771";
+}
+
+.firerock-iconPDF:before {
+  content: "\e61a";
+}
+
+.firerock-iconword:before {
+  content: "\eecf";
+}
+
+.firerock-iconshangchuan:before {
+  content: "\e6fd";
+}
+
+.firerock-iconmiaobiao:before {
+  content: "\ecfa";
+}
+
+.firerock-icontask:before {
+  content: "\e600";
+}
+
+.firerock-iconmeditor-time:before {
+  content: "\e601";
+}
+
+.firerock-icontree:before {
+  content: "\e691";
+}
+
+.firerock-icontongji:before {
+  content: "\e631";
+}
+
+.firerock-iconxiangmu:before {
+  content: "\e617";
+}
+
+.firerock-iconcaiwu:before {
+  content: "\e89c";
+}
+
+.firerock-iconsetting:before {
+  content: "\e672";
+}
+

BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.eot


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.js


+ 471 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.json

@@ -0,0 +1,471 @@
+{
+  "id": "2390497",
+  "name": "seyaproject",
+  "font_family": "iconfont",
+  "css_prefix_text": "firerock-icon",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "15673407",
+      "name": "打卡记录",
+      "font_class": "dakajilu",
+      "unicode": "e6e1",
+      "unicode_decimal": 59105
+    },
+    {
+      "icon_id": "5651484",
+      "name": "关联",
+      "font_class": "guanlian",
+      "unicode": "e674",
+      "unicode_decimal": 58996
+    },
+    {
+      "icon_id": "14949575",
+      "name": "users",
+      "font_class": "users",
+      "unicode": "e70a",
+      "unicode_decimal": 59146
+    },
+    {
+      "icon_id": "736503",
+      "name": "权限",
+      "font_class": "quanxian1",
+      "unicode": "e615",
+      "unicode_decimal": 58901
+    },
+    {
+      "icon_id": "7987507",
+      "name": "系统",
+      "font_class": "xitong-",
+      "unicode": "e616",
+      "unicode_decimal": 58902
+    },
+    {
+      "icon_id": "11111002",
+      "name": "客户",
+      "font_class": "kehu",
+      "unicode": "e67e",
+      "unicode_decimal": 59006
+    },
+    {
+      "icon_id": "6517457",
+      "name": "文件-请假单",
+      "font_class": "wj-qjd",
+      "unicode": "e70e",
+      "unicode_decimal": 59150
+    },
+    {
+      "icon_id": "5961300",
+      "name": "待办事项",
+      "font_class": "daibanshixiang",
+      "unicode": "ec4e",
+      "unicode_decimal": 60494
+    },
+    {
+      "icon_id": "11465003",
+      "name": "待办",
+      "font_class": "daiban",
+      "unicode": "e64b",
+      "unicode_decimal": 58955
+    },
+    {
+      "icon_id": "6023953",
+      "name": "工时统计",
+      "font_class": "gongshitongji",
+      "unicode": "e614",
+      "unicode_decimal": 58900
+    },
+    {
+      "icon_id": "2318254",
+      "name": "审核通过",
+      "font_class": "shenhetongguo",
+      "unicode": "e6a0",
+      "unicode_decimal": 59040
+    },
+    {
+      "icon_id": "9144552",
+      "name": "审核驳回",
+      "font_class": "shenhebohui",
+      "unicode": "e6c6",
+      "unicode_decimal": 59078
+    },
+    {
+      "icon_id": "17483402",
+      "name": "待办  等待 审核",
+      "font_class": "daibandengdaishenhe",
+      "unicode": "e612",
+      "unicode_decimal": 58898
+    },
+    {
+      "icon_id": "5149104",
+      "name": "建筑工程类",
+      "font_class": "jianzhugongchenglei",
+      "unicode": "e61e",
+      "unicode_decimal": 58910
+    },
+    {
+      "icon_id": "16187171",
+      "name": "甘特图",
+      "font_class": "gantetu",
+      "unicode": "e6a1",
+      "unicode_decimal": 59041
+    },
+    {
+      "icon_id": "3686260",
+      "name": "客户管理",
+      "font_class": "kehuguanli",
+      "unicode": "e60f",
+      "unicode_decimal": 58895
+    },
+    {
+      "icon_id": "1868952",
+      "name": "流程",
+      "font_class": "liucheng",
+      "unicode": "e634",
+      "unicode_decimal": 58932
+    },
+    {
+      "icon_id": "9651039",
+      "name": "长箭头",
+      "font_class": "right",
+      "unicode": "e60e",
+      "unicode_decimal": 58894
+    },
+    {
+      "icon_id": "17223736",
+      "name": "App_New_Line",
+      "font_class": "App_New_Line",
+      "unicode": "e6e3",
+      "unicode_decimal": 59107
+    },
+    {
+      "icon_id": "261001",
+      "name": "line",
+      "font_class": "0",
+      "unicode": "e609",
+      "unicode_decimal": 58889
+    },
+    {
+      "icon_id": "17197893",
+      "name": "Insert Line",
+      "font_class": "InsertLine",
+      "unicode": "e61d",
+      "unicode_decimal": 58909
+    },
+    {
+      "icon_id": "19410111",
+      "name": "密 码",
+      "font_class": "mima",
+      "unicode": "e611",
+      "unicode_decimal": 58897
+    },
+    {
+      "icon_id": "16842350",
+      "name": "密 码",
+      "font_class": "mima1",
+      "unicode": "e608",
+      "unicode_decimal": 58888
+    },
+    {
+      "icon_id": "20915138",
+      "name": "验证码",
+      "font_class": "yanzhengma",
+      "unicode": "e60d",
+      "unicode_decimal": 58893
+    },
+    {
+      "icon_id": "11640993",
+      "name": "dot",
+      "font_class": "dot",
+      "unicode": "e60b",
+      "unicode_decimal": 58891
+    },
+    {
+      "icon_id": "9382963",
+      "name": "dot",
+      "font_class": "dot2",
+      "unicode": "e607",
+      "unicode_decimal": 58887
+    },
+    {
+      "icon_id": "7171606",
+      "name": "报表管理",
+      "font_class": "baobiao",
+      "unicode": "e636",
+      "unicode_decimal": 58934
+    },
+    {
+      "icon_id": "4426098",
+      "name": "组织架构",
+      "font_class": "zuzhijiagou1",
+      "unicode": "e698",
+      "unicode_decimal": 59032
+    },
+    {
+      "icon_id": "13100227",
+      "name": "填报",
+      "font_class": "tianbao1",
+      "unicode": "e60a",
+      "unicode_decimal": 58890
+    },
+    {
+      "icon_id": "4469651",
+      "name": "组织架构",
+      "font_class": "zuzhijiagou",
+      "unicode": "e606",
+      "unicode_decimal": 58886
+    },
+    {
+      "icon_id": "4231111",
+      "name": "组织结构",
+      "font_class": "zuzhijiegou",
+      "unicode": "e670",
+      "unicode_decimal": 58992
+    },
+    {
+      "icon_id": "12860884",
+      "name": "权限",
+      "font_class": "quanxian",
+      "unicode": "e663",
+      "unicode_decimal": 58979
+    },
+    {
+      "icon_id": "2101853",
+      "name": "报销",
+      "font_class": "baoxiao",
+      "unicode": "e788",
+      "unicode_decimal": 59272
+    },
+    {
+      "icon_id": "5207594",
+      "name": "报销单",
+      "font_class": "baoxiaodan",
+      "unicode": "e644",
+      "unicode_decimal": 58948
+    },
+    {
+      "icon_id": "19236386",
+      "name": "填报",
+      "font_class": "tianbao",
+      "unicode": "e726",
+      "unicode_decimal": 59174
+    },
+    {
+      "icon_id": "12000587",
+      "name": "记录",
+      "font_class": "record",
+      "unicode": "e605",
+      "unicode_decimal": 58885
+    },
+    {
+      "icon_id": "20147073",
+      "name": "导入",
+      "font_class": "daoru",
+      "unicode": "e613",
+      "unicode_decimal": 58899
+    },
+    {
+      "icon_id": "20154661",
+      "name": "导出",
+      "font_class": "daochu",
+      "unicode": "e6ab",
+      "unicode_decimal": 59051
+    },
+    {
+      "icon_id": "19441448",
+      "name": "export",
+      "font_class": "export",
+      "unicode": "e72d",
+      "unicode_decimal": 59181
+    },
+    {
+      "icon_id": "8796451",
+      "name": "启动",
+      "font_class": "qidong",
+      "unicode": "e63c",
+      "unicode_decimal": 58940
+    },
+    {
+      "icon_id": "19037188",
+      "name": "完 成 ",
+      "font_class": "wancheng",
+      "unicode": "e610",
+      "unicode_decimal": 58896
+    },
+    {
+      "icon_id": "20134686",
+      "name": "菜单",
+      "font_class": "caidan",
+      "unicode": "e6b7",
+      "unicode_decimal": 59063
+    },
+    {
+      "icon_id": "8524192",
+      "name": "审核",
+      "font_class": "shenhe",
+      "unicode": "e604",
+      "unicode_decimal": 58884
+    },
+    {
+      "icon_id": "3590688",
+      "name": "里程碑",
+      "font_class": "icon-",
+      "unicode": "e6ad",
+      "unicode_decimal": 59053
+    },
+    {
+      "icon_id": "5112963",
+      "name": "任务",
+      "font_class": "renwu",
+      "unicode": "e64c",
+      "unicode_decimal": 58956
+    },
+    {
+      "icon_id": "10368440",
+      "name": "风险",
+      "font_class": "fengxian",
+      "unicode": "e6a2",
+      "unicode_decimal": 59042
+    },
+    {
+      "icon_id": "17156568",
+      "name": "ok",
+      "font_class": "normal-ico-ok",
+      "unicode": "e70f",
+      "unicode_decimal": 59151
+    },
+    {
+      "icon_id": "1161198",
+      "name": "棱形",
+      "font_class": "icon2",
+      "unicode": "e603",
+      "unicode_decimal": 58883
+    },
+    {
+      "icon_id": "10202911",
+      "name": "file",
+      "font_class": "file",
+      "unicode": "e60c",
+      "unicode_decimal": 58892
+    },
+    {
+      "icon_id": "2078615",
+      "name": "excel",
+      "font_class": "ex",
+      "unicode": "e65c",
+      "unicode_decimal": 58972
+    },
+    {
+      "icon_id": "4073514",
+      "name": "Zip",
+      "font_class": "Zip",
+      "unicode": "e9ec",
+      "unicode_decimal": 59884
+    },
+    {
+      "icon_id": "4863362",
+      "name": "JPG",
+      "font_class": "JPG",
+      "unicode": "e6ed",
+      "unicode_decimal": 59117
+    },
+    {
+      "icon_id": "5173010",
+      "name": "audio",
+      "font_class": "audio",
+      "unicode": "e602",
+      "unicode_decimal": 58882
+    },
+    {
+      "icon_id": "8469709",
+      "name": "txt",
+      "font_class": "txt",
+      "unicode": "e741",
+      "unicode_decimal": 59201
+    },
+    {
+      "icon_id": "19705514",
+      "name": "video",
+      "font_class": "video",
+      "unicode": "e771",
+      "unicode_decimal": 59249
+    },
+    {
+      "icon_id": "20213818",
+      "name": "PDF",
+      "font_class": "PDF",
+      "unicode": "e61a",
+      "unicode_decimal": 58906
+    },
+    {
+      "icon_id": "20651005",
+      "name": "word",
+      "font_class": "word",
+      "unicode": "eecf",
+      "unicode_decimal": 61135
+    },
+    {
+      "icon_id": "17781647",
+      "name": "上 传",
+      "font_class": "shangchuan",
+      "unicode": "e6fd",
+      "unicode_decimal": 59133
+    },
+    {
+      "icon_id": "7337849",
+      "name": "秒表",
+      "font_class": "miaobiao",
+      "unicode": "ecfa",
+      "unicode_decimal": 60666
+    },
+    {
+      "icon_id": "8659928",
+      "name": "task",
+      "font_class": "task",
+      "unicode": "e600",
+      "unicode_decimal": 58880
+    },
+    {
+      "icon_id": "13530978",
+      "name": "time",
+      "font_class": "meditor-time",
+      "unicode": "e601",
+      "unicode_decimal": 58881
+    },
+    {
+      "icon_id": "9339879",
+      "name": "tree",
+      "font_class": "tree",
+      "unicode": "e691",
+      "unicode_decimal": 59025
+    },
+    {
+      "icon_id": "807967",
+      "name": "统计",
+      "font_class": "tongji",
+      "unicode": "e631",
+      "unicode_decimal": 58929
+    },
+    {
+      "icon_id": "1778691",
+      "name": "项目",
+      "font_class": "xiangmu",
+      "unicode": "e617",
+      "unicode_decimal": 58903
+    },
+    {
+      "icon_id": "14417643",
+      "name": "财务",
+      "font_class": "caiwu",
+      "unicode": "e89c",
+      "unicode_decimal": 59548
+    },
+    {
+      "icon_id": "11673579",
+      "name": "setting",
+      "font_class": "setting",
+      "unicode": "e672",
+      "unicode_decimal": 58994
+    }
+  ]
+}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 92 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.svg


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.ttf


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.woff


BIN
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/font/iconfont.woff2


+ 4 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/index.less

@@ -0,0 +1,4 @@
+// @import './reset.less';
+@import './rerset.less';
+@import './common.less';
+@import './font/iconfont.css';

+ 347 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/rerset.less

@@ -0,0 +1,347 @@
+html,
+body,
+div,
+span,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+abbr,
+address,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+ins,
+kbd,
+q,
+samp,
+small,
+strong,
+sub,
+sup,
+var,
+b,
+i,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td,
+article,
+aside,
+canvas,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section,
+summary,
+time,
+mark,
+audio,
+video {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    outline: 0;
+    font-size: 100%;
+    vertical-align: baseline;
+    background: transparent;
+    box-sizing: border-box;
+}
+
+body {
+    line-height: 1
+}
+
+:focus {
+    outline: 1
+}
+
+article,
+aside,
+canvas,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section,
+summary {
+    display: block
+}
+
+ul {
+    list-style: none
+}
+
+blockquote,
+q {
+    quotes: none
+}
+
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+    content: '';
+    content: none
+}
+
+a {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    font-size: 100%;
+    vertical-align: baseline;
+    background: transparent;
+    text-decoration: none;
+    color: black
+}
+
+ins {
+    background-color: #ff9;
+    color: #000;
+    text-decoration: none
+}
+
+mark {
+    background-color: #ff9;
+    color: #000;
+    font-style: italic;
+    font-weight: bold
+}
+
+del {
+    text-decoration: line-through
+}
+
+abbr[title],
+dfn[title] {
+    border-bottom: 1px dotted #000;
+    cursor: help
+}
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0
+}
+
+hr {
+    display: block;
+    height: 1px;
+    border: 0;
+    border-top: 1px solid #cccccc;
+    margin: 1em 0;
+    padding: 0
+}
+
+input,
+select {
+    vertical-align: middle
+}
+
+html,
+body,
+div,
+span,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+abbr,
+address,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+ins,
+kbd,
+q,
+samp,
+small,
+strong,
+sub,
+sup,
+var,
+b,
+i,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td,
+article,
+aside,
+canvas,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section,
+summary,
+time,
+mark,
+audio,
+video {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    outline: 0;
+    font-size: 100%;
+    vertical-align: baseline;
+    background: transparent
+}
+
+a {
+    text-decoration: none;
+    color: black
+}
+
+body {
+    line-height: 1
+}
+
+:focus {
+    outline: 1
+}
+
+article,
+aside,
+canvas,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section,
+summary {
+    display: block
+}
+
+ul {
+    list-style: none
+}
+
+blockquote,
+q {
+    quotes: none
+}
+
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+    content: '';
+    content: none
+}
+
+a {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    font-size: 100%;
+    vertical-align: baseline;
+    background: transparent
+}
+
+ins {
+    background-color: #ff9;
+    color: #000;
+    text-decoration: none
+}
+
+mark {
+    background-color: #ff9;
+    color: #000;
+    font-style: italic;
+    font-weight: bold
+}
+
+del {
+    text-decoration: line-through
+}
+
+abbr[title],
+dfn[title] {
+    border-bottom: 1px dotted #000;
+    cursor: help
+}
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0
+}
+
+hr {
+    display: block;
+    height: 1px;
+    border: 0;
+    border-top: 1px solid #cccccc;
+    margin: 1em 0;
+    padding: 0
+}
+
+input,
+select {
+    vertical-align: middle
+}

+ 719 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/assets/style/theme.less

@@ -0,0 +1,719 @@
+// Basic Colors
+@black: #000;
+@white: #fff;
+@red: rgb(192, 49, 49);
+@blue: #1989fa;
+@orange: #ff976a;
+@orange-dark: #ed6a0c;
+@orange-light: #fffbe8;
+@green: #07c160;
+@gray: #c8c9cc;
+@gray-light: #e5e5e5;
+@gray-darker: #7d7e80;
+@gray-dark: #969799;
+
+// Gradient Colors
+@gradient-red: linear-gradient(to right, #ff6034, #ee0a24);
+@gradient-orange: linear-gradient(to right, #ffd01e, #ff8917);
+
+// Component Colors
+@text-color: #323233;
+@active-color: #f2f3f5;
+@active-opacity: .7;
+@disabled-opacity: .5;
+@background-color: #f8f8f8;
+@background-color-light: #fafafa;
+
+// Padding
+@padding-base: 4px;
+@padding-xs: @padding-base * 2;
+@padding-sm: @padding-base * 3;
+@padding-md: @padding-base * 4;
+@padding-lg: @padding-base * 6;
+@padding-xl: @padding-base * 8;
+
+// Font
+@font-size-xs: 10px;
+@font-size-sm: 12px;
+@font-size-md: 14px;
+@font-size-lg: 16px;
+@font-weight-bold: 500;
+
+// Animation
+@animation-duration-base: .3s;
+@animation-duration-fast: .2s;
+
+// Border
+@border-color: #ebedf0;
+@border-width-base: 1px;
+@border-radius-sm: 2px;
+@border-radius-md: 4px;
+@border-radius-max: 999px;
+
+// ActionSheet
+@action-sheet-max-height: 90%;
+@action-sheet-header-height: 44px;
+@action-sheet-header-font-size: @font-size-lg;
+@action-sheet-description-color: @gray-darker;
+@action-sheet-description-font-size: @font-size-md;
+@action-sheet-description-line-height: 20px;
+@action-sheet-item-height: 50px;
+@action-sheet-item-background: @white;
+@action-sheet-item-font-size: @font-size-lg;
+@action-sheet-item-text-color: @text-color;
+@action-sheet-item-disabled-text-color: @gray;
+@action-sheet-subname-color: @gray-darker;
+@action-sheet-subname-font-size: @font-size-sm;
+@action-sheet-close-icon-size: 18px;
+@action-sheet-close-icon-color: @gray-dark;
+@action-sheet-close-icon-padding: 0 @padding-sm;
+@action-sheet-cancel-padding-top: @padding-xs;
+@action-sheet-cancel-padding-color: @background-color;
+
+// AddressEdit
+@address-edit-buttons-padding: @padding-xl @padding-md;
+@address-edit-button-margin-bottom: @padding-sm;
+@address-edit-detail-finish-color: @blue;
+@address-edit-detail-finish-font-size: @font-size-sm;
+
+// AddressList
+@address-list-disabled-text-color: @gray-dark;
+@address-list-disabled-text-font-size: @font-size-sm;
+@address-list-disabled-text-line-height: 30px;
+@address-list-add-button-z-index: 999;
+@address-list-item-padding: @padding-md;
+@address-list-item-text-color: @gray-darker;
+@address-list-item-disabled-text-color: @gray-dark;
+@address-list-item-font-size: @font-size-sm;
+@address-list-item-line-height: 16px;
+@address-list-item-radio-icon-color: @red;
+@address-list-edit-icon-size: 16px;
+
+// Button
+@button-mini-height: 22px;
+@button-mini-min-width: 50px;
+@button-mini-font-size: @font-size-xs;
+@button-mini-line-height: 20px;
+@button-small-height: 30px;
+@button-small-font-size: @font-size-sm;
+@button-small-min-width: 60px;
+@button-small-line-height: 28px;
+@button-normal-font-size: @font-size-md;
+@button-large-height: 50px;
+@button-large-line-height: 48px;
+@button-default-height: 44px;
+@button-default-line-height: 42px;
+@button-default-font-size: @font-size-lg;
+@button-default-color: @text-color;
+@button-default-background-color: @white;
+@button-default-border-color: @border-color;
+@button-primary-color: @white;
+@button-primary-background-color: @green;
+@button-primary-border-color: @green;
+@button-info-color: @white;
+@button-info-background-color: @blue;
+@button-info-border-color: @blue;
+@button-danger-color: @white;
+@button-danger-background-color: @red;
+@button-danger-border-color: @red;
+@button-warning-color: @white;
+@button-warning-background-color: @orange;
+@button-warning-border-color: @orange;
+@button-border-width: @border-width-base;
+@button-border-radius: @border-radius-sm;
+@button-round-border-radius: @border-radius-max;
+@button-plain-background-color: @white;
+@button-disabled-opacity: @disabled-opacity;
+
+// Card
+@card-padding: @padding-xs @padding-md;
+@card-font-size: @font-size-sm;
+@card-text-color: @text-color;
+@card-background-color: @background-color-light;
+@card-thumb-size: 90px;
+@card-title-line-height: 16px;
+@card-desc-color: @gray-darker;
+@card-desc-line-height: 20px;
+@card-price-color: @red;
+@card-origin-price-color: @gray-darker;
+@card-origin-price-font-size: @font-size-xs;
+
+// Cell
+@cell-font-size: @font-size-md;
+@cell-line-height: 24px;
+@cell-vertical-padding: 10px;
+@cell-horizontal-padding: @padding-md;
+@cell-text-color: @text-color;
+@cell-background-color: @white;
+@cell-border-color: @border-color;
+@cell-active-color: @active-color;
+@cell-required-color: @red;
+@cell-label-color: @gray-dark;
+@cell-label-font-size: @font-size-sm;
+@cell-label-line-height: 18px;
+@cell-label-margin-top: 3px;
+@cell-value-color: @gray-dark;
+@cell-icon-size: 16px;
+@cell-right-icon-color: @gray-dark;
+@cell-large-vertical-padding: @padding-sm;
+@cell-large-title-font-size: @font-size-lg;
+@cell-large-label-font-size: @font-size-md;
+
+// CellGroup
+@cell-group-background-color: @white;
+@cell-group-title-color: @gray-dark;
+@cell-group-title-padding: @padding-md @padding-md @padding-xs;
+@cell-group-title-font-size: @font-size-md;
+@cell-group-title-line-height: 16px;
+
+// Checkbox
+@checkbox-size: 20px;
+@checkbox-border-color: @gray-light;
+@checkbox-transition-duration: @animation-duration-fast;
+@checkbox-label-margin: @padding-xs;
+@checkbox-label-color: @text-color;
+@checkbox-checked-icon-color: @blue;
+@checkbox-disabled-icon-color: @gray;
+@checkbox-disabled-label-color: @gray;
+@checkbox-disabled-background-color: @border-color;
+
+// Circle
+@circle-text-color: @text-color;
+@circle-text-font-weight: @font-weight-bold;
+@circle-text-font-size: @font-size-md;
+@circle-text-line-height: 18px;
+
+// Collapse
+@collapse-item-transition-duration: @animation-duration-base;
+@collapse-item-content-padding: @padding-md;
+@collapse-item-content-font-size: 13px;
+@collapse-item-content-line-height: 1.5;
+@collapse-item-content-text-color: @gray-dark;
+@collapse-item-content-background-color: @white;
+@collapse-item-title-disabled-color: @gray;
+
+// ContactCard
+@contact-card-padding: @padding-md;
+@contact-card-add-icon-size: 40px;
+@contact-card-add-icon-color: @blue;
+@contact-card-value-line-height: 20px;
+
+// ContactEdit
+@contact-edit-buttons-padding: @padding-xl @padding-md;
+@contact-edit-button-margin-bottom: @padding-sm;
+@contact-edit-field-label-width: 65px;
+
+// ContactList
+@contact-list-edit-icon-size: 16px;
+@contact-list-add-button-z-index: 999;
+@contact-list-item-padding: @padding-md;
+
+// CountDown
+@count-down-text-color: @text-color;
+@count-down-font-size: @font-size-md;
+@count-down-line-height: 20px;
+
+// Coupon
+@coupon-margin: 0 @padding-md @padding-md;
+@coupon-content-height: 100px;
+@coupon-content-padding: @padding-lg 0 0 @padding-md;
+@coupon-background-color: @white;
+@coupon-active-background-color: @active-color;
+@coupon-border-radius: @border-radius-md;
+@coupon-box-shadow: 0 0 4px rgba(0, 0, 0, 0.1);
+@coupon-head-width: 85px;
+@coupon-amount-color: @red;
+@coupon-amount-font-size: 24px;
+@coupon-currency-font-size: 50%;
+@coupon-name-font-size: @font-size-lg;
+@coupon-disabled-text-color: @gray-dark;
+@coupon-description-padding: @padding-xs @padding-md;
+@coupon-description-background-color: @background-color-light;
+@coupon-description-border-color: @border-color;
+
+// CouponCell
+@coupon-cell-selected-text-color: @text-color;
+
+// CouponList
+@coupon-list-background-color: @background-color;
+@coupon-list-field-padding: @padding-xs @padding-md;
+@coupon-list-exchange-button-height: 32px;
+@coupon-list-empty-image-size: 200px;
+@coupon-list-empty-tip-color: @gray-dark;
+@coupon-list-empty-tip-font-size: @font-size-md;
+@coupon-list-empty-tip-line-height: 20px;
+
+// Dialog
+@dialog-width: 320px;
+@dialog-small-screen-width: 90%;
+@dialog-font-size: @font-size-lg;
+@dialog-transition: @animation-duration-base;
+@dialog-border-radius: 16px;
+@dialog-background-color: @white;
+@dialog-header-font-weight: @font-weight-bold;
+@dialog-header-line-height: 24px;
+@dialog-header-padding-top: @padding-lg;
+@dialog-header-isolated-padding: @padding-lg 0;
+@dialog-message-padding: @padding-lg;
+@dialog-message-font-size: @font-size-md;
+@dialog-message-line-height: 20px;
+@dialog-message-max-height: 60vh;
+@dialog-has-title-message-text-color: @gray-darker;
+@dialog-has-title-message-padding-top: @padding-sm;
+@dialog-confirm-button-text-color: @blue;
+
+// Divider
+@divider-margin: @padding-md 0;
+@divider-text-color: @gray-dark;
+@divider-font-size: @font-size-md;
+@divider-line-height: 24px;
+@divider-border-color: @border-color;
+@divider-content-padding: @padding-md;
+@divider-content-left-width: 10%;
+@divider-content-right-width: 10%;
+
+// DropdownMenu
+@dropdown-menu-height: 50px;
+@dropdown-menu-background-color: @white;
+@dropdown-menu-title-font-size: 15px;
+@dropdown-menu-title-text-color: @text-color;
+@dropdown-menu-title-active-text-color: @blue;
+@dropdown-menu-title-disabled-text-color: @gray-dark;
+@dropdown-menu-title-padding: 0 @padding-xs;
+@dropdown-menu-title-line-height: 18px;
+@dropdown-menu-option-active-color: @blue;
+@dropdown-menu-content-max-height: 80%;
+
+// Field
+@field-label-width: 90px;
+@field-input-text-color: @text-color;
+@field-input-error-text-color: @red;
+@field-input-disabled-text-color: @gray-dark;
+@field-placeholder-text-color: @gray-dark;
+@field-icon-size: 16px;
+@field-clear-icon-size: 16px;
+@field-clear-icon-color: @gray;
+@field-right-icon-color: @gray-dark;
+@field-error-message-color: @red;
+@field-error-message-text-color: 12px;
+@field-text-area-min-height: 60px;
+@field-word-limit-color: @gray-darker;
+@field-word-limit-font-size: @font-size-sm;
+@field-word-limit-line-height: 16px;
+
+// GridItem
+@grid-item-content-padding: @padding-md @padding-xs;
+@grid-item-content-background-color: @white;
+@grid-item-content-active-color: @active-color;
+@grid-item-icon-size: 28px;
+@grid-item-text-color: @gray-darker;
+@grid-item-text-font-size: @font-size-sm;
+
+// GoodsAction
+@goods-action-background-color: @white;
+@goods-action-icon-width: 48px;
+@goods-action-icon-height: 50px;
+@goods-action-icon-color: @text-color;
+@goods-action-icon-size: 18px;
+@goods-action-icon-font-size: @font-size-xs;
+@goods-action-icon-active-color: @active-color;
+@goods-action-icon-text-color: @gray-darker;
+@goods-action-button-height: 40px;
+@goods-action-button-warning-color: @gradient-orange;
+@goods-action-button-danger-color: @gradient-red;
+
+// IndexAnchor
+@index-anchor-padding: 0 @padding-md;
+@index-anchor-text-color: @text-color;
+@index-anchor-font-weight: @font-weight-bold;
+@index-anchor-font-size: @font-size-md;
+@index-anchor-line-height: 32px;
+@index-anchor-background-color: transparent;
+@index-anchor-sticky-background-color: @white;
+
+// IndexBar
+@index-bar-index-font-size: @font-size-xs;
+@index-bar-index-line-height: 14px;
+
+// Info
+@info-size: 16px;
+@info-color: @white;
+@info-padding: 0 3px;
+@info-font-size: @font-size-sm;
+@info-font-weight: @font-weight-bold;
+@info-border-width: @border-width-base;
+@info-background-color: @red;
+@info-dot-color: @red;
+@info-dot-size: 8px;
+@info-font-family: PingFang SC, Helvetica Neue, Arial, sans-serif;
+
+// Image
+@image-placeholder-text-color: @gray-dark;
+@image-placeholder-font-size: @font-size-md;
+@image-placeholder-background-color: @background-color;
+
+// ImagePreview
+@image-preview-index-text-color: @white;
+@image-preview-index-font-size: @font-size-md;
+@image-preview-overlay-background-color: rgba(0, 0, 0, .9);
+
+// List
+@list-icon-margin-right: 5px;
+@list-text-color: @gray-dark;
+@list-text-font-size: @font-size-md;
+@list-text-line-height: 50px;
+
+// Loading
+@loading-text-color: @gray-dark;
+@loading-text-font-size: @font-size-md;
+@loading-spinner-color: @gray;
+@loading-spinner-size: 30px;
+@loading-spinner-animation-duration: .8s;
+
+// NavBar
+@nav-bar-height: 46px;
+@nav-bar-background-color: @white;
+@nav-bar-arrow-size: 16px;
+// @nav-bar-icon-color: @blue;
+// @nav-bar-text-color: @blue;
+@nav-bar-icon-color: @red;
+@nav-bar-text-color: @red;
+@nav-bar-title-font-size: @font-size-lg;
+@nav-bar-title-text-color: @text-color;
+
+// NoticeBar
+@notice-bar-height: 40px;
+@notice-bar-padding: 0 @padding-md;
+@notice-bar-wrapable-padding: @padding-xs @padding-md;
+@notice-bar-text-color: @orange-dark;
+@notice-bar-font-size: @font-size-md;
+@notice-bar-line-height: 24px;
+@notice-bar-background-color: @orange-light;
+@notice-bar-icon-size: 16px;
+@notice-bar-icon-min-width: 22px;
+
+// Notify
+@notify-padding: @padding-xs @padding-md;
+@notify-font-size: @font-size-md;
+@notify-line-height: 20px;
+@notify-primary-background-color: @blue;
+@notify-success-background-color: @green;
+@notify-danger-background-color: @red;
+@notify-warning-background-color: @orange;
+
+// NumberKeyboard
+@number-keyboard-background-color: @white;
+@number-keyboard-key-height: 54px;
+@number-keyboard-key-background: #ebedf0;
+@number-keyboard-key-font-size: 24px;
+@number-keyboard-key-active-color: @active-color;
+@number-keyboard-delete-font-size: @font-size-lg;
+@number-keyboard-title-color: @gray-darker;
+@number-keyboard-title-height: 30px;
+@number-keyboard-title-font-size: @font-size-md;
+@number-keyboard-close-padding: 0 @padding-md;
+@number-keyboard-close-color: @blue;
+@number-keyboard-close-font-size: @font-size-md;
+@number-keyboard-button-text-color: @white;
+@number-keyboard-button-background-color: @blue;
+@number-keyboard-cursor-color: @text-color;
+@number-keyboard-cursor-width: 1px;
+@number-keyboard-cursor-height: 40%;
+@number-keyboard-cursor-animation-duration: 1s;
+
+// Overlay
+@overlay-background-color: rgba(0, 0, 0, 0.7);
+
+// Pagination
+@pagination-height: 40px;
+@pagination-font-size: @font-size-md;
+@pagination-item-width: 36px;
+@pagination-item-default-color: @blue;
+@pagination-item-disabled-color: @gray-darker;
+@pagination-item-disabled-background-color: @background-color;
+@pagination-background-color: @white;
+@pagination-desc-color: @gray-darker;
+@pagination-disabled-opacity: @disabled-opacity;
+
+// Panel
+@panel-background-color: @white;
+@panel-header-value-color: @red;
+@panel-footer-padding: @padding-xs @padding-md;
+
+// PasswordInput
+@password-input-height: 50px;
+@password-input-margin: 0 @padding-md;
+@password-input-font-size: 20px;
+@password-input-border-radius: 6px;
+@password-input-background-color: @white;
+@password-input-info-color: @gray-dark;
+@password-input-info-font-size: @font-size-md;
+@password-input-error-info-color: @red;
+@password-input-dot-size: 10px;
+@password-input-dot-color: @black;
+
+// Picker
+@picker-background-color: @white;
+@picker-toolbar-height: 44px;
+@picker-title-font-size: @font-size-lg;
+@picker-action-padding: 0 @padding-md;
+@picker-action-font-size: @font-size-md;
+@picker-action-text-color: @blue;
+@picker-action-active-color: @active-color;
+@picker-option-font-size: @font-size-lg;
+@picker-option-text-color: @black;
+@picker-option-disabled-opacity: .3;
+@picker-loading-icon-color: @blue;
+@picker-loading-mask-color: rgba(255, 255, 255, .9);
+
+// Popup
+@popup-background-color: @white;
+@popup-transition: transform @animation-duration-base ease-out;
+@popup-round-border-radius: 20px;
+@popup-close-icon-size: 18px;
+@popup-close-icon-color: @gray-dark;
+@popup-close-icon-margin: 16px;
+@popup-close-icon-z-index: 1;
+
+// Progress
+@progress-height: 4px;
+@progress-color: @blue;
+@progress-background-color: @gray-light;
+@progress-pivot-padding: 0 5px;
+@progress-pivot-text-color: @white;
+@progress-pivot-font-size: @font-size-xs;
+@progress-pivot-line-height: 1.6;
+@progress-pivot-background-color: @blue;
+
+// PullRefresh
+@pull-refresh-head-height: 50px;
+@pull-refresh-head-font-size: @font-size-md;
+@pull-refresh-head-text-color: @gray-dark;
+
+// Radio
+@radio-size: 20px;
+@radio-border-color: @gray-light;
+@radio-transition-duration: @animation-duration-fast;
+@radio-label-margin: @padding-xs;
+@radio-label-color: @text-color;
+@radio-checked-icon-color: @blue;
+@radio-disabled-icon-color: @gray;
+@radio-disabled-label-color: @gray;
+@radio-disabled-background-color: @border-color;
+
+// Rate
+@rate-icon-size: 20px;
+@rate-icon-gutter: 4px;
+
+// Search
+@search-padding: 10px @padding-sm;
+@search-background-color: #f7f8fA;
+@search-input-height: 34px;
+@search-label-padding: 0 5px;
+@search-label-color: @text-color;
+@search-label-font-size: @font-size-md;
+@search-left-icon-color: @gray-dark;
+@search-action-padding: 0 @padding-xs;
+@search-action-text-color: @text-color;
+@search-action-font-size: @font-size-md;
+
+// Sidebar
+@sidebar-width: 85px;
+
+// SidebarItem
+@sidebar-font-size: @font-size-md;
+@sidebar-line-height: 20px;
+@sidebar-text-color: @text-color;
+@sidebar-disabled-text-color: @gray;
+@sidebar-padding: 20px @padding-sm 20px @padding-xs;
+@sidebar-active-color: @active-color;
+@sidebar-background-color: @background-color-light;
+@sidebar-selected-font-weight: @font-weight-bold;
+@sidebar-selected-text-color: @text-color;
+@sidebar-selected-border-color: @red;
+@sidebar-selected-background-color: @white;
+
+// Skeleton
+@skeleton-row-height: 16px;
+@skeleton-row-background-color: @active-color;
+@skeleton-row-margin-top: @padding-sm;
+@skeleton-avatar-background-color: @active-color;
+@skeleton-animation-duration: 1.2s;
+
+// Slider
+@slider-active-background-color: @blue;
+@slider-inactive-background-color: @gray-light;
+@slider-disabled-opacity: @disabled-opacity;
+@slider-button-width: 24px;
+@slider-button-height: 24px;
+@slider-button-border-radius: 50%;
+@slider-button-background-color: @white;
+@slider-button-box-shadow: 0 1px 2px rgba(0, 0, 0, .5);
+
+// Step
+@step-text-color: @gray-dark;
+@step-process-text-color: @text-color;
+@step-font-size: @font-size-md;
+@step-line-color: @border-color;
+@step-finish-line-color: @green;
+@step-finish-text-color: @text-color;
+@step-icon-size: 12px;
+@step-circle-size: 5px;
+@step-circle-color: @gray-dark;
+@step-horizontal-title-font-size: @font-size-sm;
+
+// Steps
+@steps-background-color: @white;
+
+// Sticky
+@sticky-z-index: 99;
+
+// Stepper
+@stepper-active-color: #e8e8e8;
+@stepper-background-color: @active-color;
+@stepper-button-icon-color: @text-color;
+@stepper-button-disabled-color: #f7f8fa;
+@stepper-button-disabled-icon-color: @gray;
+@stepper-input-width: 32px;
+@stepper-input-height: 28px;
+@stepper-input-font-size: @font-size-md;
+@stepper-input-text-color: @text-color;
+@stepper-input-disabled-text-color: @gray;
+@stepper-input-disabled-background-color: @active-color;
+@stepper-border-radius: @border-radius-md;
+
+// SubmitBar
+@submit-bar-height: 50px;
+@submit-bar-z-index: 100;
+@submit-bar-background-color: @white;
+@submit-bar-button-width: 110px;
+@submit-bar-price-color: @red;
+@submit-bar-price-font-size: 18px;
+@submit-bar-currency-font-size: @font-size-md;
+@submit-bar-text-color: @text-color;
+@submit-bar-text-font-size: @font-size-md;
+@submit-bar-tip-padding: @padding-xs @padding-sm;
+@submit-bar-tip-font-size: @font-size-sm;
+@submit-bar-tip-line-height: 1.5;
+@submit-bar-tip-color: #f56723;
+@submit-bar-tip-background-color: #fff7cc;
+@submit-bar-tip-icon-size: 12px;
+
+// Swipe
+@swipe-indicator-size: 6px;
+@swipe-indicator-margin: @padding-sm;
+@swipe-indicator-active-opacity: 1;
+@swipe-indicator-inactive-opacity: .3;
+@swipe-indicator-active-background-color: @blue;
+@swipe-indicator-inactive-background-color: @border-color;
+
+// Switch
+@switch-width: 2em;
+@switch-height: 1em;
+@switch-node-size: 1em;
+@switch-node-z-index: 1;
+@switch-node-background-color: @white;
+@switch-node-box-shadow: 0 3px 1px 0 rgba(0, 0, 0, .05), 0 2px 2px 0 rgba(0, 0, 0, .1), 0 3px 3px 0 rgba(0, 0, 0, .05);
+@switch-background-color: @white;
+@switch-on-background-color: @blue;
+@switch-transition-duration: @animation-duration-base;
+@switch-disabled-opacity: @disabled-opacity;
+@switch-border: @border-width-base solid rgba(0, 0, 0, .1);
+
+// SwitchCell
+@switch-cell-padding-top: @cell-vertical-padding - 1px;
+@switch-cell-padding-bottom: @cell-vertical-padding - 1px;
+@switch-cell-large-padding-top: @cell-large-vertical-padding - 1px;
+@switch-cell-large-padding-bottom: @cell-large-vertical-padding - 1px;
+
+// Tabbar
+@tabbar-height: 50px;
+@tabbar-background-color: @white;
+
+// TabbarItem
+@tabbar-item-font-size: @font-size-sm;
+@tabbar-item-text-color: @gray-darker;
+@tabbar-item-active-color: @blue;
+@tabbar-item-line-height: 1;
+@tabbar-item-icon-size: 18px;
+@tabbar-item-margin-bottom: 5px;
+
+// Tab
+@tab-text-color: @gray-darker;
+@tab-active-text-color: @text-color;
+@tab-disabled-text-color: @gray;
+@tab-font-size: @font-size-md;
+
+// Tabs
+@tabs-default-color: @red;
+@tabs-line-height: 44px;
+@tabs-card-height: 30px;
+@tabs-nav-background-color: @white;
+@tabs-bottom-bar-height: 3px;
+@tabs-bottom-bar-color: @tabs-default-color;
+
+// Tag
+@tag-padding: .2em .5em;
+@tag-font-size: @font-size-xs;
+@tag-medium-font-size: @font-size-sm;
+@tag-large-font-size: @font-size-md;
+@tag-text-color: @white;
+@tag-border-radius: .2em;
+@tag-round-border-radius: @border-radius-max;
+@tag-dander-color: @red;
+@tag-primary-color: @blue;
+@tag-success-color: @green;
+@tag-warning-color: @orange;
+@tag-default-color: @gray-dark;
+@tag-plain-background-color: @white;
+
+// Toast
+@toast-max-width: 70%;
+@toast-font-size: @font-size-md;
+@toast-text-color: @white;
+@toast-loading-icon-color: @white;
+@toast-line-height: 20px;
+@toast-border-radius: @border-radius-md;
+@toast-background-color: rgba(@text-color, .88);
+@toast-icon-size: 40px;
+@toast-text-min-width: 96px;
+@toast-text-padding: @padding-xs @padding-sm;
+@toast-default-padding: @padding-md;
+@toast-default-width: 90px;
+@toast-default-min-height: 90px;
+@toast-position-top-distance: 50px;
+@toast-position-bottom-distance: 50px;
+
+// TreeSelect
+@tree-select-font-size: @font-size-md;
+@tree-select-nav-background-color: @background-color-light;
+@tree-select-content-background-color: @white;
+@tree-select-nav-item-padding: @padding-sm @padding-xs @padding-sm @padding-sm;
+@tree-select-item-height: 44px;
+@tree-select-item-active-color: @red;
+@tree-select-item-disabled-color: @gray;
+
+// Uploader
+@uploader-size: 80px;
+@uploader-icon-size: 24px;
+@uploader-icon-color: @gray-dark;
+@uploader-text-color: @gray-dark;
+@uploader-text-font-size: @font-size-sm;
+@uploader-upload-border-color: @gray-light;
+@uploader-upload-border-radius: 4px;
+@uploader-upload-background-color: @white;
+@uploader-delete-color: @gray-dark;
+@uploader-delete-icon-size: 18px;
+@uploader-delete-background-color: @white;
+@uploader-file-background-color: @background-color;
+@uploader-file-icon-size: 20px;
+@uploader-file-icon-color: @gray-darker;
+@uploader-file-name-padding: 0 @padding-base;
+@uploader-file-name-margin-top: @padding-xs;
+@uploader-file-name-font-size: @font-size-sm;
+@uploader-file-name-text-color: @gray-darker;
+
+// Sku
+@sku-item-background-color: #f7f8fa;
+@sku-icon-gray-color: #dcdde0;
+@sku-upload-mask-color: rgba(50, 50, 51, .8);

+ 6 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/Element.js

@@ -0,0 +1,6 @@
+import Vue from 'vue'
+import { Tree, Radio, Checkbox } from 'element-ui'
+import 'element-ui/lib/theme-chalk/index.css';
+Vue.use(Tree)
+Vue.use(Radio)
+Vue.use(Checkbox)

+ 85 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/Footer.vue

@@ -0,0 +1,85 @@
+<template>
+    <div>
+        <ul class="footer flex jc-sa w100pc fixed bott0 bg-fff aic footer">
+            <li class="item">
+                <router-link to="/index" class="flex2 aic f20 yellow" active-class="active">
+                    <i class="icon-home iconfont f18 text"></i>
+                    <p class="mt-5 f12 text">首页</p>
+                </router-link>
+            </li>
+            <li class="item" v-if="reportsCompany || this.user.manageDeptId != 0 || reportsDept">
+                <router-link to="/count" class="flex2 aic f20 text" active-class="active">
+                    <van-icon class="text" name="bar-chart-o" />
+                    <p class="mt-5 text f12">填报统计</p>
+                </router-link>
+            </li>
+            <li class="item" v-if="cost">
+                <router-link to="/cost" class="flex2 aic f20 text" active-class="active">
+                    <van-icon class="text" name="after-sale" />
+                    <p class="mt-5 text f12">成本统计</p>
+                </router-link>
+            </li>
+            <li class="item">
+                <router-link to="/my" class="flex2 aic f20 text" active-class="active">
+                    <van-icon class="text" name="user-o"></van-icon>
+                    <p class="mt-5 text f12">我的</p>
+                </router-link>
+            </li>
+    </ul>
+  </div>
+</template>
+
+<script>
+    export default {
+        data() {
+            return {
+                user: JSON.parse(localStorage.userInfo),
+                reportsCompany: false,
+                reportsDept: false,
+                cost: false
+            }
+        },
+        mounted() {
+            this.dealWith()
+        },
+        methods: {
+            dealWith() {
+                this.user = JSON.parse(localStorage.userInfo)
+                this.reportsCompany = false
+                this.reportsDept = false
+                this.cost = false
+                for(let i in this.user.functionList){
+                    if(this.user.functionList[i].name == '查看全公司工时'){
+                        this.reportsCompany = true
+                    }
+                    if(this.user.functionList[i].name == '查看本部门工时'){
+                        this.reportsDept = true
+                    }
+                }
+                for(let i in this.user.moduleList){
+                    if(this.user.moduleList[i].name == '工时成本统计'){
+                        this.cost = true
+                    }
+                }
+            }
+        }
+    };
+</script>
+
+<style scoped lang="less">
+    .footer {
+        border-top: 1px solid #ebebeb;
+        height: 50px;
+        position: fixed;
+        bottom: 0;
+        width: 100%;
+        left: 0;
+        z-index: 10;
+        .text {
+            color: #797d82;
+        }
+        .active .text {
+            color: #20a0ff;
+        }
+    }
+</style>

+ 23 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/NotFound.vue

@@ -0,0 +1,23 @@
+<template>
+  <div class="not-found">
+    <van-nav-bar title left-text="返回" left-arrow @click-left="$router.go(-1)"></van-nav-bar>
+    <img src="../assets/img/not.jpeg" alt />
+  </div>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style lang="less">
+.not-found {
+  .van-nav-bar {
+    background: #ececec;
+  }
+  img {
+    width: 100%;
+  }
+  min-height: 100vh;
+  background: #ececec;
+}
+</style>

+ 38 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/Vant.js

@@ -0,0 +1,38 @@
+import Vue from "vue";
+import {
+  Icon,
+  Tab,
+  Tabs,
+  List,
+  Cell,
+  Button,
+  Popup,
+  Field,
+  Dialog,
+  Toast,
+  Swipe,
+  SwipeItem,
+  Area,
+  NavBar,
+  CellGroup,
+  Image,
+  Sticky
+} from "vant";
+
+Vue.use(Icon);
+Vue.use(Tab);
+Vue.use(Tabs);
+Vue.use(List);
+Vue.use(Cell);
+Vue.use(Button);
+Vue.use(Popup);
+Vue.use(Field);
+Vue.use(Dialog);
+Vue.use(Toast);
+Vue.use(Swipe);
+Vue.use(SwipeItem);
+Vue.use(Area);
+Vue.use(NavBar);
+Vue.use(CellGroup);
+Vue.use(Image);
+Vue.use(Sticky);

+ 373 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/chooseSomeone.vue

@@ -0,0 +1,373 @@
+<template>
+  <div class="chooseSomeone">
+    <p style="line-height: 30px;text-align: center;" v-if="typeSHow">请选择要{{type?'替换':'新增'}}的人员</p>
+    <div class="chooseSomeone_selsect">
+      <van-search v-model.trim="selectValue" shape="round" background="#F4F4F4" placeholder="请输入姓名" @search="onSearch"
+        @input="onSearch"></van-search>
+    </div>
+    <div class="chooseSomeone_Con contentRoll">
+      <!-- 单选 -->
+      <van-radio-group v-model="radioVal" class="chooseSomeoneo_group" v-if="newGroupView == 1">
+        <van-radio :name="item.id" v-for="item, index in personnelList" :key="index">
+          <div class="chooseSomeone_group_item">
+            <div>{{ item.name }}</div>
+            <div class="textBeyondHiding">{{ item.jobNumber }}</div>
+          </div>
+          <div class="textDepartmentName">{{ item.departmentName }}</div>
+        </van-radio>
+      </van-radio-group>
+
+      <!-- 复选 -->
+      <van-checkbox-group v-model="groupVal" class="chooseSomeoneo_group" v-if="newGroupView == 2">
+        <van-checkbox :name="item.id" v-for="item, index in personnelList" :key="index">
+          <div class="chooseSomeone_group_item">
+            <div>{{ item.name }}</div>
+            <div class="textBeyondHiding">{{ item.jobNumber }}</div>
+          </div>
+          <div class="textDepartmentName">{{ item.departmentName }}</div>
+        </van-checkbox>
+      </van-checkbox-group>
+
+      <!-- tree -->
+      <div class="treeBox" v-show="newGroupView == 3">
+        <div class="treeBox_tree_text" v-if="!newGroupViewBack && groupView"
+          @click="newGroupViewBackCli(true, groupView)"><van-icon name="arrow-left" />返回</div>
+        <div class="treeBox_tree">
+          <el-tree ref="tree" v-model="treeVal" show-checkbox node-key="id" :data="personnelTree" :props="defaultProps"
+            :filter-node-method="filterNode">
+            <span class="custom-tree-node" slot-scope="{ node }">
+              <span>
+                {{ node.label }}
+              </span>
+            </span>
+          </el-tree>
+        </div>
+      </div>
+    </div>
+    <div class="chooseSomeone_btn" v-if="newGroupViewBack">
+      <van-button round size="small" v-if="newGroupViewBack" @click="newGroupViewBackCli(false, 3)">从其他工位选择员工</van-button>
+      <van-button round type="info" size="small" :loading="loadingBtn" @click="handClick()">确定</van-button>
+    </div>
+    <div class="chooseSomeone_btn" v-if="!newGroupViewBack">
+      <van-button round type="info" size="small" style="width: 100%;" :loading="loadingBtn" @click="treeHandClick()">确定</van-button>
+    </div>
+  </div>
+</template>
+
+<script>
+/**
+ * peopleList 数据格式要求
+ * 传过来的数据必须包含 以下四个字段
+ * id: 人员id
+ * name: 人员姓名
+ * phone: 人员电话
+ * jobNumber: 人员工号
+ */
+export default {
+  props: {
+    isAdd: {
+      type: Number,
+      default: () => 1 
+    },
+    groupView: {
+      type: Number,
+      default: () => 1 // 1单选 2复选 3tree
+    },
+    groupViewBack: {
+      type: Boolean,
+      default: () => false // 是否显示从其他工位选择员工
+    },
+    peopleList: {
+      type: Array,
+      default: () => []
+    },
+    peopleListId: { // 选中的Id
+      type: Array,
+      default: () => []
+    },
+    type:{
+      type:Number,
+      default:()=> 0//0新增 1换人,
+    },
+    typeSHow:{
+      type: Boolean,
+      default:()=> true, 
+    },
+  },
+  components: {},
+  data() {
+    return {
+      selectValue: '',
+      radioVal: '',
+      groupVal: [],
+      treeVal: [],
+      // 人员数组
+      personnelList: [],
+      personnelTree: [],
+      newPersonnelTree: [],
+      defaultProps: {
+        children: 'children',
+        label: 'label'
+      },
+
+      newGroupView: '', // 组件传过来的值
+      newGroupViewBack: '', // 组件传过来的值
+
+      loadingBtn: false, // 确定按钮loading
+    };
+  },
+  computed: {},
+  watch: {
+    selectValue(val) {
+      this.$refs.tree.filter(val);
+    }
+  },
+  created() { },
+  mounted() {
+    this.newGroupView = JSON.parse(JSON.stringify(this.groupView))
+    this.newGroupViewBack = JSON.parse(JSON.stringify(this.groupViewBack))
+    this.personnelList = JSON.parse(JSON.stringify(this.peopleList))
+    let newPpeopleListId = JSON.parse(JSON.stringify(this.peopleListId))
+    if (newPpeopleListId.length > 0) {
+      if (this.groupView == 1) {
+        this.radioVal = newPpeopleListId[0]
+      } else if (this.groupView == 2) {
+        this.groupVal = newPpeopleListId
+      } else if (this.groupView == 3) {
+        // tree 额外处理
+        console.log('tree 额外处理')
+      }
+    }
+    console.log(this.groupVal)
+    if (this.peopleList.length <= 0) {
+      this.getPeople()
+    }
+    this.getDepartmentPersonnel()
+  },
+  methods: {
+    onSearch() {
+      if (!this.selectValue) {
+        this.personnelList = JSON.parse(JSON.stringify(this.peopleList))
+        return
+      }
+      if (this.groupView != 3) {
+        this.personnelList = this.personnelList.filter(item => {
+          return item.name.indexOf(this.selectValue) != -1 || item.jobNumber.indexOf(this.selectValue) != -1
+        })
+      }
+      console.log(this.personnelList)
+    },
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    newGroupViewBackCli(flg, i) {
+      this.newGroupViewBack = flg
+      if(this.type != 1) {
+      this.newGroupView = i
+      this.$refs.tree.setCheckedKeys(this.groupVal)
+      } else {
+          this.getPeople()
+      }
+      
+    },
+    // 获取所有人员
+    getPeople() {
+      this.$axios.post('/user/getSimpleActiveUserList', {})
+        .then(res => {
+          if (res.code == "ok") {
+            // if (!this.peopleList) {
+              this.personnelList = res.data.map(item => {
+                return {
+                  name: item.name,
+                  id: item.id,
+                  phone: item.phone,
+                  jobNumber: item.jobNumber,
+                  departmentName: item.departmentName
+                }
+              })
+            // }
+          } else {
+            this.$toast.clear();
+            this.$toast.fail(res.msg);
+          }
+        }).catch(err => { this.$toast.clear(); });
+    },
+    // 获取部门人员
+    getDepartmentPersonnel() {
+      this.$axios.post('/department/listAllMemb', {})
+        .then(res => {
+          if (res.code == "ok") {
+            let list = res.data;
+            this.setUserToDept(res.data)
+            this.personnelTree = list
+            this.newPersonnelTree = JSON.parse(JSON.stringify(list))
+            console.log(this.personnelTree)
+          } else {
+            this.$toast.clear();
+            this.$toast.fail(res.msg);
+          }
+        }).catch(err => { this.$toast.clear(); });
+    },
+    // 递归设置人员到部门
+    setUserToDept(list) {
+      for (var i in list) {
+        if (list[i].children != null) {
+          this.setUserToDept(list[i].children);
+        }
+
+        if (list[i].userList != null) {
+          if (list[i].children == null) {
+            list[i].children = [];
+          }
+          list[i].userList.forEach(element => {
+            var obj = { id: element.id, label: element.name, parentId: element.departmentId, isUser: 1 };
+            list[i].children.push(obj);
+          });
+        }
+      }
+    },
+    // 单选和复选点击确定触发的事件
+    handClick() {
+      let arr = this.groupView == 1 ? [this.radioVal] : this.groupVal
+      let newArr = this.personnelList.filter(item => {
+        return arr.includes(item.id)
+      })
+      console.log(newArr)
+      // return
+      this.loadingBtn = true
+      this.$emit('ChooseSomeoneChanhe', newArr)
+    },
+    treeHandClick() {
+      if(this.newGroupView == 3) {
+        let arr = this.$refs.tree.getCheckedNodes()
+        arr = arr.filter(item => {
+          return !item.children
+        })
+        console.log(arr)
+        if(arr.length <= 0) {
+          this.$toast('请选择人员');
+          return
+        }
+         let newArr = arr.map(item => {
+          return {
+            id: item.id,
+            name: item.label || '',
+            phone: item.phone || '',
+            jobNumber: item.jobNumber || '',
+            departmentName: item.departmentName || ''
+          }
+        })
+        this.loadingBtn = true
+        this.$emit('ChooseSomeoneChanhe', newArr)
+      } else {
+        this.handClick()
+      }
+    }
+  },
+};
+</script>
+
+<style scoped lang="less">
+* {
+  box-sizing: border-box;
+}
+.textDepartmentName {
+  color: #999;
+  font-size: 14px;
+}
+.chooseSomeone {
+  display: flex;
+  flex-wrap: wrap;
+  flex-direction: column;
+  width: 100%;
+  height: 100%;
+  padding: 10px 15px 0px 15px;
+
+  .chooseSomeone_selsect {
+    .van-search__content {
+      background-color: #fff;
+    }
+  }
+
+  .treeBox {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+
+    .treeBox_tree {
+      flex: 1;
+      overflow-y: auto;
+      padding: 10px;
+    }
+
+    .treeBox_tree_text {
+      font-size: 14px;
+      color: #999;
+      display: flex;
+      align-items: center;
+      padding: 8px;
+
+      .van-icon {
+        margin-right: 6px;
+      }
+    }
+
+    // 调整组件的默认样式
+    .el-tree-node__content {
+      height: 30px;
+    }
+  }
+
+  .chooseSomeone_Con {
+    flex: 1;
+    background-color: #fff;
+    border-radius: 10px;
+    overflow-y: auto;
+    padding: 10px;
+
+    .chooseSomeoneo_group, .chooseSomeone_radio_group {
+
+      .van-radio,
+      .van-checkbox {
+        width: 100%;
+        padding: 10px;
+        font-size: 16px;
+        color: #333;
+        border-bottom: 1px solid #F4F4F4;
+
+        .van-radio__label {
+          flex: 1 !important;
+        }
+
+        .van-checkbox__label {
+          flex: 1 !important;
+        }
+      }
+
+      .chooseSomeone_group_item, .chooseSomeone_radio_group_item {
+        display: flex;
+        justify-content: space-between;
+
+        div:last-child {
+          font-size: 12px;
+          color: #999;
+          width: 50%;
+          text-align: right;
+        }
+      }
+    }
+  }
+
+  .chooseSomeone_btn {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    height: 50px;
+
+    .van-button {
+      width: 48%;
+    }
+  }
+}</style>

+ 41 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/components/demo.vue

@@ -0,0 +1,41 @@
+
+<template>
+  <div>
+    <div></div>
+    <Footer page="demo"></Footer>
+  </div>
+</template>
+
+<script>
+import Footer from "@/components/Footer";
+export default {
+  components: {
+    Footer
+  },
+  i18n: {
+    "zh-CN": {
+      type: "加载类型",
+      color: "自定义颜色",
+      text: "加载文案"
+    },
+    "en-US": {
+      type: "Type",
+      color: "Color",
+      text: "Text"
+    }
+  }
+};
+</script>
+
+<style lang="less" scoped>
+div {
+  height: 100px;
+  width: 100px;
+  background: green;
+}
+.van-loading {
+  display: inline-block;
+  margin: 5px 0 5px 20px;
+  background: gray;
+}
+</style>

+ 157 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/main.js

@@ -0,0 +1,157 @@
+import Vue from "vue";
+// import "vant/lib/index.css";
+import App from "./App.vue";
+import router from "./router/index";
+// import "@/assets/style/font/iconfont.css";
+
+import "@/assets/style/index.less";
+import $axios from "@/utils/request";
+import store from "./store/index";
+
+import axios from 'axios'; /* 引入axios进行地址访问*/
+Vue.prototype.$http = axios;
+
+import "@/components/Vant";
+import './components/Element.js'
+
+import { Form , Toast , Grid, GridItem , DatetimePicker , Popover,
+Picker , Dialog , NumberKeyboard , Sticky , Skeleton ,
+Panel , Divider , List , pullRefresh , SwipeCell, Checkbox, 
+Search, Slider,Stepper,Tag, Calendar, Row, Col, RadioGroup, Radio, 
+Loading ,DropdownMenu, DropdownItem, Button, ActionSheet, PullRefresh,Tabbar,
+TabbarItem,Uploader,Collapse, CollapseItem,Empty, CheckboxGroup, } from 'vant';
+
+Vue.use(Form).use(Toast).use(Grid).use(GridItem).use(DatetimePicker)
+.use(Picker).use(Dialog).use(NumberKeyboard).use(Sticky).use(Skeleton)
+.use(Panel).use(Divider).use(List).use(pullRefresh).use(SwipeCell)
+.use(Checkbox).use(Search).use(Slider).use(Stepper).use(Tag).use(Calendar).use(RadioGroup).use(Radio)
+.use(Row).use(Col).use(Loading).use(DropdownMenu).use(DropdownItem).use(Button).use(ActionSheet)
+.use(PullRefresh).use(Tabbar).use(TabbarItem).use(Popover).use(Uploader).use(Collapse).use(CollapseItem).use(Empty).use(CheckboxGroup);
+
+// rem
+import "amfe-flexible";
+
+import wx from 'weixin-js-sdk'
+Vue.prototype.wx = wx
+// 把变量挂载到vue的原型上
+axios.defaults.baseURL="http://localhost:10010"
+Vue.prototype.$axios = $axios;
+
+Vue.config.productionTip = false;
+import * as echarts from 'echarts';
+Vue.prototype.$echarts = echarts;
+
+// 富文本
+import 'font-awesome/css/font-awesome.css' 
+import VueHtml5Editor from 'vue-html5-editor'
+Vue.use(VueHtml5Editor, {
+    name: "vue-html5-editor",
+    showModuleName: false,
+    icons: {
+        text: "fa fa-pencil",
+        color: "fa fa-paint-brush",
+        font: "fa fa-font",
+        align: "fa fa-align-justify",
+        list: "fa fa-list",
+        link: "fa fa-chain",
+        unlink: "fa fa-chain-broken",
+        tabulation: "fa fa-table",
+        image: "fa fa-file-image-o",
+        hr: "fa fa-minus",
+        eraser: "fa fa-eraser",
+        undo: "fa-undo fa",
+        "full-screen": "fa fa-arrows-alt",
+        info: "fa fa-info",
+    },
+    image: {
+        sizeLimit: 512 * 1024,
+        upload: {
+            url: null,
+            headers: {},
+            params: {},
+            fieldName: {}
+        },
+        compress: {
+            width: 1600,
+            height: 1600,
+            quality: 80
+        },
+        uploadHandler(responseText){
+            var json = JSON.parse(responseText)
+            if (!json.ok) {
+                alert(json.msg)
+            } else {
+                return json.data
+            }
+        }
+    },
+    language: "zh-cn",
+    i18n: {
+        "zh-cn": {
+            "align": "对齐方式",
+            "image": "图片",
+            "list": "列表",
+            "link": "链接",
+            "unlink": "去除链接",
+            "table": "表格",
+            "font": "文字",
+            "full screen": "全屏",
+            "text": "排版",
+            "eraser": "格式清除",
+            "info": "关于",
+            "color": "颜色",
+            "please enter a url": "请输入地址",
+            "create link": "创建链接",
+            "bold": "加粗",
+            "italic": "倾斜",
+            "underline": "下划线",
+            "strike through": "删除线",
+            "subscript": "上标",
+            "superscript": "下标",
+            "heading": "标题",
+            "font name": "字体",
+            "font size": "文字大小",
+            "left justify": "左对齐",
+            "center justify": "居中",
+            "right justify": "右对齐",
+            "ordered list": "有序列表",
+            "unordered list": "无序列表",
+            "fore color": "前景色",
+            "background color": "背景色",
+            "row count": "行数",
+            "column count": "列数",
+            "save": "确定",
+            "upload": "上传",
+            "progress": "进度",
+            "unknown": "未知",
+            "please wait": "请稍等",
+            "error": "错误",
+            "abort": "中断",
+            "reset": "重置"
+        }
+    },
+    hiddenModules: [],
+    visibleModules: [
+        "text",
+        "color",
+        "font",
+        "align",
+        "list",
+        "link",
+        "unlink",
+        "tabulation",
+        // "image",
+        "hr",
+        "eraser",
+        "undo",
+        "full-screen",
+        "info",
+    ],
+    modules: {}
+})
+
+new Vue({
+    store,
+    router,
+    render: h => h(App)
+}).$mount("#app");

+ 218 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/router/index.js

@@ -0,0 +1,218 @@
+import Vue from "vue";
+import Router from "vue-router";
+import store from "../store/index";
+
+Vue.use(Router);
+
+const router = new Router({
+  routes: [
+    {
+        path: "/",
+        redirect: "/login"
+    },
+    {
+        path: "/login",
+        component: () => import("@/views/login/index"),
+        meta: {
+            title: "登陆"
+        }
+    },
+    {
+        path: "/expire",
+        component: () => import("@/views/expire/index"),
+        meta: {
+            title: "到期"
+        }
+    },
+    {
+        path: "/index",
+        component: () => import("@/views/index/index"),
+        meta: {
+            title: "车间生产管家",
+            keepAlive: true
+        }
+    },
+    {
+        // path: "/todayPlan",
+        path: "/plan/today",
+        component: () => import("@/views/planView/todayPlan/todayPlan"),
+        meta: {
+            title: "今日计划",
+            keepAlive: false
+        }
+    },
+    {
+        path: "/distribution",
+        name: "distribution",
+        component: () => import("@/views/planView/todayPlan/distribution"),
+        meta: {
+            title: "计划详情",
+            keepAlive: false
+        }
+    },
+    {
+        // path: "/tomorrowPlan",
+        path: "/plan/tomorrow",
+        component: () => import("@/views/planView/tomorrowPlan/tomorrowPlan"),
+        meta: {
+            title: "明日计划",
+            keepAlive: false
+        }
+    },
+    {
+        // path: "/InsertionPlan",
+        path: "/plan/orderInsert",
+        component: () => import("@/views/planView/InsertionPlan/InsertionPlan"),
+        meta: {
+            title: "插单计划",
+            keepAlive: false
+        }
+    },
+    {
+        path: "/InsertionPlanAdd",
+        name: '计划新增',
+        component: () => import("@/views/planView/InsertionPlan/InsertionPlanAdd"),
+        meta: {
+            title: "计划新增",
+            keepAlive: false
+        }
+    },
+    {
+        path: "/statisticsView",
+        // path: "/statistic",
+        component: () => import("@/views/statisticsView/statisticsView"),
+        meta: {
+            title: "数据统计",
+            keepAlive: false
+        }
+    },
+    {
+        path: "/statisticsDetail",
+        // path: "/statistic",
+        component: () => import("@/views/statisticsView/statisticsDetail"),
+        meta: {
+            title: "数据统计",
+            keepAlive: false
+        }
+    },
+    {
+        path: "/groupView",
+        component: () => import("@/views/groupView/groupView"),
+        meta: {
+            title: "班组人员",
+            keepAlive: false
+        }
+    },
+     {
+        path: "/MemberInfo",
+        component: () => import("@/views/groupView/info"),
+        meta: {
+            title: "通讯录",
+            keepAlive: false
+        }
+    },
+    {
+        // path: "/workView",
+        path: "/report",
+        component: () => import("@/views/workView/workView"),
+        meta: {
+            title: "报工",
+            keepAlive: false
+        }
+    },
+    
+    {
+        path: "/fillReport",
+        component: () => import("@/views/workView/fillReport"),
+        meta: {
+            title: "报工",
+            keepAlive: false
+        }
+    },
+    {
+        path: "/test",
+        meta: {
+            title: "测试页面"
+        },
+        component: () => import("@/views/test/index")
+    },
+    {
+        path: "/tests",
+        meta: {
+            title: "测试页面2"
+        },
+        component: () => import("@/views/test/list")
+    },
+    {
+        path: "/clearStorage",
+        meta: {
+            title: "清空存储"
+        },
+        component: () => import("@/views/test/clearStorage")
+    },
+    {
+        path: "/my",
+        component: () => import("@/views/my/index"),
+        redirect: "/my/center",
+        children: [
+            {
+                path: "center",
+                meta: {
+                    title: "个人中心"
+                },
+                component: () => import("@/views/my/children/center")
+            },
+            {
+                path: "set",
+                meta: {
+                    title: "修改密码"
+                },
+                component: () => import("@/views/my/children/set")
+            }
+        ]
+    },
+    {
+        path: "/pdf",
+        meta: {
+            title: "PDF"
+        },
+        component: () => import("@/views/pdf/ppd")
+    },
+    {
+        path: "*",
+        component: () => import("@/components/NotFound")
+    }
+  ]
+});
+
+// 解决编程式路由往同一地址跳转时会报错的情况
+const originalPush = Router.prototype.push;
+const originalReplace = Router.prototype.replace;
+
+Router.prototype.push = function push(location, onResolve, onReject) {
+  if (onResolve || onReject)
+    return originalPush.call(this, location, onResolve, onReject);
+  return originalPush.call(this, location).catch(err => err);
+};
+
+Router.prototype.replace = function push(location, onResolve, onReject) {
+  if (onResolve || onReject)
+    return originalReplace.call(this, location, onResolve, onReject);
+  return originalReplace.call(this, location).catch(err => err);
+};
+
+router.beforeEach((to, from, next) => {
+    let { title, needLogin } = to.meta;
+    let { isLogin } = store.state;
+    document.title = title;
+
+    if (needLogin && !isLogin) {
+        next({
+            path: "/login"
+        });
+    } else {
+        next();
+    }
+});
+
+export default router;

+ 0 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5-stand/src/store/index.js


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