diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..59c9154
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,16 @@
+######################################################################
+# Build Tools
+
+/unpackage/*
+/node_modules/*
+
+######################################################################
+# Development Tools
+
+/.idea/*
+/.vscode/*
+/.hbuilderx/*
+
+package-lock.json
+yarn.lock
+
diff --git a/.image/Java监控.jpg b/.image/Java监控.jpg
new file mode 100644
index 0000000..6ad522a
Binary files /dev/null and b/.image/Java监控.jpg differ
diff --git a/.image/MySQL.jpg b/.image/MySQL.jpg
new file mode 100644
index 0000000..64a1940
Binary files /dev/null and b/.image/MySQL.jpg differ
diff --git a/.image/OA请假-列表.jpg b/.image/OA请假-列表.jpg
new file mode 100644
index 0000000..787bb73
Binary files /dev/null and b/.image/OA请假-列表.jpg differ
diff --git a/.image/OA请假-发起.jpg b/.image/OA请假-发起.jpg
new file mode 100644
index 0000000..1a7342d
Binary files /dev/null and b/.image/OA请假-发起.jpg differ
diff --git a/.image/OA请假-详情.jpg b/.image/OA请假-详情.jpg
new file mode 100644
index 0000000..a83e7c1
Binary files /dev/null and b/.image/OA请假-详情.jpg differ
diff --git a/.image/Redis.jpg b/.image/Redis.jpg
new file mode 100644
index 0000000..9569352
Binary files /dev/null and b/.image/Redis.jpg differ
diff --git a/.image/admin-uniapp/01.png b/.image/admin-uniapp/01.png
new file mode 100644
index 0000000..0f65d99
Binary files /dev/null and b/.image/admin-uniapp/01.png differ
diff --git a/.image/admin-uniapp/02.png b/.image/admin-uniapp/02.png
new file mode 100644
index 0000000..05ec781
Binary files /dev/null and b/.image/admin-uniapp/02.png differ
diff --git a/.image/admin-uniapp/03.png b/.image/admin-uniapp/03.png
new file mode 100644
index 0000000..f400c68
Binary files /dev/null and b/.image/admin-uniapp/03.png differ
diff --git a/.image/admin-uniapp/04.png b/.image/admin-uniapp/04.png
new file mode 100644
index 0000000..d5d5ea0
Binary files /dev/null and b/.image/admin-uniapp/04.png differ
diff --git a/.image/admin-uniapp/05.png b/.image/admin-uniapp/05.png
new file mode 100644
index 0000000..1de6d8a
Binary files /dev/null and b/.image/admin-uniapp/05.png differ
diff --git a/.image/admin-uniapp/06.png b/.image/admin-uniapp/06.png
new file mode 100644
index 0000000..400ae90
Binary files /dev/null and b/.image/admin-uniapp/06.png differ
diff --git a/.image/admin-uniapp/07.png b/.image/admin-uniapp/07.png
new file mode 100644
index 0000000..2ed8c0f
Binary files /dev/null and b/.image/admin-uniapp/07.png differ
diff --git a/.image/admin-uniapp/08.png b/.image/admin-uniapp/08.png
new file mode 100644
index 0000000..090e64a
Binary files /dev/null and b/.image/admin-uniapp/08.png differ
diff --git a/.image/admin-uniapp/09.png b/.image/admin-uniapp/09.png
new file mode 100644
index 0000000..f2032c8
Binary files /dev/null and b/.image/admin-uniapp/09.png differ
diff --git a/.image/common/mall-feature.png b/.image/common/mall-feature.png
new file mode 100644
index 0000000..cca05c0
Binary files /dev/null and b/.image/common/mall-feature.png differ
diff --git a/.image/common/mall-preview.png b/.image/common/mall-preview.png
new file mode 100644
index 0000000..f939214
Binary files /dev/null and b/.image/common/mall-preview.png differ
diff --git a/.image/common/project-vs.png b/.image/common/project-vs.png
new file mode 100644
index 0000000..561e092
Binary files /dev/null and b/.image/common/project-vs.png differ
diff --git a/.image/common/ruoyi-vue-pro-architecture.png b/.image/common/ruoyi-vue-pro-architecture.png
new file mode 100644
index 0000000..7bd7d59
Binary files /dev/null and b/.image/common/ruoyi-vue-pro-architecture.png differ
diff --git a/.image/common/ruoyi-vue-pro-biz.png b/.image/common/ruoyi-vue-pro-biz.png
new file mode 100644
index 0000000..24a385a
Binary files /dev/null and b/.image/common/ruoyi-vue-pro-biz.png differ
diff --git a/.image/common/yudao-cloud-architecture.png b/.image/common/yudao-cloud-architecture.png
new file mode 100644
index 0000000..59416d8
Binary files /dev/null and b/.image/common/yudao-cloud-architecture.png differ
diff --git a/.image/common/yudao-roadmap.png b/.image/common/yudao-roadmap.png
new file mode 100644
index 0000000..f4becc9
Binary files /dev/null and b/.image/common/yudao-roadmap.png differ
diff --git a/.image/个人中心.jpg b/.image/个人中心.jpg
new file mode 100644
index 0000000..ce57f6e
Binary files /dev/null and b/.image/个人中心.jpg differ
diff --git a/.image/代码生成.jpg b/.image/代码生成.jpg
new file mode 100644
index 0000000..751603e
Binary files /dev/null and b/.image/代码生成.jpg differ
diff --git a/.image/令牌管理.jpg b/.image/令牌管理.jpg
new file mode 100644
index 0000000..04abf4d
Binary files /dev/null and b/.image/令牌管理.jpg differ
diff --git a/.image/任务列表-审批.jpg b/.image/任务列表-审批.jpg
new file mode 100644
index 0000000..cba312a
Binary files /dev/null and b/.image/任务列表-审批.jpg differ
diff --git a/.image/任务列表-已办.jpg b/.image/任务列表-已办.jpg
new file mode 100644
index 0000000..7a8d0fb
Binary files /dev/null and b/.image/任务列表-已办.jpg differ
diff --git a/.image/任务列表-待办.jpg b/.image/任务列表-待办.jpg
new file mode 100644
index 0000000..a90323f
Binary files /dev/null and b/.image/任务列表-待办.jpg differ
diff --git a/.image/任务日志.jpg b/.image/任务日志.jpg
new file mode 100644
index 0000000..599e50a
Binary files /dev/null and b/.image/任务日志.jpg differ
diff --git a/.image/商户信息.jpg b/.image/商户信息.jpg
new file mode 100644
index 0000000..483eace
Binary files /dev/null and b/.image/商户信息.jpg differ
diff --git a/.image/在线用户.jpg b/.image/在线用户.jpg
new file mode 100644
index 0000000..b183009
Binary files /dev/null and b/.image/在线用户.jpg differ
diff --git a/.image/大屏设计器-列表.jpg b/.image/大屏设计器-列表.jpg
new file mode 100644
index 0000000..9a45c3b
Binary files /dev/null and b/.image/大屏设计器-列表.jpg differ
diff --git a/.image/大屏设计器-编辑.jpg b/.image/大屏设计器-编辑.jpg
new file mode 100644
index 0000000..63298a0
Binary files /dev/null and b/.image/大屏设计器-编辑.jpg differ
diff --git a/.image/大屏设计器-预览.jpg b/.image/大屏设计器-预览.jpg
new file mode 100644
index 0000000..501d9ea
Binary files /dev/null and b/.image/大屏设计器-预览.jpg differ
diff --git a/.image/字典数据.jpg b/.image/字典数据.jpg
new file mode 100644
index 0000000..8298c89
Binary files /dev/null and b/.image/字典数据.jpg differ
diff --git a/.image/字典类型.jpg b/.image/字典类型.jpg
new file mode 100644
index 0000000..6613392
Binary files /dev/null and b/.image/字典类型.jpg differ
diff --git a/.image/定时任务.jpg b/.image/定时任务.jpg
new file mode 100644
index 0000000..d5bbd85
Binary files /dev/null and b/.image/定时任务.jpg differ
diff --git a/.image/岗位管理.jpg b/.image/岗位管理.jpg
new file mode 100644
index 0000000..42b64d2
Binary files /dev/null and b/.image/岗位管理.jpg differ
diff --git a/.image/应用信息-列表.jpg b/.image/应用信息-列表.jpg
new file mode 100644
index 0000000..da419a2
Binary files /dev/null and b/.image/应用信息-列表.jpg differ
diff --git a/.image/应用信息-编辑.jpg b/.image/应用信息-编辑.jpg
new file mode 100644
index 0000000..913cfbc
Binary files /dev/null and b/.image/应用信息-编辑.jpg differ
diff --git a/.image/应用管理.jpg b/.image/应用管理.jpg
new file mode 100644
index 0000000..6e7789f
Binary files /dev/null and b/.image/应用管理.jpg differ
diff --git a/.image/我的流程-列表.jpg b/.image/我的流程-列表.jpg
new file mode 100644
index 0000000..223d17a
Binary files /dev/null and b/.image/我的流程-列表.jpg differ
diff --git a/.image/我的流程-发起.jpg b/.image/我的流程-发起.jpg
new file mode 100644
index 0000000..7a83306
Binary files /dev/null and b/.image/我的流程-发起.jpg differ
diff --git a/.image/我的流程-详情.jpg b/.image/我的流程-详情.jpg
new file mode 100644
index 0000000..6a01541
Binary files /dev/null and b/.image/我的流程-详情.jpg differ
diff --git a/.image/报表设计器-图形报表.jpg b/.image/报表设计器-图形报表.jpg
new file mode 100644
index 0000000..681b318
Binary files /dev/null and b/.image/报表设计器-图形报表.jpg differ
diff --git a/.image/报表设计器-打印设计.jpg b/.image/报表设计器-打印设计.jpg
new file mode 100644
index 0000000..bb86da6
Binary files /dev/null and b/.image/报表设计器-打印设计.jpg differ
diff --git a/.image/报表设计器-数据报表.jpg b/.image/报表设计器-数据报表.jpg
new file mode 100644
index 0000000..9ca5b9b
Binary files /dev/null and b/.image/报表设计器-数据报表.jpg differ
diff --git a/.image/操作日志.jpg b/.image/操作日志.jpg
new file mode 100644
index 0000000..4a0611a
Binary files /dev/null and b/.image/操作日志.jpg differ
diff --git a/.image/支付订单.jpg b/.image/支付订单.jpg
new file mode 100644
index 0000000..0a56dd7
Binary files /dev/null and b/.image/支付订单.jpg differ
diff --git a/.image/敏感词.jpg b/.image/敏感词.jpg
new file mode 100644
index 0000000..92a5397
Binary files /dev/null and b/.image/敏感词.jpg differ
diff --git a/.image/数据库文档.jpg b/.image/数据库文档.jpg
new file mode 100644
index 0000000..a4339d9
Binary files /dev/null and b/.image/数据库文档.jpg differ
diff --git a/.image/文件管理.jpg b/.image/文件管理.jpg
new file mode 100644
index 0000000..054b19f
Binary files /dev/null and b/.image/文件管理.jpg differ
diff --git a/.image/文件管理2.jpg b/.image/文件管理2.jpg
new file mode 100644
index 0000000..b12e5c3
Binary files /dev/null and b/.image/文件管理2.jpg differ
diff --git a/.image/文件配置.jpg b/.image/文件配置.jpg
new file mode 100644
index 0000000..e618049
Binary files /dev/null and b/.image/文件配置.jpg differ
diff --git a/.image/日志中心.jpg b/.image/日志中心.jpg
new file mode 100644
index 0000000..27c1c6c
Binary files /dev/null and b/.image/日志中心.jpg differ
diff --git a/.image/流程模型-列表.jpg b/.image/流程模型-列表.jpg
new file mode 100644
index 0000000..ffdc584
Binary files /dev/null and b/.image/流程模型-列表.jpg differ
diff --git a/.image/流程模型-定义.jpg b/.image/流程模型-定义.jpg
new file mode 100644
index 0000000..18b316c
Binary files /dev/null and b/.image/流程模型-定义.jpg differ
diff --git a/.image/流程模型-设计.jpg b/.image/流程模型-设计.jpg
new file mode 100644
index 0000000..9614969
Binary files /dev/null and b/.image/流程模型-设计.jpg differ
diff --git a/.image/流程表单.jpg b/.image/流程表单.jpg
new file mode 100644
index 0000000..60669c1
Binary files /dev/null and b/.image/流程表单.jpg differ
diff --git a/.image/生成效果.jpg b/.image/生成效果.jpg
new file mode 100644
index 0000000..98ff2cc
Binary files /dev/null and b/.image/生成效果.jpg differ
diff --git a/.image/用户分组.jpg b/.image/用户分组.jpg
new file mode 100644
index 0000000..39af1cd
Binary files /dev/null and b/.image/用户分组.jpg differ
diff --git a/.image/用户管理.jpg b/.image/用户管理.jpg
new file mode 100644
index 0000000..844604a
Binary files /dev/null and b/.image/用户管理.jpg differ
diff --git a/.image/登录.jpg b/.image/登录.jpg
new file mode 100644
index 0000000..b782b98
Binary files /dev/null and b/.image/登录.jpg differ
diff --git a/.image/登录日志.jpg b/.image/登录日志.jpg
new file mode 100644
index 0000000..25662d9
Binary files /dev/null and b/.image/登录日志.jpg differ
diff --git a/.image/短信日志.jpg b/.image/短信日志.jpg
new file mode 100644
index 0000000..ada8e56
Binary files /dev/null and b/.image/短信日志.jpg differ
diff --git a/.image/短信模板.jpg b/.image/短信模板.jpg
new file mode 100644
index 0000000..09381cc
Binary files /dev/null and b/.image/短信模板.jpg differ
diff --git a/.image/短信渠道.jpg b/.image/短信渠道.jpg
new file mode 100644
index 0000000..df3a5c3
Binary files /dev/null and b/.image/短信渠道.jpg differ
diff --git a/.image/租户套餐.png b/.image/租户套餐.png
new file mode 100644
index 0000000..9663167
Binary files /dev/null and b/.image/租户套餐.png differ
diff --git a/.image/租户管理.jpg b/.image/租户管理.jpg
new file mode 100644
index 0000000..647416a
Binary files /dev/null and b/.image/租户管理.jpg differ
diff --git a/.image/系统接口.jpg b/.image/系统接口.jpg
new file mode 100644
index 0000000..6d39d42
Binary files /dev/null and b/.image/系统接口.jpg differ
diff --git a/.image/菜单管理.jpg b/.image/菜单管理.jpg
new file mode 100644
index 0000000..ad3b797
Binary files /dev/null and b/.image/菜单管理.jpg differ
diff --git a/.image/表单构建.jpg b/.image/表单构建.jpg
new file mode 100644
index 0000000..81f0374
Binary files /dev/null and b/.image/表单构建.jpg differ
diff --git a/.image/角色管理.jpg b/.image/角色管理.jpg
new file mode 100644
index 0000000..eed776e
Binary files /dev/null and b/.image/角色管理.jpg differ
diff --git a/.image/访问日志.jpg b/.image/访问日志.jpg
new file mode 100644
index 0000000..ef301aa
Binary files /dev/null and b/.image/访问日志.jpg differ
diff --git a/.image/退款订单.jpg b/.image/退款订单.jpg
new file mode 100644
index 0000000..2c6c6c9
Binary files /dev/null and b/.image/退款订单.jpg differ
diff --git a/.image/通知公告.jpg b/.image/通知公告.jpg
new file mode 100644
index 0000000..97bb42f
Binary files /dev/null and b/.image/通知公告.jpg differ
diff --git a/.image/部门管理.jpg b/.image/部门管理.jpg
new file mode 100644
index 0000000..6eab233
Binary files /dev/null and b/.image/部门管理.jpg differ
diff --git a/.image/配置管理.jpg b/.image/配置管理.jpg
new file mode 100644
index 0000000..0abaec9
Binary files /dev/null and b/.image/配置管理.jpg differ
diff --git a/.image/链路追踪.jpg b/.image/链路追踪.jpg
new file mode 100644
index 0000000..12f7aa8
Binary files /dev/null and b/.image/链路追踪.jpg differ
diff --git a/.image/错误日志.jpg b/.image/错误日志.jpg
new file mode 100644
index 0000000..eb615ea
Binary files /dev/null and b/.image/错误日志.jpg differ
diff --git a/.image/错误码管理.jpg b/.image/错误码管理.jpg
new file mode 100644
index 0000000..ea91dde
Binary files /dev/null and b/.image/错误码管理.jpg differ
diff --git a/.image/首页.jpg b/.image/首页.jpg
new file mode 100644
index 0000000..10a7fde
Binary files /dev/null and b/.image/首页.jpg differ
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..c5e0fb1
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,35 @@
+
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..84f43b5
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 芋道
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..9976e22
--- /dev/null
+++ b/README.md
@@ -0,0 +1,52 @@
+**严肃声明:现在、未来都不会有商业版本,所有代码全部开源!!**
+
+**「我喜欢写代码,乐此不疲」**
+**「我喜欢做开源,以此为乐」**
+
+我 🐶 在上海艰苦奋斗,早中晚在 top3 大厂认真搬砖,夜里为开源做贡献。
+
+如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
+
+## 🐶 新手必读
+
+* 演示地址【Vue3 + element-plus】:
+* 演示地址【Vue3 + vben(ant-design-vue)】:
+* 演示地址【Vue2 + element-ui】:
+* 启动文档:
+* 视频教程:
+
+## 🐯 平台简介
+
+**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。
+
+![](/.image/admin-uniapp/02.png)
+
+* 采用 uni-app 框架,一套代码多端适配,支持 App、小程序、H5!
+* 已经实现登录、我的、工作台、编辑资料、头像修改、密码修改、常见问题、关于我们等基础功能。
+
+## 技术栈
+
+| 框架 | 说明 | 版本 |
+|-------------------------------------------------|--------------------|--------|
+| [uni-app](hhttps://github.com/dcloudio/uni-app) | 跨平台框架 | 2.0.0 |
+| [uni-ui](https://github.com/dcloudio/uni-ui) | 基于 uni-app 的 UI 框架 | 1.4.20 |
+
+## 🔥 后端架构
+
+支持 Spring Boot、Spring Cloud 两种架构:
+
+① Spring Boot 单体架构:
+
+![架构图](/.image/common/ruoyi-vue-pro-architecture.png)
+
+② Spring Cloud 微服务架构:
+
+![架构图](/.image/common/yudao-cloud-architecture.png)
+
+## 🐷 演示图
+
+| biu | biu | biu |
+|----------------------------------|----------------------------------|----------------------------------|
+| ![](/.image/admin-uniapp/01.png) | ![](/.image/admin-uniapp/02.png) | ![](/.image/admin-uniapp/03.png) |
+| ![](/.image/admin-uniapp/04.png) | ![](/.image/admin-uniapp/05.png) | ![](/.image/admin-uniapp/06.png) |
+| ![](/.image/admin-uniapp/07.png) | ![](/.image/admin-uniapp/08.png) | ![](/.image/admin-uniapp/09.png) |
diff --git a/api/login.js b/api/login.js
new file mode 100644
index 0000000..b79fd07
--- /dev/null
+++ b/api/login.js
@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+// 登录方法
+export function login(username, password, captchaVerification) {
+ const data = {
+ username,
+ password,
+ captchaVerification
+ }
+ return request({
+ url: '/system/auth/login',
+ headers: {
+ isToken: false
+ },
+ 'method': 'POST',
+ 'data': data
+ })
+}
+
+// 获取用户详细信息
+export function getInfo() {
+ return request({
+ url: '/system/auth/get-permission-info',
+ 'method': 'GET'
+ })
+}
+
+// 退出方法
+export function logout() {
+ return request({
+ url: '/system/auth/logout',
+ 'method': 'POST'
+ })
+}
diff --git a/api/system/user.js b/api/system/user.js
new file mode 100644
index 0000000..59e9304
--- /dev/null
+++ b/api/system/user.js
@@ -0,0 +1,42 @@
+import upload from '@/utils/upload'
+import request from '@/utils/request'
+
+// 用户密码重置
+export function updateUserPwd(oldPassword, newPassword) {
+ const data = {
+ oldPassword,
+ newPassword
+ }
+ return request({
+ url: '/system/user/profile/update-password',
+ method: 'PUT',
+ params: data
+ })
+}
+
+// 查询用户个人信息
+export function getUserProfile() {
+ return request({
+ url: '/system/user/profile/get',
+ method: 'GET'
+ })
+}
+
+// 修改用户个人信息
+export function updateUserProfile(data) {
+ return request({
+ url: '/system/user/profile/update',
+ method: 'PUT',
+ data: data
+ })
+}
+
+// 用户头像上传
+export function uploadAvatar(data) {
+ return upload({
+ url: '/system/user/profile/update-avatar',
+ method: 'PUT',
+ name: data.name,
+ filePath: data.filePath
+ })
+}
diff --git a/components/form/index.vue b/components/form/index.vue
new file mode 100644
index 0000000..0c03d7d
--- /dev/null
+++ b/components/form/index.vue
@@ -0,0 +1,550 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+ {{cur.label}}
+
+
+
+
+
+ {{cur.label}}
+
+
+
+
+
+
+
+ {{selectFormat(data[item.field],item.list)}}
+
+
+ {{item.placeholder ? item.placeholder : `请选择${item.label}`}}
+
+
+
+
+
+ {{data[item.field]}}
+
+
+ {{item.placeholder ? item.placeholder : `请选择${item.label}`}}
+
+
+
+
+
+ {{regionText}}
+
+
+ {{item.placeholder ? item.placeholder : `请选择${item.label}`}}
+
+
+
+
+
+ {{item.isRightButton}}
+
+
+ {{item.isRightText}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/search/index.vue b/components/search/index.vue
new file mode 100644
index 0000000..c06b0ee
--- /dev/null
+++ b/components/search/index.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+ 筛选
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/sparePartsApplicationList/index.vue b/components/sparePartsApplicationList/index.vue
new file mode 100644
index 0000000..d74fa94
--- /dev/null
+++ b/components/sparePartsApplicationList/index.vue
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+ {{item.title}}
+
+
+ 2023-12-12 08:00:00
+
+
+
+ {{cur.label}}:{{item[cur.field]}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/sparePartsCard/index.vue b/components/sparePartsCard/index.vue
new file mode 100644
index 0000000..33a3eca
--- /dev/null
+++ b/components/sparePartsCard/index.vue
@@ -0,0 +1,114 @@
+
+
+
+ *{{subForm.formLabel}}
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+ {{cur.label}}:{{item[cur.field]}}
+
+
+
+
+
+
+
+
+
+ 添加
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/uni-section/uni-section.vue b/components/uni-section/uni-section.vue
new file mode 100644
index 0000000..9a52e0b
--- /dev/null
+++ b/components/uni-section/uni-section.vue
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/verifition/Verify.vue b/components/verifition/Verify.vue
new file mode 100644
index 0000000..3fe4d88
--- /dev/null
+++ b/components/verifition/Verify.vue
@@ -0,0 +1,469 @@
+
+
+
+
+ 请完成安全验证
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/verifition/utils/ase.js b/components/verifition/utils/ase.js
new file mode 100644
index 0000000..1fdceed
--- /dev/null
+++ b/components/verifition/utils/ase.js
@@ -0,0 +1,14 @@
+import CryptoJS from 'crypto-js'
+/**
+ * @word 要加密的内容
+ * @keyWord String 服务器随机返回的关键字
+ * */
+export function aesEncrypt(word, keyWord = "XwKsGlMcdPMEhR1B") {
+ var key = CryptoJS.enc.Utf8.parse(keyWord);
+ var srcs = CryptoJS.enc.Utf8.parse(word);
+ var encrypted = CryptoJS.AES.encrypt(srcs, key, {
+ mode: CryptoJS.mode.ECB,
+ padding: CryptoJS.pad.Pkcs7
+ });
+ return encrypted.toString();
+}
diff --git a/components/verifition/utils/request.js b/components/verifition/utils/request.js
new file mode 100644
index 0000000..e6a31b0
--- /dev/null
+++ b/components/verifition/utils/request.js
@@ -0,0 +1,17 @@
+import config from '@/config'
+const baseUrl = config.baseUrl
+export const myRequest = (option = {}) => {
+ return new Promise((reslove, reject) => {
+ uni.request({
+ url: baseUrl + option.url,
+ data: option.data,
+ method: option.method || "GET",
+ success: (result) => {
+ reslove(result)
+ },
+ fail: (error) => {
+ reject(error)
+ }
+ })
+ })
+}
diff --git a/components/verifition/verifyPoint/verifyPoint.vue b/components/verifition/verifyPoint/verifyPoint.vue
new file mode 100644
index 0000000..57d7d03
--- /dev/null
+++ b/components/verifition/verifyPoint/verifyPoint.vue
@@ -0,0 +1,557 @@
+
+
+
+
+
+
+
+
+
+ {{index + 1}}
+
+
+
+
+
+ {{text}}
+
+
+
+
+
+
diff --git a/components/verifition/verifySlider/verifySlider.vue b/components/verifition/verifySlider/verifySlider.vue
new file mode 100644
index 0000000..7c75e0e
--- /dev/null
+++ b/components/verifition/verifySlider/verifySlider.vue
@@ -0,0 +1,661 @@
+
+
+
+
+
+
+
+
+
+
+ {{tipWords}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/workOrderList/index.vue b/components/workOrderList/index.vue
new file mode 100644
index 0000000..ba3e8c7
--- /dev/null
+++ b/components/workOrderList/index.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+ {{item.title}}
+
+
+ 2023-12-12 08:00:00
+
+
+
+ {{cur.label}}:{{item[cur.field]}}
+
+
+
+ {{item.time}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/config.js b/config.js
new file mode 100644
index 0000000..935f140
--- /dev/null
+++ b/config.js
@@ -0,0 +1,26 @@
+// 应用全局配置
+module.exports = {
+ baseUrl: process.env.NODE_ENV === 'development' ? 'http://localhost:12080' : 'http://api-dashboard.yudao.iocoder.cn',
+ baseApi:process.env.NODE_ENV === 'development' ? '/admin-api' : '/api/admin-api',
+ // 应用信息
+ appInfo: {
+ // 应用名称
+ name: "yudao-app",
+ // 应用版本
+ version: "1.0.0",
+ // 应用logo
+ logo: "/static/logo.png",
+ // 官方网站
+ site_url: "https://iocoder.cn",
+ // 政策协议
+ agreements: [{
+ title: "隐私政策",
+ url: "https://iocoder.cn"
+ },
+ {
+ title: "用户服务协议",
+ url: "https://iocoder.cn"
+ }
+ ]
+ }
+}
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..882ba04
--- /dev/null
+++ b/index.html
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..52db3fd
--- /dev/null
+++ b/main.js
@@ -0,0 +1,22 @@
+import Vue from 'vue'
+import App from './App'
+import store from './store' // store
+import plugins from './plugins' // plugins
+import './permission' // permission
+// 引入 uView UI
+import uView from './uni_modules/vk-uview-ui';
+ import Search from '@/components/search/index.vue'
+Vue.use(plugins)
+Vue.use(uView)
+Vue.component('Search',Search)
+
+Vue.config.productionTip = false
+Vue.prototype.$store = store
+
+App.mpType = 'app'
+
+const app = new Vue({
+ ...App
+})
+
+app.$mount()
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..2970939
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,73 @@
+{
+ "name" : "芋道移动端",
+ "appid" : "__UNI__EA67EB3",
+ "description" : "",
+ "versionName" : "1.0.0",
+ "versionCode" : "100",
+ "transformPx" : false,
+ "app-plus" : {
+ "usingComponents" : true,
+ "nvueCompiler" : "uni-app",
+ "splashscreen" : {
+ "alwaysShowBeforeRender" : true,
+ "waiting" : true,
+ "autoclose" : true,
+ "delay" : 0
+ },
+ "modules" : {},
+ "distribute" : {
+ "android" : {
+ "permissions" : [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ "ios" : {
+ "dSYMs" : false
+ },
+ "sdkConfigs" : {
+ "ad" : {}
+ }
+ }
+ },
+ "quickapp" : {},
+ "mp-weixin" : {
+ "appid" : "wxccd7e2a0911b3397",
+ "setting" : {
+ "urlCheck" : false,
+ "es6" : false,
+ "minified" : true,
+ "postcss" : true
+ },
+ "optimization" : {
+ "subPackages" : true
+ },
+ "usingComponents" : true
+ },
+ "vueVersion" : "2",
+ "h5" : {
+ "template" : "",
+ "devServer" : {
+ "port" : "",
+ "https" : false
+ },
+ "title" : "",
+ "router" : {
+ "mode" : "hash",
+ "base" : "/"
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..acc8840
--- /dev/null
+++ b/package.json
@@ -0,0 +1,9 @@
+{
+ "dependencies": {
+ "crypto-js": "^4.0.0"
+ },
+ "devDependencies": {
+ "sass": "^1.69.7",
+ "sass-loader": "^13.3.3"
+ }
+}
diff --git a/pages.json b/pages.json
new file mode 100644
index 0000000..3e67a8b
--- /dev/null
+++ b/pages.json
@@ -0,0 +1,177 @@
+{
+ "pages": [{
+ "path": "pages/login",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ }, {
+ "path": "pages/index",
+ "style": {
+ "navigationBarTitleText": "首页",
+ "navigationStyle": "custom"
+ }
+ }, {
+ "path": "pages/device/index",
+ "style": {
+ "navigationBarTitleText": "设备列表",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/device/screen",
+ "style": {
+ "navigationBarTitleText": "筛选",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/mold/index",
+ "style": {
+ "navigationBarTitleText": "模具"
+ }
+ }, {
+ "path": "pages/spareParts/index",
+ "style": {
+ "navigationBarTitleText": "备件",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/mine/index",
+ "style": {
+ "navigationBarTitleText": "我的",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/spareParts/screen",
+ "style": {
+ "navigationBarTitleText": "筛选",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/sparePartsApplication/index",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/sparePartsApplication/screen",
+ "style": {
+ "navigationBarTitleText": "筛选",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/sparePartsApplication/addForm",
+ "style": {
+ "navigationBarTitleText": "添加申请",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/sparePartsServiceWorkOrderList/index",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/sparePartsServiceWorkOrderList/screen",
+ "style": {
+ "navigationBarTitleText": "筛选",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/sparePartsServiceWorkOrderList/addForm",
+ "style": {
+ "navigationBarTitleText": "添加申请",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/notaic/index",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/workOrderList/index",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ }, {
+ "path": "pages/workOrderList/screen",
+ "style": {
+ "navigationBarTitleText": "筛选",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/workOrderList/addForm",
+ "style": {
+ "navigationBarTitleText": "添加报修",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/workOrderList/detail",
+ "style": {
+ "navigationBarTitleText": "工单详情",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/mine/aboutUs",
+ "style": {
+ "navigationBarTitleText": "关于我们",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }, {
+ "path": "pages/mine/changePassword",
+ "style": {
+ "navigationBarTitleText": "修改密码",
+ "navigationBarBackgroundColor": "#409eff",
+ "navigationBarTextStyle": "white"
+ }
+ }],
+ "tabBar": {
+ "color": "#8f9bb3",
+ "selectedColor": "#409eff",
+ "borderStyle": "white",
+ "backgroundColor": "#ffffff",
+ "list": [{
+ "pagePath": "pages/index",
+ "iconPath": "static/images/tabbar/tab_icon1.png",
+ "selectedIconPath": "static/images/tabbar/tab_act_icon1.png",
+ "text": "首页"
+ }, {
+ "pagePath": "pages/device/index",
+ "iconPath": "static/images/tabbar/tab_icon2.png",
+ "selectedIconPath": "static/images/tabbar/tab_act_icon2.png",
+ "text": "设备"
+ }, {
+ "pagePath": "pages/mold/index",
+ "iconPath": "static/images/tabbar/tab_icon3.png",
+ "selectedIconPath": "static/images/tabbar/tab_act_icon3.png",
+ "text": "模具"
+ }, {
+ "pagePath": "pages/spareParts/index",
+ "iconPath": "static/images/tabbar/tab_icon4.png",
+ "selectedIconPath": "static/images/tabbar/tab_act_icon4.png",
+ "text": "备件"
+ }, {
+ "pagePath": "pages/mine/index",
+ "iconPath": "static/images/tabbar/tab_icon5.png",
+ "selectedIconPath": "static/images/tabbar/tab_act_icon5.png",
+ "text": "我的"
+ }]
+ },
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "RuoYi",
+ "navigationBarBackgroundColor": "#FFFFFF"
+ }
+}
\ No newline at end of file
diff --git a/pages/device/index.vue b/pages/device/index.vue
new file mode 100644
index 0000000..1115000
--- /dev/null
+++ b/pages/device/index.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+ 暂无图片
+
+
+
+
+
+ 电梯设备
+
+
+ SB52225456
+
+
+ 四厂区二楼三车间
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/device/screen.vue b/pages/device/screen.vue
new file mode 100644
index 0000000..38f5cda
--- /dev/null
+++ b/pages/device/screen.vue
@@ -0,0 +1,242 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/index.vue b/pages/index.vue
new file mode 100644
index 0000000..caada73
--- /dev/null
+++ b/pages/index.vue
@@ -0,0 +1,261 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 32
+ 设备总数
+
+
+ 32
+ 故障中设备
+
+
+ 32
+ 已报修设备
+
+
+
+
+ 32
+ 待接单
+
+
+ 32
+ 待验证
+
+
+ 32
+ 待审核
+
+
+
+
+
+ 设备维护
+
+
+
+
+ 设备报修
+
+
+
+
+
+ 维修工单
+
+
+
+
+
+ 检修工单
+
+
+
+
+
+ 点检工单
+
+
+
+
+
+ 保养工单
+
+
+
+ 模具维护
+
+
+
+
+ 设备报修
+
+
+
+
+
+ 维修工单
+
+
+
+
+
+ 检修工单
+
+
+
+
+
+ 保养工单
+
+
+
+ 备件管理
+
+
+
+
+ 领用申请
+
+
+
+
+
+ 维修工单
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/login.vue b/pages/login.vue
new file mode 100644
index 0000000..baba105
--- /dev/null
+++ b/pages/login.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+ 智慧设备管理综合系统
+ 让设备管理更智能、更高效
+
+
+
+
+
+
+
+
+ 您好,欢迎登录
+
+
+ 登录账号
+
+
+
+ 登录密码
+
+
+
+
+
+
+
+
+
+
+ 登录即代表同意
+ 《用户协议》
+ 《隐私协议》
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/mine/aboutUs.vue b/pages/mine/aboutUs.vue
new file mode 100644
index 0000000..241467b
--- /dev/null
+++ b/pages/mine/aboutUs.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/mine/changePassword.vue b/pages/mine/changePassword.vue
new file mode 100644
index 0000000..c0f11bc
--- /dev/null
+++ b/pages/mine/changePassword.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确认
+
+
+
+
+
+
diff --git a/pages/mine/index.vue b/pages/mine/index.vue
new file mode 100644
index 0000000..586648d
--- /dev/null
+++ b/pages/mine/index.vue
@@ -0,0 +1,200 @@
+
+
+
+
+
+
+
+
+
+ 我的报修
+
+
+
+ 我的维修
+
+
+
+ 我的保养
+
+
+
+ 巡检点检
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/mold/index.vue b/pages/mold/index.vue
new file mode 100644
index 0000000..d1914b9
--- /dev/null
+++ b/pages/mold/index.vue
@@ -0,0 +1,22 @@
+
+
+ 1
+
+
+
+
+
+
diff --git a/pages/notaic/index.vue b/pages/notaic/index.vue
new file mode 100644
index 0000000..f75b088
--- /dev/null
+++ b/pages/notaic/index.vue
@@ -0,0 +1,139 @@
+
+
+
+
+ 清除未读
+
+
+
+
+
+ 全部
+
+
+ 已读
+
+
+ 未读
+
+
+
+
+
+
+
+ 2024-12-12 08:00:00
+
+
+
+ 您有一个保养任务,请及时处理。
+
+
+ 消息类型 保养任务
+
+
+ 任务时间 2023-06-02 09:00~2023-06-02 09:00
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/spareParts/index.vue b/pages/spareParts/index.vue
new file mode 100644
index 0000000..1ca39dd
--- /dev/null
+++ b/pages/spareParts/index.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+ 暂无图片
+
+
+
+
+
+ 备件025
+
+
+ 备件编码:SB52225456
+
+
+ 规格型号:SB52225456
+
+
+ 总库存:25
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/spareParts/screen.vue b/pages/spareParts/screen.vue
new file mode 100644
index 0000000..2dd2da9
--- /dev/null
+++ b/pages/spareParts/screen.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/sparePartsApplication/addForm.vue b/pages/sparePartsApplication/addForm.vue
new file mode 100644
index 0000000..291be32
--- /dev/null
+++ b/pages/sparePartsApplication/addForm.vue
@@ -0,0 +1,283 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/sparePartsApplication/index.vue b/pages/sparePartsApplication/index.vue
new file mode 100644
index 0000000..f15fb56
--- /dev/null
+++ b/pages/sparePartsApplication/index.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.title}}
+
+
+ 2023-12-12 08:00:00
+
+
+
+ {{cur.label}}:{{item[cur.field]}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/sparePartsApplication/screen.vue b/pages/sparePartsApplication/screen.vue
new file mode 100644
index 0000000..5441a5d
--- /dev/null
+++ b/pages/sparePartsApplication/screen.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/sparePartsServiceWorkOrderList/addForm.vue b/pages/sparePartsServiceWorkOrderList/addForm.vue
new file mode 100644
index 0000000..e0eb165
--- /dev/null
+++ b/pages/sparePartsServiceWorkOrderList/addForm.vue
@@ -0,0 +1,261 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/sparePartsServiceWorkOrderList/index.vue b/pages/sparePartsServiceWorkOrderList/index.vue
new file mode 100644
index 0000000..8fc548e
--- /dev/null
+++ b/pages/sparePartsServiceWorkOrderList/index.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/sparePartsServiceWorkOrderList/screen.vue b/pages/sparePartsServiceWorkOrderList/screen.vue
new file mode 100644
index 0000000..1f60eb1
--- /dev/null
+++ b/pages/sparePartsServiceWorkOrderList/screen.vue
@@ -0,0 +1,211 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/workOrderList/addForm.vue b/pages/workOrderList/addForm.vue
new file mode 100644
index 0000000..cd03b43
--- /dev/null
+++ b/pages/workOrderList/addForm.vue
@@ -0,0 +1,211 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/workOrderList/detail.vue b/pages/workOrderList/detail.vue
new file mode 100644
index 0000000..b11a5f8
--- /dev/null
+++ b/pages/workOrderList/detail.vue
@@ -0,0 +1,349 @@
+
+
+
+
+
+ 维修工单
+ 转班
+
+
+
+ 工单单号
+ WXDH2051351
+
+
+ 工单主题
+ 设备一维修2554
+
+
+ 工单类型
+ 报修工单
+
+
+ 维修班组
+ 维修班组一
+
+
+ 工程师
+ 橙子
+
+
+ 维修工
+ 香蕉
+
+
+
+
+
+
+
+
+
+
+ {{changeItem.name}}
+
+
+
+ 设备编号
+ WXDH2051351
+
+
+ 设备名称
+ 设备一维修2554
+
+
+ 规格型号
+ 报修工单
+
+
+ 设备类型
+ 维修班组一
+
+
+ 存放位置
+ 橙子
+
+
+ 使用部门
+ 香蕉
+
+
+
+
+ 设备编号
+ WXDH2051351
+
+
+ 设备名称
+ 设备一维修2554
+
+
+ 规格型号
+ 报修工单
+
+
+ 设备类型
+ 维修班组一
+
+
+ 存放位置
+ 橙子
+
+
+ 使用部门
+ 香蕉
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/workOrderList/index.vue b/pages/workOrderList/index.vue
new file mode 100644
index 0000000..54ecaf8
--- /dev/null
+++ b/pages/workOrderList/index.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/workOrderList/screen.vue b/pages/workOrderList/screen.vue
new file mode 100644
index 0000000..95d80d0
--- /dev/null
+++ b/pages/workOrderList/screen.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/workOrderList/transfer.vue b/pages/workOrderList/transfer.vue
new file mode 100644
index 0000000..f3ff8df
--- /dev/null
+++ b/pages/workOrderList/transfer.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/permission.js b/permission.js
new file mode 100644
index 0000000..4c5bb1d
--- /dev/null
+++ b/permission.js
@@ -0,0 +1,39 @@
+import { getAccessToken } from '@/utils/auth'
+
+// 登录页面
+const loginPage = "/pages/login"
+
+// 页面白名单
+const whiteList = [
+ '/pages/login', '/pages/common/webview/index'
+]
+
+// 检查地址白名单
+function checkWhite(url) {
+ const path = url.split('?')[0]
+ return whiteList.indexOf(path) !== -1
+}
+
+// 页面跳转验证拦截器
+// let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"]
+// list.forEach(item => {
+// uni.addInterceptor(item, {
+// invoke(to) {
+// if (getAccessToken()) {
+// if (to.path === loginPage) {
+// uni.reLaunch({ url: "/" })
+// }
+// return true
+// } else {
+// if (checkWhite(to.url)) {
+// return true
+// }
+// uni.reLaunch({ url: loginPage })
+// return false
+// }
+// },
+// fail(err) {
+// console.log(err)
+// }
+// })
+// })
diff --git a/plugins/auth.js b/plugins/auth.js
new file mode 100644
index 0000000..3b91c14
--- /dev/null
+++ b/plugins/auth.js
@@ -0,0 +1,60 @@
+import store from '@/store'
+
+function authPermission(permission) {
+ const all_permission = "*:*:*"
+ const permissions = store.getters && store.getters.permissions
+ if (permission && permission.length > 0) {
+ return permissions.some(v => {
+ return all_permission === v || v === permission
+ })
+ } else {
+ return false
+ }
+}
+
+function authRole(role) {
+ const super_admin = "admin"
+ const roles = store.getters && store.getters.roles
+ if (role && role.length > 0) {
+ return roles.some(v => {
+ return super_admin === v || v === role
+ })
+ } else {
+ return false
+ }
+}
+
+export default {
+ // 验证用户是否具备某权限
+ hasPermi(permission) {
+ return authPermission(permission)
+ },
+ // 验证用户是否含有指定权限,只需包含其中一个
+ hasPermiOr(permissions) {
+ return permissions.some(item => {
+ return authPermission(item)
+ })
+ },
+ // 验证用户是否含有指定权限,必须全部拥有
+ hasPermiAnd(permissions) {
+ return permissions.every(item => {
+ return authPermission(item)
+ })
+ },
+ // 验证用户是否具备某角色
+ hasRole(role) {
+ return authRole(role)
+ },
+ // 验证用户是否含有指定角色,只需包含其中一个
+ hasRoleOr(roles) {
+ return roles.some(item => {
+ return authRole(item)
+ })
+ },
+ // 验证用户是否含有指定角色,必须全部拥有
+ hasRoleAnd(roles) {
+ return roles.every(item => {
+ return authRole(item)
+ })
+ }
+}
diff --git a/plugins/index.js b/plugins/index.js
new file mode 100644
index 0000000..efbae15
--- /dev/null
+++ b/plugins/index.js
@@ -0,0 +1,14 @@
+import tab from './tab'
+import auth from './auth'
+import modal from './modal'
+
+export default {
+ install(Vue) {
+ // 页签操作
+ Vue.prototype.$tab = tab
+ // 认证对象
+ Vue.prototype.$auth = auth
+ // 模态框对象
+ Vue.prototype.$modal = modal
+ }
+}
diff --git a/plugins/modal.js b/plugins/modal.js
new file mode 100644
index 0000000..87960fd
--- /dev/null
+++ b/plugins/modal.js
@@ -0,0 +1,74 @@
+export default {
+ // 消息提示
+ msg(content) {
+ uni.showToast({
+ title: content,
+ icon: 'none'
+ })
+ },
+ // 错误消息
+ msgError(content) {
+ uni.showToast({
+ title: content,
+ icon: 'error'
+ })
+ },
+ // 成功消息
+ msgSuccess(content) {
+ uni.showToast({
+ title: content,
+ icon: 'success'
+ })
+ },
+ // 隐藏消息
+ hideMsg(content) {
+ uni.hideToast()
+ },
+ // 弹出提示
+ alert(content) {
+ uni.showModal({
+ title: '提示',
+ content: content,
+ showCancel: false
+ })
+ },
+ // 确认窗体
+ confirm(content) {
+ return new Promise((resolve, reject) => {
+ uni.showModal({
+ title: '系统提示',
+ content: content,
+ cancelText: '取消',
+ confirmText: '确定',
+ success: function(res) {
+ if (res.confirm) {
+ resolve(res.confirm)
+ }
+ }
+ })
+ })
+ },
+ // 提示信息
+ showToast(option) {
+ if (typeof option === "object") {
+ uni.showToast(option)
+ } else {
+ uni.showToast({
+ title: option,
+ icon: "none",
+ duration: 2500
+ })
+ }
+ },
+ // 打开遮罩层
+ loading(content) {
+ uni.showLoading({
+ title: content,
+ icon: 'none'
+ })
+ },
+ // 关闭遮罩层
+ closeLoading() {
+ uni.hideLoading()
+ }
+}
diff --git a/plugins/tab.js b/plugins/tab.js
new file mode 100644
index 0000000..5d1b305
--- /dev/null
+++ b/plugins/tab.js
@@ -0,0 +1,30 @@
+export default {
+ // 关闭所有页面,打开到应用内的某个页面
+ reLaunch(url) {
+ return uni.reLaunch({
+ url: url
+ })
+ },
+ // 跳转到tabBar页面,并关闭其他所有非tabBar页面
+ switchTab(url) {
+ return uni.switchTab({
+ url: url
+ })
+ },
+ // 关闭当前页面,跳转到应用内的某个页面
+ redirectTo(url) {
+ return uni.redirectTo({
+ url: url
+ })
+ },
+ // 保留当前页面,跳转到应用内的某个页面
+ navigateTo(url) {
+ return uni.navigateTo({
+ url: url
+ })
+ },
+ // 关闭当前页面,返回上一页面或多级页面
+ navigateBack() {
+ return uni.navigateBack()
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..6294499
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,16 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+dependencies:
+ crypto-js:
+ specifier: ^4.0.0
+ version: 4.2.0
+
+packages:
+
+ /crypto-js@4.2.0:
+ resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
+ dev: false
diff --git a/static/favicon.ico b/static/favicon.ico
new file mode 100644
index 0000000..6f07782
Binary files /dev/null and b/static/favicon.ico differ
diff --git a/static/font/iconfont.css b/static/font/iconfont.css
new file mode 100644
index 0000000..39aed3d
--- /dev/null
+++ b/static/font/iconfont.css
@@ -0,0 +1,90 @@
+@font-face {
+ font-family: "iconfont";
+ src: url('/static/font/iconfont.ttf') format('truetype');
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ display: inline-block;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-user:before {
+ content: "\e7ae";
+}
+
+.icon-password:before {
+ content: "\e8b2";
+}
+
+.icon-code:before {
+ content: "\e699";
+}
+
+.icon-setting:before {
+ content: "\e6cc";
+}
+
+.icon-share:before {
+ content: "\e739";
+}
+
+.icon-edit:before {
+ content: "\e60c";
+}
+
+.icon-version:before {
+ content: "\e63f";
+}
+
+.icon-service:before {
+ content: "\e6ff";
+}
+
+.icon-friendfill:before {
+ content: "\e726";
+}
+
+.icon-community:before {
+ content: "\e741";
+}
+
+.icon-people:before {
+ content: "\e736";
+}
+
+.icon-dianzan:before {
+ content: "\ec7f";
+}
+
+.icon-right:before {
+ content: "\e7eb";
+}
+
+.icon-logout:before {
+ content: "\e61d";
+}
+
+.icon-help:before {
+ content: "\e616";
+}
+
+.icon-github:before {
+ content: "\e628";
+}
+
+.icon-aixin:before {
+ content: "\e601";
+}
+
+.icon-clean:before {
+ content: "\e607";
+}
+
+.icon-refresh:before {
+ content: "\e604";
+}
+
diff --git a/static/font/iconfont.ttf b/static/font/iconfont.ttf
new file mode 100644
index 0000000..53915ca
Binary files /dev/null and b/static/font/iconfont.ttf differ
diff --git a/static/icon/screen.png b/static/icon/screen.png
new file mode 100644
index 0000000..6bdb41d
Binary files /dev/null and b/static/icon/screen.png differ
diff --git a/static/images/banner/banner01.jpg b/static/images/banner/banner01.jpg
new file mode 100644
index 0000000..fdb1e16
Binary files /dev/null and b/static/images/banner/banner01.jpg differ
diff --git a/static/images/banner/banner02.jpg b/static/images/banner/banner02.jpg
new file mode 100644
index 0000000..1086afd
Binary files /dev/null and b/static/images/banner/banner02.jpg differ
diff --git a/static/images/banner/banner03.jpg b/static/images/banner/banner03.jpg
new file mode 100644
index 0000000..092a5fc
Binary files /dev/null and b/static/images/banner/banner03.jpg differ
diff --git a/static/images/banner/icon1.png b/static/images/banner/icon1.png
new file mode 100644
index 0000000..3678f06
Binary files /dev/null and b/static/images/banner/icon1.png differ
diff --git a/static/images/banner/icon2.png b/static/images/banner/icon2.png
new file mode 100644
index 0000000..34b0393
Binary files /dev/null and b/static/images/banner/icon2.png differ
diff --git a/static/images/banner/icon3.png b/static/images/banner/icon3.png
new file mode 100644
index 0000000..ddbe0f7
Binary files /dev/null and b/static/images/banner/icon3.png differ
diff --git a/static/images/banner/icon4.png b/static/images/banner/icon4.png
new file mode 100644
index 0000000..ef7a396
Binary files /dev/null and b/static/images/banner/icon4.png differ
diff --git a/static/images/banner/login_banner.svg b/static/images/banner/login_banner.svg
new file mode 100644
index 0000000..caef463
--- /dev/null
+++ b/static/images/banner/login_banner.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/static/images/banner/logo-banner.png b/static/images/banner/logo-banner.png
new file mode 100644
index 0000000..518b616
Binary files /dev/null and b/static/images/banner/logo-banner.png differ
diff --git a/static/images/banner/u2335.svg b/static/images/banner/u2335.svg
new file mode 100644
index 0000000..d2045d9
--- /dev/null
+++ b/static/images/banner/u2335.svg
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/static/images/banner/u2450.svg b/static/images/banner/u2450.svg
new file mode 100644
index 0000000..76bdcd4
--- /dev/null
+++ b/static/images/banner/u2450.svg
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/static/images/banner/u253_selected.svg b/static/images/banner/u253_selected.svg
new file mode 100644
index 0000000..1de51e0
--- /dev/null
+++ b/static/images/banner/u253_selected.svg
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/static/images/default.jpg b/static/images/default.jpg
new file mode 100644
index 0000000..aa0237b
Binary files /dev/null and b/static/images/default.jpg differ
diff --git a/static/images/icon1.svg b/static/images/icon1.svg
new file mode 100644
index 0000000..971098e
--- /dev/null
+++ b/static/images/icon1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/images/icon2.svg b/static/images/icon2.svg
new file mode 100644
index 0000000..fa92acf
--- /dev/null
+++ b/static/images/icon2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/images/icon3.svg b/static/images/icon3.svg
new file mode 100644
index 0000000..38e3fbf
--- /dev/null
+++ b/static/images/icon3.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/images/icon4.svg b/static/images/icon4.svg
new file mode 100644
index 0000000..811c086
--- /dev/null
+++ b/static/images/icon4.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/images/icon5.svg b/static/images/icon5.svg
new file mode 100644
index 0000000..61cc90a
--- /dev/null
+++ b/static/images/icon5.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/images/icon6.png b/static/images/icon6.png
new file mode 100644
index 0000000..761a86b
Binary files /dev/null and b/static/images/icon6.png differ
diff --git a/static/images/mobile_bg.png b/static/images/mobile_bg.png
new file mode 100644
index 0000000..e0cccfe
Binary files /dev/null and b/static/images/mobile_bg.png differ
diff --git a/static/images/profile.jpg b/static/images/profile.jpg
new file mode 100644
index 0000000..b3a940b
Binary files /dev/null and b/static/images/profile.jpg differ
diff --git a/static/images/tabbar/tab_act_icon1.png b/static/images/tabbar/tab_act_icon1.png
new file mode 100644
index 0000000..9d0de1d
Binary files /dev/null and b/static/images/tabbar/tab_act_icon1.png differ
diff --git a/static/images/tabbar/tab_act_icon2.png b/static/images/tabbar/tab_act_icon2.png
new file mode 100644
index 0000000..8c927dd
Binary files /dev/null and b/static/images/tabbar/tab_act_icon2.png differ
diff --git a/static/images/tabbar/tab_act_icon3.png b/static/images/tabbar/tab_act_icon3.png
new file mode 100644
index 0000000..e89d96a
Binary files /dev/null and b/static/images/tabbar/tab_act_icon3.png differ
diff --git a/static/images/tabbar/tab_act_icon4.png b/static/images/tabbar/tab_act_icon4.png
new file mode 100644
index 0000000..3ef0854
Binary files /dev/null and b/static/images/tabbar/tab_act_icon4.png differ
diff --git a/static/images/tabbar/tab_act_icon5.png b/static/images/tabbar/tab_act_icon5.png
new file mode 100644
index 0000000..f9aef6c
Binary files /dev/null and b/static/images/tabbar/tab_act_icon5.png differ
diff --git a/static/images/tabbar/tab_icon1.png b/static/images/tabbar/tab_icon1.png
new file mode 100644
index 0000000..d36711d
Binary files /dev/null and b/static/images/tabbar/tab_icon1.png differ
diff --git a/static/images/tabbar/tab_icon2.png b/static/images/tabbar/tab_icon2.png
new file mode 100644
index 0000000..6b16a35
Binary files /dev/null and b/static/images/tabbar/tab_icon2.png differ
diff --git a/static/images/tabbar/tab_icon3.png b/static/images/tabbar/tab_icon3.png
new file mode 100644
index 0000000..880aed5
Binary files /dev/null and b/static/images/tabbar/tab_icon3.png differ
diff --git a/static/images/tabbar/tab_icon4.png b/static/images/tabbar/tab_icon4.png
new file mode 100644
index 0000000..b9249bf
Binary files /dev/null and b/static/images/tabbar/tab_icon4.png differ
diff --git a/static/images/tabbar/tab_icon5.png b/static/images/tabbar/tab_icon5.png
new file mode 100644
index 0000000..a8ecfd9
Binary files /dev/null and b/static/images/tabbar/tab_icon5.png differ
diff --git a/static/index.html b/static/index.html
new file mode 100644
index 0000000..a7af653
--- /dev/null
+++ b/static/index.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+ <%= htmlWebpackPlugin.options.title %>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/logo.png b/static/logo.png
new file mode 100644
index 0000000..b4270c0
Binary files /dev/null and b/static/logo.png differ
diff --git a/static/logo200.png b/static/logo200.png
new file mode 100644
index 0000000..ffa9988
Binary files /dev/null and b/static/logo200.png differ
diff --git a/static/scss/colorui.css b/static/scss/colorui.css
new file mode 100644
index 0000000..fade3b2
--- /dev/null
+++ b/static/scss/colorui.css
@@ -0,0 +1,3912 @@
+/*
+ ColorUi for uniApp v2.1.6 | by 文晓港 2019-05-31 10:44:24
+ 仅供学习交流,如作它用所承受的法律责任一概与作者无关
+
+ *使用ColorUi开发扩展与插件时,请注明基于ColorUi开发
+
+ (QQ交流群:240787041)
+*/
+
+/* ==================
+ 初始化
+ ==================== */
+body {
+ background-color: #f1f1f1;
+ font-size: 28upx;
+ color: #333333;
+ font-family: Helvetica Neue, Helvetica, sans-serif;
+}
+
+view,
+scroll-view,
+swiper,
+button,
+input,
+textarea,
+label,
+navigator,
+image {
+ box-sizing: border-box;
+}
+
+.round {
+ border-radius: 5000upx;
+}
+
+.radius {
+ border-radius: 6upx;
+}
+
+/* ==================
+ 图片
+ ==================== */
+
+image {
+ max-width: 100%;
+ display: inline-block;
+ position: relative;
+ z-index: 0;
+}
+
+image.loading::before {
+ content: "";
+ background-color: #f5f5f5;
+ display: block;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ z-index: -2;
+}
+
+image.loading::after {
+ content: "\e7f1";
+ font-family: "cuIcon";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 32upx;
+ height: 32upx;
+ line-height: 32upx;
+ right: 0;
+ bottom: 0;
+ z-index: -1;
+ font-size: 32upx;
+ margin: auto;
+ color: #ccc;
+ -webkit-animation: cuIcon-spin 2s infinite linear;
+ animation: cuIcon-spin 2s infinite linear;
+ display: block;
+}
+
+.response {
+ width: 100%;
+}
+
+/* ==================
+ 开关
+ ==================== */
+
+switch,
+checkbox,
+radio {
+ position: relative;
+}
+
+switch::after,
+switch::before {
+ font-family: "cuIcon";
+ content: "\e645";
+ position: absolute;
+ color: #ffffff !important;
+ top: 0%;
+ left: 0upx;
+ font-size: 26upx;
+ line-height: 26px;
+ width: 50%;
+ text-align: center;
+ pointer-events: none;
+ transform: scale(0, 0);
+ transition: all 0.3s ease-in-out 0s;
+ z-index: 9;
+ bottom: 0;
+ height: 26px;
+ margin: auto;
+}
+
+switch::before {
+ content: "\e646";
+ right: 0;
+ transform: scale(1, 1);
+ left: auto;
+}
+
+switch[checked]::after,
+switch.checked::after {
+ transform: scale(1, 1);
+}
+
+switch[checked]::before,
+switch.checked::before {
+ transform: scale(0, 0);
+}
+
+/* #ifndef MP-ALIPAY */
+radio::before,
+checkbox::before {
+ font-family: "cuIcon";
+ content: "\e645";
+ position: absolute;
+ color: #ffffff !important;
+ top: 50%;
+ margin-top: -8px;
+ right: 5px;
+ font-size: 32upx;
+ line-height: 16px;
+ pointer-events: none;
+ transform: scale(1, 1);
+ transition: all 0.3s ease-in-out 0s;
+ z-index: 9;
+}
+
+radio .wx-radio-input,
+checkbox .wx-checkbox-input,
+radio .uni-radio-input,
+checkbox .uni-checkbox-input {
+ margin: 0;
+ width: 24px;
+ height: 24px;
+}
+
+checkbox.round .wx-checkbox-input,
+checkbox.round .uni-checkbox-input {
+ border-radius: 100upx;
+}
+
+/* #endif */
+
+switch[checked]::before {
+ transform: scale(0, 0);
+}
+
+switch .wx-switch-input,
+switch .uni-switch-input {
+ border: none;
+ padding: 0 24px;
+ width: 48px;
+ height: 26px;
+ margin: 0;
+ border-radius: 100upx;
+}
+
+switch .wx-switch-input:not([class*="bg-"]),
+switch .uni-switch-input:not([class*="bg-"]) {
+ background: #8799a3 !important;
+}
+
+switch .wx-switch-input::after,
+switch .uni-switch-input::after {
+ margin: auto;
+ width: 26px;
+ height: 26px;
+ border-radius: 100upx;
+ left: 0upx;
+ top: 0upx;
+ bottom: 0upx;
+ position: absolute;
+ transform: scale(0.9, 0.9);
+ transition: all 0.1s ease-in-out 0s;
+}
+
+switch .wx-switch-input.wx-switch-input-checked::after,
+switch .uni-switch-input.uni-switch-input-checked::after {
+ margin: auto;
+ left: 22px;
+ box-shadow: none;
+ transform: scale(0.9, 0.9);
+}
+
+radio-group {
+ display: inline-block;
+}
+
+
+
+switch.radius .wx-switch-input::after,
+switch.radius .wx-switch-input,
+switch.radius .wx-switch-input::before,
+switch.radius .uni-switch-input::after,
+switch.radius .uni-switch-input,
+switch.radius .uni-switch-input::before {
+ border-radius: 10upx;
+}
+
+switch .wx-switch-input::before,
+radio.radio::before,
+checkbox .wx-checkbox-input::before,
+radio .wx-radio-input::before,
+switch .uni-switch-input::before,
+radio.radio::before,
+checkbox .uni-checkbox-input::before,
+radio .uni-radio-input::before {
+ display: none;
+}
+
+radio.radio[checked]::after,
+radio.radio .uni-radio-input-checked::after {
+ content: "";
+ background-color: transparent;
+ display: block;
+ position: absolute;
+ width: 8px;
+ height: 8px;
+ z-index: 999;
+ top: 0upx;
+ left: 0upx;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+ border-radius: 200upx;
+ /* #ifndef MP */
+ border: 7px solid #ffffff !important;
+ /* #endif */
+
+ /* #ifdef MP */
+ border: 8px solid #ffffff !important;
+ /* #endif */
+}
+
+.switch-sex::after {
+ content: "\e71c";
+}
+
+.switch-sex::before {
+ content: "\e71a";
+}
+
+.switch-sex .wx-switch-input,
+.switch-sex .uni-switch-input {
+ background: #e54d42 !important;
+ border-color: #e54d42 !important;
+}
+
+.switch-sex[checked] .wx-switch-input,
+.switch-sex.checked .uni-switch-input {
+ background: #0081ff !important;
+ border-color: #0081ff !important;
+}
+
+switch.red[checked] .wx-switch-input.wx-switch-input-checked,
+checkbox.red[checked] .wx-checkbox-input,
+radio.red[checked] .wx-radio-input,
+switch.red.checked .uni-switch-input.uni-switch-input-checked,
+checkbox.red.checked .uni-checkbox-input,
+radio.red.checked .uni-radio-input {
+ background-color: #e54d42 !important;
+ border-color: #e54d42 !important;
+ color: #ffffff !important;
+}
+
+switch.orange[checked] .wx-switch-input,
+checkbox.orange[checked] .wx-checkbox-input,
+radio.orange[checked] .wx-radio-input,
+switch.orange.checked .uni-switch-input,
+checkbox.orange.checked .uni-checkbox-input,
+radio.orange.checked .uni-radio-input {
+ background-color: #f37b1d !important;
+ border-color: #f37b1d !important;
+ color: #ffffff !important;
+}
+
+switch.yellow[checked] .wx-switch-input,
+checkbox.yellow[checked] .wx-checkbox-input,
+radio.yellow[checked] .wx-radio-input,
+switch.yellow.checked .uni-switch-input,
+checkbox.yellow.checked .uni-checkbox-input,
+radio.yellow.checked .uni-radio-input {
+ background-color: #fbbd08 !important;
+ border-color: #fbbd08 !important;
+ color: #333333 !important;
+}
+
+switch.olive[checked] .wx-switch-input,
+checkbox.olive[checked] .wx-checkbox-input,
+radio.olive[checked] .wx-radio-input,
+switch.olive.checked .uni-switch-input,
+checkbox.olive.checked .uni-checkbox-input,
+radio.olive.checked .uni-radio-input {
+ background-color: #8dc63f !important;
+ border-color: #8dc63f !important;
+ color: #ffffff !important;
+}
+
+switch.green[checked] .wx-switch-input,
+switch[checked] .wx-switch-input,
+checkbox.green[checked] .wx-checkbox-input,
+checkbox[checked] .wx-checkbox-input,
+radio.green[checked] .wx-radio-input,
+radio[checked] .wx-radio-input,
+switch.green.checked .uni-switch-input,
+switch.checked .uni-switch-input,
+checkbox.green.checked .uni-checkbox-input,
+checkbox.checked .uni-checkbox-input,
+radio.green.checked .uni-radio-input,
+radio.checked .uni-radio-input {
+ background-color: #39b54a !important;
+ border-color: #39b54a !important;
+ color: #ffffff !important;
+ border-color: #39B54A !important;
+}
+
+switch.cyan[checked] .wx-switch-input,
+checkbox.cyan[checked] .wx-checkbox-input,
+radio.cyan[checked] .wx-radio-input,
+switch.cyan.checked .uni-switch-input,
+checkbox.cyan.checked .uni-checkbox-input,
+radio.cyan.checked .uni-radio-input {
+ background-color: #1cbbb4 !important;
+ border-color: #1cbbb4 !important;
+ color: #ffffff !important;
+}
+
+switch.blue[checked] .wx-switch-input,
+checkbox.blue[checked] .wx-checkbox-input,
+radio.blue[checked] .wx-radio-input,
+switch.blue.checked .uni-switch-input,
+checkbox.blue.checked .uni-checkbox-input,
+radio.blue.checked .uni-radio-input {
+ background-color: #0081ff !important;
+ border-color: #0081ff !important;
+ color: #ffffff !important;
+}
+
+switch.purple[checked] .wx-switch-input,
+checkbox.purple[checked] .wx-checkbox-input,
+radio.purple[checked] .wx-radio-input,
+switch.purple.checked .uni-switch-input,
+checkbox.purple.checked .uni-checkbox-input,
+radio.purple.checked .uni-radio-input {
+ background-color: #6739b6 !important;
+ border-color: #6739b6 !important;
+ color: #ffffff !important;
+}
+
+switch.mauve[checked] .wx-switch-input,
+checkbox.mauve[checked] .wx-checkbox-input,
+radio.mauve[checked] .wx-radio-input,
+switch.mauve.checked .uni-switch-input,
+checkbox.mauve.checked .uni-checkbox-input,
+radio.mauve.checked .uni-radio-input {
+ background-color: #9c26b0 !important;
+ border-color: #9c26b0 !important;
+ color: #ffffff !important;
+}
+
+switch.pink[checked] .wx-switch-input,
+checkbox.pink[checked] .wx-checkbox-input,
+radio.pink[checked] .wx-radio-input,
+switch.pink.checked .uni-switch-input,
+checkbox.pink.checked .uni-checkbox-input,
+radio.pink.checked .uni-radio-input {
+ background-color: #e03997 !important;
+ border-color: #e03997 !important;
+ color: #ffffff !important;
+}
+
+switch.brown[checked] .wx-switch-input,
+checkbox.brown[checked] .wx-checkbox-input,
+radio.brown[checked] .wx-radio-input,
+switch.brown.checked .uni-switch-input,
+checkbox.brown.checked .uni-checkbox-input,
+radio.brown.checked .uni-radio-input {
+ background-color: #a5673f !important;
+ border-color: #a5673f !important;
+ color: #ffffff !important;
+}
+
+switch.grey[checked] .wx-switch-input,
+checkbox.grey[checked] .wx-checkbox-input,
+radio.grey[checked] .wx-radio-input,
+switch.grey.checked .uni-switch-input,
+checkbox.grey.checked .uni-checkbox-input,
+radio.grey.checked .uni-radio-input {
+ background-color: #8799a3 !important;
+ border-color: #8799a3 !important;
+ color: #ffffff !important;
+}
+
+switch.gray[checked] .wx-switch-input,
+checkbox.gray[checked] .wx-checkbox-input,
+radio.gray[checked] .wx-radio-input,
+switch.gray.checked .uni-switch-input,
+checkbox.gray.checked .uni-checkbox-input,
+radio.gray.checked .uni-radio-input {
+ background-color: #f0f0f0 !important;
+ border-color: #f0f0f0 !important;
+ color: #333333 !important;
+}
+
+switch.black[checked] .wx-switch-input,
+checkbox.black[checked] .wx-checkbox-input,
+radio.black[checked] .wx-radio-input,
+switch.black.checked .uni-switch-input,
+checkbox.black.checked .uni-checkbox-input,
+radio.black.checked .uni-radio-input {
+ background-color: #333333 !important;
+ border-color: #333333 !important;
+ color: #ffffff !important;
+}
+
+switch.white[checked] .wx-switch-input,
+checkbox.white[checked] .wx-checkbox-input,
+radio.white[checked] .wx-radio-input,
+switch.white.checked .uni-switch-input,
+checkbox.white.checked .uni-checkbox-input,
+radio.white.checked .uni-radio-input {
+ background-color: #ffffff !important;
+ border-color: #ffffff !important;
+ color: #333333 !important;
+}
+
+/* ==================
+ 边框
+ ==================== */
+
+/* -- 实线 -- */
+
+.solid,
+.solid-top,
+.solid-right,
+.solid-bottom,
+.solid-left,
+.solids,
+.solids-top,
+.solids-right,
+.solids-bottom,
+.solids-left,
+.dashed,
+.dashed-top,
+.dashed-right,
+.dashed-bottom,
+.dashed-left {
+ position: relative;
+}
+
+.solid::after,
+.solid-top::after,
+.solid-right::after,
+.solid-bottom::after,
+.solid-left::after,
+.solids::after,
+.solids-top::after,
+.solids-right::after,
+.solids-bottom::after,
+.solids-left::after,
+.dashed::after,
+.dashed-top::after,
+.dashed-right::after,
+.dashed-bottom::after,
+.dashed-left::after {
+ content: " ";
+ width: 200%;
+ height: 200%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border-radius: inherit;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ pointer-events: none;
+ box-sizing: border-box;
+}
+
+.solid::after {
+ border: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-top::after {
+ border-top: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-right::after {
+ border-right: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-bottom::after {
+ border-bottom: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-left::after {
+ border-left: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solids::after {
+ border: 8upx solid #eee;
+}
+
+.solids-top::after {
+ border-top: 8upx solid #eee;
+}
+
+.solids-right::after {
+ border-right: 8upx solid #eee;
+}
+
+.solids-bottom::after {
+ border-bottom: 8upx solid #eee;
+}
+
+.solids-left::after {
+ border-left: 8upx solid #eee;
+}
+
+/* -- 虚线 -- */
+
+.dashed::after {
+ border: 1upx dashed #ddd;
+}
+
+.dashed-top::after {
+ border-top: 1upx dashed #ddd;
+}
+
+.dashed-right::after {
+ border-right: 1upx dashed #ddd;
+}
+
+.dashed-bottom::after {
+ border-bottom: 1upx dashed #ddd;
+}
+
+.dashed-left::after {
+ border-left: 1upx dashed #ddd;
+}
+
+/* -- 阴影 -- */
+
+.shadow[class*='white'] {
+ --ShadowSize: 0 1upx 6upx;
+}
+
+.shadow-lg {
+ --ShadowSize: 0upx 40upx 100upx 0upx;
+}
+
+.shadow-warp {
+ position: relative;
+ box-shadow: 0 0 10upx rgba(0, 0, 0, 0.1);
+}
+
+.shadow-warp:before,
+.shadow-warp:after {
+ position: absolute;
+ content: "";
+ top: 20upx;
+ bottom: 30upx;
+ left: 20upx;
+ width: 50%;
+ box-shadow: 0 30upx 20upx rgba(0, 0, 0, 0.2);
+ transform: rotate(-3deg);
+ z-index: -1;
+}
+
+.shadow-warp:after {
+ right: 20upx;
+ left: auto;
+ transform: rotate(3deg);
+}
+
+.shadow-blur {
+ position: relative;
+}
+
+.shadow-blur::before {
+ content: "";
+ display: block;
+ background: inherit;
+ filter: blur(10upx);
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ top: 10upx;
+ left: 10upx;
+ z-index: -1;
+ opacity: 0.4;
+ transform-origin: 0 0;
+ border-radius: inherit;
+ transform: scale(1, 1);
+}
+
+/* ==================
+ 按钮
+ ==================== */
+
+.cu-btn {
+ position: relative;
+ border: 0upx;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ padding: 0 30upx;
+ font-size: 28upx;
+ height: 64upx;
+ line-height: 1;
+ text-align: center;
+ text-decoration: none;
+ overflow: visible;
+ margin-left: initial;
+ transform: translate(0upx, 0upx);
+ margin-right: initial;
+}
+
+.cu-btn::after {
+ display: none;
+}
+
+.cu-btn:not([class*="bg-"]) {
+ background-color: #f0f0f0;
+}
+
+.cu-btn[class*="line"] {
+ background-color: transparent;
+}
+
+.cu-btn[class*="line"]::after {
+ content: " ";
+ display: block;
+ width: 200%;
+ height: 200%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border: 1upx solid currentColor;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ box-sizing: border-box;
+ border-radius: 12upx;
+ z-index: 1;
+ pointer-events: none;
+}
+
+.cu-btn.round[class*="line"]::after {
+ border-radius: 1000upx;
+}
+
+.cu-btn[class*="lines"]::after {
+ border: 6upx solid currentColor;
+}
+
+.cu-btn[class*="bg-"]::after {
+ display: none;
+}
+
+.cu-btn.sm {
+ padding: 0 20upx;
+ font-size: 20upx;
+ height: 48upx;
+}
+
+.cu-btn.lg {
+ padding: 0 40upx;
+ font-size: 32upx;
+ height: 80upx;
+}
+
+.cu-btn.cuIcon.sm {
+ width: 48upx;
+ height: 48upx;
+}
+
+.cu-btn.cuIcon {
+ width: 64upx;
+ height: 64upx;
+ border-radius: 500upx;
+ padding: 0;
+}
+
+button.cuIcon.lg {
+ width: 80upx;
+ height: 80upx;
+}
+
+.cu-btn.shadow-blur::before {
+ top: 4upx;
+ left: 4upx;
+ filter: blur(6upx);
+ opacity: 0.6;
+}
+
+.cu-btn.button-hover {
+ transform: translate(1upx, 1upx);
+}
+
+.block {
+ display: block;
+}
+
+.cu-btn.block {
+ display: flex;
+}
+
+.cu-btn[disabled] {
+ opacity: 0.6;
+ color: #ffffff;
+}
+
+/* ==================
+ 徽章
+ ==================== */
+
+.cu-tag {
+ font-size: 24upx;
+ vertical-align: middle;
+ position: relative;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ padding: 0upx 16upx;
+ height: 48upx;
+ font-family: Helvetica Neue, Helvetica, sans-serif;
+ white-space: nowrap;
+}
+
+.cu-tag:not([class*="bg"]):not([class*="line"]) {
+ background-color: #f1f1f1;
+}
+
+.cu-tag[class*="line-"]::after {
+ content: " ";
+ width: 200%;
+ height: 200%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border: 1upx solid currentColor;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ box-sizing: border-box;
+ border-radius: inherit;
+ z-index: 1;
+ pointer-events: none;
+}
+
+.cu-tag.radius[class*="line"]::after {
+ border-radius: 12upx;
+}
+
+.cu-tag.round[class*="line"]::after {
+ border-radius: 1000upx;
+}
+
+.cu-tag[class*="line-"]::after {
+ border-radius: 0;
+}
+
+.cu-tag+.cu-tag {
+ margin-left: 10upx;
+}
+
+.cu-tag.sm {
+ font-size: 20upx;
+ padding: 0upx 12upx;
+ height: 32upx;
+}
+
+.cu-capsule {
+ display: inline-flex;
+ vertical-align: middle;
+}
+
+.cu-capsule+.cu-capsule {
+ margin-left: 10upx;
+}
+
+.cu-capsule .cu-tag {
+ margin: 0;
+}
+
+.cu-capsule .cu-tag[class*="line-"]:last-child::after {
+ border-left: 0upx solid transparent;
+}
+
+.cu-capsule .cu-tag[class*="line-"]:first-child::after {
+ border-right: 0upx solid transparent;
+}
+
+.cu-capsule.radius .cu-tag:first-child {
+ border-top-left-radius: 6upx;
+ border-bottom-left-radius: 6upx;
+}
+
+.cu-capsule.radius .cu-tag:last-child::after,
+.cu-capsule.radius .cu-tag[class*="line-"] {
+ border-top-right-radius: 12upx;
+ border-bottom-right-radius: 12upx;
+}
+
+.cu-capsule.round .cu-tag:first-child {
+ border-top-left-radius: 200upx;
+ border-bottom-left-radius: 200upx;
+ text-indent: 4upx;
+}
+
+.cu-capsule.round .cu-tag:last-child::after,
+.cu-capsule.round .cu-tag:last-child {
+ border-top-right-radius: 200upx;
+ border-bottom-right-radius: 200upx;
+ text-indent: -4upx;
+}
+
+.cu-tag.badge {
+ border-radius: 200upx;
+ position: absolute;
+ top: -10upx;
+ right: -10upx;
+ font-size: 20upx;
+ padding: 0upx 10upx;
+ height: 28upx;
+ color: #ffffff;
+}
+
+.cu-tag.badge:not([class*="bg-"]) {
+ background-color: #dd514c;
+}
+
+.cu-tag:empty:not([class*="cuIcon-"]) {
+ padding: 0upx;
+ width: 16upx;
+ height: 16upx;
+ top: -4upx;
+ right: -4upx;
+}
+
+.cu-tag[class*="cuIcon-"] {
+ width: 32upx;
+ height: 32upx;
+ top: -4upx;
+ right: -4upx;
+}
+
+/* ==================
+ 头像
+ ==================== */
+
+.cu-avatar {
+ font-variant: small-caps;
+ margin: 0;
+ padding: 0;
+ display: inline-flex;
+ text-align: center;
+ justify-content: center;
+ align-items: center;
+ background-color: #ccc;
+ color: #ffffff;
+ white-space: nowrap;
+ position: relative;
+ width: 64upx;
+ height: 64upx;
+ background-size: cover;
+ background-position: center;
+ vertical-align: middle;
+ font-size: 1.5em;
+}
+
+.cu-avatar.sm {
+ width: 48upx;
+ height: 48upx;
+ font-size: 1em;
+}
+
+.cu-avatar.lg {
+ width: 96upx;
+ height: 96upx;
+ font-size: 2em;
+}
+
+.cu-avatar.xl {
+ width: 128upx;
+ height: 128upx;
+ font-size: 2.5em;
+}
+
+.cu-avatar .avatar-text {
+ font-size: 0.4em;
+}
+
+.cu-avatar-group {
+ direction: rtl;
+ unicode-bidi: bidi-override;
+ padding: 0 10upx 0 40upx;
+ display: inline-block;
+}
+
+.cu-avatar-group .cu-avatar {
+ margin-left: -30upx;
+ border: 4upx solid #f1f1f1;
+ vertical-align: middle;
+}
+
+.cu-avatar-group .cu-avatar.sm {
+ margin-left: -20upx;
+ border: 1upx solid #f1f1f1;
+}
+
+/* ==================
+ 进度条
+ ==================== */
+
+.cu-progress {
+ overflow: hidden;
+ height: 28upx;
+ background-color: #ebeef5;
+ display: inline-flex;
+ align-items: center;
+ width: 100%;
+}
+
+.cu-progress+view,
+.cu-progress+text {
+ line-height: 1;
+}
+
+.cu-progress.xs {
+ height: 10upx;
+}
+
+.cu-progress.sm {
+ height: 20upx;
+}
+
+.cu-progress view {
+ width: 0;
+ height: 100%;
+ align-items: center;
+ display: flex;
+ justify-items: flex-end;
+ justify-content: space-around;
+ font-size: 20upx;
+ color: #ffffff;
+ transition: width 0.6s ease;
+}
+
+.cu-progress text {
+ align-items: center;
+ display: flex;
+ font-size: 20upx;
+ color: #333333;
+ text-indent: 10upx;
+}
+
+.cu-progress.text-progress {
+ padding-right: 60upx;
+}
+
+.cu-progress.striped view {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: 72upx 72upx;
+}
+
+.cu-progress.active view {
+ animation: progress-stripes 2s linear infinite;
+}
+
+@keyframes progress-stripes {
+ from {
+ background-position: 72upx 0;
+ }
+
+ to {
+ background-position: 0 0;
+ }
+}
+
+/* ==================
+ 加载
+ ==================== */
+
+.cu-load {
+ display: block;
+ line-height: 3em;
+ text-align: center;
+}
+
+.cu-load::before {
+ font-family: "cuIcon";
+ display: inline-block;
+ margin-right: 6upx;
+}
+
+.cu-load.loading::before {
+ content: "\e67a";
+ animation: cuIcon-spin 2s infinite linear;
+}
+
+.cu-load.loading::after {
+ content: "加载中...";
+}
+
+.cu-load.over::before {
+ content: "\e64a";
+}
+
+.cu-load.over::after {
+ content: "没有更多了";
+}
+
+.cu-load.erro::before {
+ content: "\e658";
+}
+
+.cu-load.erro::after {
+ content: "加载失败";
+}
+
+.cu-load.load-cuIcon::before {
+ font-size: 32upx;
+}
+
+.cu-load.load-cuIcon::after {
+ display: none;
+}
+
+.cu-load.load-cuIcon.over {
+ display: none;
+}
+
+.cu-load.load-modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 140upx;
+ left: 0;
+ margin: auto;
+ width: 260upx;
+ height: 260upx;
+ background-color: #ffffff;
+ border-radius: 10upx;
+ box-shadow: 0 0 0upx 2000upx rgba(0, 0, 0, 0.5);
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ justify-content: center;
+ font-size: 28upx;
+ z-index: 9999;
+ line-height: 2.4em;
+}
+
+.cu-load.load-modal [class*="cuIcon-"] {
+ font-size: 60upx;
+}
+
+.cu-load.load-modal image {
+ width: 70upx;
+ height: 70upx;
+}
+
+.cu-load.load-modal::after {
+ content: "";
+ position: absolute;
+ background-color: #ffffff;
+ border-radius: 50%;
+ width: 200upx;
+ height: 200upx;
+ font-size: 10px;
+ border-top: 6upx solid rgba(0, 0, 0, 0.05);
+ border-right: 6upx solid rgba(0, 0, 0, 0.05);
+ border-bottom: 6upx solid rgba(0, 0, 0, 0.05);
+ border-left: 6upx solid #f37b1d;
+ animation: cuIcon-spin 1s infinite linear;
+ z-index: -1;
+}
+
+.load-progress {
+ pointer-events: none;
+ top: 0;
+ position: fixed;
+ width: 100%;
+ left: 0;
+ z-index: 2000;
+}
+
+.load-progress.hide {
+ display: none;
+}
+
+.load-progress .load-progress-bar {
+ position: relative;
+ width: 100%;
+ height: 4upx;
+ overflow: hidden;
+ transition: all 200ms ease 0s;
+}
+
+.load-progress .load-progress-spinner {
+ position: absolute;
+ top: 10upx;
+ right: 10upx;
+ z-index: 2000;
+ display: block;
+}
+
+.load-progress .load-progress-spinner::after {
+ content: "";
+ display: block;
+ width: 24upx;
+ height: 24upx;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: solid 4upx transparent;
+ border-top-color: inherit;
+ border-left-color: inherit;
+ border-radius: 50%;
+ -webkit-animation: load-progress-spinner 0.4s linear infinite;
+ animation: load-progress-spinner 0.4s linear infinite;
+}
+
+@-webkit-keyframes load-progress-spinner {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes load-progress-spinner {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+
+/* ==================
+ 列表
+ ==================== */
+.grayscale {
+ filter: grayscale(1);
+}
+
+.cu-list+.cu-list {
+ margin-top: 30upx
+}
+
+.cu-list>.cu-item {
+ transition: all .6s ease-in-out 0s;
+ transform: translateX(0upx)
+}
+
+.cu-list>.cu-item.move-cur {
+ transform: translateX(-260upx)
+}
+
+.cu-list>.cu-item .move {
+ position: absolute;
+ right: 0;
+ display: flex;
+ width: 260upx;
+ height: 100%;
+ transform: translateX(100%)
+}
+
+.cu-list>.cu-item .move view {
+ display: flex;
+ flex: 1;
+ justify-content: center;
+ align-items: center
+}
+
+.cu-list.menu-avatar {
+ overflow: hidden;
+}
+
+.cu-list.menu-avatar>.cu-item {
+ position: relative;
+ display: flex;
+ padding-right: 10upx;
+ height: 140upx;
+ background-color: #ffffff;
+ justify-content: flex-end;
+ align-items: center
+}
+
+.cu-list.menu-avatar>.cu-item>.cu-avatar {
+ position: absolute;
+ left: 30upx
+}
+
+.cu-list.menu-avatar>.cu-item .flex .text-cut {
+ max-width: 510upx
+}
+
+.cu-list.menu-avatar>.cu-item .content {
+ position: absolute;
+ left: 146upx;
+ width: calc(100% - 96upx - 60upx - 120upx - 20upx);
+ line-height: 1.6em;
+}
+
+.cu-list.menu-avatar>.cu-item .content.flex-sub {
+ width: calc(100% - 96upx - 60upx - 20upx);
+}
+
+.cu-list.menu-avatar>.cu-item .content>view:first-child {
+ font-size: 30upx;
+ display: flex;
+ align-items: center
+}
+
+.cu-list.menu-avatar>.cu-item .content .cu-tag.sm {
+ display: inline-block;
+ margin-left: 10upx;
+ height: 28upx;
+ font-size: 16upx;
+ line-height: 32upx
+}
+
+.cu-list.menu-avatar>.cu-item .action {
+ width: 100upx;
+ text-align: center
+}
+
+.cu-list.menu-avatar>.cu-item .action view+view {
+ margin-top: 10upx
+}
+
+.cu-list.menu-avatar.comment>.cu-item .content {
+ position: relative;
+ left: 0;
+ width: auto;
+ flex: 1;
+}
+
+.cu-list.menu-avatar.comment>.cu-item {
+ padding: 30upx 30upx 30upx 120upx;
+ height: auto
+}
+
+.cu-list.menu-avatar.comment .cu-avatar {
+ align-self: flex-start
+}
+
+.cu-list.menu>.cu-item {
+ position: relative;
+ display: flex;
+ padding: 0 30upx;
+ min-height: 100upx;
+ background-color: #ffffff;
+ justify-content: space-between;
+ align-items: center
+}
+
+.cu-list.menu>.cu-item:last-child:after {
+ border: none
+}
+
+.cu-list.menu-avatar>.cu-item:after,
+.cu-list.menu>.cu-item:after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ box-sizing: border-box;
+ width: 200%;
+ height: 200%;
+ border-bottom: 1upx solid #ddd;
+ border-radius: inherit;
+ content: " ";
+ transform: scale(.5);
+ transform-origin: 0 0;
+ pointer-events: none
+}
+
+.cu-list.menu>.cu-item.grayscale {
+ background-color: #f5f5f5
+}
+
+.cu-list.menu>.cu-item.cur {
+ background-color: #fcf7e9
+}
+
+.cu-list.menu>.cu-item.arrow {
+ padding-right: 90upx
+}
+
+.cu-list.menu>.cu-item.arrow:before {
+ position: absolute;
+ top: 0;
+ right: 30upx;
+ bottom: 0;
+ display: block;
+ margin: auto;
+ width: 30upx;
+ height: 30upx;
+ color: #8799a3;
+ content: "\e6a3";
+ text-align: center;
+ font-size: 34upx;
+ font-family: cuIcon;
+ line-height: 30upx
+}
+
+.cu-list.menu>.cu-item button.content {
+ padding: 0;
+ background-color: transparent;
+ justify-content: flex-start
+}
+
+.cu-list.menu>.cu-item button.content:after {
+ display: none
+}
+
+.cu-list.menu>.cu-item .cu-avatar-group .cu-avatar {
+ border-color: #ffffff
+}
+
+.cu-list.menu>.cu-item .content>view:first-child {
+ display: flex;
+ align-items: center
+}
+
+.cu-list.menu>.cu-item .content>text[class*=cuIcon] {
+ display: inline-block;
+ margin-right: 10upx;
+ width: 1.6em;
+ text-align: center
+}
+
+.cu-list.menu>.cu-item .content>image {
+ display: inline-block;
+ margin-right: 10upx;
+ width: 1.6em;
+ height: 1.6em;
+ vertical-align: middle
+}
+
+.cu-list.menu>.cu-item .content {
+ font-size: 30upx;
+ line-height: 1.6em;
+ flex: 1
+}
+
+.cu-list.menu>.cu-item .content .cu-tag.sm {
+ display: inline-block;
+ margin-left: 10upx;
+ height: 28upx;
+ font-size: 16upx;
+ line-height: 32upx
+}
+
+.cu-list.menu>.cu-item .action .cu-tag:empty {
+ right: 10upx
+}
+
+.cu-list.menu {
+ display: block;
+ overflow: hidden
+}
+
+.cu-list.menu.sm-border>.cu-item:after {
+ left: 30upx;
+ width: calc(200% - 120upx)
+}
+
+.cu-list.grid>.cu-item {
+ position: relative;
+ display: flex;
+ padding: 20upx 0 30upx;
+ transition-duration: 0s;
+ flex-direction: column
+}
+
+.cu-list.grid>.cu-item:after {
+ position: absolute;
+ top: 0;
+ left: 0;
+ box-sizing: border-box;
+ width: 200%;
+ height: 200%;
+ border-right: 1px solid rgba(0, 0, 0, .1);
+ border-bottom: 1px solid rgba(0, 0, 0, .1);
+ border-radius: inherit;
+ content: " ";
+ transform: scale(.5);
+ transform-origin: 0 0;
+ pointer-events: none
+}
+
+.cu-list.grid>.cu-item text {
+ display: block;
+ margin-top: 10upx;
+ color: #888;
+ font-size: 26upx;
+ line-height: 40upx
+}
+
+.cu-list.grid>.cu-item [class*=cuIcon] {
+ position: relative;
+ display: block;
+ margin-top: 20upx;
+ width: 100%;
+ font-size: 48upx
+}
+
+.cu-list.grid>.cu-item .cu-tag {
+ right: auto;
+ left: 50%;
+ margin-left: 20upx
+}
+
+.cu-list.grid {
+ background-color: #ffffff;
+ text-align: center
+}
+
+.cu-list.grid.no-border>.cu-item {
+ padding-top: 10upx;
+ padding-bottom: 20upx
+}
+
+.cu-list.grid.no-border>.cu-item:after {
+ border: none
+}
+
+.cu-list.grid.no-border {
+ padding: 20upx 10upx
+}
+
+.cu-list.grid.col-3>.cu-item:nth-child(3n):after,
+.cu-list.grid.col-4>.cu-item:nth-child(4n):after,
+.cu-list.grid.col-5>.cu-item:nth-child(5n):after {
+ border-right-width: 0
+}
+
+.cu-list.card-menu {
+ overflow: hidden;
+ margin-right: 30upx;
+ margin-left: 30upx;
+ border-radius: 20upx
+}
+
+
+/* ==================
+ 操作条
+ ==================== */
+
+.cu-bar {
+ display: flex;
+ position: relative;
+ align-items: center;
+ min-height: 100upx;
+ justify-content: space-between;
+}
+
+.cu-bar .action {
+ display: flex;
+ align-items: center;
+ height: 100%;
+ justify-content: center;
+ max-width: 100%;
+}
+
+.cu-bar .action.border-title {
+ position: relative;
+ top: -10upx;
+}
+
+.cu-bar .action.border-title text[class*="bg-"]:last-child {
+ position: absolute;
+ bottom: -0.5rem;
+ min-width: 2rem;
+ height: 6upx;
+ left: 0;
+}
+
+.cu-bar .action.sub-title {
+ position: relative;
+ top: -0.2rem;
+}
+
+.cu-bar .action.sub-title text {
+ position: relative;
+ z-index: 1;
+}
+
+.cu-bar .action.sub-title text[class*="bg-"]:last-child {
+ position: absolute;
+ display: inline-block;
+ bottom: -0.2rem;
+ border-radius: 6upx;
+ width: 100%;
+ height: 0.6rem;
+ left: 0.6rem;
+ opacity: 0.3;
+ z-index: 0;
+}
+
+.cu-bar .action.sub-title text[class*="text-"]:last-child {
+ position: absolute;
+ display: inline-block;
+ bottom: -0.7rem;
+ left: 0.5rem;
+ opacity: 0.2;
+ z-index: 0;
+ text-align: right;
+ font-weight: 900;
+ font-size: 36upx;
+}
+
+.cu-bar.justify-center .action.border-title text:last-child,
+.cu-bar.justify-center .action.sub-title text:last-child {
+ left: 0;
+ right: 0;
+ margin: auto;
+ text-align: center;
+}
+
+.cu-bar .action:first-child {
+ margin-left: 30upx;
+ font-size: 30upx;
+}
+
+.cu-bar .action text.text-cut {
+ text-align: left;
+ width: 100%;
+}
+
+.cu-bar .cu-avatar:first-child {
+ margin-left: 20upx;
+}
+
+.cu-bar .action:first-child>text[class*="cuIcon-"] {
+ margin-left: -0.3em;
+ margin-right: 0.3em;
+}
+
+.cu-bar .action:last-child {
+ margin-right: 30upx;
+}
+
+.cu-bar .action>text[class*="cuIcon-"],
+.cu-bar .action>view[class*="cuIcon-"] {
+ font-size: 36upx;
+}
+
+.cu-bar .action>text[class*="cuIcon-"]+text[class*="cuIcon-"] {
+ margin-left: 0.5em;
+}
+
+.cu-bar .content {
+ position: absolute;
+ text-align: center;
+ width: calc(100% - 340upx);
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ margin: auto;
+ height: 60upx;
+ font-size: 32upx;
+ line-height: 60upx;
+ cursor: none;
+ pointer-events: none;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+.cu-bar.ios .content {
+ bottom: 7px;
+ height: 30px;
+ font-size: 32upx;
+ line-height: 30px;
+}
+
+.cu-bar.btn-group {
+ justify-content: space-around;
+}
+
+.cu-bar.btn-group button {
+ padding: 20upx 32upx;
+}
+
+.cu-bar.btn-group button {
+ flex: 1;
+ margin: 0 20upx;
+ max-width: 50%;
+}
+
+.cu-bar .search-form {
+ background-color: #f5f5f5;
+ line-height: 64upx;
+ height: 64upx;
+ font-size: 24upx;
+ color: #333333;
+ flex: 1;
+ display: flex;
+ align-items: center;
+ margin: 0 30upx;
+}
+
+.cu-bar .search-form+.action {
+ margin-right: 30upx;
+}
+
+.cu-bar .search-form input {
+ flex: 1;
+ padding-right: 30upx;
+ height: 64upx;
+ line-height: 64upx;
+ font-size: 26upx;
+ background-color: transparent;
+}
+
+.cu-bar .search-form [class*="cuIcon-"] {
+ margin: 0 0.5em 0 0.8em;
+}
+
+.cu-bar .search-form [class*="cuIcon-"]::before {
+ top: 0upx;
+}
+
+.cu-bar.fixed,
+.nav.fixed {
+ position: fixed;
+ width: 100%;
+ top: 0;
+ z-index: 1024;
+ box-shadow: 0 1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.foot {
+ position: fixed;
+ width: 100%;
+ bottom: 0;
+ z-index: 1024;
+ box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.tabbar {
+ padding: 0;
+ height: calc(100upx + env(safe-area-inset-bottom) / 2);
+ padding-bottom: calc(env(safe-area-inset-bottom) / 2);
+}
+
+.cu-tabbar-height {
+ min-height: 100upx;
+ height: calc(100upx + env(safe-area-inset-bottom) / 2);
+}
+
+.cu-bar.tabbar.shadow {
+ box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.tabbar .action {
+ font-size: 22upx;
+ position: relative;
+ flex: 1;
+ text-align: center;
+ padding: 0;
+ display: block;
+ height: auto;
+ line-height: 1;
+ margin: 0;
+ background-color: inherit;
+ overflow: initial;
+}
+
+.cu-bar.tabbar.shop .action {
+ width: 140upx;
+ flex: initial;
+}
+
+.cu-bar.tabbar .action.add-action {
+ position: relative;
+ z-index: 2;
+ padding-top: 50upx;
+}
+
+.cu-bar.tabbar .action.add-action [class*="cuIcon-"] {
+ position: absolute;
+ width: 70upx;
+ z-index: 2;
+ height: 70upx;
+ border-radius: 50%;
+ line-height: 70upx;
+ font-size: 50upx;
+ top: -35upx;
+ left: 0;
+ right: 0;
+ margin: auto;
+ padding: 0;
+}
+
+.cu-bar.tabbar .action.add-action::after {
+ content: "";
+ position: absolute;
+ width: 100upx;
+ height: 100upx;
+ top: -50upx;
+ left: 0;
+ right: 0;
+ margin: auto;
+ box-shadow: 0 -3upx 8upx rgba(0, 0, 0, 0.08);
+ border-radius: 50upx;
+ background-color: inherit;
+ z-index: 0;
+}
+
+.cu-bar.tabbar .action.add-action::before {
+ content: "";
+ position: absolute;
+ width: 100upx;
+ height: 30upx;
+ bottom: 30upx;
+ left: 0;
+ right: 0;
+ margin: auto;
+ background-color: inherit;
+ z-index: 1;
+}
+
+.cu-bar.tabbar .btn-group {
+ flex: 1;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+ padding: 0 10upx;
+}
+
+.cu-bar.tabbar button.action::after {
+ border: 0;
+}
+
+.cu-bar.tabbar .action [class*="cuIcon-"] {
+ width: 100upx;
+ position: relative;
+ display: block;
+ height: auto;
+ margin: 0 auto 10upx;
+ text-align: center;
+ font-size: 40upx;
+}
+
+.cu-bar.tabbar .action .cuIcon-cu-image {
+ margin: 0 auto;
+}
+
+.cu-bar.tabbar .action .cuIcon-cu-image image {
+ width: 50upx;
+ height: 50upx;
+ display: inline-block;
+}
+
+.cu-bar.tabbar .submit {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ text-align: center;
+ position: relative;
+ flex: 2;
+ align-self: stretch;
+}
+
+.cu-bar.tabbar .submit:last-child {
+ flex: 2.6;
+}
+
+.cu-bar.tabbar .submit+.submit {
+ flex: 2;
+}
+
+.cu-bar.tabbar.border .action::before {
+ content: " ";
+ width: 200%;
+ height: 200%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ border-right: 1upx solid rgba(0, 0, 0, 0.1);
+ z-index: 3;
+}
+
+.cu-bar.tabbar.border .action:last-child:before {
+ display: none;
+}
+
+.cu-bar.input {
+ padding-right: 20upx;
+ background-color: #ffffff;
+}
+
+.cu-bar.input input {
+ overflow: initial;
+ line-height: 64upx;
+ height: 64upx;
+ min-height: 64upx;
+ flex: 1;
+ font-size: 30upx;
+ margin: 0 20upx;
+}
+
+.cu-bar.input .action {
+ margin-left: 20upx;
+}
+
+.cu-bar.input .action [class*="cuIcon-"] {
+ font-size: 48upx;
+}
+
+.cu-bar.input input+.action {
+ margin-right: 20upx;
+ margin-left: 0upx;
+}
+
+.cu-bar.input .action:first-child [class*="cuIcon-"] {
+ margin-left: 0upx;
+}
+
+.cu-custom {
+ display: block;
+ position: relative;
+}
+
+.cu-custom .cu-bar .content {
+ width: calc(100% - 440upx);
+}
+
+/* #ifdef MP-ALIPAY */
+.cu-custom .cu-bar .action .cuIcon-back {
+ opacity: 0;
+}
+
+/* #endif */
+
+.cu-custom .cu-bar .content image {
+ height: 60upx;
+ width: 240upx;
+}
+
+.cu-custom .cu-bar {
+ min-height: 0px;
+ /* #ifdef MP-WEIXIN */
+ padding-right: 220upx;
+ /* #endif */
+ /* #ifdef MP-ALIPAY */
+ padding-right: 150upx;
+ /* #endif */
+ box-shadow: 0upx 0upx 0upx;
+ z-index: 9999;
+}
+
+.cu-custom .cu-bar .border-custom {
+ position: relative;
+ background: rgba(0, 0, 0, 0.15);
+ border-radius: 1000upx;
+ height: 30px;
+}
+
+.cu-custom .cu-bar .border-custom::after {
+ content: " ";
+ width: 200%;
+ height: 200%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border-radius: inherit;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ pointer-events: none;
+ box-sizing: border-box;
+ border: 1upx solid #ffffff;
+ opacity: 0.5;
+}
+
+.cu-custom .cu-bar .border-custom::before {
+ content: " ";
+ width: 1upx;
+ height: 110%;
+ position: absolute;
+ top: 22.5%;
+ left: 0;
+ right: 0;
+ margin: auto;
+ transform: scale(0.5);
+ transform-origin: 0 0;
+ pointer-events: none;
+ box-sizing: border-box;
+ opacity: 0.6;
+ background-color: #ffffff;
+}
+
+.cu-custom .cu-bar .border-custom text {
+ display: block;
+ flex: 1;
+ margin: auto !important;
+ text-align: center;
+ font-size: 34upx;
+}
+
+/* ==================
+ 导航栏
+ ==================== */
+
+.nav {
+ white-space: nowrap;
+}
+
+::-webkit-scrollbar {
+ display: none;
+}
+
+.nav .cu-item {
+ height: 90upx;
+ display: inline-block;
+ line-height: 90upx;
+ margin: 0 10upx;
+ padding: 0 20upx;
+}
+
+.nav .cu-item.cur {
+ border-bottom: 4upx solid;
+}
+
+/* ==================
+ 时间轴
+ ==================== */
+
+.cu-timeline {
+ display: block;
+ background-color: #ffffff;
+}
+
+.cu-timeline .cu-time {
+ width: 120upx;
+ text-align: center;
+ padding: 20upx 0;
+ font-size: 26upx;
+ color: #888;
+ display: block;
+}
+
+.cu-timeline>.cu-item {
+ padding: 30upx 30upx 30upx 120upx;
+ position: relative;
+ display: block;
+ z-index: 0;
+}
+
+.cu-timeline>.cu-item:not([class*="text-"]) {
+ color: #ccc;
+}
+
+.cu-timeline>.cu-item::after {
+ content: "";
+ display: block;
+ position: absolute;
+ width: 1upx;
+ background-color: #ddd;
+ left: 60upx;
+ height: 100%;
+ top: 0;
+ z-index: 8;
+}
+
+.cu-timeline>.cu-item::before {
+ font-family: "cuIcon";
+ display: block;
+ position: absolute;
+ top: 36upx;
+ z-index: 9;
+ background-color: #ffffff;
+ width: 50upx;
+ height: 50upx;
+ text-align: center;
+ border: none;
+ line-height: 50upx;
+ left: 36upx;
+}
+
+.cu-timeline>.cu-item:not([class*="cuIcon-"])::before {
+ content: "\e763";
+}
+
+.cu-timeline>.cu-item[class*="cuIcon-"]::before {
+ background-color: #ffffff;
+ width: 50upx;
+ height: 50upx;
+ text-align: center;
+ border: none;
+ line-height: 50upx;
+ left: 36upx;
+}
+
+.cu-timeline>.cu-item>.content {
+ padding: 30upx;
+ border-radius: 6upx;
+ display: block;
+ line-height: 1.6;
+}
+
+.cu-timeline>.cu-item>.content:not([class*="bg-"]) {
+ background-color: #f1f1f1;
+ color: #333333;
+}
+
+.cu-timeline>.cu-item>.content+.content {
+ margin-top: 20upx;
+}
+
+/* ==================
+ 聊天
+ ==================== */
+
+.cu-chat {
+ display: flex;
+ flex-direction: column;
+}
+
+.cu-chat .cu-item {
+ display: flex;
+ padding: 30upx 30upx 70upx;
+ position: relative;
+}
+
+.cu-chat .cu-item>.cu-avatar {
+ width: 80upx;
+ height: 80upx;
+}
+
+.cu-chat .cu-item>.main {
+ max-width: calc(100% - 260upx);
+ margin: 0 40upx;
+ display: flex;
+ align-items: center;
+}
+
+.cu-chat .cu-item>image {
+ height: 320upx;
+}
+
+.cu-chat .cu-item>.main .content {
+ padding: 20upx;
+ border-radius: 6upx;
+ display: inline-flex;
+ max-width: 100%;
+ align-items: center;
+ font-size: 30upx;
+ position: relative;
+ min-height: 80upx;
+ line-height: 40upx;
+ text-align: left;
+}
+
+.cu-chat .cu-item>.main .content:not([class*="bg-"]) {
+ background-color: #ffffff;
+ color: #333333;
+}
+
+.cu-chat .cu-item .date {
+ position: absolute;
+ font-size: 24upx;
+ color: #8799a3;
+ width: calc(100% - 320upx);
+ bottom: 20upx;
+ left: 160upx;
+}
+
+.cu-chat .cu-item .action {
+ padding: 0 30upx;
+ display: flex;
+ align-items: center;
+}
+
+.cu-chat .cu-item>.main .content::after {
+ content: "";
+ top: 27upx;
+ transform: rotate(45deg);
+ position: absolute;
+ z-index: 100;
+ display: inline-block;
+ overflow: hidden;
+ width: 24upx;
+ height: 24upx;
+ left: -12upx;
+ right: initial;
+ background-color: inherit;
+}
+
+.cu-chat .cu-item.self>.main .content::after {
+ left: auto;
+ right: -12upx;
+}
+
+.cu-chat .cu-item>.main .content::before {
+ content: "";
+ top: 30upx;
+ transform: rotate(45deg);
+ position: absolute;
+ z-index: -1;
+ display: inline-block;
+ overflow: hidden;
+ width: 24upx;
+ height: 24upx;
+ left: -12upx;
+ right: initial;
+ background-color: inherit;
+ filter: blur(5upx);
+ opacity: 0.3;
+}
+
+.cu-chat .cu-item>.main .content:not([class*="bg-"])::before {
+ background-color: #333333;
+ opacity: 0.1;
+}
+
+.cu-chat .cu-item.self>.main .content::before {
+ left: auto;
+ right: -12upx;
+}
+
+.cu-chat .cu-item.self {
+ justify-content: flex-end;
+ text-align: right;
+}
+
+.cu-chat .cu-info {
+ display: inline-block;
+ margin: 20upx auto;
+ font-size: 24upx;
+ padding: 8upx 12upx;
+ background-color: rgba(0, 0, 0, 0.2);
+ border-radius: 6upx;
+ color: #ffffff;
+ max-width: 400upx;
+ line-height: 1.4;
+}
+
+/* ==================
+ 卡片
+ ==================== */
+
+.cu-card {
+ display: block;
+ overflow: hidden;
+}
+
+.cu-card>.cu-item {
+ display: block;
+ background-color: #ffffff;
+ overflow: hidden;
+ border-radius: 10upx;
+ margin: 30upx;
+}
+
+.cu-card>.cu-item.shadow-blur {
+ overflow: initial;
+}
+
+.cu-card.no-card>.cu-item {
+ margin: 0upx;
+ border-radius: 0upx;
+}
+
+.cu-card .grid.grid-square {
+ margin-bottom: -20upx;
+}
+
+.cu-card.case .image {
+ position: relative;
+}
+
+.cu-card.case .image image {
+ width: 100%;
+}
+
+.cu-card.case .image .cu-tag {
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+
+.cu-card.case .image .cu-bar {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ background-color: transparent;
+ padding: 0upx 30upx;
+}
+
+.cu-card.case.no-card .image {
+ margin: 30upx 30upx 0;
+ overflow: hidden;
+ border-radius: 10upx;
+}
+
+.cu-card.dynamic {
+ display: block;
+}
+
+.cu-card.dynamic>.cu-item {
+ display: block;
+ background-color: #ffffff;
+ overflow: hidden;
+}
+
+.cu-card.dynamic>.cu-item>.text-content {
+ padding: 0 30upx 0;
+ max-height: 6.4em;
+ overflow: hidden;
+ font-size: 30upx;
+ margin-bottom: 20upx;
+}
+
+.cu-card.dynamic>.cu-item .square-img {
+ width: 100%;
+ height: 200upx;
+ border-radius: 6upx;
+}
+
+.cu-card.dynamic>.cu-item .only-img {
+ width: 100%;
+ height: 320upx;
+ border-radius: 6upx;
+}
+
+/* card.dynamic>.cu-item .comment {
+ padding: 20upx;
+ background-color: #f1f1f1;
+ margin: 0 30upx 30upx;
+ border-radius: 6upx;
+} */
+
+.cu-card.article {
+ display: block;
+}
+
+.cu-card.article>.cu-item {
+ padding-bottom: 30upx;
+}
+
+.cu-card.article>.cu-item .title {
+ font-size: 30upx;
+ font-weight: 900;
+ color: #333333;
+ line-height: 100upx;
+ padding: 0 30upx;
+}
+
+.cu-card.article>.cu-item .content {
+ display: flex;
+ padding: 0 30upx;
+}
+
+.cu-card.article>.cu-item .content>image {
+ width: 240upx;
+ height: 6.4em;
+ margin-right: 20upx;
+ border-radius: 6upx;
+}
+
+.cu-card.article>.cu-item .content .desc {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+
+.cu-card.article>.cu-item .content .text-content {
+ font-size: 28upx;
+ color: #888;
+ height: 4.8em;
+ overflow: hidden;
+}
+
+/* ==================
+ 表单
+ ==================== */
+
+.cu-form-group {
+ background-color: #ffffff;
+ padding: 1upx 30upx;
+ display: flex;
+ align-items: center;
+ min-height: 100upx;
+ justify-content: space-between;
+}
+
+.cu-form-group+.cu-form-group {
+ border-top: 1upx solid #eee;
+}
+
+.cu-form-group .title {
+ text-align: justify;
+ padding-right: 30upx;
+ font-size: 30upx;
+ position: relative;
+ height: 60upx;
+ line-height: 60upx;
+}
+
+.cu-form-group input {
+ flex: 1;
+ font-size: 30upx;
+ color: #555;
+ padding-right: 20upx;
+}
+
+.cu-form-group>text[class*="cuIcon-"] {
+ font-size: 36upx;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+.cu-form-group textarea {
+ margin: 32upx 0 30upx;
+ height: 4.6em;
+ width: 100%;
+ line-height: 1.2em;
+ flex: 1;
+ font-size: 28upx;
+ padding: 0;
+}
+
+.cu-form-group.align-start .title {
+ height: 1em;
+ margin-top: 32upx;
+ line-height: 1em;
+}
+
+.cu-form-group picker {
+ flex: 1;
+ padding-right: 40upx;
+ overflow: hidden;
+ position: relative;
+}
+
+.cu-form-group picker .picker {
+ line-height: 100upx;
+ font-size: 28upx;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ width: 100%;
+ text-align: right;
+}
+
+.cu-form-group picker::after {
+ font-family: cuIcon;
+ display: block;
+ content: "\e6a3";
+ position: absolute;
+ font-size: 34upx;
+ color: #8799a3;
+ line-height: 100upx;
+ width: 60upx;
+ text-align: center;
+ top: 0;
+ bottom: 0;
+ right: -20upx;
+ margin: auto;
+}
+
+.cu-form-group textarea[disabled],
+.cu-form-group textarea[disabled] .placeholder {
+ color: transparent;
+}
+
+/* ==================
+ 模态窗口
+ ==================== */
+
+.cu-modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1110;
+ opacity: 0;
+ outline: 0;
+ text-align: center;
+ -ms-transform: scale(1.185);
+ transform: scale(1.185);
+ backface-visibility: hidden;
+ perspective: 2000upx;
+ background: rgba(0, 0, 0, 0.6);
+ transition: all 0.3s ease-in-out 0s;
+ pointer-events: none;
+}
+
+.cu-modal::before {
+ content: "\200B";
+ display: inline-block;
+ height: 100%;
+ vertical-align: middle;
+}
+
+.cu-modal.show {
+ opacity: 1;
+ transition-duration: 0.3s;
+ -ms-transform: scale(1);
+ transform: scale(1);
+ overflow-x: hidden;
+ overflow-y: auto;
+ pointer-events: auto;
+}
+
+.cu-dialog {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: auto;
+ margin-right: auto;
+ width: 680upx;
+ max-width: 100%;
+ background-color: #f8f8f8;
+ border-radius: 10upx;
+ overflow: hidden;
+}
+
+.cu-modal.bottom-modal::before {
+ vertical-align: bottom;
+}
+
+.cu-modal.bottom-modal .cu-dialog {
+ width: 100%;
+ border-radius: 0;
+}
+
+.cu-modal.bottom-modal {
+ margin-bottom: -1000upx;
+}
+
+.cu-modal.bottom-modal.show {
+ margin-bottom: 0;
+}
+
+.cu-modal.drawer-modal {
+ transform: scale(1);
+ display: flex;
+}
+
+.cu-modal.drawer-modal .cu-dialog {
+ height: 100%;
+ min-width: 200upx;
+ border-radius: 0;
+ margin: initial;
+ transition-duration: 0.3s;
+}
+
+.cu-modal.drawer-modal.justify-start .cu-dialog {
+ transform: translateX(-100%);
+}
+
+.cu-modal.drawer-modal.justify-end .cu-dialog {
+ transform: translateX(100%);
+}
+
+.cu-modal.drawer-modal.show .cu-dialog {
+ transform: translateX(0%);
+}
+.cu-modal .cu-dialog>.cu-bar:first-child .action{
+ min-width: 100rpx;
+ margin-right: 0;
+ min-height: 100rpx;
+}
+/* ==================
+ 轮播
+ ==================== */
+swiper .a-swiper-dot {
+ display: inline-block;
+ width: 16upx;
+ height: 16upx;
+ background: rgba(0, 0, 0, .3);
+ border-radius: 50%;
+ vertical-align: middle;
+}
+
+swiper[class*="-dot"] .wx-swiper-dots,
+swiper[class*="-dot"] .a-swiper-dots,
+swiper[class*="-dot"] .uni-swiper-dots {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ justify-content: center;
+}
+
+swiper.square-dot .wx-swiper-dot,
+swiper.square-dot .a-swiper-dot,
+swiper.square-dot .uni-swiper-dot {
+ background-color: #ffffff;
+ opacity: 0.4;
+ width: 10upx;
+ height: 10upx;
+ border-radius: 20upx;
+ margin: 0 8upx !important;
+}
+
+swiper.square-dot .wx-swiper-dot.wx-swiper-dot-active,
+swiper.square-dot .a-swiper-dot.a-swiper-dot-active,
+swiper.square-dot .uni-swiper-dot.uni-swiper-dot-active {
+ opacity: 1;
+ width: 30upx;
+}
+
+swiper.round-dot .wx-swiper-dot,
+swiper.round-dot .a-swiper-dot,
+swiper.round-dot .uni-swiper-dot {
+ width: 10upx;
+ height: 10upx;
+ position: relative;
+ margin: 4upx 8upx !important;
+}
+
+swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active::after,
+swiper.round-dot .a-swiper-dot.a-swiper-dot-active::after,
+swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active::after {
+ content: "";
+ position: absolute;
+ width: 10upx;
+ height: 10upx;
+ top: 0upx;
+ left: 0upx;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+ background-color: #ffffff;
+ border-radius: 20upx;
+}
+
+swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active,
+swiper.round-dot .a-swiper-dot.a-swiper-dot-active,
+swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active {
+ width: 18upx;
+ height: 18upx;
+}
+
+.screen-swiper {
+ min-height: 375upx;
+}
+
+.screen-swiper image,
+.screen-swiper video,
+.swiper-item image,
+.swiper-item video {
+ width: 100%;
+ display: block;
+ height: 100%;
+ margin: 0;
+ pointer-events: none;
+}
+
+.card-swiper {
+ height: 420upx !important;
+}
+
+.card-swiper swiper-item {
+ width: 610upx !important;
+ left: 70upx;
+ box-sizing: border-box;
+ padding: 40upx 0upx 70upx;
+ overflow: initial;
+}
+
+.card-swiper swiper-item .swiper-item {
+ width: 100%;
+ display: block;
+ height: 100%;
+ border-radius: 10upx;
+ transform: scale(0.9);
+ transition: all 0.2s ease-in 0s;
+ overflow: hidden;
+}
+
+.card-swiper swiper-item.cur .swiper-item {
+ transform: none;
+ transition: all 0.2s ease-in 0s;
+}
+
+
+.tower-swiper {
+ height: 420upx;
+ position: relative;
+ max-width: 750upx;
+ overflow: hidden;
+}
+
+.tower-swiper .tower-item {
+ position: absolute;
+ width: 300upx;
+ height: 380upx;
+ top: 0;
+ bottom: 0;
+ left: 50%;
+ margin: auto;
+ transition: all 0.2s ease-in 0s;
+ opacity: 1;
+}
+
+.tower-swiper .tower-item.none {
+ opacity: 0;
+}
+
+.tower-swiper .tower-item .swiper-item {
+ width: 100%;
+ height: 100%;
+ border-radius: 6upx;
+ overflow: hidden;
+}
+
+/* ==================
+ 步骤条
+ ==================== */
+
+.cu-steps {
+ display: flex;
+}
+
+scroll-view.cu-steps {
+ display: block;
+ white-space: nowrap;
+}
+
+scroll-view.cu-steps .cu-item {
+ display: inline-block;
+}
+
+.cu-steps .cu-item {
+ flex: 1;
+ text-align: center;
+ position: relative;
+ min-width: 100upx;
+}
+
+.cu-steps .cu-item:not([class*="text-"]) {
+ color: #8799a3;
+}
+
+.cu-steps .cu-item [class*="cuIcon-"],
+.cu-steps .cu-item .num {
+ display: block;
+ font-size: 40upx;
+ line-height: 80upx;
+}
+
+.cu-steps .cu-item::before,
+.cu-steps .cu-item::after,
+.cu-steps.steps-arrow .cu-item::before,
+.cu-steps.steps-arrow .cu-item::after {
+ content: "";
+ display: block;
+ position: absolute;
+ height: 0px;
+ width: calc(100% - 80upx);
+ border-bottom: 1px solid #ccc;
+ left: calc(0px - (100% - 80upx) / 2);
+ top: 40upx;
+ z-index: 0;
+}
+
+.cu-steps.steps-arrow .cu-item::before,
+.cu-steps.steps-arrow .cu-item::after {
+ content: "\e6a3";
+ font-family: 'cuIcon';
+ height: 30upx;
+ border-bottom-width: 0px;
+ line-height: 30upx;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ color: #ccc;
+}
+
+.cu-steps.steps-bottom .cu-item::before,
+.cu-steps.steps-bottom .cu-item::after {
+ bottom: 40upx;
+ top: initial;
+}
+
+.cu-steps .cu-item::after {
+ border-bottom: 1px solid currentColor;
+ width: 0px;
+ transition: all 0.3s ease-in-out 0s;
+}
+
+.cu-steps .cu-item[class*="text-"]::after {
+ width: calc(100% - 80upx);
+ color: currentColor;
+}
+
+.cu-steps .cu-item:first-child::before,
+.cu-steps .cu-item:first-child::after {
+ display: none;
+}
+
+.cu-steps .cu-item .num {
+ width: 40upx;
+ height: 40upx;
+ border-radius: 50%;
+ line-height: 40upx;
+ margin: 20upx auto;
+ font-size: 24upx;
+ border: 1px solid currentColor;
+ position: relative;
+ overflow: hidden;
+}
+
+.cu-steps .cu-item[class*="text-"] .num {
+ background-color: currentColor;
+}
+
+.cu-steps .cu-item .num::before,
+.cu-steps .cu-item .num::after {
+ content: attr(data-index);
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ transition: all 0.3s ease-in-out 0s;
+ transform: translateY(0upx);
+}
+
+.cu-steps .cu-item[class*="text-"] .num::before {
+ transform: translateY(-40upx);
+ color: #ffffff;
+}
+
+.cu-steps .cu-item .num::after {
+ transform: translateY(40upx);
+ color: #ffffff;
+ transition: all 0.3s ease-in-out 0s;
+}
+
+.cu-steps .cu-item[class*="text-"] .num::after {
+ content: "\e645";
+ font-family: 'cuIcon';
+ color: #ffffff;
+ transform: translateY(0upx);
+}
+
+.cu-steps .cu-item[class*="text-"] .num.err::after {
+ content: "\e646";
+}
+
+/* ==================
+ 布局
+ ==================== */
+
+/* -- flex弹性布局 -- */
+
+.flex {
+ display: flex;
+}
+
+.basis-xs {
+ flex-basis: 20%;
+}
+
+.basis-sm {
+ flex-basis: 40%;
+}
+
+.basis-df {
+ flex-basis: 50%;
+}
+
+.basis-lg {
+ flex-basis: 60%;
+}
+
+.basis-xl {
+ flex-basis: 80%;
+}
+
+.flex-sub {
+ flex: 1;
+}
+
+.flex-twice {
+ flex: 2;
+}
+
+.flex-treble {
+ flex: 3;
+}
+
+.flex-direction {
+ flex-direction: column;
+}
+
+.flex-wrap {
+ flex-wrap: wrap;
+}
+
+.align-start {
+ align-items: flex-start;
+}
+
+.align-end {
+ align-items: flex-end;
+}
+
+.align-center {
+ align-items: center;
+}
+
+.align-stretch {
+ align-items: stretch;
+}
+
+.self-start {
+ align-self: flex-start;
+}
+
+.self-center {
+ align-self: flex-center;
+}
+
+.self-end {
+ align-self: flex-end;
+}
+
+.self-stretch {
+ align-self: stretch;
+}
+
+.align-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;
+}
+
+/* grid布局 */
+
+.grid {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.grid.grid-square {
+ overflow: hidden;
+}
+
+.grid.grid-square .cu-tag {
+ position: absolute;
+ right: 0;
+ top: 0;
+ border-bottom-left-radius: 6upx;
+ padding: 6upx 12upx;
+ height: auto;
+ background-color: rgba(0, 0, 0, 0.5);
+}
+
+.grid.grid-square>view>text[class*="cuIcon-"] {
+ font-size: 52upx;
+ position: absolute;
+ color: #8799a3;
+ margin: auto;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+}
+
+.grid.grid-square>view {
+ margin-right: 20upx;
+ margin-bottom: 20upx;
+ border-radius: 6upx;
+ position: relative;
+ overflow: hidden;
+}
+.grid.grid-square>view.bg-img image {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+}
+.grid.col-1.grid-square>view {
+ padding-bottom: 100%;
+ height: 0;
+ margin-right: 0;
+}
+
+.grid.col-2.grid-square>view {
+ padding-bottom: calc((100% - 20upx)/2);
+ height: 0;
+ width: calc((100% - 20upx)/2);
+}
+
+.grid.col-3.grid-square>view {
+ padding-bottom: calc((100% - 40upx)/3);
+ height: 0;
+ width: calc((100% - 40upx)/3);
+}
+
+.grid.col-4.grid-square>view {
+ padding-bottom: calc((100% - 60upx)/4);
+ height: 0;
+ width: calc((100% - 60upx)/4);
+}
+
+.grid.col-5.grid-square>view {
+ padding-bottom: calc((100% - 80upx)/5);
+ height: 0;
+ width: calc((100% - 80upx)/5);
+}
+
+.grid.col-2.grid-square>view:nth-child(2n),
+.grid.col-3.grid-square>view:nth-child(3n),
+.grid.col-4.grid-square>view:nth-child(4n),
+.grid.col-5.grid-square>view:nth-child(5n) {
+ margin-right: 0;
+}
+
+.grid.col-1>view {
+ width: 100%;
+}
+
+.grid.col-2>view {
+ width: 50%;
+}
+
+.grid.col-3>view {
+ width: 33.33%;
+}
+
+.grid.col-4>view {
+ width: 25%;
+}
+
+.grid.col-5>view {
+ width: 20%;
+}
+
+/* -- 内外边距 -- */
+
+.margin-0 {
+ margin: 0;
+}
+
+.margin-xs {
+ margin: 10upx;
+}
+
+.margin-sm {
+ margin: 20upx;
+}
+
+.margin {
+ margin: 30upx;
+}
+
+.margin-lg {
+ margin: 40upx;
+}
+
+.margin-xl {
+ margin: 50upx;
+}
+
+.margin-top-xs {
+ margin-top: 10upx;
+}
+
+.margin-top-sm {
+ margin-top: 20upx;
+}
+
+.margin-top {
+ margin-top: 30upx;
+}
+
+.margin-top-lg {
+ margin-top: 40upx;
+}
+
+.margin-top-xl {
+ margin-top: 50upx;
+}
+
+.margin-right-xs {
+ margin-right: 10upx;
+}
+
+.margin-right-sm {
+ margin-right: 20upx;
+}
+
+.margin-right {
+ margin-right: 30upx;
+}
+
+.margin-right-lg {
+ margin-right: 40upx;
+}
+
+.margin-right-xl {
+ margin-right: 50upx;
+}
+
+.margin-bottom-xs {
+ margin-bottom: 10upx;
+}
+
+.margin-bottom-sm {
+ margin-bottom: 20upx;
+}
+
+.margin-bottom {
+ margin-bottom: 30upx;
+}
+
+.margin-bottom-lg {
+ margin-bottom: 40upx;
+}
+
+.margin-bottom-xl {
+ margin-bottom: 50upx;
+}
+
+.margin-left-xs {
+ margin-left: 10upx;
+}
+
+.margin-left-sm {
+ margin-left: 20upx;
+}
+
+.margin-left {
+ margin-left: 30upx;
+}
+
+.margin-left-lg {
+ margin-left: 40upx;
+}
+
+.margin-left-xl {
+ margin-left: 50upx;
+}
+
+.margin-lr-xs {
+ margin-left: 10upx;
+ margin-right: 10upx;
+}
+
+.margin-lr-sm {
+ margin-left: 20upx;
+ margin-right: 20upx;
+}
+
+.margin-lr {
+ margin-left: 30upx;
+ margin-right: 30upx;
+}
+
+.margin-lr-lg {
+ margin-left: 40upx;
+ margin-right: 40upx;
+}
+
+.margin-lr-xl {
+ margin-left: 50upx;
+ margin-right: 50upx;
+}
+
+.margin-tb-xs {
+ margin-top: 10upx;
+ margin-bottom: 10upx;
+}
+
+.margin-tb-sm {
+ margin-top: 20upx;
+ margin-bottom: 20upx;
+}
+
+.margin-tb {
+ margin-top: 30upx;
+ margin-bottom: 30upx;
+}
+
+.margin-tb-lg {
+ margin-top: 40upx;
+ margin-bottom: 40upx;
+}
+
+.margin-tb-xl {
+ margin-top: 50upx;
+ margin-bottom: 50upx;
+}
+
+.padding-0 {
+ padding: 0;
+}
+
+.padding-xs {
+ padding: 10upx;
+}
+
+.padding-sm {
+ padding: 20upx;
+}
+
+.padding {
+ padding: 30upx;
+}
+
+.padding-lg {
+ padding: 40upx;
+}
+
+.padding-xl {
+ padding: 50upx;
+}
+
+.padding-top-xs {
+ padding-top: 10upx;
+}
+
+.padding-top-sm {
+ padding-top: 20upx;
+}
+
+.padding-top {
+ padding-top: 30upx;
+}
+
+.padding-top-lg {
+ padding-top: 40upx;
+}
+
+.padding-top-xl {
+ padding-top: 50upx;
+}
+
+.padding-right-xs {
+ padding-right: 10upx;
+}
+
+.padding-right-sm {
+ padding-right: 20upx;
+}
+
+.padding-right {
+ padding-right: 30upx;
+}
+
+.padding-right-lg {
+ padding-right: 40upx;
+}
+
+.padding-right-xl {
+ padding-right: 50upx;
+}
+
+.padding-bottom-xs {
+ padding-bottom: 10upx;
+}
+
+.padding-bottom-sm {
+ padding-bottom: 20upx;
+}
+
+.padding-bottom {
+ padding-bottom: 30upx;
+}
+
+.padding-bottom-lg {
+ padding-bottom: 40upx;
+}
+
+.padding-bottom-xl {
+ padding-bottom: 50upx;
+}
+
+.padding-left-xs {
+ padding-left: 10upx;
+}
+
+.padding-left-sm {
+ padding-left: 20upx;
+}
+
+.padding-left {
+ padding-left: 30upx;
+}
+
+.padding-left-lg {
+ padding-left: 40upx;
+}
+
+.padding-left-xl {
+ padding-left: 50upx;
+}
+
+.padding-lr-xs {
+ padding-left: 10upx;
+ padding-right: 10upx;
+}
+
+.padding-lr-sm {
+ padding-left: 20upx;
+ padding-right: 20upx;
+}
+
+.padding-lr {
+ padding-left: 30upx;
+ padding-right: 30upx;
+}
+
+.padding-lr-lg {
+ padding-left: 40upx;
+ padding-right: 40upx;
+}
+
+.padding-lr-xl {
+ padding-left: 50upx;
+ padding-right: 50upx;
+}
+
+.padding-tb-xs {
+ padding-top: 10upx;
+ padding-bottom: 10upx;
+}
+
+.padding-tb-sm {
+ padding-top: 20upx;
+ padding-bottom: 20upx;
+}
+
+.padding-tb {
+ padding-top: 30upx;
+ padding-bottom: 30upx;
+}
+
+.padding-tb-lg {
+ padding-top: 40upx;
+ padding-bottom: 40upx;
+}
+
+.padding-tb-xl {
+ padding-top: 50upx;
+ padding-bottom: 50upx;
+}
+
+/* -- 浮动 -- */
+
+.cf::after,
+.cf::before {
+ content: " ";
+ display: table;
+}
+
+.cf::after {
+ clear: both;
+}
+
+.fl {
+ float: left;
+}
+
+.fr {
+ float: right;
+}
+
+/* ==================
+ 背景
+ ==================== */
+
+.line-red::after,
+.lines-red::after {
+ border-color: #e54d42;
+}
+
+.line-orange::after,
+.lines-orange::after {
+ border-color: #f37b1d;
+}
+
+.line-yellow::after,
+.lines-yellow::after {
+ border-color: #fbbd08;
+}
+
+.line-olive::after,
+.lines-olive::after {
+ border-color: #8dc63f;
+}
+
+.line-green::after,
+.lines-green::after {
+ border-color: #39b54a;
+}
+
+.line-cyan::after,
+.lines-cyan::after {
+ border-color: #1cbbb4;
+}
+
+.line-blue::after,
+.lines-blue::after {
+ border-color: #0081ff;
+}
+
+.line-purple::after,
+.lines-purple::after {
+ border-color: #6739b6;
+}
+
+.line-mauve::after,
+.lines-mauve::after {
+ border-color: #9c26b0;
+}
+
+.line-pink::after,
+.lines-pink::after {
+ border-color: #e03997;
+}
+
+.line-brown::after,
+.lines-brown::after {
+ border-color: #a5673f;
+}
+
+.line-grey::after,
+.lines-grey::after {
+ border-color: #8799a3;
+}
+
+.line-gray::after,
+.lines-gray::after {
+ border-color: #aaaaaa;
+}
+
+.line-black::after,
+.lines-black::after {
+ border-color: #333333;
+}
+
+.line-white::after,
+.lines-white::after {
+ border-color: #ffffff;
+}
+
+.bg-red {
+ background-color: #e54d42;
+ color: #ffffff;
+}
+
+.bg-orange {
+ background-color: #f37b1d;
+ color: #ffffff;
+}
+
+.bg-yellow {
+ background-color: #fbbd08;
+ color: #333333;
+}
+
+.bg-olive {
+ background-color: #8dc63f;
+ color: #ffffff;
+}
+
+.bg-green {
+ background-color: #39b54a;
+ color: #ffffff;
+}
+
+.bg-cyan {
+ background-color: #1cbbb4;
+ color: #ffffff;
+}
+
+.bg-blue {
+ background-color: #0081ff;
+ color: #ffffff;
+}
+
+.bg-purple {
+ background-color: #6739b6;
+ color: #ffffff;
+}
+
+.bg-mauve {
+ background-color: #9c26b0;
+ color: #ffffff;
+}
+
+.bg-pink {
+ background-color: #e03997;
+ color: #ffffff;
+}
+
+.bg-brown {
+ background-color: #a5673f;
+ color: #ffffff;
+}
+
+.bg-grey {
+ background-color: #8799a3;
+ color: #ffffff;
+}
+
+.bg-gray {
+ background-color: #f0f0f0;
+ color: #333333;
+}
+
+.bg-black {
+ background-color: #333333;
+ color: #ffffff;
+}
+
+.bg-white {
+ background-color: #ffffff;
+ color: #666666;
+}
+
+.bg-shadeTop {
+ background-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.01));
+ color: #ffffff;
+}
+
+.bg-shadeBottom {
+ background-image: linear-gradient(rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 1));
+ color: #ffffff;
+}
+
+.bg-red.light {
+ color: #e54d42;
+ background-color: #fadbd9;
+}
+
+.bg-orange.light {
+ color: #f37b1d;
+ background-color: #fde6d2;
+}
+
+.bg-yellow.light {
+ color: #fbbd08;
+ background-color: #fef2ced2;
+}
+
+.bg-olive.light {
+ color: #8dc63f;
+ background-color: #e8f4d9;
+}
+
+.bg-green.light {
+ color: #39b54a;
+ background-color: #d7f0dbff;
+}
+
+.bg-cyan.light {
+ color: #1cbbb4;
+ background-color: #d2f1f0;
+}
+
+.bg-blue.light {
+ color: #0081ff;
+ background-color: #cce6ff;
+}
+
+.bg-purple.light {
+ color: #6739b6;
+ background-color: #e1d7f0;
+}
+
+.bg-mauve.light {
+ color: #9c26b0;
+ background-color: #ebd4ef;
+}
+
+.bg-pink.light {
+ color: #e03997;
+ background-color: #f9d7ea;
+}
+
+.bg-brown.light {
+ color: #a5673f;
+ background-color: #ede1d9;
+}
+
+.bg-grey.light {
+ color: #8799a3;
+ background-color: #e7ebed;
+}
+
+.bg-gradual-red {
+ background-image: linear-gradient(45deg, #f43f3b, #ec008c);
+ color: #ffffff;
+}
+
+.bg-gradual-orange {
+ background-image: linear-gradient(45deg, #ff9700, #ed1c24);
+ color: #ffffff;
+}
+
+.bg-gradual-green {
+ background-image: linear-gradient(45deg, #39b54a, #8dc63f);
+ color: #ffffff;
+}
+
+.bg-gradual-purple {
+ background-image: linear-gradient(45deg, #9000ff, #5e00ff);
+ color: #ffffff;
+}
+
+.bg-gradual-pink {
+ background-image: linear-gradient(45deg, #ec008c, #6739b6);
+ color: #ffffff;
+}
+
+.bg-gradual-blue {
+ background-image: linear-gradient(45deg, #0081ff, #1cbbb4);
+ color: #ffffff;
+}
+
+.shadow[class*="-red"] {
+ box-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);
+}
+
+.shadow[class*="-orange"] {
+ box-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);
+}
+
+.shadow[class*="-yellow"] {
+ box-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);
+}
+
+.shadow[class*="-olive"] {
+ box-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);
+}
+
+.shadow[class*="-green"] {
+ box-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);
+}
+
+.shadow[class*="-cyan"] {
+ box-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);
+}
+
+.shadow[class*="-blue"] {
+ box-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);
+}
+
+.shadow[class*="-purple"] {
+ box-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);
+}
+
+.shadow[class*="-mauve"] {
+ box-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);
+}
+
+.shadow[class*="-pink"] {
+ box-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);
+}
+
+.shadow[class*="-brown"] {
+ box-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);
+}
+
+.shadow[class*="-grey"] {
+ box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.shadow[class*="-gray"] {
+ box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.shadow[class*="-black"] {
+ box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.shadow[class*="-white"] {
+ box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.text-shadow[class*="-red"] {
+ text-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);
+}
+
+.text-shadow[class*="-orange"] {
+ text-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);
+}
+
+.text-shadow[class*="-yellow"] {
+ text-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);
+}
+
+.text-shadow[class*="-olive"] {
+ text-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);
+}
+
+.text-shadow[class*="-green"] {
+ text-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);
+}
+
+.text-shadow[class*="-cyan"] {
+ text-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);
+}
+
+.text-shadow[class*="-blue"] {
+ text-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);
+}
+
+.text-shadow[class*="-purple"] {
+ text-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);
+}
+
+.text-shadow[class*="-mauve"] {
+ text-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);
+}
+
+.text-shadow[class*="-pink"] {
+ text-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);
+}
+
+.text-shadow[class*="-brown"] {
+ text-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);
+}
+
+.text-shadow[class*="-grey"] {
+ text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.text-shadow[class*="-gray"] {
+ text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.text-shadow[class*="-black"] {
+ text-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.bg-img {
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+.bg-mask {
+ background-color: #333333;
+ position: relative;
+}
+
+.bg-mask::after {
+ content: "";
+ border-radius: inherit;
+ width: 100%;
+ height: 100%;
+ display: block;
+ background-color: rgba(0, 0, 0, 0.4);
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+}
+
+.bg-mask view,
+.bg-mask cover-view {
+ z-index: 5;
+ position: relative;
+}
+
+.bg-video {
+ position: relative;
+}
+
+.bg-video video {
+ display: block;
+ height: 100%;
+ width: 100%;
+ -o-object-fit: cover;
+ object-fit: cover;
+ position: absolute;
+ top: 0;
+ z-index: 0;
+ pointer-events: none;
+}
+
+/* ==================
+ 文本
+ ==================== */
+
+.text-xs {
+ font-size: 20upx;
+}
+
+.text-sm {
+ font-size: 24upx;
+}
+
+.text-df {
+ font-size: 28upx;
+}
+
+.text-lg {
+ font-size: 32upx;
+}
+
+.text-xl {
+ font-size: 36upx;
+}
+
+.text-xxl {
+ font-size: 44upx;
+}
+
+.text-sl {
+ font-size: 80upx;
+}
+
+.text-xsl {
+ font-size: 120upx;
+}
+
+.text-Abc {
+ text-transform: Capitalize;
+}
+
+.text-ABC {
+ text-transform: Uppercase;
+}
+
+.text-abc {
+ text-transform: Lowercase;
+}
+
+.text-price::before {
+ content: "¥";
+ font-size: 80%;
+ margin-right: 4upx;
+}
+
+.text-cut {
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+.text-bold {
+ font-weight: bold;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.text-content {
+ line-height: 1.6;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.text-red,
+.line-red,
+.lines-red {
+ color: #e54d42;
+}
+
+.text-orange,
+.line-orange,
+.lines-orange {
+ color: #f37b1d;
+}
+
+.text-yellow,
+.line-yellow,
+.lines-yellow {
+ color: #fbbd08;
+}
+
+.text-olive,
+.line-olive,
+.lines-olive {
+ color: #8dc63f;
+}
+
+.text-green,
+.line-green,
+.lines-green {
+ color: #39b54a;
+}
+
+.text-cyan,
+.line-cyan,
+.lines-cyan {
+ color: #1cbbb4;
+}
+
+.text-blue,
+.line-blue,
+.lines-blue {
+ color: #0081ff;
+}
+
+.text-purple,
+.line-purple,
+.lines-purple {
+ color: #6739b6;
+}
+
+.text-mauve,
+.line-mauve,
+.lines-mauve {
+ color: #9c26b0;
+}
+
+.text-pink,
+.line-pink,
+.lines-pink {
+ color: #e03997;
+}
+
+.text-brown,
+.line-brown,
+.lines-brown {
+ color: #a5673f;
+}
+
+.text-grey,
+.line-grey,
+.lines-grey {
+ color: #8799a3;
+}
+
+.text-gray,
+.line-gray,
+.lines-gray {
+ color: #aaaaaa;
+}
+
+.text-black,
+.line-black,
+.lines-black {
+ color: #333333;
+}
+
+.text-white,
+.line-white,
+.lines-white {
+ color: #ffffff;
+}
diff --git a/static/scss/global.scss b/static/scss/global.scss
new file mode 100644
index 0000000..ac636bd
--- /dev/null
+++ b/static/scss/global.scss
@@ -0,0 +1,90 @@
+.text-center {
+ text-align: center;
+}
+
+.font-13 {
+ font-size: 13px;
+}
+
+.font-12 {
+ font-size: 12px;
+}
+
+.font-11 {
+ font-size: 11px;
+}
+
+.text-grey1 {
+ color: #888;
+}
+.text-grey2 {
+ color: #aaa;
+}
+
+.list-cell-arrow::before {
+ content: ' ';
+ height: 10px;
+ width: 10px;
+ border-width: 2px 2px 0 0;
+ border-color: #c0c0c0;
+ border-style: solid;
+ -webkit-transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
+ transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
+ position: absolute;
+ top: 50%;
+ margin-top: -6px;
+ right: 30rpx;
+ }
+
+ .list-cell {
+ position: relative;
+ width: 100%;
+ box-sizing: border-box;
+ background-color: #fff;
+ color: #333;
+ padding: 26rpx 30rpx;
+ }
+
+ .list-cell:first-child {
+ border-radius: 8rpx 8rpx 0 0;
+ }
+
+ .list-cell:last-child {
+ border-radius: 0 0 8rpx 8rpx;
+ }
+
+ .list-cell::after {
+ content: '';
+ position: absolute;
+ border-bottom: 1px solid #eaeef1;
+ -webkit-transform: scaleY(0.5) translateZ(0);
+ transform: scaleY(0.5) translateZ(0);
+ transform-origin: 0 100%;
+ bottom: 0;
+ right: 0;
+ left: 0;
+ pointer-events: none;
+ }
+
+
+ .menu-list {
+ margin: 15px 15px;
+
+ .menu-item-box {
+ width: 100%;
+ display: flex;
+ align-items: center;
+
+ .menu-icon {
+ color: #007AFF;
+ font-size: 16px;
+ margin-right: 5px;
+ }
+
+ .text-right {
+ margin-left: auto;
+ margin-right: 34rpx;
+ color: #999;
+ }
+ }
+ }
diff --git a/static/scss/index.scss b/static/scss/index.scss
new file mode 100644
index 0000000..745cffa
--- /dev/null
+++ b/static/scss/index.scss
@@ -0,0 +1,6 @@
+// global
+@import "./global.scss";
+// color-ui
+@import "@/static/scss/colorui.css";
+// iconfont
+@import "@/static/font/iconfont.css";
\ No newline at end of file
diff --git a/store/getters.js b/store/getters.js
new file mode 100644
index 0000000..8854794
--- /dev/null
+++ b/store/getters.js
@@ -0,0 +1,8 @@
+const getters = {
+ token: state => state.user.token,
+ avatar: state => state.user.avatar,
+ name: state => state.user.name,
+ roles: state => state.user.roles,
+ permissions: state => state.user.permissions
+}
+export default getters
diff --git a/store/index.js b/store/index.js
new file mode 100644
index 0000000..83a9db5
--- /dev/null
+++ b/store/index.js
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import user from '@/store/modules/user'
+import getters from './getters'
+
+Vue.use(Vuex)
+
+const store = new Vuex.Store({
+ modules: {
+ user
+ },
+ getters
+})
+
+export default store
diff --git a/store/modules/user.js b/store/modules/user.js
new file mode 100644
index 0000000..7d03c1a
--- /dev/null
+++ b/store/modules/user.js
@@ -0,0 +1,98 @@
+import config from '@/config'
+import storage from '@/utils/storage'
+import constant from '@/utils/constant'
+import { login, logout, getInfo } from '@/api/login'
+import { setToken, removeToken } from '@/utils/auth'
+
+const baseUrl = config.baseUrl
+
+const user = {
+ state: {
+ id: 0, // 用户编号
+ name: storage.get(constant.name),
+ avatar: storage.get(constant.avatar),
+ roles: storage.get(constant.roles),
+ permissions: storage.get(constant.permissions)
+ },
+
+ mutations: {
+ SET_ID: (state, id) => {
+ state.id = id
+ },
+ SET_NAME: (state, name) => {
+ state.name = name
+ storage.set(constant.name, name)
+ },
+ SET_AVATAR: (state, avatar) => {
+ state.avatar = avatar
+ storage.set(constant.avatar, avatar)
+ },
+ SET_ROLES: (state, roles) => {
+ state.roles = roles
+ storage.set(constant.roles, roles)
+ },
+ SET_PERMISSIONS: (state, permissions) => {
+ state.permissions = permissions
+ storage.set(constant.permissions, permissions)
+ }
+ },
+
+ actions: {
+ // 登录
+ Login({ commit }, userInfo) {
+ const username = userInfo.username.trim()
+ const password = userInfo.password
+ const captchaVerification = userInfo.captchaVerification
+ return new Promise((resolve, reject) => {
+ login(username, password, captchaVerification).then(res => {
+ res = res.data;
+ // 设置 token
+ setToken(res)
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // 获取用户信息
+ GetInfo({ commit, state }) {
+ return new Promise((resolve, reject) => {
+ getInfo().then(res => {
+ res = res.data; // 读取 data 数据
+ const user = res.user
+ const avatar = (user == null || user.avatar === "" || user.avatar == null) ? require("@/static/images/profile.jpg") : user.avatar
+ const nickname = (user == null || user.nickname === "" || user.nickname == null) ? "" : user.nickname
+ if (res.roles && res.roles.length > 0) {
+ commit('SET_ROLES', res.roles)
+ commit('SET_PERMISSIONS', res.permissions)
+ } else {
+ commit('SET_ROLES', ['ROLE_DEFAULT'])
+ }
+ commit('SET_NAME', nickname)
+ commit('SET_AVATAR', avatar)
+ resolve(res)
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // 退出系统
+ LogOut({ commit, state }) {
+ return new Promise((resolve, reject) => {
+ logout(state.token).then(() => {
+ commit('SET_ROLES', [])
+ commit('SET_PERMISSIONS', [])
+ removeToken()
+ storage.clean()
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ }
+ }
+}
+
+export default user
diff --git a/uni.scss b/uni.scss
new file mode 100644
index 0000000..1b2a720
--- /dev/null
+++ b/uni.scss
@@ -0,0 +1,66 @@
+/**
+ * uni-app内置的常用样式变量
+ */
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#e5e5e5;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16px;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;
+
+@import "@/uni_modules/vk-uview-ui/theme.scss";
\ No newline at end of file
diff --git a/uni_modules/vk-uview-ui/changelog.md b/uni_modules/vk-uview-ui/changelog.md
new file mode 100644
index 0000000..45fb7be
--- /dev/null
+++ b/uni_modules/vk-uview-ui/changelog.md
@@ -0,0 +1,152 @@
+## 1.5.2(2023-12-28)
+* 【修复】`u-input` 缺少emits选项 `confirm` 的问题
+## 1.5.1(2023-10-13)
+* 【修复】`u-parse` 在小程序上部分情况下不显示图片的问题
+* 【修复】`u-alert-tips` 使用 `closeText` 时 `close` 事件无效的问题 & 样式微调
+## 1.5.0(2023-06-01)
+* 【修复】`u-parse` 在vue3真机白屏问题和h5样式污染问题
+* 【修复】`u-select` 默认值的问题
+* 【修复】`u-parse` 在app和微信小程序中 `preview` 属性不生效的问题
+## 1.4.8(2023-05-17)
+* 【优化】部分组件属性的可选值的代码提示
+* 【优化】`u-circle-progres` 组件 在进度条到100%的时候发出一个 `finish` 事件
+* 【修复】`u-picker` 的时间选择器在ios下默认值无效的bug
+* 【修复】`u-card` 圆角问题
+* 【修复】`u-button` 支持 `info` 类型
+## 1.4.7(2023-04-24)
+* 【修复】`u-picker` 在vue3的App环境下默认值无效的bug
+## 1.4.5(2022-12-05)
+* 【修复】`u-row`、`u-col` 使用 `@click.stop` 会报错的问题,同时建议改用 `@click.native.stop` 来代替 `@click.stop`
+## 1.4.4(2022-11-12)
+* 【修复】`u-calendar` `u-modal` `u-picker` `u-popup` 组件在页面进入后马上需要弹窗时,无法正常弹窗的问题。
+## 1.4.3(2022-10-22)
+* 【优化】部分组件的细节
+## 1.4.2(2022-10-15)
+* 【修复】`1.4.1` 引出的 `u-subsection` 的部分问题
+## 1.4.1(2022-10-14)
+* 【修复】`u-count-to` 若设置了千分位符合,会错误显示-的问题
+* 【修复】`u-subsection` 部分细节问题
+## 1.4.0(2022-10-07)
+* 【修复】`u-section` 点击更多,会触发两次事件的问题
+* 【修复】`loadMore` 加载更多,icon-type为circle不会转动的问题
+* 【修复】`u-subsection` current 有转入值时,变更值,样式不更新(需用 `v-model="current"` 代替 `:current="current"`)
+## 1.3.13(2022-09-28)
+* 【修复】`u-avatar-cropper` 组件在vue3中会报错的问题。
+## 1.3.12(2022-08-30)
+* 【优化】`u-keyboard` 组件内部细节。
+## 1.3.11(2022-08-30)
+* 【修复】`u-subsection` 组件的 `list` 属性不支持动态修改的问题。
+## 1.3.10(2022-07-30)
+* 【优化】上传组件部分细节
+## 1.3.9(2022-07-07)
+* 【更新】省市区数据源
+* 【优化】`u-subsection` 组件支持在右上角显示数字角标
+```html
+
+
+
+```
+
+```js
+export default {
+ data() {
+ return {
+ list: [
+ {
+ name: '待发货',
+ num: 10
+ },
+ {
+ name: '待付款',
+ num: 5
+ },
+ {
+ name: '待评价',
+ num: 15
+ }
+ ]
+ }
+ }
+}
+```
+## 1.3.8(2022-06-13)
+* 【优化】组件 `u-icon`,使之更方便的兼容第三方icon(满足规则自动计算customPrefix)
+**规则如下:**
+* 当 `name` 中包含 `-icon-` 字符串时
+* 如 `vk-icon-goods`,则组件的 `customPrefix` 属性自动识别为 `vk-icon` ,`name`属性 自动识别为 `goods`
+* 如 `vk-2-icon-goods-list`,则组件的 `customPrefix` 属性自动识别为 `vk-2-icon` ,`name`属性 自动识别为 `goods-list`
+## 1.3.7(2022-06-10)
+* 【优化】组件 `u-action-sheet` `u-calendar` `u-dropdown-item` `u-field` `u-input` `u-keyboard` `u-modal` `u-radio-group` `u-rate` `u-search` `u-slider` `u-switch` `u-tabbar` `u-waterfall` 在 `vue3` 模式下的细节问题。
+## 1.3.6(2022-06-10)
+* 【优化】组件 `u-action-sheet` `u-calendar` `u-dropdown-item` `u-field` `u-input` `u-keyboard` `u-modal` `u-radio-group` `u-rate` `u-search` `u-slider` `u-switch` `u-tabbar` `u-waterfall` 在 `vue3` 模式下的细节问题。
+## 1.3.5(2022-05-28)
+* 【优化】组件 `u-mask` `u-popup` `u-select` `u-modal` `u-keyboard` `u-calendar` `u-action-sheet` `u-picker` 均新增 `blur` 属性,可用于设置弹出遮罩的模糊度,默认为0(不模糊)
+* ![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/49b773a3-273f-4b1c-95e8-a42dcba1a53c.png)
+## 1.3.4(2022-05-03)
+* 【修复】`u-tabs` 组件细节问题。
+## 1.1.4(2022-03-22)
+* 【修复】`u-field` 组件 `arrowDirection` 属性无效的问题。
+## 1.1.3(2022-03-21)
+* 【优化】部分细节。
+## 1.1.2(2022-03-21)
+* 【优化】部分细节。
+## 1.1.1(2022-03-17)
+* 【优化】部分细节。
+## 1.1.0(2022-03-12)
+* 【重要】`u-picker` 组件新增 `regionDiscern` 方法 智能识别省市区街道地址
+如将字符串 `浙江省杭州市西湖区希望路1333弄是啊我庭12号楼1203` 中识别为
+```json
+{
+ "province": {
+ "code": "330000",
+ "name": "浙江省"
+ },
+ "city": {
+ "code": "330100",
+ "name": "杭州市"
+ },
+ "area": {
+ "code": "330106",
+ "name": "西湖区"
+ },
+ "address": "龙井路1号",
+ "formatted_address": "浙江省杭州市西湖区龙井路1号"
+}
+```
+而组件的 `addressDiscern` 方法还可以识别收货信息,如 `张三 13888888888 上海市嘉定区希望路1333弄是啊我庭12号楼1203` 中识别姓名、手机号、地址(支持多种格式)
+## 1.0.13(2022-03-12)
+* 【优化】部分细节。
+## 1.0.12(2022-03-09)
+* 【修复】`u-radio-group` 在 vue3 模式下,设置默认值可能会无效的问题。
+## 1.0.11(2022-03-07)
+* 【优化】部分细节。
+## 1.0.10(2022-03-05)
+* 【修复】`u-radio` 中的值相等的判断 == 改为 ===
+* 【优化】部分注释的错别字。
+## 1.0.9(2022-03-03)
+* 【修复】`u-parse` 在 vue3模式下编译到app无法正常显示的问题。
+## 1.0.8(2022-02-26)
+* 【优化】`u-form` 组件新增2个属性 `inputAlign` 和 `clearable` 用于统一设置表单内所有 `u-input` 组件的对应属性默认值
+* 【优化】更新城市数据源信息
+## 1.0.7(2022-02-25)
+* 【重要】`u-picker` 组件新增 `addressDiscern` 方法 智能识别收货信息
+
+如在 `张三 13888888888 上海市嘉定区希望路1333弄是啊我庭12号楼1203` 中识别姓名、手机号、地址(支持多种格式)
+即使这样的字符串也能识别 `!!!!~~~$张三~~~上海市嘉定区希望路1333弄是啊我庭12号楼1203【【【【13888888888】`
+## 1.0.6(2022-02-24)
+* 【优化】`u-form-item` 组件的 `prop` 属性支持 a.b 形式
+## 1.0.5(2022-01-11)
+* 【修复】`u-sticky` 组件 在微信小程序中无法正常吸顶的问题
+## 1.0.4(2021-12-31)
+* 【优化】`u-dropdown-item` 组件 0和"" 无法区分的问题。
+* 【修复】`u-modal` 在Vue3版本中使用了mask-close-able属性无效的问题
+## 1.0.3(2021-12-20)
+【优化】u-icon在微信小程序下可能会显示null字符串的问题
+## 1.0.2(2021-12-09)
+* 1、【优化】`u-button` 组件新增 `timerId` 属性
+* 之前的效果是:所有按钮一定时间内只能点击1次(`共用计算时间`)导致点击按钮A后无法马上点击按钮B
+* 优化的效果是:每个按钮一定时间内只能点击1次(`分开计算时间`)且支持设置相同的 timerId 来达到指定按钮 `共用计算时间`
+## 1.0.1(2021-11-22)
+* 修复 u-parse 组件在微信小程序上的显示问题。
+## 1.0.0(2021-11-18)
+uView Vue3.0 横空出世,继承uView1.0意志,再战江湖,风云再起!by vk 2021-11-18
diff --git a/uni_modules/vk-uview-ui/components/u-action-sheet/u-action-sheet.vue b/uni_modules/vk-uview-ui/components/u-action-sheet/u-action-sheet.vue
new file mode 100644
index 0000000..c5261a1
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-action-sheet/u-action-sheet.vue
@@ -0,0 +1,246 @@
+
+
+
+ {{ tips.text }}
+
+
+
+ {{ item[labelName] }}
+
+ {{ item.subText }}
+
+
+
+
+
+ {{ cancelText }}
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-alert-tips/u-alert-tips.vue b/uni_modules/vk-uview-ui/components/u-alert-tips/u-alert-tips.vue
new file mode 100644
index 0000000..5adeefd
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-alert-tips/u-alert-tips.vue
@@ -0,0 +1,260 @@
+
+
+
+
+
+
+
+ {{title}}
+
+
+ {{description}}
+
+
+
+
+
+ {{closeText}}
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue b/uni_modules/vk-uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue
new file mode 100644
index 0000000..a48dd54
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue
@@ -0,0 +1,290 @@
+
+
+
+
+
+
+
+
+ 选择图片
+
+
+ 重新选择
+
+ 确定
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-avatar-cropper/weCropper.js b/uni_modules/vk-uview-ui/components/u-avatar-cropper/weCropper.js
new file mode 100644
index 0000000..6dac900
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-avatar-cropper/weCropper.js
@@ -0,0 +1,1256 @@
+/**
+ * we-cropper v1.3.9
+ * (c) 2020 dlhandsome
+ * @license MIT
+ */
+'use strict';
+
+var device = void 0;
+var TOUCH_STATE = ['touchstarted', 'touchmoved', 'touchended'];
+
+function firstLetterUpper(str) {
+ return str.charAt(0).toUpperCase() + str.slice(1)
+}
+
+function setTouchState(instance) {
+ var arg = [],
+ len = arguments.length - 1;
+ while (len-- > 0) arg[len] = arguments[len + 1];
+
+ TOUCH_STATE.forEach(function(key, i) {
+ if (arg[i] !== undefined) {
+ instance[key] = arg[i];
+ }
+ });
+}
+
+function validator(instance, o) {
+ Object.defineProperties(instance, o);
+}
+
+function getDevice() {
+ if (!device) {
+ device = uni.getSystemInfoSync();
+ }
+ return device
+}
+
+var tmp = {};
+
+var ref = getDevice();
+var pixelRatio = ref.pixelRatio;
+
+var DEFAULT = {
+ id: {
+ default: 'cropper',
+ get: function get() {
+ return tmp.id
+ },
+ set: function set(value) {
+ if (typeof(value) !== 'string') {
+ console.error(("id:" + value + " is invalid"));
+ }
+ tmp.id = value;
+ }
+ },
+ width: {
+ default: 750,
+ get: function get() {
+ return tmp.width
+ },
+ set: function set(value) {
+ if (typeof(value) !== 'number') {
+ console.error(("width:" + value + " is invalid"));
+ }
+ tmp.width = value;
+ }
+ },
+ height: {
+ default: 750,
+ get: function get() {
+ return tmp.height
+ },
+ set: function set(value) {
+ if (typeof(value) !== 'number') {
+ console.error(("height:" + value + " is invalid"));
+ }
+ tmp.height = value;
+ }
+ },
+ pixelRatio: {
+ default: pixelRatio,
+ get: function get() {
+ return tmp.pixelRatio
+ },
+ set: function set(value) {
+ if (typeof(value) !== 'number') {
+ console.error(("pixelRatio:" + value + " is invalid"));
+ }
+ tmp.pixelRatio = value;
+ }
+ },
+ scale: {
+ default: 2.5,
+ get: function get() {
+ return tmp.scale
+ },
+ set: function set(value) {
+ if (typeof(value) !== 'number') {
+ console.error(("scale:" + value + " is invalid"));
+ }
+ tmp.scale = value;
+ }
+ },
+ zoom: {
+ default: 5,
+ get: function get() {
+ return tmp.zoom
+ },
+ set: function set(value) {
+ if (typeof(value) !== 'number') {
+ console.error(("zoom:" + value + " is invalid"));
+ } else if (value < 0 || value > 10) {
+ console.error("zoom should be ranged in 0 ~ 10");
+ }
+ tmp.zoom = value;
+ }
+ },
+ src: {
+ default: '',
+ get: function get() {
+ return tmp.src
+ },
+ set: function set(value) {
+ if (typeof(value) !== 'string') {
+ console.error(("src:" + value + " is invalid"));
+ }
+ tmp.src = value;
+ }
+ },
+ cut: {
+ default: {},
+ get: function get() {
+ return tmp.cut
+ },
+ set: function set(value) {
+ if (typeof(value) !== 'object') {
+ console.error(("cut:" + value + " is invalid"));
+ }
+ tmp.cut = value;
+ }
+ },
+ boundStyle: {
+ default: {},
+ get: function get() {
+ return tmp.boundStyle
+ },
+ set: function set(value) {
+ if (typeof(value) !== 'object') {
+ console.error(("boundStyle:" + value + " is invalid"));
+ }
+ tmp.boundStyle = value;
+ }
+ },
+ onReady: {
+ default: null,
+ get: function get() {
+ return tmp.ready
+ },
+ set: function set(value) {
+ tmp.ready = value;
+ }
+ },
+ onBeforeImageLoad: {
+ default: null,
+ get: function get() {
+ return tmp.beforeImageLoad
+ },
+ set: function set(value) {
+ tmp.beforeImageLoad = value;
+ }
+ },
+ onImageLoad: {
+ default: null,
+ get: function get() {
+ return tmp.imageLoad
+ },
+ set: function set(value) {
+ tmp.imageLoad = value;
+ }
+ },
+ onBeforeDraw: {
+ default: null,
+ get: function get() {
+ return tmp.beforeDraw
+ },
+ set: function set(value) {
+ tmp.beforeDraw = value;
+ }
+ }
+};
+
+var ref$1 = getDevice();
+var windowWidth = ref$1.windowWidth;
+
+function prepare() {
+ var self = this;
+
+ // v1.4.0 版本中将不再自动绑定we-cropper实例
+ self.attachPage = function() {
+ var pages = getCurrentPages();
+ // 获取到当前page上下文
+ var pageContext = pages[pages.length - 1];
+ // 把this依附在Page上下文的wecropper属性上,便于在page钩子函数中访问
+ Object.defineProperty(pageContext, 'wecropper', {
+ get: function get() {
+ console.warn(
+ 'Instance will not be automatically bound to the page after v1.4.0\n\n' +
+ 'Please use a custom instance name instead\n\n' +
+ 'Example: \n' +
+ 'this.mycropper = new WeCropper(options)\n\n' +
+ '// ...\n' +
+ 'this.mycropper.getCropperImage()'
+ );
+ return self
+ },
+ configurable: true
+ });
+ };
+
+ self.createCtx = function() {
+ var id = self.id;
+ var targetId = self.targetId;
+
+ if (id) {
+ self.ctx = self.ctx || uni.createCanvasContext(id);
+ self.targetCtx = self.targetCtx || uni.createCanvasContext(targetId);
+ } else {
+ console.error("constructor: create canvas context failed, 'id' must be valuable");
+ }
+ };
+
+ self.deviceRadio = windowWidth / 750;
+}
+
+var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !==
+ 'undefined' ? self : {};
+
+
+
+
+
+function createCommonjsModule(fn, module) {
+ return module = {
+ exports: {}
+ }, fn(module, module.exports), module.exports;
+}
+
+var tools = createCommonjsModule(function(module, exports) {
+ /**
+ * String type check
+ */
+ exports.isStr = function(v) {
+ return typeof v === 'string';
+ };
+ /**
+ * Number type check
+ */
+ exports.isNum = function(v) {
+ return typeof v === 'number';
+ };
+ /**
+ * Array type check
+ */
+ exports.isArr = Array.isArray;
+ /**
+ * undefined type check
+ */
+ exports.isUndef = function(v) {
+ return v === undefined;
+ };
+
+ exports.isTrue = function(v) {
+ return v === true;
+ };
+
+ exports.isFalse = function(v) {
+ return v === false;
+ };
+ /**
+ * Function type check
+ */
+ exports.isFunc = function(v) {
+ return typeof v === 'function';
+ };
+ /**
+ * Quick object check - this is primarily used to tell
+ * Objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+ exports.isObj = exports.isObject = function(obj) {
+ return obj !== null && typeof obj === 'object'
+ };
+
+ /**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+ var _toString = Object.prototype.toString;
+ exports.isPlainObject = function(obj) {
+ return _toString.call(obj) === '[object Object]'
+ };
+
+ /**
+ * Check whether the object has the property.
+ */
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+ exports.hasOwn = function(obj, key) {
+ return hasOwnProperty.call(obj, key)
+ };
+
+ /**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+ */
+ exports.noop = function(a, b, c) {};
+
+ /**
+ * Check if val is a valid array index.
+ */
+ exports.isValidArrayIndex = function(val) {
+ var n = parseFloat(String(val));
+ return n >= 0 && Math.floor(n) === n && isFinite(val)
+ };
+});
+
+var tools_7 = tools.isFunc;
+var tools_10 = tools.isPlainObject;
+
+var EVENT_TYPE = ['ready', 'beforeImageLoad', 'beforeDraw', 'imageLoad'];
+
+function observer() {
+ var self = this;
+
+ self.on = function(event, fn) {
+ if (EVENT_TYPE.indexOf(event) > -1) {
+ if (tools_7(fn)) {
+ event === 'ready' ?
+ fn(self) :
+ self[("on" + (firstLetterUpper(event)))] = fn;
+ }
+ } else {
+ console.error(("event: " + event + " is invalid"));
+ }
+ return self
+ };
+}
+
+function wxPromise(fn) {
+ return function(obj) {
+ var args = [],
+ len = arguments.length - 1;
+ while (len-- > 0) args[len] = arguments[len + 1];
+
+ if (obj === void 0) obj = {};
+ return new Promise(function(resolve, reject) {
+ obj.success = function(res) {
+ resolve(res);
+ };
+ obj.fail = function(err) {
+ reject(err);
+ };
+ fn.apply(void 0, [obj].concat(args));
+ })
+ }
+}
+
+function draw(ctx, reserve) {
+ if (reserve === void 0) reserve = false;
+
+ return new Promise(function(resolve) {
+ ctx.draw(reserve, resolve);
+ })
+}
+
+var getImageInfo = wxPromise(uni.getImageInfo);
+
+var canvasToTempFilePath = wxPromise(uni.canvasToTempFilePath);
+
+var base64 = createCommonjsModule(function(module, exports) {
+ /*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */
+ (function(root) {
+
+ // Detect free variables `exports`.
+ var freeExports = 'object' == 'object' && exports;
+
+ // Detect free variable `module`.
+ var freeModule = 'object' == 'object' && module &&
+ module.exports == freeExports && module;
+
+ // Detect free variable `global`, from Node.js or Browserified code, and use
+ // it as `root`.
+ var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal;
+ if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
+ root = freeGlobal;
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ var InvalidCharacterError = function(message) {
+ this.message = message;
+ };
+ InvalidCharacterError.prototype = new Error;
+ InvalidCharacterError.prototype.name = 'InvalidCharacterError';
+
+ var error = function(message) {
+ // Note: the error messages used throughout this file match those used by
+ // the native `atob`/`btoa` implementation in Chromium.
+ throw new InvalidCharacterError(message);
+ };
+
+ var TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+ // http://whatwg.org/html/common-microsyntaxes.html#space-character
+ var REGEX_SPACE_CHARACTERS = /[\t\n\f\r ]/g;
+
+ // `decode` is designed to be fully compatible with `atob` as described in the
+ // HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob
+ // The optimized base64-decoding algorithm used is based on @atk’s excellent
+ // implementation. https://gist.github.com/atk/1020396
+ var decode = function(input) {
+ input = String(input)
+ .replace(REGEX_SPACE_CHARACTERS, '');
+ var length = input.length;
+ if (length % 4 == 0) {
+ input = input.replace(/==?$/, '');
+ length = input.length;
+ }
+ if (
+ length % 4 == 1 ||
+ // http://whatwg.org/C#alphanumeric-ascii-characters
+ /[^+a-zA-Z0-9/]/.test(input)
+ ) {
+ error(
+ 'Invalid character: the string to be decoded is not correctly encoded.'
+ );
+ }
+ var bitCounter = 0;
+ var bitStorage;
+ var buffer;
+ var output = '';
+ var position = -1;
+ while (++position < length) {
+ buffer = TABLE.indexOf(input.charAt(position));
+ bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer;
+ // Unless this is the first of a group of 4 characters…
+ if (bitCounter++ % 4) {
+ // …convert the first 8 bits to a single ASCII character.
+ output += String.fromCharCode(
+ 0xFF & bitStorage >> (-2 * bitCounter & 6)
+ );
+ }
+ }
+ return output;
+ };
+
+ // `encode` is designed to be fully compatible with `btoa` as described in the
+ // HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa
+ var encode = function(input) {
+ input = String(input);
+ if (/[^\0-\xFF]/.test(input)) {
+ // Note: no need to special-case astral symbols here, as surrogates are
+ // matched, and the input is supposed to only contain ASCII anyway.
+ error(
+ 'The string to be encoded contains characters outside of the ' +
+ 'Latin1 range.'
+ );
+ }
+ var padding = input.length % 3;
+ var output = '';
+ var position = -1;
+ var a;
+ var b;
+ var c;
+ var buffer;
+ // Make sure any padding is handled outside of the loop.
+ var length = input.length - padding;
+
+ while (++position < length) {
+ // Read three bytes, i.e. 24 bits.
+ a = input.charCodeAt(position) << 16;
+ b = input.charCodeAt(++position) << 8;
+ c = input.charCodeAt(++position);
+ buffer = a + b + c;
+ // Turn the 24 bits into four chunks of 6 bits each, and append the
+ // matching character for each of them to the output.
+ output += (
+ TABLE.charAt(buffer >> 18 & 0x3F) +
+ TABLE.charAt(buffer >> 12 & 0x3F) +
+ TABLE.charAt(buffer >> 6 & 0x3F) +
+ TABLE.charAt(buffer & 0x3F)
+ );
+ }
+
+ if (padding == 2) {
+ a = input.charCodeAt(position) << 8;
+ b = input.charCodeAt(++position);
+ buffer = a + b;
+ output += (
+ TABLE.charAt(buffer >> 10) +
+ TABLE.charAt((buffer >> 4) & 0x3F) +
+ TABLE.charAt((buffer << 2) & 0x3F) +
+ '='
+ );
+ } else if (padding == 1) {
+ buffer = input.charCodeAt(position);
+ output += (
+ TABLE.charAt(buffer >> 2) +
+ TABLE.charAt((buffer << 4) & 0x3F) +
+ '=='
+ );
+ }
+
+ return output;
+ };
+
+ var base64 = {
+ 'encode': encode,
+ 'decode': decode,
+ 'version': '0.1.0'
+ };
+
+ // Some AMD build optimizers, like r.js, check for specific condition patterns
+ // like the following:
+ if (
+ typeof undefined == 'function' &&
+ typeof undefined.amd == 'object' &&
+ undefined.amd
+ ) {
+ undefined(function() {
+ return base64;
+ });
+ } else if (freeExports && !freeExports.nodeType) {
+ if (freeModule) { // in Node.js or RingoJS v0.8.0+
+ freeModule.exports = base64;
+ } else { // in Narwhal or RingoJS v0.7.0-
+ for (var key in base64) {
+ base64.hasOwnProperty(key) && (freeExports[key] = base64[key]);
+ }
+ }
+ } else { // in Rhino or a web browser
+ root.base64 = base64;
+ }
+
+ }(commonjsGlobal));
+});
+
+function makeURI(strData, type) {
+ return 'data:' + type + ';base64,' + strData
+}
+
+function fixType(type) {
+ type = type.toLowerCase().replace(/jpg/i, 'jpeg');
+ var r = type.match(/png|jpeg|bmp|gif/)[0];
+ return 'image/' + r
+}
+
+function encodeData(data) {
+ var str = '';
+ if (typeof data === 'string') {
+ str = data;
+ } else {
+ for (var i = 0; i < data.length; i++) {
+ str += String.fromCharCode(data[i]);
+ }
+ }
+ return base64.encode(str)
+}
+
+/**
+ * 获取图像区域隐含的像素数据
+ * @param canvasId canvas标识
+ * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标
+ * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标
+ * @param width 将要被提取的图像数据矩形区域的宽度
+ * @param height 将要被提取的图像数据矩形区域的高度
+ * @param done 完成回调
+ */
+function getImageData(canvasId, x, y, width, height, done) {
+ uni.canvasGetImageData({
+ canvasId: canvasId,
+ x: x,
+ y: y,
+ width: width,
+ height: height,
+ success: function success(res) {
+ done(res, null);
+ },
+ fail: function fail(res) {
+ done(null, res);
+ }
+ });
+}
+
+/**
+ * 生成bmp格式图片
+ * 按照规则生成图片响应头和响应体
+ * @param oData 用来描述 canvas 区域隐含的像素数据 { data, width, height } = oData
+ * @returns {*} base64字符串
+ */
+function genBitmapImage(oData) {
+ //
+ // BITMAPFILEHEADER: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx
+ // BITMAPINFOHEADER: http://msdn.microsoft.com/en-us/library/dd183376.aspx
+ //
+ var biWidth = oData.width;
+ var biHeight = oData.height;
+ var biSizeImage = biWidth * biHeight * 3;
+ var bfSize = biSizeImage + 54; // total header size = 54 bytes
+
+ //
+ // typedef struct tagBITMAPFILEHEADER {
+ // WORD bfType;
+ // DWORD bfSize;
+ // WORD bfReserved1;
+ // WORD bfReserved2;
+ // DWORD bfOffBits;
+ // } BITMAPFILEHEADER;
+ //
+ var BITMAPFILEHEADER = [
+ // WORD bfType -- The file type signature; must be "BM"
+ 0x42, 0x4D,
+ // DWORD bfSize -- The size, in bytes, of the bitmap file
+ bfSize & 0xff, bfSize >> 8 & 0xff, bfSize >> 16 & 0xff, bfSize >> 24 & 0xff,
+ // WORD bfReserved1 -- Reserved; must be zero
+ 0, 0,
+ // WORD bfReserved2 -- Reserved; must be zero
+ 0, 0,
+ // DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.
+ 54, 0, 0, 0
+ ];
+
+ //
+ // typedef struct tagBITMAPINFOHEADER {
+ // DWORD biSize;
+ // LONG biWidth;
+ // LONG biHeight;
+ // WORD biPlanes;
+ // WORD biBitCount;
+ // DWORD biCompression;
+ // DWORD biSizeImage;
+ // LONG biXPelsPerMeter;
+ // LONG biYPelsPerMeter;
+ // DWORD biClrUsed;
+ // DWORD biClrImportant;
+ // } BITMAPINFOHEADER, *PBITMAPINFOHEADER;
+ //
+ var BITMAPINFOHEADER = [
+ // DWORD biSize -- The number of bytes required by the structure
+ 40, 0, 0, 0,
+ // LONG biWidth -- The width of the bitmap, in pixels
+ biWidth & 0xff, biWidth >> 8 & 0xff, biWidth >> 16 & 0xff, biWidth >> 24 & 0xff,
+ // LONG biHeight -- The height of the bitmap, in pixels
+ biHeight & 0xff, biHeight >> 8 & 0xff, biHeight >> 16 & 0xff, biHeight >> 24 & 0xff,
+ // WORD biPlanes -- The number of planes for the target device. This value must be set to 1
+ 1, 0,
+ // WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap
+ // has a maximum of 2^24 colors (16777216, Truecolor)
+ 24, 0,
+ // DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed
+ 0, 0, 0, 0,
+ // DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps
+ biSizeImage & 0xff, biSizeImage >> 8 & 0xff, biSizeImage >> 16 & 0xff, biSizeImage >> 24 & 0xff,
+ // LONG biXPelsPerMeter, unused
+ 0, 0, 0, 0,
+ // LONG biYPelsPerMeter, unused
+ 0, 0, 0, 0,
+ // DWORD biClrUsed, the number of color indexes of palette, unused
+ 0, 0, 0, 0,
+ // DWORD biClrImportant, unused
+ 0, 0, 0, 0
+ ];
+
+ var iPadding = (4 - ((biWidth * 3) % 4)) % 4;
+
+ var aImgData = oData.data;
+
+ var strPixelData = '';
+ var biWidth4 = biWidth << 2;
+ var y = biHeight;
+ var fromCharCode = String.fromCharCode;
+
+ do {
+ var iOffsetY = biWidth4 * (y - 1);
+ var strPixelRow = '';
+ for (var x = 0; x < biWidth; x++) {
+ var iOffsetX = x << 2;
+ strPixelRow += fromCharCode(aImgData[iOffsetY + iOffsetX + 2]) +
+ fromCharCode(aImgData[iOffsetY + iOffsetX + 1]) +
+ fromCharCode(aImgData[iOffsetY + iOffsetX]);
+ }
+
+ for (var c = 0; c < iPadding; c++) {
+ strPixelRow += String.fromCharCode(0);
+ }
+
+ strPixelData += strPixelRow;
+ } while (--y)
+
+ var strEncoded = encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) + encodeData(strPixelData);
+
+ return strEncoded
+}
+
+/**
+ * 转换为图片base64
+ * @param canvasId canvas标识
+ * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标
+ * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标
+ * @param width 将要被提取的图像数据矩形区域的宽度
+ * @param height 将要被提取的图像数据矩形区域的高度
+ * @param type 转换图片类型
+ * @param done 完成回调
+ */
+function convertToImage(canvasId, x, y, width, height, type, done) {
+ if (done === void 0) done = function() {};
+
+ if (type === undefined) {
+ type = 'png';
+ }
+ type = fixType(type);
+ if (/bmp/.test(type)) {
+ getImageData(canvasId, x, y, width, height, function(data, err) {
+ var strData = genBitmapImage(data);
+ tools_7(done) && done(makeURI(strData, 'image/' + type), err);
+ });
+ } else {
+ console.error('暂不支持生成\'' + type + '\'类型的base64图片');
+ }
+}
+
+var CanvasToBase64 = {
+ convertToImage: convertToImage,
+ // convertToPNG: function (width, height, done) {
+ // return convertToImage(width, height, 'png', done)
+ // },
+ // convertToJPEG: function (width, height, done) {
+ // return convertToImage(width, height, 'jpeg', done)
+ // },
+ // convertToGIF: function (width, height, done) {
+ // return convertToImage(width, height, 'gif', done)
+ // },
+ convertToBMP: function(ref, done) {
+ if (ref === void 0) ref = {};
+ var canvasId = ref.canvasId;
+ var x = ref.x;
+ var y = ref.y;
+ var width = ref.width;
+ var height = ref.height;
+ if (done === void 0) done = function() {};
+
+ return convertToImage(canvasId, x, y, width, height, 'bmp', done)
+ }
+};
+
+function methods() {
+ var self = this;
+
+ var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度
+ var boundHeight = self.height; // 裁剪框默认高度,即整个画布高度
+
+ var id = self.id;
+ var targetId = self.targetId;
+ var pixelRatio = self.pixelRatio;
+
+ var ref = self.cut;
+ var x = ref.x;
+ if (x === void 0) x = 0;
+ var y = ref.y;
+ if (y === void 0) y = 0;
+ var width = ref.width;
+ if (width === void 0) width = boundWidth;
+ var height = ref.height;
+ if (height === void 0) height = boundHeight;
+
+ self.updateCanvas = function(done) {
+ if (self.croperTarget) {
+ // 画布绘制图片
+ self.ctx.drawImage(
+ self.croperTarget,
+ self.imgLeft,
+ self.imgTop,
+ self.scaleWidth,
+ self.scaleHeight
+ );
+ }
+ tools_7(self.onBeforeDraw) && self.onBeforeDraw(self.ctx, self);
+
+ self.setBoundStyle(self.boundStyle); // 设置边界样式
+
+ self.ctx.draw(false, done);
+ return self
+ };
+
+ self.pushOrigin = self.pushOrign = function(src) {
+ self.src = src;
+
+ tools_7(self.onBeforeImageLoad) && self.onBeforeImageLoad(self.ctx, self);
+
+ return getImageInfo({
+ src: src
+ })
+ .then(function(res) {
+ var innerAspectRadio = res.width / res.height;
+ var customAspectRadio = width / height;
+
+ self.croperTarget = res.path;
+
+ if (innerAspectRadio < customAspectRadio) {
+ self.rectX = x;
+ self.baseWidth = width;
+ self.baseHeight = width / innerAspectRadio;
+ self.rectY = y - Math.abs((height - self.baseHeight) / 2);
+ } else {
+ self.rectY = y;
+ self.baseWidth = height * innerAspectRadio;
+ self.baseHeight = height;
+ self.rectX = x - Math.abs((width - self.baseWidth) / 2);
+ }
+
+ self.imgLeft = self.rectX;
+ self.imgTop = self.rectY;
+ self.scaleWidth = self.baseWidth;
+ self.scaleHeight = self.baseHeight;
+
+ self.update();
+
+ return new Promise(function(resolve) {
+ self.updateCanvas(resolve);
+ })
+ })
+ .then(function() {
+ tools_7(self.onImageLoad) && self.onImageLoad(self.ctx, self);
+ })
+ };
+
+ self.removeImage = function() {
+ self.src = '';
+ self.croperTarget = '';
+ return draw(self.ctx)
+ };
+
+ self.getCropperBase64 = function(done) {
+ if (done === void 0) done = function() {};
+
+ CanvasToBase64.convertToBMP({
+ canvasId: id,
+ x: x,
+ y: y,
+ width: width,
+ height: height
+ }, done);
+ };
+
+ self.getCropperImage = function(opt, fn) {
+ var customOptions = opt;
+
+ var canvasOptions = {
+ canvasId: id,
+ x: x,
+ y: y,
+ width: width,
+ height: height
+ };
+
+ var task = function() {
+ return Promise.resolve();
+ };
+
+ if (
+ tools_10(customOptions) &&
+ customOptions.original
+ ) {
+ // original mode
+ task = function() {
+ self.targetCtx.drawImage(
+ self.croperTarget,
+ self.imgLeft * pixelRatio,
+ self.imgTop * pixelRatio,
+ self.scaleWidth * pixelRatio,
+ self.scaleHeight * pixelRatio
+ );
+
+ canvasOptions = {
+ canvasId: targetId,
+ x: x * pixelRatio,
+ y: y * pixelRatio,
+ width: width * pixelRatio,
+ height: height * pixelRatio
+ };
+
+ return draw(self.targetCtx)
+ };
+ }
+
+ return task()
+ .then(function() {
+ if (tools_10(customOptions)) {
+ canvasOptions = Object.assign({}, canvasOptions, customOptions);
+ }
+
+ if (tools_7(customOptions)) {
+ fn = customOptions;
+ }
+
+ var arg = canvasOptions.componentContext ? [canvasOptions, canvasOptions.componentContext] : [canvasOptions];
+
+ return canvasToTempFilePath.apply(null, arg)
+ })
+ .then(function(res) {
+ var tempFilePath = res.tempFilePath;
+
+ return tools_7(fn) ?
+ fn.call(self, tempFilePath, null) :
+ tempFilePath
+ })
+ .catch(function(err) {
+ if (tools_7(fn)) {
+ fn.call(self, null, err);
+ } else {
+ throw err
+ }
+ })
+ };
+}
+
+/**
+ * 获取最新缩放值
+ * @param oldScale 上一次触摸结束后的缩放值
+ * @param oldDistance 上一次触摸结束后的双指距离
+ * @param zoom 缩放系数
+ * @param touch0 第一指touch对象
+ * @param touch1 第二指touch对象
+ * @returns {*}
+ */
+var getNewScale = function(oldScale, oldDistance, zoom, touch0, touch1) {
+ var xMove, yMove, newDistance;
+ // 计算二指最新距离
+ xMove = Math.round(touch1.x - touch0.x);
+ yMove = Math.round(touch1.y - touch0.y);
+ newDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove));
+
+ return oldScale + 0.001 * zoom * (newDistance - oldDistance)
+};
+
+function update() {
+ var self = this;
+
+ if (!self.src) {
+ return
+ }
+
+ self.__oneTouchStart = function(touch) {
+ self.touchX0 = Math.round(touch.x);
+ self.touchY0 = Math.round(touch.y);
+ };
+
+ self.__oneTouchMove = function(touch) {
+ var xMove, yMove;
+ // 计算单指移动的距离
+ if (self.touchended) {
+ return self.updateCanvas()
+ }
+ xMove = Math.round(touch.x - self.touchX0);
+ yMove = Math.round(touch.y - self.touchY0);
+
+ var imgLeft = Math.round(self.rectX + xMove);
+ var imgTop = Math.round(self.rectY + yMove);
+
+ self.outsideBound(imgLeft, imgTop);
+
+ self.updateCanvas();
+ };
+
+ self.__twoTouchStart = function(touch0, touch1) {
+ var xMove, yMove, oldDistance;
+
+ self.touchX1 = Math.round(self.rectX + self.scaleWidth / 2);
+ self.touchY1 = Math.round(self.rectY + self.scaleHeight / 2);
+
+ // 计算两指距离
+ xMove = Math.round(touch1.x - touch0.x);
+ yMove = Math.round(touch1.y - touch0.y);
+ oldDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove));
+
+ self.oldDistance = oldDistance;
+ };
+
+ self.__twoTouchMove = function(touch0, touch1) {
+ var oldScale = self.oldScale;
+ var oldDistance = self.oldDistance;
+ var scale = self.scale;
+ var zoom = self.zoom;
+
+ self.newScale = getNewScale(oldScale, oldDistance, zoom, touch0, touch1);
+
+ // 设定缩放范围
+ self.newScale <= 1 && (self.newScale = 1);
+ self.newScale >= scale && (self.newScale = scale);
+
+ self.scaleWidth = Math.round(self.newScale * self.baseWidth);
+ self.scaleHeight = Math.round(self.newScale * self.baseHeight);
+ var imgLeft = Math.round(self.touchX1 - self.scaleWidth / 2);
+ var imgTop = Math.round(self.touchY1 - self.scaleHeight / 2);
+
+ self.outsideBound(imgLeft, imgTop);
+
+ self.updateCanvas();
+ };
+
+ self.__xtouchEnd = function() {
+ self.oldScale = self.newScale;
+ self.rectX = self.imgLeft;
+ self.rectY = self.imgTop;
+ };
+}
+
+var handle = {
+ // 图片手势初始监测
+ touchStart: function touchStart(e) {
+ var self = this;
+ var ref = e.touches;
+ var touch0 = ref[0];
+ var touch1 = ref[1];
+
+ if (!self.src) {
+ return
+ }
+
+ setTouchState(self, true, null, null);
+
+ // 计算第一个触摸点的位置,并参照改点进行缩放
+ self.__oneTouchStart(touch0);
+
+ // 两指手势触发
+ if (e.touches.length >= 2) {
+ self.__twoTouchStart(touch0, touch1);
+ }
+ },
+
+ // 图片手势动态缩放
+ touchMove: function touchMove(e) {
+ var self = this;
+ var ref = e.touches;
+ var touch0 = ref[0];
+ var touch1 = ref[1];
+
+ if (!self.src) {
+ return
+ }
+
+ setTouchState(self, null, true);
+
+ // 单指手势时触发
+ if (e.touches.length === 1) {
+ self.__oneTouchMove(touch0);
+ }
+ // 两指手势触发
+ if (e.touches.length >= 2) {
+ self.__twoTouchMove(touch0, touch1);
+ }
+ },
+
+ touchEnd: function touchEnd(e) {
+ var self = this;
+
+ if (!self.src) {
+ return
+ }
+
+ setTouchState(self, false, false, true);
+ self.__xtouchEnd();
+ }
+};
+
+function cut() {
+ var self = this;
+ var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度
+ var boundHeight = self.height;
+ // 裁剪框默认高度,即整个画布高度
+ var ref = self.cut;
+ var x = ref.x;
+ if (x === void 0) x = 0;
+ var y = ref.y;
+ if (y === void 0) y = 0;
+ var width = ref.width;
+ if (width === void 0) width = boundWidth;
+ var height = ref.height;
+ if (height === void 0) height = boundHeight;
+
+ /**
+ * 设置边界
+ * @param imgLeft 图片左上角横坐标值
+ * @param imgTop 图片左上角纵坐标值
+ */
+ self.outsideBound = function(imgLeft, imgTop) {
+ self.imgLeft = imgLeft >= x ?
+ x :
+ self.scaleWidth + imgLeft - x <= width ?
+ x + width - self.scaleWidth :
+ imgLeft;
+
+ self.imgTop = imgTop >= y ?
+ y :
+ self.scaleHeight + imgTop - y <= height ?
+ y + height - self.scaleHeight :
+ imgTop;
+ };
+
+ /**
+ * 设置边界样式
+ * @param color 边界颜色
+ */
+ self.setBoundStyle = function(ref) {
+ if (ref === void 0) ref = {};
+ var color = ref.color;
+ if (color === void 0) color = '#04b00f';
+ var mask = ref.mask;
+ if (mask === void 0) mask = 'rgba(0, 0, 0, 0.3)';
+ var lineWidth = ref.lineWidth;
+ if (lineWidth === void 0) lineWidth = 1;
+
+ var half = lineWidth / 2;
+ var boundOption = [{
+ start: {
+ x: x - half,
+ y: y + 10 - half
+ },
+ step1: {
+ x: x - half,
+ y: y - half
+ },
+ step2: {
+ x: x + 10 - half,
+ y: y - half
+ }
+ },
+ {
+ start: {
+ x: x - half,
+ y: y + height - 10 + half
+ },
+ step1: {
+ x: x - half,
+ y: y + height + half
+ },
+ step2: {
+ x: x + 10 - half,
+ y: y + height + half
+ }
+ },
+ {
+ start: {
+ x: x + width - 10 + half,
+ y: y - half
+ },
+ step1: {
+ x: x + width + half,
+ y: y - half
+ },
+ step2: {
+ x: x + width + half,
+ y: y + 10 - half
+ }
+ },
+ {
+ start: {
+ x: x + width + half,
+ y: y + height - 10 + half
+ },
+ step1: {
+ x: x + width + half,
+ y: y + height + half
+ },
+ step2: {
+ x: x + width - 10 + half,
+ y: y + height + half
+ }
+ }
+ ];
+
+ // 绘制半透明层
+ self.ctx.beginPath();
+ self.ctx.setFillStyle(mask);
+ self.ctx.fillRect(0, 0, x, boundHeight);
+ self.ctx.fillRect(x, 0, width, y);
+ self.ctx.fillRect(x, y + height, width, boundHeight - y - height);
+ self.ctx.fillRect(x + width, 0, boundWidth - x - width, boundHeight);
+ self.ctx.fill();
+
+ boundOption.forEach(function(op) {
+ self.ctx.beginPath();
+ self.ctx.setStrokeStyle(color);
+ self.ctx.setLineWidth(lineWidth);
+ self.ctx.moveTo(op.start.x, op.start.y);
+ self.ctx.lineTo(op.step1.x, op.step1.y);
+ self.ctx.lineTo(op.step2.x, op.step2.y);
+ self.ctx.stroke();
+ });
+ };
+}
+
+var version = "1.3.9";
+
+var WeCropper = function WeCropper(params) {
+ var self = this;
+ var _default = {};
+
+ validator(self, DEFAULT);
+
+ Object.keys(DEFAULT).forEach(function(key) {
+ _default[key] = DEFAULT[key].default;
+ });
+ Object.assign(self, _default, params);
+
+ self.prepare();
+ self.attachPage();
+ self.createCtx();
+ self.observer();
+ self.cutt();
+ self.methods();
+ self.init();
+ self.update();
+
+ return self
+};
+
+WeCropper.prototype.init = function init() {
+ var self = this;
+ var src = self.src;
+
+ self.version = version;
+
+ typeof self.onReady === 'function' && self.onReady(self.ctx, self);
+
+ if (src) {
+ self.pushOrign(src);
+ } else {
+ self.updateCanvas();
+ }
+ setTouchState(self, false, false, false);
+
+ self.oldScale = 1;
+ self.newScale = 1;
+
+ return self
+};
+
+Object.assign(WeCropper.prototype, handle);
+
+WeCropper.prototype.prepare = prepare;
+WeCropper.prototype.observer = observer;
+WeCropper.prototype.methods = methods;
+WeCropper.prototype.cutt = cut;
+WeCropper.prototype.update = update;
+
+export default WeCropper;
diff --git a/uni_modules/vk-uview-ui/components/u-avatar/u-avatar.vue b/uni_modules/vk-uview-ui/components/u-avatar/u-avatar.vue
new file mode 100644
index 0000000..835c4bd
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-avatar/u-avatar.vue
@@ -0,0 +1,270 @@
+
+
+
+
+ {{ uText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-back-top/u-back-top.vue b/uni_modules/vk-uview-ui/components/u-back-top/u-back-top.vue
new file mode 100644
index 0000000..7970fc7
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-back-top/u-back-top.vue
@@ -0,0 +1,153 @@
+
+
+
+
+
+ {{tips}}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-badge/u-badge.vue b/uni_modules/vk-uview-ui/components/u-badge/u-badge.vue
new file mode 100644
index 0000000..0efa751
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-badge/u-badge.vue
@@ -0,0 +1,216 @@
+
+
+ {{showText}}
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-button/u-button.vue b/uni_modules/vk-uview-ui/components/u-button/u-button.vue
new file mode 100644
index 0000000..b5f4b0c
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-button/u-button.vue
@@ -0,0 +1,661 @@
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-calendar/u-calendar.vue b/uni_modules/vk-uview-ui/components/u-calendar/u-calendar.vue
new file mode 100644
index 0000000..ecd5219
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-calendar/u-calendar.vue
@@ -0,0 +1,666 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ showTitle }}
+
+
+
+
+
+
+
+
+ {{item}}
+
+
+
+
+
+
+
+
+ {{ index + 1 }}
+
+ {{startText}}
+ {{endText}}
+
+ {{month}}
+
+
+
+ {{mode == 'date' ? activeDate : startDate}}
+ 至{{endDate}}
+
+
+ 确定
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-car-keyboard/u-car-keyboard.vue b/uni_modules/vk-uview-ui/components/u-car-keyboard/u-car-keyboard.vue
new file mode 100644
index 0000000..e55db26
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-car-keyboard/u-car-keyboard.vue
@@ -0,0 +1,267 @@
+
+ {}">
+
+
+
+ {{ item }}
+
+
+
+
+
+
+ 中
+ /
+ 英
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-card/u-card.vue b/uni_modules/vk-uview-ui/components/u-card/u-card.vue
new file mode 100644
index 0000000..4497356
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-card/u-card.vue
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+ {{ subTitle }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-cell-group/u-cell-group.vue b/uni_modules/vk-uview-ui/components/u-cell-group/u-cell-group.vue
new file mode 100644
index 0000000..3fbca72
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-cell-group/u-cell-group.vue
@@ -0,0 +1,70 @@
+
+
+
+ {{title}}
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-cell-item/u-cell-item.vue b/uni_modules/vk-uview-ui/components/u-cell-item/u-cell-item.vue
new file mode 100644
index 0000000..90ee117
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-cell-item/u-cell-item.vue
@@ -0,0 +1,317 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+ {{ label }}
+
+
+
+
+
+ {{ value }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-checkbox-group/u-checkbox-group.vue b/uni_modules/vk-uview-ui/components/u-checkbox-group/u-checkbox-group.vue
new file mode 100644
index 0000000..18c39e7
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-checkbox-group/u-checkbox-group.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-checkbox/u-checkbox.vue b/uni_modules/vk-uview-ui/components/u-checkbox/u-checkbox.vue
new file mode 100644
index 0000000..741d47c
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-checkbox/u-checkbox.vue
@@ -0,0 +1,336 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-circle-progress/u-circle-progress.vue b/uni_modules/vk-uview-ui/components/u-circle-progress/u-circle-progress.vue
new file mode 100644
index 0000000..b5796a4
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-circle-progress/u-circle-progress.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-col/u-col.vue b/uni_modules/vk-uview-ui/components/u-col/u-col.vue
new file mode 100644
index 0000000..fc47dfa
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-col/u-col.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-collapse-item/u-collapse-item.vue b/uni_modules/vk-uview-ui/components/u-collapse-item/u-collapse-item.vue
new file mode 100644
index 0000000..963e98f
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-collapse-item/u-collapse-item.vue
@@ -0,0 +1,206 @@
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-collapse/u-collapse.vue b/uni_modules/vk-uview-ui/components/u-collapse/u-collapse.vue
new file mode 100644
index 0000000..f6e4bf0
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-collapse/u-collapse.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-column-notice/u-column-notice.vue b/uni_modules/vk-uview-ui/components/u-column-notice/u-column-notice.vue
new file mode 100644
index 0000000..709ca5c
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-column-notice/u-column-notice.vue
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-count-down/u-count-down.vue b/uni_modules/vk-uview-ui/components/u-count-down/u-count-down.vue
new file mode 100644
index 0000000..0d7cc21
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-count-down/u-count-down.vue
@@ -0,0 +1,175 @@
+
+
+
+ {{ formattedTime }}
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-count-down/utils.js b/uni_modules/vk-uview-ui/components/u-count-down/utils.js
new file mode 100644
index 0000000..8c75005
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-count-down/utils.js
@@ -0,0 +1,62 @@
+// 补0,如1 -> 01
+function padZero(num, targetLength = 2) {
+ let str = `${num}`
+ while (str.length < targetLength) {
+ str = `0${str}`
+ }
+ return str
+}
+const SECOND = 1000
+const MINUTE = 60 * SECOND
+const HOUR = 60 * MINUTE
+const DAY = 24 * HOUR
+export function parseTimeData(time) {
+ const days = Math.floor(time / DAY)
+ const hours = Math.floor((time % DAY) / HOUR)
+ const minutes = Math.floor((time % HOUR) / MINUTE)
+ const seconds = Math.floor((time % MINUTE) / SECOND)
+ const milliseconds = Math.floor(time % SECOND)
+ return {
+ days,
+ hours,
+ minutes,
+ seconds,
+ milliseconds
+ }
+}
+export function parseFormat(format, timeData) {
+ let {
+ days,
+ hours,
+ minutes,
+ seconds,
+ milliseconds
+ } = timeData
+ // 如果格式化字符串中不存在DD(天),则将天的时间转为小时中去
+ if (format.indexOf('DD') === -1) {
+ hours += days * 24
+ } else {
+ // 对天补0
+ format = format.replace('DD', padZero(days))
+ }
+ // 其他同理于DD的格式化处理方式
+ if (format.indexOf('HH') === -1) {
+ minutes += hours * 60
+ } else {
+ format = format.replace('HH', padZero(hours))
+ }
+ if (format.indexOf('mm') === -1) {
+ seconds += minutes * 60
+ } else {
+ format = format.replace('mm', padZero(minutes))
+ }
+ if (format.indexOf('ss') === -1) {
+ milliseconds += seconds * 1000
+ } else {
+ format = format.replace('ss', padZero(seconds))
+ }
+ return format.replace('SSS', padZero(milliseconds, 3))
+}
+export function isSameSecond(time1, time2) {
+ return Math.floor(time1 / 1000) === Math.floor(time2 / 1000)
+}
diff --git a/uni_modules/vk-uview-ui/components/u-count-to/u-count-to.vue b/uni_modules/vk-uview-ui/components/u-count-to/u-count-to.vue
new file mode 100644
index 0000000..1825072
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-count-to/u-count-to.vue
@@ -0,0 +1,266 @@
+
+
+ {{ displayValueCom }}
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-divider/u-divider.vue b/uni_modules/vk-uview-ui/components/u-divider/u-divider.vue
new file mode 100644
index 0000000..d09e439
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-divider/u-divider.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-dropdown-item/u-dropdown-item.vue b/uni_modules/vk-uview-ui/components/u-dropdown-item/u-dropdown-item.vue
new file mode 100644
index 0000000..f7c6c6e
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-dropdown-item/u-dropdown-item.vue
@@ -0,0 +1,166 @@
+
+ {}"
+ @tap.stop.prevent="() => {}"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-dropdown/u-dropdown.vue b/uni_modules/vk-uview-ui/components/u-dropdown/u-dropdown.vue
new file mode 100644
index 0000000..2f335ef
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-dropdown/u-dropdown.vue
@@ -0,0 +1,299 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-empty/u-empty.vue b/uni_modules/vk-uview-ui/components/u-empty/u-empty.vue
new file mode 100644
index 0000000..2c77b24
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-empty/u-empty.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-field/u-field.vue b/uni_modules/vk-uview-ui/components/u-field/u-field.vue
new file mode 100644
index 0000000..efa31e6
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-field/u-field.vue
@@ -0,0 +1,402 @@
+
+
+
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ errorMessage }}
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-form-item/u-form-item.vue b/uni_modules/vk-uview-ui/components/u-form-item/u-form-item.vue
new file mode 100644
index 0000000..8a77bd3
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-form-item/u-form-item.vue
@@ -0,0 +1,509 @@
+
+
+
+
+
+
+
+
+ *
+
+
+
+
+ {{label}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{validateMessage}}
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-form/u-form.vue b/uni_modules/vk-uview-ui/components/u-form/u-form.vue
new file mode 100644
index 0000000..1b6b13b
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-form/u-form.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-full-screen/u-full-screen.vue b/uni_modules/vk-uview-ui/components/u-full-screen/u-full-screen.vue
new file mode 100644
index 0000000..4f7e7d9
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-full-screen/u-full-screen.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-gap/u-gap.vue b/uni_modules/vk-uview-ui/components/u-gap/u-gap.vue
new file mode 100644
index 0000000..6c01f94
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-gap/u-gap.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-grid-item/u-grid-item.vue b/uni_modules/vk-uview-ui/components/u-grid-item/u-grid-item.vue
new file mode 100644
index 0000000..c5b3033
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-grid-item/u-grid-item.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-grid/u-grid.vue b/uni_modules/vk-uview-ui/components/u-grid/u-grid.vue
new file mode 100644
index 0000000..125b6f1
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-grid/u-grid.vue
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-icon/u-icon.vue b/uni_modules/vk-uview-ui/components/u-icon/u-icon.vue
new file mode 100644
index 0000000..ed95a9c
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-icon/u-icon.vue
@@ -0,0 +1,369 @@
+
+
+
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-image/u-image.vue b/uni_modules/vk-uview-ui/components/u-image/u-image.vue
new file mode 100644
index 0000000..44c760e
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-image/u-image.vue
@@ -0,0 +1,283 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-index-anchor/u-index-anchor.vue b/uni_modules/vk-uview-ui/components/u-index-anchor/u-index-anchor.vue
new file mode 100644
index 0000000..5038827
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-index-anchor/u-index-anchor.vue
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+ {{ index }}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-index-list/u-index-list.vue b/uni_modules/vk-uview-ui/components/u-index-list/u-index-list.vue
new file mode 100644
index 0000000..30fcda0
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-index-list/u-index-list.vue
@@ -0,0 +1,315 @@
+
+
+
+
+
+
+
+ {{indexList[touchmoveIndex]}}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-input/u-input.vue b/uni_modules/vk-uview-ui/components/u-input/u-input.vue
new file mode 100644
index 0000000..e932147
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-input/u-input.vue
@@ -0,0 +1,466 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-keyboard/u-keyboard.vue b/uni_modules/vk-uview-ui/components/u-keyboard/u-keyboard.vue
new file mode 100644
index 0000000..d5aee71
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-keyboard/u-keyboard.vue
@@ -0,0 +1,285 @@
+
+
+
+
+
+ {{ cancelBtn ? cancelText : "" }}
+
+
+ {{
+ tips ? tips : mode == "number" ? "数字键盘" : mode == "card" ? "身份证键盘" : "车牌号键盘"
+ }}
+
+
+ {{ confirmBtn ? confirmText : "" }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-lazy-load/u-lazy-load.vue b/uni_modules/vk-uview-ui/components/u-lazy-load/u-lazy-load.vue
new file mode 100644
index 0000000..f872922
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-lazy-load/u-lazy-load.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-line-progress/u-line-progress.vue b/uni_modules/vk-uview-ui/components/u-line-progress/u-line-progress.vue
new file mode 100644
index 0000000..77e2da2
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-line-progress/u-line-progress.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
+ {{percent + '%'}}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-line/u-line.vue b/uni_modules/vk-uview-ui/components/u-line/u-line.vue
new file mode 100644
index 0000000..c56fbc3
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-line/u-line.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-link/u-link.vue b/uni_modules/vk-uview-ui/components/u-link/u-link.vue
new file mode 100644
index 0000000..2dd2a73
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-link/u-link.vue
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-loading-page/u-loading-page.vue b/uni_modules/vk-uview-ui/components/u-loading-page/u-loading-page.vue
new file mode 100644
index 0000000..7e04401
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-loading-page/u-loading-page.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-loading/u-loading.vue b/uni_modules/vk-uview-ui/components/u-loading/u-loading.vue
new file mode 100644
index 0000000..35930a1
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-loading/u-loading.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-loadmore/u-loadmore.vue b/uni_modules/vk-uview-ui/components/u-loadmore/u-loadmore.vue
new file mode 100644
index 0000000..e7cbbea
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-loadmore/u-loadmore.vue
@@ -0,0 +1,204 @@
+
+
+
+
+
+
+
+
+
+
+ {{ showText }}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-mask/u-mask.vue b/uni_modules/vk-uview-ui/components/u-mask/u-mask.vue
new file mode 100644
index 0000000..cd33923
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-mask/u-mask.vue
@@ -0,0 +1,137 @@
+
+ {}" :class="{
+ 'u-mask-zoom': zoom,
+ 'u-mask-show': show
+ }">
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-message-input/u-message-input.vue b/uni_modules/vk-uview-ui/components/u-message-input/u-message-input.vue
new file mode 100644
index 0000000..f4b1568
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-message-input/u-message-input.vue
@@ -0,0 +1,327 @@
+
+
+
+
+
+
+
+
+
+ {{ charArr[index] ? charArr[index] : ''}}
+
+ {{ charArr[index] ? '●' : ''}}
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-modal/u-modal.vue b/uni_modules/vk-uview-ui/components/u-modal/u-modal.vue
new file mode 100644
index 0000000..bf8b4fc
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-modal/u-modal.vue
@@ -0,0 +1,339 @@
+
+
+
+
+
+ {{ title }}
+
+
+
+
+ {{ content }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-navbar/u-navbar.vue b/uni_modules/vk-uview-ui/components/u-navbar/u-navbar.vue
new file mode 100644
index 0000000..450242e
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-navbar/u-navbar.vue
@@ -0,0 +1,315 @@
+
+
+
+
+
+
+
+
+
+ {{ backText }}
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-no-network/u-no-network.vue b/uni_modules/vk-uview-ui/components/u-no-network/u-no-network.vue
new file mode 100644
index 0000000..51d9f4f
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-no-network/u-no-network.vue
@@ -0,0 +1,233 @@
+
+ {}">
+
+
+
+ {{tips}}
+
+
+
+
+ 请检查网络,或前往设置
+
+
+
+ 重试
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-notice-bar/u-notice-bar.vue b/uni_modules/vk-uview-ui/components/u-notice-bar/u-notice-bar.vue
new file mode 100644
index 0000000..f5a05a2
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-notice-bar/u-notice-bar.vue
@@ -0,0 +1,273 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-number-box/u-number-box.vue b/uni_modules/vk-uview-ui/components/u-number-box/u-number-box.vue
new file mode 100644
index 0000000..6ceecfc
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-number-box/u-number-box.vue
@@ -0,0 +1,476 @@
+
+
+
+
+ -
+
+
+
+ +
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-number-keyboard/u-number-keyboard.vue b/uni_modules/vk-uview-ui/components/u-number-keyboard/u-number-keyboard.vue
new file mode 100644
index 0000000..f2d90f2
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-number-keyboard/u-number-keyboard.vue
@@ -0,0 +1,170 @@
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-parse/u-parse.vue b/uni_modules/vk-uview-ui/components/u-parse/u-parse.vue
new file mode 100644
index 0000000..5f3ac0a
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-parse/u-parse.vue
@@ -0,0 +1,673 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-picker/u-picker.vue b/uni_modules/vk-uview-ui/components/u-picker/u-picker.vue
new file mode 100644
index 0000000..57312dc
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-picker/u-picker.vue
@@ -0,0 +1,932 @@
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+ {{ item.name }}
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+ {{ item }}
+ 年
+
+
+
+
+ {{ formatNumber(item) }}
+ 月
+
+
+
+
+ {{ formatNumber(item) }}
+ 日
+
+
+
+
+ {{ formatNumber(item) }}
+ 时
+
+
+
+
+ {{ formatNumber(item) }}
+ 分
+
+
+
+
+ {{ formatNumber(item) }}
+ 秒
+
+
+
+
+
+
+ {{ getItemValue(item, "selector") }}
+
+
+
+
+
+
+ {{ getItemValue(item1, "multiSelector") }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-popup/u-popup.vue b/uni_modules/vk-uview-ui/components/u-popup/u-popup.vue
new file mode 100644
index 0000000..53cdb68
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-popup/u-popup.vue
@@ -0,0 +1,485 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-radio-group/u-radio-group.vue b/uni_modules/vk-uview-ui/components/u-radio-group/u-radio-group.vue
new file mode 100644
index 0000000..05599af
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-radio-group/u-radio-group.vue
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-radio/u-radio.vue b/uni_modules/vk-uview-ui/components/u-radio/u-radio.vue
new file mode 100644
index 0000000..ae24fb7
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-radio/u-radio.vue
@@ -0,0 +1,277 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-rate/u-rate.vue b/uni_modules/vk-uview-ui/components/u-rate/u-rate.vue
new file mode 100644
index 0000000..6c55f01
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-rate/u-rate.vue
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-read-more/u-read-more.vue b/uni_modules/vk-uview-ui/components/u-read-more/u-read-more.vue
new file mode 100644
index 0000000..9f93350
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-read-more/u-read-more.vue
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+ {{ showMore ? openText : closeText }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-row-notice/u-row-notice.vue b/uni_modules/vk-uview-ui/components/u-row-notice/u-row-notice.vue
new file mode 100644
index 0000000..3e53278
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-row-notice/u-row-notice.vue
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
+
+ {{showText}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-row/u-row.vue b/uni_modules/vk-uview-ui/components/u-row/u-row.vue
new file mode 100644
index 0000000..bdb99d5
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-row/u-row.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-search/u-search.vue b/uni_modules/vk-uview-ui/components/u-search/u-search.vue
new file mode 100644
index 0000000..eb5fc32
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-search/u-search.vue
@@ -0,0 +1,357 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ actionText }}
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-section/u-section.vue b/uni_modules/vk-uview-ui/components/u-section/u-section.vue
new file mode 100644
index 0000000..dae0cd8
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-section/u-section.vue
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+ {{title}}
+
+
+
+
+ {{subTitle}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-select/u-select.vue b/uni_modules/vk-uview-ui/components/u-select/u-select.vue
new file mode 100644
index 0000000..27d3c9d
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-select/u-select.vue
@@ -0,0 +1,458 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item1[labelName] }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-skeleton/u-skeleton.vue b/uni_modules/vk-uview-ui/components/u-skeleton/u-skeleton.vue
new file mode 100644
index 0000000..c8cb19e
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-skeleton/u-skeleton.vue
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-slider/u-slider.vue b/uni_modules/vk-uview-ui/components/u-slider/u-slider.vue
new file mode 100644
index 0000000..0f27e8a
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-slider/u-slider.vue
@@ -0,0 +1,290 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-steps/u-steps.vue b/uni_modules/vk-uview-ui/components/u-steps/u-steps.vue
new file mode 100644
index 0000000..a72cfcf
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-steps/u-steps.vue
@@ -0,0 +1,200 @@
+
+
+
+
+
+
+ {{ index + 1 }}
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-sticky/u-sticky.vue b/uni_modules/vk-uview-ui/components/u-sticky/u-sticky.vue
new file mode 100644
index 0000000..583a22c
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-sticky/u-sticky.vue
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-subsection/u-subsection.vue b/uni_modules/vk-uview-ui/components/u-subsection/u-subsection.vue
new file mode 100644
index 0000000..7915516
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-subsection/u-subsection.vue
@@ -0,0 +1,402 @@
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-swipe-action/u-swipe-action.vue b/uni_modules/vk-uview-ui/components/u-swipe-action/u-swipe-action.vue
new file mode 100644
index 0000000..761af39
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-swipe-action/u-swipe-action.vue
@@ -0,0 +1,256 @@
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-swiper-plus/components/u-swiper-indicator.vue b/uni_modules/vk-uview-ui/components/u-swiper-plus/components/u-swiper-indicator.vue
new file mode 100644
index 0000000..ee2c8f9
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-swiper-plus/components/u-swiper-indicator.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-swiper-plus/u-swiper-plus.vue b/uni_modules/vk-uview-ui/components/u-swiper-plus/u-swiper-plus.vue
new file mode 100644
index 0000000..db9d87a
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-swiper-plus/u-swiper-plus.vue
@@ -0,0 +1,529 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-swiper/u-swiper.vue b/uni_modules/vk-uview-ui/components/u-swiper/u-swiper.vue
new file mode 100644
index 0000000..95e00d7
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-swiper/u-swiper.vue
@@ -0,0 +1,341 @@
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ uCurrent + 1 }}/{{ list.length }}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-switch/u-switch.vue b/uni_modules/vk-uview-ui/components/u-switch/u-switch.vue
new file mode 100644
index 0000000..4f16f83
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-switch/u-switch.vue
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-tabbar/u-tabbar.vue b/uni_modules/vk-uview-ui/components/u-tabbar/u-tabbar.vue
new file mode 100644
index 0000000..9685af1
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-tabbar/u-tabbar.vue
@@ -0,0 +1,375 @@
+
+ {}">
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-table/u-table.vue b/uni_modules/vk-uview-ui/components/u-table/u-table.vue
new file mode 100644
index 0000000..2bf44f0
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-table/u-table.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue b/uni_modules/vk-uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue
new file mode 100644
index 0000000..b3a35ff
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue
@@ -0,0 +1,489 @@
+
+
+
+
+
+
+ {{ item[name] || item['name']}}
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-tabs/u-tabs.vue b/uni_modules/vk-uview-ui/components/u-tabs/u-tabs.vue
new file mode 100644
index 0000000..56a193a
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-tabs/u-tabs.vue
@@ -0,0 +1,399 @@
+
+
+
+
+
+
+
+
+ {{ item[name] || item['name']}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-tag/u-tag.vue b/uni_modules/vk-uview-ui/components/u-tag/u-tag.vue
new file mode 100644
index 0000000..18ef59f
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-tag/u-tag.vue
@@ -0,0 +1,295 @@
+
+
+ {{text}}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-td/u-td.vue b/uni_modules/vk-uview-ui/components/u-td/u-td.vue
new file mode 100644
index 0000000..b00ad8b
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-td/u-td.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-th/u-th.vue b/uni_modules/vk-uview-ui/components/u-th/u-th.vue
new file mode 100644
index 0000000..c736b9b
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-th/u-th.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-time-line-item/u-time-line-item.vue b/uni_modules/vk-uview-ui/components/u-time-line-item/u-time-line-item.vue
new file mode 100644
index 0000000..be86fdc
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-time-line-item/u-time-line-item.vue
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-time-line/u-time-line.vue b/uni_modules/vk-uview-ui/components/u-time-line/u-time-line.vue
new file mode 100644
index 0000000..f3c7587
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-time-line/u-time-line.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-toast/u-toast.vue b/uni_modules/vk-uview-ui/components/u-toast/u-toast.vue
new file mode 100644
index 0000000..d219f67
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-toast/u-toast.vue
@@ -0,0 +1,220 @@
+
+
+
+
+
+ {{tmpConfig.title}}
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-top-tips/u-top-tips.vue b/uni_modules/vk-uview-ui/components/u-top-tips/u-top-tips.vue
new file mode 100644
index 0000000..98d58df
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-top-tips/u-top-tips.vue
@@ -0,0 +1,121 @@
+
+ {{ title }}
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-tr/u-tr.vue b/uni_modules/vk-uview-ui/components/u-tr/u-tr.vue
new file mode 100644
index 0000000..06aed4a
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-tr/u-tr.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/vk-uview-ui/components/u-trees/CssHandler.js b/uni_modules/vk-uview-ui/components/u-trees/CssHandler.js
new file mode 100644
index 0000000..ad3add0
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-trees/CssHandler.js
@@ -0,0 +1,100 @@
+import cfg from './config.js'
+var isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+
+function CssHandler(tagStyle) {
+ var styles = Object.assign(Object.create(null), cfg.userAgentStyles);
+ for (var item in tagStyle)
+ styles[item] = (styles[item] ? styles[item] + ';' : '') + tagStyle[item];
+ this.styles = styles;
+}
+CssHandler.prototype.getStyle = function(data) {
+ this.styles = new parser(data, this.styles).parse();
+}
+CssHandler.prototype.match = function(name, attrs) {
+ var tmp, matched = (tmp = this.styles[name]) ? tmp + ';' : '';
+ if (attrs.class) {
+ var items = attrs.class.split(' ');
+ for (var i = 0, item; item = items[i]; i++)
+ if (tmp = this.styles['.' + item])
+ matched += tmp + ';';
+ }
+ if (tmp = this.styles['#' + attrs.id])
+ matched += tmp + ';';
+ return matched;
+}
+export default CssHandler;
+
+function parser(data, init) {
+ this.data = data;
+ this.floor = 0;
+ this.i = 0;
+ this.list = [];
+ this.res = init;
+ this.state = this.Space;
+}
+parser.prototype.parse = function() {
+ for (var c; c = this.data[this.i]; this.i++)
+ this.state(c);
+ return this.res;
+}
+parser.prototype.section = function() {
+ return this.data.substring(this.start, this.i);
+}
+// 状态机
+parser.prototype.Space = function(c) {
+ if (c == '.' || c == '#' || isLetter(c)) {
+ this.start = this.i;
+ this.state = this.Name;
+ } else if (c == '/' && this.data[this.i + 1] == '*')
+ this.Comment();
+ else if (!cfg.blankChar[c] && c != ';')
+ this.state = this.Ignore;
+}
+parser.prototype.Comment = function() {
+ this.i = this.data.indexOf('*/', this.i) + 1;
+ if (!this.i) this.i = this.data.length;
+ this.state = this.Space;
+}
+parser.prototype.Ignore = function(c) {
+ if (c == '{') this.floor++;
+ else if (c == '}' && !--this.floor) {
+ this.list = [];
+ this.state = this.Space;
+ }
+}
+parser.prototype.Name = function(c) {
+ if (cfg.blankChar[c]) {
+ this.list.push(this.section());
+ this.state = this.NameSpace;
+ } else if (c == '{') {
+ this.list.push(this.section());
+ this.Content();
+ } else if (c == ',') {
+ this.list.push(this.section());
+ this.Comma();
+ } else if (!isLetter(c) && (c < '0' || c > '9') && c != '-' && c != '_')
+ this.state = this.Ignore;
+}
+parser.prototype.NameSpace = function(c) {
+ if (c == '{') this.Content();
+ else if (c == ',') this.Comma();
+ else if (!cfg.blankChar[c]) this.state = this.Ignore;
+}
+parser.prototype.Comma = function() {
+ while (cfg.blankChar[this.data[++this.i]]);
+ if (this.data[this.i] == '{') this.Content();
+ else {
+ this.start = this.i--;
+ this.state = this.Name;
+ }
+}
+parser.prototype.Content = function() {
+ this.start = ++this.i;
+ if ((this.i = this.data.indexOf('}', this.i)) == -1) this.i = this.data.length;
+ var content = this.section();
+ for (var i = 0, item; item = this.list[i++];)
+ if (this.res[item]) this.res[item] += ';' + content;
+ else this.res[item] = content;
+ this.list = [];
+ this.state = this.Space;
+}
diff --git a/uni_modules/vk-uview-ui/components/u-trees/MpHtmlParser.js b/uni_modules/vk-uview-ui/components/u-trees/MpHtmlParser.js
new file mode 100644
index 0000000..a829fab
--- /dev/null
+++ b/uni_modules/vk-uview-ui/components/u-trees/MpHtmlParser.js
@@ -0,0 +1,581 @@
+/**
+ * html 解析器
+ * @tutorial https://github.com/jin-yufeng/Parser
+ * @version 20201029
+ * @author JinYufeng
+ * @listens MIT
+ */
+import cfg from './config.js'
+import CssHandler from './CssHandler.js'
+
+var blankChar = cfg.blankChar
+var windowWidth = uni.getSystemInfoSync().windowWidth;
+var emoji;
+
+function MpHtmlParser(data, options = {}) {
+ this.attrs = {};
+ this.CssHandler = new CssHandler(options.tagStyle, windowWidth);
+ this.data = data;
+ this.domain = options.domain;
+ this.DOM = [];
+ this.i = this.start = this.audioNum = this.imgNum = this.videoNum = 0;
+ options.prot = (this.domain || '').includes('://') ? this.domain.split('://')[0] : 'http';
+ this.options = options;
+ this.state = this.Text;
+ this.STACK = [];
+ // 工具函数
+ this.bubble = () => {
+ for (var i = this.STACK.length, item; item = this.STACK[--i];) {
+ if (cfg.richOnlyTags[item.name]) return false;
+ item.c = 1;
+ }
+ return true;
+ }
+ this.decode = (val, amp) => {
+ var i = -1,
+ j, en;
+ while (1) {
+ if ((i = val.indexOf('&', i + 1)) == -1) break;
+ if ((j = val.indexOf(';', i + 2)) == -1) break;
+ if (val[i + 1] == '#') {
+ en = parseInt((val[i + 2] == 'x' ? '0' : '') + val.substring(i + 2, j));
+ if (!isNaN(en)) val = val.substr(0, i) + String.fromCharCode(en) + val.substr(j + 1);
+ } else {
+ en = val.substring(i + 1, j);
+ if (cfg.entities[en] || en == amp)
+ val = val.substr(0, i) + (cfg.entities[en] || '&') + val.substr(j + 1);
+ }
+ }
+ return val;
+ }
+ this.getUrl = url => {
+ if (url[0] == '/') {
+ if (url[1] == '/') url = this.options.prot + ':' + url;
+ else if (this.domain) url = this.domain + url;
+ } else if (this.domain && url.indexOf('data:') != 0 && !url.includes('://'))
+ url = this.domain + '/' + url;
+ return url;
+ }
+ this.isClose = () => this.data[this.i] == '>' || (this.data[this.i] == '/' && this.data[this.i + 1] == '>');
+ this.section = () => this.data.substring(this.start, this.i);
+ this.parent = () => this.STACK[this.STACK.length - 1];
+ this.siblings = () => this.STACK.length ? this.parent().children : this.DOM;
+}
+MpHtmlParser.prototype.parse = function() {
+ if (emoji) this.data = emoji.parseEmoji(this.data);
+ for (var c; c = this.data[this.i]; this.i++)
+ this.state(c);
+ if (this.state == this.Text) this.setText();
+ while (this.STACK.length) this.popNode(this.STACK.pop());
+ return this.DOM;
+}
+// 设置属性
+MpHtmlParser.prototype.setAttr = function() {
+ var name = this.attrName.toLowerCase(),
+ val = this.attrVal;
+ if (cfg.boolAttrs[name]) this.attrs[name] = 'T';
+ else if (val) {
+ if (name == 'src' || (name == 'data-src' && !this.attrs.src)) this.attrs.src = this.getUrl(this.decode(val, 'amp'));
+ else if (name == 'href' || name == 'style') this.attrs[name] = this.decode(val, 'amp');
+ else if (name.substr(0, 5) != 'data-') this.attrs[name] = val;
+ }
+ this.attrVal = '';
+ while (blankChar[this.data[this.i]]) this.i++;
+ if (this.isClose()) this.setNode();
+ else {
+ this.start = this.i;
+ this.state = this.AttrName;
+ }
+}
+// 设置文本节点
+MpHtmlParser.prototype.setText = function() {
+ var back, text = this.section();
+ if (!text) return;
+ text = (cfg.onText && cfg.onText(text, () => back = true)) || text;
+ if (back) {
+ this.data = this.data.substr(0, this.start) + text + this.data.substr(this.i);
+ let j = this.start + text.length;
+ for (this.i = this.start; this.i < j; this.i++) this.state(this.data[this.i]);
+ return;
+ }
+ if (!this.pre) {
+ // 合并空白符
+ var flag, tmp = [];
+ for (let i = text.length, c; c = text[--i];)
+ if (!blankChar[c]) {
+ tmp.unshift(c);
+ if (!flag) flag = 1;
+ } else {
+ if (tmp[0] != ' ') tmp.unshift(' ');
+ if (c == '\n' && flag == void 0) flag = 0;
+ }
+ if (flag == 0) return;
+ text = tmp.join('');
+ }
+ this.siblings().push({
+ type: 'text',
+ text: this.decode(text)
+ });
+}
+// 设置元素节点
+MpHtmlParser.prototype.setNode = function() {
+ var node = {
+ name: this.tagName.toLowerCase(),
+ attrs: this.attrs
+ },
+ close = cfg.selfClosingTags[node.name];
+ if (this.options.nodes.length) node.type = 'node';
+ this.attrs = {};
+ if (!cfg.ignoreTags[node.name]) {
+ // 处理属性
+ var attrs = node.attrs,
+ style = this.CssHandler.match(node.name, attrs, node) + (attrs.style || ''),
+ styleObj = {};
+ if (attrs.id) {
+ if (this.options.compress & 1) attrs.id = void 0;
+ else if (this.options.useAnchor) this.bubble();
+ }
+ if ((this.options.compress & 2) && attrs.class) attrs.class = void 0;
+ switch (node.name) {
+ case 'a':
+ case 'ad': // #ifdef APP-PLUS
+ case 'iframe':
+ // #endif
+ this.bubble();
+ break;
+ case 'font':
+ if (attrs.color) {
+ styleObj['color'] = attrs.color;
+ attrs.color = void 0;
+ }
+ if (attrs.face) {
+ styleObj['font-family'] = attrs.face;
+ attrs.face = void 0;
+ }
+ if (attrs.size) {
+ var size = parseInt(attrs.size);
+ if (size < 1) size = 1;
+ else if (size > 7) size = 7;
+ var map = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'];
+ styleObj['font-size'] = map[size - 1];
+ attrs.size = void 0;
+ }
+ break;
+ case 'embed':
+ // #ifndef APP-PLUS
+ var src = node.attrs.src || '',
+ type = node.attrs.type || '';
+ if (type.includes('video') || src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8'))
+ node.name = 'video';
+ else if (type.includes('audio') || src.includes('.m4a') || src.includes('.wav') || src.includes('.mp3') || src.includes(
+ '.aac'))
+ node.name = 'audio';
+ else break;
+ if (node.attrs.autostart)
+ node.attrs.autoplay = 'T';
+ node.attrs.controls = 'T';
+ // #endif
+ // #ifdef APP-PLUS
+ this.bubble();
+ break;
+ // #endif
+ case 'video':
+ case 'audio':
+ if (!attrs.id) attrs.id = node.name + (++this[`${node.name}Num`]);
+ else this[`${node.name}Num`]++;
+ if (node.name == 'video') {
+ if (this.videoNum > 3)
+ node.lazyLoad = 1;
+ if (attrs.width) {
+ styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px');
+ attrs.width = void 0;
+ }
+ if (attrs.height) {
+ styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px');
+ attrs.height = void 0;
+ }
+ }
+ if (!attrs.controls && !attrs.autoplay) attrs.controls = 'T';
+ attrs.source = [];
+ if (attrs.src) {
+ attrs.source.push(attrs.src);
+ attrs.src = void 0;
+ }
+ this.bubble();
+ break;
+ case 'td':
+ case 'th':
+ if (attrs.colspan || attrs.rowspan)
+ for (var k = this.STACK.length, item; item = this.STACK[--k];)
+ if (item.name == 'table') {
+ item.flag = 1;
+ break;
+ }
+ }
+ if (attrs.align) {
+ if (node.name == 'table') {
+ if (attrs.align == 'center') styleObj['margin-inline-start'] = styleObj['margin-inline-end'] = 'auto';
+ else styleObj['float'] = attrs.align;
+ } else styleObj['text-align'] = attrs.align;
+ attrs.align = void 0;
+ }
+ // 压缩 style
+ var styles = style.split(';');
+ style = '';
+ for (var i = 0, len = styles.length; i < len; i++) {
+ var info = styles[i].split(':');
+ if (info.length < 2) continue;
+ let key = info[0].trim().toLowerCase(),
+ value = info.slice(1).join(':').trim();
+ if (value[0] == '-' || value.includes('safe'))
+ style += `;${key}:${value}`;
+ else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import'))
+ styleObj[key] = value;
+ }
+ if (node.name == 'img') {
+ if (attrs.src && !attrs.ignore) {
+ if (this.bubble())
+ attrs.i = (this.imgNum++).toString();
+ else attrs.ignore = 'T';
+ }
+ if (attrs.ignore) {
+ style += ';-webkit-touch-callout:none';
+ styleObj['max-width'] = '100%';
+ }
+ var width;
+ if (styleObj.width) width = styleObj.width;
+ else if (attrs.width) width = attrs.width.includes('%') ? attrs.width : parseFloat(attrs.width) + 'px';
+ if (width) {
+ styleObj.width = width;
+ attrs.width = '100%';
+ if (parseInt(width) > windowWidth) {
+ styleObj.height = '';
+ if (attrs.height) attrs.height = void 0;
+ }
+ }
+ if (styleObj.height) {
+ attrs.height = styleObj.height;
+ styleObj.height = '';
+ } else if (attrs.height && !attrs.height.includes('%'))
+ attrs.height = parseFloat(attrs.height) + 'px';
+ }
+ for (var key in styleObj) {
+ var value = styleObj[key];
+ if (!value) continue;
+ if (key.includes('flex') || key == 'order' || key == 'self-align') node.c = 1;
+ // 填充链接
+ if (value.includes('url')) {
+ var j = value.indexOf('(');
+ if (j++ != -1) {
+ while (value[j] == '"' || value[j] == "'" || blankChar[value[j]]) j++;
+ value = value.substr(0, j) + this.getUrl(value.substr(j));
+ }
+ }
+ // 转换 rpx
+ else if (value.includes('rpx'))
+ value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px');
+ else if (key == 'white-space' && value.includes('pre') && !close)
+ this.pre = node.pre = true;
+ style += `;${key}:${value}`;
+ }
+ style = style.substr(1);
+ if (style) attrs.style = style;
+ if (!close) {
+ node.children = [];
+ if (node.name == 'pre' && cfg.highlight) {
+ this.remove(node);
+ this.pre = node.pre = true;
+ }
+ this.siblings().push(node);
+ this.STACK.push(node);
+ } else if (!cfg.filter || cfg.filter(node, this) != false)
+ this.siblings().push(node);
+ } else {
+ if (!close) this.remove(node);
+ else if (node.name == 'source') {
+ var parent = this.parent();
+ if (parent && (parent.name == 'video' || parent.name == 'audio') && node.attrs.src)
+ parent.attrs.source.push(node.attrs.src);
+ } else if (node.name == 'base' && !this.domain) this.domain = node.attrs.href;
+ }
+ if (this.data[this.i] == '/') this.i++;
+ this.start = this.i + 1;
+ this.state = this.Text;
+}
+// 移除标签
+MpHtmlParser.prototype.remove = function(node) {
+ var name = node.name,
+ j = this.i;
+ // 处理 svg
+ var handleSvg = () => {
+ var src = this.data.substring(j, this.i + 1);
+ node.attrs.xmlns = 'http://www.w3.org/2000/svg';
+ for (var key in node.attrs) {
+ if (key == 'viewbox') src = ` viewBox="${node.attrs.viewbox}"` + src;
+ else if (key != 'style') src = ` ${key}="${node.attrs[key]}"` + src;
+ }
+ src = '