diff --git a/.env.development b/.env.development
index 2b26c61..74b592d 100644
--- a/.env.development
+++ b/.env.development
@@ -2,3 +2,5 @@ VUE_APP_NODE_ENV=development
VUE_APP_BASE_URL=https://test.tall.wiki
VUE_APP_API_URL=https://test.tall.wiki/gateway
VUE_APP_MSG_URL=wss://test.tall.wiki/websocket/message/v4.0/ws
+VUE_APP_PROJECT_PATH=https://test.tall.wiki/tall-project
+VUE_APP_VERSION=v3.1.0
diff --git a/.env.production b/.env.production
index 610c32d..52ba090 100644
--- a/.env.production
+++ b/.env.production
@@ -2,3 +2,5 @@ VUE_APP_NODE_ENV=production
VUE_APP_BASE_URL=https://www.tall.wiki
VUE_APP_API_URL=https://www.tall.wiki/gateway
VUE_APP_MSG_URL=wss://www.tall.wiki/websocket/message/v4.0/ws
+VUE_APP_PROJECT_PATH=https://www.tall.wiki/tall-project
+VUE_APP_VERSION=v3.1.0
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 38b457d..c170a6f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,204 +1,230 @@
-# 0.1.0 (2021-08-18)
+# 0.1.0 (2021-08-31)
### 🌟 新功能
范围|描述|commitId
--|--|--
- calendar, tall.js | 上下滑动切换日历的模式,tall.js中domain根据环境变量切换 | [364e25d](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/364e25d)
- - | db store | [6414c4f](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/6414c4f)
- default plugin | 添加默认插件;项目列表;全局项目最大高度设置 | [ed1d87b](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/ed1d87b)
- - | indexedDB | [687394e](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/687394e)
- pinch | alloy finger实现图片的pinch放大缩小 | [de01343](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/de01343)
- plugin | 插件添加了token及param参数 | [aeb0292](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/aeb0292)
- - | post 封装 | [da52e94](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/da52e94)
- - | tall插件封装 | [1bcb920](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/1bcb920)
- task status | 任务状态切换未完 | [7ffd135](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/7ffd135)
- - | ws storage | [21b3a06](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/21b3a06)
- - | 上传逻辑变化 | [3ff1dc2](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/3ff1dc2)
- - | 任务状态时间显示 | [56f5183](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/56f5183)
- - | 任务进行中状态数字 | [27b7326](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/27b7326)
- - | 全局插件及默认插件位置修改 | [6c80d08](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/6c80d08)
- - | 向右箭头图标变化 | [8e9ca55](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/8e9ca55)
- - | 字体大小更改 | [82cfdd4](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/82cfdd4)
- - | 存token | [b8a178d](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/b8a178d)
- - | 定期任务面板骨架屏添加 | [b2698c0](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/b2698c0)
- 富文本插件 | 富文本插件demo测试 | [ed3d644](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/ed3d644)
- - | 导入wbs | [1224fcb](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/1224fcb)
- - | 导入项目,更新项目 | [5e06adf](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/5e06adf)
- - | 导入项目后提示并打开项目详情页 | [410f527](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/410f527)
- - | 引入dayjs | [29b8b93](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/29b8b93)
- - | 提交到本地 | [9cbe411](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/9cbe411)
- - | 插件参数处理调整 | [a3e68d3](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/a3e68d3)
- - | 插件数据获取 | [5b91bdc](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/5b91bdc)
- - | 日历定位;合并 | [ea3f937](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/ea3f937)
- - | 日常任务插件调整 | [c1881f9](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/c1881f9)
- - | 时间基准线,默认插件 | [a33ba1e](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/a33ba1e)
- - | 时间轴修改状态时提示框增加 | [e841392](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/e841392)
- - | 时间轴界面 | [33927e9](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/33927e9)
- - | 标题栏变化 | [3898cfe](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/3898cfe)
- - | 标题栏变化 | [c0fcd9d](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/c0fcd9d)
- - | 标题栏角色栏全局任务组件新建 | [0500cb4](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/0500cb4)
- - | 模拟接口测试 | [69e7931](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/69e7931)
- - | 添加时间轴上下滚动 | [2b81bbc](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/2b81bbc)
- - | 点击日历日期查询项目列表 | [c458385](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/c458385)
- - | 角色栏实现 | [94cd671](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/94cd671)
- - | 设置小红点 | [9316bcb](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/9316bcb)
- - | 距调整pc端 | [5069aa1](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/5069aa1)
- - | 配置默认插件接口 | [f0c177d](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/f0c177d)
- - | 面变化首页变化 | [5e860f1](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/5e860f1)
- - | 项目api url设置 | [6cd5245](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/6cd5245)
- - | 项目列表, 项目url | [32e005b](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/32e005b)
- - | 首页项目样式改变 | [8514c85](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/8514c85)
+ - | api封装 | 7d4edfc
+ bind phone | 图形验证码;短信验证码;绑定手机号 | 93ffea2
+ - | cache indexedDB处理 | 3388967
+ calendar, tall.js | 上下滑动切换日历的模式,tall.js中domain根据环境变量切换 | 364e25d
+ - | db store | 6414c4f
+ default plugin | 添加默认插件;项目列表;全局项目最大高度设置 | ed1d87b
+ - | indexedDB | 687394e
+ modules update;network | npm包升级;网络判断,网络不好才开启本地存储 | ebf7bdc
+ mp | 兼容小程序,去除window,document等 | 9178255
+ phone-bind | 验证码validate | a427250
+ pinch | alloy finger实现图片的pinch放大缩小 | de01343
+ plugin | 插件添加了token及param参数 | aeb0292
+ - | post 封装 | da52e94
+ - | tailwindcss添加部分属性 | 5b46b6d
+ - | tall插件封装 | 1bcb920
+ task status | 任务状态切换未完 | 7ffd135
+ - | ws storage | 21b3a06
+ - | 上传逻辑变化 | 3ff1dc2
+ - | 任务状态时间显示 | 56f5183
+ - | 任务进行中状态数字 | 27b7326
+ - | 全局插件及默认插件位置修改 | 6c80d08
+ - | 升级版本v3.1.0;tailwindcss添加class | 9ef05e1
+ - | 向右箭头图标变化 | 8e9ca55
+ - | 字体大小更改 | 82cfdd4
+ - | 存token | b8a178d
+ - | 定期任务面板骨架屏添加 | b2698c0
+ 富文本插件 | 富文本插件demo测试 | ed3d644
+ - | 导入wbs | 1224fcb
+ - | 导入项目,更新项目 | 5e06adf
+ - | 导入项目后提示并打开项目详情页 | 410f527
+ - | 引入dayjs | 29b8b93
+ - | 提交到本地 | 9cbe411
+ - | 插件参数处理调整 | a3e68d3
+ - | 插件数据获取 | 5b91bdc
+ - | 日历定位;合并 | ea3f937
+ - | 日常任务插件调整 | c1881f9
+ - | 时间基准线,默认插件 | a33ba1e
+ - | 时间轴修改状态时提示框增加 | e841392
+ - | 时间轴界面 | 33927e9
+ - | 标题栏变化 | 3898cfe
+ - | 标题栏变化 | c0fcd9d
+ - | 标题栏角色栏全局任务组件新建 | 0500cb4
+ - | 模拟接口测试 | 69e7931
+ - | 添加 环境变量,动态控制webview project的path | 8a40481
+ - | 添加子任务插件 子项目插件 | 7bda7e2
+ - | 添加时间轴上下滚动 | 2b81bbc
+ - | 添加项目排序 | a0b491b
+ - | 点击日历日期查询项目列表 | c458385
+ - | 细节调整,添加project-webview | 4d9050b
+ - | 绑定手机号 | 52e0352
+ - | 缓存修改 | 63e1f0d
+ - | 角色栏实现 | 94cd671
+ - | 设置小红点 | 9316bcb
+ - | 距调整pc端 | 5069aa1
+ - | 适配小程序;小程序登录 | cefc0eb
+ - | 配置默认插件接口 | f0c177d
+ - | 面变化首页变化 | 5e860f1
+ - | 项目api url设置 | 6cd5245
+ - | 项目列表, 项目url | 32e005b
+ - | 项目列表排序 | 224c58b
+ - | 首页项目样式改变 | 8514c85
### 🎨 代码样式
范围|描述|commitId
--|--|--
- - | calendar注释 | [a2ec112](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/a2ec112)
- - | 代码审查 | [d75134c](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/d75134c)
- - | 代码格式细节调整 | [cb2532b](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/cb2532b)
- - | 任务快捷方式图标增加 | [4aba872](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/4aba872)
- - | 修改角色样式 | [73e268e](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/73e268e)
- - | 删除calendar中多余的console | [e339eec](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/e339eec)
- - | 删除console.log | [5064a38](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/5064a38)
- - | 删除index中没用的alert代码 | [9c9eec7](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/9c9eec7)
- - | 删除mock,console;upload添加loading | [99d42e2](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/99d42e2)
- - | 删除多余字段 | [5ae3973](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/5ae3973)
- - | 删除插件携带的多余文件 | [0f392bb](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/0f392bb)
- - | 删除没用代码 | [34b20e1](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/34b20e1)
- - | 图标修改 | [54bca09](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/54bca09)
- - | 无基本变化 | [21ac4bb](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/21ac4bb)
- - | 日常任务修改 | [dfa7ee2](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/dfa7ee2)
- - | 更新代码 | [8c27e68](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/8c27e68)
- - | 更新代码 | [1f40a76](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/1f40a76)
- - | 格式细节调整 | [b907a03](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/b907a03)
- - | 添加插件数据 | [2f11b42](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/2f11b42)
- - | 组件新建 | [89c0035](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/89c0035)
- - | 细节调整 | [2cfc09a](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/2cfc09a)
+ - | calendar注释 | a2ec112
+ - | indexedDB.js格式整理 | b0d3a36
+ - | 代码审查 | d75134c
+ - | 代码格式细节调整 | cb2532b
+ - | 任务快捷方式图标增加 | 4aba872
+ - | 修改角色样式 | 73e268e
+ - | 删除calendar中多余的console | e339eec
+ - | 删除console.log | 5064a38
+ - | 删除index中没用的alert代码 | 9c9eec7
+ - | 删除mock,console;upload添加loading | 99d42e2
+ - | 删除多余字段 | 5ae3973
+ - | 删除插件携带的多余文件 | 0f392bb
+ - | 删除没用代码 | 34b20e1
+ - | 图标修改 | 54bca09
+ - | 无基本变化 | 21ac4bb
+ - | 日常任务修改 | dfa7ee2
+ - | 更新代码 | 8c27e68
+ - | 更新代码 | 1f40a76
+ - | 格式细节调整 | b907a03
+ - | 添加插件数据 | 2f11b42
+ - | 组件新建 | 89c0035
+ - | 细节调整 | 2cfc09a
### 🐛 Bug 修复
范围|描述|commitId
--|--|--
- - | 1.时间轴数据渲染 2.时间基准线 | [d643af2](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/d643af2)
- ID1000343 | 解决向下预加载查询参数时间没+1颗粒度;以及滚动加载颗粒度写死的问题 | [940603a](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/940603a), closes [#ID1000343](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/issues/ID1000343)
- plugin | 插件解析机制完善 | [0f5a27d](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/0f5a27d)
- project title | 项目标题修改; 切换角色移除script | [5c20017](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/5c20017)
- roles | 修复默认显示不是我的角色的问题 | [b69f94f](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/b69f94f)
- role | 切换角色的逻辑修正完善 | [4ae534f](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/4ae534f)
- task任务逻辑完善 | 减少初始global及regular的不必要请求 | [bd4bd38](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/bd4bd38)
- - | title.vue根据页面栈显示返回按钮;标题文本超出显示... | [0cbacf4](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/0cbacf4)
- - | 上下滑动加载定期任务 | [4090d89](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/4090d89)
- - | 上下滚动时间轴 | [d533a01](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/d533a01)
- - | 下拉加载定期任务传参,时间格式化修改 | [0b95a0e](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/0b95a0e)
- - | 任务开始时间延迟插件 | [992a313](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/992a313)
- - | 修改main | [749ae9a](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/749ae9a)
- - | 修改定期任务状态0和4时不加载圆圈 | [30e352f](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/30e352f)
- - | 修改小红点传参 | [87b20fd](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/87b20fd)
- - | 修改报错 | [531c14d](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/531c14d)
- - | 修改接口路径 | [df6acf2](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/df6acf2)
- - | 修改角色栏组件 | [a54c601](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/a54c601)
- - | 切换到默认项目角色没有激活状态的bug | [438d448](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/438d448)
- - | 切换日历时查询小红点 | [7091789](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/7091789)
- - | 初始展示角色修改 | [2ac4053](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/2ac4053)
- - | 定期任务key值修改 | [c6688db](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/c6688db)
- - | 定期任务接口 | [aa4981c](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/aa4981c)
- - | 定期任务插件 | [92b3254](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/92b3254)
- - | 定期任务未加载时,显示空的时间轴并能上下滑动 | [ce38093](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/ce38093)
- - | 定期任务骨架屏修改 | [8ff72dd](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/8ff72dd)
- - | 平车演示临时去掉项目快捷方式的toast提示 | [e0b2c23](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/e0b2c23)
- - | 手动展开日常任务 | [0a4a622](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/0a4a622)
- - | 提示信息显示bug及日常任务收缩问题 | [f2f06c5](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/f2f06c5)
- - | 插件bug解决 | [41257eb](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/41257eb)
- - | 收到消息修改任务状态 | [c378063](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/c378063)
- - | 日历无任务时添加小绿点,时间轴刻度无任务不显示时分 | [0f90868](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/0f90868)
- - | 日常任务html数据查验 | [880ce5c](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/880ce5c)
- - | 日常任务插件遍历时的key值修改 | [cd26285](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/cd26285)
- - | 日常任务插件面板高度修改 | [249f9e4](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/249f9e4)
- - | 时间轴上下滑动 | [4d0ae46](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/4d0ae46)
- - | 时间轴上下滚动数据加载bug修改 | [e82ede4](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/e82ede4)
- - | 时间轴插件 | [225d3cc](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/225d3cc)
- - | 时间轴无任务时时间刻度加载修改 | [4921672](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/4921672)
- - | 时间轴滚动位置修改 | [551da63](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/551da63)
- - | 时间轴骨架屏修改 | [ca78d02](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/ca78d02)
- - | 监听时间基本点 | [033fca0](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/033fca0)
- - | 角色显示状态修改 | [7d3b906](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/7d3b906)
- - | 角色栏修改 | [19228d6](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/19228d6)
- - | 解决时间轴报错 | [da1eece](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/da1eece)
- - | 设置时间轴自动滚动到当前位置 | [a3474f8](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/a3474f8)
- - | 跳转详情页返回路径修改 | [c5e17c0](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/c5e17c0)
- - | 骨架屏替换 | [e9fdd71](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/e9fdd71)
+ - | 1.时间轴数据渲染 2.时间基准线 | d643af2
+ - | api 存storage | 81032ba
+ ID1000343 | 解决向下预加载查询参数时间没+1颗粒度;以及滚动加载颗粒度写死的问题 | 940603a, closes #ID1000343
+ plugin | 插件解析机制完善 | 0f5a27d
+ project title | 项目标题修改; 切换角色移除script | 5c20017
+ roles | 修复默认显示不是我的角色的问题 | b69f94f
+ role | 切换角色的逻辑修正完善 | 4ae534f
+ task任务逻辑完善 | 减少初始global及regular的不必要请求 | bd4bd38
+ - | title.vue根据页面栈显示返回按钮;标题文本超出显示... | 0cbacf4
+ - | 上下滑动加载定期任务 | 4090d89
+ - | 上下滚动时间轴 | d533a01
+ - | 下拉加载定期任务传参,时间格式化修改 | 0b95a0e
+ - | 任务开始时间延迟插件 | 992a313
+ - | 修改main | 749ae9a
+ - | 修改定期任务状态0和4时不加载圆圈 | 30e352f
+ - | 修改小红点传参 | 87b20fd
+ - | 修改报错 | 531c14d
+ - | 修改接口路径 | df6acf2
+ - | 修改角色栏组件 | a54c601
+ - | 切换到默认项目角色没有激活状态的bug | 438d448
+ - | 切换日历时查询小红点 | 7091789
+ - | 初始展示角色修改 | 2ac4053
+ - | 定期任务key值修改 | c6688db
+ - | 定期任务接口 | aa4981c
+ - | 定期任务插件 | 92b3254
+ - | 定期任务未加载时,显示空的时间轴并能上下滑动 | ce38093
+ - | 定期任务本地缓存和api赋值,未完成 | 5a10856
+ 定期任务本地缓存和api赋值,未完成 | 定期任务本地缓存和api赋值,未完成 | b22a366
+ - | 定期任务骨架屏修改 | 8ff72dd
+ - | 平车演示临时去掉项目快捷方式的toast提示 | e0b2c23
+ - | 手动展开日常任务 | 0a4a622
+ - | 提示信息显示bug及日常任务收缩问题 | f2f06c5
+ - | 插件bug解决 | 41257eb
+ - | 收到消息修改任务状态 | c378063
+ - | 日历无任务时添加小绿点,时间轴刻度无任务不显示时分 | 0f90868
+ - | 日常任务html数据查验 | 880ce5c
+ - | 日常任务插件遍历时的key值修改 | cd26285
+ - | 日常任务插件面板高度修改 | 249f9e4
+ - | 时间轴上下滑动 | 4d0ae46
+ - | 时间轴上下滚动数据加载bug修改 | e82ede4
+ - | 时间轴插件 | 225d3cc
+ - | 时间轴无任务时时间刻度加载修改 | 4921672
+ - | 时间轴滚动位置修改 | 551da63
+ - | 时间轴骨架屏修改 | ca78d02
+ - | 监听时间基本点 | 033fca0
+ - | 角色显示状态修改 | 7d3b906
+ - | 角色栏修改 | 19228d6
+ - | 解决时间轴报错 | da1eece
+ - | 设置时间轴自动滚动到当前位置 | a3474f8
+ - | 跳转详情页返回路径修改 | c5e17c0
+ - | 项目列表排序修改 | fd3c3ac
+ - | 项目列表排序修改 | 59f4c21
+ 项目列表排序 | 项目列表排序 | 402c563
+ - | 骨架屏替换 | e9fdd71
### 📝 文档
范围|描述|commitId
--|--|--
- - | README.md | [ab0eb05](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/ab0eb05)
+ - | README.md | ab0eb05
### 🔧 测试
范围|描述|commitId
--|--|--
- - | 暂时移除了jest浏览器配置 | [5088d01](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/5088d01)
- - | 添加测试,测试utils/time.js的computeDurationText | [e758010](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/e758010)
- - | 禁用任务开始操作 | [b5425db](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/b5425db)
+ - | 暂时移除了jest浏览器配置 | 5088d01
+ - | 添加测试,测试utils/time.js的computeDurationText | e758010
+ - | 禁用任务开始操作 | b5425db
### 🔨 代码重构
范围|描述|commitId
--|--|--
- calendar | 日历细节调整 | [1a8d6bf](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/1a8d6bf)
- - | project 代码健壮性完善 | [a3202c5](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/a3202c5)
- store/home | 删除store/home | [db8a3b4](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/db8a3b4)
- task beginTime | 格式化任务开始时间 | [fbc0301](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/fbc0301)
- template | eslint prettier sass uview tailwindcss | [9c966a1](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/9c966a1)
- tips | 修改任务状态方法重构 | [b57d3ac](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/b57d3ac)
- tip | 任务状态显示及tip组件数据的重构 | [78a5750](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/78a5750)
- title.vue | 移除测试的repeat; 样式细节调整 | [c32d2bd](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/c32d2bd)
- - | 下滑时间轴添加备注 | [4fd20e3](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/4fd20e3)
- - | 任务状态重构 | [4693655](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/4693655)
- - | 删除多余的weekmode store里的东西 | [0841fe0](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/0841fe0)
- - | 删除多余的技术验证界面 | [542ae5b](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/542ae5b)
- - | 界面样式调整 | [4367249](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/4367249)
- - | 重构store分层 | [5f6fff8](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/5f6fff8)
+ calendar | 日历细节调整 | 1a8d6bf
+ - | project 代码健壮性完善 | a3202c5
+ store/home | 删除store/home | db8a3b4
+ task beginTime | 格式化任务开始时间 | fbc0301
+ template | eslint prettier sass uview tailwindcss | 9c966a1
+ tips | 修改任务状态方法重构 | b57d3ac
+ tip | 任务状态显示及tip组件数据的重构 | 78a5750
+ title.vue | 移除测试的repeat; 样式细节调整 | c32d2bd
+ - | 下滑时间轴添加备注 | 4fd20e3
+ - | 任务状态重构 | 4693655
+ - | 删除多余的weekmode store里的东西 | 0841fe0
+ - | 删除多余的技术验证界面 | 542ae5b
+ - | 去掉tailwindcss | 4bed47e
+ - | 界面样式调整 | 4367249
+ - | 重构store分层 | 5f6fff8
### 🚀 性能优化
范围|描述|commitId
--|--|--
- - | 1.时间轴筛选相同的时间替换数据 2.整理代码 | [e082ccb](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/e082ccb)
- - | 修改代码格式 | [14123d7](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/14123d7)
- - | 修改定期任务骨架屏高度 | [909a734](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/909a734)
- - | 插件查询及展示 | [4dba770](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/4dba770)
- - | 整理代码 | [7a55315](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/7a55315)
- - | 日历的更改 | [7353ac8](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/7353ac8)
- - | 测试接口 | [215e074](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/215e074)
- - | 组件文件夹新建 | [22bfe7b](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/22bfe7b)
- - | 组件文件夹新建 | [17bb8c9](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/17bb8c9)
- - | 组件文件夹新建 | [1421504](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/1421504)
- - | 角色栏文字颜色修改 | [215c6b3](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/215c6b3)
- - | 解决警告 | [c932b09](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/c932b09)
+ - | 1.时间轴筛选相同的时间替换数据 2.整理代码 | e082ccb
+ - | 修改代码格式 | 14123d7
+ - | 修改定期任务骨架屏高度 | 909a734
+ - | 小红点api缓存修改 | e992343
+ - | 插件查询及展示 | 4dba770
+ - | 整理代码 | 7a55315
+ - | 日历的更改 | 7353ac8
+ - | 测试接口 | 215e074
+ - | 组件文件夹新建 | 22bfe7b
+ - | 组件文件夹新建 | 17bb8c9
+ - | 组件文件夹新建 | 1421504
+ - | 角色栏文字颜色修改 | 215c6b3
+ - | 解决警告 | c932b09
### chore
范围|描述|commitId
--|--|--
- - | api 封装 | [8dcb8a2](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/8dcb8a2)
- - | env host修改 | [a79a4a5](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/a79a4a5)
- - | merge globals | [b0957cc](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/b0957cc)
- - | merge wrr | [5ccc7a5](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/5ccc7a5)
- - | mock | [51c24a5](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/51c24a5)
- package manifest | 去掉了摇树 | [f7c1dd4](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/f7c1dd4)
- pwa 小程序 | 移除了pwa,alloyFinger添加平台判断 | [875fab4](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/875fab4)
- - | uview-ui | [a9ea34b](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/a9ea34b)
- v3.0.1 | tall api 地址从1.0改成了3.0 | [db5afd5](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/db5afd5)
- 信息配置 | 配置eslint等配置 | [7421443](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/7421443)
- - | 修复不能build的问题 | [0b7b91e](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/0b7b91e)
- - | 删除多余的构建的命令 | [3f4eb2f](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/3f4eb2f)
+ - | api 封装 | 8dcb8a2
+ - | dart-sass替换node-sass;删除多余的uni平台包 | 519f28b
+ - | env host修改 | a79a4a5
+ - | merge globals | b0957cc
+ - | merge wrr | 5ccc7a5
+ - | mock | 51c24a5
+ package manifest | 去掉了摇树 | f7c1dd4
+ pwa 小程序 | 移除了pwa,alloyFinger添加平台判断 | 875fab4
+ - | uview-ui | a9ea34b
+ v3.0.1 | tall api 地址从1.0改成了3.0 | db5afd5
+ 信息配置 | 配置eslint等配置 | 7421443
+ - | 修复不能build的问题 | 0b7b91e
+ - | 删除多余的构建的命令 | 3f4eb2f
范围|描述|commitId
--|--|--
- - | style:index | [978f272](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/978f272)
- - | !2 基础模板v1.1.0 | [f5e61dd](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/f5e61dd)
- - | init | [c0f1deb](https://dd.tall.wiki/gitea/ccsens_fe/TALL-MUI-3/commits/c0f1deb)
+ - | style:index | 978f272
+ - | !2 基础模板v1.1.0 | f5e61dd
+ - | init | c0f1deb
diff --git a/README.md b/README.md
index 83bd0d8..4b64710 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,13 @@
# tall-mui-cli
+## 发布注意事项
+
+环境变量里的`VUE_APP_VERSION=v3.0.1` 如果project路径变了 或者版本升级了, 发行之前一定要跟着改
+
+本项目, TALL程序主体框架升级, 或者服务端路径变化, 要修改`manifest.json` 下的 `h5.router.base`
+
+---
+
## 项目运行
### 安装依赖
@@ -14,7 +22,7 @@ yarn dev:h5
```
浏览器输入网址:
-127.0.0.1:8080/#/?u=1217647686598135808&p=1420652719055839232
+http://localhost:8080/tall/v3.0.1/#/?u=1217647686598135808&p=1420652719055839232
- u: userId
- p: projectId
- r: roleId
diff --git a/package.json b/package.json
index 5ca43c4..aed2d09 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
"build:h5-test": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build --mode development",
"build:h5": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build --mode production",
"build:app-plus": "cross-env NODE_ENV=production UNI_PLATFORM=app-plus vue-cli-service uni-build",
+ "build:mp-weixin": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
"cz": "npm run log && git add . && git cz",
"dev:app-plus": "cross-env NODE_ENV=development UNI_PLATFORM=app-plus vue-cli-service uni-build --watch",
"dev:custom": "cross-env NODE_ENV=development uniapp-cli custom",
@@ -25,23 +26,13 @@
"test:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin jest -i"
},
"dependencies": {
- "@dcloudio/uni-app-plus": "^2.0.0-31920210709003",
- "@dcloudio/uni-h5": "^2.0.0-31920210709003",
+ "@dcloudio/uni-h5": "^2.0.0-32220210818002",
"@dcloudio/uni-helper-json": "*",
- "@dcloudio/uni-i18n": "^2.0.0-31920210709003",
- "@dcloudio/uni-mp-360": "^2.0.0-31920210709003",
- "@dcloudio/uni-mp-alipay": "^2.0.0-31920210709003",
- "@dcloudio/uni-mp-baidu": "^2.0.0-31920210709003",
- "@dcloudio/uni-mp-kuaishou": "^2.0.0-31920210709003",
- "@dcloudio/uni-mp-qq": "^2.0.0-31920210709003",
- "@dcloudio/uni-mp-toutiao": "^2.0.0-31920210709003",
- "@dcloudio/uni-mp-vue": "^2.0.0-31920210709003",
- "@dcloudio/uni-mp-weixin": "^2.0.0-31920210709003",
- "@dcloudio/uni-quickapp-native": "^2.0.0-31920210709003",
- "@dcloudio/uni-quickapp-webview": "^2.0.0-31920210709003",
- "@dcloudio/uni-stat": "^2.0.0-31920210709003",
- "@vue/shared": "^3.0.0",
- "alloyfinger": "^0.1.16",
+ "@dcloudio/uni-i18n": "^2.0.0-32220210818002",
+ "@dcloudio/uni-mp-vue": "^2.0.0-32220210818002",
+ "@dcloudio/uni-mp-weixin": "^2.0.0-32220210818002",
+ "@dcloudio/uni-stat": "^2.0.0-32220210818002",
+ "@vue/shared": "^3.2.6",
"dayjs": "^1.10.6",
"flyio": "^0.6.2",
"lodash": "^4.17.21",
@@ -52,17 +43,16 @@
},
"devDependencies": {
"@babel/runtime": "~7.12.0",
- "@dcloudio/types": "*",
- "@dcloudio/uni-automator": "^2.0.0-31920210709003",
- "@dcloudio/uni-cli-shared": "^2.0.0-31920210709003",
- "@dcloudio/uni-migration": "^2.0.0-31920210709003",
- "@dcloudio/uni-template-compiler": "^2.0.0-31920210709003",
- "@dcloudio/vue-cli-plugin-hbuilderx": "^2.0.0-31920210709003",
- "@dcloudio/vue-cli-plugin-uni": "^2.0.0-31920210709003",
- "@dcloudio/vue-cli-plugin-uni-optimize": "^2.0.0-31920210709003",
- "@dcloudio/webpack-uni-mp-loader": "^2.0.0-31920210709003",
- "@dcloudio/webpack-uni-pages-loader": "^2.0.0-31920210709003",
- "@tailwindcss/postcss7-compat": "^2.2.7",
+ "@dcloudio/types": "^2.5.1",
+ "@dcloudio/uni-automator": "^2.0.0-32220210818002",
+ "@dcloudio/uni-cli-shared": "^2.0.0-32220210818002",
+ "@dcloudio/uni-migration": "^2.0.0-32220210818002",
+ "@dcloudio/uni-template-compiler": "^2.0.0-32220210818002",
+ "@dcloudio/vue-cli-plugin-hbuilderx": "^2.0.0-32220210818002",
+ "@dcloudio/vue-cli-plugin-uni": "^2.0.0-32220210818002",
+ "@dcloudio/vue-cli-plugin-uni-optimize": "^2.0.0-32220210818002",
+ "@dcloudio/webpack-uni-mp-loader": "^2.0.0-32220210818002",
+ "@dcloudio/webpack-uni-pages-loader": "^2.0.0-32220210818002",
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-vuex": "~4.5.0",
@@ -73,29 +63,27 @@
"babel-plugin-import": "^1.11.0",
"commitizen": "^4.0.3",
"commitlint": "^8.2.0",
- "compression-webpack-plugin": "^5.0.1",
+ "compression-webpack-plugin": "^5.0.2",
"conventional-changelog-cli": "^2.0.28",
- "core-js": "^3.15.2",
+ "core-js": "^3.16.3",
"cross-env": "^7.0.3",
"eslint": "^6.7.2",
- "eslint-plugin-prettier": "^3.3.1",
+ "eslint-plugin-prettier": "^3.4.1",
"eslint-plugin-vue": "^6.2.2",
"husky": "^3.0.9",
"jest": "^25.4.0",
- "lint-staged": "^11.0.0",
+ "lint-staged": "^11.1.2",
"mini-types": "*",
- "miniprogram-api-typings": "*",
- "node-sass": "^4.14.1",
+ "miniprogram-api-typings": "^3.4.3",
"postcss": "^7.0.36",
"postcss-class-rename": "^1.0.1",
"postcss-comment": "^2.0.0",
"prettier": "^2.2.1",
"puppeteer": "^10.2.0",
"right-pad": "^1.0.1",
+ "sass": "^1.38.2",
"sass-loader": "^8.0.2",
- "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.2.7",
"vue-cli-plugin-commitlint": "~1.0.12",
- "vue-cli-plugin-eruda": "^1.3.0",
"vue-template-compiler": "^2.6.11"
},
"browserslist": [
diff --git a/postcss.config.js b/postcss.config.js
index a518d40..f46b6a1 100644
--- a/postcss.config.js
+++ b/postcss.config.js
@@ -15,24 +15,7 @@ module.exports = {
return id;
},
}),
- // require('autoprefixer')({ remove: process.env.UNI_PLATFORM !== 'h5' }),
+ require('autoprefixer')({ remove: process.env.UNI_PLATFORM !== 'h5' }),
require('@dcloudio/vue-cli-plugin-uni/packages/postcss'),
- require('tailwindcss')({ config: "./tailwind.config.js" }),
- ...(
- process.env.UNI_PLATFORM !== 'h5'
- ? [
- require("postcss-class-rename")({
- "\\\\:": "--",
- "\\\\/": "--",
- "\\\\.": "--",
- ".:": "--",
- "\\\*": "--",
- })
- ] : [
- require("autoprefixer")({
- remove: true,
- }),
- ]
- )
],
};
diff --git a/src/.hbuilderx/launch.json b/src/.hbuilderx/launch.json
deleted file mode 100644
index e5aaa3e..0000000
--- a/src/.hbuilderx/launch.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
- // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
- "version": "0.0",
- "configurations": [{
- "type": "uniCloud",
- "default": {
- "launchtype": "local"
- }
- }
- ]
-}
diff --git a/src/App.vue b/src/App.vue
index f78c549..8bcef53 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,8 +1,16 @@
diff --git a/src/apis/plugin.js b/src/apis/plugin.js
deleted file mode 100644
index 0899cca..0000000
--- a/src/apis/plugin.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// 插件的地址是固定的
-const url = process.env.VUE_APP_API_URL;
-
-const install = (Vue, vm) => {
- vm.$u.api = { ...vm.$u.api } || {};
- // 获取插件信息
- vm.$u.api.getOtherPlugin = param => vm.$u.post(`${url}/pluginshop/plugin/query`, param);
- // 查询子任务
- vm.$u.api.findSonTask = param => vm.$u.post(`${uni.$t.domain}/task/findSonTask`, param);
- // 查询子项目
- vm.$u.api.findSonProject = param => vm.$u.post(`${uni.$t.domain}/project/findSonProject`, param);
-};
-
-export default { install };
diff --git a/src/apis/project.js b/src/apis/project.js
deleted file mode 100644
index 4832fa4..0000000
--- a/src/apis/project.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const install = (Vue, vm) => {
- vm.$u.api = { ...vm.$u.api } || {};
- //根据id获取项目信息
- vm.$u.api.findProjectById = param => vm.$u.post(`${uni.$t.domain}/project/findProjectById`, param);
-};
-
-export default { install };
diff --git a/src/apis/role.js b/src/apis/role.js
deleted file mode 100644
index 1e1d5be..0000000
--- a/src/apis/role.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const install = (Vue, vm) => {
- vm.$u.api = { ...vm.$u.api } || {};
- //根据时间基准点和角色查找定期任务
- vm.$u.api.findShowRole = param => vm.$u.post(`${uni.$t.domain}/role/show`, param);
-};
-
-export default { install };
diff --git a/src/apis/tall.js b/src/apis/tall.js
index 121373b..04cedce 100644
--- a/src/apis/tall.js
+++ b/src/apis/tall.js
@@ -1,14 +1,44 @@
const apiUrl = process.env.VUE_APP_API_URL;
-const tall = `${apiUrl}/tall3/v3.0`;
+export const tall = `${apiUrl}/tall3/v3.0`;
+
+import { mp } from '@/config/user.js';
+
+// 登录
+export const login = {
+ async index(params) {
+ try {
+ /* #ifdef MP-WEIXIN */
+ params = await mp();
+ /* #endif */
+ const data = await uni.$u.http.post(`${tall}/users/signin`, params);
+ return data;
+ } catch (error) {
+ throw new Error(error);
+ }
+ },
+};
const install = (Vue, vm) => {
vm.$u.api = { ...vm.$u.api } || {};
+ // 登录
+ vm.$u.api.signin = params => login.index(params);
+ // 获取图片验证码
+ vm.$u.api.getImageCode = () => vm.$u.get(`${tall}/users/code`);
+ // 获取短信验证码
+ vm.$u.api.getSmsCode = params => vm.$u.get(`${tall}/users/smscode`, params);
// 根据userId获取token
vm.$u.api.getToken = userId => vm.$u.get(`${tall}/users/userId`, { userId });
+ // 绑定手机号
+ vm.$u.api.phoneBind = (phone, smsCode) => vm.$u.http.post(`${tall}/users/binding`, { phone, smsCode });
+
// 获取项目列表
vm.$u.api.getProjects = (startTime, endTime) => vm.$u.post(`${tall}/project/query`, { startTime, endTime });
// 查询日历是否有小红点
vm.$u.api.findRedPoint = (startTime, endTime) => vm.$u.post(`${tall}/project/day`, { startTime, endTime });
+ // 设置项目顺序
+ vm.$u.api.setProjectSort = params => vm.$u.post(`${tall}/project/setProjectSort`, params);
+ // 设置项目父子结构
+ vm.$u.api.setProjectRelation = params => vm.$u.post(`${tall}/project/setProjectRelation`, params);
};
export default { install };
diff --git a/src/apis/task.js b/src/apis/task.js
deleted file mode 100644
index a2eabf0..0000000
--- a/src/apis/task.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const install = (Vue, vm) => {
- vm.$u.api = { ...vm.$u.api } || {};
- vm.$u.api.getGlobal = param => vm.$u.post(`${uni.$t.domain}/task/global`, param);
- vm.$u.api.getPermanent = param => vm.$u.post(`${uni.$t.domain}/task/permanent`, param);
- //根据时间基准点和角色查找定期任务
- vm.$u.api.getRegularTask = param => vm.$u.post(`${uni.$t.domain}/task/regular`, param);
- //修改任务状态
- vm.$u.api.updateTaskType = param => vm.$u.post(`${uni.$t.domain}/task/type`, param);
-};
-
-export default { install };
diff --git a/src/common/styles/index.css b/src/common/styles/index.css
deleted file mode 100644
index df5a720..0000000
--- a/src/common/styles/index.css
+++ /dev/null
@@ -1,6 +0,0 @@
-/* ./src/common/styles/index.css */
-
-/*! @import */
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
diff --git a/src/common/styles/tailwind.scss b/src/common/styles/tailwind.scss
new file mode 100644
index 0000000..5121b4f
--- /dev/null
+++ b/src/common/styles/tailwind.scss
@@ -0,0 +1,4462 @@
+.fixed {
+ position: fixed;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.relative {
+ position: relative;
+}
+
+.sticky {
+ position: sticky;
+}
+.col-auto {
+ grid-column: auto;
+}
+
+.col-span-1 {
+ grid-column: span 1 / span 1;
+}
+
+.col-span-2 {
+ grid-column: span 2 / span 2;
+}
+
+.col-span-3 {
+ grid-column: span 3 / span 3;
+}
+
+.col-span-4 {
+ grid-column: span 4 / span 4;
+}
+
+.col-span-5 {
+ grid-column: span 5 / span 5;
+}
+
+.col-span-6 {
+ grid-column: span 6 / span 6;
+}
+
+.col-span-7 {
+ grid-column: span 7 / span 7;
+}
+
+.col-span-8 {
+ grid-column: span 8 / span 8;
+}
+
+.col-span-9 {
+ grid-column: span 9 / span 9;
+}
+
+.col-span-10 {
+ grid-column: span 10 / span 10;
+}
+
+.col-span-11 {
+ grid-column: span 11 / span 11;
+}
+
+.col-span-12 {
+ grid-column: span 12 / span 12;
+}
+
+.col-span-full {
+ grid-column: 1 / -1;
+}
+
+.col-start-1 {
+ grid-column-start: 1;
+}
+
+.col-start-2 {
+ grid-column-start: 2;
+}
+
+.col-start-3 {
+ grid-column-start: 3;
+}
+
+.col-start-4 {
+ grid-column-start: 4;
+}
+
+.col-start-5 {
+ grid-column-start: 5;
+}
+
+.col-start-6 {
+ grid-column-start: 6;
+}
+
+.col-start-7 {
+ grid-column-start: 7;
+}
+
+.col-start-8 {
+ grid-column-start: 8;
+}
+
+.col-start-9 {
+ grid-column-start: 9;
+}
+
+.col-start-10 {
+ grid-column-start: 10;
+}
+
+.col-start-11 {
+ grid-column-start: 11;
+}
+
+.col-start-12 {
+ grid-column-start: 12;
+}
+
+.col-start-13 {
+ grid-column-start: 13;
+}
+
+.col-start-auto {
+ grid-column-start: auto;
+}
+
+.col-end-1 {
+ grid-column-end: 1;
+}
+
+.col-end-2 {
+ grid-column-end: 2;
+}
+
+.col-end-3 {
+ grid-column-end: 3;
+}
+
+.col-end-4 {
+ grid-column-end: 4;
+}
+
+.col-end-5 {
+ grid-column-end: 5;
+}
+
+.col-end-6 {
+ grid-column-end: 6;
+}
+
+.col-end-7 {
+ grid-column-end: 7;
+}
+
+.col-end-8 {
+ grid-column-end: 8;
+}
+
+.col-end-9 {
+ grid-column-end: 9;
+}
+
+.col-end-10 {
+ grid-column-end: 10;
+}
+
+.col-end-11 {
+ grid-column-end: 11;
+}
+
+.col-end-12 {
+ grid-column-end: 12;
+}
+
+.col-end-13 {
+ grid-column-end: 13;
+}
+
+.col-end-auto {
+ grid-column-end: auto;
+}
+
+.row-auto {
+ grid-row: auto;
+}
+
+.row-span-1 {
+ grid-row: span 1 / span 1;
+}
+
+.row-span-2 {
+ grid-row: span 2 / span 2;
+}
+
+.row-span-3 {
+ grid-row: span 3 / span 3;
+}
+
+.row-span-4 {
+ grid-row: span 4 / span 4;
+}
+
+.row-span-5 {
+ grid-row: span 5 / span 5;
+}
+
+.row-span-6 {
+ grid-row: span 6 / span 6;
+}
+
+.row-span-full {
+ grid-row: 1 / -1;
+}
+
+.row-start-1 {
+ grid-row-start: 1;
+}
+
+.row-start-2 {
+ grid-row-start: 2;
+}
+
+.row-start-3 {
+ grid-row-start: 3;
+}
+
+.row-start-4 {
+ grid-row-start: 4;
+}
+
+.row-start-5 {
+ grid-row-start: 5;
+}
+
+.row-start-6 {
+ grid-row-start: 6;
+}
+
+.row-start-7 {
+ grid-row-start: 7;
+}
+
+.row-start-auto {
+ grid-row-start: auto;
+}
+
+.row-end-1 {
+ grid-row-end: 1;
+}
+
+.row-end-2 {
+ grid-row-end: 2;
+}
+
+.row-end-3 {
+ grid-row-end: 3;
+}
+
+.row-end-4 {
+ grid-row-end: 4;
+}
+
+.row-end-5 {
+ grid-row-end: 5;
+}
+
+.row-end-6 {
+ grid-row-end: 6;
+}
+
+.row-end-7 {
+ grid-row-end: 7;
+}
+
+.row-end-auto {
+ grid-row-end: auto;
+}
+
+.float-right {
+ float: right;
+}
+
+.float-left {
+ float: left;
+}
+
+.float-none {
+ float: none;
+}
+
+.clear-left {
+ clear: left;
+}
+
+.clear-right {
+ clear: right;
+}
+
+.clear-both {
+ clear: both;
+}
+
+.clear-none {
+ clear: none;
+}
+
+.m-0 {
+ margin: 0px;
+}
+
+.m-1 {
+ margin: 0.25rem;
+}
+
+.m-2 {
+ margin: 0.5rem;
+}
+
+.m-3 {
+ margin: 0.75rem;
+}
+
+.m-4 {
+ margin: 1rem;
+}
+
+.m-5 {
+ margin: 1.25rem;
+}
+
+.m-6 {
+ margin: 1.5rem;
+}
+
+.m-7 {
+ margin: 1.75rem;
+}
+
+.m-8 {
+ margin: 2rem;
+}
+
+.m-9 {
+ margin: 2.25rem;
+}
+
+.m-10 {
+ margin: 2.5rem;
+}
+
+.m-11 {
+ margin: 2.75rem;
+}
+
+.m-12 {
+ margin: 3rem;
+}
+
+.m-14 {
+ margin: 3.5rem;
+}
+
+.m-16 {
+ margin: 4rem;
+}
+
+.m-20 {
+ margin: 5rem;
+}
+
+.m-24 {
+ margin: 6rem;
+}
+
+.m-28 {
+ margin: 7rem;
+}
+
+.m-32 {
+ margin: 8rem;
+}
+
+.m-36 {
+ margin: 9rem;
+}
+
+.m-40 {
+ margin: 10rem;
+}
+
+.m-44 {
+ margin: 11rem;
+}
+
+.m-48 {
+ margin: 12rem;
+}
+
+.m-52 {
+ margin: 13rem;
+}
+
+.m-56 {
+ margin: 14rem;
+}
+
+.m-60 {
+ margin: 15rem;
+}
+
+.m-64 {
+ margin: 16rem;
+}
+
+.m-72 {
+ margin: 18rem;
+}
+
+.m-80 {
+ margin: 20rem;
+}
+
+.m-96 {
+ margin: 24rem;
+}
+
+.m-auto {
+ margin: auto;
+}
+
+.m-px {
+ margin: 1px;
+}
+
+.-m-0 {
+ margin: 0px;
+}
+
+.-m-1 {
+ margin: -0.25rem;
+}
+
+.-m-2 {
+ margin: -0.5rem;
+}
+
+.-m-3 {
+ margin: -0.75rem;
+}
+
+.-m-4 {
+ margin: -1rem;
+}
+
+.-m-5 {
+ margin: -1.25rem;
+}
+
+.-m-6 {
+ margin: -1.5rem;
+}
+
+.-m-7 {
+ margin: -1.75rem;
+}
+
+.-m-8 {
+ margin: -2rem;
+}
+
+.-m-9 {
+ margin: -2.25rem;
+}
+
+.-m-10 {
+ margin: -2.5rem;
+}
+
+.-m-11 {
+ margin: -2.75rem;
+}
+
+.-m-12 {
+ margin: -3rem;
+}
+
+.-m-14 {
+ margin: -3.5rem;
+}
+
+.-m-16 {
+ margin: -4rem;
+}
+
+.-m-20 {
+ margin: -5rem;
+}
+
+.-m-24 {
+ margin: -6rem;
+}
+
+.-m-28 {
+ margin: -7rem;
+}
+
+.-m-32 {
+ margin: -8rem;
+}
+
+.-m-36 {
+ margin: -9rem;
+}
+
+.-m-40 {
+ margin: -10rem;
+}
+
+.-m-44 {
+ margin: -11rem;
+}
+
+.-m-48 {
+ margin: -12rem;
+}
+
+.-m-52 {
+ margin: -13rem;
+}
+
+.-m-56 {
+ margin: -14rem;
+}
+
+.-m-60 {
+ margin: -15rem;
+}
+
+.-m-64 {
+ margin: -16rem;
+}
+
+.-m-72 {
+ margin: -18rem;
+}
+
+.-m-80 {
+ margin: -20rem;
+}
+
+.-m-96 {
+ margin: -24rem;
+}
+
+.-m-px {
+ margin: -1px;
+}
+
+.mx-0 {
+ margin-left: 0px;
+ margin-right: 0px;
+}
+
+.mx-1 {
+ margin-left: 0.25rem;
+ margin-right: 0.25rem;
+}
+
+.mx-2 {
+ margin-left: 0.5rem;
+ margin-right: 0.5rem;
+}
+
+.mx-3 {
+ margin-left: 0.75rem;
+ margin-right: 0.75rem;
+}
+
+.mx-4 {
+ margin-left: 1rem;
+ margin-right: 1rem;
+}
+
+.mx-5 {
+ margin-left: 1.25rem;
+ margin-right: 1.25rem;
+}
+
+.mx-6 {
+ margin-left: 1.5rem;
+ margin-right: 1.5rem;
+}
+
+.mx-7 {
+ margin-left: 1.75rem;
+ margin-right: 1.75rem;
+}
+
+.mx-8 {
+ margin-left: 2rem;
+ margin-right: 2rem;
+}
+
+.mx-9 {
+ margin-left: 2.25rem;
+ margin-right: 2.25rem;
+}
+
+.mx-10 {
+ margin-left: 2.5rem;
+ margin-right: 2.5rem;
+}
+
+.mx-11 {
+ margin-left: 2.75rem;
+ margin-right: 2.75rem;
+}
+
+.mx-12 {
+ margin-left: 3rem;
+ margin-right: 3rem;
+}
+
+.mx-14 {
+ margin-left: 3.5rem;
+ margin-right: 3.5rem;
+}
+
+.mx-16 {
+ margin-left: 4rem;
+ margin-right: 4rem;
+}
+
+.mx-20 {
+ margin-left: 5rem;
+ margin-right: 5rem;
+}
+
+.mx-24 {
+ margin-left: 6rem;
+ margin-right: 6rem;
+}
+
+.mx-28 {
+ margin-left: 7rem;
+ margin-right: 7rem;
+}
+
+.mx-32 {
+ margin-left: 8rem;
+ margin-right: 8rem;
+}
+
+.mx-36 {
+ margin-left: 9rem;
+ margin-right: 9rem;
+}
+
+.mx-40 {
+ margin-left: 10rem;
+ margin-right: 10rem;
+}
+
+.mx-44 {
+ margin-left: 11rem;
+ margin-right: 11rem;
+}
+
+.mx-48 {
+ margin-left: 12rem;
+ margin-right: 12rem;
+}
+
+.mx-52 {
+ margin-left: 13rem;
+ margin-right: 13rem;
+}
+
+.mx-56 {
+ margin-left: 14rem;
+ margin-right: 14rem;
+}
+
+.mx-60 {
+ margin-left: 15rem;
+ margin-right: 15rem;
+}
+
+.mx-64 {
+ margin-left: 16rem;
+ margin-right: 16rem;
+}
+
+.mx-72 {
+ margin-left: 18rem;
+ margin-right: 18rem;
+}
+
+.mx-80 {
+ margin-left: 20rem;
+ margin-right: 20rem;
+}
+
+.mx-96 {
+ margin-left: 24rem;
+ margin-right: 24rem;
+}
+
+.mx-auto {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.mx-px {
+ margin-left: 1px;
+ margin-right: 1px;
+}
+
+.-mx-0 {
+ margin-left: 0px;
+ margin-right: 0px;
+}
+
+.-mx-1 {
+ margin-left: -0.25rem;
+ margin-right: -0.25rem;
+}
+
+.-mx-2 {
+ margin-left: -0.5rem;
+ margin-right: -0.5rem;
+}
+
+.-mx-3 {
+ margin-left: -0.75rem;
+ margin-right: -0.75rem;
+}
+
+.-mx-4 {
+ margin-left: -1rem;
+ margin-right: -1rem;
+}
+
+.-mx-5 {
+ margin-left: -1.25rem;
+ margin-right: -1.25rem;
+}
+
+.-mx-6 {
+ margin-left: -1.5rem;
+ margin-right: -1.5rem;
+}
+
+.-mx-7 {
+ margin-left: -1.75rem;
+ margin-right: -1.75rem;
+}
+
+.-mx-8 {
+ margin-left: -2rem;
+ margin-right: -2rem;
+}
+
+.-mx-9 {
+ margin-left: -2.25rem;
+ margin-right: -2.25rem;
+}
+
+.-mx-10 {
+ margin-left: -2.5rem;
+ margin-right: -2.5rem;
+}
+
+.-mx-11 {
+ margin-left: -2.75rem;
+ margin-right: -2.75rem;
+}
+
+.-mx-12 {
+ margin-left: -3rem;
+ margin-right: -3rem;
+}
+
+.-mx-14 {
+ margin-left: -3.5rem;
+ margin-right: -3.5rem;
+}
+
+.-mx-16 {
+ margin-left: -4rem;
+ margin-right: -4rem;
+}
+
+.-mx-20 {
+ margin-left: -5rem;
+ margin-right: -5rem;
+}
+
+.-mx-24 {
+ margin-left: -6rem;
+ margin-right: -6rem;
+}
+
+.-mx-28 {
+ margin-left: -7rem;
+ margin-right: -7rem;
+}
+
+.-mx-32 {
+ margin-left: -8rem;
+ margin-right: -8rem;
+}
+
+.-mx-36 {
+ margin-left: -9rem;
+ margin-right: -9rem;
+}
+
+.-mx-40 {
+ margin-left: -10rem;
+ margin-right: -10rem;
+}
+
+.-mx-44 {
+ margin-left: -11rem;
+ margin-right: -11rem;
+}
+
+.-mx-48 {
+ margin-left: -12rem;
+ margin-right: -12rem;
+}
+
+.-mx-52 {
+ margin-left: -13rem;
+ margin-right: -13rem;
+}
+
+.-mx-56 {
+ margin-left: -14rem;
+ margin-right: -14rem;
+}
+
+.-mx-60 {
+ margin-left: -15rem;
+ margin-right: -15rem;
+}
+
+.-mx-64 {
+ margin-left: -16rem;
+ margin-right: -16rem;
+}
+
+.-mx-72 {
+ margin-left: -18rem;
+ margin-right: -18rem;
+}
+
+.-mx-80 {
+ margin-left: -20rem;
+ margin-right: -20rem;
+}
+
+.-mx-96 {
+ margin-left: -24rem;
+ margin-right: -24rem;
+}
+
+.-mx-px {
+ margin-left: -1px;
+ margin-right: -1px;
+}
+
+.my-0 {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+.my-1 {
+ margin-top: 0.25rem;
+ margin-bottom: 0.25rem;
+}
+
+.my-2 {
+ margin-top: 0.5rem;
+ margin-bottom: 0.5rem;
+}
+
+.my-3 {
+ margin-top: 0.75rem;
+ margin-bottom: 0.75rem;
+}
+
+.my-4 {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+}
+
+.my-5 {
+ margin-top: 1.25rem;
+ margin-bottom: 1.25rem;
+}
+
+.my-6 {
+ margin-top: 1.5rem;
+ margin-bottom: 1.5rem;
+}
+
+.my-7 {
+ margin-top: 1.75rem;
+ margin-bottom: 1.75rem;
+}
+
+.my-8 {
+ margin-top: 2rem;
+ margin-bottom: 2rem;
+}
+
+.my-9 {
+ margin-top: 2.25rem;
+ margin-bottom: 2.25rem;
+}
+
+.my-10 {
+ margin-top: 2.5rem;
+ margin-bottom: 2.5rem;
+}
+
+.my-11 {
+ margin-top: 2.75rem;
+ margin-bottom: 2.75rem;
+}
+
+.my-12 {
+ margin-top: 3rem;
+ margin-bottom: 3rem;
+}
+
+.my-14 {
+ margin-top: 3.5rem;
+ margin-bottom: 3.5rem;
+}
+
+.my-16 {
+ margin-top: 4rem;
+ margin-bottom: 4rem;
+}
+
+.my-20 {
+ margin-top: 5rem;
+ margin-bottom: 5rem;
+}
+
+.my-24 {
+ margin-top: 6rem;
+ margin-bottom: 6rem;
+}
+
+.my-28 {
+ margin-top: 7rem;
+ margin-bottom: 7rem;
+}
+
+.my-32 {
+ margin-top: 8rem;
+ margin-bottom: 8rem;
+}
+
+.my-36 {
+ margin-top: 9rem;
+ margin-bottom: 9rem;
+}
+
+.my-40 {
+ margin-top: 10rem;
+ margin-bottom: 10rem;
+}
+
+.my-44 {
+ margin-top: 11rem;
+ margin-bottom: 11rem;
+}
+
+.my-48 {
+ margin-top: 12rem;
+ margin-bottom: 12rem;
+}
+
+.my-52 {
+ margin-top: 13rem;
+ margin-bottom: 13rem;
+}
+
+.my-56 {
+ margin-top: 14rem;
+ margin-bottom: 14rem;
+}
+
+.my-60 {
+ margin-top: 15rem;
+ margin-bottom: 15rem;
+}
+
+.my-64 {
+ margin-top: 16rem;
+ margin-bottom: 16rem;
+}
+
+.my-72 {
+ margin-top: 18rem;
+ margin-bottom: 18rem;
+}
+
+.my-80 {
+ margin-top: 20rem;
+ margin-bottom: 20rem;
+}
+
+.my-96 {
+ margin-top: 24rem;
+ margin-bottom: 24rem;
+}
+
+.my-auto {
+ margin-top: auto;
+ margin-bottom: auto;
+}
+
+.my-px {
+ margin-top: 1px;
+ margin-bottom: 1px;
+}
+
+.-my-0 {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+.-my-1 {
+ margin-top: -0.25rem;
+ margin-bottom: -0.25rem;
+}
+
+.-my-2 {
+ margin-top: -0.5rem;
+ margin-bottom: -0.5rem;
+}
+
+.-my-3 {
+ margin-top: -0.75rem;
+ margin-bottom: -0.75rem;
+}
+
+.-my-4 {
+ margin-top: -1rem;
+ margin-bottom: -1rem;
+}
+
+.-my-5 {
+ margin-top: -1.25rem;
+ margin-bottom: -1.25rem;
+}
+
+.-my-6 {
+ margin-top: -1.5rem;
+ margin-bottom: -1.5rem;
+}
+
+.-my-7 {
+ margin-top: -1.75rem;
+ margin-bottom: -1.75rem;
+}
+
+.-my-8 {
+ margin-top: -2rem;
+ margin-bottom: -2rem;
+}
+
+.-my-9 {
+ margin-top: -2.25rem;
+ margin-bottom: -2.25rem;
+}
+
+.-my-10 {
+ margin-top: -2.5rem;
+ margin-bottom: -2.5rem;
+}
+
+.-my-11 {
+ margin-top: -2.75rem;
+ margin-bottom: -2.75rem;
+}
+
+.-my-12 {
+ margin-top: -3rem;
+ margin-bottom: -3rem;
+}
+
+.-my-14 {
+ margin-top: -3.5rem;
+ margin-bottom: -3.5rem;
+}
+
+.-my-16 {
+ margin-top: -4rem;
+ margin-bottom: -4rem;
+}
+
+.-my-20 {
+ margin-top: -5rem;
+ margin-bottom: -5rem;
+}
+
+.-my-24 {
+ margin-top: -6rem;
+ margin-bottom: -6rem;
+}
+
+.-my-28 {
+ margin-top: -7rem;
+ margin-bottom: -7rem;
+}
+
+.-my-32 {
+ margin-top: -8rem;
+ margin-bottom: -8rem;
+}
+
+.-my-36 {
+ margin-top: -9rem;
+ margin-bottom: -9rem;
+}
+
+.-my-40 {
+ margin-top: -10rem;
+ margin-bottom: -10rem;
+}
+
+.-my-44 {
+ margin-top: -11rem;
+ margin-bottom: -11rem;
+}
+
+.-my-48 {
+ margin-top: -12rem;
+ margin-bottom: -12rem;
+}
+
+.-my-52 {
+ margin-top: -13rem;
+ margin-bottom: -13rem;
+}
+
+.-my-56 {
+ margin-top: -14rem;
+ margin-bottom: -14rem;
+}
+
+.-my-60 {
+ margin-top: -15rem;
+ margin-bottom: -15rem;
+}
+
+.-my-64 {
+ margin-top: -16rem;
+ margin-bottom: -16rem;
+}
+
+.-my-72 {
+ margin-top: -18rem;
+ margin-bottom: -18rem;
+}
+
+.-my-80 {
+ margin-top: -20rem;
+ margin-bottom: -20rem;
+}
+
+.-my-96 {
+ margin-top: -24rem;
+ margin-bottom: -24rem;
+}
+
+.-my-px {
+ margin-top: -1px;
+ margin-bottom: -1px;
+}
+
+.mt-0 {
+ margin-top: 0px;
+}
+
+.mt-1 {
+ margin-top: 0.25rem;
+}
+
+.mt-2 {
+ margin-top: 0.5rem;
+}
+
+.mt-3 {
+ margin-top: 0.75rem;
+}
+
+.mt-4 {
+ margin-top: 1rem;
+}
+
+.mt-5 {
+ margin-top: 1.25rem;
+}
+
+.mt-6 {
+ margin-top: 1.5rem;
+}
+
+.mt-7 {
+ margin-top: 1.75rem;
+}
+
+.mt-8 {
+ margin-top: 2rem;
+}
+
+.mt-9 {
+ margin-top: 2.25rem;
+}
+
+.mt-10 {
+ margin-top: 2.5rem;
+}
+
+.mt-11 {
+ margin-top: 2.75rem;
+}
+
+.mt-12 {
+ margin-top: 3rem;
+}
+
+.mt-14 {
+ margin-top: 3.5rem;
+}
+
+.mt-16 {
+ margin-top: 4rem;
+}
+
+.mt-20 {
+ margin-top: 5rem;
+}
+
+.mt-24 {
+ margin-top: 6rem;
+}
+
+.mt-28 {
+ margin-top: 7rem;
+}
+
+.mt-32 {
+ margin-top: 8rem;
+}
+
+.mt-36 {
+ margin-top: 9rem;
+}
+
+.mt-40 {
+ margin-top: 10rem;
+}
+
+.mt-44 {
+ margin-top: 11rem;
+}
+
+.mt-48 {
+ margin-top: 12rem;
+}
+
+.mt-52 {
+ margin-top: 13rem;
+}
+
+.mt-56 {
+ margin-top: 14rem;
+}
+
+.mt-60 {
+ margin-top: 15rem;
+}
+
+.mt-64 {
+ margin-top: 16rem;
+}
+
+.mt-72 {
+ margin-top: 18rem;
+}
+
+.mt-80 {
+ margin-top: 20rem;
+}
+
+.mt-96 {
+ margin-top: 24rem;
+}
+
+.mt-auto {
+ margin-top: auto;
+}
+
+.mt-px {
+ margin-top: 1px;
+}
+
+.-mt-0 {
+ margin-top: 0px;
+}
+
+.-mt-1 {
+ margin-top: -0.25rem;
+}
+
+.-mt-2 {
+ margin-top: -0.5rem;
+}
+
+.-mt-3 {
+ margin-top: -0.75rem;
+}
+
+.-mt-4 {
+ margin-top: -1rem;
+}
+
+.-mt-5 {
+ margin-top: -1.25rem;
+}
+
+.-mt-6 {
+ margin-top: -1.5rem;
+}
+
+.-mt-7 {
+ margin-top: -1.75rem;
+}
+
+.-mt-8 {
+ margin-top: -2rem;
+}
+
+.-mt-9 {
+ margin-top: -2.25rem;
+}
+
+.-mt-10 {
+ margin-top: -2.5rem;
+}
+
+.-mt-11 {
+ margin-top: -2.75rem;
+}
+
+.-mt-12 {
+ margin-top: -3rem;
+}
+
+.-mt-14 {
+ margin-top: -3.5rem;
+}
+
+.-mt-16 {
+ margin-top: -4rem;
+}
+
+.-mt-20 {
+ margin-top: -5rem;
+}
+
+.-mt-24 {
+ margin-top: -6rem;
+}
+
+.-mt-28 {
+ margin-top: -7rem;
+}
+
+.-mt-32 {
+ margin-top: -8rem;
+}
+
+.-mt-36 {
+ margin-top: -9rem;
+}
+
+.-mt-40 {
+ margin-top: -10rem;
+}
+
+.-mt-44 {
+ margin-top: -11rem;
+}
+
+.-mt-48 {
+ margin-top: -12rem;
+}
+
+.-mt-52 {
+ margin-top: -13rem;
+}
+
+.-mt-56 {
+ margin-top: -14rem;
+}
+
+.-mt-60 {
+ margin-top: -15rem;
+}
+
+.-mt-64 {
+ margin-top: -16rem;
+}
+
+.-mt-72 {
+ margin-top: -18rem;
+}
+
+.-mt-80 {
+ margin-top: -20rem;
+}
+
+.-mt-96 {
+ margin-top: -24rem;
+}
+
+.-mt-px {
+ margin-top: -1px;
+}
+
+.mr-0 {
+ margin-right: 0px;
+}
+
+.mr-1 {
+ margin-right: 0.25rem;
+}
+
+.mr-2 {
+ margin-right: 0.5rem;
+}
+
+.mr-3 {
+ margin-right: 0.75rem;
+}
+
+.mr-4 {
+ margin-right: 1rem;
+}
+
+.mr-5 {
+ margin-right: 1.25rem;
+}
+
+.mr-6 {
+ margin-right: 1.5rem;
+}
+
+.mr-7 {
+ margin-right: 1.75rem;
+}
+
+.mr-8 {
+ margin-right: 2rem;
+}
+
+.mr-9 {
+ margin-right: 2.25rem;
+}
+
+.mr-10 {
+ margin-right: 2.5rem;
+}
+
+.mr-11 {
+ margin-right: 2.75rem;
+}
+
+.mr-12 {
+ margin-right: 3rem;
+}
+
+.mr-14 {
+ margin-right: 3.5rem;
+}
+
+.mr-16 {
+ margin-right: 4rem;
+}
+
+.mr-20 {
+ margin-right: 5rem;
+}
+
+.mr-24 {
+ margin-right: 6rem;
+}
+
+.mr-28 {
+ margin-right: 7rem;
+}
+
+.mr-32 {
+ margin-right: 8rem;
+}
+
+.mr-36 {
+ margin-right: 9rem;
+}
+
+.mr-40 {
+ margin-right: 10rem;
+}
+
+.mr-44 {
+ margin-right: 11rem;
+}
+
+.mr-48 {
+ margin-right: 12rem;
+}
+
+.mr-52 {
+ margin-right: 13rem;
+}
+
+.mr-56 {
+ margin-right: 14rem;
+}
+
+.mr-60 {
+ margin-right: 15rem;
+}
+
+.mr-64 {
+ margin-right: 16rem;
+}
+
+.mr-72 {
+ margin-right: 18rem;
+}
+
+.mr-80 {
+ margin-right: 20rem;
+}
+
+.mr-96 {
+ margin-right: 24rem;
+}
+
+.mr-auto {
+ margin-right: auto;
+}
+
+.mr-px {
+ margin-right: 1px;
+}
+
+.-mr-0 {
+ margin-right: 0px;
+}
+
+.-mr-1 {
+ margin-right: -0.25rem;
+}
+
+.-mr-2 {
+ margin-right: -0.5rem;
+}
+
+.-mr-3 {
+ margin-right: -0.75rem;
+}
+
+.-mr-4 {
+ margin-right: -1rem;
+}
+
+.-mr-5 {
+ margin-right: -1.25rem;
+}
+
+.-mr-6 {
+ margin-right: -1.5rem;
+}
+
+.-mr-7 {
+ margin-right: -1.75rem;
+}
+
+.-mr-8 {
+ margin-right: -2rem;
+}
+
+.-mr-9 {
+ margin-right: -2.25rem;
+}
+
+.-mr-10 {
+ margin-right: -2.5rem;
+}
+
+.-mr-11 {
+ margin-right: -2.75rem;
+}
+
+.-mr-12 {
+ margin-right: -3rem;
+}
+
+.-mr-14 {
+ margin-right: -3.5rem;
+}
+
+.-mr-16 {
+ margin-right: -4rem;
+}
+
+.-mr-20 {
+ margin-right: -5rem;
+}
+
+.-mr-24 {
+ margin-right: -6rem;
+}
+
+.-mr-28 {
+ margin-right: -7rem;
+}
+
+.-mr-32 {
+ margin-right: -8rem;
+}
+
+.-mr-36 {
+ margin-right: -9rem;
+}
+
+.-mr-40 {
+ margin-right: -10rem;
+}
+
+.-mr-44 {
+ margin-right: -11rem;
+}
+
+.-mr-48 {
+ margin-right: -12rem;
+}
+
+.-mr-52 {
+ margin-right: -13rem;
+}
+
+.-mr-56 {
+ margin-right: -14rem;
+}
+
+.-mr-60 {
+ margin-right: -15rem;
+}
+
+.-mr-64 {
+ margin-right: -16rem;
+}
+
+.-mr-72 {
+ margin-right: -18rem;
+}
+
+.-mr-80 {
+ margin-right: -20rem;
+}
+
+.-mr-96 {
+ margin-right: -24rem;
+}
+
+.-mr-px {
+ margin-right: -1px;
+}
+
+.mb-0 {
+ margin-bottom: 0px;
+}
+
+.mb-1 {
+ margin-bottom: 0.25rem;
+}
+
+.mb-2 {
+ margin-bottom: 0.5rem;
+}
+
+.mb-3 {
+ margin-bottom: 0.75rem;
+}
+
+.mb-4 {
+ margin-bottom: 1rem;
+}
+
+.mb-5 {
+ margin-bottom: 1.25rem;
+}
+
+.mb-6 {
+ margin-bottom: 1.5rem;
+}
+
+.mb-7 {
+ margin-bottom: 1.75rem;
+}
+
+.mb-8 {
+ margin-bottom: 2rem;
+}
+
+.mb-9 {
+ margin-bottom: 2.25rem;
+}
+
+.mb-10 {
+ margin-bottom: 2.5rem;
+}
+
+.mb-11 {
+ margin-bottom: 2.75rem;
+}
+
+.mb-12 {
+ margin-bottom: 3rem;
+}
+
+.mb-14 {
+ margin-bottom: 3.5rem;
+}
+
+.mb-16 {
+ margin-bottom: 4rem;
+}
+
+.mb-20 {
+ margin-bottom: 5rem;
+}
+
+.mb-24 {
+ margin-bottom: 6rem;
+}
+
+.mb-28 {
+ margin-bottom: 7rem;
+}
+
+.mb-32 {
+ margin-bottom: 8rem;
+}
+
+.mb-36 {
+ margin-bottom: 9rem;
+}
+
+.mb-40 {
+ margin-bottom: 10rem;
+}
+
+.mb-44 {
+ margin-bottom: 11rem;
+}
+
+.mb-48 {
+ margin-bottom: 12rem;
+}
+
+.mb-52 {
+ margin-bottom: 13rem;
+}
+
+.mb-56 {
+ margin-bottom: 14rem;
+}
+
+.mb-60 {
+ margin-bottom: 15rem;
+}
+
+.mb-64 {
+ margin-bottom: 16rem;
+}
+
+.mb-72 {
+ margin-bottom: 18rem;
+}
+
+.mb-80 {
+ margin-bottom: 20rem;
+}
+
+.mb-96 {
+ margin-bottom: 24rem;
+}
+
+.mb-auto {
+ margin-bottom: auto;
+}
+
+.mb-px {
+ margin-bottom: 1px;
+}
+
+.-mb-0 {
+ margin-bottom: 0px;
+}
+
+.-mb-1 {
+ margin-bottom: -0.25rem;
+}
+
+.-mb-2 {
+ margin-bottom: -0.5rem;
+}
+
+.-mb-3 {
+ margin-bottom: -0.75rem;
+}
+
+.-mb-4 {
+ margin-bottom: -1rem;
+}
+
+.-mb-5 {
+ margin-bottom: -1.25rem;
+}
+
+.-mb-6 {
+ margin-bottom: -1.5rem;
+}
+
+.-mb-7 {
+ margin-bottom: -1.75rem;
+}
+
+.-mb-8 {
+ margin-bottom: -2rem;
+}
+
+.-mb-9 {
+ margin-bottom: -2.25rem;
+}
+
+.-mb-10 {
+ margin-bottom: -2.5rem;
+}
+
+.-mb-11 {
+ margin-bottom: -2.75rem;
+}
+
+.-mb-12 {
+ margin-bottom: -3rem;
+}
+
+.-mb-14 {
+ margin-bottom: -3.5rem;
+}
+
+.-mb-16 {
+ margin-bottom: -4rem;
+}
+
+.-mb-20 {
+ margin-bottom: -5rem;
+}
+
+.-mb-24 {
+ margin-bottom: -6rem;
+}
+
+.-mb-28 {
+ margin-bottom: -7rem;
+}
+
+.-mb-32 {
+ margin-bottom: -8rem;
+}
+
+.-mb-36 {
+ margin-bottom: -9rem;
+}
+
+.-mb-40 {
+ margin-bottom: -10rem;
+}
+
+.-mb-44 {
+ margin-bottom: -11rem;
+}
+
+.-mb-48 {
+ margin-bottom: -12rem;
+}
+
+.-mb-52 {
+ margin-bottom: -13rem;
+}
+
+.-mb-56 {
+ margin-bottom: -14rem;
+}
+
+.-mb-60 {
+ margin-bottom: -15rem;
+}
+
+.-mb-64 {
+ margin-bottom: -16rem;
+}
+
+.-mb-72 {
+ margin-bottom: -18rem;
+}
+
+.-mb-80 {
+ margin-bottom: -20rem;
+}
+
+.-mb-96 {
+ margin-bottom: -24rem;
+}
+
+.-mb-px {
+ margin-bottom: -1px;
+}
+
+.ml-0 {
+ margin-left: 0px;
+}
+
+.ml-1 {
+ margin-left: 0.25rem;
+}
+
+.ml-2 {
+ margin-left: 0.5rem;
+}
+
+.ml-3 {
+ margin-left: 0.75rem;
+}
+
+.ml-4 {
+ margin-left: 1rem;
+}
+
+.ml-5 {
+ margin-left: 1.25rem;
+}
+
+.ml-6 {
+ margin-left: 1.5rem;
+}
+
+.ml-7 {
+ margin-left: 1.75rem;
+}
+
+.ml-8 {
+ margin-left: 2rem;
+}
+
+.ml-9 {
+ margin-left: 2.25rem;
+}
+
+.ml-10 {
+ margin-left: 2.5rem;
+}
+
+.ml-11 {
+ margin-left: 2.75rem;
+}
+
+.ml-12 {
+ margin-left: 3rem;
+}
+
+.ml-14 {
+ margin-left: 3.5rem;
+}
+
+.ml-16 {
+ margin-left: 4rem;
+}
+
+.ml-20 {
+ margin-left: 5rem;
+}
+
+.ml-24 {
+ margin-left: 6rem;
+}
+
+.ml-28 {
+ margin-left: 7rem;
+}
+
+.ml-32 {
+ margin-left: 8rem;
+}
+
+.ml-36 {
+ margin-left: 9rem;
+}
+
+.ml-40 {
+ margin-left: 10rem;
+}
+
+.ml-44 {
+ margin-left: 11rem;
+}
+
+.ml-48 {
+ margin-left: 12rem;
+}
+
+.ml-52 {
+ margin-left: 13rem;
+}
+
+.ml-56 {
+ margin-left: 14rem;
+}
+
+.ml-60 {
+ margin-left: 15rem;
+}
+
+.ml-64 {
+ margin-left: 16rem;
+}
+
+.ml-72 {
+ margin-left: 18rem;
+}
+
+.ml-80 {
+ margin-left: 20rem;
+}
+
+.ml-96 {
+ margin-left: 24rem;
+}
+
+.ml-auto {
+ margin-left: auto;
+}
+
+.ml-px {
+ margin-left: 1px;
+}
+
+.-ml-0 {
+ margin-left: 0px;
+}
+
+.-ml-1 {
+ margin-left: -0.25rem;
+}
+
+.-ml-2 {
+ margin-left: -0.5rem;
+}
+
+.-ml-3 {
+ margin-left: -0.75rem;
+}
+
+.-ml-4 {
+ margin-left: -1rem;
+}
+
+.-ml-5 {
+ margin-left: -1.25rem;
+}
+
+.-ml-6 {
+ margin-left: -1.5rem;
+}
+
+.-ml-7 {
+ margin-left: -1.75rem;
+}
+
+.-ml-8 {
+ margin-left: -2rem;
+}
+
+.-ml-9 {
+ margin-left: -2.25rem;
+}
+
+.-ml-10 {
+ margin-left: -2.5rem;
+}
+
+.-ml-11 {
+ margin-left: -2.75rem;
+}
+
+.-ml-12 {
+ margin-left: -3rem;
+}
+
+.-ml-14 {
+ margin-left: -3.5rem;
+}
+
+.-ml-16 {
+ margin-left: -4rem;
+}
+
+.-ml-20 {
+ margin-left: -5rem;
+}
+
+.-ml-24 {
+ margin-left: -6rem;
+}
+
+.-ml-28 {
+ margin-left: -7rem;
+}
+
+.-ml-32 {
+ margin-left: -8rem;
+}
+
+.-ml-36 {
+ margin-left: -9rem;
+}
+
+.-ml-40 {
+ margin-left: -10rem;
+}
+
+.-ml-44 {
+ margin-left: -11rem;
+}
+
+.-ml-48 {
+ margin-left: -12rem;
+}
+
+.-ml-52 {
+ margin-left: -13rem;
+}
+
+.-ml-56 {
+ margin-left: -14rem;
+}
+
+.-ml-60 {
+ margin-left: -15rem;
+}
+
+.-ml-64 {
+ margin-left: -16rem;
+}
+
+.-ml-72 {
+ margin-left: -18rem;
+}
+
+.-ml-80 {
+ margin-left: -20rem;
+}
+
+.-ml-96 {
+ margin-left: -24rem;
+}
+
+.-ml-px {
+ margin-left: -1px;
+}
+
+.box-border {
+ box-sizing: border-box;
+}
+
+.box-content {
+ box-sizing: content-box;
+}
+
+.block {
+ display: block;
+}
+
+.inline-block {
+ display: inline-block;
+}
+
+.inline {
+ display: inline;
+}
+
+.flex {
+ display: flex;
+}
+
+.inline-flex {
+ display: inline-flex;
+}
+
+.grid {
+ display: grid;
+}
+
+.inline-grid {
+ display: inline-grid;
+}
+
+.contents {
+ display: contents;
+}
+
+.list-item {
+ display: list-item;
+}
+
+.hidden {
+ display: none;
+}
+
+.flex-1 {
+ flex: 1 1 0%;
+}
+
+.flex-auto {
+ flex: 1 1 auto;
+}
+
+.flex-initial {
+ flex: 0 1 auto;
+}
+
+.flex-none {
+ flex: none;
+}
+
+.flex-shrink-0 {
+ flex-shrink: 0;
+}
+
+.flex-shrink {
+ flex-shrink: 1;
+}
+
+.flex-grow-0 {
+ flex-grow: 0;
+}
+
+.flex-grow {
+ flex-grow: 1;
+}
+
+@keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes ping {
+ 75%,
+ 100% {
+ transform: scale(2);
+ opacity: 0;
+ }
+}
+
+@keyframes pulse {
+ 50% {
+ opacity: 0.5;
+ }
+}
+
+@keyframes bounce {
+ 0%,
+ 100% {
+ transform: translateY(-25%);
+ animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
+ }
+
+ 50% {
+ transform: none;
+ animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
+ }
+}
+
+.animate-none {
+ animation: none;
+}
+
+.animate-spin {
+ animation: spin 1s linear infinite;
+}
+
+.animate-ping {
+ animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
+}
+
+.animate-pulse {
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
+}
+
+.animate-bounce {
+ animation: bounce 1s infinite;
+}
+
+.cursor-auto {
+ cursor: auto;
+}
+
+.cursor-default {
+ cursor: default;
+}
+
+.cursor-pointer {
+ cursor: pointer;
+}
+
+.cursor-wait {
+ cursor: wait;
+}
+
+.cursor-text {
+ cursor: text;
+}
+
+.cursor-move {
+ cursor: move;
+}
+
+.cursor-help {
+ cursor: help;
+}
+
+.cursor-not-allowed {
+ cursor: not-allowed;
+}
+
+.select-none {
+ -webkit-user-select: none;
+ user-select: none;
+}
+
+.select-text {
+ -webkit-user-select: text;
+ user-select: text;
+}
+
+.select-all {
+ -webkit-user-select: all;
+ user-select: all;
+}
+
+.select-auto {
+ -webkit-user-select: auto;
+ user-select: auto;
+}
+
+.auto-cols-auto {
+ grid-auto-columns: auto;
+}
+
+.auto-cols-min {
+ grid-auto-columns: min-content;
+}
+
+.auto-cols-max {
+ grid-auto-columns: max-content;
+}
+
+.auto-cols-fr {
+ grid-auto-columns: minmax(0, 1fr);
+}
+
+.grid-flow-row {
+ grid-auto-flow: row;
+}
+
+.grid-flow-col {
+ grid-auto-flow: column;
+}
+
+.grid-flow-row-dense {
+ grid-auto-flow: row dense;
+}
+
+.grid-flow-col-dense {
+ grid-auto-flow: column dense;
+}
+
+.auto-rows-auto {
+ grid-auto-rows: auto;
+}
+
+.auto-rows-min {
+ grid-auto-rows: min-content;
+}
+
+.auto-rows-max {
+ grid-auto-rows: max-content;
+}
+
+.auto-rows-fr {
+ grid-auto-rows: minmax(0, 1fr);
+}
+
+.grid-cols-1 {
+ grid-template-columns: repeat(1, minmax(0, 1fr));
+}
+
+.grid-cols-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+}
+
+.grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+
+.grid-cols-4 {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+}
+
+.grid-cols-5 {
+ grid-template-columns: repeat(5, minmax(0, 1fr));
+}
+
+.grid-cols-6 {
+ grid-template-columns: repeat(6, minmax(0, 1fr));
+}
+
+.grid-cols-7 {
+ grid-template-columns: repeat(7, minmax(0, 1fr));
+}
+
+.grid-cols-8 {
+ grid-template-columns: repeat(8, minmax(0, 1fr));
+}
+
+.grid-cols-9 {
+ grid-template-columns: repeat(9, minmax(0, 1fr));
+}
+
+.grid-cols-10 {
+ grid-template-columns: repeat(10, minmax(0, 1fr));
+}
+
+.grid-cols-11 {
+ grid-template-columns: repeat(11, minmax(0, 1fr));
+}
+
+.grid-cols-12 {
+ grid-template-columns: repeat(12, minmax(0, 1fr));
+}
+
+.grid-cols-none {
+ grid-template-columns: none;
+}
+
+.grid-rows-1 {
+ grid-template-rows: repeat(1, minmax(0, 1fr));
+}
+
+.grid-rows-2 {
+ grid-template-rows: repeat(2, minmax(0, 1fr));
+}
+
+.grid-rows-3 {
+ grid-template-rows: repeat(3, minmax(0, 1fr));
+}
+
+.grid-rows-4 {
+ grid-template-rows: repeat(4, minmax(0, 1fr));
+}
+
+.grid-rows-5 {
+ grid-template-rows: repeat(5, minmax(0, 1fr));
+}
+
+.grid-rows-6 {
+ grid-template-rows: repeat(6, minmax(0, 1fr));
+}
+
+.grid-rows-none {
+ grid-template-rows: none;
+}
+
+.flex-row {
+ flex-direction: row;
+}
+
+.flex-row-reverse {
+ flex-direction: row-reverse;
+}
+
+.flex-col {
+ flex-direction: column;
+}
+
+.flex-col-reverse {
+ flex-direction: column-reverse;
+}
+
+.flex-wrap {
+ flex-wrap: wrap;
+}
+
+.flex-wrap-reverse {
+ flex-wrap: wrap-reverse;
+}
+
+.flex-nowrap {
+ flex-wrap: nowrap;
+}
+
+.content-center {
+ align-content: center;
+}
+
+.content-start {
+ align-content: flex-start;
+}
+
+.content-end {
+ align-content: flex-end;
+}
+
+.content-between {
+ align-content: space-between;
+}
+
+.content-around {
+ align-content: space-around;
+}
+
+.content-evenly {
+ align-content: space-evenly;
+}
+
+.items-start {
+ align-items: flex-start;
+}
+
+.items-end {
+ align-items: flex-end;
+}
+
+.items-center {
+ align-items: center;
+}
+
+.items-baseline {
+ align-items: baseline;
+}
+
+.items-stretch {
+ align-items: stretch;
+}
+
+.justify-start {
+ justify-content: flex-start;
+}
+
+.justify-end {
+ justify-content: flex-end;
+}
+
+.justify-center {
+ justify-content: center;
+}
+
+.justify-between {
+ justify-content: space-between;
+}
+
+.justify-around {
+ justify-content: space-around;
+}
+
+.justify-evenly {
+ justify-content: space-evenly;
+}
+
+.justify-items-start {
+ justify-items: start;
+}
+
+.justify-items-end {
+ justify-items: end;
+}
+
+.justify-items-center {
+ justify-items: center;
+}
+
+.justify-items-stretch {
+ justify-items: stretch;
+}
+
+.self-auto {
+ align-self: auto;
+}
+
+.self-start {
+ align-self: flex-start;
+}
+
+.self-end {
+ align-self: flex-end;
+}
+
+.self-center {
+ align-self: center;
+}
+
+.self-stretch {
+ align-self: stretch;
+}
+
+.self-baseline {
+ align-self: baseline;
+}
+
+.justify-self-auto {
+ justify-self: auto;
+}
+
+.justify-self-start {
+ justify-self: start;
+}
+
+.justify-self-end {
+ justify-self: end;
+}
+
+.justify-self-center {
+ justify-self: center;
+}
+
+.justify-self-stretch {
+ justify-self: stretch;
+}
+
+.overflow-auto {
+ overflow: auto;
+}
+
+.overflow-hidden {
+ overflow: hidden;
+}
+
+.overflow-visible {
+ overflow: visible;
+}
+
+.overflow-scroll {
+ overflow: scroll;
+}
+
+.overflow-x-auto {
+ overflow-x: auto;
+}
+
+.overflow-y-auto {
+ overflow-y: auto;
+}
+
+.overflow-x-hidden {
+ overflow-x: hidden;
+}
+
+.overflow-y-hidden {
+ overflow-y: hidden;
+}
+
+.overflow-x-visible {
+ overflow-x: visible;
+}
+
+.overflow-y-visible {
+ overflow-y: visible;
+}
+
+.overflow-x-scroll {
+ overflow-x: scroll;
+}
+
+.overflow-y-scroll {
+ overflow-y: scroll;
+}
+.truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.overflow-ellipsis {
+ text-overflow: ellipsis;
+}
+
+.p-0 {
+ padding: 0px;
+}
+
+.p-1 {
+ padding: 0.25rem;
+}
+
+.p-2 {
+ padding: 0.5rem;
+}
+
+.p-3 {
+ padding: 0.75rem;
+}
+
+.p-4 {
+ padding: 1rem;
+}
+
+.p-5 {
+ padding: 1.25rem;
+}
+
+.p-6 {
+ padding: 1.5rem;
+}
+
+.p-7 {
+ padding: 1.75rem;
+}
+
+.p-8 {
+ padding: 2rem;
+}
+
+.p-9 {
+ padding: 2.25rem;
+}
+
+.p-10 {
+ padding: 2.5rem;
+}
+
+.p-11 {
+ padding: 2.75rem;
+}
+
+.p-12 {
+ padding: 3rem;
+}
+
+.p-14 {
+ padding: 3.5rem;
+}
+
+.p-16 {
+ padding: 4rem;
+}
+
+.p-20 {
+ padding: 5rem;
+}
+
+.p-24 {
+ padding: 6rem;
+}
+
+.p-28 {
+ padding: 7rem;
+}
+
+.p-32 {
+ padding: 8rem;
+}
+
+.p-36 {
+ padding: 9rem;
+}
+
+.p-40 {
+ padding: 10rem;
+}
+
+.p-44 {
+ padding: 11rem;
+}
+
+.p-48 {
+ padding: 12rem;
+}
+
+.p-52 {
+ padding: 13rem;
+}
+
+.p-56 {
+ padding: 14rem;
+}
+
+.p-60 {
+ padding: 15rem;
+}
+
+.p-64 {
+ padding: 16rem;
+}
+
+.p-72 {
+ padding: 18rem;
+}
+
+.p-80 {
+ padding: 20rem;
+}
+
+.p-96 {
+ padding: 24rem;
+}
+
+.p-px {
+ padding: 1px;
+}
+
+.px-0 {
+ padding-left: 0px;
+ padding-right: 0px;
+}
+
+.px-1 {
+ padding-left: 0.25rem;
+ padding-right: 0.25rem;
+}
+
+.px-2 {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.px-3 {
+ padding-left: 0.75rem;
+ padding-right: 0.75rem;
+}
+
+.px-4 {
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+.px-5 {
+ padding-left: 1.25rem;
+ padding-right: 1.25rem;
+}
+
+.px-6 {
+ padding-left: 1.5rem;
+ padding-right: 1.5rem;
+}
+
+.px-7 {
+ padding-left: 1.75rem;
+ padding-right: 1.75rem;
+}
+
+.px-8 {
+ padding-left: 2rem;
+ padding-right: 2rem;
+}
+
+.px-9 {
+ padding-left: 2.25rem;
+ padding-right: 2.25rem;
+}
+
+.px-10 {
+ padding-left: 2.5rem;
+ padding-right: 2.5rem;
+}
+
+.px-11 {
+ padding-left: 2.75rem;
+ padding-right: 2.75rem;
+}
+
+.px-12 {
+ padding-left: 3rem;
+ padding-right: 3rem;
+}
+
+.px-14 {
+ padding-left: 3.5rem;
+ padding-right: 3.5rem;
+}
+
+.px-16 {
+ padding-left: 4rem;
+ padding-right: 4rem;
+}
+
+.px-20 {
+ padding-left: 5rem;
+ padding-right: 5rem;
+}
+
+.px-24 {
+ padding-left: 6rem;
+ padding-right: 6rem;
+}
+
+.px-28 {
+ padding-left: 7rem;
+ padding-right: 7rem;
+}
+
+.px-32 {
+ padding-left: 8rem;
+ padding-right: 8rem;
+}
+
+.px-36 {
+ padding-left: 9rem;
+ padding-right: 9rem;
+}
+
+.px-40 {
+ padding-left: 10rem;
+ padding-right: 10rem;
+}
+
+.px-44 {
+ padding-left: 11rem;
+ padding-right: 11rem;
+}
+
+.px-48 {
+ padding-left: 12rem;
+ padding-right: 12rem;
+}
+
+.px-52 {
+ padding-left: 13rem;
+ padding-right: 13rem;
+}
+
+.px-56 {
+ padding-left: 14rem;
+ padding-right: 14rem;
+}
+
+.px-60 {
+ padding-left: 15rem;
+ padding-right: 15rem;
+}
+
+.px-64 {
+ padding-left: 16rem;
+ padding-right: 16rem;
+}
+
+.px-72 {
+ padding-left: 18rem;
+ padding-right: 18rem;
+}
+
+.px-80 {
+ padding-left: 20rem;
+ padding-right: 20rem;
+}
+
+.px-96 {
+ padding-left: 24rem;
+ padding-right: 24rem;
+}
+
+.px-px {
+ padding-left: 1px;
+ padding-right: 1px;
+}
+
+.py-0 {
+ padding-top: 0px;
+ padding-bottom: 0px;
+}
+
+.py-1 {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+}
+
+.py-2 {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.py-3 {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+}
+
+.py-4 {
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+}
+
+.py-5 {
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+}
+
+.py-6 {
+ padding-top: 1.5rem;
+ padding-bottom: 1.5rem;
+}
+
+.py-7 {
+ padding-top: 1.75rem;
+ padding-bottom: 1.75rem;
+}
+
+.py-8 {
+ padding-top: 2rem;
+ padding-bottom: 2rem;
+}
+
+.py-9 {
+ padding-top: 2.25rem;
+ padding-bottom: 2.25rem;
+}
+
+.py-10 {
+ padding-top: 2.5rem;
+ padding-bottom: 2.5rem;
+}
+
+.py-11 {
+ padding-top: 2.75rem;
+ padding-bottom: 2.75rem;
+}
+
+.py-12 {
+ padding-top: 3rem;
+ padding-bottom: 3rem;
+}
+
+.py-14 {
+ padding-top: 3.5rem;
+ padding-bottom: 3.5rem;
+}
+
+.py-16 {
+ padding-top: 4rem;
+ padding-bottom: 4rem;
+}
+
+.py-20 {
+ padding-top: 5rem;
+ padding-bottom: 5rem;
+}
+
+.py-24 {
+ padding-top: 6rem;
+ padding-bottom: 6rem;
+}
+
+.py-28 {
+ padding-top: 7rem;
+ padding-bottom: 7rem;
+}
+
+.py-32 {
+ padding-top: 8rem;
+ padding-bottom: 8rem;
+}
+
+.py-36 {
+ padding-top: 9rem;
+ padding-bottom: 9rem;
+}
+
+.py-40 {
+ padding-top: 10rem;
+ padding-bottom: 10rem;
+}
+
+.py-44 {
+ padding-top: 11rem;
+ padding-bottom: 11rem;
+}
+
+.py-48 {
+ padding-top: 12rem;
+ padding-bottom: 12rem;
+}
+
+.py-52 {
+ padding-top: 13rem;
+ padding-bottom: 13rem;
+}
+
+.py-56 {
+ padding-top: 14rem;
+ padding-bottom: 14rem;
+}
+
+.py-60 {
+ padding-top: 15rem;
+ padding-bottom: 15rem;
+}
+
+.py-64 {
+ padding-top: 16rem;
+ padding-bottom: 16rem;
+}
+
+.py-72 {
+ padding-top: 18rem;
+ padding-bottom: 18rem;
+}
+
+.py-80 {
+ padding-top: 20rem;
+ padding-bottom: 20rem;
+}
+
+.py-96 {
+ padding-top: 24rem;
+ padding-bottom: 24rem;
+}
+
+.py-px {
+ padding-top: 1px;
+ padding-bottom: 1px;
+}
+
+.pt-0 {
+ padding-top: 0px;
+}
+
+.pt-1 {
+ padding-top: 0.25rem;
+}
+
+.pt-2 {
+ padding-top: 0.5rem;
+}
+
+.pt-3 {
+ padding-top: 0.75rem;
+}
+
+.pt-4 {
+ padding-top: 1rem;
+}
+
+.pt-5 {
+ padding-top: 1.25rem;
+}
+
+.pt-6 {
+ padding-top: 1.5rem;
+}
+
+.pt-7 {
+ padding-top: 1.75rem;
+}
+
+.pt-8 {
+ padding-top: 2rem;
+}
+
+.pt-9 {
+ padding-top: 2.25rem;
+}
+
+.pt-10 {
+ padding-top: 2.5rem;
+}
+
+.pt-11 {
+ padding-top: 2.75rem;
+}
+
+.pt-12 {
+ padding-top: 3rem;
+}
+
+.pt-14 {
+ padding-top: 3.5rem;
+}
+
+.pt-16 {
+ padding-top: 4rem;
+}
+
+.pt-20 {
+ padding-top: 5rem;
+}
+
+.pt-24 {
+ padding-top: 6rem;
+}
+
+.pt-28 {
+ padding-top: 7rem;
+}
+
+.pt-32 {
+ padding-top: 8rem;
+}
+
+.pt-36 {
+ padding-top: 9rem;
+}
+
+.pt-40 {
+ padding-top: 10rem;
+}
+
+.pt-44 {
+ padding-top: 11rem;
+}
+
+.pt-48 {
+ padding-top: 12rem;
+}
+
+.pt-52 {
+ padding-top: 13rem;
+}
+
+.pt-56 {
+ padding-top: 14rem;
+}
+
+.pt-60 {
+ padding-top: 15rem;
+}
+
+.pt-64 {
+ padding-top: 16rem;
+}
+
+.pt-72 {
+ padding-top: 18rem;
+}
+
+.pt-80 {
+ padding-top: 20rem;
+}
+
+.pt-96 {
+ padding-top: 24rem;
+}
+
+.pt-px {
+ padding-top: 1px;
+}
+
+.pr-0 {
+ padding-right: 0px;
+}
+
+.pr-1 {
+ padding-right: 0.25rem;
+}
+
+.pr-2 {
+ padding-right: 0.5rem;
+}
+
+.pr-3 {
+ padding-right: 0.75rem;
+}
+
+.pr-4 {
+ padding-right: 1rem;
+}
+
+.pr-5 {
+ padding-right: 1.25rem;
+}
+
+.pr-6 {
+ padding-right: 1.5rem;
+}
+
+.pr-7 {
+ padding-right: 1.75rem;
+}
+
+.pr-8 {
+ padding-right: 2rem;
+}
+
+.pr-9 {
+ padding-right: 2.25rem;
+}
+
+.pr-10 {
+ padding-right: 2.5rem;
+}
+
+.pr-11 {
+ padding-right: 2.75rem;
+}
+
+.pr-12 {
+ padding-right: 3rem;
+}
+
+.pr-14 {
+ padding-right: 3.5rem;
+}
+
+.pr-16 {
+ padding-right: 4rem;
+}
+
+.pr-20 {
+ padding-right: 5rem;
+}
+
+.pr-24 {
+ padding-right: 6rem;
+}
+
+.pr-28 {
+ padding-right: 7rem;
+}
+
+.pr-32 {
+ padding-right: 8rem;
+}
+
+.pr-36 {
+ padding-right: 9rem;
+}
+
+.pr-40 {
+ padding-right: 10rem;
+}
+
+.pr-44 {
+ padding-right: 11rem;
+}
+
+.pr-48 {
+ padding-right: 12rem;
+}
+
+.pr-52 {
+ padding-right: 13rem;
+}
+
+.pr-56 {
+ padding-right: 14rem;
+}
+
+.pr-60 {
+ padding-right: 15rem;
+}
+
+.pr-64 {
+ padding-right: 16rem;
+}
+
+.pr-72 {
+ padding-right: 18rem;
+}
+
+.pr-80 {
+ padding-right: 20rem;
+}
+
+.pr-96 {
+ padding-right: 24rem;
+}
+
+.pr-px {
+ padding-right: 1px;
+}
+
+.pb-0 {
+ padding-bottom: 0px;
+}
+
+.pb-1 {
+ padding-bottom: 0.25rem;
+}
+
+.pb-2 {
+ padding-bottom: 0.5rem;
+}
+
+.pb-3 {
+ padding-bottom: 0.75rem;
+}
+
+.pb-4 {
+ padding-bottom: 1rem;
+}
+
+.pb-5 {
+ padding-bottom: 1.25rem;
+}
+
+.pb-6 {
+ padding-bottom: 1.5rem;
+}
+
+.pb-7 {
+ padding-bottom: 1.75rem;
+}
+
+.pb-8 {
+ padding-bottom: 2rem;
+}
+
+.pb-9 {
+ padding-bottom: 2.25rem;
+}
+
+.pb-10 {
+ padding-bottom: 2.5rem;
+}
+
+.pb-11 {
+ padding-bottom: 2.75rem;
+}
+
+.pb-12 {
+ padding-bottom: 3rem;
+}
+
+.pb-14 {
+ padding-bottom: 3.5rem;
+}
+
+.pb-16 {
+ padding-bottom: 4rem;
+}
+
+.pb-20 {
+ padding-bottom: 5rem;
+}
+
+.pb-24 {
+ padding-bottom: 6rem;
+}
+
+.pb-28 {
+ padding-bottom: 7rem;
+}
+
+.pb-32 {
+ padding-bottom: 8rem;
+}
+
+.pb-36 {
+ padding-bottom: 9rem;
+}
+
+.pb-40 {
+ padding-bottom: 10rem;
+}
+
+.pb-44 {
+ padding-bottom: 11rem;
+}
+
+.pb-48 {
+ padding-bottom: 12rem;
+}
+
+.pb-52 {
+ padding-bottom: 13rem;
+}
+
+.pb-56 {
+ padding-bottom: 14rem;
+}
+
+.pb-60 {
+ padding-bottom: 15rem;
+}
+
+.pb-64 {
+ padding-bottom: 16rem;
+}
+
+.pb-72 {
+ padding-bottom: 18rem;
+}
+
+.pb-80 {
+ padding-bottom: 20rem;
+}
+
+.pb-96 {
+ padding-bottom: 24rem;
+}
+
+.pb-px {
+ padding-bottom: 1px;
+}
+
+.pl-0 {
+ padding-left: 0px;
+}
+
+.pl-1 {
+ padding-left: 0.25rem;
+}
+
+.pl-2 {
+ padding-left: 0.5rem;
+}
+
+.pl-3 {
+ padding-left: 0.75rem;
+}
+
+.pl-4 {
+ padding-left: 1rem;
+}
+
+.pl-5 {
+ padding-left: 1.25rem;
+}
+
+.pl-6 {
+ padding-left: 1.5rem;
+}
+
+.pl-7 {
+ padding-left: 1.75rem;
+}
+
+.pl-8 {
+ padding-left: 2rem;
+}
+
+.pl-9 {
+ padding-left: 2.25rem;
+}
+
+.pl-10 {
+ padding-left: 2.5rem;
+}
+
+.pl-11 {
+ padding-left: 2.75rem;
+}
+
+.pl-12 {
+ padding-left: 3rem;
+}
+
+.pl-14 {
+ padding-left: 3.5rem;
+}
+
+.pl-16 {
+ padding-left: 4rem;
+}
+
+.pl-20 {
+ padding-left: 5rem;
+}
+
+.pl-24 {
+ padding-left: 6rem;
+}
+
+.pl-28 {
+ padding-left: 7rem;
+}
+
+.pl-32 {
+ padding-left: 8rem;
+}
+
+.pl-36 {
+ padding-left: 9rem;
+}
+
+.pl-40 {
+ padding-left: 10rem;
+}
+
+.pl-44 {
+ padding-left: 11rem;
+}
+
+.pl-48 {
+ padding-left: 12rem;
+}
+
+.pl-52 {
+ padding-left: 13rem;
+}
+
+.pl-56 {
+ padding-left: 14rem;
+}
+
+.pl-60 {
+ padding-left: 15rem;
+}
+
+.pl-64 {
+ padding-left: 16rem;
+}
+
+.pl-72 {
+ padding-left: 18rem;
+}
+
+.pl-80 {
+ padding-left: 20rem;
+}
+
+.pl-96 {
+ padding-left: 24rem;
+}
+
+.pl-px {
+ padding-left: 1px;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.text-justify {
+ text-align: justify;
+}
+
+.align-baseline {
+ vertical-align: baseline;
+}
+
+.align-top {
+ vertical-align: top;
+}
+
+.align-middle {
+ vertical-align: middle;
+}
+
+.align-bottom {
+ vertical-align: bottom;
+}
+
+.align-text-top {
+ vertical-align: text-top;
+}
+
+.align-text-bottom {
+ vertical-align: text-bottom;
+}
+
+.font-sans {
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
+ sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
+}
+
+.font-serif {
+ font-family: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif;
+}
+
+.font-mono {
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
+}
+
+.text-xs {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.text-base {
+ font-size: 1rem;
+ line-height: 1.5rem;
+}
+
+.text-lg {
+ font-size: 1.125rem;
+ line-height: 1.75rem;
+}
+
+.text-xl {
+ font-size: 1.25rem;
+ line-height: 1.75rem;
+}
+
+.text-2xl {
+ font-size: 1.5rem;
+ line-height: 2rem;
+}
+
+.text-3xl {
+ font-size: 1.875rem;
+ line-height: 2.25rem;
+}
+
+.text-4xl {
+ font-size: 2.25rem;
+ line-height: 2.5rem;
+}
+
+.text-5xl {
+ font-size: 3rem;
+ line-height: 1;
+}
+
+.text-6xl {
+ font-size: 3.75rem;
+ line-height: 1;
+}
+
+.text-7xl {
+ font-size: 4.5rem;
+ line-height: 1;
+}
+
+.text-8xl {
+ font-size: 6rem;
+ line-height: 1;
+}
+
+.text-9xl {
+ font-size: 8rem;
+ line-height: 1;
+}
+
+.font-thin {
+ font-weight: 100;
+}
+
+.font-extralight {
+ font-weight: 200;
+}
+
+.font-light {
+ font-weight: 300;
+}
+
+.font-normal {
+ font-weight: 400;
+}
+
+.font-medium {
+ font-weight: 500;
+}
+
+.font-semibold {
+ font-weight: 600;
+}
+
+.font-bold {
+ font-weight: 700;
+}
+
+.font-extrabold {
+ font-weight: 800;
+}
+
+.font-black {
+ font-weight: 900;
+}
+
+.uppercase {
+ text-transform: uppercase;
+}
+
+.lowercase {
+ text-transform: lowercase;
+}
+
+.capitalize {
+ text-transform: capitalize;
+}
+
+.normal-case {
+ text-transform: none;
+}
+
+.italic {
+ font-style: italic;
+}
+
+.not-italic {
+ font-style: normal;
+}
+
+.text-transparent {
+ color: transparent;
+}
+
+.text-current {
+ color: currentColor;
+}
+
+.text-black {
+ --tw-text-opacity: 1;
+ color: rgba(0, 0, 0, var(--tw-text-opacity));
+}
+
+.text-white {
+ --tw-text-opacity: 1;
+ color: rgba(255, 255, 255, var(--tw-text-opacity));
+}
+
+.text-gray-50 {
+ --tw-text-opacity: 1;
+ color: rgba(249, 250, 251, var(--tw-text-opacity));
+}
+
+.text-gray-100 {
+ --tw-text-opacity: 1;
+ color: rgba(243, 244, 246, var(--tw-text-opacity));
+}
+
+.text-gray-200 {
+ --tw-text-opacity: 1;
+ color: rgba(229, 231, 235, var(--tw-text-opacity));
+}
+
+.text-gray-300 {
+ --tw-text-opacity: 1;
+ color: rgba(209, 213, 219, var(--tw-text-opacity));
+}
+
+.text-gray-400 {
+ --tw-text-opacity: 1;
+ color: rgba(156, 163, 175, var(--tw-text-opacity));
+}
+
+.text-gray-500 {
+ --tw-text-opacity: 1;
+ color: rgba(107, 114, 128, var(--tw-text-opacity));
+}
+
+.text-gray-600 {
+ --tw-text-opacity: 1;
+ color: rgba(75, 85, 99, var(--tw-text-opacity));
+}
+
+.text-gray-700 {
+ --tw-text-opacity: 1;
+ color: rgba(55, 65, 81, var(--tw-text-opacity));
+}
+
+.text-gray-800 {
+ --tw-text-opacity: 1;
+ color: rgba(31, 41, 55, var(--tw-text-opacity));
+}
+
+.text-gray-900 {
+ --tw-text-opacity: 1;
+ color: rgba(17, 24, 39, var(--tw-text-opacity));
+}
+
+.text-red-50 {
+ --tw-text-opacity: 1;
+ color: rgba(254, 242, 242, var(--tw-text-opacity));
+}
+
+.text-red-100 {
+ --tw-text-opacity: 1;
+ color: rgba(254, 226, 226, var(--tw-text-opacity));
+}
+
+.text-red-200 {
+ --tw-text-opacity: 1;
+ color: rgba(254, 202, 202, var(--tw-text-opacity));
+}
+
+.text-red-300 {
+ --tw-text-opacity: 1;
+ color: rgba(252, 165, 165, var(--tw-text-opacity));
+}
+
+.text-red-400 {
+ --tw-text-opacity: 1;
+ color: rgba(248, 113, 113, var(--tw-text-opacity));
+}
+
+.text-red-500 {
+ --tw-text-opacity: 1;
+ color: rgba(239, 68, 68, var(--tw-text-opacity));
+}
+
+.text-red-600 {
+ --tw-text-opacity: 1;
+ color: rgba(220, 38, 38, var(--tw-text-opacity));
+}
+
+.text-red-700 {
+ --tw-text-opacity: 1;
+ color: rgba(185, 28, 28, var(--tw-text-opacity));
+}
+
+.text-red-800 {
+ --tw-text-opacity: 1;
+ color: rgba(153, 27, 27, var(--tw-text-opacity));
+}
+
+.text-red-900 {
+ --tw-text-opacity: 1;
+ color: rgba(127, 29, 29, var(--tw-text-opacity));
+}
+
+.text-yellow-50 {
+ --tw-text-opacity: 1;
+ color: rgba(255, 251, 235, var(--tw-text-opacity));
+}
+
+.text-yellow-100 {
+ --tw-text-opacity: 1;
+ color: rgba(254, 243, 199, var(--tw-text-opacity));
+}
+
+.text-yellow-200 {
+ --tw-text-opacity: 1;
+ color: rgba(253, 230, 138, var(--tw-text-opacity));
+}
+
+.text-yellow-300 {
+ --tw-text-opacity: 1;
+ color: rgba(252, 211, 77, var(--tw-text-opacity));
+}
+
+.text-yellow-400 {
+ --tw-text-opacity: 1;
+ color: rgba(251, 191, 36, var(--tw-text-opacity));
+}
+
+.text-yellow-500 {
+ --tw-text-opacity: 1;
+ color: rgba(245, 158, 11, var(--tw-text-opacity));
+}
+
+.text-yellow-600 {
+ --tw-text-opacity: 1;
+ color: rgba(217, 119, 6, var(--tw-text-opacity));
+}
+
+.text-yellow-700 {
+ --tw-text-opacity: 1;
+ color: rgba(180, 83, 9, var(--tw-text-opacity));
+}
+
+.text-yellow-800 {
+ --tw-text-opacity: 1;
+ color: rgba(146, 64, 14, var(--tw-text-opacity));
+}
+
+.text-yellow-900 {
+ --tw-text-opacity: 1;
+ color: rgba(120, 53, 15, var(--tw-text-opacity));
+}
+
+.text-green-50 {
+ --tw-text-opacity: 1;
+ color: rgba(236, 253, 245, var(--tw-text-opacity));
+}
+
+.text-green-100 {
+ --tw-text-opacity: 1;
+ color: rgba(209, 250, 229, var(--tw-text-opacity));
+}
+
+.text-green-200 {
+ --tw-text-opacity: 1;
+ color: rgba(167, 243, 208, var(--tw-text-opacity));
+}
+
+.text-green-300 {
+ --tw-text-opacity: 1;
+ color: rgba(110, 231, 183, var(--tw-text-opacity));
+}
+
+.text-green-400 {
+ --tw-text-opacity: 1;
+ color: rgba(52, 211, 153, var(--tw-text-opacity));
+}
+
+.text-green-500 {
+ --tw-text-opacity: 1;
+ color: rgba(16, 185, 129, var(--tw-text-opacity));
+}
+
+.text-green-600 {
+ --tw-text-opacity: 1;
+ color: rgba(5, 150, 105, var(--tw-text-opacity));
+}
+
+.text-green-700 {
+ --tw-text-opacity: 1;
+ color: rgba(4, 120, 87, var(--tw-text-opacity));
+}
+
+.text-green-800 {
+ --tw-text-opacity: 1;
+ color: rgba(6, 95, 70, var(--tw-text-opacity));
+}
+
+.text-green-900 {
+ --tw-text-opacity: 1;
+ color: rgba(6, 78, 59, var(--tw-text-opacity));
+}
+
+.text-blue-50 {
+ --tw-text-opacity: 1;
+ color: rgba(239, 246, 255, var(--tw-text-opacity));
+}
+
+.text-blue-100 {
+ --tw-text-opacity: 1;
+ color: rgba(219, 234, 254, var(--tw-text-opacity));
+}
+
+.text-blue-200 {
+ --tw-text-opacity: 1;
+ color: rgba(191, 219, 254, var(--tw-text-opacity));
+}
+
+.text-blue-300 {
+ --tw-text-opacity: 1;
+ color: rgba(147, 197, 253, var(--tw-text-opacity));
+}
+
+.text-blue-400 {
+ --tw-text-opacity: 1;
+ color: rgba(96, 165, 250, var(--tw-text-opacity));
+}
+
+.text-blue-500 {
+ --tw-text-opacity: 1;
+ color: rgba(59, 130, 246, var(--tw-text-opacity));
+}
+
+.text-blue-600 {
+ --tw-text-opacity: 1;
+ color: rgba(37, 99, 235, var(--tw-text-opacity));
+}
+
+.text-blue-700 {
+ --tw-text-opacity: 1;
+ color: rgba(29, 78, 216, var(--tw-text-opacity));
+}
+
+.text-blue-800 {
+ --tw-text-opacity: 1;
+ color: rgba(30, 64, 175, var(--tw-text-opacity));
+}
+
+.text-blue-900 {
+ --tw-text-opacity: 1;
+ color: rgba(30, 58, 138, var(--tw-text-opacity));
+}
+
+.text-indigo-50 {
+ --tw-text-opacity: 1;
+ color: rgba(238, 242, 255, var(--tw-text-opacity));
+}
+
+.text-indigo-100 {
+ --tw-text-opacity: 1;
+ color: rgba(224, 231, 255, var(--tw-text-opacity));
+}
+
+.text-indigo-200 {
+ --tw-text-opacity: 1;
+ color: rgba(199, 210, 254, var(--tw-text-opacity));
+}
+
+.text-indigo-300 {
+ --tw-text-opacity: 1;
+ color: rgba(165, 180, 252, var(--tw-text-opacity));
+}
+
+.text-indigo-400 {
+ --tw-text-opacity: 1;
+ color: rgba(129, 140, 248, var(--tw-text-opacity));
+}
+
+.text-indigo-500 {
+ --tw-text-opacity: 1;
+ color: rgba(99, 102, 241, var(--tw-text-opacity));
+}
+
+.text-indigo-600 {
+ --tw-text-opacity: 1;
+ color: rgba(79, 70, 229, var(--tw-text-opacity));
+}
+
+.text-indigo-700 {
+ --tw-text-opacity: 1;
+ color: rgba(67, 56, 202, var(--tw-text-opacity));
+}
+
+.text-indigo-800 {
+ --tw-text-opacity: 1;
+ color: rgba(55, 48, 163, var(--tw-text-opacity));
+}
+
+.text-indigo-900 {
+ --tw-text-opacity: 1;
+ color: rgba(49, 46, 129, var(--tw-text-opacity));
+}
+
+.text-purple-50 {
+ --tw-text-opacity: 1;
+ color: rgba(245, 243, 255, var(--tw-text-opacity));
+}
+
+.text-purple-100 {
+ --tw-text-opacity: 1;
+ color: rgba(237, 233, 254, var(--tw-text-opacity));
+}
+
+.text-purple-200 {
+ --tw-text-opacity: 1;
+ color: rgba(221, 214, 254, var(--tw-text-opacity));
+}
+
+.text-purple-300 {
+ --tw-text-opacity: 1;
+ color: rgba(196, 181, 253, var(--tw-text-opacity));
+}
+
+.text-purple-400 {
+ --tw-text-opacity: 1;
+ color: rgba(167, 139, 250, var(--tw-text-opacity));
+}
+
+.text-purple-500 {
+ --tw-text-opacity: 1;
+ color: rgba(139, 92, 246, var(--tw-text-opacity));
+}
+
+.text-purple-600 {
+ --tw-text-opacity: 1;
+ color: rgba(124, 58, 237, var(--tw-text-opacity));
+}
+
+.text-purple-700 {
+ --tw-text-opacity: 1;
+ color: rgba(109, 40, 217, var(--tw-text-opacity));
+}
+
+.text-purple-800 {
+ --tw-text-opacity: 1;
+ color: rgba(91, 33, 182, var(--tw-text-opacity));
+}
+
+.text-purple-900 {
+ --tw-text-opacity: 1;
+ color: rgba(76, 29, 149, var(--tw-text-opacity));
+}
+
+.text-pink-50 {
+ --tw-text-opacity: 1;
+ color: rgba(253, 242, 248, var(--tw-text-opacity));
+}
+
+.text-pink-100 {
+ --tw-text-opacity: 1;
+ color: rgba(252, 231, 243, var(--tw-text-opacity));
+}
+
+.text-pink-200 {
+ --tw-text-opacity: 1;
+ color: rgba(251, 207, 232, var(--tw-text-opacity));
+}
+
+.text-pink-300 {
+ --tw-text-opacity: 1;
+ color: rgba(249, 168, 212, var(--tw-text-opacity));
+}
+
+.text-pink-400 {
+ --tw-text-opacity: 1;
+ color: rgba(244, 114, 182, var(--tw-text-opacity));
+}
+
+.text-pink-500 {
+ --tw-text-opacity: 1;
+ color: rgba(236, 72, 153, var(--tw-text-opacity));
+}
+
+.text-pink-600 {
+ --tw-text-opacity: 1;
+ color: rgba(219, 39, 119, var(--tw-text-opacity));
+}
+
+.text-pink-700 {
+ --tw-text-opacity: 1;
+ color: rgba(190, 24, 93, var(--tw-text-opacity));
+}
+
+.text-pink-800 {
+ --tw-text-opacity: 1;
+ color: rgba(157, 23, 77, var(--tw-text-opacity));
+}
+
+.text-pink-900 {
+ --tw-text-opacity: 1;
+ color: rgba(131, 24, 67, var(--tw-text-opacity));
+}
+
+.opacity-0 {
+ opacity: 0;
+}
+
+.opacity-5 {
+ opacity: 0.05;
+}
+
+.opacity-10 {
+ opacity: 0.1;
+}
+
+.opacity-20 {
+ opacity: 0.2;
+}
+
+.opacity-25 {
+ opacity: 0.25;
+}
+
+.opacity-30 {
+ opacity: 0.3;
+}
+
+.opacity-40 {
+ opacity: 0.4;
+}
+
+.opacity-50 {
+ opacity: 0.5;
+}
+
+.opacity-60 {
+ opacity: 0.6;
+}
+
+.opacity-70 {
+ opacity: 0.7;
+}
+
+.opacity-75 {
+ opacity: 0.75;
+}
+
+.opacity-80 {
+ opacity: 0.8;
+}
+
+.opacity-90 {
+ opacity: 0.9;
+}
+
+.opacity-95 {
+ opacity: 0.95;
+}
+
+.opacity-100 {
+ opacity: 1;
+}
+.h-full {
+ height: 100%;
+}
+.bg-gray-50 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(249, 250, 251, var(--tw-bg-opacity));
+}
+.w-12 {
+ width: 3rem;
+}
+.w-full {
+ width: 100%;
+}
+
+.w-screen {
+ width: 100vw;
+}
+
+.w-min {
+ width: min-content;
+}
+
+.w-max {
+ width: max-content;
+}
+
+.h-12 {
+ height: 3rem;
+}
+.bg-white {
+ --tw-bg-opacity: 1;
+ background-color: rgba(255, 255, 255, var(--tw-bg-opacity));
+}
+.bg-blue-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(219, 234, 254, var(--tw-bg-opacity));
+}
+.bg-blue-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(59, 130, 246, var(--tw-bg-opacity));
+}
+.text-green-400 {
+ --tw-text-opacity: 1;
+ color: rgba(52, 211, 153, var(--tw-text-opacity));
+}
+.text-black {
+ --tw-text-opacity: 1;
+ color: rgba(0, 0, 0, var(--tw-text-opacity));
+}
+
+.text-white {
+ --tw-text-opacity: 1;
+ color: rgba(255, 255, 255, var(--tw-text-opacity));
+}
+
+.text-gray-50 {
+ --tw-text-opacity: 1;
+ color: rgba(249, 250, 251, var(--tw-text-opacity));
+}
+
+.text-gray-100 {
+ --tw-text-opacity: 1;
+ color: rgba(243, 244, 246, var(--tw-text-opacity));
+}
+
+.text-gray-200 {
+ --tw-text-opacity: 1;
+ color: rgba(229, 231, 235, var(--tw-text-opacity));
+}
+
+.text-gray-300 {
+ --tw-text-opacity: 1;
+ color: rgba(209, 213, 219, var(--tw-text-opacity));
+}
+
+.text-gray-400 {
+ --tw-text-opacity: 1;
+ color: rgba(156, 163, 175, var(--tw-text-opacity));
+}
+
+.text-gray-500 {
+ --tw-text-opacity: 1;
+ color: rgba(107, 114, 128, var(--tw-text-opacity));
+}
+
+.text-gray-600 {
+ --tw-text-opacity: 1;
+ color: rgba(75, 85, 99, var(--tw-text-opacity));
+}
+
+.text-gray-700 {
+ --tw-text-opacity: 1;
+ color: rgba(55, 65, 81, var(--tw-text-opacity));
+}
+
+.text-gray-800 {
+ --tw-text-opacity: 1;
+ color: rgba(31, 41, 55, var(--tw-text-opacity));
+}
+
+.text-gray-900 {
+ --tw-text-opacity: 1;
+ color: rgba(17, 24, 39, var(--tw-text-opacity));
+}
+.bg-green-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(209, 250, 229, var(--tw-bg-opacity));
+}
+.bg-blue-50 {
+ --tw-bg-opacity: 1;
+ background-color: rgba(239, 246, 255, var(--tw-bg-opacity));
+}
+.rounded-full {
+ border-radius: 9999px;
+}
+.shadow-sm {
+ --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow {
+ --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-md {
+ --tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-lg {
+ --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-xl {
+ --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-2xl {
+ --tw-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-inner {
+ --tw-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-none {
+ --tw-shadow: 0 0 #0000;
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
diff --git a/src/components/Globals/Globals.vue b/src/components/Globals/Globals.vue
deleted file mode 100644
index bda592f..0000000
--- a/src/components/Globals/Globals.vue
+++ /dev/null
@@ -1,94 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/ImageCode/ImageCode.vue b/src/components/ImageCode/ImageCode.vue
new file mode 100644
index 0000000..c8a67b8
--- /dev/null
+++ b/src/components/ImageCode/ImageCode.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
diff --git a/src/components/Plugin/Plugin.vue b/src/components/Plugin/Plugin.vue
deleted file mode 100644
index 20d7127..0000000
--- a/src/components/Plugin/Plugin.vue
+++ /dev/null
@@ -1,136 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/PrettyExchange/PrettyExchange.vue b/src/components/PrettyExchange/PrettyExchange.vue
new file mode 100644
index 0000000..64c9d7d
--- /dev/null
+++ b/src/components/PrettyExchange/PrettyExchange.vue
@@ -0,0 +1,480 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+ 进行中
+
+
+
+ {{ $moment(+item.startTime).format('MM-DD HH:mm') }}
+ 至
+ {{ $moment(+item.endTime).format('MM-DD HH:mm') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ subItem.name }}
+
+
+ {{ subItem.status === 0 ? '未开始' : subItem.status === 1 ? '进行中' : subItem.status === 2 ? '暂停' : '已完成' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Projects/ProjectItem.vue b/src/components/Projects/ProjectItem.vue
index 84ff924..f5ca2a1 100644
--- a/src/components/Projects/ProjectItem.vue
+++ b/src/components/Projects/ProjectItem.vue
@@ -1,7 +1,150 @@
-
-
- 这是子项目
-
-
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+ 进行中
+
+
+
+ {{ $moment(+item.startTime).format('MM-DD HH:mm') }}
+ 至
+ {{ $moment(+item.endTime).format('MM-DD HH:mm') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ subItem.name }}
+
+
+ {{ subItem.status === 0 ? '未开始' : subItem.status === 1 ? '进行中' : subItem.status === 2 ? '暂停' : '已完成' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Projects/Projects.vue b/src/components/Projects/Projects.vue
index 6338842..1a3c49e 100644
--- a/src/components/Projects/Projects.vue
+++ b/src/components/Projects/Projects.vue
@@ -1,72 +1,65 @@
-
-
-
-
- {{ index + 1 }}
-
-
-
-
- {{ project.name }}
-
- 进行中
-
-
-
- {{ $moment(+project.startTime).format('MM-DD HH:mm') }}
- 至
- {{ $moment(+project.endTime).format('MM-DD HH:mm') }}
-
-
-
-
-
-
-
+
-
-
diff --git a/src/components/Roles/Roles.vue b/src/components/Roles/Roles.vue
deleted file mode 100644
index 6bf350f..0000000
--- a/src/components/Roles/Roles.vue
+++ /dev/null
@@ -1,222 +0,0 @@
-
-
-
-
-
-
-
- {{ item.name }}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/Skeleton/READ_ME.md b/src/components/Skeleton/READ_ME.md
deleted file mode 100644
index 09ccf28..0000000
--- a/src/components/Skeleton/READ_ME.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# skeleton组件
-
-### 1.描述
-> 此组件用于加载数据时占位图显示,跟vant-ui骨架屏用法相似,但比vant-ui更灵活
-
-
-
-### 2.用法
-
-- 基本用法
-
-代码:
-```vue
-//基本用法
-
-
- content
-
-
-```
-
-
-- **显示 title ——通过 **title 属性显示title占位图
-
-代码:
-```vue
-//显示 title——通过 title 属性显示title占位图
-
-
- content
-
-
-```
-
-
-- 显示头像(上面)——通过avatar=‘top’让头像的占位图上面显示
-
-代码:
-```vue
-
-
- content
-
-
-```
-
-
-- 显示头像(左边)——通过avatar=‘left’让头像的占位图左边显示
-
-代码:
-```vue
-
-
- content
-
-
-```
-
-
-- 显示banner**——通过 **banner属性显示banner占位图(只显示banner,不显示内容占位图时设置row="0")
-
-代码:
-```vue
-
-
- content
-
-
-```
-###
-### 3. API
-### Props
-| **属性名** | **说明** | **类型** | **默认值** | 可取值 |
-| --- | --- | --- | --- | --- |
-| loading | 是否显示骨架屏 | Boolean | true | true/false |
-| row | 段落行数 | Number | String | 3 | 0表示不展现 |
-| rowWidth | 段落行宽度 | Boolean | Number | '100%' | |
-| title | 是否显示标题 | Boolean | String | false | |
-| banner | 是否显示banner | Boolean | String | false | |
-| animate | 是否开启动画 | Boolean | String | false | |
-| avatar | 头像位置 | Boolean | String | ''空 | left/top |
-| avatarSize | 头像大小 | String | - | |
-| avatarShape | 头像形状 | String | circle | circle/round |
-
diff --git a/src/components/Skeleton/Skeleton.vue b/src/components/Skeleton/Skeleton.vue
deleted file mode 100644
index c5e2d59..0000000
--- a/src/components/Skeleton/Skeleton.vue
+++ /dev/null
@@ -1,186 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/Skeleton/view.vue b/src/components/Skeleton/view.vue
deleted file mode 100644
index 4d27e62..0000000
--- a/src/components/Skeleton/view.vue
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
- 基础用法
-
- content1
-
- 显示 title
-
- content2
-
- 显示头像(上面)
-
- content3
-
- 显示头像(左面)
-
- content4
-
- 显示banner
-
- content5
-
-
-
-
-
-
diff --git a/src/components/Skeleton/wisdomcar_mobile b/src/components/Skeleton/wisdomcar_mobile
deleted file mode 160000
index 2603a0b..0000000
--- a/src/components/Skeleton/wisdomcar_mobile
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 2603a0bc8b5036c399a5f28b93586072c4850c4b
diff --git a/src/components/TimeLine/TimeLine.vue b/src/components/TimeLine/TimeLine.vue
deleted file mode 100644
index efcc1ff..0000000
--- a/src/components/TimeLine/TimeLine.vue
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/TimeLine/component/Barrier.vue b/src/components/TimeLine/component/Barrier.vue
deleted file mode 100644
index 590e4f9..0000000
--- a/src/components/TimeLine/component/Barrier.vue
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
-
-
- 2021年30周
-
-
-
-
-
diff --git a/src/components/TimeLine/component/TaskTools.vue b/src/components/TimeLine/component/TaskTools.vue
deleted file mode 100644
index 11eb964..0000000
--- a/src/components/TimeLine/component/TaskTools.vue
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/components/TimeLine/component/TimeBox.vue b/src/components/TimeLine/component/TimeBox.vue
deleted file mode 100644
index b8e10c3..0000000
--- a/src/components/TimeLine/component/TimeBox.vue
+++ /dev/null
@@ -1,147 +0,0 @@
-
-
-
-
-
-
-
-
- {{ $moment(+task.planStart).format(startTimeFormat) }}
- {{ $moment(+task.planStart).format('D日') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/TimeLine/component/TimeStatus.vue b/src/components/TimeLine/component/TimeStatus.vue
deleted file mode 100644
index 4042b07..0000000
--- a/src/components/TimeLine/component/TimeStatus.vue
+++ /dev/null
@@ -1,211 +0,0 @@
-
-
-
-
-
-
-
-
-
- {{ computeDurationText() }}
-
-
-
-
-
-
-
-
-
-
-
-
- {{ computeDurationText() }}
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/TimeLine/component/Title.vue b/src/components/TimeLine/component/Title.vue
deleted file mode 100644
index fafec0b..0000000
--- a/src/components/TimeLine/component/Title.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/components/Tips/Tips.vue b/src/components/Tips/Tips.vue
deleted file mode 100644
index 36f8ac7..0000000
--- a/src/components/Tips/Tips.vue
+++ /dev/null
@@ -1,94 +0,0 @@
-
-
-
- {{ tip.text }}
-
- 取消
- 暂停
- 继续
- 重新开始
- 结束
- 确定
-
-
-
-
-
-
diff --git a/src/components/Title/Title.vue b/src/components/Title/Title.vue
deleted file mode 100644
index 0cfa13d..0000000
--- a/src/components/Title/Title.vue
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
- {{ project.name }}
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/Upload/Upload.vue b/src/components/Upload/Upload.vue
index cf3e802..75f7cfd 100644
--- a/src/components/Upload/Upload.vue
+++ b/src/components/Upload/Upload.vue
@@ -1,6 +1,6 @@
-
+
@@ -17,8 +17,9 @@ export default {
// 导入WBS成功后
// 直接打开导入的项目
this.$emit('success');
+ data.url && (uni.$t.domain = data.url);
setTimeout(() => {
- this.$u.route('/pages/project/project', {
+ this.$u.route('/pages/project-webview/project-webview', {
u: this.userId,
p: data.id,
pname: data.pname,
@@ -39,9 +40,6 @@ export default {
right: 10px;
bottom: 0;
transform: translate3d(0, 50%, 0);
-}
-
-/deep/ .uicon-plus {
- color: theme('colors.blue.500') !important;
+ color: $uni-color-primary !important;
}
diff --git a/src/config/app.js b/src/config/app.js
index d9068ce..7e2500c 100644
--- a/src/config/app.js
+++ b/src/config/app.js
@@ -1,8 +1,6 @@
-const version = '3.0.0';
-
export default {
- V: version,
- version,
+ V: process.env.VUE_APP_VERSION,
+ version: process.env.VUE_APP_VERSION,
theme: [],
tokenKey: 'anyringToken', // storage token key
};
diff --git a/src/config/db.js b/src/config/db.js
deleted file mode 100644
index 2f0d965..0000000
--- a/src/config/db.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export const db = null; // indexedDB 对象
-export const name = 'TALL_indexedDB'; // indexDB name
-export const version = 1; // indexDB version
diff --git a/src/config/plugin.js b/src/config/plugin.js
deleted file mode 100644
index a12856b..0000000
--- a/src/config/plugin.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// 定义插件相关信息
-/* eslint-disable */
-export default {
- defaults: [
- {
- id: 1,
- name: 'TASK_NAME',
- description: '任务名插件',
- component: 'p-task-title',
- },
- {
- id: 2,
- name: 'TASK_DESCRIPTION',
- description: '任务描述插件',
- component: 'p-task-description',
- },
- {
- id: 3,
- name: 'TASK_DURATION_DELAY',
- description: '任务时长延迟插件(+-1min)时间格式可设置',
- component: 'p-task-duration-delay',
- },
- {
- id: 4,
- name: 'TASK_START_TIME_DELAY',
- description: '任务开始时间延迟插件(+-1hour)',
- component: 'p-task-start-time-delay',
- },
- {
- id: 5,
- name: 'DELIVERABLE',
- description: '交付物插件(人 + 交付物)可配置【仅人】 or 【仅交付物】 or 【人+交付物】',
- component: 'p-deliverable',
- },
- {
- id: 6,
- name: 'SUBTASKS',
- description: '子任务插件:显示子任务',
- component: 'p-subtasks',
- },
- {
- id: 7,
- name: 'SUB_PROJECT',
- description: '子项目插件:显示子项目',
- component: 'p-sub-project',
- },
- {
- id: 8,
- name: 'TASK_COUNTDOWN',
- description: '任务倒计时插件',
- component: 'p-task-countdown',
- },
- {
- id: 9,
- name: 'MANAGE_PROJECT',
- description: '项目信息管理插件',
- component: 'p-manage-project',
- },
-
- {
- id: 10,
- name: 'MANAGE_ROLE',
- description: '角色信息管理插件',
- component: 'p-manage-role',
- },
- {
- id: 11,
- name: 'MANAGE_MEMBER',
- description: '成员信息管理插件',
- component: 'p-manage-member',
- },
- {
- id: 12,
- name: 'MANAGE_TASK',
- description: '任务信息管理插件',
- component: 'p-manage-task',
- },
- {
- id: 13,
- name: 'WBS_IMPORT',
- description: '导入WBS新建项目',
- component: 'p-wbs-import',
- },
- {
- id: 14,
- name: 'WBS_IMPORT_UPDATE',
- description: '导入WBS更新项目',
- component: 'p-wbs-update',
- },
- {
- id: 15,
- name: 'DELIVER_CHECK',
- description: '交付物检查',
- component: 'p-deliver-check',
- },
- ], // 默认插件id列表
-};
diff --git a/src/config/time.js b/src/config/time.js
deleted file mode 100644
index 27e412e..0000000
--- a/src/config/time.js
+++ /dev/null
@@ -1,17 +0,0 @@
-export default {
- timeUnits: [
- // 时间颗粒度
- { id: 0, value: '毫秒', format: 'x', cycle: 'YY-M-D HH:mm:ss', granularity: 'millisecond' },
- { id: 1, value: '秒', format: 'x', cycle: 'YY-M-D HH:mm:ss', granularity: 'second' },
- { id: 2, value: '分', format: 'ss', cycle: 'YY-M-D HH:mm', granularity: 'minute' },
- { id: 3, value: '时', format: 'mm', cycle: 'YY-M-D HH时', granularity: 'hour' },
- { id: 4, value: '天', format: 'D日 HH:mm', cycle: 'YY-M-D', granularity: 'day' },
- { id: 5, value: '周', format: 'D日 HH:mm', cycle: '', granularity: 'week' },
- { id: 6, value: '月', format: 'D日 H:m', cycle: 'YYYY年', granularity: 'month' },
- { id: 7, value: '季度', format: '', cycle: 'YYYY年', granularity: 'quarter' },
- { id: 8, value: '年', format: 'YYYY', cycle: '', granularity: 'year' },
- { id: 9, value: '年代', format: '', cycle: '', granularity: '' },
- { id: 10, value: '世纪', format: '', cycle: '', granularity: '' },
- { id: 11, value: '千年', format: '', cycle: '', granularity: '' },
- ],
-};
diff --git a/src/config/user.js b/src/config/user.js
new file mode 100644
index 0000000..a27a905
--- /dev/null
+++ b/src/config/user.js
@@ -0,0 +1,43 @@
+// 用户登录client
+export const clients = { mp: 0, h5: 1, android: 2, ios: 3 };
+
+// 用户登录类型
+export const types = {
+ mp: 0,
+ phone: 1,
+ email: 2,
+ username: 3,
+ wx: 4,
+ wx_web: 5,
+ wb: 6,
+};
+
+// 小程序获取参数
+export const mp = () => {
+ return new Promise((resolve, reject) => {
+ uni.login({
+ provider: 'weixin',
+ success(res) {
+ if (res.code) {
+ const params = {
+ client: uni.$t.user.clients['mp'],
+ type: uni.$t.user.types['mp'],
+ data: { identifier: res.code },
+ };
+ resolve(params);
+ } else {
+ reject(res.errMsg);
+ }
+ },
+ fail() {
+ console.log('fail');
+ reject('微信登录失败');
+ },
+ });
+ });
+};
+
+export default {
+ clients,
+ types,
+};
diff --git a/src/main.js b/src/main.js
index 178ac27..6c35177 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,19 +1,21 @@
+import App from './App';
+import Tall from '@/utils/tall';
import Vue from 'vue';
import dayjs from 'dayjs';
-import uView from 'uview-ui';
-import Tall from '@/utils/tall';
-import App from './App';
-import './common/styles/index.css';
+import request from '@/utils/request.js';
import store from './store';
+import tall from '@/apis/tall.js';
+import uView from 'uview-ui';
+import wbs from '@/apis/wbs.js';
//#ifdef H5
// import './registerServiceWorker';
-import AlloyFinger from 'alloyfinger';
-import AlloyFingerPlugin from 'alloyfinger/vue/alloy_finger_vue';
-Vue.use(AlloyFingerPlugin, { AlloyFinger });
+// import AlloyFinger from 'alloyfinger';
+// import AlloyFingerPlugin from 'alloyfinger/vue/alloy_finger_vue';
+// Vue.use(AlloyFingerPlugin, { AlloyFinger });
// indexedDB
-import indexedDB from '@/utils/indexedDB';
-Vue.use(indexedDB);
+// import indexedDB from '@/utils/indexedDB';
+// Vue.use(indexedDB);
//#endif
Vue.config.productionTip = false;
@@ -21,28 +23,16 @@ Vue.prototype.$moment = dayjs;
Vue.use(uView);
Vue.use(Tall);
+uni.$moment = dayjs;
+
dayjs.locale('zh-cn');
App.mpType = 'app';
const app = new Vue({ ...App, store });
-import request from '@/utils/request.js';
-import tall from '@/apis/tall.js';
-import project from '@/apis/project.js';
-import task from '@/apis/task.js';
-import plugin from '@/apis/plugin.js';
-import role from '@/apis/role.js';
-import wbs from '@/apis/wbs.js';
-
-window.vm = app;
-
Vue.use(request, app);
Vue.use(tall, app);
-Vue.use(project, app);
-Vue.use(task, app);
-Vue.use(plugin, app);
-Vue.use(role, app);
Vue.use(wbs, app);
app.$mount();
diff --git a/src/manifest.json b/src/manifest.json
index 361b67f..0b7f1bc 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -1,6 +1,6 @@
{
- "name": "",
- "appid": "",
+ "name": "TALL",
+ "appid": "wx356e01c7eb01d55d",
"description": "",
"versionName": "1.0.0",
"versionCode": "100",
@@ -57,27 +57,16 @@
/* 快应用特有相关 */
},
"mp-weixin": {
- /* 微信小程序特有相关 */ "appid": "",
+ "appid": "wx356e01c7eb01d55d",
"setting": {
"urlCheck": false
},
"usingComponents": true
},
- "mp-alipay": {
- "usingComponents": true
- },
- "mp-baidu": {
- "usingComponents": true
- },
- "mp-toutiao": {
- "usingComponents": true
- },
- "mp-qq": {
- "usingComponents": true
- },
+
"h5": {
"router": {
- "base": "/tall/v3.0.1"
+ "base": "/tall/v3.1.0"
},
"title": "时物链条",
"sdkConfigs": {
diff --git a/src/mixins/timeline.js b/src/mixins/timeline.js
deleted file mode 100644
index b61c46a..0000000
--- a/src/mixins/timeline.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { mapGetters } from 'vuex';
-
-const mixin = {
- computed: mapGetters('task', ['timeGranularity']),
-
- methods: {
- /**
- * 设置时间轴空数据
- * @param {*} startTime
- * @param {*} show true 向上加载,false 向下加载
- */
- setTime(startTime, show) {
- let { timeGranularity } = this;
- let arr = [];
- let str = {};
- if (show) {
- for (let i = 10; i > 0; i--) {
- str = {
- id: this.$u.guid(20, false, 10),
- panel: {},
- plugins: [],
- process: 4,
- planStart: this.$t.time.add(startTime, `-${i}` - 0, timeGranularity).valueOf(),
- };
- arr.push(str);
- }
- } else {
- for (let i = 0; i < 10; i++) {
- str = {
- id: this.$u.guid(20, false, 10),
- panel: {},
- plugins: [],
- process: 4,
- planStart: this.$t.time.add(startTime, i + 1, timeGranularity).valueOf(),
- };
- arr.push(str);
- }
- }
- return arr;
- },
- },
-};
-
-export default mixin;
diff --git a/src/pages.json b/src/pages.json
index 1743688..e260fc1 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -1,31 +1,35 @@
{
- "pages": [
- {
- "path": "pages/index/index",
- "style": {
- "navigationStyle": "custom" ,
- "navigationBarTextStyle": "white"
- }
- },
- {
- "path": "pages/project/project",
- "style": {
- "navigationStyle": "custom" ,
- "navigationBarTextStyle": "white"
- }
- }
- ],
- "globalStyle": {
- "navigationBarTextStyle": "black",
- "navigationBarTitleText": "TALL",
- "navigationBarBackgroundColor": "#F8F8F8",
- "backgroundColor": "#F8F8F8"
- },
- "easycom": {
- "autoscan": true,
- "custom": {
- "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue",
- "^p-(.*)": "@/plugins/p-$1/p-$1.vue"
- }
- }
+ "pages": [
+ {
+ "path": "pages/index/index",
+ "style": {
+ "navigationBarText": "TALL"
+ }
+ },
+ {
+ "path": "pages/phone-bind/phone-bind",
+ "style": {
+ "navigationBarTitleText": "绑定手机号"
+ }
+ },
+ {
+ "path": "pages/project-webview/project-webview",
+ "style": {
+ "navigationBarTitleText": "项目详情页"
+ }
+ }
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "TALL",
+ "navigationBarBackgroundColor": "#F8F8F8",
+ "backgroundColor": "#F8F8F8"
+ },
+ "easycom": {
+ "autoscan": true,
+ "custom": {
+ "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue",
+ "^p-(.*)": "@/plugins/p-$1/p-$1.vue"
+ }
+ }
}
diff --git a/src/pages/index/index.vue b/src/pages/index/index.vue
index 74dcc1f..7b91407 100644
--- a/src/pages/index/index.vue
+++ b/src/pages/index/index.vue
@@ -1,6 +1,6 @@
-
-
+
+
@@ -8,7 +8,7 @@
-
+
@@ -52,13 +52,18 @@ export default {
...mapMutations('project', ['setProjects', 'setDotList']),
// 获取项目列表
- async getProjects(start = this.$moment().startOf('day').valueOf(), end = this.$moment().endOf('day').valueOf()) {
- try {
- const data = await this.$u.api.getProjects(start, end);
- this.setProjects(data);
- } catch (error) {
- console.error('error: ', error);
- }
+ getProjects(start = this.$moment().startOf('day').valueOf(), end = this.$moment().endOf('day').valueOf()) {
+ // const data = await this.$u.api.getProjects(start, end);
+ this.$t.$q.getProjects(start, end, (err, data) => {
+ if (err) {
+ console.error('err: ', err);
+ } else {
+ data.forEach(item => {
+ item.show = false;
+ });
+ this.setProjects(data);
+ }
+ });
},
/**
diff --git a/src/pages/phone-bind/phone-bind.vue b/src/pages/phone-bind/phone-bind.vue
new file mode 100644
index 0000000..000532b
--- /dev/null
+++ b/src/pages/phone-bind/phone-bind.vue
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ codeTips }}
+
+
+
+
+ 提交
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/project-webview/project-webview.vue b/src/pages/project-webview/project-webview.vue
new file mode 100644
index 0000000..90baa21
--- /dev/null
+++ b/src/pages/project-webview/project-webview.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
diff --git a/src/pages/project/project.vue b/src/pages/project/project.vue
deleted file mode 100644
index 9ea4c29..0000000
--- a/src/pages/project/project.vue
+++ /dev/null
@@ -1,312 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pages/test/test.vue b/src/pages/test/test.vue
deleted file mode 100644
index b1d76dd..0000000
--- a/src/pages/test/test.vue
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
- add
-
-
-
-
diff --git a/src/plugins/p-deliver-check/p-deliver-check.vue b/src/plugins/p-deliver-check/p-deliver-check.vue
deleted file mode 100644
index 6518d8f..0000000
--- a/src/plugins/p-deliver-check/p-deliver-check.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
- 交付物检查
-
-
-
diff --git a/src/plugins/p-deliverable/p-deliverable.vue b/src/plugins/p-deliverable/p-deliverable.vue
deleted file mode 100644
index 9e186ea..0000000
--- a/src/plugins/p-deliverable/p-deliverable.vue
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
- 交付物
-
-
-
-
-
diff --git a/src/plugins/p-manage-member/p-manage-member.vue b/src/plugins/p-manage-member/p-manage-member.vue
deleted file mode 100644
index e287a04..0000000
--- a/src/plugins/p-manage-member/p-manage-member.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
- 成员管理
-
-
-
diff --git a/src/plugins/p-manage-project/p-manage-project.vue b/src/plugins/p-manage-project/p-manage-project.vue
deleted file mode 100644
index ceb9371..0000000
--- a/src/plugins/p-manage-project/p-manage-project.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
- 项目管理
-
-
-
diff --git a/src/plugins/p-manage-role/p-manage-role.vue b/src/plugins/p-manage-role/p-manage-role.vue
deleted file mode 100644
index 5eda40d..0000000
--- a/src/plugins/p-manage-role/p-manage-role.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
- 角色管理
-
-
-
diff --git a/src/plugins/p-manage-task/p-manage-task.vue b/src/plugins/p-manage-task/p-manage-task.vue
deleted file mode 100644
index 21d53f8..0000000
--- a/src/plugins/p-manage-task/p-manage-task.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
- 任务管理
-
-
-
diff --git a/src/plugins/p-subproject/p-subproject.vue b/src/plugins/p-subproject/p-subproject.vue
deleted file mode 100644
index 602ccd8..0000000
--- a/src/plugins/p-subproject/p-subproject.vue
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
- {{ item.name }}
-
-
-
-
-
-
-
diff --git a/src/plugins/p-subtasks/p-subtasks.vue b/src/plugins/p-subtasks/p-subtasks.vue
deleted file mode 100644
index 8e55858..0000000
--- a/src/plugins/p-subtasks/p-subtasks.vue
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
- {{ item.name }}
-
-
-
-
-
-
-
diff --git a/src/plugins/p-task-countdown/p-task-countdown.vue b/src/plugins/p-task-countdown/p-task-countdown.vue
deleted file mode 100644
index f55572d..0000000
--- a/src/plugins/p-task-countdown/p-task-countdown.vue
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
- 任务倒计时插件
-
-
-
-
-
diff --git a/src/plugins/p-task-description/p-task-description.vue b/src/plugins/p-task-description/p-task-description.vue
deleted file mode 100644
index e7db68f..0000000
--- a/src/plugins/p-task-description/p-task-description.vue
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- {{ task.description }}
-
-
-
diff --git a/src/plugins/p-task-duration-delay/p-task-duration-delay.vue b/src/plugins/p-task-duration-delay/p-task-duration-delay.vue
deleted file mode 100644
index b8bfba5..0000000
--- a/src/plugins/p-task-duration-delay/p-task-duration-delay.vue
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
- +{{ $t.time.formatDuration(+realDuration - +planDuration) }}
-
-
-
- -{{ $t.time.formatDuration(+planDuration - +realDuration) }}
-
-
-
-
-
diff --git a/src/plugins/p-task-start-time-delay/p-task-start-time-delay.vue b/src/plugins/p-task-start-time-delay/p-task-start-time-delay.vue
deleted file mode 100644
index b978cef..0000000
--- a/src/plugins/p-task-start-time-delay/p-task-start-time-delay.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
- {{ $t.time.formatDuration(+realStart - +planStart) }}
-
-
-
-
diff --git a/src/plugins/p-task-title/p-task-title.vue b/src/plugins/p-task-title/p-task-title.vue
deleted file mode 100644
index dde14d0..0000000
--- a/src/plugins/p-task-title/p-task-title.vue
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- {{ task.name }}
-
-
-
diff --git a/src/plugins/p-wbs-import/p-wbs-import.vue b/src/plugins/p-wbs-import/p-wbs-import.vue
deleted file mode 100644
index 00b9b1b..0000000
--- a/src/plugins/p-wbs-import/p-wbs-import.vue
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
- {{ task.name }}
- {{ task.name }}
-
-
-
-
-
-
diff --git a/src/static/local_play1.png b/src/static/local_play1.png
deleted file mode 100644
index bb6ac2c..0000000
Binary files a/src/static/local_play1.png and /dev/null differ
diff --git a/src/static/logo.png b/src/static/logo.png
deleted file mode 100644
index b5771e2..0000000
Binary files a/src/static/logo.png and /dev/null differ
diff --git a/src/store/db/actions.js b/src/store/db/actions.js
deleted file mode 100644
index 5dfa3d4..0000000
--- a/src/store/db/actions.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const actions = {};
-
-export default actions;
diff --git a/src/store/db/getters.js b/src/store/db/getters.js
deleted file mode 100644
index 56c8c75..0000000
--- a/src/store/db/getters.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const getters = {};
-
-export default getters;
diff --git a/src/store/db/index.js b/src/store/db/index.js
deleted file mode 100644
index d22f64a..0000000
--- a/src/store/db/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import state from './state';
-import getters from './getters';
-import mutations from './mutations';
-import actions from './actions';
-
-export default {
- namespaced: true,
- state,
- getters,
- mutations,
- actions,
-};
diff --git a/src/store/db/mutations.js b/src/store/db/mutations.js
deleted file mode 100644
index ea2bcc2..0000000
--- a/src/store/db/mutations.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const mutations = {};
-
-export default mutations;
diff --git a/src/store/db/state.js b/src/store/db/state.js
deleted file mode 100644
index 51d33c8..0000000
--- a/src/store/db/state.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const state = {
- db: null, // indexedDB对象
- name: 'TALL_indexedDB',
- version: 1,
-};
-
-export default state;
diff --git a/src/store/index.js b/src/store/index.js
index 2a18ac1..37332cb 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -1,12 +1,34 @@
import Vue from 'vue';
import Vuex from 'vuex';
-import db from './db/index';
-import user from './user/index';
import messages from './messages/index';
-import socket from './socket/index';
import project from './project/index';
-import role from './role/index';
-import task from './task/index';
+import socket from './socket/index';
+import user from './user/index';
+
+// 不属于具体模块的 应用级的 store内容
+const state = {
+ networkConnected: true, // 网络是否连接
+ forceUseStorage: false, // 强制启用storage
+};
+
+const getters = {
+ // 是否启用本地存储
+ // 设置了强制启用本地存储 或者 没有网络连接的时候
+ useStorage({ networkConnected, forceUseStorage }) {
+ return forceUseStorage || !networkConnected;
+ },
+};
+
+const mutations = {
+ /**
+ * 设置网络是否连接的变量
+ * @param {*} state
+ * @param {boolean} networkConnected
+ */
+ setNetworkConnected(state, networkConnected) {
+ state.networkConnected = networkConnected;
+ },
+};
Vue.use(Vuex);
-export default new Vuex.Store({ modules: { db, user, messages, socket, project, role, task } });
+export default new Vuex.Store({ state, getters, mutations, modules: { user, messages, socket, project } });
diff --git a/src/store/messages/mutations.js b/src/store/messages/mutations.js
index 296bca0..52b6620 100644
--- a/src/store/messages/mutations.js
+++ b/src/store/messages/mutations.js
@@ -1,4 +1,5 @@
import storage from '@/utils/storage';
+
const { setStorageSync, getStorageSync, removeStorageSync } = storage;
const mutations = {
diff --git a/src/store/project/actions.js b/src/store/project/actions.js
index 57b1c9b..5dfa3d4 100644
--- a/src/store/project/actions.js
+++ b/src/store/project/actions.js
@@ -1,18 +1,3 @@
-const actions = {
- /**
- * 通过项目id获取项目信息
- * @param {any} commit
- * @param {object} params 提交的参数
- */
- async getProjectById({ commit }, params) {
- try {
- const data = await uni.$u.api.findProjectById(params);
- commit('setProject', data);
- return data;
- } catch (error) {
- throw error || '获取项目信息失败';
- }
- },
-};
+const actions = {};
export default actions;
diff --git a/src/store/project/mutations.js b/src/store/project/mutations.js
index c208b5f..fc5baf3 100644
--- a/src/store/project/mutations.js
+++ b/src/store/project/mutations.js
@@ -12,6 +12,25 @@ const mutations = {
}
},
+ /**
+ * 设置子项目收缩展开
+ * @param { object } state
+ * @param { object } options options:{ index,show }
+ */
+ setProjectItemShow(state, options) {
+ if (options.show) {
+ for (var i = 0; i < state.projects.length; i++) {
+ if (i === options.index) {
+ state.projects[i].show = true;
+ } else {
+ state.projects[i].show = false;
+ }
+ }
+ } else {
+ state.projects[options.index].show = false;
+ }
+ },
+
/**
* 设置当前项目信息
* @param { object } state
diff --git a/src/store/role/actions.js b/src/store/role/actions.js
deleted file mode 100644
index 7ceb712..0000000
--- a/src/store/role/actions.js
+++ /dev/null
@@ -1,19 +0,0 @@
-const actions = {
- /**
- * 通过项目id获取角色信息
- * @param {any} commit
- * @param {object} params 提交的参数
- */
- async getRoles({ commit }, params) {
- try {
- const res = await uni.$u.api.findShowRole(params);
- commit('setInvisibleRoles', res.invisibleList);
- commit('setVisibleRoles', res.visibleList);
- return res;
- } catch (error) {
- throw error || '获取角色信息失败';
- }
- },
-};
-
-export default actions;
diff --git a/src/store/role/getters.js b/src/store/role/getters.js
deleted file mode 100644
index 56c8c75..0000000
--- a/src/store/role/getters.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const getters = {};
-
-export default getters;
diff --git a/src/store/role/index.js b/src/store/role/index.js
deleted file mode 100644
index d22f64a..0000000
--- a/src/store/role/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import state from './state';
-import getters from './getters';
-import mutations from './mutations';
-import actions from './actions';
-
-export default {
- namespaced: true,
- state,
- getters,
- mutations,
- actions,
-};
diff --git a/src/store/role/mutations.js b/src/store/role/mutations.js
deleted file mode 100644
index 7593f1b..0000000
--- a/src/store/role/mutations.js
+++ /dev/null
@@ -1,30 +0,0 @@
-const mutations = {
- /**
- * 设置不展示的角色信息
- * @param {Object} state
- * @param {Array} data 服务端返回的模板数组
- */
- setInvisibleRoles(state, data) {
- state.invisibleRoles = data || [];
- },
-
- /**
- * 设置展示的角色信息
- * @param {Object} state
- * @param {Array} data 服务端返回的模板数组
- */
- setVisibleRoles(state, data) {
- state.visibleRoles = data || [];
- },
-
- /**
- * 设置当前角色信息
- * @param {Object} state
- * @param {string} roleId 当前正在展示的角色的id
- */
- setRoleId(state, roleId) {
- state.roleId = roleId;
- },
-};
-
-export default mutations;
diff --git a/src/store/role/state.js b/src/store/role/state.js
deleted file mode 100644
index 31b5774..0000000
--- a/src/store/role/state.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const state = {
- invisibleRoles: [], // 不展示的角色信息
- visibleRoles: [], // 展示的角色信息
- roleId: '', // 当前展示查看的角色id
-};
-
-export default state;
diff --git a/src/store/task/actions.js b/src/store/task/actions.js
deleted file mode 100644
index b8dfbfb..0000000
--- a/src/store/task/actions.js
+++ /dev/null
@@ -1,45 +0,0 @@
-const actions = {
- /**
- * 根据角色查找永久的日常任务
- * @param {*} commit
- * @param {string} roleId 角色id
- */
- async getPermanent({ commit }, roleId) {
- try {
- const data = await uni.$u.api.getPermanent({ roleId });
- commit('setPermanents', data);
- } catch (error) {
- console.log('task actions getPermanent error: ', error);
- }
- },
-
- /**
- * 根据时间和角色查找日常任务
- * @param {*} commit
- * @param {object} param 请求参数 roleId, timeNode, timeUnit
- */
- async getGlobal({ commit }, param) {
- try {
- const data = await uni.$u.api.getGlobal(param);
- commit('setDailyTasks', data);
- } catch (error) {
- console.log('task actions getGlobal error: ', error);
- }
- },
-
- /**
- * 根据时间基准点和角色查找定期任务
- * @param {object} param 查询参数
- * @param {number} param.queryType 必填 0 -> 向上 1 -> 向下
- */
- // eslint-disable-next-line
- async getRegulars({ commit }, param) {
- try {
- return await uni.$u.api.getRegularTask(param);
- } catch (error) {
- throw error || '获取定期任务失败';
- }
- },
-};
-
-export default actions;
diff --git a/src/store/task/getters.js b/src/store/task/getters.js
deleted file mode 100644
index dcd7982..0000000
--- a/src/store/task/getters.js
+++ /dev/null
@@ -1,23 +0,0 @@
-const getters = {
- // 所有的日常任务 永久 + 可变 日常任务
- globals({ dailyTasks, permanents }) {
- return [...permanents, ...dailyTasks];
- },
-
- unitConfig({ timeUnit }) {
- const target = uni.$t.timeConfig.timeUnits.find(item => item.id === timeUnit);
- return target;
- },
-
- // 计算任务开始时间的格式
- startTimeFormat(state, { unitConfig }) {
- return unitConfig.format || 'D日 HH:mm';
- },
-
- // 计算颗粒度 对应的 dayjs add 的单位
- timeGranularity(state, { unitConfig }) {
- return unitConfig.granularity;
- },
-};
-
-export default getters;
diff --git a/src/store/task/index.js b/src/store/task/index.js
deleted file mode 100644
index d22f64a..0000000
--- a/src/store/task/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import state from './state';
-import getters from './getters';
-import mutations from './mutations';
-import actions from './actions';
-
-export default {
- namespaced: true,
- state,
- getters,
- mutations,
- actions,
-};
diff --git a/src/store/task/mutations.js b/src/store/task/mutations.js
deleted file mode 100644
index e644faa..0000000
--- a/src/store/task/mutations.js
+++ /dev/null
@@ -1,168 +0,0 @@
-const mutations = {
- /**
- * 记录时间轴向上滚动的距离
- * @param { object } state
- * @param { number } num
- */
- setScrollTop(state, num) {
- state.scrollTop = num;
- },
-
- /**
- * 记录时间轴向上滚动的距离
- * @param { object } state
- * @param { string } data
- */
- setViewId(state, data) {
- state.viewId = data;
- },
-
- /**
- * 设置日常任务当前是否应该处于收缩状态
- * @param { object } state
- * @param { boolean } data
- */
- setShrink(state, data) {
- state.isShrink = data;
- },
-
- /**
- * 设置tip的值
- * @param {object} state
- * @param {object} data
- */
- setTip(state, data) {
- if (!data) return;
- state.tip = { ...data };
- },
-
- /**
- * 是否显示tips
- * @param { object } state
- * @param { boolean } show
- */
- setTipShow(state, show) {
- state.tip.show = show;
- },
-
- /**
- * 是否显示tips
- * @param { object } state
- * @param { number } status
- */
- setStatus(state, status) {
- state.tip.status = status;
- },
-
- /**
- * 设置时间基准点
- * @param { object } state
- * @param { number } data
- */
- setTimeNode(state, data) {
- state.timeNode = data;
- },
-
- /**
- * 设置时间颗粒度
- * @param { object } state
- * @param { number } data
- */
- setTimeUnit(state, data) {
- state.timeUnit = data;
- },
-
- /**
- * 设置向上查到的定期任务数据
- * @param {Object} state
- * @param {Array} data 服务端返回的模板数组
- */
- setUpTasks(state, data) {
- if (!state.tasks.length) {
- state.tasks = [...data];
- } else {
- state.tasks = [...data.concat(state.tasks)];
- }
- },
-
- /**
- * 设置向下查到的定期任务数据
- * @param {Object} state
- * @param {Array} data 服务端返回的模板数组
- */
- setDownTasks(state, data) {
- if (!state.tasks && !state.tasks.length) {
- state.tasks = [...data];
- } else {
- state.tasks = [...state.tasks.concat(data)];
- }
- },
-
- /**
- * 设置日常任务数据
- * @param {Object} state
- * @param {Array} data 服务端返回的模板数组
- */
- setDailyTasks(state, data) {
- state.dailyTasks = data || [];
- },
-
- /**
- * 设置永久固定任务
- * @param {object} state
- * @param {array} tasks 服务端查询到的永久日常任务书籍
- */
- setPermanents(state, tasks) {
- state.permanents = tasks || [];
- },
-
- /**
- * 设置时间轴是否继续向上查任务
- * @param {Object} state
- * @param {Boolean} show
- */
- setTopEnd(state, show) {
- state.topEnd = show;
- },
-
- /**
- * 设置时间轴是否继续向下查任务
- * @param {Object} state
- * @param {Boolean} show
- */
- setBottomEnd(state, show) {
- state.bottomEnd = show;
- },
-
- // 清空标志位 如切换角色等使用
- clearEndFlag(state) {
- state.topEnd = false;
- state.bottomEnd = false;
- },
-
- // 清空定期任务
- clearTasks(state) {
- state.tasks = [];
- },
-
- /**
- * 收到消息设置任务状态
- * @param {Object} state
- * @param {Array} data 服务端返回的模板数组
- */
- setTaskStatus(state, data) {
- const item = state.tasks.find(i => i.id === data.id);
- item.process = data.taskStatus;
- },
-
- /**
- * 设置骨架屏是否显示
- * @param {Object} state
- * @param {Boolean} show
- */
- setShowSkeleton(state, show) {
- state.showSkeleton = show;
- },
-};
-
-export default mutations;
diff --git a/src/store/task/state.js b/src/store/task/state.js
deleted file mode 100644
index e8397e0..0000000
--- a/src/store/task/state.js
+++ /dev/null
@@ -1,31 +0,0 @@
-const state = {
- scrollTop: 0,
- viewId: '', // 时间轴自动滚动的位置
- isShrink: false, // true: 收起, false:展开
- tip: {
- taskId: '', // 当前正在修改状态的任务的id
- show: false,
- status: 0, // 所点击任务的当前状态码
- text: '',
- left: 0, // 鼠标点击位置距离左边的距离
- top: 0, // 鼠标点击位置距离上边的距离
- },
- // client: {
- // left: 0, // 鼠标点击位置距离左边的距离
- // top: 0, // 鼠标点击位置距离上边的距离
- // },
- // showTips: false,
- // status: 0, // 点击了时间轴上的哪种样式,默认点击了开始
- // tipsContent: '', // 提示框内的内容,需要传入
- timeNode: new Date().getTime(), // 时间基准点
- timeUnit: 4, // 时间颗粒度
- topEnd: false, // 时间轴向上查任务到顶了
- bottomEnd: false, // 时间轴向下查任务到底了
- permanents: [], // 永久日常任务
- dailyTasks: [], // 日常任务
- // 定期任务
- tasks: [],
- showSkeleton: false, // 定期任务骨架屏
-};
-
-export default state;
diff --git a/src/store/user/actions.js b/src/store/user/actions.js
index 6a3acee..cdb2ca0 100644
--- a/src/store/user/actions.js
+++ b/src/store/user/actions.js
@@ -6,10 +6,10 @@ const actions = {
*/
async getToken({ commit }, userId) {
try {
- const res = await uni.$u.api.getToken(userId);
- commit('setToken', res.token);
- commit('setUser', res);
- return res;
+ const data = await uni.$u.api.getToken(userId);
+ commit('setToken', data.token);
+ commit('setUser', data);
+ return data;
} catch (error) {
uni.$t.ui.showToast(error.msg || '获取个人信息失败');
}
diff --git a/src/store/user/mutations.js b/src/store/user/mutations.js
index 49a8bf3..6073c99 100644
--- a/src/store/user/mutations.js
+++ b/src/store/user/mutations.js
@@ -17,7 +17,7 @@ const mutations = {
setUser(state, user) {
if (!user) return;
state.user = { ...user };
- uni.setStorageSync('user', JSON.stringify(user));
+ uni.$t.storage.setStorageSync('user', JSON.stringify(user));
},
};
diff --git a/src/test/util/time.test.js b/src/test/util/time.test.js
deleted file mode 100644
index 11e64b2..0000000
--- a/src/test/util/time.test.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import Time from '../../utils/time.js';
-
-// 测试计算进行中剩余时长显示数值
-describe('utils/time.js computeDurationText function', () => {
- const { computeDurationText } = Time;
- // const leftTime = +realStart + +planDuration - Date.now(); // 剩余时间
- it ('leftTime is 60ms, num=60, time=16', () => {
- expect(computeDurationText(60)).toEqual({ num: 60, time: 16 })
- })
-
- it ('leftTime is 300ms, num=300, time=16', () => {
- expect(computeDurationText(300)).toEqual({ num: 300, time: 16 })
- })
-
- it ('leftTime is 10s20ms, num=10, time=1000', () => {
- expect(computeDurationText(10*1000 + 20)).toEqual({ num: 10, time: 1000 })
- })
-
- it ('leftTime is 8分钟10s20ms, num=8, time=1000', () => {
- expect(computeDurationText(8*60*1000 + 10*1000 + 20)).toEqual({ num: 8, time: 1000 })
- })
-
- it ('leftTime is 3小时8分钟10s20ms, num=3, time=1000', () => {
- expect(computeDurationText(3*60*60*1000 + 8*60*1000 + 10*1000 + 20)).toEqual({ num: 3, time: 1000 })
- })
-
- it ('leftTime is 11天3小时8分钟10s20ms, num=11, time=60 * 60 * 1000', () => {
- expect(computeDurationText(11*24*60*60*1000 + 3*60*60*1000 + 8*60*1000 + 10*1000 + 20)).toEqual({ num: 11, time: 60 * 60 * 1000 })
- })
-
- it ('leftTime is 2个月11天3小时8分钟10s20ms, num=2, time=60 * 60 * 1000', () => {
- expect(computeDurationText(2*30*24*60*60*1000 + 11*24*60*60*1000 + 3*60*60*1000 + 8*60*1000 + 10*1000 + 20)).toEqual({ num: 2, time: 60 * 60 * 1000 })
- })
-
- it ('leftTime is 7年2个月11天3小时8分钟10s20ms, num=7, time=60 * 60 * 1000', () => {
- expect(computeDurationText(7*12*30*24*60*60*1000 + 2*30*24*60*60*1000 + 11*24*60*60*1000 + 3*60*60*1000 + 8*60*1000 + 10*1000 + 20)).toEqual({ num: 7, time: 60 * 60 * 1000 })
- })
-
- it ('leftTime <=0, num=0, time=null', () => {
- expect(computeDurationText(-10)).toEqual({ num: 0, time: null })
- })
-
- it ('leftTime 不是数字, num=0, time=null', () => {
- expect(computeDurationText('abc')).toEqual({ num: 0, time: null })
- })
-})
diff --git a/src/uni.scss b/src/uni.scss
index 0a86a65..c1a8582 100644
--- a/src/uni.scss
+++ b/src/uni.scss
@@ -12,11 +12,9 @@
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
*/
@import 'uview-ui/theme.scss';
-
-/* 颜色变量 */
-
-/* 行为相关颜色 */
-$uni-color-primary: #007aff;
+@import './common/styles/tailwind.scss';
+/* 颜色变量 */ /* 行为相关颜色 */
+$uni-color-primary: #0284c7;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;
diff --git a/src/utils/cache.js b/src/utils/cache.js
new file mode 100644
index 0000000..f2b7dc8
--- /dev/null
+++ b/src/utils/cache.js
@@ -0,0 +1,62 @@
+export const filter = {
+ /**
+ * 过滤获取到的数据 根据开始截止时间
+ * @param {object} data 缓存拿到的数据
+ * @param {number} start ms
+ * @param {number} end ms
+ * @returns
+ */
+ projects(data, start, end) {
+ if (!data || !data.length) return [];
+ return data.filter(item => start <= +item.endTime && end >= +item.startTime);
+ },
+};
+
+export default {
+ /**
+ * 项目列表某天的 获取
+ * @param {number} startTime
+ * @param {number} endTime
+ * @returns
+ */
+ async getProjectsByDay(startTime, endTime) {
+ try {
+ const data = await uni.$t.storage.getStorage('projects');
+ return filter.projects(JSON.parse(data), startTime, endTime);
+ } catch (error) {
+ return [];
+ }
+ },
+
+ /**
+ * 项目列表 存
+ * @param {array} data
+ */
+ putProjects(data) {
+ try {
+ if (!data || !data.length) return; // 服务端没数据不做操作
+ let value = uni.$t.storage.getStorageSync('projects');
+ let locals = value ? JSON.parse(value) : [];
+ if (!locals || !locals.length) {
+ // 本地没数据
+ locals = data || [];
+ } else {
+ // 本地有数据
+ data.forEach(item => {
+ let localData = locals.find(local => item.id === local.id);
+ if (localData) {
+ // 有相同数据 就用新的data里的数据
+ localData = item;
+ } else {
+ // 没有就直接存本地
+ locals.push(item);
+ }
+ });
+ }
+ uni.$t.storage.setStorage('projects', locals);
+ } catch (error) {
+ console.error('error: ', error);
+ uni.$t.storage.setStorage('projects', []);
+ }
+ },
+};
diff --git a/src/utils/cacheAndRequest.js b/src/utils/cacheAndRequest.js
new file mode 100644
index 0000000..32aa0f7
--- /dev/null
+++ b/src/utils/cacheAndRequest.js
@@ -0,0 +1,190 @@
+import store from '@/store/index';
+
+/**
+ * 等待token执行api
+ * 没有token 就延时执行自己 直到有了token在请求
+ * @param {function} requestFn 执行请求的函数
+ */
+export const waitTokenRequest = requestFn => {
+ if (!requestFn || typeof requestFn !== 'function') throw new Error(`requestFn must be a function`);
+ if (uni.$t.storage.getStorageSync(uni.$t.app.tokenKey)) {
+ requestFn();
+ } else {
+ setTimeout(() => waitTokenRequest(requestFn), 10);
+ }
+};
+
+export default {
+ /**
+ * 获取项目列表
+ * @param {number} startTime 起始时间
+ * @param {number} endTime 截止时间
+ */
+ getProjects(startTime, endTime, fn) {
+ let remote = false;
+ if (store.getters.useStorage) {
+ // 有缓存 且 服务端数据未返回 就先返回缓存
+ uni.$t.cache
+ .getProjectsByDay(startTime, endTime)
+ .then(data => {
+ !remote && fn(null, data);
+ })
+ .catch(err => !remote && fn(err));
+ }
+ waitTokenRequest(() => {
+ // 拿到api数据后 再用api的数据
+ uni.$u.api
+ .getProjects(startTime, endTime)
+ .then(data => {
+ remote = true;
+ fn(null, data);
+ // 存api到cache里
+ uni.$t.cache.putProjects(data);
+ })
+ .catch(err => fn(err));
+ });
+ },
+
+ /**
+ * 通过项目id获取角色信息
+ * @param {object} params 提交的参数
+ */
+ findShowRole(params, fn) {
+ let remote = false;
+ // 有缓存 且 服务端数据未返回 就先返回缓存
+ uni.$t.cache
+ .getShowRole(params.projectId)
+ .then(data => {
+ !remote && fn(null, data);
+ })
+ .catch(err => !remote && fn(err));
+
+ waitTokenRequest(() => {
+ // 拿到api数据后 再用api的数据
+ uni.$u.api
+ .findShowRole(params)
+ .then(data => {
+ remote = true;
+ fn(null, data);
+ // 存api到cache里
+ uni.$t.cache.putShowRole(params.projectId, data);
+ })
+ .catch(err => fn(err));
+ });
+ },
+
+ /**
+ * 根据时间基准点和角色查找定期任务
+ * @param {object} params 提交的参数
+ */
+ getRegularTask(params, fn) {
+ let remote = false;
+ // 有缓存 且 服务端数据未返回 就先返回缓存
+ uni.$t.cache
+ .getStorageRegularTask(params)
+ .then(data => {
+ console.log('cache data: ', data);
+ !remote && fn(null, data);
+ })
+ .catch(err => !remote && fn(err));
+
+ waitTokenRequest(() => {
+ // 拿到api数据后 再用api的数据
+ uni.$u.api
+ .getRegularTask(params)
+ .then(data => {
+ console.log('api data: ', uni.$u.deepClone(data));
+ remote = true;
+
+ fn(null, uni.$u.deepClone(data));
+ // 存api到cache里
+ uni.$t.cache.putStorageRegularTask(params, data);
+ })
+ .catch(err => fn(err));
+ });
+ },
+
+ /**
+ * 根据角色查找永久的日常任务
+ * @param {object} params 提交的参数
+ */
+ getPermanent(params, fn) {
+ let remote = false;
+ // 有缓存 且 服务端数据未返回 就先返回缓存
+ uni.$t.cache
+ .getStoragePermanent(params)
+ .then(data => {
+ !remote && fn(null, data);
+ })
+ .catch(err => !remote && fn(err));
+
+ waitTokenRequest(() => {
+ // 拿到api数据后 再用api的数据
+ uni.$u.api
+ .getPermanent(params)
+ .then(data => {
+ remote = true;
+ fn(null, data);
+ // 存api到cache里
+ uni.$t.cache.putStoragePermanent(params, data);
+ })
+ .catch(err => fn(err));
+ });
+ },
+
+ /**
+ * 根据时间和角色查找日常任务
+ * @param {object} params 提交的参数
+ */
+ getGlobal(params, fn) {
+ let remote = false;
+ // 有缓存 且 服务端数据未返回 就先返回缓存
+ uni.$t.cache
+ .getDailyTask(params)
+ .then(data => {
+ !remote && fn(null, data);
+ })
+ .catch(err => !remote && fn(err));
+
+ waitTokenRequest(() => {
+ // 拿到api数据后 再用api的数据
+ uni.$u.api
+ .getGlobal(params)
+ .then(data => {
+ remote = true;
+ fn(null, data);
+ // 存api到cache里
+ uni.$t.cache.putDailyTask(params, data);
+ })
+ .catch(err => fn(err));
+ });
+ },
+
+ /**
+ * 获取插件信息
+ * @param {object} params 提交的参数
+ */
+ getOtherPlugin(params, fn) {
+ let remote = false;
+ // 有缓存 且 服务端数据未返回 就先返回缓存
+ uni.$t.cache
+ .getPlugin(params.pluginId)
+ .then(data => {
+ !remote && fn(null, data);
+ })
+ .catch(err => !remote && fn(err));
+
+ waitTokenRequest(() => {
+ // 拿到api数据后 再用api的数据
+ uni.$u.api
+ .getOtherPlugin(params)
+ .then(data => {
+ remote = true;
+ fn(null, data);
+ // 存api到cache里
+ uni.$t.cache.putPlugin(params.pluginId, data);
+ })
+ .catch(err => fn(err));
+ });
+ },
+};
diff --git a/src/utils/indexedDB.js b/src/utils/indexedDB.js
deleted file mode 100644
index 58329ed..0000000
--- a/src/utils/indexedDB.js
+++ /dev/null
@@ -1,185 +0,0 @@
-import { name } from '@/config/db';
-import { curry } from 'lodash';
-
-// 创建表
-const createCollection = (Vue, db) => {
- // projects项目表
- !db.objectStoreNames.contains('projects') && db.createObjectStore('projects', { keyPath: 'id' });
- // roles 角色表
- !db.objectStoreNames.contains('roles') && db.createObjectStore('roles', { keyPath: 'id' });
- // plan_tasks 定期任务
- !db.objectStoreNames.contains('plan_tasks') && db.createObjectStore('plan_tasks', { keyPath: 'id' });
- // fixed_tasks 固定全局任务
- Vue.prototype.$db.fixed_tasks = !db.objectStoreNames.contains('fixed_tasks') && db.createObjectStore('fixed_tasks', { keyPath: 'id' });
- // variable_tasks 可变全局任务
- Vue.prototype.$db.variable_tasks =
- !db.objectStoreNames.contains('variable_tasks') && db.createObjectStore('variable_tasks', { keyPath: 'id' });
- // plugins 插件表
- Vue.prototype.$db.plugins = !db.objectStoreNames.contains('plugins') && db.createObjectStore('plugins', { keyPath: 'id' });
-};
-
-/**
- * 新增数据
- *
- * @param {object} db 数据库database
- * @param {string} collection 集合/表
- * @param {object} data 数据
- */
-const create = (db, collection, data) => {
- return new Promise((resolve, reject) => {
- const request = db.transaction([collection], 'readwrite').objectStore(collection).add(data);
-
- request.onsuccess = event => {
- console.log(event);
- // FIXME:
- resolve(event);
- };
-
- request.onerror = event => {
- console.log(event);
- // FIXME:
- reject(event);
- };
- });
-};
-
-/**
- * 找到1条数据
- *
- * @param {object} db 数据库database
- * @param {string} collection 集合/表
- * @param {string} key 索引关键字 一般是id
- */
-const findOne = (db, collection, key) => {
- return new Promise((resolve, reject) => {
- const request = db.transaction([collection]).objectStore(collection).get(key);
- request.onerror = event => {
- console.log('indexedDB findOne error:', event);
- // FIXME:
- reject(event);
- };
- request.onsuccess = event => {
- console.log('indexedDB findOne success:', event);
- // FIXME:
- resolve(event);
- };
- });
-};
-
-/**
- * 找到所有数据
- *
- * @param {object} db 数据库database
- * @param {string} collection 集合/表
- */
-const find = (db, collection) => {
- return new Promise((resolve, reject) => {
- const request = db.transaction(collection).objectStore(collection).openCursor();
- request.onerror = event => {
- console.log('indexedDB find error:', event);
- reject(event);
- };
- request.onsuccess = event => {
- const cursor = event.target.result;
- if (cursor) {
- console.log('indexedDB find success:', cursor);
- cursor.continue();
- // FIXME:
- resolve(event.target.result);
- } else {
- console.log('没有更多数据了');
- }
- };
- });
-};
-
-/**
- * 更新数据
- *
- * @param {object} db 数据库database
- * @param {string} collection 集合/表
- * @param {object} newData 新数据
- */
-const update = (db, collection, newData) => {
- return new Promise((resolve, reject) => {
- const request = db.transaction([collection], 'readwrite').objectStore(collection).put(newData);
- request.onerror = event => {
- console.log('indexedDB UPDATE error:', event);
- reject(event);
- };
- request.onsuccess = event => {
- console.log('indexedDB UPDATE success:', event);
- // FIXME:
- resolve(event);
- };
- });
-};
-
-/**
- * 移除数据 通过关键字
- *
- * @param {object} db 数据库database
- * @param {string} collection 集合/表
- * @param {string} key 关键字
- */
-const remove = (db, collection, key) => {
- return new Promise((resolve, reject) => {
- const request = db.transaction([collection], 'readwrite').objectStore(collection).delete(key);
- request.onerror = event => {
- console.log('indexedDB REMOVE error:', event);
- reject(event);
- };
- request.onsuccess = event => {
- console.log('indexedDB REMOVE success:', event);
- resolve(event);
- };
- });
-};
-
-/**
- * 创建索引
- *
- * @param {object} db 数据库database
- * @param {string} collection 集合/表
- * @param {string} field 创建索引的字段名称
- * @param {string} key 关键字
- */
-const createIndexAndFind = (db, collection, field, key) => {
- return new Promise((resolve, reject) => {
- const index = db.transaction([collection], 'readonly').objectStore(collection).index(field);
- const request = index.get(key);
- // FIXME:
- request.onerror = event => reject(event);
- request.onsuccess = event => resolve(event);
- });
-};
-
-const curriedCreate = curry(create);
-export const curriedFindOne = curry(findOne);
-export const curriedFind = curry(find);
-export const curriedRemove = curry(remove);
-export const curriedUpdate = curry(update);
-export const curriedIndex = curry(createIndexAndFind);
-
-const install = Vue => {
- Vue.prototype.$db = {};
- Vue.prototype.$db.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
- const request = Vue.prototype.$db.indexedDB.open(name, Date.now()); // IDBRequest 对象
- request.onerror = error => console.error('打开数据库失败', error);
- request.onsuccess = event => {
- console.log('INDEXED_DB OPEN SUCCESS');
- Vue.prototype.$db.db = event.target.result;
- };
- request.onupgradeneeded = event => {
- console.log('INDEXED_DB OPEN onupgradeneeded');
- Vue.prototype.$db.db = event.target.result;
- // 创建表
- createCollection(Vue, Vue.prototype.$db.db);
- };
-
- // create
- // console.log(curriedCreate(Vue.prototype.$db.db));
- Vue.prototype.$db.create = curriedCreate(Vue.prototype.$db.db);
-};
-
-export default { install };
diff --git a/src/utils/request.js b/src/utils/request.js
index a20b670..2cf5374 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -11,8 +11,9 @@ const install = (Vue, vm) => {
// 请求拦截部分,如配置,每次请求前都会执行
Vue.prototype.$u.http.interceptor.request = config => {
- if (vm.$store.state.user.token) {
- config.header.Authorization = `Bearer ${vm.$store.state.user.token}`;
+ const token = vm.$store.state.user.token || uni.$t.storage.getStorageSync(uni.$t.app.tokenKey);
+ if (token) {
+ config.header.Authorization = `Bearer ${token}`;
}
return config;
diff --git a/src/utils/storage.js b/src/utils/storage.js
index 01d115c..ea672d6 100644
--- a/src/utils/storage.js
+++ b/src/utils/storage.js
@@ -39,6 +39,7 @@ export default {
* @param {*} data
*/
setStorage(key, data) {
+ uni.$t.storage.checkCapacity();
return new Promise((resolve, reject) => {
const value = typeof data === 'string' ? data : JSON.stringify(data);
uni.setStorage({
@@ -67,7 +68,7 @@ export default {
resolve(res.data);
},
fail(error) {
- reject(`数据${key}获取失败, error: ${error}`);
+ reject(`数据${key}获取失败, error: ${error.errMsg}`);
},
});
});
@@ -97,4 +98,15 @@ export default {
clearStorage() {
uni.clearStorage();
},
+
+ // 检测local Storage容量 超出容量清空数据缓存
+ checkCapacity() {
+ /* #ifdef H5 */
+ const capacity = JSON.stringify(localStorage).length;
+ let max = 1024 * 1024 * 4;
+ if (capacity >= max) {
+ uni.$t.storage.clearStorage();
+ }
+ /* #endif */
+ },
};
diff --git a/src/utils/tall.js b/src/utils/tall.js
index 8594b15..39c0ca5 100644
--- a/src/utils/tall.js
+++ b/src/utils/tall.js
@@ -1,24 +1,26 @@
import app from '@/config/app.js';
-import timeConfig from '@/config/time';
-import zIndex from '@/config/zIndex.js';
-import plugin from '@/config/plugin.js';
+import cache from '@/utils/cache.js';
+import cacheAndRequest from '@/utils/cacheAndRequest.js';
import storage from '@/utils/storage.js';
import time from '@/utils/time.js';
import ui from '@/utils/ui.js';
import upload from '@/utils/upload.js';
+import user from '@/config/user.js';
+import zIndex from '@/config/zIndex.js';
const gateway = process.env.VUE_APP_API_URL;
const $t = {
zIndex, // 定位元素层级
app, // app级别的相关配置
- plugin, // 插件相关配置信息
storage, // 本地存储storage封装
time, // 时间处理
- timeConfig, // 时间相关配置
ui, // ui界面提示相关
chooseAndUpload: upload.chooseAndUpload, // 选择并上传单个文件相关的封装
domain: `${gateway}/defaultwbs`,
+ cache, // 本地存储相关
+ $q: cacheAndRequest,
+ user, // 用户相关配置
};
uni.$t = $t;
diff --git a/src/utils/time.js b/src/utils/time.js
index 6f1fae2..c20cd2b 100644
--- a/src/utils/time.js
+++ b/src/utils/time.js
@@ -82,7 +82,7 @@ const setTimestampToStr = timestamp => {
const day = formatNumber(timeObj.getDate());
const hour = formatNumber(timeObj.getHours());
const minute = formatNumber(timeObj.getMinutes());
- const date = `${year}/${month}/${day}`;
+ const date = `${year}-${month}-${day}`;
const time = `${hour}:${minute}`;
return {
date,
diff --git a/tailwind.config.js b/tailwind.config.js
deleted file mode 100644
index 4ab9476..0000000
--- a/tailwind.config.js
+++ /dev/null
@@ -1,30 +0,0 @@
-const colors = require('tailwindcss/colors');
-
-module.exports = {
- // purge: ['./public/index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
- darkMode: false, // or 'media' or 'class'
- theme: {
- extend: {},
- colors: {
- blue: colors.sky,
- gray: colors.blueGray,
- red: colors.red,
- orange: colors.orange,
- yellow: colors.yellow,
- green: colors.green,
- pink: colors.rose,
- white: colors.white,
- black: '#333',
- transparent: 'transparent',
- },
- },
- variants: { extend: {} },
- plugins: [],
- corePlugins: {
- space: false,
- divideWidth: false,
- divideColor: false,
- divideStyle: false,
- divideOpacity: false,
- },
-};
diff --git a/vue.config.js b/vue.config.js
index 5a63af9..602c368 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -29,9 +29,8 @@ module.exports = {
},
pluginOptions: {
// mock: { entry: './src/mock/mock.js', debug: true, disable: true },
- eruda: {},
- webpackBundleAnalyzer: {
- openAnalyzer: isPro,
- },
+ // webpackBundleAnalyzer: {
+ // openAnalyzer: isPro,
+ // },
},
};