diff --git a/.gitignore b/.gitignore
index 57940fd..8da0824 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,3 @@
-# ---> JetBrains
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
@@ -9,9 +8,6 @@
.idea/**/dictionaries
.idea/**/shelf
-# AWS User-specific
-.idea/**/aws.xml
-
# Generated files
.idea/**/contentModel.xml
@@ -62,9 +58,6 @@ atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
-# SonarLint plugin
-.idea/sonarlint/
-
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
@@ -76,4 +69,3 @@ fabric.properties
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
-
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..0e3af4f
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,135 @@
+
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..77f865d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 DCloud
+
+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
index 4740132..0fb3158 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,39 @@
-# yitisheng-mini-app
+# zyb-mini-app
-艺体生 微信小程序 前端代码
\ No newline at end of file
+#### 介绍
+{**以下是 Gitee 平台说明,您可以替换此简介**
+Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
+无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
+
+#### 软件架构
+软件架构说明
+
+
+#### 安装教程
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### 使用说明
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### 参与贡献
+
+1. Fork 本仓库
+2. 新建 Feat_xxx 分支
+3. 提交代码
+4. 新建 Pull Request
+
+
+#### 特技
+
+1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
+2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
+3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
+4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
+5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
+6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
diff --git a/changelog.md b/changelog.md
new file mode 100644
index 0000000..486278a
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,173 @@
+## 3.4.5(2024-01-11)
+- 新增 uni-calendar显示
+## 3.4.4(2024-01-11)
+- 新增 同步 uni-ui@1.4.20
+ - uni-forms 【重要】组件逻辑重构,部分用法旧版本不兼容,请注意兼容问题
+ - uni-section 新增组件
+## 3.4.3(2022-07-14)
+- 修复 HBuilderX 拉取 hello uni-app 项目直接运行提示无服务空间关联的bug
+## 3.4.2(2022-07-06)
+- 新增 同步 uni-ui@1.4.18
+ - uni-forms 【重要】组件逻辑重构,部分用法旧版本不兼容,请注意兼容问题
+ - uni-forms 【重要】组件使用 Provide/Inject 方式注入依赖,提供了自定义表单组件调用 uni-forms 校验表单的能力
+ - uni-forms 新增 更多表单示例
+ - uni-forms 新增 model 属性,等同于原 value/modelValue 属性,旧属性即将废弃
+ - uni-forms 新增 validateTrigger 属性的 blur 值,仅 uni-easyinput 生效
+ - uni-forms 新增 onFieldChange 方法,可以对子表单进行校验,可替代binddata方法
+ - uni-forms 新增 子表单的 setRules 方法,配合自定义校验函数使用
+ - uni-forms 新增 uni-forms-item 的 setRules 方法,配置动态表单使用可动态更新校验规则
+ - uni-forms 修复 由 1.4.0 引发的 label 插槽不生效的bug
+ - uni-forms 修复 子组件找不到 setValue 报错的bug
+ - uni-forms 修复 uni-data-picker 在 uni-forms-item 中报错的bug
+ - uni-forms 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug
+ - uni-forms 修复 表单校验顺序无序问题
+ - uni-forms 优化 子表单组件uni-datetime-picker、uni-data-select、uni-data-picker的显示样式
+ - uni-forms 优化 动态表单校验方式,废弃拼接name的方式
+ - uni-breadcrumb 修复 微信小程序 separator 不显示问题
+ - uni-data-checkbox 优化 在 uni-forms 中的依赖注入方式
+ - uni-data-picker 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug
+ - uni-data-picker 优化 显示样式
+ - uni-data-select 优化 显示样式
+ - uni-datetime-picker 修复 日历顶部年月及底部确认未国际化 bug
+ - uni-datetime-picker 优化 组件样式,调整了组件图标大小、高度、颜色等,与uni-ui风格保持一致
+ - uni-easyinput 新增 在 uni-forms 1.4.0 中使用可以在 blur 时校验内容
+ - uni-easyinput 新增 clear 事件,点击右侧叉号图标触发
+ - uni-easyinput 新增 change 事件 ,仅在输入框失去焦点或用户按下回车时触发
+ - uni-easyinput 优化 组件样式,组件获取焦点时高亮显示,图标颜色调整等
+ - uni-easyinput 优化 clearable 显示策略
+ - uni-file-picker 修复 在uni-forms下样式不生效的bug
+ - uni-nav-bar 修复 组件示例中插槽用法无法显示内容的bug
+ - uni-swipe-action 修复 vue3 下使用组件不能正常运行的Bug
+ - uni-swipe-action 修复 h5端点击click触发两次的Bug
+ - uni-table 修复 微信小程序存在无使用组件的问题
+## 3.4.1(2022-06-30)
+- 新增 支持 ios 安全区
+## 3.3.8(2022-05-08)
+- 新增 同步 uni-ui@1.4.15
+ - uni-data-picker 修复 字节小程序 本地数据无法选择下一级的Bug
+ - uni-data-select 新增 记住上次的选项(仅 collection 存在时有效)
+ - uni-search-bar 修复 vue3 input 事件不生效的bug
+ - uni-search-bar 修复 多余代码导致的bug
+ - uni-tooltip 更新 text 属性变更为 content
+ - uni-tooltip 更新 移除 width 属性
+ - uni-tooltip 修复 组件根 text 嵌套组件 warning
+## 3.3.7(2022-04-06)
+- 新增 更新扩展组件 uni-nav-bar、uni-list 的展示页面
+## 3.3.6(2022-03-31)
+- 更新 uni-ui 组件及示例
+## 3.3.5(2022-03-30)
+- 修复 插槽兼容 vue3, slot -> v-slot
+- 新增 更新 uni-ui
+## 3.3.4(2022-02-25)
+- 修复 编译到 App 平台的控制台报错
+## 3.3.3(2022-02-23)
+- 修复 模板城市选择 vue3 报错的bug
+- 修复 删除 map.nvue 中多余的 enableOverlooking 变量
+- 修复 swipe-dot.nvue 中条件编译媒体查询
+## 3.3.2(2022-01-26)
+- 修复 默认运行到 vue2
+## 3.3.1(2022-01-26)
+- 新增 同步 uni-ui@1.4.11
+ - uni-collapse 修复 微信小程序resize后组件收起的bug
+ - uni-countdown 修复 在微信小程序中样式不生效的bug
+ - uni-countdown 新增 update 方法 ,在动态更新时间后,刷新组件
+ - uni-load-more 新增 showText属性 ,是否显示文本
+ - uni-load-more 修复 nvue 平台下不显示文本的bug
+ - uni-load-more 修复 微信小程序平台样式选择器报警告的问题
+ - uni-nav-bar 修复 在vue下,标题不垂直居中的bug
+ - uni-nav-bar 修复 height 属性类型错误
+ - uni-nav-bar 新增 height 属性,可修改组件高度
+ - uni-nav-bar 新增 dark 属性可可开启暗黑模式
+ - uni-nav-bar 优化 标题字数过多显示省略号
+ - uni-nav-bar 优化 插槽,插入内容可完全覆盖
+ - uni-popup 修复 isMaskClick 失效的bug
+ - uni-popup 新增 cancelText \ confirmText 属性 ,可自定义文本
+ - uni-popup 新增 maskBackgroundColor 属性 ,可以修改蒙版颜色
+ - uni-popup 优化 maskClick属性 更新为 isMaskClick ,解决微信小程序警告的问题
+## 3.3.0(2022-01-04)
+- 修复 开发时在 vue3 下由 pc 端切换到手机端,不能返回上一级页面的 bug
+- 优化 去掉 pc 端 topwindow 右上角用于演示的 url 导航
+## 3.2.12(2021-12-20)
+- 新增 适配京东小程序
+## 3.2.11(2021-12-07)
+- 修复 uni-ui 在 hello-uniapp 中丢失图标、ui 受到公共样式影响等问题
+- 修复 微信登录取值报错的问题
+## 3.2.10(2021-11-30)
+- 修复 map 组件示例不显示的 bug
+## 3.2.9(2021-11-19)
+- 新增 uni-ui 以 uni_modules 方式引入,方便开发者从 hello-uniapp 中 copy 组件及示例
+- 优化 uni-ui 示例页面,完善组件示例
+## 3.2.8(2021-11-10)
+- 新增 适配飞书平台(lark)
+## 3.2.7(2021-10-26)
+- 修复 uni-popup 示例的 button 文字在 iPhone 5 上换行的 bug
+- 修复 uni-table 示例,页面顶部距离不对的 bug
+- 修复 GlobalData示例,在vue3是无效的 bug
+- 优化 删除无用的 project.swan.json 文件
+## 3.2.6(2021-10-08)
+- 由于体验问题,暂时撤销 uni-ui 以 uni_modules 方式引入的修改
+
+## 3.2.4(2021-09-07)
+- 修复 vue3 在 H5 编译报错的 bug
+- 新增 同步 uni-ui
+ - 新增 uni-ui 组件支持国际化 i18n
+ - uni-data-checkbox 修复 在uni-forms中 modelValue 中不存在当前字段,当前字段必填写也不参与校验的问题
+ - uni-datetime-picker 优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次
+ - uni-datetime-picker 优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法
+ - uni-datetime-picker 优化 调整字号大小,美化日历界面
+ - uni-datetime-picker 修复 因国际化导致的 placeholder 失效的 bug
+ - uni-file-picker 修复 return-type="object" 时且存在v-model时,无法删除文件的Bug
+ - uni-file-picker 新增 参数中返回 fileID 字段
+ - uni-file-picker 修复 腾讯云传入fileID 不能回显的bug
+ - uni-file-picker 修复 选择图片后,不能放大的问题
+ - uni-link 修复 在 nvue 下不显示的 bug
+ - uni-list 修复 在vue3中to属性在发行应用的时候报错的bug
+ - uni-search-bar 修复 value 属性与 modelValue 属性不兼容的Bug
+ - uni-swipe-action 优化 close-all 方法
+ - uni-collapse 优化 show-arrow 属性默认为true
+ - uni-collapse 新增 show-arrow 属性,控制是否显示右侧箭头
+ - uni-data-checkbox 修复 单选 list 模式下 ,icon 为 left 时,选中图标不显示的问题
+ - uni-easyinput 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug
+ - uni-file-picker 修复 由于 0.2.11 版本引起的不能回显图片的Bug
+ - uni-file-picker 新增 clearFiles(index) 方法,可以手动删除指定文件
+ - uni-file-picker 修复 v-model 值设为 null 报错的Bug
+ - uni-swipe-action 新增 close-all 方法,关闭所有已打开的组件
+ - uni-swipe-action 新增 resize() 方法,在非微信小程序、h5、app-vue端出现不能滑动的问题的时候,重置组件
+ - uni-swipe-action 修复 app 端偶尔出现类似 Page[x][-x,xx;-x,xx,x,x-x] 的问题
+ - uni-swipe-action 优化 微信小程序、h5、app-vue 滑动逻辑,避免出现动态新增组件后不能滑动的问题
+
+
+## 3.2.3(2021-08-27)
+- 优化 tabbar 页面移除 vuex 相关代码
+- 新增 适配 vue3 (app)
+## 3.2.2(2021-08-10)
+- 新增 适配快手小程序
+- 新增 同步 uni-ui
+ - uni-datetime-picker 新增 return-type 属性支持返回 date 日期对象
+ - uni-file-picker 修复 fileExtname属性不指定值报错的Bug
+ - uni-file-picker 修复 在某种场景下图片不回显的Bug
+ - uni-link 支持自定义插槽
+ - uni-calendar 修复 弹出层被 tabbar 遮盖 bug
+ - uni-dateformat 调整 默认时间不再是当前时间,而是显示'-'字符
+ - uni-datetime-picker 新增 适配 vue3
+ - uni-datetime-picker 新增 支持作为 uni-forms 子组件相关功能
+ - uni-datetime-picker 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的 bug
+ - uni-datetime-picker 修复 type 属性动态赋值无效的 bug
+ - uni-datetime-picker 修复 ‘确认’按钮被 tabbar 遮盖 bug
+ - uni-datetime-picker 修复 组件未赋值时范围选左、右日历相同的 bug
+ - uni-datetime-picker 修复 范围选未正确显示当前值的 bug
+ - uni-datetime-picker 修复 h5 平台(移动端)报错 'cale' of undefined 的 bug
+ - uni-file-picker 修复 auto-upload 属性失效的Bug
+## 3.2.1(2021-07-31)
+- 新增 同步 uni-ui@1.3.8
+## 3.2.0(2021-07-30)
+- 新增 同时兼容 vue2 & vue3
+## 3.1.20(2021-07-30)
+- 新增 同时兼容 vue2 & vue3
+## 3.1.17(2021-05-26)
+- 修复 3.1.16 依赖 sass 的问题
+- 条件编译 nuve 不支持 css 属性
+## 3.1.16(2021-05-26)
+- 修复 uni-data-checkbox 不关联服务空间的情况下组件报错的 Bug
+## 3.1.12(2021-05-07)
+- hello-uniapp 发布插件市场
diff --git a/common/ApiConstant.js b/common/ApiConstant.js
new file mode 100644
index 0000000..bca86e3
--- /dev/null
+++ b/common/ApiConstant.js
@@ -0,0 +1,45 @@
+export default {
+ Major: {
+ recommendMajorPage: '/art/recommendMajor/page',//获取推荐专业列表
+ recommendMajorList: '/art/recommendMajor/list',//获取学校的其他专业
+ schoolMajorDtoPage: '/yx/yxSchoolMajor/dtoPage',//获取学校开设专业分页数据
+ schoolHistoryMajorEnrollList: '/yx/yxHistoryMajorEnroll/list',//获取学校的分数计划
+ schoolMajorList: '/yx/yxSchoolMajor/list',//获取school_major 数据
+ majorList: '/yx/yxMajor/list',//获取专业信息表-分页列表查询
+ majorInfo: '/art/major/majorInfo',//获取专业详情
+ },
+//用户类
+ User: {
+ exchangeVipCard: '/yx/yxVipCard/exchange',//兑换vip卡
+ },
+ System: {
+ findPassWord: '/sys/findPassWord',//找回密码
+ register: '/sys/register',//注册
+ },
+//高考分数类
+ Score: {
+ scoreSave: "/yx/yxScore/save",//保存用户专业得分
+ getScore: "/yx/yxScore/getUserScoreInfo",//获取当前用户的高考分数信息
+ conversionScoreBatch: "/yx/yxHistoryScoreBatch/conversionScoreBatch",//获取分数批次段
+ historyScoreControlLineList: '/yx/yxHistoryScoreControlLine/list',//省控线分页列表
+ },
+//学校类
+ School: {
+ searchSchoolList: "/art/school/search",//搜索 学校列表
+ schoolInfo: "/art/school/schoolInfo",//学校介绍详情
+ hotSchoolList: '/art/school/hotList',//热门院校 列表
+ },
+//志愿
+ Volunteer: {
+ volunteerSave: "/art/volunteer/save",//保存用户的志愿
+ //volunteerList:'/art/volunteer/list',
+ volunteerInfo: '/art/volunteer/info',//当前使用中志愿单详情
+ volunteerPage: '/art/volunteer/page',//志愿单列表
+ volunteerDelete:'/art/volunteer/delete',//志愿单删除
+ artVolunteerDetail:'/art/volunteer/artVolunteerDetail',//根据id获取志愿单详情
+ volunteerRecordDel: '/art/volunteer/recordDel',//删除志愿明细(失效了)
+ volunteerRecordDelete:'/art/volunteer/volunteerRecordDelete',//删除志愿明细
+ volunteerRecordReplace: '/art/volunteer/replaceVolunteer',//替换志愿明细
+ }
+
+}
diff --git a/common/StaticConstant.js b/common/StaticConstant.js
new file mode 100644
index 0000000..b65ea32
--- /dev/null
+++ b/common/StaticConstant.js
@@ -0,0 +1,1304 @@
+export default {
+ year: '2023',//年份
+ years:['2023','2022','2021','2020'],
+ categoryList: [
+ {name: '文科'}, {name: '理科'}
+ ],
+ batchAllList: [
+ "提前批", "本科A段", "本科B段", "高职高专"
+ ],
+ //专业选项
+ professionalCategoryList: [
+ {value: '美术类', label: '美术类', scoreMax: 300},
+ {value: '体育类', label: '体育类', scoreMax: 150},
+ {value: '音乐类', label: '音乐类', scoreMax: 200},
+ {value: '艺术舞蹈类', label: '艺术舞蹈类', scoreMax: 200},
+ {value: '国际标准舞类', label: '国际标准舞类', scoreMax: 200},
+ {value: '播音类', label: '播音类', scoreMax: 400},
+ {value: '表演类', label: '表演类', scoreMax: 200},
+ {value: '书法类', label: '书法类', scoreMax: 200}
+ ],
+ volunteerList:[
+ {
+ schoolIcon:'http://img1.youzy.cn/content/media/thumbs/p00189990.jpeg',
+ tagsList: ['一流大学', '211工程', '985工程', '国家重点','双一流','省市级双万计划'],
+ "enrollProbability": 97.2900,
+ "schoolName": "山东艺术学院",
+ "schoolCode": "10458",
+ "institutionCode": "9927",
+ "province": "山东",
+ "propertyName": "公办",
+ "institutionType": "艺术",
+ "majorName": "工艺美术",
+ "majorCode": "350101",
+ "majorDetail":"专业组62,11000元/年,包含专业.....",
+ "majorRemarks": "是什么:\n\n工艺美术主要研究美学、色彩构成、立体构成、工艺美术等方面的基本知识和技能,进行工艺品的设计、色彩搭配、制作、保护和修复等。常见的工艺品有木雕、玉雕、漆器、陶器、瓷器、泥塑、剪纸、蜡染等。关键词:陶罐瓷瓶剪纸泥塑。\n\n学什么:\n\n《中外美术通史》、《中外工艺美术通史》、《绘画基础》、《美学》、《专业写作》、《中国文化史》、《中国传统纹饰》、《传统漆器研究》、《立体构成》、《色彩构成》部分高校按以下专业方向培养:陶艺、玉雕。\n\n干什么:\n\n工艺美术类企业:工艺品设计、工艺品制作;艺术馆、博物馆:工艺品保护、工艺品修复。",
+ "planNum": 0,
+ "studyCost": 12000.00,
+ "rulesEnrollProbability": "文0.5000专1.2500",
+ "probabilityOperator": "文*0.50+专*1.2500",
+ "studyYear": 4,
+ "historyMajorEnrollList": [
+ {
+ "id": "1748613827055948556",
+ "schoolCode": "10458",
+ "institutionCode": "9927",
+ "schoolName": "山东艺术学院",
+ "majorCode": "130507",
+ "majorName": "工艺美术",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.4000专0.6000",
+ "probabilityOperator": "文*0.40+专*0.60",
+ "controlLine": 266.0000,
+ "admissionLine": 326.8000,
+ "enrollNum": 3,
+ "admissionNum": 3,
+ "oneVolunteerAdmissionNum": 3,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "34",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ {
+ "id": "1748613827055948564",
+ "schoolCode": "10458",
+ "institutionCode": "9927",
+ "schoolName": "山东艺术学院",
+ "majorCode": "130507",
+ "majorName": "工艺美术",
+ "year": "2021",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.4000专0.6000",
+ "probabilityOperator": "文*0.40+专*0.60",
+ "controlLine": 263.8000,
+ "admissionLine": 321.2000,
+ "enrollNum": 3,
+ "admissionNum": 3,
+ "oneVolunteerAdmissionNum": 3,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "33",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ ],
+ "historyMajorEnrollMap": {
+ "2022": {
+ "id": "1748613827055948556",
+ "schoolCode": "10458",
+ "institutionCode": "9927",
+ "schoolName": "山东艺术学院",
+ "majorCode": "130507",
+ "majorName": "工艺美术",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.4000专0.6000",
+ "probabilityOperator": "文*0.40+专*0.60",
+ "controlLine": 266.0000,
+ "admissionLine": 326.8000,
+ "enrollNum": 3,
+ "admissionNum": 3,
+ "oneVolunteerAdmissionNum": 3,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "34",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ "2021": {
+ "id": "1748613827055948564",
+ "schoolCode": "10458",
+ "institutionCode": "9927",
+ "schoolName": "山东艺术学院",
+ "majorCode": "130507",
+ "majorName": "工艺美术",
+ "year": "2021",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.4000专0.6000",
+ "probabilityOperator": "文*0.40+专*0.60",
+ "controlLine": 263.8000,
+ "admissionLine": 321.2000,
+ "enrollNum": 3,
+ "admissionNum": 3,
+ "oneVolunteerAdmissionNum": 3,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "33",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ },
+ "culturalControlLine": 370.0000,
+ "specialControlLine": 216.0000,
+ "studentConvertedScore": 512.5000,
+ "category": "文科",
+ "batch": "提前批",
+ "enrollmentCode": "34"
+ },
+ {
+ "enrollProbability": 90.3200,
+ "schoolName": "天津大学",
+ "schoolCode": "10056",
+ "institutionCode": "1305",
+ "province": "天津",
+ "propertyName": "公办",
+ "institutionType": "理工",
+ "majorName": "环境设计",
+ "majorCode": "130503",
+ "majorRemarks": "是什么:\n\n环境设计主要研究艺术学、设计学、建筑学、社会学、环境学等方面的基本知识和技能,涉及地球表层空间设计、城市规划设计、建筑设计、室内设计、室外设计、公共艺术设计等。例如:公园地形地貌、道路、假山的设计,城市公路、绿化带、建筑的规划设计,住宅、商场室内布局的设计等。关键词:公园绿化带广场住宅。\n\n学什么:\n\n《设计制图与透视》、《装饰材料与构造》、《室内环境设计》、《建筑景观设计》、《办公空间设计》、《公共艺术设计》、《材料与结构》、《环艺模型制作与材料加工》、《建筑结构原理》、《营造元素》部分高校按以下专业方向培养:美术、会展设计、景观设计、空间设计、室内设计、展示设计、环境艺术设计、建筑艺术设计、景观艺术设计、城市园林艺术设计。\n\n干什么:\n\n装修装潢类企业:室内设计、室外设计、空间设计;城建类事业单位:城市环境设计、园林艺术设计、建筑景观设计。",
+ "planNum": 0,
+ "studyCost": 12000.00,
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "studyYear": 4,
+ "historyMajorEnrollList": [
+ {
+ "id": "1748613827055948009",
+ "schoolCode": "10056",
+ "institutionCode": "1305",
+ "schoolName": "天津大学",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.1330专0.3330",
+ "probabilityOperator": "文*0.1330+专*0.3330",
+ "controlLine": 116.4800,
+ "admissionLine": 154.3000,
+ "enrollNum": 3,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 1,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "04",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ {
+ "id": "1748613827055948010",
+ "schoolCode": "10056",
+ "institutionCode": "1305",
+ "schoolName": "天津大学",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2021",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.1330专0.3330",
+ "probabilityOperator": "文*0.1330+专*0.3330",
+ "controlLine": 115.0810,
+ "admissionLine": 140.3000,
+ "enrollNum": 3,
+ "admissionNum": 3,
+ "oneVolunteerAdmissionNum": 2,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "04",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ {
+ "id": "1748613827055948012",
+ "schoolCode": "10056",
+ "institutionCode": "1305",
+ "schoolName": "天津大学",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2020",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.1330专0.3330",
+ "probabilityOperator": "文*0.1330+专*0.3330",
+ "controlLine": 117.8080,
+ "admissionLine": 167.7000,
+ "enrollNum": 3,
+ "admissionNum": 3,
+ "oneVolunteerAdmissionNum": 3,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "04",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ ],
+ "historyMajorEnrollMap": {
+ "2022": {
+ "id": "1748613827055948009",
+ "schoolCode": "10056",
+ "institutionCode": "1305",
+ "schoolName": "天津大学",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.1330专0.3330",
+ "probabilityOperator": "文*0.1330+专*0.3330",
+ "controlLine": 116.4800,
+ "admissionLine": 154.3000,
+ "enrollNum": 3,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 1,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "04",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ "2021": {
+ "id": "1748613827055948010",
+ "schoolCode": "10056",
+ "institutionCode": "1305",
+ "schoolName": "天津大学",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2021",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.1330专0.3330",
+ "probabilityOperator": "文*0.1330+专*0.3330",
+ "controlLine": 115.0810,
+ "admissionLine": 140.3000,
+ "enrollNum": 3,
+ "admissionNum": 3,
+ "oneVolunteerAdmissionNum": 2,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "04",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ "2020": {
+ "id": "1748613827055948012",
+ "schoolCode": "10056",
+ "institutionCode": "1305",
+ "schoolName": "天津大学",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2020",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.1330专0.3330",
+ "probabilityOperator": "文*0.1330+专*0.3330",
+ "controlLine": 117.8080,
+ "admissionLine": 167.7000,
+ "enrollNum": 3,
+ "admissionNum": 3,
+ "oneVolunteerAdmissionNum": 3,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "04",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ },
+ "culturalControlLine": 370.0000,
+ "specialControlLine": 216.0000,
+ "studentConvertedScore": 250.0000,
+ "category": "文科",
+ "batch": "提前批",
+ "enrollmentCode": "02"
+ },
+ {
+ "enrollProbability": 87.5000,
+ "schoolName": "云南艺术学院",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "province": "云南",
+ "propertyName": "公办",
+ "institutionType": "艺术",
+ "majorName": "戏剧影视美术设计",
+ "majorCode": "130307",
+ "majorRemarks": "是什么:\n\n戏剧影视美术设计主要研究戏剧、影视、舞台美术、视觉设计等方面的基本知识和技能,在剧院、电影厂、电视台等进行戏剧、戏曲、影视和其他舞台演出的美术设计,包括舞台设计、场景设计、人物形象设计、布景绘制、灯光设计、服装与化妆设计、道具设计等。\n\n学什么:\n\n《舞台影视美术设计》、《灯光设计》、《服装道具设计》、《化妆设计》、《绘画》、《绘景》、《计算机辅助设计》、《特技美术》 部分高校按以下专业方向培养:影视人物造型设计。\n\n干什么:\n\n剧院(团)、电影厂:美术设计、舞台设计、场景设计、人物形象设计、布景绘制、灯光设计。",
+ "planNum": 0,
+ "studyCost": 10000.00,
+ "rulesEnrollProbability": "文0.5000专1.0000",
+ "probabilityOperator": "文*0.50+专*1.00",
+ "studyYear": 4,
+ "historyMajorEnrollList": [
+ {
+ "id": "1748613827055948644",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "schoolName": "云南艺术学院",
+ "majorCode": "130307",
+ "majorName": "戏剧影视美术设计",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 266.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 1,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "14",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ ],
+ "historyMajorEnrollMap": {
+ "2022": {
+ "id": "1748613827055948644",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "schoolName": "云南艺术学院",
+ "majorCode": "130307",
+ "majorName": "戏剧影视美术设计",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 266.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 1,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "14",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ },
+ "culturalControlLine": 370.0000,
+ "specialControlLine": 216.0000,
+ "studentConvertedScore": 450.0000,
+ "category": "文科",
+ "batch": "提前批",
+ "enrollmentCode": "29"
+ },
+ {
+ "enrollProbability": 78.1600,
+ "schoolName": "安徽大学",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "province": "安徽",
+ "propertyName": "公办",
+ "institutionType": "综合",
+ "majorName": "环境设计",
+ "majorCode": "130503",
+ "majorRemarks": "是什么:\n\n环境设计主要研究艺术学、设计学、建筑学、社会学、环境学等方面的基本知识和技能,涉及地球表层空间设计、城市规划设计、建筑设计、室内设计、室外设计、公共艺术设计等。例如:公园地形地貌、道路、假山的设计,城市公路、绿化带、建筑的规划设计,住宅、商场室内布局的设计等。关键词:公园绿化带广场住宅。\n\n学什么:\n\n《设计制图与透视》、《装饰材料与构造》、《室内环境设计》、《建筑景观设计》、《办公空间设计》、《公共艺术设计》、《材料与结构》、《环艺模型制作与材料加工》、《建筑结构原理》、《营造元素》部分高校按以下专业方向培养:美术、会展设计、景观设计、空间设计、室内设计、展示设计、环境艺术设计、建筑艺术设计、景观艺术设计、城市园林艺术设计。\n\n干什么:\n\n装修装潢类企业:室内设计、室外设计、空间设计;城建类事业单位:城市环境设计、园林艺术设计、建筑景观设计。",
+ "planNum": 0,
+ "studyCost": 8000.00,
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "studyYear": 4,
+ "historyMajorEnrollList": [
+ {
+ "id": "1748613827055948214",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "schoolName": "安徽大学",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 252.0000,
+ "enrollNum": 4,
+ "admissionNum": 4,
+ "oneVolunteerAdmissionNum": 4,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "08",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ {
+ "id": "1748613827055948218",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "schoolName": "安徽大学",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2021",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 205.0000,
+ "admissionLine": 250.0000,
+ "enrollNum": 4,
+ "admissionNum": 4,
+ "oneVolunteerAdmissionNum": 4,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "08",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ ],
+ "historyMajorEnrollMap": {
+ "2022": {
+ "id": "1748613827055948214",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "schoolName": "安徽大学",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 252.0000,
+ "enrollNum": 4,
+ "admissionNum": 4,
+ "oneVolunteerAdmissionNum": 4,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "08",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ "2021": {
+ "id": "1748613827055948218",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "schoolName": "安徽大学",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2021",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 205.0000,
+ "admissionLine": 250.0000,
+ "enrollNum": 4,
+ "admissionNum": 4,
+ "oneVolunteerAdmissionNum": 4,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "08",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ },
+ "culturalControlLine": 370.0000,
+ "specialControlLine": 216.0000,
+ "studentConvertedScore": 250.0000,
+ "category": "文科",
+ "batch": "提前批",
+ "enrollmentCode": "08"
+ },
+ {
+ "enrollProbability": 76.6900,
+ "schoolName": "安徽大学",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "province": "安徽",
+ "propertyName": "公办",
+ "institutionType": "综合",
+ "majorName": "绘画",
+ "majorCode": "130402",
+ "majorRemarks": "是什么:\n\n绘画主要研究色彩、构图、素描、绘画等方面的基本知识和技能,涉及国画、油画、水彩画、版画等,进行插图、漫画、壁画、装饰画等的创作和绘制。例如:书籍、杂志中插图的绘制,游戏中人物立绘、场景、CG的设计与绘制,漫画的绘画与上色,室内装饰画的绘制等。 \n\n学什么:\n\n《水彩》、《人体速写》、《透视学》、《素描表现》、《插画创作》、《油画肖像写生》、《色彩静物》、《油画基础技法》、《人物素描》、《版画技法》 部分高校按以下专业方向培养:版画、动画、国画、书法、油画、鉴定与修复、新媒体艺术、壁画与公共艺术。\n\n干什么:\n\n出版社:插画绘制、美术设计; 动漫、游戏类企业:原画绘制、人物设计、CG绘制; 艺术装饰类企业:壁画绘制、装饰画绘制。",
+ "planNum": 0,
+ "studyCost": 8000.00,
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "studyYear": 4,
+ "historyMajorEnrollList": [
+ {
+ "id": "1748613827055948212",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "schoolName": "安徽大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 255.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 1,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "06",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ {
+ "id": "1748613827055948216",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "schoolName": "安徽大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2021",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 205.0000,
+ "admissionLine": 245.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 0,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "06",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ {
+ "id": "1748613827055948220",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "schoolName": "安徽大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2020",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 206.0000,
+ "admissionLine": 254.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 0,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "07",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ ],
+ "historyMajorEnrollMap": {
+ "2022": {
+ "id": "1748613827055948212",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "schoolName": "安徽大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 255.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 1,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "06",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ "2021": {
+ "id": "1748613827055948216",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "schoolName": "安徽大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2021",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 205.0000,
+ "admissionLine": 245.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 0,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "06",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ "2020": {
+ "id": "1748613827055948220",
+ "schoolCode": "10357",
+ "institutionCode": "1885",
+ "schoolName": "安徽大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2020",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 206.0000,
+ "admissionLine": 254.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 0,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "07",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ },
+ "culturalControlLine": 370.0000,
+ "specialControlLine": 216.0000,
+ "studentConvertedScore": 250.0000,
+ "category": "文科",
+ "batch": "提前批",
+ "enrollmentCode": "06"
+ },
+ {
+ "enrollProbability": 75.9600,
+ "schoolName": "河南大学",
+ "schoolCode": "10475",
+ "institutionCode": "6005",
+ "province": "河南",
+ "propertyName": "公办",
+ "institutionType": "综合",
+ "majorName": "绘画",
+ "majorCode": "130402",
+ "majorRemarks": "是什么:\n\n绘画主要研究色彩、构图、素描、绘画等方面的基本知识和技能,涉及国画、油画、水彩画、版画等,进行插图、漫画、壁画、装饰画等的创作和绘制。例如:书籍、杂志中插图的绘制,游戏中人物立绘、场景、CG的设计与绘制,漫画的绘画与上色,室内装饰画的绘制等。 \n\n学什么:\n\n《水彩》、《人体速写》、《透视学》、《素描表现》、《插画创作》、《油画肖像写生》、《色彩静物》、《油画基础技法》、《人物素描》、《版画技法》 部分高校按以下专业方向培养:版画、动画、国画、书法、油画、鉴定与修复、新媒体艺术、壁画与公共艺术。\n\n干什么:\n\n出版社:插画绘制、美术设计; 动漫、游戏类企业:原画绘制、人物设计、CG绘制; 艺术装饰类企业:壁画绘制、装饰画绘制。",
+ "planNum": 0,
+ "studyCost": 8000.00,
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "studyYear": 4,
+ "historyMajorEnrollList": [
+ {
+ "id": "1748613827055948463",
+ "schoolCode": "10475",
+ "institutionCode": "6005",
+ "schoolName": "河南大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.0670专0.1670",
+ "probabilityOperator": "文*0.0670+专*0.1670",
+ "controlLine": 58.5200,
+ "admissionLine": 67.8000,
+ "enrollNum": 25,
+ "admissionNum": 25,
+ "oneVolunteerAdmissionNum": 25,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "21",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ {
+ "id": "1748613827055948466",
+ "schoolCode": "10475",
+ "institutionCode": "6005",
+ "schoolName": "河南大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2021",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 205.0000,
+ "admissionLine": 268.0000,
+ "enrollNum": 20,
+ "admissionNum": 23,
+ "oneVolunteerAdmissionNum": 23,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "21",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ {
+ "id": "1748613827055948470",
+ "schoolCode": "10475",
+ "institutionCode": "6005",
+ "schoolName": "河南大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2020",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 206.0000,
+ "admissionLine": 268.0000,
+ "enrollNum": 20,
+ "admissionNum": 25,
+ "oneVolunteerAdmissionNum": 25,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "22",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ ],
+ "historyMajorEnrollMap": {
+ "2022": {
+ "id": "1748613827055948463",
+ "schoolCode": "10475",
+ "institutionCode": "6005",
+ "schoolName": "河南大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文0.0670专0.1670",
+ "probabilityOperator": "文*0.0670+专*0.1670",
+ "controlLine": 58.5200,
+ "admissionLine": 67.8000,
+ "enrollNum": 25,
+ "admissionNum": 25,
+ "oneVolunteerAdmissionNum": 25,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "21",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ "2021": {
+ "id": "1748613827055948466",
+ "schoolCode": "10475",
+ "institutionCode": "6005",
+ "schoolName": "河南大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2021",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 205.0000,
+ "admissionLine": 268.0000,
+ "enrollNum": 20,
+ "admissionNum": 23,
+ "oneVolunteerAdmissionNum": 23,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "21",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ },
+ "2020": {
+ "id": "1748613827055948470",
+ "schoolCode": "10475",
+ "institutionCode": "6005",
+ "schoolName": "河南大学",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2020",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 206.0000,
+ "admissionLine": 268.0000,
+ "enrollNum": 20,
+ "admissionNum": 25,
+ "oneVolunteerAdmissionNum": 25,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "22",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ },
+ "culturalControlLine": 370.0000,
+ "specialControlLine": 216.0000,
+ "studentConvertedScore": 250.0000,
+ "category": "文科",
+ "batch": "提前批",
+ "enrollmentCode": "25"
+ },
+ {
+ "enrollProbability": 75.5600,
+ "schoolName": "云南艺术学院",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "province": "云南",
+ "propertyName": "公办",
+ "institutionType": "艺术",
+ "majorName": "中国画",
+ "majorCode": "130406",
+ "majorRemarks": "是什么:\n\n中国画主要研究中国画构图、布局、配色、绘画技法等方面的基本知识和技能,包括水墨人物画、工笔人物画、山水画、花鸟画等,进行国画的创作、鉴定、宣传以及书刊的美术编辑等。例如:人物画、山水画等国画的绘制,齐白石、张大千等名家作品的真伪鉴定,书刊的国画封面、插图的设计、绘制等。\n学什么:\n\n《中国画论》、《人物画》、《山水画》、《花鸟画》、《中国画造型》、《中国工笔花鸟画》、《中国写意花鸟画》、《书法篆刻》、《中外美术史》、《中国古典诗词》\n\n干什么:\n\n艺术、文化类事业单位:国画创作、美术普及、文化宣传; 艺术品鉴定机构:国画鉴定; 出版社、报刊社:美术编辑。",
+ "planNum": 0,
+ "studyCost": 10000.00,
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "studyYear": 4,
+ "historyMajorEnrollList": [
+ {
+ "id": "1748613827055948649",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "schoolName": "云南艺术学院",
+ "majorCode": "130406",
+ "majorName": "中国画",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 255.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 1,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "19",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ ],
+ "historyMajorEnrollMap": {
+ "2022": {
+ "id": "1748613827055948649",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "schoolName": "云南艺术学院",
+ "majorCode": "130406",
+ "majorName": "中国画",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 255.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 1,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "19",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ },
+ "culturalControlLine": 370.0000,
+ "specialControlLine": 216.0000,
+ "studentConvertedScore": 250.0000,
+ "category": "文科",
+ "batch": "提前批",
+ "enrollmentCode": "34"
+ },
+ {
+ "enrollProbability": 73.9100,
+ "schoolName": "云南艺术学院",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "province": "云南",
+ "propertyName": "公办",
+ "institutionType": "艺术",
+ "majorName": "环境设计",
+ "majorCode": "130503",
+ "majorRemarks": "是什么:\n\n环境设计主要研究艺术学、设计学、建筑学、社会学、环境学等方面的基本知识和技能,涉及地球表层空间设计、城市规划设计、建筑设计、室内设计、室外设计、公共艺术设计等。例如:公园地形地貌、道路、假山的设计,城市公路、绿化带、建筑的规划设计,住宅、商场室内布局的设计等。关键词:公园绿化带广场住宅。\n\n学什么:\n\n《设计制图与透视》、《装饰材料与构造》、《室内环境设计》、《建筑景观设计》、《办公空间设计》、《公共艺术设计》、《材料与结构》、《环艺模型制作与材料加工》、《建筑结构原理》、《营造元素》部分高校按以下专业方向培养:美术、会展设计、景观设计、空间设计、室内设计、展示设计、环境艺术设计、建筑艺术设计、景观艺术设计、城市园林艺术设计。\n\n干什么:\n\n装修装潢类企业:室内设计、室外设计、空间设计;城建类事业单位:城市环境设计、园林艺术设计、建筑景观设计。",
+ "planNum": 0,
+ "studyCost": 10000.00,
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "studyYear": 4,
+ "historyMajorEnrollList": [
+ {
+ "id": "1748613827055948651",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "schoolName": "云南艺术学院",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 256.0000,
+ "enrollNum": 2,
+ "admissionNum": 3,
+ "oneVolunteerAdmissionNum": 3,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "21",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ ],
+ "historyMajorEnrollMap": {
+ "2022": {
+ "id": "1748613827055948651",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "schoolName": "云南艺术学院",
+ "majorCode": "130503",
+ "majorName": "环境设计",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 256.0000,
+ "enrollNum": 2,
+ "admissionNum": 3,
+ "oneVolunteerAdmissionNum": 3,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "21",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ },
+ "culturalControlLine": 370.0000,
+ "specialControlLine": 216.0000,
+ "studentConvertedScore": 250.0000,
+ "category": "文科",
+ "batch": "提前批",
+ "enrollmentCode": "36"
+ },
+ {
+ "enrollProbability": 72.3400,
+ "schoolName": "云南艺术学院",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "province": "云南",
+ "propertyName": "公办",
+ "institutionType": "艺术",
+ "majorName": "美术学(史论)",
+ "majorCode": "130401",
+ "majorRemarks": "是什么:\n\n美术学主要研究美术学、艺术学、美术史论等方面的基本知识和技能,进行美术评论、美术编辑、艺术管理、美术研究与教学等。例如:字画、雕塑等艺术作品的点评,报刊、杂志等版面的美术设计,唐伯虎字画、清朝瓷器等古董的真伪鉴定,博物馆文物的管理保养等。 \n\n学什么:\n\n《素描静物》、《书法、篆刻》、《透视学》、《书法史》、《工笔花鸟》、《线性人物素描》、《艺术品鉴定》、《油画创作》、《工艺美术》、《世界美术史》 部分高校按以下专业方向培养:国画、书法、小教、油画、美术教育、实用绘画、数字绘画、艺术设计、美术与服装、美术与装潢。\n\n干什么:\n\n美术类单位:美术评论、艺术管理、艺术品鉴定; 出版社:美术编辑、版面设计; 大、中小学校:美术教学、美术研究。",
+ "planNum": 0,
+ "studyCost": 10000.00,
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "studyYear": 4,
+ "historyMajorEnrollList": [
+ {
+ "id": "1748613827055948645",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "schoolName": "云南艺术学院",
+ "majorCode": "130401",
+ "majorName": "美术学(史论)",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 257.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 1,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "15",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ ],
+ "historyMajorEnrollMap": {
+ "2022": {
+ "id": "1748613827055948645",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "schoolName": "云南艺术学院",
+ "majorCode": "130401",
+ "majorName": "美术学(史论)",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 257.0000,
+ "enrollNum": 1,
+ "admissionNum": 1,
+ "oneVolunteerAdmissionNum": 1,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "15",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ },
+ "culturalControlLine": 370.0000,
+ "specialControlLine": 216.0000,
+ "studentConvertedScore": 250.0000,
+ "category": "文科",
+ "batch": "提前批",
+ "enrollmentCode": "31"
+ },
+ {
+ "enrollProbability": 70.8300,
+ "schoolName": "云南艺术学院",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "province": "云南",
+ "propertyName": "公办",
+ "institutionType": "艺术",
+ "majorName": "绘画",
+ "majorCode": "130402",
+ "majorRemarks": "是什么:\n\n绘画主要研究色彩、构图、素描、绘画等方面的基本知识和技能,涉及国画、油画、水彩画、版画等,进行插图、漫画、壁画、装饰画等的创作和绘制。例如:书籍、杂志中插图的绘制,游戏中人物立绘、场景、CG的设计与绘制,漫画的绘画与上色,室内装饰画的绘制等。 \n\n学什么:\n\n《水彩》、《人体速写》、《透视学》、《素描表现》、《插画创作》、《油画肖像写生》、《色彩静物》、《油画基础技法》、《人物素描》、《版画技法》 部分高校按以下专业方向培养:版画、动画、国画、书法、油画、鉴定与修复、新媒体艺术、壁画与公共艺术。\n\n干什么:\n\n出版社:插画绘制、美术设计; 动漫、游戏类企业:原画绘制、人物设计、CG绘制; 艺术装饰类企业:壁画绘制、装饰画绘制。",
+ "planNum": 0,
+ "studyCost": 10000.00,
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "studyYear": 4,
+ "historyMajorEnrollList": [
+ {
+ "id": "1748613827055948646",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "schoolName": "云南艺术学院",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 258.0000,
+ "enrollNum": 4,
+ "admissionNum": 5,
+ "oneVolunteerAdmissionNum": 5,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "16",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ ],
+ "historyMajorEnrollMap": {
+ "2022": {
+ "id": "1748613827055948646",
+ "schoolCode": "10690",
+ "institutionCode": "9945",
+ "schoolName": "云南艺术学院",
+ "majorCode": "130402",
+ "majorName": "绘画",
+ "year": "2022",
+ "category": "文科",
+ "rulesEnrollProbability": "文过专排",
+ "probabilityOperator": null,
+ "controlLine": 210.0000,
+ "admissionLine": 258.0000,
+ "enrollNum": 4,
+ "admissionNum": 5,
+ "oneVolunteerAdmissionNum": 5,
+ "scoreLineDifference": 0.00,
+ "detail": null,
+ "createBy": "admin",
+ "createTime": "2024-01-20 15:50:05",
+ "updateBy": null,
+ "updateTime": null,
+ "sysOrgCode": "A01",
+ "batch": "提前批",
+ "enrollmentCode": "16",
+ "actualPitcherNum": 0,
+ "majorType": "美术类"
+ }
+ },
+ "culturalControlLine": 370.0000,
+ "specialControlLine": 216.0000,
+ "studentConvertedScore": 250.0000,
+ "category": "文科",
+ "batch": "提前批",
+ "enrollmentCode": "32"
+ }
+],
+}
diff --git a/common/airport.js b/common/airport.js
new file mode 100644
index 0000000..445b6aa
--- /dev/null
+++ b/common/airport.js
@@ -0,0 +1,262 @@
+export default {
+ "list": [{
+ "letter": "A",
+ "data": [
+ "阿克苏机场",
+ "阿拉山口机场",
+ "阿勒泰机场",
+ "阿里昆莎机场",
+ "安庆天柱山机场",
+ "澳门国际机场"
+ ]
+ }, {
+ "letter": "B",
+ "data": [
+ "保山机场",
+ "包头机场",
+ "北海福成机场",
+ "北京南苑机场",
+ "北京首都国际机场"
+ ]
+ }, {
+ "letter": "C",
+ "data": [
+ "长白山机场",
+ "长春龙嘉国际机场",
+ "常德桃花源机场",
+ "昌都邦达机场",
+ "长沙黄花国际机场",
+ "长治王村机场",
+ "常州奔牛机场",
+ "成都双流国际机场",
+ "赤峰机场"
+ ]
+ }, {
+ "letter": "D",
+ "data": [
+ "大理机场",
+ "大连周水子国际机场",
+ "大庆萨尔图机场",
+ "大同东王庄机场",
+ "达州河市机场",
+ "丹东浪头机场",
+ "德宏芒市机场",
+ "迪庆香格里拉机场",
+ "东营机场",
+ "敦煌机场"
+ ]
+ }, {
+ "letter": "E",
+ "data": [
+ "鄂尔多斯机场",
+ "恩施许家坪机场",
+ "二连浩特赛乌苏国际机场"
+ ]
+ }, {
+ "letter": "F",
+ "data": [
+ "阜阳西关机场",
+ "福州长乐国际机场"
+ ]
+ }, {
+ "letter": "G",
+ "data": [
+ "赣州黄金机场",
+ "格尔木机场",
+ "固原六盘山机场",
+ "广元盘龙机场",
+ "广州白云国际机场",
+ "桂林两江国际机场",
+ "贵阳龙洞堡国际机场"
+ ]
+ }, {
+ "letter": "H",
+ "data": [
+ "哈尔滨太平国际机场",
+ "哈密机场",
+ "海口美兰国际机场",
+ "海拉尔东山国际机场",
+ "邯郸机场",
+ "汉中机场",
+ "杭州萧山国际机场",
+ "合肥骆岗国际机场",
+ "和田机场",
+ "黑河机场",
+ "呼和浩特白塔国际机场",
+ "淮安涟水机场",
+ "黄山屯溪国际机场"
+ ]
+ }, {
+ "letter": "I",
+ "data": []
+ }, {
+ "letter": "J",
+ "data": [
+ "济南遥墙国际机场",
+ "济宁曲阜机场",
+ "鸡西兴凯湖机场",
+ "佳木斯东郊机场",
+ "嘉峪关机场",
+ "锦州小岭子机场",
+ "景德镇机场",
+ "井冈山机场",
+ "九江庐山机场",
+ "九寨黄龙机场"
+ ]
+ }, {
+ "letter": "K",
+ "data": [
+ "喀什机场",
+ "克拉玛依机场",
+ "库车龟兹机场",
+ "库尔勒机场",
+ "昆明巫家坝国际机场"
+ ]
+ }, {
+ "letter": "L",
+ "data": [
+ "拉萨贡嘎机场",
+ "兰州中川机场",
+ "丽江三义机场",
+ "黎平机场",
+ "连云港白塔埠机场",
+ "临沧机场",
+ "临沂机场",
+ "林芝米林机场",
+ "柳州白莲机场",
+ "龙岩冠豸山机场",
+ "泸州蓝田机场",
+ "洛阳北郊机场"
+ ]
+ }, {
+ "letter": "M",
+ "data": [
+ "满洲里西郊机场",
+ "绵阳南郊机场",
+ "漠河古莲机场",
+ "牡丹江海浪机场"
+ ]
+ }, {
+ "letter": "N",
+ "data": [
+ "南昌昌北国际机场",
+ "南充高坪机场",
+ "南京禄口国际机场",
+ "南宁吴圩机场",
+ "南通兴东机场",
+ "南阳姜营机场",
+ "宁波栎社国际机场"
+ ]
+ }, {
+ "letter": "O",
+ "data": []
+ }, {
+ "letter": "P",
+ "data": [
+ "普洱思茅机场"
+ ]
+ }, {
+ "letter": "Q",
+ "data": [
+ "齐齐哈尔三家子机场",
+ "秦皇岛山海关机场",
+ "青岛流亭国际机场",
+ "衢州机场",
+ "泉州晋江机场"
+ ]
+ }, {
+ "letter": "R",
+ "data": [
+ "日喀则和平机场"
+ ]
+ }, {
+ "letter": "S",
+ "data": [
+ "三亚凤凰国际机场",
+ "汕头外砂机场",
+ "上海虹桥国际机场",
+ "上海浦东国际机场",
+ "深圳宝安国际机场",
+ "沈阳桃仙国际机场",
+ "石家庄正定国际机场",
+ "苏南硕放国际机场"
+ ]
+ }, {
+ "letter": "T",
+ "data": [
+ "塔城机场",
+ "太原武宿国际机场",
+ "台州路桥机场 (黄岩机场)",
+ "唐山三女河机场",
+ "腾冲驼峰机场",
+ "天津滨海国际机场",
+ "通辽机场",
+ "铜仁凤凰机场"
+ ]
+ }, {
+ "letter": "U",
+ "data": []
+ }, {
+ "letter": "V",
+ "data": []
+ }, {
+ "letter": "W",
+ "data": [
+ "万州五桥机场",
+ "潍坊机场",
+ "威海大水泊机场",
+ "文山普者黑机场",
+ "温州永强国际机场",
+ "乌海机场",
+ "武汉天河国际机场",
+ "乌兰浩特机场",
+ "乌鲁木齐地窝堡国际机场",
+ "武夷山机场",
+ "梧州长洲岛机场"
+ ]
+ }, {
+ "letter": "X",
+ "data": [
+ "西安咸阳国际机场",
+ "西昌青山机场",
+ "锡林浩特机场",
+ "西宁曹家堡机场",
+ "西双版纳嘎洒机场",
+ "厦门高崎国际机场",
+ "香港国际机场",
+ "襄阳刘集机场",
+ "兴义机场",
+ "徐州观音机场"
+ ]
+ }, {
+ "letter": "Y",
+ "data": [
+ "延安二十里堡机场",
+ "盐城机场",
+ "延吉朝阳川机场",
+ "烟台莱山国际机场",
+ "宜宾菜坝机场",
+ "宜昌三峡机场",
+ "伊春林都机场",
+ "伊宁机场",
+ "义乌机场",
+ "银川河东机场",
+ "永州零陵机场",
+ "榆林榆阳机场",
+ "玉树巴塘机场",
+ "运城张孝机场"
+ ]
+ }, {
+ "letter": "Z",
+ "data": [
+ "湛江机场",
+ "昭通机场",
+ "郑州新郑国际机场",
+ "芷江机场",
+ "重庆江北国际机场",
+ "中卫香山机场",
+ "舟山朱家尖机场",
+ "珠海三灶机场"
+ ]
+ }]
+}
diff --git a/common/graceChecker.js b/common/graceChecker.js
new file mode 100644
index 0000000..b3db2d7
--- /dev/null
+++ b/common/graceChecker.js
@@ -0,0 +1,97 @@
+/**
+数据验证(表单验证)
+来自 grace.hcoder.net
+作者 hcoder 深海
+*/
+export default {
+ error:'',
+ check : function (data, rule){
+ for(var i = 0; i < rule.length; i++){
+ if (!rule[i].checkType){return true;}
+ if (!rule[i].name) {return true;}
+ if (!rule[i].errorMsg) {return true;}
+ if (!data[rule[i].name]) {this.error = rule[i].errorMsg; return false;}
+ switch (rule[i].checkType){
+ case 'string':
+ var reg = new RegExp('^.{' + rule[i].checkRule + '}$');
+ if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
+ break;
+ case 'int':
+ var reg = new RegExp('^(-[1-9]|[1-9])[0-9]{' + rule[i].checkRule + '}$');
+ if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
+ break;
+ break;
+ case 'between':
+ if (!this.isNumber(data[rule[i].name])){
+ this.error = rule[i].errorMsg;
+ return false;
+ }
+ var minMax = rule[i].checkRule.split(',');
+ minMax[0] = Number(minMax[0]);
+ minMax[1] = Number(minMax[1]);
+ if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
+ this.error = rule[i].errorMsg;
+ return false;
+ }
+ break;
+ case 'betweenD':
+ var reg = /^-?[1-9][0-9]?$/;
+ if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+ var minMax = rule[i].checkRule.split(',');
+ minMax[0] = Number(minMax[0]);
+ minMax[1] = Number(minMax[1]);
+ if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
+ this.error = rule[i].errorMsg;
+ return false;
+ }
+ break;
+ case 'betweenF':
+ var reg = /^-?[0-9][0-9]?.+[0-9]+$/;
+ if (!reg.test(data[rule[i].name])){this.error = rule[i].errorMsg; return false;}
+ var minMax = rule[i].checkRule.split(',');
+ minMax[0] = Number(minMax[0]);
+ minMax[1] = Number(minMax[1]);
+ if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
+ this.error = rule[i].errorMsg;
+ return false;
+ }
+ break;
+ case 'same':
+ if (data[rule[i].name] != rule[i].checkRule) { this.error = rule[i].errorMsg; return false;}
+ break;
+ case 'notsame':
+ if (data[rule[i].name] == rule[i].checkRule) { this.error = rule[i].errorMsg; return false; }
+ break;
+ case 'email':
+ var reg = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
+ if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+ break;
+ case 'phoneno':
+ var reg = /^1[0-9]{10,10}$/;
+ if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+ break;
+ case 'zipcode':
+ var reg = /^[0-9]{6}$/;
+ if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+ break;
+ case 'reg':
+ var reg = new RegExp(rule[i].checkRule);
+ if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+ break;
+ case 'in':
+ if(rule[i].checkRule.indexOf(data[rule[i].name]) == -1){
+ this.error = rule[i].errorMsg; return false;
+ }
+ break;
+ case 'notnull':
+ if(data[rule[i].name] == null || data[rule[i].name].length < 1){this.error = rule[i].errorMsg; return false;}
+ break;
+ }
+ }
+ return true;
+ },
+ isNumber : function (checkVal){
+ var reg = /^-?[1-9][0-9]?.?[0-9]*$/;
+ return reg.test(checkVal);
+ }
+}
\ No newline at end of file
diff --git a/common/html-parser.js b/common/html-parser.js
new file mode 100644
index 0000000..20a89b2
--- /dev/null
+++ b/common/html-parser.js
@@ -0,0 +1,352 @@
+/*
+ * HTML5 Parser By Sam Blowes
+ *
+ * Designed for HTML5 documents
+ *
+ * Original code by John Resig (ejohn.org)
+ * http://ejohn.org/blog/pure-javascript-html-parser/
+ * Original code by Erik Arvidsson, Mozilla Public License
+ * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
+ *
+ * ----------------------------------------------------------------------------
+ * License
+ * ----------------------------------------------------------------------------
+ *
+ * This code is triple licensed using Apache Software License 2.0,
+ * Mozilla Public License or GNU Public License
+ *
+ * ////////////////////////////////////////////////////////////////////////////
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * ////////////////////////////////////////////////////////////////////////////
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * The Original Code is Simple HTML Parser.
+ *
+ * The Initial Developer of the Original Code is Erik Arvidsson.
+ * Portions created by Erik Arvidssson are Copyright (C) 2004. All Rights
+ * Reserved.
+ *
+ * ////////////////////////////////////////////////////////////////////////////
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ----------------------------------------------------------------------------
+ * Usage
+ * ----------------------------------------------------------------------------
+ *
+ * // Use like so:
+ * HTMLParser(htmlString, {
+ * start: function(tag, attrs, unary) {},
+ * end: function(tag) {},
+ * chars: function(text) {},
+ * comment: function(text) {}
+ * });
+ *
+ * // or to get an XML string:
+ * HTMLtoXML(htmlString);
+ *
+ * // or to get an XML DOM Document
+ * HTMLtoDOM(htmlString);
+ *
+ * // or to inject into an existing document/DOM node
+ * HTMLtoDOM(htmlString, document);
+ * HTMLtoDOM(htmlString, document.body);
+ *
+ */
+// Regular Expressions for parsing tags and attributes
+var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
+var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
+var attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; // Empty Elements - HTML 5
+
+var empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'); // Block Elements - HTML 5
+// fixed by xxx 将 ins 标签从块级名单中移除
+
+var block = makeMap('a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'); // Inline Elements - HTML 5
+
+var inline = makeMap('abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'); // Elements that you can, intentionally, leave open
+// (and which close themselves)
+
+var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); // Attributes that have their values filled in disabled="disabled"
+
+var fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'); // Special Elements (can contain anything)
+
+var special = makeMap('script,style');
+function HTMLParser(html, handler) {
+ var index;
+ var chars;
+ var match;
+ var stack = [];
+ var last = html;
+
+ stack.last = function () {
+ return this[this.length - 1];
+ };
+
+ while (html) {
+ chars = true; // Make sure we're not in a script or style element
+
+ if (!stack.last() || !special[stack.last()]) {
+ // Comment
+ if (html.indexOf('');
+
+ if (index >= 0) {
+ if (handler.comment) {
+ handler.comment(html.substring(4, index));
+ }
+
+ html = html.substring(index + 3);
+ chars = false;
+ } // end tag
+
+ } else if (html.indexOf('') == 0) {
+ match = html.match(endTag);
+
+ if (match) {
+ html = html.substring(match[0].length);
+ match[0].replace(endTag, parseEndTag);
+ chars = false;
+ } // start tag
+
+ } else if (html.indexOf('<') == 0) {
+ match = html.match(startTag);
+
+ if (match) {
+ html = html.substring(match[0].length);
+ match[0].replace(startTag, parseStartTag);
+ chars = false;
+ }
+ }
+
+ if (chars) {
+ index = html.indexOf('<');
+ var text = index < 0 ? html : html.substring(0, index);
+ html = index < 0 ? '' : html.substring(index);
+
+ if (handler.chars) {
+ handler.chars(text);
+ }
+ }
+ } else {
+ html = html.replace(new RegExp('([\\s\\S]*?)<\/' + stack.last() + '[^>]*>'), function (all, text) {
+ text = text.replace(/|/g, '$1$2');
+
+ if (handler.chars) {
+ handler.chars(text);
+ }
+
+ return '';
+ });
+ parseEndTag('', stack.last());
+ }
+
+ if (html == last) {
+ throw 'Parse Error: ' + html;
+ }
+
+ last = html;
+ } // Clean up any remaining tags
+
+
+ parseEndTag();
+
+ function parseStartTag(tag, tagName, rest, unary) {
+ tagName = tagName.toLowerCase();
+
+ if (block[tagName]) {
+ while (stack.last() && inline[stack.last()]) {
+ parseEndTag('', stack.last());
+ }
+ }
+
+ if (closeSelf[tagName] && stack.last() == tagName) {
+ parseEndTag('', tagName);
+ }
+
+ unary = empty[tagName] || !!unary;
+
+ if (!unary) {
+ stack.push(tagName);
+ }
+
+ if (handler.start) {
+ var attrs = [];
+ rest.replace(attr, function (match, name) {
+ var value = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ? arguments[4] : fillAttrs[name] ? name : '';
+ attrs.push({
+ name: name,
+ value: value,
+ escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') // "
+
+ });
+ });
+
+ if (handler.start) {
+ handler.start(tagName, attrs, unary);
+ }
+ }
+ }
+
+ function parseEndTag(tag, tagName) {
+ // If no tag name is provided, clean shop
+ if (!tagName) {
+ var pos = 0;
+ } // Find the closest opened tag of the same type
+ else {
+ for (var pos = stack.length - 1; pos >= 0; pos--) {
+ if (stack[pos] == tagName) {
+ break;
+ }
+ }
+ }
+
+ if (pos >= 0) {
+ // Close all the open elements, up the stack
+ for (var i = stack.length - 1; i >= pos; i--) {
+ if (handler.end) {
+ handler.end(stack[i]);
+ }
+ } // Remove the open elements from the stack
+
+
+ stack.length = pos;
+ }
+ }
+}
+
+function makeMap(str) {
+ var obj = {};
+ var items = str.split(',');
+
+ for (var i = 0; i < items.length; i++) {
+ obj[items[i]] = true;
+ }
+
+ return obj;
+}
+
+function removeDOCTYPE(html) {
+ return html.replace(/<\?xml.*\?>\n/, '').replace(/\n/, '').replace(/\n/, '');
+}
+
+function parseAttrs(attrs) {
+ return attrs.reduce(function (pre, attr) {
+ var value = attr.value;
+ var name = attr.name;
+
+ if (pre[name]) {
+ pre[name] = pre[name] + " " + value;
+ } else {
+ pre[name] = value;
+ }
+
+ return pre;
+ }, {});
+}
+
+function parseHtml(html) {
+ html = removeDOCTYPE(html);
+ var stacks = [];
+ var results = {
+ node: 'root',
+ children: []
+ };
+ HTMLParser(html, {
+ start: function start(tag, attrs, unary) {
+ var node = {
+ name: tag
+ };
+
+ if (attrs.length !== 0) {
+ node.attrs = parseAttrs(attrs);
+ }
+
+ if (unary) {
+ var parent = stacks[0] || results;
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ } else {
+ stacks.unshift(node);
+ }
+ },
+ end: function end(tag) {
+ var node = stacks.shift();
+ if (node.name !== tag) console.error('invalid state: mismatch end tag');
+
+ if (stacks.length === 0) {
+ results.children.push(node);
+ } else {
+ var parent = stacks[0];
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ }
+ },
+ chars: function chars(text) {
+ var node = {
+ type: 'text',
+ text: text
+ };
+
+ if (stacks.length === 0) {
+ results.children.push(node);
+ } else {
+ var parent = stacks[0];
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ }
+ },
+ comment: function comment(text) {
+ var node = {
+ node: 'comment',
+ text: text
+ };
+ var parent = stacks[0];
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ }
+ });
+ return results.children;
+}
+
+export default parseHtml;
diff --git a/common/operate.js b/common/operate.js
new file mode 100644
index 0000000..ee42fb9
--- /dev/null
+++ b/common/operate.js
@@ -0,0 +1,17 @@
+export default {
+ //接口
+ api: "http://127.0.0.1:8080/jeecg-boot/",
+ /*api: function () {
+ let version = wx.getAccountInfoSync().miniProgram.envVersion;
+ switch (version) {
+ case "dev": //开发预览版
+ return "http://127.0.0.1:8080/jeecg-boot/"
+ break;
+ case 'prod': //正式版
+ return "http://127.0.0.1:8080/jeecg-boot/"
+ break;
+ default: //未知,默认调用正式版
+ return "http://127.0.0.1:8080/jeecg-boot/"
+ }
+ }*/
+}
diff --git a/common/permission.js b/common/permission.js
new file mode 100644
index 0000000..d9249d9
--- /dev/null
+++ b/common/permission.js
@@ -0,0 +1,245 @@
+/// null = 未请求,1 = 已允许,0 = 拒绝|受限, 2 = 系统未开启
+
+var isIOS
+
+function album() {
+ var result = 0;
+ var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
+ var authStatus = PHPhotoLibrary.authorizationStatus();
+ if (authStatus === 0) {
+ result = null;
+ } else if (authStatus == 3) {
+ result = 1;
+ } else {
+ result = 0;
+ }
+ plus.ios.deleteObject(PHPhotoLibrary);
+ return result;
+}
+
+function camera() {
+ var result = 0;
+ var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
+ var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
+ if (authStatus === 0) {
+ result = null;
+ } else if (authStatus == 3) {
+ result = 1;
+ } else {
+ result = 0;
+ }
+ plus.ios.deleteObject(AVCaptureDevice);
+ return result;
+}
+
+function location() {
+ var result = 0;
+ var cllocationManger = plus.ios.import("CLLocationManager");
+ var enable = cllocationManger.locationServicesEnabled();
+ var status = cllocationManger.authorizationStatus();
+ if (!enable) {
+ result = 2;
+ } else if (status === 0) {
+ result = null;
+ } else if (status === 3 || status === 4) {
+ result = 1;
+ } else {
+ result = 0;
+ }
+ plus.ios.deleteObject(cllocationManger);
+ return result;
+}
+
+function push() {
+ var result = 0;
+ var UIApplication = plus.ios.import("UIApplication");
+ var app = UIApplication.sharedApplication();
+ var enabledTypes = 0;
+ if (app.currentUserNotificationSettings) {
+ var settings = app.currentUserNotificationSettings();
+ enabledTypes = settings.plusGetAttribute("types");
+ if (enabledTypes == 0) {
+ result = 0;
+ console.log("推送权限没有开启");
+ } else {
+ result = 1;
+ console.log("已经开启推送功能!")
+ }
+ plus.ios.deleteObject(settings);
+ } else {
+ enabledTypes = app.enabledRemoteNotificationTypes();
+ if (enabledTypes == 0) {
+ result = 3;
+ console.log("推送权限没有开启!");
+ } else {
+ result = 4;
+ console.log("已经开启推送功能!")
+ }
+ }
+ plus.ios.deleteObject(app);
+ plus.ios.deleteObject(UIApplication);
+ return result;
+}
+
+function contact() {
+ var result = 0;
+ var CNContactStore = plus.ios.import("CNContactStore");
+ var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
+ if (cnAuthStatus === 0) {
+ result = null;
+ } else if (cnAuthStatus == 3) {
+ result = 1;
+ } else {
+ result = 0;
+ }
+ plus.ios.deleteObject(CNContactStore);
+ return result;
+}
+
+function record() {
+ var result = null;
+ var avaudiosession = plus.ios.import("AVAudioSession");
+ var avaudio = avaudiosession.sharedInstance();
+ var status = avaudio.recordPermission();
+ console.log("permissionStatus:" + status);
+ if (status === 1970168948) {
+ result = null;
+ } else if (status === 1735552628) {
+ result = 1;
+ } else {
+ result = 0;
+ }
+ plus.ios.deleteObject(avaudiosession);
+ return result;
+}
+
+function calendar() {
+ var result = null;
+ var EKEventStore = plus.ios.import("EKEventStore");
+ var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
+ if (ekAuthStatus == 3) {
+ result = 1;
+ console.log("日历权限已经开启");
+ } else {
+ console.log("日历权限没有开启");
+ }
+ plus.ios.deleteObject(EKEventStore);
+ return result;
+}
+
+function memo() {
+ var result = null;
+ var EKEventStore = plus.ios.import("EKEventStore");
+ var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
+ if (ekAuthStatus == 3) {
+ result = 1;
+ console.log("备忘录权限已经开启");
+ } else {
+ console.log("备忘录权限没有开启");
+ }
+ plus.ios.deleteObject(EKEventStore);
+ return result;
+}
+
+
+function requestIOS(permissionID) {
+ return new Promise((resolve, reject) => {
+ switch (permissionID) {
+ case "push":
+ resolve(push());
+ break;
+ case "location":
+ resolve(location());
+ break;
+ case "record":
+ resolve(record());
+ break;
+ case "camera":
+ resolve(camera());
+ break;
+ case "album":
+ resolve(album());
+ break;
+ case "contact":
+ resolve(contact());
+ break;
+ case "calendar":
+ resolve(calendar());
+ break;
+ case "memo":
+ resolve(memo());
+ break;
+ default:
+ resolve(0);
+ break;
+ }
+ });
+}
+
+function requestAndroid(permissionID) {
+ return new Promise((resolve, reject) => {
+ plus.android.requestPermissions(
+ [permissionID],
+ function(resultObj) {
+ var result = 0;
+ for (var i = 0; i < resultObj.granted.length; i++) {
+ var grantedPermission = resultObj.granted[i];
+ console.log('已获取的权限:' + grantedPermission);
+ result = 1
+ }
+ for (var i = 0; i < resultObj.deniedPresent.length; i++) {
+ var deniedPresentPermission = resultObj.deniedPresent[i];
+ console.log('拒绝本次申请的权限:' + deniedPresentPermission);
+ result = 0
+ }
+ for (var i = 0; i < resultObj.deniedAlways.length; i++) {
+ var deniedAlwaysPermission = resultObj.deniedAlways[i];
+ console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
+ result = -1
+ }
+ resolve(result);
+ },
+ function(error) {
+ console.log('result error: ' + error.message)
+ resolve({
+ code: error.code,
+ message: error.message
+ });
+ }
+ );
+ });
+}
+
+function gotoAppPermissionSetting() {
+ if (permission.isIOS) {
+ var UIApplication = plus.ios.import("UIApplication");
+ var application2 = UIApplication.sharedApplication();
+ var NSURL2 = plus.ios.import("NSURL");
+ var setting2 = NSURL2.URLWithString("app-settings:");
+ application2.openURL(setting2);
+ plus.ios.deleteObject(setting2);
+ plus.ios.deleteObject(NSURL2);
+ plus.ios.deleteObject(application2);
+ } else {
+ var Intent = plus.android.importClass("android.content.Intent");
+ var Settings = plus.android.importClass("android.provider.Settings");
+ var Uri = plus.android.importClass("android.net.Uri");
+ var mainActivity = plus.android.runtimeMainActivity();
+ var intent = new Intent();
+ intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
+ intent.setData(uri);
+ mainActivity.startActivity(intent);
+ }
+}
+
+const permission = {
+ get isIOS(){
+ return typeof isIOS === 'boolean' ? isIOS : (isIOS = uni.getSystemInfoSync().platform === 'ios')
+ },
+ requestIOS: requestIOS,
+ requestAndroid: requestAndroid,
+ gotoAppSetting: gotoAppPermissionSetting
+}
+
+export default permission
diff --git a/common/request.js b/common/request.js
new file mode 100644
index 0000000..5a219ff
--- /dev/null
+++ b/common/request.js
@@ -0,0 +1,124 @@
+/*网络请求*/
+import operate from '@/common/operate'
+// vuex 的使用 详情参考官网 https://uniapp.dcloud.io/vue-vuex
+import store from '../store/index.js'
+let token= uni.getStorageSync('token')
+token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MDU4ODQ5MDYsInVzZXJuYW1lIjoid2FuZ3hpYW9taW5nIn0.jRSoihlbs08ONDIsrk2U3l3pw8ZQK2Z1Oc2-mQaf7pw'
+export default class Request {
+ http(param) {
+ // 请求参数
+ var url = param.url,
+ method = param.method,
+ header = {
+ 'X-Access-Token':param.token || "",
+ },
+ data = param.data || {},
+ hideLoading = param.hideLoading || false;
+ /*token = param.token || "",*/
+
+ //拼接完整请求地址
+ var requestUrl = operate.api + url;
+ console.log(requestUrl)
+ //拼接完整请求地址(根据环境切换)
+ // var requestUrl = operate.api() + url;
+
+ //请求方式:GET或POST(POST需配置
+ // header: {'content-type' : "application/x-www-form-urlencoded"},)
+ if (method) {
+ method = method.toUpperCase(); //小写改为大写
+ if (method === "POST") {
+ header = {"content-type":'application/json',...header}
+ } else {
+ header = {"content-type":'application/x-www-form-urlencoded',...header}
+ }
+ }
+
+ //加载圈
+ if (!hideLoading) {
+ uni.showLoading({
+ title: '加载中...'
+ });
+ }
+
+ // 返回promise
+ return new Promise((resolve, reject) => {
+ // 请求
+ uni.request({
+ url: requestUrl,
+ data: data,
+ method: method,
+ header: header,
+ success: (res) => {
+ console.log('执行http请求')
+ // 判断 请求api 格式是否正确
+ /*if (res.statusCode && res.statusCode != 200) {
+ uni.showToast({
+ title: "api错误" + res.errMsg,
+ icon: 'none'
+ });
+ return;
+ }*/
+ // 将结果抛出
+ resolve(res.data)
+ },
+ //请求失败
+ fail: (e) => {
+ uni.showToast({
+ title: "" + e.data.msg,
+ icon: 'none'
+ });
+ resolve(e.data);
+ },
+ //请求完成
+ complete() {
+ //隐藏加载
+ if (!hideLoading) {
+ uni.hideLoading();
+ }
+ resolve();
+ return;
+ }
+ })
+ })
+ }
+ get(url,data,options={}){
+ options.method='get';
+ options.data=data;
+ options.url=url;
+ options.token=token;
+ return this.http(options);
+ }
+ get(url,data,headers={},options={}){
+ options.method='get';
+ options.data=data;
+ options.url=url;
+ options.token=token;
+ return this.http(options);
+ }
+
+ post(url,data,options={}){
+ options.method='post';
+ options.data=data;
+ options.url=url;
+ options.token=token;
+ return this.http(options);
+ }
+
+ post(url,data,headers={},options={}){
+ options.method='post';
+ options.data=data;
+ options.url=url;
+ options.token=token;
+ return this.http(options);
+ }
+
+ delete(url,data,options={}){
+ options.method='delete';
+ options.data=data;
+ options.url=url;
+ options.token=token;
+ return this.http(options);
+ }
+}
+
+
diff --git a/common/uni-nvue.css b/common/uni-nvue.css
new file mode 100644
index 0000000..6863ac9
--- /dev/null
+++ b/common/uni-nvue.css
@@ -0,0 +1,136 @@
+/* #ifndef APP-PLUS-NVUE */
+page {
+ min-height: 100%;
+ height: auto;
+}
+/* #endif */
+
+/* 解决头条小程序字体图标不显示问题,因为头条运行时自动插入了span标签,且有全局字体 */
+/* #ifdef MP-TOUTIAO */
+/* text :not(view) {
+ font-family: uniicons;
+} */
+/* #endif */
+
+.uni-icon {
+ font-family: uniicons;
+ font-weight: normal;
+}
+
+.uni-container {
+ padding: 15px;
+ background-color: #f8f8f8;
+}
+
+.uni-header-logo {
+ /* #ifdef H5 */
+ display: flex;
+ /* #endif */
+ padding: 15px 15px;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ margin-top: 10rpx;
+}
+
+.uni-header-image {
+ width: 80px;
+ height: 80px;
+}
+
+.uni-hello-text {
+ margin-bottom: 20px;
+}
+
+.hello-text {
+ color: #7A7E83;
+ font-size: 14px;
+ line-height: 20px;
+}
+
+.hello-link {
+ color: #7A7E83;
+ font-size: 14px;
+ line-height: 20px;
+}
+
+.uni-panel {
+ margin-bottom: 12px;
+}
+
+.uni-panel-h {
+ /* #ifdef H5 */
+ display: flex;
+ /* #endif */
+ background-color: #ffffff;
+ flex-direction: row !important;
+ /* justify-content: space-between !important; */
+ align-items: center !important;
+ padding: 12px;
+ /* #ifdef H5 */
+ cursor: pointer;
+ /* #endif */
+}
+/*
+.uni-panel-h:active {
+ background-color: #f8f8f8;
+}
+ */
+.uni-panel-h-on {
+ background-color: #f0f0f0;
+}
+
+.uni-panel-text {
+ flex: 1;
+ color: #000000;
+ font-size: 14px;
+ font-weight: normal;
+}
+
+.uni-panel-icon {
+ margin-left: 15px;
+ color: #999999;
+ font-size: 14px;
+ font-weight: normal;
+ transform: rotate(0deg);
+ transition-duration: 0s;
+ transition-property: transform;
+}
+
+.uni-panel-icon-on {
+ transform: rotate(180deg);
+}
+
+.uni-navigate-item {
+ /* #ifdef H5 */
+ display: flex;
+ /* #endif */
+ flex-direction: row;
+ align-items: center;
+ background-color: #FFFFFF;
+ border-top-style: solid;
+ border-top-color: #f0f0f0;
+ border-top-width: 1px;
+ padding: 12px;
+ /* #ifdef H5 */
+ cursor: pointer;
+ /* #endif */
+}
+
+.uni-navigate-item:active {
+ background-color: #f8f8f8;
+}
+
+.uni-navigate-text {
+ flex: 1;
+ color: #000000;
+ font-size: 14px;
+ font-weight: normal;
+}
+
+.uni-navigate-icon {
+ margin-left: 15px;
+ color: #999999;
+ font-size: 14px;
+ font-weight: normal;
+}
diff --git a/common/uni.css b/common/uni.css
new file mode 100644
index 0000000..534f524
--- /dev/null
+++ b/common/uni.css
@@ -0,0 +1,1509 @@
+@font-face {
+ font-family: uniicons;
+ font-weight: normal;
+ font-style: normal;
+ src: url('~@/static/uni.ttf') format('truetype');
+}
+
+/* #ifdef H5 */
+.fix-left-window {
+ padding-left: var(--window-left);
+}
+.pc-hide {
+ display: none !important;
+}
+/* #endif */
+
+/*通用 */
+
+/* view{
+ font-size:28rpx;
+ line-height:1.8;
+} */
+progress, checkbox-group{
+ width: 100%;
+}
+form {
+ width: 100%;
+}
+.uni-flex {
+ display: flex;
+ flex-direction: row;
+}
+.uni-flex-item {
+ flex: 1;
+}
+.uni-row {
+ flex-direction: row;
+}
+.uni-column {
+ flex-direction: column;
+}
+.uni-link{
+ color:#576B95;
+ font-size:26rpx;
+}
+.uni-center{
+ text-align:center;
+}
+.uni-inline-item{
+ display: flex;
+ flex-direction: row;
+ align-items:center;
+}
+.uni-inline-item text{
+ margin-right: 20rpx;
+}
+.uni-inline-item text:last-child{
+ margin-right: 0rpx;
+ margin-left: 20rpx;
+}
+
+/* page */
+.common-page-head{
+ padding:35rpx;
+ text-align: center;
+}
+.common-page-head-title {
+ display: inline-block;
+ padding: 0 40rpx;
+ font-size: 30rpx;
+ height: 88rpx;
+ line-height: 88rpx;
+ color: #BEBEBE;
+ box-sizing: border-box;
+ border-bottom: 2rpx solid #D8D8D8;
+}
+
+.uni-padding-wrap{
+ /* width:690rpx; */
+ padding:0 30rpx;
+}
+.uni-word {
+ text-align: center;
+ padding:200rpx 100rpx;
+}
+.uni-title {
+ font-size:30rpx;
+ font-weight:500;
+ padding:20rpx 0;
+ line-height:1.5;
+}
+.uni-text{
+ font-size:28rpx;
+}
+.uni-title text{
+ font-size:24rpx;
+ color:#888;
+}
+
+.uni-text-gray{
+ color: #ccc;
+}
+.uni-text-small {
+ font-size:24rpx;
+}
+.uni-common-mb{
+ margin-bottom:30rpx;
+}
+.uni-common-pb{
+ padding-bottom:30rpx;
+}
+.uni-common-pl{
+ padding-left:30rpx;
+}
+.uni-common-mt{
+ margin-top:30rpx;
+}
+/* 背景色 */
+.uni-bg-red{
+ background:#F76260; color:#FFF;
+}
+.uni-bg-green{
+ background:#09BB07; color:#FFF;
+}
+.uni-bg-blue{
+ background:#007AFF; color:#FFF;
+}
+/* 标题 */
+.uni-h1 {font-size: 80rpx; font-weight:700;}
+.uni-h2 {font-size: 60rpx; font-weight:700;}
+.uni-h3 {font-size: 48rpx; font-weight:700;}
+.uni-h4 {font-size: 36rpx; font-weight:700;}
+.uni-h5 {font-size: 28rpx; color: #8f8f94;}
+.uni-h6 {font-size: 24rpx; color: #8f8f94;}
+.uni-bold{font-weight:bold;}
+
+/* 文本溢出隐藏 */
+.uni-ellipsis {overflow: hidden; white-space: nowrap; text-overflow: ellipsis;}
+
+/* 竖向百分百按钮 */
+.uni-btn-v{
+ padding:10rpx 0;
+}
+.uni-btn-v button{margin:20rpx 0;}
+
+/* 表单 */
+.uni-form-item{
+ display:flex;
+ width:100%;
+ padding:10rpx 0;
+}
+.uni-form-item .title{
+ padding:10rpx 25rpx;
+}
+.uni-label {
+ width: 210rpx;
+ word-wrap: break-word;
+ word-break: break-all;
+ text-indent:20rpx;
+}
+.uni-input {
+ height: 50rpx;
+ padding: 15rpx 25rpx;
+ line-height:50rpx;
+ font-size:28rpx;
+ background:#FFF;
+ flex: 1;
+}
+radio-group, checkbox-group{
+ width:100%;
+}
+radio-group label, checkbox-group label{
+ padding-right:20rpx;
+}
+.uni-form-item .with-fun{
+ display:flex;
+ flex-wrap:nowrap;
+ background:#FFFFFF;
+}
+.uni-form-item .with-fun .uni-icon{
+ width:40px;
+ height:80rpx;
+ line-height:80rpx;
+ flex-shrink:0;
+}
+
+/* loadmore */
+.uni-loadmore{
+ height:80rpx;
+ line-height:80rpx;
+ text-align:center;
+ padding-bottom:30rpx;
+}
+/*数字角标*/
+/* .uni-badge,
+.uni-badge-default {
+ font-family: 'Helvetica Neue', Helvetica, sans-serif;
+ font-size: 12px;
+ line-height: 1;
+ display: inline-block;
+ padding: 3px 6px;
+ color: #333;
+ border-radius: 100px;
+ background-color: rgba(0, 0, 0, .15);
+} */
+.uni-badge.uni-badge-inverted {
+ padding: 0 5px 0 0;
+ color: #929292;
+ background-color: transparent
+}
+.uni-badge-primary {
+ color: #fff;
+ background-color: #007aff
+}
+.uni-badge-blue.uni-badge-inverted,
+.uni-badge-primary.uni-badge-inverted {
+ color: #007aff;
+ background-color: transparent
+}
+.uni-badge-green,
+.uni-badge-success {
+ color: #fff;
+ background-color: #4cd964;
+}
+.uni-badge-green.uni-badge-inverted,
+.uni-badge-success.uni-badge-inverted {
+ color: #4cd964;
+ background-color: transparent
+}
+.uni-badge-warning,
+.uni-badge-yellow {
+ color: #fff;
+ background-color: #f0ad4e
+}
+.uni-badge-warning.uni-badge-inverted,
+.uni-badge-yellow.uni-badge-inverted {
+ color: #f0ad4e;
+ background-color: transparent
+}
+.uni-badge-danger,
+.uni-badge-red {
+ color: #fff;
+ background-color: #dd524d
+}
+.uni-badge-danger.uni-badge-inverted,
+.uni-badge-red.uni-badge-inverted {
+ color: #dd524d;
+ background-color: transparent
+}
+.uni-badge-purple,
+.uni-badge-royal {
+ color: #fff;
+ background-color: #8a6de9
+}
+.uni-badge-purple.uni-badge-inverted,
+.uni-badge-royal.uni-badge-inverted {
+ color: #8a6de9;
+ background-color: transparent
+}
+
+/*折叠面板 */
+.uni-collapse-content {
+ height: 0;
+ width: 100%;
+ overflow: hidden;
+}
+.uni-collapse-content.uni-active {
+ height: auto;
+}
+
+/*卡片视图 */
+.uni-card {
+ background: #fff;
+ border-radius: 8rpx;
+ margin:20rpx 0;
+ position: relative;
+ /* box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, .3); */
+}
+.uni-card-content {
+ font-size: 30rpx;
+}
+.uni-card-content.image-view{
+ width: 100%;
+ margin: 0;
+}
+.uni-card-content-inner {
+ position: relative;
+ padding: 30rpx;
+}
+.uni-card-footer,
+.uni-card-header {
+ position: relative;
+ display: flex;
+ min-height: 50rpx;
+ padding: 20rpx 30rpx;
+ justify-content: space-between;
+ align-items: center;
+}
+.uni-card-header {
+ font-size: 36rpx;
+}
+.uni-card-footer {
+ color: #6d6d72;
+}
+.uni-card-footer:before,
+.uni-card-header:after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ height: 2rpx;
+ content: '';
+ -webkit-transform: scaleY(.5);
+ transform: scaleY(.5);
+ background-color: #c8c7cc;
+}
+.uni-card-header:after {
+ top: auto;
+ bottom: 0;
+}
+.uni-card-media {
+ justify-content: flex-start;
+}
+.uni-card-media-logo {
+ height: 84rpx;
+ width: 84rpx;
+ margin-right: 20rpx;
+}
+.uni-card-media-body {
+ height: 84rpx;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: flex-start;
+}
+.uni-card-media-text-top {
+ line-height: 36rpx;
+ font-size: 34rpx;
+}
+.uni-card-media-text-bottom {
+ line-height: 30rpx;
+ font-size: 28rpx;
+ color: #8f8f94;
+}
+.uni-card-link {
+ color: #007AFF;
+}
+
+/* 列表 */
+.uni-list {
+ background-color: #FFFFFF;
+ position: relative;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+}
+.uni-list:after {
+ position: absolute;
+ z-index: 10;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 1px;
+ content: '';
+ -webkit-transform: scaleY(.5);
+ transform: scaleY(.5);
+ background-color: #c8c7cc;
+}
+/* .uni-list::before {
+ position: absolute;
+ z-index: 10;
+ right: 0;
+ top: 0;
+ left: 0;
+ height: 1px;
+ content: '';
+ -webkit-transform: scaleY(.5);
+ transform: scaleY(.5);
+ background-color: #c8c7cc;
+} */
+.uni-list-cell {
+ position: relative;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+}
+.uni-list-cell-hover {
+ background-color: #eee;
+}
+.uni-list-cell-pd {
+ padding: 22rpx 30rpx;
+}
+.uni-list-cell-left {
+ white-space: nowrap;
+ font-size:28rpx;
+ padding: 0 30rpx;
+}
+.uni-list-cell-db,
+.uni-list-cell-right {
+ flex: 1;
+}
+.uni-list-cell::after {
+ position: absolute;
+ z-index: 3;
+ right: 0;
+ bottom: 0;
+ left: 30rpx;
+ height: 1px;
+ content: '';
+ -webkit-transform: scaleY(.5);
+ transform: scaleY(.5);
+ background-color: #c8c7cc;
+}
+.uni-list .uni-list-cell:last-child::after {
+ height: 0rpx;
+}
+.uni-list-cell-last.uni-list-cell::after {
+ height: 0rpx;
+}
+.uni-list-cell-divider {
+ position: relative;
+ display: flex;
+ color: #999;
+ background-color: #f7f7f7;
+ padding:15rpx 20rpx;
+}
+.uni-list-cell-divider::before {
+ position: absolute;
+ right: 0;
+ top: 0;
+ left: 0;
+ height: 1px;
+ content: '';
+ -webkit-transform: scaleY(.5);
+ transform: scaleY(.5);
+ background-color: #c8c7cc;
+}
+.uni-list-cell-divider::after {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0rpx;
+ height: 1px;
+ content: '';
+ -webkit-transform: scaleY(.5);
+ transform: scaleY(.5);
+ background-color: #c8c7cc;
+}
+.uni-list-cell-navigate {
+ font-size:30rpx;
+ padding: 22rpx 30rpx;
+ line-height: 48rpx;
+ position: relative;
+ display: flex;
+ box-sizing: border-box;
+ width: 100%;
+ flex: 1;
+ justify-content: space-between;
+ align-items: center;
+}
+.uni-list-cell-navigate {
+ padding-right: 36rpx;
+}
+.uni-navigate-badge {
+ padding-right: 50rpx;
+}
+.uni-list-cell-navigate.uni-navigate-right:after {
+ font-family: uniicons;
+ content: '\e583';
+ position: absolute;
+ right: 24rpx;
+ top: 50%;
+ color: #bbb;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+}
+.uni-list-cell-navigate.uni-navigate-bottom:after {
+ font-family: uniicons;
+ content: '\e581';
+ position: absolute;
+ right: 24rpx;
+ top: 50%;
+ color: #bbb;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+}
+.uni-list-cell-navigate.uni-navigate-bottom.uni-active::after {
+ font-family: uniicons;
+ content: '\e580';
+ position: absolute;
+ right: 24rpx;
+ top: 50%;
+ color: #bbb;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+}
+.uni-collapse.uni-list-cell {
+ flex-direction: column;
+}
+.uni-list-cell-navigate.uni-active {
+ background: #eee;
+}
+.uni-list.uni-collapse {
+ box-sizing: border-box;
+ height: 0;
+ overflow: hidden;
+}
+.uni-collapse .uni-list-cell {
+ padding-left: 20rpx;
+}
+.uni-collapse .uni-list-cell::after {
+ left: 52rpx;
+}
+.uni-list.uni-active {
+ height: auto;
+}
+
+/* 三行列表 */
+.uni-triplex-row {
+ display: flex;
+ flex: 1;
+ width: 100%;
+ box-sizing: border-box;
+ flex-direction: row;
+ padding: 22rpx 30rpx;
+}
+.uni-triplex-right,
+.uni-triplex-left {
+ display: flex;
+ flex-direction: column;
+}
+.uni-triplex-left {
+ width: 84%;
+}
+.uni-triplex-left .uni-title{
+ padding:8rpx 0;
+}
+.uni-triplex-left .uni-text, .uni-triplex-left .uni-text-small{color:#999999;}
+.uni-triplex-right {
+ width: 16%;
+ text-align: right;
+}
+
+/* 图文列表 */
+.uni-media-list {
+ padding: 22rpx 30rpx;
+ box-sizing: border-box;
+ display: flex;
+ width: 100%;
+ flex-direction: row;
+}
+.uni-navigate-right.uni-media-list {
+ padding-right: 74rpx;
+}
+.uni-pull-right {
+ flex-direction: row-reverse;
+}
+.uni-pull-right>.uni-media-list-logo {
+ margin-right: 0rpx;
+ margin-left: 20rpx;
+}
+.uni-media-list-logo {
+ height: 84rpx;
+ width: 84rpx;
+ margin-right: 20rpx;
+}
+.uni-media-list-logo image {
+ height: 100%;
+ width: 100%;
+}
+.uni-media-list-body {
+ height: 84rpx;
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: flex-start;
+ overflow: hidden;
+}
+.uni-media-list-text-top {
+ width: 100%;
+ line-height: 36rpx;
+ font-size: 30rpx;
+}
+.uni-media-list-text-bottom {
+ width: 100%;
+ line-height: 30rpx;
+ font-size: 26rpx;
+ color: #8f8f94;
+}
+
+/* 九宫格 */
+.uni-grid-9 {
+ background: #f2f2f2;
+ width: 750rpx;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ border-top: 2rpx solid #eee;
+}
+.uni-grid-9-item {
+ width: 250rpx;
+ height: 200rpx;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ border-bottom: 2rpx solid;
+ border-right: 2rpx solid;
+ border-color: #eee;
+ box-sizing: border-box;
+}
+.no-border-right {
+ border-right: none;
+}
+.uni-grid-9-image {
+ width: 100rpx;
+ height: 100rpx;
+}
+.uni-grid-9-text {
+ width: 250rpx;
+ line-height: 4rpx;
+ height: 40rpx;
+ text-align: center;
+ font-size: 30rpx;
+}
+.uni-grid-9-item-hover {
+ background: rgba(0, 0, 0, 0.1);
+}
+
+/* 上传 */
+.uni-uploader {
+ flex: 1;
+ flex-direction: column;
+}
+.uni-uploader-head {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+}
+.uni-uploader-info {
+ color: #B2B2B2;
+}
+.uni-uploader-body {
+ margin-top: 16rpx;
+}
+.uni-uploader__files {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+.uni-uploader__file {
+ margin: 10rpx;
+ width: 210rpx;
+ height: 210rpx;
+}
+.uni-uploader__img {
+ display: block;
+ width: 210rpx;
+ height: 210rpx;
+}
+.uni-uploader__input-box {
+ position: relative;
+ margin:10rpx;
+ width: 208rpx;
+ height: 208rpx;
+ border: 2rpx solid #D9D9D9;
+}
+.uni-uploader__input-box:before,
+.uni-uploader__input-box:after {
+ content: " ";
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ background-color: #D9D9D9;
+}
+.uni-uploader__input-box:before {
+ width: 4rpx;
+ height: 79rpx;
+}
+.uni-uploader__input-box:after {
+ width: 79rpx;
+ height: 4rpx;
+}
+.uni-uploader__input-box:active {
+ border-color: #999999;
+}
+.uni-uploader__input-box:active:before,
+.uni-uploader__input-box:active:after {
+ background-color: #999999;
+}
+.uni-uploader__input {
+ position: absolute;
+ z-index: 1;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+}
+
+/*问题反馈*/
+.feedback-title {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ padding: 20rpx;
+ color: #8f8f94;
+ font-size: 28rpx;
+}
+.feedback-star-view.feedback-title {
+ justify-content: flex-start;
+ margin: 0;
+}
+.feedback-quick {
+ position: relative;
+ padding-right: 40rpx;
+}
+.feedback-quick:after {
+ font-family: uniicons;
+ font-size: 40rpx;
+ content: '\e581';
+ position: absolute;
+ right: 0;
+ top: 50%;
+ color: #bbb;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+}
+.feedback-body {
+ background: #fff;
+}
+.feedback-textare {
+ height: 200rpx;
+ font-size: 34rpx;
+ line-height: 50rpx;
+ width: 100%;
+ box-sizing: border-box;
+ padding: 20rpx 30rpx 0;
+}
+.feedback-input {
+ font-size: 34rpx;
+ height: 50rpx;
+ min-height: 50rpx;
+ padding: 15rpx 20rpx;
+ line-height: 50rpx;
+}
+.feedback-uploader {
+ padding: 22rpx 20rpx;
+}
+.feedback-star {
+ font-family: uniicons;
+ font-size: 40rpx;
+ margin-left: 6rpx;
+}
+.feedback-star-view {
+ margin-left: 20rpx;
+}
+.feedback-star:after {
+ content: '\e408';
+}
+.feedback-star.active {
+ color: #FFB400;
+}
+.feedback-star.active:after {
+ content: '\e438';
+}
+.feedback-submit {
+ background: #007AFF;
+ color: #FFFFFF;
+ margin: 20rpx;
+}
+
+/* input group */
+.uni-input-group {
+ position: relative;
+ padding: 0;
+ border: 0;
+ background-color: #fff;
+}
+
+.uni-input-group:before {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ height: 2rpx;
+ content: '';
+ transform: scaleY(.5);
+ background-color: #c8c7cc;
+}
+
+.uni-input-group:after {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 2rpx;
+ content: '';
+ transform: scaleY(.5);
+ background-color: #c8c7cc;
+}
+
+.uni-input-row {
+ position: relative;
+ display: flex;
+ flex-direction: row;
+ font-size:28rpx;
+ padding: 22rpx 30rpx;
+ justify-content: space-between;
+}
+
+.uni-input-group .uni-input-row:after {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 30rpx;
+ height: 2rpx;
+ content: '';
+ transform: scaleY(.5);
+ background-color: #c8c7cc;
+}
+
+.uni-input-row label {
+ line-height: 70rpx;
+}
+
+/* textarea */
+.uni-textarea{
+ width:100%;
+ background:#FFF;
+}
+.uni-textarea textarea{
+ width:96%;
+ padding:18rpx 2%;
+ line-height:1.6;
+ font-size:28rpx;
+ height:150rpx;
+}
+
+/* tab bar */
+.uni-tab-bar {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ overflow: hidden;
+ height: 100%;
+}
+
+.uni-tab-bar .list {
+ width: 750rpx;
+ height: 100%;
+}
+
+.uni-swiper-tab {
+ width: 100%;
+ white-space: nowrap;
+ line-height: 100rpx;
+ height: 100rpx;
+ border-bottom: 1px solid #c8c7cc;
+}
+
+.swiper-tab-list {
+ font-size: 30rpx;
+ width: 150rpx;
+ display: inline-block;
+ text-align: center;
+ color: #555;
+}
+
+.uni-tab-bar .active {
+ color: #007AFF;
+}
+
+.uni-tab-bar .swiper-box {
+ flex: 1;
+ width: 100%;
+ height: calc(100% - 100rpx);
+}
+
+.uni-tab-bar-loading{
+ padding:20rpx 0;
+}
+
+/* comment */
+.uni-comment{padding:5rpx 0; display: flex; flex-grow:1; flex-direction: column;}
+.uni-comment-list{flex-wrap:nowrap; padding:10rpx 0; margin:10rpx 0; width:100%; display: flex;}
+.uni-comment-face{width:70rpx; height:70rpx; border-radius:100%; margin-right:20rpx; flex-shrink:0; overflow:hidden;}
+.uni-comment-face image{width:100%; border-radius:100%;}
+.uni-comment-body{width:100%;}
+.uni-comment-top{line-height:1.5em; justify-content:space-between;}
+.uni-comment-top text{color:#0A98D5; font-size:24rpx;}
+.uni-comment-date{line-height:38rpx; flex-direction:row; justify-content:space-between; display:flex !important; flex-grow:1;}
+.uni-comment-date view{color:#666666; font-size:24rpx; line-height:38rpx;}
+.uni-comment-content{line-height:1.6em; font-size:28rpx; padding:8rpx 0;}
+.uni-comment-replay-btn{background:#FFF; font-size:24rpx; line-height:28rpx; padding:5rpx 20rpx; border-radius:30rpx; color:#333 !important; margin:0 10rpx;}
+
+/* swiper msg */
+.uni-swiper-msg{width:100%; padding:12rpx 0; flex-wrap:nowrap; display:flex;}
+.uni-swiper-msg-icon{width:50rpx; margin-right:20rpx;}
+.uni-swiper-msg-icon image{width:100%; flex-shrink:0;}
+.uni-swiper-msg swiper{width:100%; height:50rpx;}
+.uni-swiper-msg swiper-item{line-height:50rpx;}
+
+/* product */
+.uni-product-list {
+ display: flex;
+ width: 100%;
+ flex-wrap: wrap;
+ flex-direction: row;
+}
+
+.uni-product {
+ padding: 20rpx;
+ display: flex;
+ flex-direction: column;
+}
+
+.image-view {
+ height: 330rpx;
+ width: 330rpx;
+ margin:12rpx 0;
+}
+
+.uni-product-image {
+ height: 330rpx;
+ width: 330rpx;
+}
+
+.uni-product-title {
+ width: 300rpx;
+ word-break: break-all;
+ display: -webkit-box;
+ overflow: hidden;
+ line-height:1.5;
+ text-overflow: ellipsis;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+}
+
+.uni-product-price {
+ margin-top:10rpx;
+ font-size: 28rpx;
+ line-height:1.5;
+ position: relative;
+}
+
+.uni-product-price-original {
+ color: #e80080;
+}
+
+.uni-product-price-favour {
+ color: #888888;
+ text-decoration: line-through;
+ margin-left: 10rpx;
+}
+
+.uni-product-tip {
+ position: absolute;
+ right: 10rpx;
+ background-color: #ff3333;
+ color: #ffffff;
+ padding: 0 10rpx;
+ border-radius: 5rpx;
+}
+
+/* timeline */
+.uni-timeline {
+ margin: 35rpx 0;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+ }
+
+
+ .uni-timeline-item {
+ display: flex;
+ flex-direction: row;
+ position: relative;
+ padding-bottom: 20rpx;
+ box-sizing: border-box;
+ overflow: hidden;
+
+ }
+
+ .uni-timeline-item .uni-timeline-item-keynode {
+ width: 160rpx;
+ flex-shrink: 0;
+ box-sizing: border-box;
+ padding-right: 20rpx;
+ text-align: right;
+ line-height: 65rpx;
+ }
+
+ .uni-timeline-item .uni-timeline-item-divider {
+ flex-shrink: 0;
+ position: relative;
+ width: 30rpx;
+ height: 30rpx;
+ top: 15rpx;
+ border-radius: 50%;
+ background-color: #bbb;
+ }
+
+
+
+ .uni-timeline-item-divider::before,
+ .uni-timeline-item-divider::after {
+ position: absolute;
+ left: 15rpx;
+ width: 1rpx;
+ height: 100vh;
+ content: '';
+ background: inherit;
+ }
+
+ .uni-timeline-item-divider::before {
+ bottom: 100%;
+ }
+
+ .uni-timeline-item-divider::after {
+ top: 100%;
+ }
+
+
+ .uni-timeline-last-item .uni-timeline-item-divider:after {
+ display: none;
+ }
+
+ .uni-timeline-first-item .uni-timeline-item-divider:before {
+ display: none;
+ }
+
+ .uni-timeline-item .uni-timeline-item-content {
+ padding-left: 20rpx;
+ }
+
+ .uni-timeline-last-item .bottom-border::after{
+ display: none;
+ }
+
+ .uni-timeline-item-content .datetime{
+ color: #CCCCCC;
+ }
+
+ /* 自定义节点颜色 */
+ .uni-timeline-last-item .uni-timeline-item-divider{
+ background-color: #1AAD19;
+ }
+
+
+/* uni-icon */
+
+.uni-icon {
+ font-family: uniicons;
+ font-size: 24px;
+ font-weight: normal;
+ font-style: normal;
+ line-height: 1;
+ display: inline-block;
+ text-decoration: none;
+ -webkit-font-smoothing: antialiased;
+}
+
+.uni-icon.uni-active {
+ color: #007aff;
+}
+
+.uni-icon-contact:before {
+ content: '\e100';
+}
+
+.uni-icon-person:before {
+ content: '\e101';
+}
+
+.uni-icon-personadd:before {
+ content: '\e102';
+}
+
+.uni-icon-contact-filled:before {
+ content: '\e130';
+}
+
+.uni-icon-person-filled:before {
+ content: '\e131';
+}
+
+.uni-icon-personadd-filled:before {
+ content: '\e132';
+}
+
+.uni-icon-phone:before {
+ content: '\e200';
+}
+
+.uni-icon-email:before {
+ content: '\e201';
+}
+
+.uni-icon-chatbubble:before {
+ content: '\e202';
+}
+
+.uni-icon-chatboxes:before {
+ content: '\e203';
+}
+
+.uni-icon-phone-filled:before {
+ content: '\e230';
+}
+
+.uni-icon-email-filled:before {
+ content: '\e231';
+}
+
+.uni-icon-chatbubble-filled:before {
+ content: '\e232';
+}
+
+.uni-icon-chatboxes-filled:before {
+ content: '\e233';
+}
+
+.uni-icon-weibo:before {
+ content: '\e260';
+}
+
+.uni-icon-weixin:before {
+ content: '\e261';
+}
+
+.uni-icon-pengyouquan:before {
+ content: '\e262';
+}
+
+.uni-icon-chat:before {
+ content: '\e263';
+}
+
+.uni-icon-qq:before {
+ content: '\e264';
+}
+
+.uni-icon-videocam:before {
+ content: '\e300';
+}
+
+.uni-icon-camera:before {
+ content: '\e301';
+}
+
+.uni-icon-mic:before {
+ content: '\e302';
+}
+
+.uni-icon-location:before {
+ content: '\e303';
+}
+
+.uni-icon-mic-filled:before,
+.uni-icon-speech:before {
+ content: '\e332';
+}
+
+.uni-icon-location-filled:before {
+ content: '\e333';
+}
+
+.uni-icon-micoff:before {
+ content: '\e360';
+}
+
+.uni-icon-image:before {
+ content: '\e363';
+}
+
+.uni-icon-map:before {
+ content: '\e364';
+}
+
+.uni-icon-compose:before {
+ content: '\e400';
+}
+
+.uni-icon-trash:before {
+ content: '\e401';
+}
+
+.uni-icon-upload:before {
+ content: '\e402';
+}
+
+.uni-icon-download:before {
+ content: '\e403';
+}
+
+.uni-icon-close:before {
+ content: '\e404';
+}
+
+.uni-icon-redo:before {
+ content: '\e405';
+}
+
+.uni-icon-undo:before {
+ content: '\e406';
+}
+
+.uni-icon-refresh:before {
+ content: '\e407';
+}
+
+.uni-icon-star:before {
+ content: '\e408';
+}
+
+.uni-icon-plus:before {
+ content: '\e409';
+}
+
+.uni-icon-minus:before {
+ content: '\e410';
+}
+
+.uni-icon-circle:before,
+.uni-icon-checkbox:before {
+ content: '\e411';
+}
+
+.uni-icon-close-filled:before,
+.uni-icon-clear:before {
+ content: '\e434';
+}
+
+.uni-icon-refresh-filled:before {
+ content: '\e437';
+}
+
+.uni-icon-star-filled:before {
+ content: '\e438';
+}
+
+.uni-icon-plus-filled:before {
+ content: '\e439';
+}
+
+.uni-icon-minus-filled:before {
+ content: '\e440';
+}
+
+.uni-icon-circle-filled:before {
+ content: '\e441';
+}
+
+.uni-icon-checkbox-filled:before {
+ content: '\e442';
+}
+
+.uni-icon-closeempty:before {
+ content: '\e460';
+}
+
+.uni-icon-refreshempty:before {
+ content: '\e461';
+}
+
+.uni-icon-reload:before {
+ content: '\e462';
+}
+
+.uni-icon-starhalf:before {
+ content: '\e463';
+}
+
+.uni-icon-spinner:before {
+ content: '\e464';
+}
+
+.uni-icon-spinner-cycle:before {
+ content: '\e465';
+}
+
+.uni-icon-search:before {
+ content: '\e466';
+}
+
+.uni-icon-plusempty:before {
+ content: '\e468';
+}
+
+.uni-icon-forward:before {
+ content: '\e470';
+}
+
+.uni-icon-back:before,
+.uni-icon-left-nav:before {
+ content: '\e471';
+}
+
+.uni-icon-checkmarkempty:before {
+ content: '\e472';
+}
+
+.uni-icon-home:before {
+ content: '\e500';
+}
+
+.uni-icon-navigate:before {
+ content: '\e501';
+}
+
+.uni-icon-gear:before {
+ content: '\e502';
+}
+
+.uni-icon-paperplane:before {
+ content: '\e503';
+}
+
+.uni-icon-info:before {
+ content: '\e504';
+}
+
+.uni-icon-help:before {
+ content: '\e505';
+}
+
+.uni-icon-locked:before {
+ content: '\e506';
+}
+
+.uni-icon-more:before {
+ content: '\e507';
+}
+
+.uni-icon-flag:before {
+ content: '\e508';
+}
+
+.uni-icon-home-filled:before {
+ content: '\e530';
+}
+
+.uni-icon-gear-filled:before {
+ content: '\e532';
+}
+
+.uni-icon-info-filled:before {
+ content: '\e534';
+}
+
+.uni-icon-help-filled:before {
+ content: '\e535';
+}
+
+.uni-icon-more-filled:before {
+ content: '\e537';
+}
+
+.uni-icon-settings:before {
+ content: '\e560';
+}
+
+.uni-icon-list:before {
+ content: '\e562';
+}
+
+.uni-icon-bars:before {
+ content: '\e563';
+}
+
+.uni-icon-loop:before {
+ content: '\e565';
+}
+
+.uni-icon-paperclip:before {
+ content: '\e567';
+}
+
+.uni-icon-eye:before {
+ content: '\e568';
+}
+
+.uni-icon-arrowup:before {
+ content: '\e580';
+}
+
+.uni-icon-arrowdown:before {
+ content: '\e581';
+}
+
+.uni-icon-arrowleft:before {
+ content: '\e582';
+}
+
+.uni-icon-arrowright:before {
+ content: '\e583';
+}
+
+.uni-icon-arrowthinup:before {
+ content: '\e584';
+}
+
+.uni-icon-arrowthindown:before {
+ content: '\e585';
+}
+
+.uni-icon-arrowthinleft:before {
+ content: '\e586';
+}
+
+.uni-icon-arrowthinright:before {
+ content: '\e587';
+}
+
+.uni-icon-pulldown:before {
+ content: '\e588';
+}
+
+.uni-icon-scan:before {
+ content: "\e612";
+}
+
+/* 分界线 */
+.uni-divider{
+ height: 110rpx;
+ display: flex;
+ align-items:center;
+ justify-content: center;
+ position: relative;
+}
+.uni-divider__content{
+ font-size: 28rpx;
+ color: #999;
+ padding: 0 20rpx;
+ position: relative;
+ z-index: 101;
+ background: #F4F5F6;
+}
+.uni-divider__line{
+ background-color: #CCCCCC;
+ height: 1px;
+ width: 100%;
+ position: absolute;
+ z-index: 100;
+ top: 50%;
+ left: 0;
+ transform: translateY(50%);
+}
+
+.left-win-active text{
+ color: #007AFF !important;
+}
+
+.frow .flex-item-1 {
+ width: 10%;
+}
+
+.frow .flex-item-2 {
+ width: 20%;
+}
+
+.frow .flex-item-25 {
+ width: 25%;
+}
+
+.frow .flex-item-3 {
+ width: 30%;
+}
+.frow .flex-item-33 {
+ width: 33%;
+}
+
+.frow .flex-item-35 {
+ width: 35%;
+}
+
+.frow .flex-item-4 {
+ width: 40%;
+}
+
+.frow .flex-item-5 {
+ width: 50%;
+}
+
+.frow .flex-item-6 {
+ width: 60%;
+}
+
+.frow .flex-item-65 {
+ width: 65%;
+}
+
+.frow .flex-item-7 {
+ width: 70%;
+}
+
+.frow .flex-item-8 {
+ width: 80%;
+}
+
+.frow .flex-item-9 {
+ width: 90%;
+}
diff --git a/common/util.js b/common/util.js
new file mode 100644
index 0000000..eddb458
--- /dev/null
+++ b/common/util.js
@@ -0,0 +1,73 @@
+function formatTime(time) {
+ if (typeof time !== 'number' || time < 0) {
+ return time
+ }
+
+ var hour = parseInt(time / 3600)
+ time = time % 3600
+ var minute = parseInt(time / 60)
+ time = time % 60
+ var second = time
+
+ return ([hour, minute, second]).map(function(n) {
+ n = n.toString()
+ return n[1] ? n : '0' + n
+ }).join(':')
+}
+
+function formatLocation(longitude, latitude) {
+ if (typeof longitude === 'string' && typeof latitude === 'string') {
+ longitude = parseFloat(longitude)
+ latitude = parseFloat(latitude)
+ }
+
+ longitude = longitude.toFixed(2)
+ latitude = latitude.toFixed(2)
+
+ return {
+ longitude: longitude.toString().split('.'),
+ latitude: latitude.toString().split('.')
+ }
+}
+var dateUtils = {
+ UNITS: {
+ '年': 31557600000,
+ '月': 2629800000,
+ '天': 86400000,
+ '小时': 3600000,
+ '分钟': 60000,
+ '秒': 1000
+ },
+ humanize: function(milliseconds) {
+ var humanize = '';
+ for (var key in this.UNITS) {
+ if (milliseconds >= this.UNITS[key]) {
+ humanize = Math.floor(milliseconds / this.UNITS[key]) + key + '前';
+ break;
+ }
+ }
+ return humanize || '刚刚';
+ },
+ format: function(dateStr) {
+ var date = this.parse(dateStr)
+ var diff = Date.now() - date.getTime();
+ if (diff < this.UNITS['天']) {
+ return this.humanize(diff);
+ }
+ var _format = function(number) {
+ return (number < 10 ? ('0' + number) : number);
+ };
+ return date.getFullYear() + '/' + _format(date.getMonth() + 1) + '/' + _format(date.getDate()) + '-' +
+ _format(date.getHours()) + ':' + _format(date.getMinutes());
+ },
+ parse: function(str) { //将"yyyy-mm-dd HH:MM:ss"格式的字符串,转化为一个Date对象
+ var a = str.split(/[^0-9]/);
+ return new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]);
+ }
+};
+
+export {
+ formatTime,
+ formatLocation,
+ dateUtils
+}
diff --git a/components/amap-wx/js/util.js b/components/amap-wx/js/util.js
new file mode 100644
index 0000000..65779df
--- /dev/null
+++ b/components/amap-wx/js/util.js
@@ -0,0 +1,181 @@
+import amap from '@/components/amap-wx/lib/amap-wx.js';
+// 地铁颜色图
+const line = {
+ '1号线': '#C43B33',
+ '2号线': '#016299',
+ '4号线/大兴线': '#008E9C',
+ '5号线': '#A42380',
+ '6号线': '#D09900',
+ '7号线': '#F2C172',
+ '8号线': '#009D6A',
+ '9号线': '#8FC41E',
+ '10号线': '#009DBE',
+ '13号线': '#F9E701',
+ '14号线东段': '#D4A7A2',
+ '14号线西段': '#D4A7A2',
+ '15号线': '#5D2D69',
+ '八通线': '#C33A32',
+ '昌平线': '#DE82B1',
+ '亦庄线': '#E40177',
+ '房山线': '#E66021',
+ '机场线': '#A29BBC',
+}
+
+// 150500:地铁站 ,150700:公交站 , 190700:地名地址
+const typecode = [{
+ id: '150500',
+ icon: 'icon-ditie'
+}, {
+ id: '150700',
+ icon: 'icon-gongjiao'
+}, {
+ id: '190700',
+ icon: 'icon-gonglu'
+}];
+
+const util = {
+ key:'b526b09b86cd2996e7732be8ab8c4430',
+ /**
+ * 初始化高德地图api
+ */
+ mapInit() {
+ return new amap.AMapWX({
+ key: this.key
+ });
+ },
+ // 服务状态吗
+ typecode,
+ /**
+ * 获取地图颜色
+ */
+ lineColor(name) {
+ if (line[name]) {
+ return line[name];
+ } else {
+ return '#ccc';
+ }
+ },
+ /**
+ * 关键字颜色变化
+ */
+ serachNmme(val, name) {
+ let namestr = new RegExp(val);
+ let nameresult =
+ `
+ ${name.replace(namestr, "" + val + '')}
+
`
+ .trim();
+
+ return nameresult;
+ },
+ /**
+ * 地址转地铁线路
+ */
+ addressToLine(address, type) {
+ let addr = address.split(';');
+ let dt = '';
+ addr.forEach(elm => {
+ let color = '#cccccc';
+ if (type === typecode[0].id) {
+ color = this.lineColor(elm)
+ } else if (type === typecode[1].id) {
+ color = '#4075cb'
+ }
+ let style = 'margin:5px 0;margin-right:5px;padding:0 5px;background:' + color +
+ ';font-size:12px;color:#fff;border-radius:3px;';
+ dt += `${elm}
`;
+
+ });
+ return `${dt}
`;
+ },
+ /**
+ * 数据处理
+ */
+ dataHandle(item, val) {
+ // 改变字体颜色
+ if (val) {
+ item.nameNodes = util.serachNmme(val, item.name);
+ } else {
+ item.nameNodes = `${item.name}
`;
+
+ }
+ // 地址解析 地铁
+ if (
+ item.typecode === util.typecode[0].id ||
+ item.typecode === util.typecode[1].id
+ ) {
+ item.addressNodes = util.addressToLine(item.address, item.typecode);
+ if (item.typecode === util.typecode[0].id) {
+ item.icon = util.typecode[0].icon;
+ } else if (item.typecode === util.typecode[1].id) {
+ item.icon = util.typecode[1].icon;
+ }
+ } else {
+ item.addressNodes = `${item.district}${
+ item.address.length > 0 ? '·' + item.address : ''
+ }`.trim();
+ item.icon = 'icon-weizhi';
+ }
+
+ if (item.location && item.location.length === 0) {
+ item.icon = 'icon-sousuo';
+ }
+
+ return item;
+ },
+ /**
+ * 存储历史数据
+ * val [string | object]需要存储的内容
+ */
+ setHistory(val) {
+ let searchHistory = uni.getStorageSync('search:history');
+ if (!searchHistory) searchHistory = [];
+ let serachData = {};
+ if (typeof(val) === 'string') {
+ serachData = {
+ adcode: [],
+ address: [],
+ city: [],
+ district: [],
+ id: [],
+ location: [],
+ name: val,
+ typecode: []
+ };
+ } else {
+ serachData = val
+ }
+
+ // 判断数组是否存在,如果存在,那么将放到最前面
+ for (var i = 0; i < searchHistory.length; i++) {
+ if (searchHistory[i].name === serachData.name) {
+ searchHistory.splice(i, 1);
+ break;
+ }
+ }
+
+ searchHistory.unshift(util.dataHandle(serachData));
+ uni.setStorage({
+ key: 'search:history',
+ data: searchHistory,
+ success: function() {
+ // console.log('success');
+ }
+ });
+ },
+ getHistory() {
+
+ },
+ removeHistory() {
+ uni.removeStorage({
+ key: 'search:history',
+ success: function(res) {
+ console.log('success');
+ }
+ });
+ return []
+ }
+
+}
+
+export default util;
diff --git a/components/amap-wx/lib/amap-wx.js b/components/amap-wx/lib/amap-wx.js
new file mode 100644
index 0000000..e1ef2b2
--- /dev/null
+++ b/components/amap-wx/lib/amap-wx.js
@@ -0,0 +1 @@
+function AMapWX(a){this.key=a.key,this.requestConfig={key:a.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"}}AMapWX.prototype.getWxLocation=function(a,b){wx.getLocation({type:"gcj02",success:function(a){var c=a.longitude+","+a.latitude;wx.setStorage({key:"userLocation",data:c}),b(c)},fail:function(c){wx.getStorage({key:"userLocation",success:function(a){a.data&&b(a.data)}}),a.fail({errCode:"0",errMsg:c.errMsg||""})}})},AMapWX.prototype.getRegeo=function(a){function c(c){var d=b.requestConfig;wx.request({url:"https://restapi.amap.com/v3/geocode/regeo",data:{key:b.key,location:c,extensions:"all",s:d.s,platform:d.platform,appname:b.key,sdkversion:d.sdkversion,logversion:d.logversion},method:"GET",header:{"content-type":"application/json"},success:function(b){var d,e,f,g,h,i,j,k,l;b.data.status&&"1"==b.data.status?(d=b.data.regeocode,e=d.addressComponent,f=[],g="",d&&d.roads[0]&&d.roads[0].name&&(g=d.roads[0].name+"附近"),h=c.split(",")[0],i=c.split(",")[1],d.pois&&d.pois[0]&&(g=d.pois[0].name+"附近",j=d.pois[0].location,j&&(h=parseFloat(j.split(",")[0]),i=parseFloat(j.split(",")[1]))),e.provice&&f.push(e.provice),e.city&&f.push(e.city),e.district&&f.push(e.district),e.streetNumber&&e.streetNumber.street&&e.streetNumber.number?(f.push(e.streetNumber.street),f.push(e.streetNumber.number)):(k="",d&&d.roads[0]&&d.roads[0].name&&(k=d.roads[0].name),f.push(k)),f=f.join(""),l=[{iconPath:a.iconPath,width:a.iconWidth,height:a.iconHeight,name:f,desc:g,longitude:h,latitude:i,id:0,regeocodeData:d}],a.success(l)):a.fail({errCode:b.data.infocode,errMsg:b.data.info})},fail:function(b){a.fail({errCode:"0",errMsg:b.errMsg||""})}})}var b=this;a.location?c(a.location):b.getWxLocation(a,function(a){c(a)})},AMapWX.prototype.getWeather=function(a){function d(d){var e="base";a.type&&"forecast"==a.type&&(e="all"),wx.request({url:"https://restapi.amap.com/v3/weather/weatherInfo",data:{key:b.key,city:d,extensions:e,s:c.s,platform:c.platform,appname:b.key,sdkversion:c.sdkversion,logversion:c.logversion},method:"GET",header:{"content-type":"application/json"},success:function(b){function c(a){var b={city:{text:"城市",data:a.city},weather:{text:"天气",data:a.weather},temperature:{text:"温度",data:a.temperature},winddirection:{text:"风向",data:a.winddirection+"风"},windpower:{text:"风力",data:a.windpower+"级"},humidity:{text:"湿度",data:a.humidity+"%"}};return b}var d,e;b.data.status&&"1"==b.data.status?b.data.lives?(d=b.data.lives,d&&d.length>0&&(d=d[0],e=c(d),e["liveData"]=d,a.success(e))):b.data.forecasts&&b.data.forecasts[0]&&a.success({forecast:b.data.forecasts[0]}):a.fail({errCode:b.data.infocode,errMsg:b.data.info})},fail:function(b){a.fail({errCode:"0",errMsg:b.errMsg||""})}})}function e(e){wx.request({url:"https://restapi.amap.com/v3/geocode/regeo",data:{key:b.key,location:e,extensions:"all",s:c.s,platform:c.platform,appname:b.key,sdkversion:c.sdkversion,logversion:c.logversion},method:"GET",header:{"content-type":"application/json"},success:function(b){var c,e;b.data.status&&"1"==b.data.status?(e=b.data.regeocode,e.addressComponent?c=e.addressComponent.adcode:e.aois&&e.aois.length>0&&(c=e.aois[0].adcode),d(c)):a.fail({errCode:b.data.infocode,errMsg:b.data.info})},fail:function(b){a.fail({errCode:"0",errMsg:b.errMsg||""})}})}var b=this,c=b.requestConfig;a.city?d(a.city):b.getWxLocation(a,function(a){e(a)})},AMapWX.prototype.getPoiAround=function(a){function d(d){var e={key:b.key,location:d,s:c.s,platform:c.platform,appname:b.key,sdkversion:c.sdkversion,logversion:c.logversion};a.querytypes&&(e["types"]=a.querytypes),a.querykeywords&&(e["keywords"]=a.querykeywords),wx.request({url:"https://restapi.amap.com/v3/place/around",data:e,method:"GET",header:{"content-type":"application/json"},success:function(b){var c,d,e,f;if(b.data.status&&"1"==b.data.status){if(b=b.data,b&&b.pois){for(c=[],d=0;d
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/marked/index.js b/components/marked/index.js
new file mode 100644
index 0000000..33e56c3
--- /dev/null
+++ b/components/marked/index.js
@@ -0,0 +1 @@
+export default './lib/marked'
diff --git a/components/marked/lib/marked.js b/components/marked/lib/marked.js
new file mode 100644
index 0000000..6a71e92
--- /dev/null
+++ b/components/marked/lib/marked.js
@@ -0,0 +1,1573 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
+ */
+
+;(function(root) {
+'use strict';
+
+/**
+ * Block-Level Grammar
+ */
+
+var block = {
+ newline: /^\n+/,
+ code: /^( {4}[^\n]+\n*)+/,
+ fences: noop,
+ hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
+ heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
+ nptable: noop,
+ blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+ list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
+ html: '^ {0,3}(?:' // optional indentation
+ + '<(script|pre|style)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)' // (1)
+ + '|comment[^\\n]*(\\n+|$)' // (2)
+ + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
+ + '|\\n*' // (4)
+ + '|\\n*' // (5)
+ + '|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
+ + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
+ + '|(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
+ + ')',
+ def: /^ {0,3}\[(label)\]: *\n? *([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
+ table: noop,
+ lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
+ paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
+ text: /^[^\n]+/
+};
+
+block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
+block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
+block.def = edit(block.def)
+ .replace('label', block._label)
+ .replace('title', block._title)
+ .getRegex();
+
+block.bullet = /(?:[*+-]|\d+\.)/;
+block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
+block.item = edit(block.item, 'gm')
+ .replace(/bull/g, block.bullet)
+ .getRegex();
+
+block.list = edit(block.list)
+ .replace(/bull/g, block.bullet)
+ .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
+ .replace('def', '\\n+(?=' + block.def.source + ')')
+ .getRegex();
+
+block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
+ + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
+ + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
+ + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
+ + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
+ + '|track|ul';
+block._comment = //;
+block.html = edit(block.html, 'i')
+ .replace('comment', block._comment)
+ .replace('tag', block._tag)
+ .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
+ .getRegex();
+
+block.paragraph = edit(block.paragraph)
+ .replace('hr', block.hr)
+ .replace('heading', block.heading)
+ .replace('lheading', block.lheading)
+ .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
+ .getRegex();
+
+block.blockquote = edit(block.blockquote)
+ .replace('paragraph', block.paragraph)
+ .getRegex();
+
+/**
+ * Normal Block Grammar
+ */
+
+block.normal = merge({}, block);
+
+/**
+ * GFM Block Grammar
+ */
+
+block.gfm = merge({}, block.normal, {
+ fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
+ paragraph: /^/,
+ heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
+});
+
+block.gfm.paragraph = edit(block.paragraph)
+ .replace('(?!', '(?!'
+ + block.gfm.fences.source.replace('\\1', '\\2') + '|'
+ + block.list.source.replace('\\1', '\\3') + '|')
+ .getRegex();
+
+/**
+ * GFM + Tables Block Grammar
+ */
+
+block.tables = merge({}, block.gfm, {
+ nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
+ table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
+});
+
+/**
+ * Pedantic grammar
+ */
+
+block.pedantic = merge({}, block.normal, {
+ html: edit(
+ '^ *(?:comment *(?:\\n|\\s*$)'
+ + '|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)' // closed tag
+ + '|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
+ .replace('comment', block._comment)
+ .replace(/tag/g, '(?!(?:'
+ + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
+ + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
+ + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
+ .getRegex(),
+ def: /^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
+});
+
+/**
+ * Block Lexer
+ */
+
+function Lexer(options) {
+ this.tokens = [];
+ this.tokens.links = Object.create(null);
+ this.options = options || marked.defaults;
+ this.rules = block.normal;
+
+ if (this.options.pedantic) {
+ this.rules = block.pedantic;
+ } else if (this.options.gfm) {
+ if (this.options.tables) {
+ this.rules = block.tables;
+ } else {
+ this.rules = block.gfm;
+ }
+ }
+}
+
+/**
+ * Expose Block Rules
+ */
+
+Lexer.rules = block;
+
+/**
+ * Static Lex Method
+ */
+
+Lexer.lex = function(src, options) {
+ var lexer = new Lexer(options);
+ return lexer.lex(src);
+};
+
+/**
+ * Preprocessing
+ */
+
+Lexer.prototype.lex = function(src) {
+ src = src
+ .replace(/\r\n|\r/g, '\n')
+ .replace(/\t/g, ' ')
+ .replace(/\u00a0/g, ' ')
+ .replace(/\u2424/g, '\n');
+
+ return this.token(src, true);
+};
+
+/**
+ * Lexing
+ */
+
+Lexer.prototype.token = function(src, top) {
+ src = src.replace(/^ +$/gm, '');
+ var next,
+ loose,
+ cap,
+ bull,
+ b,
+ item,
+ listStart,
+ listItems,
+ t,
+ space,
+ i,
+ tag,
+ l,
+ isordered,
+ istask,
+ ischecked;
+
+ while (src) {
+ // newline
+ if (cap = this.rules.newline.exec(src)) {
+ src = src.substring(cap[0].length);
+ if (cap[0].length > 1) {
+ this.tokens.push({
+ type: 'space'
+ });
+ }
+ }
+
+ // code
+ if (cap = this.rules.code.exec(src)) {
+ src = src.substring(cap[0].length);
+ cap = cap[0].replace(/^ {4}/gm, '');
+ this.tokens.push({
+ type: 'code',
+ text: !this.options.pedantic
+ ? rtrim(cap, '\n')
+ : cap
+ });
+ continue;
+ }
+
+ // fences (gfm)
+ if (cap = this.rules.fences.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'code',
+ lang: cap[2],
+ text: cap[3] || ''
+ });
+ continue;
+ }
+
+ // heading
+ if (cap = this.rules.heading.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'heading',
+ depth: cap[1].length,
+ text: cap[2]
+ });
+ continue;
+ }
+
+ // table no leading pipe (gfm)
+ if (top && (cap = this.rules.nptable.exec(src))) {
+ item = {
+ type: 'table',
+ header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+ align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+ cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
+ };
+
+ if (item.header.length === item.align.length) {
+ src = src.substring(cap[0].length);
+
+ for (i = 0; i < item.align.length; i++) {
+ if (/^ *-+: *$/.test(item.align[i])) {
+ item.align[i] = 'right';
+ } else if (/^ *:-+: *$/.test(item.align[i])) {
+ item.align[i] = 'center';
+ } else if (/^ *:-+ *$/.test(item.align[i])) {
+ item.align[i] = 'left';
+ } else {
+ item.align[i] = null;
+ }
+ }
+
+ for (i = 0; i < item.cells.length; i++) {
+ item.cells[i] = splitCells(item.cells[i], item.header.length);
+ }
+
+ this.tokens.push(item);
+
+ continue;
+ }
+ }
+
+ // hr
+ if (cap = this.rules.hr.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'hr'
+ });
+ continue;
+ }
+
+ // blockquote
+ if (cap = this.rules.blockquote.exec(src)) {
+ src = src.substring(cap[0].length);
+
+ this.tokens.push({
+ type: 'blockquote_start'
+ });
+
+ cap = cap[0].replace(/^ *> ?/gm, '');
+
+ // Pass `top` to keep the current
+ // "toplevel" state. This is exactly
+ // how markdown.pl works.
+ this.token(cap, top);
+
+ this.tokens.push({
+ type: 'blockquote_end'
+ });
+
+ continue;
+ }
+
+ // list
+ if (cap = this.rules.list.exec(src)) {
+ src = src.substring(cap[0].length);
+ bull = cap[2];
+ isordered = bull.length > 1;
+
+ listStart = {
+ type: 'list_start',
+ ordered: isordered,
+ start: isordered ? +bull : '',
+ loose: false
+ };
+
+ this.tokens.push(listStart);
+
+ // Get each top-level item.
+ cap = cap[0].match(this.rules.item);
+
+ listItems = [];
+ next = false;
+ l = cap.length;
+ i = 0;
+
+ for (; i < l; i++) {
+ item = cap[i];
+
+ // Remove the list item's bullet
+ // so it is seen as the next token.
+ space = item.length;
+ item = item.replace(/^ *([*+-]|\d+\.) +/, '');
+
+ // Outdent whatever the
+ // list item contains. Hacky.
+ if (~item.indexOf('\n ')) {
+ space -= item.length;
+ item = !this.options.pedantic
+ ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
+ : item.replace(/^ {1,4}/gm, '');
+ }
+
+ // Determine whether the next list item belongs here.
+ // Backpedal if it does not belong in this list.
+ if (this.options.smartLists && i !== l - 1) {
+ b = block.bullet.exec(cap[i + 1])[0];
+ if (bull !== b && !(bull.length > 1 && b.length > 1)) {
+ src = cap.slice(i + 1).join('\n') + src;
+ i = l - 1;
+ }
+ }
+
+ // Determine whether item is loose or not.
+ // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+ // for discount behavior.
+ loose = next || /\n\n(?!\s*$)/.test(item);
+ if (i !== l - 1) {
+ next = item.charAt(item.length - 1) === '\n';
+ if (!loose) loose = next;
+ }
+
+ if (loose) {
+ listStart.loose = true;
+ }
+
+ // Check for task list items
+ istask = /^\[[ xX]\] /.test(item);
+ ischecked = undefined;
+ if (istask) {
+ ischecked = item[1] !== ' ';
+ item = item.replace(/^\[[ xX]\] +/, '');
+ }
+
+ t = {
+ type: 'list_item_start',
+ task: istask,
+ checked: ischecked,
+ loose: loose
+ };
+
+ listItems.push(t);
+ this.tokens.push(t);
+
+ // Recurse.
+ this.token(item, false);
+
+ this.tokens.push({
+ type: 'list_item_end'
+ });
+ }
+
+ if (listStart.loose) {
+ l = listItems.length;
+ i = 0;
+ for (; i < l; i++) {
+ listItems[i].loose = true;
+ }
+ }
+
+ this.tokens.push({
+ type: 'list_end'
+ });
+
+ continue;
+ }
+
+ // html
+ if (cap = this.rules.html.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: this.options.sanitize
+ ? 'paragraph'
+ : 'html',
+ pre: !this.options.sanitizer
+ && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
+ text: cap[0]
+ });
+ continue;
+ }
+
+ // def
+ if (top && (cap = this.rules.def.exec(src))) {
+ src = src.substring(cap[0].length);
+ if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
+ tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+ if (!this.tokens.links[tag]) {
+ this.tokens.links[tag] = {
+ href: cap[2],
+ title: cap[3]
+ };
+ }
+ continue;
+ }
+
+ // table (gfm)
+ if (top && (cap = this.rules.table.exec(src))) {
+ item = {
+ type: 'table',
+ header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+ align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+ cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
+ };
+
+ if (item.header.length === item.align.length) {
+ src = src.substring(cap[0].length);
+
+ for (i = 0; i < item.align.length; i++) {
+ if (/^ *-+: *$/.test(item.align[i])) {
+ item.align[i] = 'right';
+ } else if (/^ *:-+: *$/.test(item.align[i])) {
+ item.align[i] = 'center';
+ } else if (/^ *:-+ *$/.test(item.align[i])) {
+ item.align[i] = 'left';
+ } else {
+ item.align[i] = null;
+ }
+ }
+
+ for (i = 0; i < item.cells.length; i++) {
+ item.cells[i] = splitCells(
+ item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
+ item.header.length);
+ }
+
+ this.tokens.push(item);
+
+ continue;
+ }
+ }
+
+ // lheading
+ if (cap = this.rules.lheading.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'heading',
+ depth: cap[2] === '=' ? 1 : 2,
+ text: cap[1]
+ });
+ continue;
+ }
+
+ // top-level paragraph
+ if (top && (cap = this.rules.paragraph.exec(src))) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'paragraph',
+ text: cap[1].charAt(cap[1].length - 1) === '\n'
+ ? cap[1].slice(0, -1)
+ : cap[1]
+ });
+ continue;
+ }
+
+ // text
+ if (cap = this.rules.text.exec(src)) {
+ // Top-level should never reach here.
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'text',
+ text: cap[0]
+ });
+ continue;
+ }
+
+ if (src) {
+ throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+ }
+ }
+
+ return this.tokens;
+};
+
+/**
+ * Inline-Level Grammar
+ */
+
+var inline = {
+ escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
+ autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+ url: noop,
+ tag: '^comment'
+ + '|^[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
+ + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
+ + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g.
+ + '|^' // declaration, e.g.
+ + '|^', // CDATA section
+ link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
+ reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
+ nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
+ strong: /^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
+ em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
+ code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
+ br: /^( {2,}|\\)\n(?!\s*$)/,
+ del: noop,
+ text: /^[\s\S]+?(?=[\\?@\[\]\\^_`{|}~])/g;
+
+inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
+inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
+inline.autolink = edit(inline.autolink)
+ .replace('scheme', inline._scheme)
+ .replace('email', inline._email)
+ .getRegex();
+
+inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
+
+inline.tag = edit(inline.tag)
+ .replace('comment', block._comment)
+ .replace('attribute', inline._attribute)
+ .getRegex();
+
+inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
+inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f\\]*\)|[^\s\x00-\x1f()\\])*?)/;
+inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
+
+inline.link = edit(inline.link)
+ .replace('label', inline._label)
+ .replace('href', inline._href)
+ .replace('title', inline._title)
+ .getRegex();
+
+inline.reflink = edit(inline.reflink)
+ .replace('label', inline._label)
+ .getRegex();
+
+/**
+ * Normal Inline Grammar
+ */
+
+inline.normal = merge({}, inline);
+
+/**
+ * Pedantic Inline Grammar
+ */
+
+inline.pedantic = merge({}, inline.normal, {
+ strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+ em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
+ link: edit(/^!?\[(label)\]\((.*?)\)/)
+ .replace('label', inline._label)
+ .getRegex(),
+ reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
+ .replace('label', inline._label)
+ .getRegex()
+});
+
+/**
+ * GFM Inline Grammar
+ */
+
+inline.gfm = merge({}, inline.normal, {
+ escape: edit(inline.escape).replace('])', '~|])').getRegex(),
+ url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
+ .replace('email', inline._email)
+ .getRegex(),
+ _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
+ del: /^~+(?=\S)([\s\S]*?\S)~+/,
+ text: edit(inline.text)
+ .replace(']|', '~]|')
+ .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
+ .getRegex()
+});
+
+/**
+ * GFM + Line Breaks Inline Grammar
+ */
+
+inline.breaks = merge({}, inline.gfm, {
+ br: edit(inline.br).replace('{2,}', '*').getRegex(),
+ text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
+});
+
+/**
+ * Inline Lexer & Compiler
+ */
+
+function InlineLexer(links, options) {
+ this.options = options || marked.defaults;
+ this.links = links;
+ this.rules = inline.normal;
+ this.renderer = this.options.renderer || new Renderer();
+ this.renderer.options = this.options;
+
+ if (!this.links) {
+ throw new Error('Tokens array requires a `links` property.');
+ }
+
+ if (this.options.pedantic) {
+ this.rules = inline.pedantic;
+ } else if (this.options.gfm) {
+ if (this.options.breaks) {
+ this.rules = inline.breaks;
+ } else {
+ this.rules = inline.gfm;
+ }
+ }
+}
+
+/**
+ * Expose Inline Rules
+ */
+
+InlineLexer.rules = inline;
+
+/**
+ * Static Lexing/Compiling Method
+ */
+
+InlineLexer.output = function(src, links, options) {
+ var inline = new InlineLexer(links, options);
+ return inline.output(src);
+};
+
+/**
+ * Lexing/Compiling
+ */
+
+InlineLexer.prototype.output = function(src) {
+ var out = '',
+ link,
+ text,
+ href,
+ title,
+ cap,
+ prevCapZero;
+
+ while (src) {
+ // escape
+ if (cap = this.rules.escape.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += cap[1];
+ continue;
+ }
+
+ // autolink
+ if (cap = this.rules.autolink.exec(src)) {
+ src = src.substring(cap[0].length);
+ if (cap[2] === '@') {
+ text = escape(this.mangle(cap[1]));
+ href = 'mailto:' + text;
+ } else {
+ text = escape(cap[1]);
+ href = text;
+ }
+ out += this.renderer.link(href, null, text);
+ continue;
+ }
+
+ // url (gfm)
+ if (!this.inLink && (cap = this.rules.url.exec(src))) {
+ do {
+ prevCapZero = cap[0];
+ cap[0] = this.rules._backpedal.exec(cap[0])[0];
+ } while (prevCapZero !== cap[0]);
+ src = src.substring(cap[0].length);
+ if (cap[2] === '@') {
+ text = escape(cap[0]);
+ href = 'mailto:' + text;
+ } else {
+ text = escape(cap[0]);
+ if (cap[1] === 'www.') {
+ href = 'http://' + text;
+ } else {
+ href = text;
+ }
+ }
+ out += this.renderer.link(href, null, text);
+ continue;
+ }
+
+ // tag
+ if (cap = this.rules.tag.exec(src)) {
+ if (!this.inLink && /^/i.test(cap[0])) {
+ this.inLink = false;
+ }
+ src = src.substring(cap[0].length);
+ out += this.options.sanitize
+ ? this.options.sanitizer
+ ? this.options.sanitizer(cap[0])
+ : escape(cap[0])
+ : cap[0]
+ continue;
+ }
+
+ // link
+ if (cap = this.rules.link.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.inLink = true;
+ href = cap[2];
+ if (this.options.pedantic) {
+ link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
+
+ if (link) {
+ href = link[1];
+ title = link[3];
+ } else {
+ title = '';
+ }
+ } else {
+ title = cap[3] ? cap[3].slice(1, -1) : '';
+ }
+ href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
+ out += this.outputLink(cap, {
+ href: InlineLexer.escapes(href),
+ title: InlineLexer.escapes(title)
+ });
+ this.inLink = false;
+ continue;
+ }
+
+ // reflink, nolink
+ if ((cap = this.rules.reflink.exec(src))
+ || (cap = this.rules.nolink.exec(src))) {
+ src = src.substring(cap[0].length);
+ link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+ link = this.links[link.toLowerCase()];
+ if (!link || !link.href) {
+ out += cap[0].charAt(0);
+ src = cap[0].substring(1) + src;
+ continue;
+ }
+ this.inLink = true;
+ out += this.outputLink(cap, link);
+ this.inLink = false;
+ continue;
+ }
+
+ // strong
+ if (cap = this.rules.strong.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
+ continue;
+ }
+
+ // em
+ if (cap = this.rules.em.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
+ continue;
+ }
+
+ // code
+ if (cap = this.rules.code.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.codespan(escape(cap[2].trim(), true));
+ continue;
+ }
+
+ // br
+ if (cap = this.rules.br.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.br();
+ continue;
+ }
+
+ // del (gfm)
+ if (cap = this.rules.del.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.del(this.output(cap[1]));
+ continue;
+ }
+
+ // text
+ if (cap = this.rules.text.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.text(escape(this.smartypants(cap[0])));
+ continue;
+ }
+
+ if (src) {
+ throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+ }
+ }
+
+ return out;
+};
+
+InlineLexer.escapes = function(text) {
+ return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
+}
+
+/**
+ * Compile Link
+ */
+
+InlineLexer.prototype.outputLink = function(cap, link) {
+ var href = link.href,
+ title = link.title ? escape(link.title) : null;
+
+ return cap[0].charAt(0) !== '!'
+ ? this.renderer.link(href, title, this.output(cap[1]))
+ : this.renderer.image(href, title, escape(cap[1]));
+};
+
+/**
+ * Smartypants Transformations
+ */
+
+InlineLexer.prototype.smartypants = function(text) {
+ if (!this.options.smartypants) return text;
+ return text
+ // em-dashes
+ .replace(/---/g, '\u2014')
+ // en-dashes
+ .replace(/--/g, '\u2013')
+ // opening singles
+ .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
+ // closing singles & apostrophes
+ .replace(/'/g, '\u2019')
+ // opening doubles
+ .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
+ // closing doubles
+ .replace(/"/g, '\u201d')
+ // ellipses
+ .replace(/\.{3}/g, '\u2026');
+};
+
+/**
+ * Mangle Links
+ */
+
+InlineLexer.prototype.mangle = function(text) {
+ if (!this.options.mangle) return text;
+ var out = '',
+ l = text.length,
+ i = 0,
+ ch;
+
+ for (; i < l; i++) {
+ ch = text.charCodeAt(i);
+ if (Math.random() > 0.5) {
+ ch = 'x' + ch.toString(16);
+ }
+ out += '' + ch + ';';
+ }
+
+ return out;
+};
+
+/**
+ * Renderer
+ */
+
+function Renderer(options) {
+ this.options = options || marked.defaults;
+}
+
+Renderer.prototype.code = function(code, lang, escaped) {
+ if (this.options.highlight) {
+ var out = this.options.highlight(code, lang);
+ if (out != null && out !== code) {
+ escaped = true;
+ code = out;
+ }
+ }
+
+ if (!lang) {
+ return ''
+ + (escaped ? code : escape(code, true))
+ + '
';
+ }
+
+ return ''
+ + (escaped ? code : escape(code, true))
+ + '
\n';
+};
+
+Renderer.prototype.blockquote = function(quote) {
+ return '\n' + quote + '
\n';
+};
+
+Renderer.prototype.html = function(html) {
+ return html;
+};
+
+Renderer.prototype.heading = function(text, level, raw) {
+ if (this.options.headerIds) {
+ return '\n';
+ }
+ // ignore IDs
+ return '' + text + '\n';
+};
+
+Renderer.prototype.hr = function() {
+ return this.options.xhtml ? '
\n' : '
\n';
+};
+
+Renderer.prototype.list = function(body, ordered, start) {
+ var type = ordered ? 'ol' : 'ul',
+ startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
+ return '<' + type + startatt + '>\n' + body + '' + type + '>\n';
+};
+
+Renderer.prototype.listitem = function(text) {
+ return '' + text + '\n';
+};
+
+Renderer.prototype.checkbox = function(checked) {
+ return ' ';
+}
+
+Renderer.prototype.paragraph = function(text) {
+ return '' + text + '
\n';
+};
+
+Renderer.prototype.table = function(header, body) {
+ if (body) body = '' + body + '';
+
+ return '\n'
+ + '\n'
+ + header
+ + '\n'
+ + body
+ + '
\n';
+};
+
+Renderer.prototype.tablerow = function(content) {
+ return '\n' + content + '
\n';
+};
+
+Renderer.prototype.tablecell = function(content, flags) {
+ var type = flags.header ? 'th' : 'td';
+ var tag = flags.align
+ ? '<' + type + ' align="' + flags.align + '">'
+ : '<' + type + '>';
+ return tag + content + '' + type + '>\n';
+};
+
+// span level renderer
+Renderer.prototype.strong = function(text) {
+ return '' + text + '';
+};
+
+Renderer.prototype.em = function(text) {
+ return '' + text + '';
+};
+
+Renderer.prototype.codespan = function(text) {
+ return '' + text + '';
+};
+
+Renderer.prototype.br = function() {
+ return this.options.xhtml ? '
' : '
';
+};
+
+Renderer.prototype.del = function(text) {
+ return '' + text + '';
+};
+
+Renderer.prototype.link = function(href, title, text) {
+ if (this.options.sanitize) {
+ try {
+ var prot = decodeURIComponent(unescape(href))
+ .replace(/[^\w:]/g, '')
+ .toLowerCase();
+ } catch (e) {
+ return text;
+ }
+ if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
+ return text;
+ }
+ }
+ if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+ href = resolveUrl(this.options.baseUrl, href);
+ }
+ try {
+ href = encodeURI(href).replace(/%25/g, '%');
+ } catch (e) {
+ return text;
+ }
+ var out = '' + text + '';
+ return out;
+};
+
+Renderer.prototype.image = function(href, title, text) {
+ if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+ href = resolveUrl(this.options.baseUrl, href);
+ }
+ var out = '
' : '>';
+ return out;
+};
+
+Renderer.prototype.text = function(text) {
+ return text;
+};
+
+/**
+ * TextRenderer
+ * returns only the textual part of the token
+ */
+
+function TextRenderer() {}
+
+// no need for block level renderers
+
+TextRenderer.prototype.strong =
+TextRenderer.prototype.em =
+TextRenderer.prototype.codespan =
+TextRenderer.prototype.del =
+TextRenderer.prototype.text = function (text) {
+ return text;
+}
+
+TextRenderer.prototype.link =
+TextRenderer.prototype.image = function(href, title, text) {
+ return '' + text;
+}
+
+TextRenderer.prototype.br = function() {
+ return '';
+}
+
+/**
+ * Parsing & Compiling
+ */
+
+function Parser(options) {
+ this.tokens = [];
+ this.token = null;
+ this.options = options || marked.defaults;
+ this.options.renderer = this.options.renderer || new Renderer();
+ this.renderer = this.options.renderer;
+ this.renderer.options = this.options;
+}
+
+/**
+ * Static Parse Method
+ */
+
+Parser.parse = function(src, options) {
+ var parser = new Parser(options);
+ return parser.parse(src);
+};
+
+/**
+ * Parse Loop
+ */
+
+Parser.prototype.parse = function(src) {
+ this.inline = new InlineLexer(src.links, this.options);
+ // use an InlineLexer with a TextRenderer to extract pure text
+ this.inlineText = new InlineLexer(
+ src.links,
+ merge({}, this.options, {renderer: new TextRenderer()})
+ );
+ this.tokens = src.reverse();
+
+ var out = '';
+ while (this.next()) {
+ out += this.tok();
+ }
+
+ return out;
+};
+
+/**
+ * Next Token
+ */
+
+Parser.prototype.next = function() {
+ return this.token = this.tokens.pop();
+};
+
+/**
+ * Preview Next Token
+ */
+
+Parser.prototype.peek = function() {
+ return this.tokens[this.tokens.length - 1] || 0;
+};
+
+/**
+ * Parse Text Tokens
+ */
+
+Parser.prototype.parseText = function() {
+ var body = this.token.text;
+
+ while (this.peek().type === 'text') {
+ body += '\n' + this.next().text;
+ }
+
+ return this.inline.output(body);
+};
+
+/**
+ * Parse Current Token
+ */
+
+Parser.prototype.tok = function() {
+ switch (this.token.type) {
+ case 'space': {
+ return '';
+ }
+ case 'hr': {
+ return this.renderer.hr();
+ }
+ case 'heading': {
+ return this.renderer.heading(
+ this.inline.output(this.token.text),
+ this.token.depth,
+ unescape(this.inlineText.output(this.token.text)));
+ }
+ case 'code': {
+ return this.renderer.code(this.token.text,
+ this.token.lang,
+ this.token.escaped);
+ }
+ case 'table': {
+ var header = '',
+ body = '',
+ i,
+ row,
+ cell,
+ j;
+
+ // header
+ cell = '';
+ for (i = 0; i < this.token.header.length; i++) {
+ cell += this.renderer.tablecell(
+ this.inline.output(this.token.header[i]),
+ { header: true, align: this.token.align[i] }
+ );
+ }
+ header += this.renderer.tablerow(cell);
+
+ for (i = 0; i < this.token.cells.length; i++) {
+ row = this.token.cells[i];
+
+ cell = '';
+ for (j = 0; j < row.length; j++) {
+ cell += this.renderer.tablecell(
+ this.inline.output(row[j]),
+ { header: false, align: this.token.align[j] }
+ );
+ }
+
+ body += this.renderer.tablerow(cell);
+ }
+ return this.renderer.table(header, body);
+ }
+ case 'blockquote_start': {
+ body = '';
+
+ while (this.next().type !== 'blockquote_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.blockquote(body);
+ }
+ case 'list_start': {
+ body = '';
+ var ordered = this.token.ordered,
+ start = this.token.start;
+
+ while (this.next().type !== 'list_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.list(body, ordered, start);
+ }
+ case 'list_item_start': {
+ body = '';
+ var loose = this.token.loose;
+
+ if (this.token.task) {
+ body += this.renderer.checkbox(this.token.checked);
+ }
+
+ while (this.next().type !== 'list_item_end') {
+ body += !loose && this.token.type === 'text'
+ ? this.parseText()
+ : this.tok();
+ }
+
+ return this.renderer.listitem(body);
+ }
+ case 'html': {
+ // TODO parse inline content if parameter markdown=1
+ return this.renderer.html(this.token.text);
+ }
+ case 'paragraph': {
+ return this.renderer.paragraph(this.inline.output(this.token.text));
+ }
+ case 'text': {
+ return this.renderer.paragraph(this.parseText());
+ }
+ }
+};
+
+/**
+ * Helpers
+ */
+
+function escape(html, encode) {
+ return html
+ .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''');
+}
+
+function unescape(html) {
+ // explicitly match decimal, hex, and named HTML entities
+ return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
+ n = n.toLowerCase();
+ if (n === 'colon') return ':';
+ if (n.charAt(0) === '#') {
+ return n.charAt(1) === 'x'
+ ? String.fromCharCode(parseInt(n.substring(2), 16))
+ : String.fromCharCode(+n.substring(1));
+ }
+ return '';
+ });
+}
+
+function edit(regex, opt) {
+ regex = regex.source || regex;
+ opt = opt || '';
+ return {
+ replace: function(name, val) {
+ val = val.source || val;
+ val = val.replace(/(^|[^\[])\^/g, '$1');
+ regex = regex.replace(name, val);
+ return this;
+ },
+ getRegex: function() {
+ return new RegExp(regex, opt);
+ }
+ };
+}
+
+function resolveUrl(base, href) {
+ if (!baseUrls[' ' + base]) {
+ // we can ignore everything in base after the last slash of its path component,
+ // but we might need to add _that_
+ // https://tools.ietf.org/html/rfc3986#section-3
+ if (/^[^:]+:\/*[^/]*$/.test(base)) {
+ baseUrls[' ' + base] = base + '/';
+ } else {
+ baseUrls[' ' + base] = rtrim(base, '/', true);
+ }
+ }
+ base = baseUrls[' ' + base];
+
+ if (href.slice(0, 2) === '//') {
+ return base.replace(/:[\s\S]*/, ':') + href;
+ } else if (href.charAt(0) === '/') {
+ return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
+ } else {
+ return base + href;
+ }
+}
+var baseUrls = {};
+var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+
+function noop() {}
+noop.exec = noop;
+
+function merge(obj) {
+ var i = 1,
+ target,
+ key;
+
+ for (; i < arguments.length; i++) {
+ target = arguments[i];
+ for (key in target) {
+ if (Object.prototype.hasOwnProperty.call(target, key)) {
+ obj[key] = target[key];
+ }
+ }
+ }
+
+ return obj;
+}
+
+function splitCells(tableRow, count) {
+ // ensure that every cell-delimiting pipe has a space
+ // before it to distinguish it from an escaped pipe
+ var row = tableRow.replace(/\|/g, function (match, offset, str) {
+ var escaped = false,
+ curr = offset;
+ while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
+ if (escaped) {
+ // odd number of slashes means | is escaped
+ // so we leave it alone
+ return '|';
+ } else {
+ // add space before unescaped |
+ return ' |';
+ }
+ }),
+ cells = row.split(/ \|/),
+ i = 0;
+
+ if (cells.length > count) {
+ cells.splice(count);
+ } else {
+ while (cells.length < count) cells.push('');
+ }
+
+ for (; i < cells.length; i++) {
+ // leading or trailing whitespace is ignored per the gfm spec
+ cells[i] = cells[i].trim().replace(/\\\|/g, '|');
+ }
+ return cells;
+}
+
+// Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
+// /c*$/ is vulnerable to REDOS.
+// invert: Remove suffix of non-c chars instead. Default falsey.
+function rtrim(str, c, invert) {
+ if (str.length === 0) {
+ return '';
+ }
+
+ // Length of suffix matching the invert condition.
+ var suffLen = 0;
+
+ // Step left until we fail to match the invert condition.
+ while (suffLen < str.length) {
+ var currChar = str.charAt(str.length - suffLen - 1);
+ if (currChar === c && !invert) {
+ suffLen++;
+ } else if (currChar !== c && invert) {
+ suffLen++;
+ } else {
+ break;
+ }
+ }
+
+ return str.substr(0, str.length - suffLen);
+}
+
+/**
+ * Marked
+ */
+
+function marked(src, opt, callback) {
+ // throw error in case of non string input
+ if (typeof src === 'undefined' || src === null) {
+ throw new Error('marked(): input parameter is undefined or null');
+ }
+ if (typeof src !== 'string') {
+ throw new Error('marked(): input parameter is of type '
+ + Object.prototype.toString.call(src) + ', string expected');
+ }
+
+ if (callback || typeof opt === 'function') {
+ if (!callback) {
+ callback = opt;
+ opt = null;
+ }
+
+ opt = merge({}, marked.defaults, opt || {});
+
+ var highlight = opt.highlight,
+ tokens,
+ pending,
+ i = 0;
+
+ try {
+ tokens = Lexer.lex(src, opt)
+ } catch (e) {
+ return callback(e);
+ }
+
+ pending = tokens.length;
+
+ var done = function(err) {
+ if (err) {
+ opt.highlight = highlight;
+ return callback(err);
+ }
+
+ var out;
+
+ try {
+ out = Parser.parse(tokens, opt);
+ } catch (e) {
+ err = e;
+ }
+
+ opt.highlight = highlight;
+
+ return err
+ ? callback(err)
+ : callback(null, out);
+ };
+
+ if (!highlight || highlight.length < 3) {
+ return done();
+ }
+
+ delete opt.highlight;
+
+ if (!pending) return done();
+
+ for (; i < tokens.length; i++) {
+ (function(token) {
+ if (token.type !== 'code') {
+ return --pending || done();
+ }
+ return highlight(token.text, token.lang, function(err, code) {
+ if (err) return done(err);
+ if (code == null || code === token.text) {
+ return --pending || done();
+ }
+ token.text = code;
+ token.escaped = true;
+ --pending || done();
+ });
+ })(tokens[i]);
+ }
+
+ return;
+ }
+ try {
+ if (opt) opt = merge({}, marked.defaults, opt);
+ return Parser.parse(Lexer.lex(src, opt), opt);
+ } catch (e) {
+ e.message += '\nPlease report this to https://github.com/markedjs/marked.';
+ if ((opt || marked.defaults).silent) {
+ return 'An error occurred:
'
+ + escape(e.message + '', true)
+ + '
';
+ }
+ throw e;
+ }
+}
+
+/**
+ * Options
+ */
+
+marked.options =
+marked.setOptions = function(opt) {
+ merge(marked.defaults, opt);
+ return marked;
+};
+
+marked.getDefaults = function () {
+ return {
+ baseUrl: null,
+ breaks: false,
+ gfm: true,
+ headerIds: true,
+ headerPrefix: '',
+ highlight: null,
+ langPrefix: 'language-',
+ mangle: true,
+ pedantic: false,
+ renderer: new Renderer(),
+ sanitize: false,
+ sanitizer: null,
+ silent: false,
+ smartLists: false,
+ smartypants: false,
+ tables: true,
+ xhtml: false
+ };
+}
+
+marked.defaults = marked.getDefaults();
+
+/**
+ * Expose
+ */
+
+marked.Parser = Parser;
+marked.parser = Parser.parse;
+
+marked.Renderer = Renderer;
+marked.TextRenderer = TextRenderer;
+
+marked.Lexer = Lexer;
+marked.lexer = Lexer.lex;
+
+marked.InlineLexer = InlineLexer;
+marked.inlineLexer = InlineLexer.output;
+
+marked.parse = marked;
+
+if (typeof module !== 'undefined' && typeof exports === 'object') {
+ module.exports = marked;
+} else if (typeof define === 'function' && define.amd) {
+ define(function() { return marked; });
+} else {
+ root.marked = marked;
+}
+})(this || (typeof window !== 'undefined' ? window : global));
diff --git a/components/mpvue-citypicker/city-data/area.js b/components/mpvue-citypicker/city-data/area.js
new file mode 100644
index 0000000..92dfc30
--- /dev/null
+++ b/components/mpvue-citypicker/city-data/area.js
@@ -0,0 +1,12542 @@
+/* eslint-disable */
+var areaData = [
+ [
+ [{
+ "label": "东城区",
+ "value": "110101"
+ },
+ {
+ "label": "西城区",
+ "value": "110102"
+ },
+ {
+ "label": "朝阳区",
+ "value": "110105"
+ },
+ {
+ "label": "丰台区",
+ "value": "110106"
+ },
+ {
+ "label": "石景山区",
+ "value": "110107"
+ },
+ {
+ "label": "海淀区",
+ "value": "110108"
+ },
+ {
+ "label": "门头沟区",
+ "value": "110109"
+ },
+ {
+ "label": "房山区",
+ "value": "110111"
+ },
+ {
+ "label": "通州区",
+ "value": "110112"
+ },
+ {
+ "label": "顺义区",
+ "value": "110113"
+ },
+ {
+ "label": "昌平区",
+ "value": "110114"
+ },
+ {
+ "label": "大兴区",
+ "value": "110115"
+ },
+ {
+ "label": "怀柔区",
+ "value": "110116"
+ },
+ {
+ "label": "平谷区",
+ "value": "110117"
+ },
+ {
+ "label": "密云区",
+ "value": "110118"
+ },
+ {
+ "label": "延庆区",
+ "value": "110119"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "和平区",
+ "value": "120101"
+ },
+ {
+ "label": "河东区",
+ "value": "120102"
+ },
+ {
+ "label": "河西区",
+ "value": "120103"
+ },
+ {
+ "label": "南开区",
+ "value": "120104"
+ },
+ {
+ "label": "河北区",
+ "value": "120105"
+ },
+ {
+ "label": "红桥区",
+ "value": "120106"
+ },
+ {
+ "label": "东丽区",
+ "value": "120110"
+ },
+ {
+ "label": "西青区",
+ "value": "120111"
+ },
+ {
+ "label": "津南区",
+ "value": "120112"
+ },
+ {
+ "label": "北辰区",
+ "value": "120113"
+ },
+ {
+ "label": "武清区",
+ "value": "120114"
+ },
+ {
+ "label": "宝坻区",
+ "value": "120115"
+ },
+ {
+ "label": "滨海新区",
+ "value": "120116"
+ },
+ {
+ "label": "宁河区",
+ "value": "120117"
+ },
+ {
+ "label": "静海区",
+ "value": "120118"
+ },
+ {
+ "label": "蓟州区",
+ "value": "120119"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "长安区",
+ "value": "130102"
+ },
+ {
+ "label": "桥西区",
+ "value": "130104"
+ },
+ {
+ "label": "新华区",
+ "value": "130105"
+ },
+ {
+ "label": "井陉矿区",
+ "value": "130107"
+ },
+ {
+ "label": "裕华区",
+ "value": "130108"
+ },
+ {
+ "label": "藁城区",
+ "value": "130109"
+ },
+ {
+ "label": "鹿泉区",
+ "value": "130110"
+ },
+ {
+ "label": "栾城区",
+ "value": "130111"
+ },
+ {
+ "label": "井陉县",
+ "value": "130121"
+ },
+ {
+ "label": "正定县",
+ "value": "130123"
+ },
+ {
+ "label": "行唐县",
+ "value": "130125"
+ },
+ {
+ "label": "灵寿县",
+ "value": "130126"
+ },
+ {
+ "label": "高邑县",
+ "value": "130127"
+ },
+ {
+ "label": "深泽县",
+ "value": "130128"
+ },
+ {
+ "label": "赞皇县",
+ "value": "130129"
+ },
+ {
+ "label": "无极县",
+ "value": "130130"
+ },
+ {
+ "label": "平山县",
+ "value": "130131"
+ },
+ {
+ "label": "元氏县",
+ "value": "130132"
+ },
+ {
+ "label": "赵县",
+ "value": "130133"
+ },
+ {
+ "label": "石家庄高新技术产业开发区",
+ "value": "130171"
+ },
+ {
+ "label": "石家庄循环化工园区",
+ "value": "130172"
+ },
+ {
+ "label": "辛集市",
+ "value": "130181"
+ },
+ {
+ "label": "晋州市",
+ "value": "130183"
+ },
+ {
+ "label": "新乐市",
+ "value": "130184"
+ }
+ ],
+ [{
+ "label": "路南区",
+ "value": "130202"
+ },
+ {
+ "label": "路北区",
+ "value": "130203"
+ },
+ {
+ "label": "古冶区",
+ "value": "130204"
+ },
+ {
+ "label": "开平区",
+ "value": "130205"
+ },
+ {
+ "label": "丰南区",
+ "value": "130207"
+ },
+ {
+ "label": "丰润区",
+ "value": "130208"
+ },
+ {
+ "label": "曹妃甸区",
+ "value": "130209"
+ },
+ {
+ "label": "滦县",
+ "value": "130223"
+ },
+ {
+ "label": "滦南县",
+ "value": "130224"
+ },
+ {
+ "label": "乐亭县",
+ "value": "130225"
+ },
+ {
+ "label": "迁西县",
+ "value": "130227"
+ },
+ {
+ "label": "玉田县",
+ "value": "130229"
+ },
+ {
+ "label": "唐山市芦台经济技术开发区",
+ "value": "130271"
+ },
+ {
+ "label": "唐山市汉沽管理区",
+ "value": "130272"
+ },
+ {
+ "label": "唐山高新技术产业开发区",
+ "value": "130273"
+ },
+ {
+ "label": "河北唐山海港经济开发区",
+ "value": "130274"
+ },
+ {
+ "label": "遵化市",
+ "value": "130281"
+ },
+ {
+ "label": "迁安市",
+ "value": "130283"
+ }
+ ],
+ [{
+ "label": "海港区",
+ "value": "130302"
+ },
+ {
+ "label": "山海关区",
+ "value": "130303"
+ },
+ {
+ "label": "北戴河区",
+ "value": "130304"
+ },
+ {
+ "label": "抚宁区",
+ "value": "130306"
+ },
+ {
+ "label": "青龙满族自治县",
+ "value": "130321"
+ },
+ {
+ "label": "昌黎县",
+ "value": "130322"
+ },
+ {
+ "label": "卢龙县",
+ "value": "130324"
+ },
+ {
+ "label": "秦皇岛市经济技术开发区",
+ "value": "130371"
+ },
+ {
+ "label": "北戴河新区",
+ "value": "130372"
+ }
+ ],
+ [{
+ "label": "邯山区",
+ "value": "130402"
+ },
+ {
+ "label": "丛台区",
+ "value": "130403"
+ },
+ {
+ "label": "复兴区",
+ "value": "130404"
+ },
+ {
+ "label": "峰峰矿区",
+ "value": "130406"
+ },
+ {
+ "label": "肥乡区",
+ "value": "130407"
+ },
+ {
+ "label": "永年区",
+ "value": "130408"
+ },
+ {
+ "label": "临漳县",
+ "value": "130423"
+ },
+ {
+ "label": "成安县",
+ "value": "130424"
+ },
+ {
+ "label": "大名县",
+ "value": "130425"
+ },
+ {
+ "label": "涉县",
+ "value": "130426"
+ },
+ {
+ "label": "磁县",
+ "value": "130427"
+ },
+ {
+ "label": "邱县",
+ "value": "130430"
+ },
+ {
+ "label": "鸡泽县",
+ "value": "130431"
+ },
+ {
+ "label": "广平县",
+ "value": "130432"
+ },
+ {
+ "label": "馆陶县",
+ "value": "130433"
+ },
+ {
+ "label": "魏县",
+ "value": "130434"
+ },
+ {
+ "label": "曲周县",
+ "value": "130435"
+ },
+ {
+ "label": "邯郸经济技术开发区",
+ "value": "130471"
+ },
+ {
+ "label": "邯郸冀南新区",
+ "value": "130473"
+ },
+ {
+ "label": "武安市",
+ "value": "130481"
+ }
+ ],
+ [{
+ "label": "桥东区",
+ "value": "130502"
+ },
+ {
+ "label": "桥西区",
+ "value": "130503"
+ },
+ {
+ "label": "邢台县",
+ "value": "130521"
+ },
+ {
+ "label": "临城县",
+ "value": "130522"
+ },
+ {
+ "label": "内丘县",
+ "value": "130523"
+ },
+ {
+ "label": "柏乡县",
+ "value": "130524"
+ },
+ {
+ "label": "隆尧县",
+ "value": "130525"
+ },
+ {
+ "label": "任县",
+ "value": "130526"
+ },
+ {
+ "label": "南和县",
+ "value": "130527"
+ },
+ {
+ "label": "宁晋县",
+ "value": "130528"
+ },
+ {
+ "label": "巨鹿县",
+ "value": "130529"
+ },
+ {
+ "label": "新河县",
+ "value": "130530"
+ },
+ {
+ "label": "广宗县",
+ "value": "130531"
+ },
+ {
+ "label": "平乡县",
+ "value": "130532"
+ },
+ {
+ "label": "威县",
+ "value": "130533"
+ },
+ {
+ "label": "清河县",
+ "value": "130534"
+ },
+ {
+ "label": "临西县",
+ "value": "130535"
+ },
+ {
+ "label": "河北邢台经济开发区",
+ "value": "130571"
+ },
+ {
+ "label": "南宫市",
+ "value": "130581"
+ },
+ {
+ "label": "沙河市",
+ "value": "130582"
+ }
+ ],
+ [{
+ "label": "竞秀区",
+ "value": "130602"
+ },
+ {
+ "label": "莲池区",
+ "value": "130606"
+ },
+ {
+ "label": "满城区",
+ "value": "130607"
+ },
+ {
+ "label": "清苑区",
+ "value": "130608"
+ },
+ {
+ "label": "徐水区",
+ "value": "130609"
+ },
+ {
+ "label": "涞水县",
+ "value": "130623"
+ },
+ {
+ "label": "阜平县",
+ "value": "130624"
+ },
+ {
+ "label": "定兴县",
+ "value": "130626"
+ },
+ {
+ "label": "唐县",
+ "value": "130627"
+ },
+ {
+ "label": "高阳县",
+ "value": "130628"
+ },
+ {
+ "label": "容城县",
+ "value": "130629"
+ },
+ {
+ "label": "涞源县",
+ "value": "130630"
+ },
+ {
+ "label": "望都县",
+ "value": "130631"
+ },
+ {
+ "label": "安新县",
+ "value": "130632"
+ },
+ {
+ "label": "易县",
+ "value": "130633"
+ },
+ {
+ "label": "曲阳县",
+ "value": "130634"
+ },
+ {
+ "label": "蠡县",
+ "value": "130635"
+ },
+ {
+ "label": "顺平县",
+ "value": "130636"
+ },
+ {
+ "label": "博野县",
+ "value": "130637"
+ },
+ {
+ "label": "雄县",
+ "value": "130638"
+ },
+ {
+ "label": "保定高新技术产业开发区",
+ "value": "130671"
+ },
+ {
+ "label": "保定白沟新城",
+ "value": "130672"
+ },
+ {
+ "label": "涿州市",
+ "value": "130681"
+ },
+ {
+ "label": "定州市",
+ "value": "130682"
+ },
+ {
+ "label": "安国市",
+ "value": "130683"
+ },
+ {
+ "label": "高碑店市",
+ "value": "130684"
+ }
+ ],
+ [{
+ "label": "桥东区",
+ "value": "130702"
+ },
+ {
+ "label": "桥西区",
+ "value": "130703"
+ },
+ {
+ "label": "宣化区",
+ "value": "130705"
+ },
+ {
+ "label": "下花园区",
+ "value": "130706"
+ },
+ {
+ "label": "万全区",
+ "value": "130708"
+ },
+ {
+ "label": "崇礼区",
+ "value": "130709"
+ },
+ {
+ "label": "张北县",
+ "value": "130722"
+ },
+ {
+ "label": "康保县",
+ "value": "130723"
+ },
+ {
+ "label": "沽源县",
+ "value": "130724"
+ },
+ {
+ "label": "尚义县",
+ "value": "130725"
+ },
+ {
+ "label": "蔚县",
+ "value": "130726"
+ },
+ {
+ "label": "阳原县",
+ "value": "130727"
+ },
+ {
+ "label": "怀安县",
+ "value": "130728"
+ },
+ {
+ "label": "怀来县",
+ "value": "130730"
+ },
+ {
+ "label": "涿鹿县",
+ "value": "130731"
+ },
+ {
+ "label": "赤城县",
+ "value": "130732"
+ },
+ {
+ "label": "张家口市高新技术产业开发区",
+ "value": "130771"
+ },
+ {
+ "label": "张家口市察北管理区",
+ "value": "130772"
+ },
+ {
+ "label": "张家口市塞北管理区",
+ "value": "130773"
+ }
+ ],
+ [{
+ "label": "双桥区",
+ "value": "130802"
+ },
+ {
+ "label": "双滦区",
+ "value": "130803"
+ },
+ {
+ "label": "鹰手营子矿区",
+ "value": "130804"
+ },
+ {
+ "label": "承德县",
+ "value": "130821"
+ },
+ {
+ "label": "兴隆县",
+ "value": "130822"
+ },
+ {
+ "label": "滦平县",
+ "value": "130824"
+ },
+ {
+ "label": "隆化县",
+ "value": "130825"
+ },
+ {
+ "label": "丰宁满族自治县",
+ "value": "130826"
+ },
+ {
+ "label": "宽城满族自治县",
+ "value": "130827"
+ },
+ {
+ "label": "围场满族蒙古族自治县",
+ "value": "130828"
+ },
+ {
+ "label": "承德高新技术产业开发区",
+ "value": "130871"
+ },
+ {
+ "label": "平泉市",
+ "value": "130881"
+ }
+ ],
+ [{
+ "label": "新华区",
+ "value": "130902"
+ },
+ {
+ "label": "运河区",
+ "value": "130903"
+ },
+ {
+ "label": "沧县",
+ "value": "130921"
+ },
+ {
+ "label": "青县",
+ "value": "130922"
+ },
+ {
+ "label": "东光县",
+ "value": "130923"
+ },
+ {
+ "label": "海兴县",
+ "value": "130924"
+ },
+ {
+ "label": "盐山县",
+ "value": "130925"
+ },
+ {
+ "label": "肃宁县",
+ "value": "130926"
+ },
+ {
+ "label": "南皮县",
+ "value": "130927"
+ },
+ {
+ "label": "吴桥县",
+ "value": "130928"
+ },
+ {
+ "label": "献县",
+ "value": "130929"
+ },
+ {
+ "label": "孟村回族自治县",
+ "value": "130930"
+ },
+ {
+ "label": "河北沧州经济开发区",
+ "value": "130971"
+ },
+ {
+ "label": "沧州高新技术产业开发区",
+ "value": "130972"
+ },
+ {
+ "label": "沧州渤海新区",
+ "value": "130973"
+ },
+ {
+ "label": "泊头市",
+ "value": "130981"
+ },
+ {
+ "label": "任丘市",
+ "value": "130982"
+ },
+ {
+ "label": "黄骅市",
+ "value": "130983"
+ },
+ {
+ "label": "河间市",
+ "value": "130984"
+ }
+ ],
+ [{
+ "label": "安次区",
+ "value": "131002"
+ },
+ {
+ "label": "广阳区",
+ "value": "131003"
+ },
+ {
+ "label": "固安县",
+ "value": "131022"
+ },
+ {
+ "label": "永清县",
+ "value": "131023"
+ },
+ {
+ "label": "香河县",
+ "value": "131024"
+ },
+ {
+ "label": "大城县",
+ "value": "131025"
+ },
+ {
+ "label": "文安县",
+ "value": "131026"
+ },
+ {
+ "label": "大厂回族自治县",
+ "value": "131028"
+ },
+ {
+ "label": "廊坊经济技术开发区",
+ "value": "131071"
+ },
+ {
+ "label": "霸州市",
+ "value": "131081"
+ },
+ {
+ "label": "三河市",
+ "value": "131082"
+ }
+ ],
+ [{
+ "label": "桃城区",
+ "value": "131102"
+ },
+ {
+ "label": "冀州区",
+ "value": "131103"
+ },
+ {
+ "label": "枣强县",
+ "value": "131121"
+ },
+ {
+ "label": "武邑县",
+ "value": "131122"
+ },
+ {
+ "label": "武强县",
+ "value": "131123"
+ },
+ {
+ "label": "饶阳县",
+ "value": "131124"
+ },
+ {
+ "label": "安平县",
+ "value": "131125"
+ },
+ {
+ "label": "故城县",
+ "value": "131126"
+ },
+ {
+ "label": "景县",
+ "value": "131127"
+ },
+ {
+ "label": "阜城县",
+ "value": "131128"
+ },
+ {
+ "label": "河北衡水经济开发区",
+ "value": "131171"
+ },
+ {
+ "label": "衡水滨湖新区",
+ "value": "131172"
+ },
+ {
+ "label": "深州市",
+ "value": "131182"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "小店区",
+ "value": "140105"
+ },
+ {
+ "label": "迎泽区",
+ "value": "140106"
+ },
+ {
+ "label": "杏花岭区",
+ "value": "140107"
+ },
+ {
+ "label": "尖草坪区",
+ "value": "140108"
+ },
+ {
+ "label": "万柏林区",
+ "value": "140109"
+ },
+ {
+ "label": "晋源区",
+ "value": "140110"
+ },
+ {
+ "label": "清徐县",
+ "value": "140121"
+ },
+ {
+ "label": "阳曲县",
+ "value": "140122"
+ },
+ {
+ "label": "娄烦县",
+ "value": "140123"
+ },
+ {
+ "label": "山西转型综合改革示范区",
+ "value": "140171"
+ },
+ {
+ "label": "古交市",
+ "value": "140181"
+ }
+ ],
+ [{
+ "label": "城区",
+ "value": "140202"
+ },
+ {
+ "label": "矿区",
+ "value": "140203"
+ },
+ {
+ "label": "南郊区",
+ "value": "140211"
+ },
+ {
+ "label": "新荣区",
+ "value": "140212"
+ },
+ {
+ "label": "阳高县",
+ "value": "140221"
+ },
+ {
+ "label": "天镇县",
+ "value": "140222"
+ },
+ {
+ "label": "广灵县",
+ "value": "140223"
+ },
+ {
+ "label": "灵丘县",
+ "value": "140224"
+ },
+ {
+ "label": "浑源县",
+ "value": "140225"
+ },
+ {
+ "label": "左云县",
+ "value": "140226"
+ },
+ {
+ "label": "大同县",
+ "value": "140227"
+ },
+ {
+ "label": "山西大同经济开发区",
+ "value": "140271"
+ }
+ ],
+ [{
+ "label": "城区",
+ "value": "140302"
+ },
+ {
+ "label": "矿区",
+ "value": "140303"
+ },
+ {
+ "label": "郊区",
+ "value": "140311"
+ },
+ {
+ "label": "平定县",
+ "value": "140321"
+ },
+ {
+ "label": "盂县",
+ "value": "140322"
+ },
+ {
+ "label": "山西阳泉经济开发区",
+ "value": "140371"
+ }
+ ],
+ [{
+ "label": "城区",
+ "value": "140402"
+ },
+ {
+ "label": "郊区",
+ "value": "140411"
+ },
+ {
+ "label": "长治县",
+ "value": "140421"
+ },
+ {
+ "label": "襄垣县",
+ "value": "140423"
+ },
+ {
+ "label": "屯留县",
+ "value": "140424"
+ },
+ {
+ "label": "平顺县",
+ "value": "140425"
+ },
+ {
+ "label": "黎城县",
+ "value": "140426"
+ },
+ {
+ "label": "壶关县",
+ "value": "140427"
+ },
+ {
+ "label": "长子县",
+ "value": "140428"
+ },
+ {
+ "label": "武乡县",
+ "value": "140429"
+ },
+ {
+ "label": "沁县",
+ "value": "140430"
+ },
+ {
+ "label": "沁源县",
+ "value": "140431"
+ },
+ {
+ "label": "山西长治高新技术产业园区",
+ "value": "140471"
+ },
+ {
+ "label": "潞城市",
+ "value": "140481"
+ }
+ ],
+ [{
+ "label": "城区",
+ "value": "140502"
+ },
+ {
+ "label": "沁水县",
+ "value": "140521"
+ },
+ {
+ "label": "阳城县",
+ "value": "140522"
+ },
+ {
+ "label": "陵川县",
+ "value": "140524"
+ },
+ {
+ "label": "泽州县",
+ "value": "140525"
+ },
+ {
+ "label": "高平市",
+ "value": "140581"
+ }
+ ],
+ [{
+ "label": "朔城区",
+ "value": "140602"
+ },
+ {
+ "label": "平鲁区",
+ "value": "140603"
+ },
+ {
+ "label": "山阴县",
+ "value": "140621"
+ },
+ {
+ "label": "应县",
+ "value": "140622"
+ },
+ {
+ "label": "右玉县",
+ "value": "140623"
+ },
+ {
+ "label": "怀仁县",
+ "value": "140624"
+ },
+ {
+ "label": "山西朔州经济开发区",
+ "value": "140671"
+ }
+ ],
+ [{
+ "label": "榆次区",
+ "value": "140702"
+ },
+ {
+ "label": "榆社县",
+ "value": "140721"
+ },
+ {
+ "label": "左权县",
+ "value": "140722"
+ },
+ {
+ "label": "和顺县",
+ "value": "140723"
+ },
+ {
+ "label": "昔阳县",
+ "value": "140724"
+ },
+ {
+ "label": "寿阳县",
+ "value": "140725"
+ },
+ {
+ "label": "太谷县",
+ "value": "140726"
+ },
+ {
+ "label": "祁县",
+ "value": "140727"
+ },
+ {
+ "label": "平遥县",
+ "value": "140728"
+ },
+ {
+ "label": "灵石县",
+ "value": "140729"
+ },
+ {
+ "label": "介休市",
+ "value": "140781"
+ }
+ ],
+ [{
+ "label": "盐湖区",
+ "value": "140802"
+ },
+ {
+ "label": "临猗县",
+ "value": "140821"
+ },
+ {
+ "label": "万荣县",
+ "value": "140822"
+ },
+ {
+ "label": "闻喜县",
+ "value": "140823"
+ },
+ {
+ "label": "稷山县",
+ "value": "140824"
+ },
+ {
+ "label": "新绛县",
+ "value": "140825"
+ },
+ {
+ "label": "绛县",
+ "value": "140826"
+ },
+ {
+ "label": "垣曲县",
+ "value": "140827"
+ },
+ {
+ "label": "夏县",
+ "value": "140828"
+ },
+ {
+ "label": "平陆县",
+ "value": "140829"
+ },
+ {
+ "label": "芮城县",
+ "value": "140830"
+ },
+ {
+ "label": "永济市",
+ "value": "140881"
+ },
+ {
+ "label": "河津市",
+ "value": "140882"
+ }
+ ],
+ [{
+ "label": "忻府区",
+ "value": "140902"
+ },
+ {
+ "label": "定襄县",
+ "value": "140921"
+ },
+ {
+ "label": "五台县",
+ "value": "140922"
+ },
+ {
+ "label": "代县",
+ "value": "140923"
+ },
+ {
+ "label": "繁峙县",
+ "value": "140924"
+ },
+ {
+ "label": "宁武县",
+ "value": "140925"
+ },
+ {
+ "label": "静乐县",
+ "value": "140926"
+ },
+ {
+ "label": "神池县",
+ "value": "140927"
+ },
+ {
+ "label": "五寨县",
+ "value": "140928"
+ },
+ {
+ "label": "岢岚县",
+ "value": "140929"
+ },
+ {
+ "label": "河曲县",
+ "value": "140930"
+ },
+ {
+ "label": "保德县",
+ "value": "140931"
+ },
+ {
+ "label": "偏关县",
+ "value": "140932"
+ },
+ {
+ "label": "五台山风景名胜区",
+ "value": "140971"
+ },
+ {
+ "label": "原平市",
+ "value": "140981"
+ }
+ ],
+ [{
+ "label": "尧都区",
+ "value": "141002"
+ },
+ {
+ "label": "曲沃县",
+ "value": "141021"
+ },
+ {
+ "label": "翼城县",
+ "value": "141022"
+ },
+ {
+ "label": "襄汾县",
+ "value": "141023"
+ },
+ {
+ "label": "洪洞县",
+ "value": "141024"
+ },
+ {
+ "label": "古县",
+ "value": "141025"
+ },
+ {
+ "label": "安泽县",
+ "value": "141026"
+ },
+ {
+ "label": "浮山县",
+ "value": "141027"
+ },
+ {
+ "label": "吉县",
+ "value": "141028"
+ },
+ {
+ "label": "乡宁县",
+ "value": "141029"
+ },
+ {
+ "label": "大宁县",
+ "value": "141030"
+ },
+ {
+ "label": "隰县",
+ "value": "141031"
+ },
+ {
+ "label": "永和县",
+ "value": "141032"
+ },
+ {
+ "label": "蒲县",
+ "value": "141033"
+ },
+ {
+ "label": "汾西县",
+ "value": "141034"
+ },
+ {
+ "label": "侯马市",
+ "value": "141081"
+ },
+ {
+ "label": "霍州市",
+ "value": "141082"
+ }
+ ],
+ [{
+ "label": "离石区",
+ "value": "141102"
+ },
+ {
+ "label": "文水县",
+ "value": "141121"
+ },
+ {
+ "label": "交城县",
+ "value": "141122"
+ },
+ {
+ "label": "兴县",
+ "value": "141123"
+ },
+ {
+ "label": "临县",
+ "value": "141124"
+ },
+ {
+ "label": "柳林县",
+ "value": "141125"
+ },
+ {
+ "label": "石楼县",
+ "value": "141126"
+ },
+ {
+ "label": "岚县",
+ "value": "141127"
+ },
+ {
+ "label": "方山县",
+ "value": "141128"
+ },
+ {
+ "label": "中阳县",
+ "value": "141129"
+ },
+ {
+ "label": "交口县",
+ "value": "141130"
+ },
+ {
+ "label": "孝义市",
+ "value": "141181"
+ },
+ {
+ "label": "汾阳市",
+ "value": "141182"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "新城区",
+ "value": "150102"
+ },
+ {
+ "label": "回民区",
+ "value": "150103"
+ },
+ {
+ "label": "玉泉区",
+ "value": "150104"
+ },
+ {
+ "label": "赛罕区",
+ "value": "150105"
+ },
+ {
+ "label": "土默特左旗",
+ "value": "150121"
+ },
+ {
+ "label": "托克托县",
+ "value": "150122"
+ },
+ {
+ "label": "和林格尔县",
+ "value": "150123"
+ },
+ {
+ "label": "清水河县",
+ "value": "150124"
+ },
+ {
+ "label": "武川县",
+ "value": "150125"
+ },
+ {
+ "label": "呼和浩特金海工业园区",
+ "value": "150171"
+ },
+ {
+ "label": "呼和浩特经济技术开发区",
+ "value": "150172"
+ }
+ ],
+ [{
+ "label": "东河区",
+ "value": "150202"
+ },
+ {
+ "label": "昆都仑区",
+ "value": "150203"
+ },
+ {
+ "label": "青山区",
+ "value": "150204"
+ },
+ {
+ "label": "石拐区",
+ "value": "150205"
+ },
+ {
+ "label": "白云鄂博矿区",
+ "value": "150206"
+ },
+ {
+ "label": "九原区",
+ "value": "150207"
+ },
+ {
+ "label": "土默特右旗",
+ "value": "150221"
+ },
+ {
+ "label": "固阳县",
+ "value": "150222"
+ },
+ {
+ "label": "达尔罕茂明安联合旗",
+ "value": "150223"
+ },
+ {
+ "label": "包头稀土高新技术产业开发区",
+ "value": "150271"
+ }
+ ],
+ [{
+ "label": "海勃湾区",
+ "value": "150302"
+ },
+ {
+ "label": "海南区",
+ "value": "150303"
+ },
+ {
+ "label": "乌达区",
+ "value": "150304"
+ }
+ ],
+ [{
+ "label": "红山区",
+ "value": "150402"
+ },
+ {
+ "label": "元宝山区",
+ "value": "150403"
+ },
+ {
+ "label": "松山区",
+ "value": "150404"
+ },
+ {
+ "label": "阿鲁科尔沁旗",
+ "value": "150421"
+ },
+ {
+ "label": "巴林左旗",
+ "value": "150422"
+ },
+ {
+ "label": "巴林右旗",
+ "value": "150423"
+ },
+ {
+ "label": "林西县",
+ "value": "150424"
+ },
+ {
+ "label": "克什克腾旗",
+ "value": "150425"
+ },
+ {
+ "label": "翁牛特旗",
+ "value": "150426"
+ },
+ {
+ "label": "喀喇沁旗",
+ "value": "150428"
+ },
+ {
+ "label": "宁城县",
+ "value": "150429"
+ },
+ {
+ "label": "敖汉旗",
+ "value": "150430"
+ }
+ ],
+ [{
+ "label": "科尔沁区",
+ "value": "150502"
+ },
+ {
+ "label": "科尔沁左翼中旗",
+ "value": "150521"
+ },
+ {
+ "label": "科尔沁左翼后旗",
+ "value": "150522"
+ },
+ {
+ "label": "开鲁县",
+ "value": "150523"
+ },
+ {
+ "label": "库伦旗",
+ "value": "150524"
+ },
+ {
+ "label": "奈曼旗",
+ "value": "150525"
+ },
+ {
+ "label": "扎鲁特旗",
+ "value": "150526"
+ },
+ {
+ "label": "通辽经济技术开发区",
+ "value": "150571"
+ },
+ {
+ "label": "霍林郭勒市",
+ "value": "150581"
+ }
+ ],
+ [{
+ "label": "东胜区",
+ "value": "150602"
+ },
+ {
+ "label": "康巴什区",
+ "value": "150603"
+ },
+ {
+ "label": "达拉特旗",
+ "value": "150621"
+ },
+ {
+ "label": "准格尔旗",
+ "value": "150622"
+ },
+ {
+ "label": "鄂托克前旗",
+ "value": "150623"
+ },
+ {
+ "label": "鄂托克旗",
+ "value": "150624"
+ },
+ {
+ "label": "杭锦旗",
+ "value": "150625"
+ },
+ {
+ "label": "乌审旗",
+ "value": "150626"
+ },
+ {
+ "label": "伊金霍洛旗",
+ "value": "150627"
+ }
+ ],
+ [{
+ "label": "海拉尔区",
+ "value": "150702"
+ },
+ {
+ "label": "扎赉诺尔区",
+ "value": "150703"
+ },
+ {
+ "label": "阿荣旗",
+ "value": "150721"
+ },
+ {
+ "label": "莫力达瓦达斡尔族自治旗",
+ "value": "150722"
+ },
+ {
+ "label": "鄂伦春自治旗",
+ "value": "150723"
+ },
+ {
+ "label": "鄂温克族自治旗",
+ "value": "150724"
+ },
+ {
+ "label": "陈巴尔虎旗",
+ "value": "150725"
+ },
+ {
+ "label": "新巴尔虎左旗",
+ "value": "150726"
+ },
+ {
+ "label": "新巴尔虎右旗",
+ "value": "150727"
+ },
+ {
+ "label": "满洲里市",
+ "value": "150781"
+ },
+ {
+ "label": "牙克石市",
+ "value": "150782"
+ },
+ {
+ "label": "扎兰屯市",
+ "value": "150783"
+ },
+ {
+ "label": "额尔古纳市",
+ "value": "150784"
+ },
+ {
+ "label": "根河市",
+ "value": "150785"
+ }
+ ],
+ [{
+ "label": "临河区",
+ "value": "150802"
+ },
+ {
+ "label": "五原县",
+ "value": "150821"
+ },
+ {
+ "label": "磴口县",
+ "value": "150822"
+ },
+ {
+ "label": "乌拉特前旗",
+ "value": "150823"
+ },
+ {
+ "label": "乌拉特中旗",
+ "value": "150824"
+ },
+ {
+ "label": "乌拉特后旗",
+ "value": "150825"
+ },
+ {
+ "label": "杭锦后旗",
+ "value": "150826"
+ }
+ ],
+ [{
+ "label": "集宁区",
+ "value": "150902"
+ },
+ {
+ "label": "卓资县",
+ "value": "150921"
+ },
+ {
+ "label": "化德县",
+ "value": "150922"
+ },
+ {
+ "label": "商都县",
+ "value": "150923"
+ },
+ {
+ "label": "兴和县",
+ "value": "150924"
+ },
+ {
+ "label": "凉城县",
+ "value": "150925"
+ },
+ {
+ "label": "察哈尔右翼前旗",
+ "value": "150926"
+ },
+ {
+ "label": "察哈尔右翼中旗",
+ "value": "150927"
+ },
+ {
+ "label": "察哈尔右翼后旗",
+ "value": "150928"
+ },
+ {
+ "label": "四子王旗",
+ "value": "150929"
+ },
+ {
+ "label": "丰镇市",
+ "value": "150981"
+ }
+ ],
+ [{
+ "label": "乌兰浩特市",
+ "value": "152201"
+ },
+ {
+ "label": "阿尔山市",
+ "value": "152202"
+ },
+ {
+ "label": "科尔沁右翼前旗",
+ "value": "152221"
+ },
+ {
+ "label": "科尔沁右翼中旗",
+ "value": "152222"
+ },
+ {
+ "label": "扎赉特旗",
+ "value": "152223"
+ },
+ {
+ "label": "突泉县",
+ "value": "152224"
+ }
+ ],
+ [{
+ "label": "二连浩特市",
+ "value": "152501"
+ },
+ {
+ "label": "锡林浩特市",
+ "value": "152502"
+ },
+ {
+ "label": "阿巴嘎旗",
+ "value": "152522"
+ },
+ {
+ "label": "苏尼特左旗",
+ "value": "152523"
+ },
+ {
+ "label": "苏尼特右旗",
+ "value": "152524"
+ },
+ {
+ "label": "东乌珠穆沁旗",
+ "value": "152525"
+ },
+ {
+ "label": "西乌珠穆沁旗",
+ "value": "152526"
+ },
+ {
+ "label": "太仆寺旗",
+ "value": "152527"
+ },
+ {
+ "label": "镶黄旗",
+ "value": "152528"
+ },
+ {
+ "label": "正镶白旗",
+ "value": "152529"
+ },
+ {
+ "label": "正蓝旗",
+ "value": "152530"
+ },
+ {
+ "label": "多伦县",
+ "value": "152531"
+ },
+ {
+ "label": "乌拉盖管委会",
+ "value": "152571"
+ }
+ ],
+ [{
+ "label": "阿拉善左旗",
+ "value": "152921"
+ },
+ {
+ "label": "阿拉善右旗",
+ "value": "152922"
+ },
+ {
+ "label": "额济纳旗",
+ "value": "152923"
+ },
+ {
+ "label": "内蒙古阿拉善经济开发区",
+ "value": "152971"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "和平区",
+ "value": "210102"
+ },
+ {
+ "label": "沈河区",
+ "value": "210103"
+ },
+ {
+ "label": "大东区",
+ "value": "210104"
+ },
+ {
+ "label": "皇姑区",
+ "value": "210105"
+ },
+ {
+ "label": "铁西区",
+ "value": "210106"
+ },
+ {
+ "label": "苏家屯区",
+ "value": "210111"
+ },
+ {
+ "label": "浑南区",
+ "value": "210112"
+ },
+ {
+ "label": "沈北新区",
+ "value": "210113"
+ },
+ {
+ "label": "于洪区",
+ "value": "210114"
+ },
+ {
+ "label": "辽中区",
+ "value": "210115"
+ },
+ {
+ "label": "康平县",
+ "value": "210123"
+ },
+ {
+ "label": "法库县",
+ "value": "210124"
+ },
+ {
+ "label": "新民市",
+ "value": "210181"
+ }
+ ],
+ [{
+ "label": "中山区",
+ "value": "210202"
+ },
+ {
+ "label": "西岗区",
+ "value": "210203"
+ },
+ {
+ "label": "沙河口区",
+ "value": "210204"
+ },
+ {
+ "label": "甘井子区",
+ "value": "210211"
+ },
+ {
+ "label": "旅顺口区",
+ "value": "210212"
+ },
+ {
+ "label": "金州区",
+ "value": "210213"
+ },
+ {
+ "label": "普兰店区",
+ "value": "210214"
+ },
+ {
+ "label": "长海县",
+ "value": "210224"
+ },
+ {
+ "label": "瓦房店市",
+ "value": "210281"
+ },
+ {
+ "label": "庄河市",
+ "value": "210283"
+ }
+ ],
+ [{
+ "label": "铁东区",
+ "value": "210302"
+ },
+ {
+ "label": "铁西区",
+ "value": "210303"
+ },
+ {
+ "label": "立山区",
+ "value": "210304"
+ },
+ {
+ "label": "千山区",
+ "value": "210311"
+ },
+ {
+ "label": "台安县",
+ "value": "210321"
+ },
+ {
+ "label": "岫岩满族自治县",
+ "value": "210323"
+ },
+ {
+ "label": "海城市",
+ "value": "210381"
+ }
+ ],
+ [{
+ "label": "新抚区",
+ "value": "210402"
+ },
+ {
+ "label": "东洲区",
+ "value": "210403"
+ },
+ {
+ "label": "望花区",
+ "value": "210404"
+ },
+ {
+ "label": "顺城区",
+ "value": "210411"
+ },
+ {
+ "label": "抚顺县",
+ "value": "210421"
+ },
+ {
+ "label": "新宾满族自治县",
+ "value": "210422"
+ },
+ {
+ "label": "清原满族自治县",
+ "value": "210423"
+ }
+ ],
+ [{
+ "label": "平山区",
+ "value": "210502"
+ },
+ {
+ "label": "溪湖区",
+ "value": "210503"
+ },
+ {
+ "label": "明山区",
+ "value": "210504"
+ },
+ {
+ "label": "南芬区",
+ "value": "210505"
+ },
+ {
+ "label": "本溪满族自治县",
+ "value": "210521"
+ },
+ {
+ "label": "桓仁满族自治县",
+ "value": "210522"
+ }
+ ],
+ [{
+ "label": "元宝区",
+ "value": "210602"
+ },
+ {
+ "label": "振兴区",
+ "value": "210603"
+ },
+ {
+ "label": "振安区",
+ "value": "210604"
+ },
+ {
+ "label": "宽甸满族自治县",
+ "value": "210624"
+ },
+ {
+ "label": "东港市",
+ "value": "210681"
+ },
+ {
+ "label": "凤城市",
+ "value": "210682"
+ }
+ ],
+ [{
+ "label": "古塔区",
+ "value": "210702"
+ },
+ {
+ "label": "凌河区",
+ "value": "210703"
+ },
+ {
+ "label": "太和区",
+ "value": "210711"
+ },
+ {
+ "label": "黑山县",
+ "value": "210726"
+ },
+ {
+ "label": "义县",
+ "value": "210727"
+ },
+ {
+ "label": "凌海市",
+ "value": "210781"
+ },
+ {
+ "label": "北镇市",
+ "value": "210782"
+ }
+ ],
+ [{
+ "label": "站前区",
+ "value": "210802"
+ },
+ {
+ "label": "西市区",
+ "value": "210803"
+ },
+ {
+ "label": "鲅鱼圈区",
+ "value": "210804"
+ },
+ {
+ "label": "老边区",
+ "value": "210811"
+ },
+ {
+ "label": "盖州市",
+ "value": "210881"
+ },
+ {
+ "label": "大石桥市",
+ "value": "210882"
+ }
+ ],
+ [{
+ "label": "海州区",
+ "value": "210902"
+ },
+ {
+ "label": "新邱区",
+ "value": "210903"
+ },
+ {
+ "label": "太平区",
+ "value": "210904"
+ },
+ {
+ "label": "清河门区",
+ "value": "210905"
+ },
+ {
+ "label": "细河区",
+ "value": "210911"
+ },
+ {
+ "label": "阜新蒙古族自治县",
+ "value": "210921"
+ },
+ {
+ "label": "彰武县",
+ "value": "210922"
+ }
+ ],
+ [{
+ "label": "白塔区",
+ "value": "211002"
+ },
+ {
+ "label": "文圣区",
+ "value": "211003"
+ },
+ {
+ "label": "宏伟区",
+ "value": "211004"
+ },
+ {
+ "label": "弓长岭区",
+ "value": "211005"
+ },
+ {
+ "label": "太子河区",
+ "value": "211011"
+ },
+ {
+ "label": "辽阳县",
+ "value": "211021"
+ },
+ {
+ "label": "灯塔市",
+ "value": "211081"
+ }
+ ],
+ [{
+ "label": "双台子区",
+ "value": "211102"
+ },
+ {
+ "label": "兴隆台区",
+ "value": "211103"
+ },
+ {
+ "label": "大洼区",
+ "value": "211104"
+ },
+ {
+ "label": "盘山县",
+ "value": "211122"
+ }
+ ],
+ [{
+ "label": "银州区",
+ "value": "211202"
+ },
+ {
+ "label": "清河区",
+ "value": "211204"
+ },
+ {
+ "label": "铁岭县",
+ "value": "211221"
+ },
+ {
+ "label": "西丰县",
+ "value": "211223"
+ },
+ {
+ "label": "昌图县",
+ "value": "211224"
+ },
+ {
+ "label": "调兵山市",
+ "value": "211281"
+ },
+ {
+ "label": "开原市",
+ "value": "211282"
+ }
+ ],
+ [{
+ "label": "双塔区",
+ "value": "211302"
+ },
+ {
+ "label": "龙城区",
+ "value": "211303"
+ },
+ {
+ "label": "朝阳县",
+ "value": "211321"
+ },
+ {
+ "label": "建平县",
+ "value": "211322"
+ },
+ {
+ "label": "喀喇沁左翼蒙古族自治县",
+ "value": "211324"
+ },
+ {
+ "label": "北票市",
+ "value": "211381"
+ },
+ {
+ "label": "凌源市",
+ "value": "211382"
+ }
+ ],
+ [{
+ "label": "连山区",
+ "value": "211402"
+ },
+ {
+ "label": "龙港区",
+ "value": "211403"
+ },
+ {
+ "label": "南票区",
+ "value": "211404"
+ },
+ {
+ "label": "绥中县",
+ "value": "211421"
+ },
+ {
+ "label": "建昌县",
+ "value": "211422"
+ },
+ {
+ "label": "兴城市",
+ "value": "211481"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "南关区",
+ "value": "220102"
+ },
+ {
+ "label": "宽城区",
+ "value": "220103"
+ },
+ {
+ "label": "朝阳区",
+ "value": "220104"
+ },
+ {
+ "label": "二道区",
+ "value": "220105"
+ },
+ {
+ "label": "绿园区",
+ "value": "220106"
+ },
+ {
+ "label": "双阳区",
+ "value": "220112"
+ },
+ {
+ "label": "九台区",
+ "value": "220113"
+ },
+ {
+ "label": "农安县",
+ "value": "220122"
+ },
+ {
+ "label": "长春经济技术开发区",
+ "value": "220171"
+ },
+ {
+ "label": "长春净月高新技术产业开发区",
+ "value": "220172"
+ },
+ {
+ "label": "长春高新技术产业开发区",
+ "value": "220173"
+ },
+ {
+ "label": "长春汽车经济技术开发区",
+ "value": "220174"
+ },
+ {
+ "label": "榆树市",
+ "value": "220182"
+ },
+ {
+ "label": "德惠市",
+ "value": "220183"
+ }
+ ],
+ [{
+ "label": "昌邑区",
+ "value": "220202"
+ },
+ {
+ "label": "龙潭区",
+ "value": "220203"
+ },
+ {
+ "label": "船营区",
+ "value": "220204"
+ },
+ {
+ "label": "丰满区",
+ "value": "220211"
+ },
+ {
+ "label": "永吉县",
+ "value": "220221"
+ },
+ {
+ "label": "吉林经济开发区",
+ "value": "220271"
+ },
+ {
+ "label": "吉林高新技术产业开发区",
+ "value": "220272"
+ },
+ {
+ "label": "吉林中国新加坡食品区",
+ "value": "220273"
+ },
+ {
+ "label": "蛟河市",
+ "value": "220281"
+ },
+ {
+ "label": "桦甸市",
+ "value": "220282"
+ },
+ {
+ "label": "舒兰市",
+ "value": "220283"
+ },
+ {
+ "label": "磐石市",
+ "value": "220284"
+ }
+ ],
+ [{
+ "label": "铁西区",
+ "value": "220302"
+ },
+ {
+ "label": "铁东区",
+ "value": "220303"
+ },
+ {
+ "label": "梨树县",
+ "value": "220322"
+ },
+ {
+ "label": "伊通满族自治县",
+ "value": "220323"
+ },
+ {
+ "label": "公主岭市",
+ "value": "220381"
+ },
+ {
+ "label": "双辽市",
+ "value": "220382"
+ }
+ ],
+ [{
+ "label": "龙山区",
+ "value": "220402"
+ },
+ {
+ "label": "西安区",
+ "value": "220403"
+ },
+ {
+ "label": "东丰县",
+ "value": "220421"
+ },
+ {
+ "label": "东辽县",
+ "value": "220422"
+ }
+ ],
+ [{
+ "label": "东昌区",
+ "value": "220502"
+ },
+ {
+ "label": "二道江区",
+ "value": "220503"
+ },
+ {
+ "label": "通化县",
+ "value": "220521"
+ },
+ {
+ "label": "辉南县",
+ "value": "220523"
+ },
+ {
+ "label": "柳河县",
+ "value": "220524"
+ },
+ {
+ "label": "梅河口市",
+ "value": "220581"
+ },
+ {
+ "label": "集安市",
+ "value": "220582"
+ }
+ ],
+ [{
+ "label": "浑江区",
+ "value": "220602"
+ },
+ {
+ "label": "江源区",
+ "value": "220605"
+ },
+ {
+ "label": "抚松县",
+ "value": "220621"
+ },
+ {
+ "label": "靖宇县",
+ "value": "220622"
+ },
+ {
+ "label": "长白朝鲜族自治县",
+ "value": "220623"
+ },
+ {
+ "label": "临江市",
+ "value": "220681"
+ }
+ ],
+ [{
+ "label": "宁江区",
+ "value": "220702"
+ },
+ {
+ "label": "前郭尔罗斯蒙古族自治县",
+ "value": "220721"
+ },
+ {
+ "label": "长岭县",
+ "value": "220722"
+ },
+ {
+ "label": "乾安县",
+ "value": "220723"
+ },
+ {
+ "label": "吉林松原经济开发区",
+ "value": "220771"
+ },
+ {
+ "label": "扶余市",
+ "value": "220781"
+ }
+ ],
+ [{
+ "label": "洮北区",
+ "value": "220802"
+ },
+ {
+ "label": "镇赉县",
+ "value": "220821"
+ },
+ {
+ "label": "通榆县",
+ "value": "220822"
+ },
+ {
+ "label": "吉林白城经济开发区",
+ "value": "220871"
+ },
+ {
+ "label": "洮南市",
+ "value": "220881"
+ },
+ {
+ "label": "大安市",
+ "value": "220882"
+ }
+ ],
+ [{
+ "label": "延吉市",
+ "value": "222401"
+ },
+ {
+ "label": "图们市",
+ "value": "222402"
+ },
+ {
+ "label": "敦化市",
+ "value": "222403"
+ },
+ {
+ "label": "珲春市",
+ "value": "222404"
+ },
+ {
+ "label": "龙井市",
+ "value": "222405"
+ },
+ {
+ "label": "和龙市",
+ "value": "222406"
+ },
+ {
+ "label": "汪清县",
+ "value": "222424"
+ },
+ {
+ "label": "安图县",
+ "value": "222426"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "道里区",
+ "value": "230102"
+ },
+ {
+ "label": "南岗区",
+ "value": "230103"
+ },
+ {
+ "label": "道外区",
+ "value": "230104"
+ },
+ {
+ "label": "平房区",
+ "value": "230108"
+ },
+ {
+ "label": "松北区",
+ "value": "230109"
+ },
+ {
+ "label": "香坊区",
+ "value": "230110"
+ },
+ {
+ "label": "呼兰区",
+ "value": "230111"
+ },
+ {
+ "label": "阿城区",
+ "value": "230112"
+ },
+ {
+ "label": "双城区",
+ "value": "230113"
+ },
+ {
+ "label": "依兰县",
+ "value": "230123"
+ },
+ {
+ "label": "方正县",
+ "value": "230124"
+ },
+ {
+ "label": "宾县",
+ "value": "230125"
+ },
+ {
+ "label": "巴彦县",
+ "value": "230126"
+ },
+ {
+ "label": "木兰县",
+ "value": "230127"
+ },
+ {
+ "label": "通河县",
+ "value": "230128"
+ },
+ {
+ "label": "延寿县",
+ "value": "230129"
+ },
+ {
+ "label": "尚志市",
+ "value": "230183"
+ },
+ {
+ "label": "五常市",
+ "value": "230184"
+ }
+ ],
+ [{
+ "label": "龙沙区",
+ "value": "230202"
+ },
+ {
+ "label": "建华区",
+ "value": "230203"
+ },
+ {
+ "label": "铁锋区",
+ "value": "230204"
+ },
+ {
+ "label": "昂昂溪区",
+ "value": "230205"
+ },
+ {
+ "label": "富拉尔基区",
+ "value": "230206"
+ },
+ {
+ "label": "碾子山区",
+ "value": "230207"
+ },
+ {
+ "label": "梅里斯达斡尔族区",
+ "value": "230208"
+ },
+ {
+ "label": "龙江县",
+ "value": "230221"
+ },
+ {
+ "label": "依安县",
+ "value": "230223"
+ },
+ {
+ "label": "泰来县",
+ "value": "230224"
+ },
+ {
+ "label": "甘南县",
+ "value": "230225"
+ },
+ {
+ "label": "富裕县",
+ "value": "230227"
+ },
+ {
+ "label": "克山县",
+ "value": "230229"
+ },
+ {
+ "label": "克东县",
+ "value": "230230"
+ },
+ {
+ "label": "拜泉县",
+ "value": "230231"
+ },
+ {
+ "label": "讷河市",
+ "value": "230281"
+ }
+ ],
+ [{
+ "label": "鸡冠区",
+ "value": "230302"
+ },
+ {
+ "label": "恒山区",
+ "value": "230303"
+ },
+ {
+ "label": "滴道区",
+ "value": "230304"
+ },
+ {
+ "label": "梨树区",
+ "value": "230305"
+ },
+ {
+ "label": "城子河区",
+ "value": "230306"
+ },
+ {
+ "label": "麻山区",
+ "value": "230307"
+ },
+ {
+ "label": "鸡东县",
+ "value": "230321"
+ },
+ {
+ "label": "虎林市",
+ "value": "230381"
+ },
+ {
+ "label": "密山市",
+ "value": "230382"
+ }
+ ],
+ [{
+ "label": "向阳区",
+ "value": "230402"
+ },
+ {
+ "label": "工农区",
+ "value": "230403"
+ },
+ {
+ "label": "南山区",
+ "value": "230404"
+ },
+ {
+ "label": "兴安区",
+ "value": "230405"
+ },
+ {
+ "label": "东山区",
+ "value": "230406"
+ },
+ {
+ "label": "兴山区",
+ "value": "230407"
+ },
+ {
+ "label": "萝北县",
+ "value": "230421"
+ },
+ {
+ "label": "绥滨县",
+ "value": "230422"
+ }
+ ],
+ [{
+ "label": "尖山区",
+ "value": "230502"
+ },
+ {
+ "label": "岭东区",
+ "value": "230503"
+ },
+ {
+ "label": "四方台区",
+ "value": "230505"
+ },
+ {
+ "label": "宝山区",
+ "value": "230506"
+ },
+ {
+ "label": "集贤县",
+ "value": "230521"
+ },
+ {
+ "label": "友谊县",
+ "value": "230522"
+ },
+ {
+ "label": "宝清县",
+ "value": "230523"
+ },
+ {
+ "label": "饶河县",
+ "value": "230524"
+ }
+ ],
+ [{
+ "label": "萨尔图区",
+ "value": "230602"
+ },
+ {
+ "label": "龙凤区",
+ "value": "230603"
+ },
+ {
+ "label": "让胡路区",
+ "value": "230604"
+ },
+ {
+ "label": "红岗区",
+ "value": "230605"
+ },
+ {
+ "label": "大同区",
+ "value": "230606"
+ },
+ {
+ "label": "肇州县",
+ "value": "230621"
+ },
+ {
+ "label": "肇源县",
+ "value": "230622"
+ },
+ {
+ "label": "林甸县",
+ "value": "230623"
+ },
+ {
+ "label": "杜尔伯特蒙古族自治县",
+ "value": "230624"
+ },
+ {
+ "label": "大庆高新技术产业开发区",
+ "value": "230671"
+ }
+ ],
+ [{
+ "label": "伊春区",
+ "value": "230702"
+ },
+ {
+ "label": "南岔区",
+ "value": "230703"
+ },
+ {
+ "label": "友好区",
+ "value": "230704"
+ },
+ {
+ "label": "西林区",
+ "value": "230705"
+ },
+ {
+ "label": "翠峦区",
+ "value": "230706"
+ },
+ {
+ "label": "新青区",
+ "value": "230707"
+ },
+ {
+ "label": "美溪区",
+ "value": "230708"
+ },
+ {
+ "label": "金山屯区",
+ "value": "230709"
+ },
+ {
+ "label": "五营区",
+ "value": "230710"
+ },
+ {
+ "label": "乌马河区",
+ "value": "230711"
+ },
+ {
+ "label": "汤旺河区",
+ "value": "230712"
+ },
+ {
+ "label": "带岭区",
+ "value": "230713"
+ },
+ {
+ "label": "乌伊岭区",
+ "value": "230714"
+ },
+ {
+ "label": "红星区",
+ "value": "230715"
+ },
+ {
+ "label": "上甘岭区",
+ "value": "230716"
+ },
+ {
+ "label": "嘉荫县",
+ "value": "230722"
+ },
+ {
+ "label": "铁力市",
+ "value": "230781"
+ }
+ ],
+ [{
+ "label": "向阳区",
+ "value": "230803"
+ },
+ {
+ "label": "前进区",
+ "value": "230804"
+ },
+ {
+ "label": "东风区",
+ "value": "230805"
+ },
+ {
+ "label": "郊区",
+ "value": "230811"
+ },
+ {
+ "label": "桦南县",
+ "value": "230822"
+ },
+ {
+ "label": "桦川县",
+ "value": "230826"
+ },
+ {
+ "label": "汤原县",
+ "value": "230828"
+ },
+ {
+ "label": "同江市",
+ "value": "230881"
+ },
+ {
+ "label": "富锦市",
+ "value": "230882"
+ },
+ {
+ "label": "抚远市",
+ "value": "230883"
+ }
+ ],
+ [{
+ "label": "新兴区",
+ "value": "230902"
+ },
+ {
+ "label": "桃山区",
+ "value": "230903"
+ },
+ {
+ "label": "茄子河区",
+ "value": "230904"
+ },
+ {
+ "label": "勃利县",
+ "value": "230921"
+ }
+ ],
+ [{
+ "label": "东安区",
+ "value": "231002"
+ },
+ {
+ "label": "阳明区",
+ "value": "231003"
+ },
+ {
+ "label": "爱民区",
+ "value": "231004"
+ },
+ {
+ "label": "西安区",
+ "value": "231005"
+ },
+ {
+ "label": "林口县",
+ "value": "231025"
+ },
+ {
+ "label": "牡丹江经济技术开发区",
+ "value": "231071"
+ },
+ {
+ "label": "绥芬河市",
+ "value": "231081"
+ },
+ {
+ "label": "海林市",
+ "value": "231083"
+ },
+ {
+ "label": "宁安市",
+ "value": "231084"
+ },
+ {
+ "label": "穆棱市",
+ "value": "231085"
+ },
+ {
+ "label": "东宁市",
+ "value": "231086"
+ }
+ ],
+ [{
+ "label": "爱辉区",
+ "value": "231102"
+ },
+ {
+ "label": "嫩江县",
+ "value": "231121"
+ },
+ {
+ "label": "逊克县",
+ "value": "231123"
+ },
+ {
+ "label": "孙吴县",
+ "value": "231124"
+ },
+ {
+ "label": "北安市",
+ "value": "231181"
+ },
+ {
+ "label": "五大连池市",
+ "value": "231182"
+ }
+ ],
+ [{
+ "label": "北林区",
+ "value": "231202"
+ },
+ {
+ "label": "望奎县",
+ "value": "231221"
+ },
+ {
+ "label": "兰西县",
+ "value": "231222"
+ },
+ {
+ "label": "青冈县",
+ "value": "231223"
+ },
+ {
+ "label": "庆安县",
+ "value": "231224"
+ },
+ {
+ "label": "明水县",
+ "value": "231225"
+ },
+ {
+ "label": "绥棱县",
+ "value": "231226"
+ },
+ {
+ "label": "安达市",
+ "value": "231281"
+ },
+ {
+ "label": "肇东市",
+ "value": "231282"
+ },
+ {
+ "label": "海伦市",
+ "value": "231283"
+ }
+ ],
+ [{
+ "label": "加格达奇区",
+ "value": "232701"
+ },
+ {
+ "label": "松岭区",
+ "value": "232702"
+ },
+ {
+ "label": "新林区",
+ "value": "232703"
+ },
+ {
+ "label": "呼中区",
+ "value": "232704"
+ },
+ {
+ "label": "呼玛县",
+ "value": "232721"
+ },
+ {
+ "label": "塔河县",
+ "value": "232722"
+ },
+ {
+ "label": "漠河县",
+ "value": "232723"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "黄浦区",
+ "value": "310101"
+ },
+ {
+ "label": "徐汇区",
+ "value": "310104"
+ },
+ {
+ "label": "长宁区",
+ "value": "310105"
+ },
+ {
+ "label": "静安区",
+ "value": "310106"
+ },
+ {
+ "label": "普陀区",
+ "value": "310107"
+ },
+ {
+ "label": "虹口区",
+ "value": "310109"
+ },
+ {
+ "label": "杨浦区",
+ "value": "310110"
+ },
+ {
+ "label": "闵行区",
+ "value": "310112"
+ },
+ {
+ "label": "宝山区",
+ "value": "310113"
+ },
+ {
+ "label": "嘉定区",
+ "value": "310114"
+ },
+ {
+ "label": "浦东新区",
+ "value": "310115"
+ },
+ {
+ "label": "金山区",
+ "value": "310116"
+ },
+ {
+ "label": "松江区",
+ "value": "310117"
+ },
+ {
+ "label": "青浦区",
+ "value": "310118"
+ },
+ {
+ "label": "奉贤区",
+ "value": "310120"
+ },
+ {
+ "label": "崇明区",
+ "value": "310151"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "玄武区",
+ "value": "320102"
+ },
+ {
+ "label": "秦淮区",
+ "value": "320104"
+ },
+ {
+ "label": "建邺区",
+ "value": "320105"
+ },
+ {
+ "label": "鼓楼区",
+ "value": "320106"
+ },
+ {
+ "label": "浦口区",
+ "value": "320111"
+ },
+ {
+ "label": "栖霞区",
+ "value": "320113"
+ },
+ {
+ "label": "雨花台区",
+ "value": "320114"
+ },
+ {
+ "label": "江宁区",
+ "value": "320115"
+ },
+ {
+ "label": "六合区",
+ "value": "320116"
+ },
+ {
+ "label": "溧水区",
+ "value": "320117"
+ },
+ {
+ "label": "高淳区",
+ "value": "320118"
+ }
+ ],
+ [{
+ "label": "锡山区",
+ "value": "320205"
+ },
+ {
+ "label": "惠山区",
+ "value": "320206"
+ },
+ {
+ "label": "滨湖区",
+ "value": "320211"
+ },
+ {
+ "label": "梁溪区",
+ "value": "320213"
+ },
+ {
+ "label": "新吴区",
+ "value": "320214"
+ },
+ {
+ "label": "江阴市",
+ "value": "320281"
+ },
+ {
+ "label": "宜兴市",
+ "value": "320282"
+ }
+ ],
+ [{
+ "label": "鼓楼区",
+ "value": "320302"
+ },
+ {
+ "label": "云龙区",
+ "value": "320303"
+ },
+ {
+ "label": "贾汪区",
+ "value": "320305"
+ },
+ {
+ "label": "泉山区",
+ "value": "320311"
+ },
+ {
+ "label": "铜山区",
+ "value": "320312"
+ },
+ {
+ "label": "丰县",
+ "value": "320321"
+ },
+ {
+ "label": "沛县",
+ "value": "320322"
+ },
+ {
+ "label": "睢宁县",
+ "value": "320324"
+ },
+ {
+ "label": "徐州经济技术开发区",
+ "value": "320371"
+ },
+ {
+ "label": "新沂市",
+ "value": "320381"
+ },
+ {
+ "label": "邳州市",
+ "value": "320382"
+ }
+ ],
+ [{
+ "label": "天宁区",
+ "value": "320402"
+ },
+ {
+ "label": "钟楼区",
+ "value": "320404"
+ },
+ {
+ "label": "新北区",
+ "value": "320411"
+ },
+ {
+ "label": "武进区",
+ "value": "320412"
+ },
+ {
+ "label": "金坛区",
+ "value": "320413"
+ },
+ {
+ "label": "溧阳市",
+ "value": "320481"
+ }
+ ],
+ [{
+ "label": "虎丘区",
+ "value": "320505"
+ },
+ {
+ "label": "吴中区",
+ "value": "320506"
+ },
+ {
+ "label": "相城区",
+ "value": "320507"
+ },
+ {
+ "label": "姑苏区",
+ "value": "320508"
+ },
+ {
+ "label": "吴江区",
+ "value": "320509"
+ },
+ {
+ "label": "苏州工业园区",
+ "value": "320571"
+ },
+ {
+ "label": "常熟市",
+ "value": "320581"
+ },
+ {
+ "label": "张家港市",
+ "value": "320582"
+ },
+ {
+ "label": "昆山市",
+ "value": "320583"
+ },
+ {
+ "label": "太仓市",
+ "value": "320585"
+ }
+ ],
+ [{
+ "label": "崇川区",
+ "value": "320602"
+ },
+ {
+ "label": "港闸区",
+ "value": "320611"
+ },
+ {
+ "label": "通州区",
+ "value": "320612"
+ },
+ {
+ "label": "海安县",
+ "value": "320621"
+ },
+ {
+ "label": "如东县",
+ "value": "320623"
+ },
+ {
+ "label": "南通经济技术开发区",
+ "value": "320671"
+ },
+ {
+ "label": "启东市",
+ "value": "320681"
+ },
+ {
+ "label": "如皋市",
+ "value": "320682"
+ },
+ {
+ "label": "海门市",
+ "value": "320684"
+ }
+ ],
+ [{
+ "label": "连云区",
+ "value": "320703"
+ },
+ {
+ "label": "海州区",
+ "value": "320706"
+ },
+ {
+ "label": "赣榆区",
+ "value": "320707"
+ },
+ {
+ "label": "东海县",
+ "value": "320722"
+ },
+ {
+ "label": "灌云县",
+ "value": "320723"
+ },
+ {
+ "label": "灌南县",
+ "value": "320724"
+ },
+ {
+ "label": "连云港经济技术开发区",
+ "value": "320771"
+ },
+ {
+ "label": "连云港高新技术产业开发区",
+ "value": "320772"
+ }
+ ],
+ [{
+ "label": "淮安区",
+ "value": "320803"
+ },
+ {
+ "label": "淮阴区",
+ "value": "320804"
+ },
+ {
+ "label": "清江浦区",
+ "value": "320812"
+ },
+ {
+ "label": "洪泽区",
+ "value": "320813"
+ },
+ {
+ "label": "涟水县",
+ "value": "320826"
+ },
+ {
+ "label": "盱眙县",
+ "value": "320830"
+ },
+ {
+ "label": "金湖县",
+ "value": "320831"
+ },
+ {
+ "label": "淮安经济技术开发区",
+ "value": "320871"
+ }
+ ],
+ [{
+ "label": "亭湖区",
+ "value": "320902"
+ },
+ {
+ "label": "盐都区",
+ "value": "320903"
+ },
+ {
+ "label": "大丰区",
+ "value": "320904"
+ },
+ {
+ "label": "响水县",
+ "value": "320921"
+ },
+ {
+ "label": "滨海县",
+ "value": "320922"
+ },
+ {
+ "label": "阜宁县",
+ "value": "320923"
+ },
+ {
+ "label": "射阳县",
+ "value": "320924"
+ },
+ {
+ "label": "建湖县",
+ "value": "320925"
+ },
+ {
+ "label": "盐城经济技术开发区",
+ "value": "320971"
+ },
+ {
+ "label": "东台市",
+ "value": "320981"
+ }
+ ],
+ [{
+ "label": "广陵区",
+ "value": "321002"
+ },
+ {
+ "label": "邗江区",
+ "value": "321003"
+ },
+ {
+ "label": "江都区",
+ "value": "321012"
+ },
+ {
+ "label": "宝应县",
+ "value": "321023"
+ },
+ {
+ "label": "扬州经济技术开发区",
+ "value": "321071"
+ },
+ {
+ "label": "仪征市",
+ "value": "321081"
+ },
+ {
+ "label": "高邮市",
+ "value": "321084"
+ }
+ ],
+ [{
+ "label": "京口区",
+ "value": "321102"
+ },
+ {
+ "label": "润州区",
+ "value": "321111"
+ },
+ {
+ "label": "丹徒区",
+ "value": "321112"
+ },
+ {
+ "label": "镇江新区",
+ "value": "321171"
+ },
+ {
+ "label": "丹阳市",
+ "value": "321181"
+ },
+ {
+ "label": "扬中市",
+ "value": "321182"
+ },
+ {
+ "label": "句容市",
+ "value": "321183"
+ }
+ ],
+ [{
+ "label": "海陵区",
+ "value": "321202"
+ },
+ {
+ "label": "高港区",
+ "value": "321203"
+ },
+ {
+ "label": "姜堰区",
+ "value": "321204"
+ },
+ {
+ "label": "泰州医药高新技术产业开发区",
+ "value": "321271"
+ },
+ {
+ "label": "兴化市",
+ "value": "321281"
+ },
+ {
+ "label": "靖江市",
+ "value": "321282"
+ },
+ {
+ "label": "泰兴市",
+ "value": "321283"
+ }
+ ],
+ [{
+ "label": "宿城区",
+ "value": "321302"
+ },
+ {
+ "label": "宿豫区",
+ "value": "321311"
+ },
+ {
+ "label": "沭阳县",
+ "value": "321322"
+ },
+ {
+ "label": "泗阳县",
+ "value": "321323"
+ },
+ {
+ "label": "泗洪县",
+ "value": "321324"
+ },
+ {
+ "label": "宿迁经济技术开发区",
+ "value": "321371"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "上城区",
+ "value": "330102"
+ },
+ {
+ "label": "下城区",
+ "value": "330103"
+ },
+ {
+ "label": "江干区",
+ "value": "330104"
+ },
+ {
+ "label": "拱墅区",
+ "value": "330105"
+ },
+ {
+ "label": "西湖区",
+ "value": "330106"
+ },
+ {
+ "label": "滨江区",
+ "value": "330108"
+ },
+ {
+ "label": "萧山区",
+ "value": "330109"
+ },
+ {
+ "label": "余杭区",
+ "value": "330110"
+ },
+ {
+ "label": "富阳区",
+ "value": "330111"
+ },
+ {
+ "label": "临安区",
+ "value": "330112"
+ },
+ {
+ "label": "桐庐县",
+ "value": "330122"
+ },
+ {
+ "label": "淳安县",
+ "value": "330127"
+ },
+ {
+ "label": "建德市",
+ "value": "330182"
+ }
+ ],
+ [{
+ "label": "海曙区",
+ "value": "330203"
+ },
+ {
+ "label": "江北区",
+ "value": "330205"
+ },
+ {
+ "label": "北仑区",
+ "value": "330206"
+ },
+ {
+ "label": "镇海区",
+ "value": "330211"
+ },
+ {
+ "label": "鄞州区",
+ "value": "330212"
+ },
+ {
+ "label": "奉化区",
+ "value": "330213"
+ },
+ {
+ "label": "象山县",
+ "value": "330225"
+ },
+ {
+ "label": "宁海县",
+ "value": "330226"
+ },
+ {
+ "label": "余姚市",
+ "value": "330281"
+ },
+ {
+ "label": "慈溪市",
+ "value": "330282"
+ }
+ ],
+ [{
+ "label": "鹿城区",
+ "value": "330302"
+ },
+ {
+ "label": "龙湾区",
+ "value": "330303"
+ },
+ {
+ "label": "瓯海区",
+ "value": "330304"
+ },
+ {
+ "label": "洞头区",
+ "value": "330305"
+ },
+ {
+ "label": "永嘉县",
+ "value": "330324"
+ },
+ {
+ "label": "平阳县",
+ "value": "330326"
+ },
+ {
+ "label": "苍南县",
+ "value": "330327"
+ },
+ {
+ "label": "文成县",
+ "value": "330328"
+ },
+ {
+ "label": "泰顺县",
+ "value": "330329"
+ },
+ {
+ "label": "温州经济技术开发区",
+ "value": "330371"
+ },
+ {
+ "label": "瑞安市",
+ "value": "330381"
+ },
+ {
+ "label": "乐清市",
+ "value": "330382"
+ }
+ ],
+ [{
+ "label": "南湖区",
+ "value": "330402"
+ },
+ {
+ "label": "秀洲区",
+ "value": "330411"
+ },
+ {
+ "label": "嘉善县",
+ "value": "330421"
+ },
+ {
+ "label": "海盐县",
+ "value": "330424"
+ },
+ {
+ "label": "海宁市",
+ "value": "330481"
+ },
+ {
+ "label": "平湖市",
+ "value": "330482"
+ },
+ {
+ "label": "桐乡市",
+ "value": "330483"
+ }
+ ],
+ [{
+ "label": "吴兴区",
+ "value": "330502"
+ },
+ {
+ "label": "南浔区",
+ "value": "330503"
+ },
+ {
+ "label": "德清县",
+ "value": "330521"
+ },
+ {
+ "label": "长兴县",
+ "value": "330522"
+ },
+ {
+ "label": "安吉县",
+ "value": "330523"
+ }
+ ],
+ [{
+ "label": "越城区",
+ "value": "330602"
+ },
+ {
+ "label": "柯桥区",
+ "value": "330603"
+ },
+ {
+ "label": "上虞区",
+ "value": "330604"
+ },
+ {
+ "label": "新昌县",
+ "value": "330624"
+ },
+ {
+ "label": "诸暨市",
+ "value": "330681"
+ },
+ {
+ "label": "嵊州市",
+ "value": "330683"
+ }
+ ],
+ [{
+ "label": "婺城区",
+ "value": "330702"
+ },
+ {
+ "label": "金东区",
+ "value": "330703"
+ },
+ {
+ "label": "武义县",
+ "value": "330723"
+ },
+ {
+ "label": "浦江县",
+ "value": "330726"
+ },
+ {
+ "label": "磐安县",
+ "value": "330727"
+ },
+ {
+ "label": "兰溪市",
+ "value": "330781"
+ },
+ {
+ "label": "义乌市",
+ "value": "330782"
+ },
+ {
+ "label": "东阳市",
+ "value": "330783"
+ },
+ {
+ "label": "永康市",
+ "value": "330784"
+ }
+ ],
+ [{
+ "label": "柯城区",
+ "value": "330802"
+ },
+ {
+ "label": "衢江区",
+ "value": "330803"
+ },
+ {
+ "label": "常山县",
+ "value": "330822"
+ },
+ {
+ "label": "开化县",
+ "value": "330824"
+ },
+ {
+ "label": "龙游县",
+ "value": "330825"
+ },
+ {
+ "label": "江山市",
+ "value": "330881"
+ }
+ ],
+ [{
+ "label": "定海区",
+ "value": "330902"
+ },
+ {
+ "label": "普陀区",
+ "value": "330903"
+ },
+ {
+ "label": "岱山县",
+ "value": "330921"
+ },
+ {
+ "label": "嵊泗县",
+ "value": "330922"
+ }
+ ],
+ [{
+ "label": "椒江区",
+ "value": "331002"
+ },
+ {
+ "label": "黄岩区",
+ "value": "331003"
+ },
+ {
+ "label": "路桥区",
+ "value": "331004"
+ },
+ {
+ "label": "三门县",
+ "value": "331022"
+ },
+ {
+ "label": "天台县",
+ "value": "331023"
+ },
+ {
+ "label": "仙居县",
+ "value": "331024"
+ },
+ {
+ "label": "温岭市",
+ "value": "331081"
+ },
+ {
+ "label": "临海市",
+ "value": "331082"
+ },
+ {
+ "label": "玉环市",
+ "value": "331083"
+ }
+ ],
+ [{
+ "label": "莲都区",
+ "value": "331102"
+ },
+ {
+ "label": "青田县",
+ "value": "331121"
+ },
+ {
+ "label": "缙云县",
+ "value": "331122"
+ },
+ {
+ "label": "遂昌县",
+ "value": "331123"
+ },
+ {
+ "label": "松阳县",
+ "value": "331124"
+ },
+ {
+ "label": "云和县",
+ "value": "331125"
+ },
+ {
+ "label": "庆元县",
+ "value": "331126"
+ },
+ {
+ "label": "景宁畲族自治县",
+ "value": "331127"
+ },
+ {
+ "label": "龙泉市",
+ "value": "331181"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "瑶海区",
+ "value": "340102"
+ },
+ {
+ "label": "庐阳区",
+ "value": "340103"
+ },
+ {
+ "label": "蜀山区",
+ "value": "340104"
+ },
+ {
+ "label": "包河区",
+ "value": "340111"
+ },
+ {
+ "label": "长丰县",
+ "value": "340121"
+ },
+ {
+ "label": "肥东县",
+ "value": "340122"
+ },
+ {
+ "label": "肥西县",
+ "value": "340123"
+ },
+ {
+ "label": "庐江县",
+ "value": "340124"
+ },
+ {
+ "label": "合肥高新技术产业开发区",
+ "value": "340171"
+ },
+ {
+ "label": "合肥经济技术开发区",
+ "value": "340172"
+ },
+ {
+ "label": "合肥新站高新技术产业开发区",
+ "value": "340173"
+ },
+ {
+ "label": "巢湖市",
+ "value": "340181"
+ }
+ ],
+ [{
+ "label": "镜湖区",
+ "value": "340202"
+ },
+ {
+ "label": "弋江区",
+ "value": "340203"
+ },
+ {
+ "label": "鸠江区",
+ "value": "340207"
+ },
+ {
+ "label": "三山区",
+ "value": "340208"
+ },
+ {
+ "label": "芜湖县",
+ "value": "340221"
+ },
+ {
+ "label": "繁昌县",
+ "value": "340222"
+ },
+ {
+ "label": "南陵县",
+ "value": "340223"
+ },
+ {
+ "label": "无为县",
+ "value": "340225"
+ },
+ {
+ "label": "芜湖经济技术开发区",
+ "value": "340271"
+ },
+ {
+ "label": "安徽芜湖长江大桥经济开发区",
+ "value": "340272"
+ }
+ ],
+ [{
+ "label": "龙子湖区",
+ "value": "340302"
+ },
+ {
+ "label": "蚌山区",
+ "value": "340303"
+ },
+ {
+ "label": "禹会区",
+ "value": "340304"
+ },
+ {
+ "label": "淮上区",
+ "value": "340311"
+ },
+ {
+ "label": "怀远县",
+ "value": "340321"
+ },
+ {
+ "label": "五河县",
+ "value": "340322"
+ },
+ {
+ "label": "固镇县",
+ "value": "340323"
+ },
+ {
+ "label": "蚌埠市高新技术开发区",
+ "value": "340371"
+ },
+ {
+ "label": "蚌埠市经济开发区",
+ "value": "340372"
+ }
+ ],
+ [{
+ "label": "大通区",
+ "value": "340402"
+ },
+ {
+ "label": "田家庵区",
+ "value": "340403"
+ },
+ {
+ "label": "谢家集区",
+ "value": "340404"
+ },
+ {
+ "label": "八公山区",
+ "value": "340405"
+ },
+ {
+ "label": "潘集区",
+ "value": "340406"
+ },
+ {
+ "label": "凤台县",
+ "value": "340421"
+ },
+ {
+ "label": "寿县",
+ "value": "340422"
+ }
+ ],
+ [{
+ "label": "花山区",
+ "value": "340503"
+ },
+ {
+ "label": "雨山区",
+ "value": "340504"
+ },
+ {
+ "label": "博望区",
+ "value": "340506"
+ },
+ {
+ "label": "当涂县",
+ "value": "340521"
+ },
+ {
+ "label": "含山县",
+ "value": "340522"
+ },
+ {
+ "label": "和县",
+ "value": "340523"
+ }
+ ],
+ [{
+ "label": "杜集区",
+ "value": "340602"
+ },
+ {
+ "label": "相山区",
+ "value": "340603"
+ },
+ {
+ "label": "烈山区",
+ "value": "340604"
+ },
+ {
+ "label": "濉溪县",
+ "value": "340621"
+ }
+ ],
+ [{
+ "label": "铜官区",
+ "value": "340705"
+ },
+ {
+ "label": "义安区",
+ "value": "340706"
+ },
+ {
+ "label": "郊区",
+ "value": "340711"
+ },
+ {
+ "label": "枞阳县",
+ "value": "340722"
+ }
+ ],
+ [{
+ "label": "迎江区",
+ "value": "340802"
+ },
+ {
+ "label": "大观区",
+ "value": "340803"
+ },
+ {
+ "label": "宜秀区",
+ "value": "340811"
+ },
+ {
+ "label": "怀宁县",
+ "value": "340822"
+ },
+ {
+ "label": "潜山县",
+ "value": "340824"
+ },
+ {
+ "label": "太湖县",
+ "value": "340825"
+ },
+ {
+ "label": "宿松县",
+ "value": "340826"
+ },
+ {
+ "label": "望江县",
+ "value": "340827"
+ },
+ {
+ "label": "岳西县",
+ "value": "340828"
+ },
+ {
+ "label": "安徽安庆经济开发区",
+ "value": "340871"
+ },
+ {
+ "label": "桐城市",
+ "value": "340881"
+ }
+ ],
+ [{
+ "label": "屯溪区",
+ "value": "341002"
+ },
+ {
+ "label": "黄山区",
+ "value": "341003"
+ },
+ {
+ "label": "徽州区",
+ "value": "341004"
+ },
+ {
+ "label": "歙县",
+ "value": "341021"
+ },
+ {
+ "label": "休宁县",
+ "value": "341022"
+ },
+ {
+ "label": "黟县",
+ "value": "341023"
+ },
+ {
+ "label": "祁门县",
+ "value": "341024"
+ }
+ ],
+ [{
+ "label": "琅琊区",
+ "value": "341102"
+ },
+ {
+ "label": "南谯区",
+ "value": "341103"
+ },
+ {
+ "label": "来安县",
+ "value": "341122"
+ },
+ {
+ "label": "全椒县",
+ "value": "341124"
+ },
+ {
+ "label": "定远县",
+ "value": "341125"
+ },
+ {
+ "label": "凤阳县",
+ "value": "341126"
+ },
+ {
+ "label": "苏滁现代产业园",
+ "value": "341171"
+ },
+ {
+ "label": "滁州经济技术开发区",
+ "value": "341172"
+ },
+ {
+ "label": "天长市",
+ "value": "341181"
+ },
+ {
+ "label": "明光市",
+ "value": "341182"
+ }
+ ],
+ [{
+ "label": "颍州区",
+ "value": "341202"
+ },
+ {
+ "label": "颍东区",
+ "value": "341203"
+ },
+ {
+ "label": "颍泉区",
+ "value": "341204"
+ },
+ {
+ "label": "临泉县",
+ "value": "341221"
+ },
+ {
+ "label": "太和县",
+ "value": "341222"
+ },
+ {
+ "label": "阜南县",
+ "value": "341225"
+ },
+ {
+ "label": "颍上县",
+ "value": "341226"
+ },
+ {
+ "label": "阜阳合肥现代产业园区",
+ "value": "341271"
+ },
+ {
+ "label": "阜阳经济技术开发区",
+ "value": "341272"
+ },
+ {
+ "label": "界首市",
+ "value": "341282"
+ }
+ ],
+ [{
+ "label": "埇桥区",
+ "value": "341302"
+ },
+ {
+ "label": "砀山县",
+ "value": "341321"
+ },
+ {
+ "label": "萧县",
+ "value": "341322"
+ },
+ {
+ "label": "灵璧县",
+ "value": "341323"
+ },
+ {
+ "label": "泗县",
+ "value": "341324"
+ },
+ {
+ "label": "宿州马鞍山现代产业园区",
+ "value": "341371"
+ },
+ {
+ "label": "宿州经济技术开发区",
+ "value": "341372"
+ }
+ ],
+ [{
+ "label": "金安区",
+ "value": "341502"
+ },
+ {
+ "label": "裕安区",
+ "value": "341503"
+ },
+ {
+ "label": "叶集区",
+ "value": "341504"
+ },
+ {
+ "label": "霍邱县",
+ "value": "341522"
+ },
+ {
+ "label": "舒城县",
+ "value": "341523"
+ },
+ {
+ "label": "金寨县",
+ "value": "341524"
+ },
+ {
+ "label": "霍山县",
+ "value": "341525"
+ }
+ ],
+ [{
+ "label": "谯城区",
+ "value": "341602"
+ },
+ {
+ "label": "涡阳县",
+ "value": "341621"
+ },
+ {
+ "label": "蒙城县",
+ "value": "341622"
+ },
+ {
+ "label": "利辛县",
+ "value": "341623"
+ }
+ ],
+ [{
+ "label": "贵池区",
+ "value": "341702"
+ },
+ {
+ "label": "东至县",
+ "value": "341721"
+ },
+ {
+ "label": "石台县",
+ "value": "341722"
+ },
+ {
+ "label": "青阳县",
+ "value": "341723"
+ }
+ ],
+ [{
+ "label": "宣州区",
+ "value": "341802"
+ },
+ {
+ "label": "郎溪县",
+ "value": "341821"
+ },
+ {
+ "label": "广德县",
+ "value": "341822"
+ },
+ {
+ "label": "泾县",
+ "value": "341823"
+ },
+ {
+ "label": "绩溪县",
+ "value": "341824"
+ },
+ {
+ "label": "旌德县",
+ "value": "341825"
+ },
+ {
+ "label": "宣城市经济开发区",
+ "value": "341871"
+ },
+ {
+ "label": "宁国市",
+ "value": "341881"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "鼓楼区",
+ "value": "350102"
+ },
+ {
+ "label": "台江区",
+ "value": "350103"
+ },
+ {
+ "label": "仓山区",
+ "value": "350104"
+ },
+ {
+ "label": "马尾区",
+ "value": "350105"
+ },
+ {
+ "label": "晋安区",
+ "value": "350111"
+ },
+ {
+ "label": "闽侯县",
+ "value": "350121"
+ },
+ {
+ "label": "连江县",
+ "value": "350122"
+ },
+ {
+ "label": "罗源县",
+ "value": "350123"
+ },
+ {
+ "label": "闽清县",
+ "value": "350124"
+ },
+ {
+ "label": "永泰县",
+ "value": "350125"
+ },
+ {
+ "label": "平潭县",
+ "value": "350128"
+ },
+ {
+ "label": "福清市",
+ "value": "350181"
+ },
+ {
+ "label": "长乐市",
+ "value": "350182"
+ }
+ ],
+ [{
+ "label": "思明区",
+ "value": "350203"
+ },
+ {
+ "label": "海沧区",
+ "value": "350205"
+ },
+ {
+ "label": "湖里区",
+ "value": "350206"
+ },
+ {
+ "label": "集美区",
+ "value": "350211"
+ },
+ {
+ "label": "同安区",
+ "value": "350212"
+ },
+ {
+ "label": "翔安区",
+ "value": "350213"
+ }
+ ],
+ [{
+ "label": "城厢区",
+ "value": "350302"
+ },
+ {
+ "label": "涵江区",
+ "value": "350303"
+ },
+ {
+ "label": "荔城区",
+ "value": "350304"
+ },
+ {
+ "label": "秀屿区",
+ "value": "350305"
+ },
+ {
+ "label": "仙游县",
+ "value": "350322"
+ }
+ ],
+ [{
+ "label": "梅列区",
+ "value": "350402"
+ },
+ {
+ "label": "三元区",
+ "value": "350403"
+ },
+ {
+ "label": "明溪县",
+ "value": "350421"
+ },
+ {
+ "label": "清流县",
+ "value": "350423"
+ },
+ {
+ "label": "宁化县",
+ "value": "350424"
+ },
+ {
+ "label": "大田县",
+ "value": "350425"
+ },
+ {
+ "label": "尤溪县",
+ "value": "350426"
+ },
+ {
+ "label": "沙县",
+ "value": "350427"
+ },
+ {
+ "label": "将乐县",
+ "value": "350428"
+ },
+ {
+ "label": "泰宁县",
+ "value": "350429"
+ },
+ {
+ "label": "建宁县",
+ "value": "350430"
+ },
+ {
+ "label": "永安市",
+ "value": "350481"
+ }
+ ],
+ [{
+ "label": "鲤城区",
+ "value": "350502"
+ },
+ {
+ "label": "丰泽区",
+ "value": "350503"
+ },
+ {
+ "label": "洛江区",
+ "value": "350504"
+ },
+ {
+ "label": "泉港区",
+ "value": "350505"
+ },
+ {
+ "label": "惠安县",
+ "value": "350521"
+ },
+ {
+ "label": "安溪县",
+ "value": "350524"
+ },
+ {
+ "label": "永春县",
+ "value": "350525"
+ },
+ {
+ "label": "德化县",
+ "value": "350526"
+ },
+ {
+ "label": "金门县",
+ "value": "350527"
+ },
+ {
+ "label": "石狮市",
+ "value": "350581"
+ },
+ {
+ "label": "晋江市",
+ "value": "350582"
+ },
+ {
+ "label": "南安市",
+ "value": "350583"
+ }
+ ],
+ [{
+ "label": "芗城区",
+ "value": "350602"
+ },
+ {
+ "label": "龙文区",
+ "value": "350603"
+ },
+ {
+ "label": "云霄县",
+ "value": "350622"
+ },
+ {
+ "label": "漳浦县",
+ "value": "350623"
+ },
+ {
+ "label": "诏安县",
+ "value": "350624"
+ },
+ {
+ "label": "长泰县",
+ "value": "350625"
+ },
+ {
+ "label": "东山县",
+ "value": "350626"
+ },
+ {
+ "label": "南靖县",
+ "value": "350627"
+ },
+ {
+ "label": "平和县",
+ "value": "350628"
+ },
+ {
+ "label": "华安县",
+ "value": "350629"
+ },
+ {
+ "label": "龙海市",
+ "value": "350681"
+ }
+ ],
+ [{
+ "label": "延平区",
+ "value": "350702"
+ },
+ {
+ "label": "建阳区",
+ "value": "350703"
+ },
+ {
+ "label": "顺昌县",
+ "value": "350721"
+ },
+ {
+ "label": "浦城县",
+ "value": "350722"
+ },
+ {
+ "label": "光泽县",
+ "value": "350723"
+ },
+ {
+ "label": "松溪县",
+ "value": "350724"
+ },
+ {
+ "label": "政和县",
+ "value": "350725"
+ },
+ {
+ "label": "邵武市",
+ "value": "350781"
+ },
+ {
+ "label": "武夷山市",
+ "value": "350782"
+ },
+ {
+ "label": "建瓯市",
+ "value": "350783"
+ }
+ ],
+ [{
+ "label": "新罗区",
+ "value": "350802"
+ },
+ {
+ "label": "永定区",
+ "value": "350803"
+ },
+ {
+ "label": "长汀县",
+ "value": "350821"
+ },
+ {
+ "label": "上杭县",
+ "value": "350823"
+ },
+ {
+ "label": "武平县",
+ "value": "350824"
+ },
+ {
+ "label": "连城县",
+ "value": "350825"
+ },
+ {
+ "label": "漳平市",
+ "value": "350881"
+ }
+ ],
+ [{
+ "label": "蕉城区",
+ "value": "350902"
+ },
+ {
+ "label": "霞浦县",
+ "value": "350921"
+ },
+ {
+ "label": "古田县",
+ "value": "350922"
+ },
+ {
+ "label": "屏南县",
+ "value": "350923"
+ },
+ {
+ "label": "寿宁县",
+ "value": "350924"
+ },
+ {
+ "label": "周宁县",
+ "value": "350925"
+ },
+ {
+ "label": "柘荣县",
+ "value": "350926"
+ },
+ {
+ "label": "福安市",
+ "value": "350981"
+ },
+ {
+ "label": "福鼎市",
+ "value": "350982"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "东湖区",
+ "value": "360102"
+ },
+ {
+ "label": "西湖区",
+ "value": "360103"
+ },
+ {
+ "label": "青云谱区",
+ "value": "360104"
+ },
+ {
+ "label": "湾里区",
+ "value": "360105"
+ },
+ {
+ "label": "青山湖区",
+ "value": "360111"
+ },
+ {
+ "label": "新建区",
+ "value": "360112"
+ },
+ {
+ "label": "南昌县",
+ "value": "360121"
+ },
+ {
+ "label": "安义县",
+ "value": "360123"
+ },
+ {
+ "label": "进贤县",
+ "value": "360124"
+ }
+ ],
+ [{
+ "label": "昌江区",
+ "value": "360202"
+ },
+ {
+ "label": "珠山区",
+ "value": "360203"
+ },
+ {
+ "label": "浮梁县",
+ "value": "360222"
+ },
+ {
+ "label": "乐平市",
+ "value": "360281"
+ }
+ ],
+ [{
+ "label": "安源区",
+ "value": "360302"
+ },
+ {
+ "label": "湘东区",
+ "value": "360313"
+ },
+ {
+ "label": "莲花县",
+ "value": "360321"
+ },
+ {
+ "label": "上栗县",
+ "value": "360322"
+ },
+ {
+ "label": "芦溪县",
+ "value": "360323"
+ }
+ ],
+ [{
+ "label": "濂溪区",
+ "value": "360402"
+ },
+ {
+ "label": "浔阳区",
+ "value": "360403"
+ },
+ {
+ "label": "柴桑区",
+ "value": "360404"
+ },
+ {
+ "label": "武宁县",
+ "value": "360423"
+ },
+ {
+ "label": "修水县",
+ "value": "360424"
+ },
+ {
+ "label": "永修县",
+ "value": "360425"
+ },
+ {
+ "label": "德安县",
+ "value": "360426"
+ },
+ {
+ "label": "都昌县",
+ "value": "360428"
+ },
+ {
+ "label": "湖口县",
+ "value": "360429"
+ },
+ {
+ "label": "彭泽县",
+ "value": "360430"
+ },
+ {
+ "label": "瑞昌市",
+ "value": "360481"
+ },
+ {
+ "label": "共青城市",
+ "value": "360482"
+ },
+ {
+ "label": "庐山市",
+ "value": "360483"
+ }
+ ],
+ [{
+ "label": "渝水区",
+ "value": "360502"
+ },
+ {
+ "label": "分宜县",
+ "value": "360521"
+ }
+ ],
+ [{
+ "label": "月湖区",
+ "value": "360602"
+ },
+ {
+ "label": "余江县",
+ "value": "360622"
+ },
+ {
+ "label": "贵溪市",
+ "value": "360681"
+ }
+ ],
+ [{
+ "label": "章贡区",
+ "value": "360702"
+ },
+ {
+ "label": "南康区",
+ "value": "360703"
+ },
+ {
+ "label": "赣县区",
+ "value": "360704"
+ },
+ {
+ "label": "信丰县",
+ "value": "360722"
+ },
+ {
+ "label": "大余县",
+ "value": "360723"
+ },
+ {
+ "label": "上犹县",
+ "value": "360724"
+ },
+ {
+ "label": "崇义县",
+ "value": "360725"
+ },
+ {
+ "label": "安远县",
+ "value": "360726"
+ },
+ {
+ "label": "龙南县",
+ "value": "360727"
+ },
+ {
+ "label": "定南县",
+ "value": "360728"
+ },
+ {
+ "label": "全南县",
+ "value": "360729"
+ },
+ {
+ "label": "宁都县",
+ "value": "360730"
+ },
+ {
+ "label": "于都县",
+ "value": "360731"
+ },
+ {
+ "label": "兴国县",
+ "value": "360732"
+ },
+ {
+ "label": "会昌县",
+ "value": "360733"
+ },
+ {
+ "label": "寻乌县",
+ "value": "360734"
+ },
+ {
+ "label": "石城县",
+ "value": "360735"
+ },
+ {
+ "label": "瑞金市",
+ "value": "360781"
+ }
+ ],
+ [{
+ "label": "吉州区",
+ "value": "360802"
+ },
+ {
+ "label": "青原区",
+ "value": "360803"
+ },
+ {
+ "label": "吉安县",
+ "value": "360821"
+ },
+ {
+ "label": "吉水县",
+ "value": "360822"
+ },
+ {
+ "label": "峡江县",
+ "value": "360823"
+ },
+ {
+ "label": "新干县",
+ "value": "360824"
+ },
+ {
+ "label": "永丰县",
+ "value": "360825"
+ },
+ {
+ "label": "泰和县",
+ "value": "360826"
+ },
+ {
+ "label": "遂川县",
+ "value": "360827"
+ },
+ {
+ "label": "万安县",
+ "value": "360828"
+ },
+ {
+ "label": "安福县",
+ "value": "360829"
+ },
+ {
+ "label": "永新县",
+ "value": "360830"
+ },
+ {
+ "label": "井冈山市",
+ "value": "360881"
+ }
+ ],
+ [{
+ "label": "袁州区",
+ "value": "360902"
+ },
+ {
+ "label": "奉新县",
+ "value": "360921"
+ },
+ {
+ "label": "万载县",
+ "value": "360922"
+ },
+ {
+ "label": "上高县",
+ "value": "360923"
+ },
+ {
+ "label": "宜丰县",
+ "value": "360924"
+ },
+ {
+ "label": "靖安县",
+ "value": "360925"
+ },
+ {
+ "label": "铜鼓县",
+ "value": "360926"
+ },
+ {
+ "label": "丰城市",
+ "value": "360981"
+ },
+ {
+ "label": "樟树市",
+ "value": "360982"
+ },
+ {
+ "label": "高安市",
+ "value": "360983"
+ }
+ ],
+ [{
+ "label": "临川区",
+ "value": "361002"
+ },
+ {
+ "label": "东乡区",
+ "value": "361003"
+ },
+ {
+ "label": "南城县",
+ "value": "361021"
+ },
+ {
+ "label": "黎川县",
+ "value": "361022"
+ },
+ {
+ "label": "南丰县",
+ "value": "361023"
+ },
+ {
+ "label": "崇仁县",
+ "value": "361024"
+ },
+ {
+ "label": "乐安县",
+ "value": "361025"
+ },
+ {
+ "label": "宜黄县",
+ "value": "361026"
+ },
+ {
+ "label": "金溪县",
+ "value": "361027"
+ },
+ {
+ "label": "资溪县",
+ "value": "361028"
+ },
+ {
+ "label": "广昌县",
+ "value": "361030"
+ }
+ ],
+ [{
+ "label": "信州区",
+ "value": "361102"
+ },
+ {
+ "label": "广丰区",
+ "value": "361103"
+ },
+ {
+ "label": "上饶县",
+ "value": "361121"
+ },
+ {
+ "label": "玉山县",
+ "value": "361123"
+ },
+ {
+ "label": "铅山县",
+ "value": "361124"
+ },
+ {
+ "label": "横峰县",
+ "value": "361125"
+ },
+ {
+ "label": "弋阳县",
+ "value": "361126"
+ },
+ {
+ "label": "余干县",
+ "value": "361127"
+ },
+ {
+ "label": "鄱阳县",
+ "value": "361128"
+ },
+ {
+ "label": "万年县",
+ "value": "361129"
+ },
+ {
+ "label": "婺源县",
+ "value": "361130"
+ },
+ {
+ "label": "德兴市",
+ "value": "361181"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "历下区",
+ "value": "370102"
+ },
+ {
+ "label": "市中区",
+ "value": "370103"
+ },
+ {
+ "label": "槐荫区",
+ "value": "370104"
+ },
+ {
+ "label": "天桥区",
+ "value": "370105"
+ },
+ {
+ "label": "历城区",
+ "value": "370112"
+ },
+ {
+ "label": "长清区",
+ "value": "370113"
+ },
+ {
+ "label": "章丘区",
+ "value": "370114"
+ },
+ {
+ "label": "平阴县",
+ "value": "370124"
+ },
+ {
+ "label": "济阳县",
+ "value": "370125"
+ },
+ {
+ "label": "商河县",
+ "value": "370126"
+ },
+ {
+ "label": "济南高新技术产业开发区",
+ "value": "370171"
+ }
+ ],
+ [{
+ "label": "市南区",
+ "value": "370202"
+ },
+ {
+ "label": "市北区",
+ "value": "370203"
+ },
+ {
+ "label": "黄岛区",
+ "value": "370211"
+ },
+ {
+ "label": "崂山区",
+ "value": "370212"
+ },
+ {
+ "label": "李沧区",
+ "value": "370213"
+ },
+ {
+ "label": "城阳区",
+ "value": "370214"
+ },
+ {
+ "label": "即墨区",
+ "value": "370215"
+ },
+ {
+ "label": "青岛高新技术产业开发区",
+ "value": "370271"
+ },
+ {
+ "label": "胶州市",
+ "value": "370281"
+ },
+ {
+ "label": "平度市",
+ "value": "370283"
+ },
+ {
+ "label": "莱西市",
+ "value": "370285"
+ }
+ ],
+ [{
+ "label": "淄川区",
+ "value": "370302"
+ },
+ {
+ "label": "张店区",
+ "value": "370303"
+ },
+ {
+ "label": "博山区",
+ "value": "370304"
+ },
+ {
+ "label": "临淄区",
+ "value": "370305"
+ },
+ {
+ "label": "周村区",
+ "value": "370306"
+ },
+ {
+ "label": "桓台县",
+ "value": "370321"
+ },
+ {
+ "label": "高青县",
+ "value": "370322"
+ },
+ {
+ "label": "沂源县",
+ "value": "370323"
+ }
+ ],
+ [{
+ "label": "市中区",
+ "value": "370402"
+ },
+ {
+ "label": "薛城区",
+ "value": "370403"
+ },
+ {
+ "label": "峄城区",
+ "value": "370404"
+ },
+ {
+ "label": "台儿庄区",
+ "value": "370405"
+ },
+ {
+ "label": "山亭区",
+ "value": "370406"
+ },
+ {
+ "label": "滕州市",
+ "value": "370481"
+ }
+ ],
+ [{
+ "label": "东营区",
+ "value": "370502"
+ },
+ {
+ "label": "河口区",
+ "value": "370503"
+ },
+ {
+ "label": "垦利区",
+ "value": "370505"
+ },
+ {
+ "label": "利津县",
+ "value": "370522"
+ },
+ {
+ "label": "广饶县",
+ "value": "370523"
+ },
+ {
+ "label": "东营经济技术开发区",
+ "value": "370571"
+ },
+ {
+ "label": "东营港经济开发区",
+ "value": "370572"
+ }
+ ],
+ [{
+ "label": "芝罘区",
+ "value": "370602"
+ },
+ {
+ "label": "福山区",
+ "value": "370611"
+ },
+ {
+ "label": "牟平区",
+ "value": "370612"
+ },
+ {
+ "label": "莱山区",
+ "value": "370613"
+ },
+ {
+ "label": "长岛县",
+ "value": "370634"
+ },
+ {
+ "label": "烟台高新技术产业开发区",
+ "value": "370671"
+ },
+ {
+ "label": "烟台经济技术开发区",
+ "value": "370672"
+ },
+ {
+ "label": "龙口市",
+ "value": "370681"
+ },
+ {
+ "label": "莱阳市",
+ "value": "370682"
+ },
+ {
+ "label": "莱州市",
+ "value": "370683"
+ },
+ {
+ "label": "蓬莱市",
+ "value": "370684"
+ },
+ {
+ "label": "招远市",
+ "value": "370685"
+ },
+ {
+ "label": "栖霞市",
+ "value": "370686"
+ },
+ {
+ "label": "海阳市",
+ "value": "370687"
+ }
+ ],
+ [{
+ "label": "潍城区",
+ "value": "370702"
+ },
+ {
+ "label": "寒亭区",
+ "value": "370703"
+ },
+ {
+ "label": "坊子区",
+ "value": "370704"
+ },
+ {
+ "label": "奎文区",
+ "value": "370705"
+ },
+ {
+ "label": "临朐县",
+ "value": "370724"
+ },
+ {
+ "label": "昌乐县",
+ "value": "370725"
+ },
+ {
+ "label": "潍坊滨海经济技术开发区",
+ "value": "370772"
+ },
+ {
+ "label": "青州市",
+ "value": "370781"
+ },
+ {
+ "label": "诸城市",
+ "value": "370782"
+ },
+ {
+ "label": "寿光市",
+ "value": "370783"
+ },
+ {
+ "label": "安丘市",
+ "value": "370784"
+ },
+ {
+ "label": "高密市",
+ "value": "370785"
+ },
+ {
+ "label": "昌邑市",
+ "value": "370786"
+ }
+ ],
+ [{
+ "label": "任城区",
+ "value": "370811"
+ },
+ {
+ "label": "兖州区",
+ "value": "370812"
+ },
+ {
+ "label": "微山县",
+ "value": "370826"
+ },
+ {
+ "label": "鱼台县",
+ "value": "370827"
+ },
+ {
+ "label": "金乡县",
+ "value": "370828"
+ },
+ {
+ "label": "嘉祥县",
+ "value": "370829"
+ },
+ {
+ "label": "汶上县",
+ "value": "370830"
+ },
+ {
+ "label": "泗水县",
+ "value": "370831"
+ },
+ {
+ "label": "梁山县",
+ "value": "370832"
+ },
+ {
+ "label": "济宁高新技术产业开发区",
+ "value": "370871"
+ },
+ {
+ "label": "曲阜市",
+ "value": "370881"
+ },
+ {
+ "label": "邹城市",
+ "value": "370883"
+ }
+ ],
+ [{
+ "label": "泰山区",
+ "value": "370902"
+ },
+ {
+ "label": "岱岳区",
+ "value": "370911"
+ },
+ {
+ "label": "宁阳县",
+ "value": "370921"
+ },
+ {
+ "label": "东平县",
+ "value": "370923"
+ },
+ {
+ "label": "新泰市",
+ "value": "370982"
+ },
+ {
+ "label": "肥城市",
+ "value": "370983"
+ }
+ ],
+ [{
+ "label": "环翠区",
+ "value": "371002"
+ },
+ {
+ "label": "文登区",
+ "value": "371003"
+ },
+ {
+ "label": "威海火炬高技术产业开发区",
+ "value": "371071"
+ },
+ {
+ "label": "威海经济技术开发区",
+ "value": "371072"
+ },
+ {
+ "label": "威海临港经济技术开发区",
+ "value": "371073"
+ },
+ {
+ "label": "荣成市",
+ "value": "371082"
+ },
+ {
+ "label": "乳山市",
+ "value": "371083"
+ }
+ ],
+ [{
+ "label": "东港区",
+ "value": "371102"
+ },
+ {
+ "label": "岚山区",
+ "value": "371103"
+ },
+ {
+ "label": "五莲县",
+ "value": "371121"
+ },
+ {
+ "label": "莒县",
+ "value": "371122"
+ },
+ {
+ "label": "日照经济技术开发区",
+ "value": "371171"
+ },
+ {
+ "label": "日照国际海洋城",
+ "value": "371172"
+ }
+ ],
+ [{
+ "label": "莱城区",
+ "value": "371202"
+ },
+ {
+ "label": "钢城区",
+ "value": "371203"
+ }
+ ],
+ [{
+ "label": "兰山区",
+ "value": "371302"
+ },
+ {
+ "label": "罗庄区",
+ "value": "371311"
+ },
+ {
+ "label": "河东区",
+ "value": "371312"
+ },
+ {
+ "label": "沂南县",
+ "value": "371321"
+ },
+ {
+ "label": "郯城县",
+ "value": "371322"
+ },
+ {
+ "label": "沂水县",
+ "value": "371323"
+ },
+ {
+ "label": "兰陵县",
+ "value": "371324"
+ },
+ {
+ "label": "费县",
+ "value": "371325"
+ },
+ {
+ "label": "平邑县",
+ "value": "371326"
+ },
+ {
+ "label": "莒南县",
+ "value": "371327"
+ },
+ {
+ "label": "蒙阴县",
+ "value": "371328"
+ },
+ {
+ "label": "临沭县",
+ "value": "371329"
+ },
+ {
+ "label": "临沂高新技术产业开发区",
+ "value": "371371"
+ },
+ {
+ "label": "临沂经济技术开发区",
+ "value": "371372"
+ },
+ {
+ "label": "临沂临港经济开发区",
+ "value": "371373"
+ }
+ ],
+ [{
+ "label": "德城区",
+ "value": "371402"
+ },
+ {
+ "label": "陵城区",
+ "value": "371403"
+ },
+ {
+ "label": "宁津县",
+ "value": "371422"
+ },
+ {
+ "label": "庆云县",
+ "value": "371423"
+ },
+ {
+ "label": "临邑县",
+ "value": "371424"
+ },
+ {
+ "label": "齐河县",
+ "value": "371425"
+ },
+ {
+ "label": "平原县",
+ "value": "371426"
+ },
+ {
+ "label": "夏津县",
+ "value": "371427"
+ },
+ {
+ "label": "武城县",
+ "value": "371428"
+ },
+ {
+ "label": "德州经济技术开发区",
+ "value": "371471"
+ },
+ {
+ "label": "德州运河经济开发区",
+ "value": "371472"
+ },
+ {
+ "label": "乐陵市",
+ "value": "371481"
+ },
+ {
+ "label": "禹城市",
+ "value": "371482"
+ }
+ ],
+ [{
+ "label": "东昌府区",
+ "value": "371502"
+ },
+ {
+ "label": "阳谷县",
+ "value": "371521"
+ },
+ {
+ "label": "莘县",
+ "value": "371522"
+ },
+ {
+ "label": "茌平县",
+ "value": "371523"
+ },
+ {
+ "label": "东阿县",
+ "value": "371524"
+ },
+ {
+ "label": "冠县",
+ "value": "371525"
+ },
+ {
+ "label": "高唐县",
+ "value": "371526"
+ },
+ {
+ "label": "临清市",
+ "value": "371581"
+ }
+ ],
+ [{
+ "label": "滨城区",
+ "value": "371602"
+ },
+ {
+ "label": "沾化区",
+ "value": "371603"
+ },
+ {
+ "label": "惠民县",
+ "value": "371621"
+ },
+ {
+ "label": "阳信县",
+ "value": "371622"
+ },
+ {
+ "label": "无棣县",
+ "value": "371623"
+ },
+ {
+ "label": "博兴县",
+ "value": "371625"
+ },
+ {
+ "label": "邹平县",
+ "value": "371626"
+ }
+ ],
+ [{
+ "label": "牡丹区",
+ "value": "371702"
+ },
+ {
+ "label": "定陶区",
+ "value": "371703"
+ },
+ {
+ "label": "曹县",
+ "value": "371721"
+ },
+ {
+ "label": "单县",
+ "value": "371722"
+ },
+ {
+ "label": "成武县",
+ "value": "371723"
+ },
+ {
+ "label": "巨野县",
+ "value": "371724"
+ },
+ {
+ "label": "郓城县",
+ "value": "371725"
+ },
+ {
+ "label": "鄄城县",
+ "value": "371726"
+ },
+ {
+ "label": "东明县",
+ "value": "371728"
+ },
+ {
+ "label": "菏泽经济技术开发区",
+ "value": "371771"
+ },
+ {
+ "label": "菏泽高新技术开发区",
+ "value": "371772"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "中原区",
+ "value": "410102"
+ },
+ {
+ "label": "二七区",
+ "value": "410103"
+ },
+ {
+ "label": "管城回族区",
+ "value": "410104"
+ },
+ {
+ "label": "金水区",
+ "value": "410105"
+ },
+ {
+ "label": "上街区",
+ "value": "410106"
+ },
+ {
+ "label": "惠济区",
+ "value": "410108"
+ },
+ {
+ "label": "中牟县",
+ "value": "410122"
+ },
+ {
+ "label": "郑州经济技术开发区",
+ "value": "410171"
+ },
+ {
+ "label": "郑州高新技术产业开发区",
+ "value": "410172"
+ },
+ {
+ "label": "郑州航空港经济综合实验区",
+ "value": "410173"
+ },
+ {
+ "label": "巩义市",
+ "value": "410181"
+ },
+ {
+ "label": "荥阳市",
+ "value": "410182"
+ },
+ {
+ "label": "新密市",
+ "value": "410183"
+ },
+ {
+ "label": "新郑市",
+ "value": "410184"
+ },
+ {
+ "label": "登封市",
+ "value": "410185"
+ }
+ ],
+ [{
+ "label": "龙亭区",
+ "value": "410202"
+ },
+ {
+ "label": "顺河回族区",
+ "value": "410203"
+ },
+ {
+ "label": "鼓楼区",
+ "value": "410204"
+ },
+ {
+ "label": "禹王台区",
+ "value": "410205"
+ },
+ {
+ "label": "祥符区",
+ "value": "410212"
+ },
+ {
+ "label": "杞县",
+ "value": "410221"
+ },
+ {
+ "label": "通许县",
+ "value": "410222"
+ },
+ {
+ "label": "尉氏县",
+ "value": "410223"
+ },
+ {
+ "label": "兰考县",
+ "value": "410225"
+ }
+ ],
+ [{
+ "label": "老城区",
+ "value": "410302"
+ },
+ {
+ "label": "西工区",
+ "value": "410303"
+ },
+ {
+ "label": "瀍河回族区",
+ "value": "410304"
+ },
+ {
+ "label": "涧西区",
+ "value": "410305"
+ },
+ {
+ "label": "吉利区",
+ "value": "410306"
+ },
+ {
+ "label": "洛龙区",
+ "value": "410311"
+ },
+ {
+ "label": "孟津县",
+ "value": "410322"
+ },
+ {
+ "label": "新安县",
+ "value": "410323"
+ },
+ {
+ "label": "栾川县",
+ "value": "410324"
+ },
+ {
+ "label": "嵩县",
+ "value": "410325"
+ },
+ {
+ "label": "汝阳县",
+ "value": "410326"
+ },
+ {
+ "label": "宜阳县",
+ "value": "410327"
+ },
+ {
+ "label": "洛宁县",
+ "value": "410328"
+ },
+ {
+ "label": "伊川县",
+ "value": "410329"
+ },
+ {
+ "label": "洛阳高新技术产业开发区",
+ "value": "410371"
+ },
+ {
+ "label": "偃师市",
+ "value": "410381"
+ }
+ ],
+ [{
+ "label": "新华区",
+ "value": "410402"
+ },
+ {
+ "label": "卫东区",
+ "value": "410403"
+ },
+ {
+ "label": "石龙区",
+ "value": "410404"
+ },
+ {
+ "label": "湛河区",
+ "value": "410411"
+ },
+ {
+ "label": "宝丰县",
+ "value": "410421"
+ },
+ {
+ "label": "叶县",
+ "value": "410422"
+ },
+ {
+ "label": "鲁山县",
+ "value": "410423"
+ },
+ {
+ "label": "郏县",
+ "value": "410425"
+ },
+ {
+ "label": "平顶山高新技术产业开发区",
+ "value": "410471"
+ },
+ {
+ "label": "平顶山市新城区",
+ "value": "410472"
+ },
+ {
+ "label": "舞钢市",
+ "value": "410481"
+ },
+ {
+ "label": "汝州市",
+ "value": "410482"
+ }
+ ],
+ [{
+ "label": "文峰区",
+ "value": "410502"
+ },
+ {
+ "label": "北关区",
+ "value": "410503"
+ },
+ {
+ "label": "殷都区",
+ "value": "410505"
+ },
+ {
+ "label": "龙安区",
+ "value": "410506"
+ },
+ {
+ "label": "安阳县",
+ "value": "410522"
+ },
+ {
+ "label": "汤阴县",
+ "value": "410523"
+ },
+ {
+ "label": "滑县",
+ "value": "410526"
+ },
+ {
+ "label": "内黄县",
+ "value": "410527"
+ },
+ {
+ "label": "安阳高新技术产业开发区",
+ "value": "410571"
+ },
+ {
+ "label": "林州市",
+ "value": "410581"
+ }
+ ],
+ [{
+ "label": "鹤山区",
+ "value": "410602"
+ },
+ {
+ "label": "山城区",
+ "value": "410603"
+ },
+ {
+ "label": "淇滨区",
+ "value": "410611"
+ },
+ {
+ "label": "浚县",
+ "value": "410621"
+ },
+ {
+ "label": "淇县",
+ "value": "410622"
+ },
+ {
+ "label": "鹤壁经济技术开发区",
+ "value": "410671"
+ }
+ ],
+ [{
+ "label": "红旗区",
+ "value": "410702"
+ },
+ {
+ "label": "卫滨区",
+ "value": "410703"
+ },
+ {
+ "label": "凤泉区",
+ "value": "410704"
+ },
+ {
+ "label": "牧野区",
+ "value": "410711"
+ },
+ {
+ "label": "新乡县",
+ "value": "410721"
+ },
+ {
+ "label": "获嘉县",
+ "value": "410724"
+ },
+ {
+ "label": "原阳县",
+ "value": "410725"
+ },
+ {
+ "label": "延津县",
+ "value": "410726"
+ },
+ {
+ "label": "封丘县",
+ "value": "410727"
+ },
+ {
+ "label": "长垣县",
+ "value": "410728"
+ },
+ {
+ "label": "新乡高新技术产业开发区",
+ "value": "410771"
+ },
+ {
+ "label": "新乡经济技术开发区",
+ "value": "410772"
+ },
+ {
+ "label": "新乡市平原城乡一体化示范区",
+ "value": "410773"
+ },
+ {
+ "label": "卫辉市",
+ "value": "410781"
+ },
+ {
+ "label": "辉县市",
+ "value": "410782"
+ }
+ ],
+ [{
+ "label": "解放区",
+ "value": "410802"
+ },
+ {
+ "label": "中站区",
+ "value": "410803"
+ },
+ {
+ "label": "马村区",
+ "value": "410804"
+ },
+ {
+ "label": "山阳区",
+ "value": "410811"
+ },
+ {
+ "label": "修武县",
+ "value": "410821"
+ },
+ {
+ "label": "博爱县",
+ "value": "410822"
+ },
+ {
+ "label": "武陟县",
+ "value": "410823"
+ },
+ {
+ "label": "温县",
+ "value": "410825"
+ },
+ {
+ "label": "焦作城乡一体化示范区",
+ "value": "410871"
+ },
+ {
+ "label": "沁阳市",
+ "value": "410882"
+ },
+ {
+ "label": "孟州市",
+ "value": "410883"
+ }
+ ],
+ [{
+ "label": "华龙区",
+ "value": "410902"
+ },
+ {
+ "label": "清丰县",
+ "value": "410922"
+ },
+ {
+ "label": "南乐县",
+ "value": "410923"
+ },
+ {
+ "label": "范县",
+ "value": "410926"
+ },
+ {
+ "label": "台前县",
+ "value": "410927"
+ },
+ {
+ "label": "濮阳县",
+ "value": "410928"
+ },
+ {
+ "label": "河南濮阳工业园区",
+ "value": "410971"
+ },
+ {
+ "label": "濮阳经济技术开发区",
+ "value": "410972"
+ }
+ ],
+ [{
+ "label": "魏都区",
+ "value": "411002"
+ },
+ {
+ "label": "建安区",
+ "value": "411003"
+ },
+ {
+ "label": "鄢陵县",
+ "value": "411024"
+ },
+ {
+ "label": "襄城县",
+ "value": "411025"
+ },
+ {
+ "label": "许昌经济技术开发区",
+ "value": "411071"
+ },
+ {
+ "label": "禹州市",
+ "value": "411081"
+ },
+ {
+ "label": "长葛市",
+ "value": "411082"
+ }
+ ],
+ [{
+ "label": "源汇区",
+ "value": "411102"
+ },
+ {
+ "label": "郾城区",
+ "value": "411103"
+ },
+ {
+ "label": "召陵区",
+ "value": "411104"
+ },
+ {
+ "label": "舞阳县",
+ "value": "411121"
+ },
+ {
+ "label": "临颍县",
+ "value": "411122"
+ },
+ {
+ "label": "漯河经济技术开发区",
+ "value": "411171"
+ }
+ ],
+ [{
+ "label": "湖滨区",
+ "value": "411202"
+ },
+ {
+ "label": "陕州区",
+ "value": "411203"
+ },
+ {
+ "label": "渑池县",
+ "value": "411221"
+ },
+ {
+ "label": "卢氏县",
+ "value": "411224"
+ },
+ {
+ "label": "河南三门峡经济开发区",
+ "value": "411271"
+ },
+ {
+ "label": "义马市",
+ "value": "411281"
+ },
+ {
+ "label": "灵宝市",
+ "value": "411282"
+ }
+ ],
+ [{
+ "label": "宛城区",
+ "value": "411302"
+ },
+ {
+ "label": "卧龙区",
+ "value": "411303"
+ },
+ {
+ "label": "南召县",
+ "value": "411321"
+ },
+ {
+ "label": "方城县",
+ "value": "411322"
+ },
+ {
+ "label": "西峡县",
+ "value": "411323"
+ },
+ {
+ "label": "镇平县",
+ "value": "411324"
+ },
+ {
+ "label": "内乡县",
+ "value": "411325"
+ },
+ {
+ "label": "淅川县",
+ "value": "411326"
+ },
+ {
+ "label": "社旗县",
+ "value": "411327"
+ },
+ {
+ "label": "唐河县",
+ "value": "411328"
+ },
+ {
+ "label": "新野县",
+ "value": "411329"
+ },
+ {
+ "label": "桐柏县",
+ "value": "411330"
+ },
+ {
+ "label": "南阳高新技术产业开发区",
+ "value": "411371"
+ },
+ {
+ "label": "南阳市城乡一体化示范区",
+ "value": "411372"
+ },
+ {
+ "label": "邓州市",
+ "value": "411381"
+ }
+ ],
+ [{
+ "label": "梁园区",
+ "value": "411402"
+ },
+ {
+ "label": "睢阳区",
+ "value": "411403"
+ },
+ {
+ "label": "民权县",
+ "value": "411421"
+ },
+ {
+ "label": "睢县",
+ "value": "411422"
+ },
+ {
+ "label": "宁陵县",
+ "value": "411423"
+ },
+ {
+ "label": "柘城县",
+ "value": "411424"
+ },
+ {
+ "label": "虞城县",
+ "value": "411425"
+ },
+ {
+ "label": "夏邑县",
+ "value": "411426"
+ },
+ {
+ "label": "豫东综合物流产业聚集区",
+ "value": "411471"
+ },
+ {
+ "label": "河南商丘经济开发区",
+ "value": "411472"
+ },
+ {
+ "label": "永城市",
+ "value": "411481"
+ }
+ ],
+ [{
+ "label": "浉河区",
+ "value": "411502"
+ },
+ {
+ "label": "平桥区",
+ "value": "411503"
+ },
+ {
+ "label": "罗山县",
+ "value": "411521"
+ },
+ {
+ "label": "光山县",
+ "value": "411522"
+ },
+ {
+ "label": "新县",
+ "value": "411523"
+ },
+ {
+ "label": "商城县",
+ "value": "411524"
+ },
+ {
+ "label": "固始县",
+ "value": "411525"
+ },
+ {
+ "label": "潢川县",
+ "value": "411526"
+ },
+ {
+ "label": "淮滨县",
+ "value": "411527"
+ },
+ {
+ "label": "息县",
+ "value": "411528"
+ },
+ {
+ "label": "信阳高新技术产业开发区",
+ "value": "411571"
+ }
+ ],
+ [{
+ "label": "川汇区",
+ "value": "411602"
+ },
+ {
+ "label": "扶沟县",
+ "value": "411621"
+ },
+ {
+ "label": "西华县",
+ "value": "411622"
+ },
+ {
+ "label": "商水县",
+ "value": "411623"
+ },
+ {
+ "label": "沈丘县",
+ "value": "411624"
+ },
+ {
+ "label": "郸城县",
+ "value": "411625"
+ },
+ {
+ "label": "淮阳县",
+ "value": "411626"
+ },
+ {
+ "label": "太康县",
+ "value": "411627"
+ },
+ {
+ "label": "鹿邑县",
+ "value": "411628"
+ },
+ {
+ "label": "河南周口经济开发区",
+ "value": "411671"
+ },
+ {
+ "label": "项城市",
+ "value": "411681"
+ }
+ ],
+ [{
+ "label": "驿城区",
+ "value": "411702"
+ },
+ {
+ "label": "西平县",
+ "value": "411721"
+ },
+ {
+ "label": "上蔡县",
+ "value": "411722"
+ },
+ {
+ "label": "平舆县",
+ "value": "411723"
+ },
+ {
+ "label": "正阳县",
+ "value": "411724"
+ },
+ {
+ "label": "确山县",
+ "value": "411725"
+ },
+ {
+ "label": "泌阳县",
+ "value": "411726"
+ },
+ {
+ "label": "汝南县",
+ "value": "411727"
+ },
+ {
+ "label": "遂平县",
+ "value": "411728"
+ },
+ {
+ "label": "新蔡县",
+ "value": "411729"
+ },
+ {
+ "label": "河南驻马店经济开发区",
+ "value": "411771"
+ }
+ ],
+ [{
+ "label": "济源市",
+ "value": "419001"
+ }]
+ ],
+ [
+ [{
+ "label": "江岸区",
+ "value": "420102"
+ },
+ {
+ "label": "江汉区",
+ "value": "420103"
+ },
+ {
+ "label": "硚口区",
+ "value": "420104"
+ },
+ {
+ "label": "汉阳区",
+ "value": "420105"
+ },
+ {
+ "label": "武昌区",
+ "value": "420106"
+ },
+ {
+ "label": "青山区",
+ "value": "420107"
+ },
+ {
+ "label": "洪山区",
+ "value": "420111"
+ },
+ {
+ "label": "东西湖区",
+ "value": "420112"
+ },
+ {
+ "label": "汉南区",
+ "value": "420113"
+ },
+ {
+ "label": "蔡甸区",
+ "value": "420114"
+ },
+ {
+ "label": "江夏区",
+ "value": "420115"
+ },
+ {
+ "label": "黄陂区",
+ "value": "420116"
+ },
+ {
+ "label": "新洲区",
+ "value": "420117"
+ }
+ ],
+ [{
+ "label": "黄石港区",
+ "value": "420202"
+ },
+ {
+ "label": "西塞山区",
+ "value": "420203"
+ },
+ {
+ "label": "下陆区",
+ "value": "420204"
+ },
+ {
+ "label": "铁山区",
+ "value": "420205"
+ },
+ {
+ "label": "阳新县",
+ "value": "420222"
+ },
+ {
+ "label": "大冶市",
+ "value": "420281"
+ }
+ ],
+ [{
+ "label": "茅箭区",
+ "value": "420302"
+ },
+ {
+ "label": "张湾区",
+ "value": "420303"
+ },
+ {
+ "label": "郧阳区",
+ "value": "420304"
+ },
+ {
+ "label": "郧西县",
+ "value": "420322"
+ },
+ {
+ "label": "竹山县",
+ "value": "420323"
+ },
+ {
+ "label": "竹溪县",
+ "value": "420324"
+ },
+ {
+ "label": "房县",
+ "value": "420325"
+ },
+ {
+ "label": "丹江口市",
+ "value": "420381"
+ }
+ ],
+ [{
+ "label": "西陵区",
+ "value": "420502"
+ },
+ {
+ "label": "伍家岗区",
+ "value": "420503"
+ },
+ {
+ "label": "点军区",
+ "value": "420504"
+ },
+ {
+ "label": "猇亭区",
+ "value": "420505"
+ },
+ {
+ "label": "夷陵区",
+ "value": "420506"
+ },
+ {
+ "label": "远安县",
+ "value": "420525"
+ },
+ {
+ "label": "兴山县",
+ "value": "420526"
+ },
+ {
+ "label": "秭归县",
+ "value": "420527"
+ },
+ {
+ "label": "长阳土家族自治县",
+ "value": "420528"
+ },
+ {
+ "label": "五峰土家族自治县",
+ "value": "420529"
+ },
+ {
+ "label": "宜都市",
+ "value": "420581"
+ },
+ {
+ "label": "当阳市",
+ "value": "420582"
+ },
+ {
+ "label": "枝江市",
+ "value": "420583"
+ }
+ ],
+ [{
+ "label": "襄城区",
+ "value": "420602"
+ },
+ {
+ "label": "樊城区",
+ "value": "420606"
+ },
+ {
+ "label": "襄州区",
+ "value": "420607"
+ },
+ {
+ "label": "南漳县",
+ "value": "420624"
+ },
+ {
+ "label": "谷城县",
+ "value": "420625"
+ },
+ {
+ "label": "保康县",
+ "value": "420626"
+ },
+ {
+ "label": "老河口市",
+ "value": "420682"
+ },
+ {
+ "label": "枣阳市",
+ "value": "420683"
+ },
+ {
+ "label": "宜城市",
+ "value": "420684"
+ }
+ ],
+ [{
+ "label": "梁子湖区",
+ "value": "420702"
+ },
+ {
+ "label": "华容区",
+ "value": "420703"
+ },
+ {
+ "label": "鄂城区",
+ "value": "420704"
+ }
+ ],
+ [{
+ "label": "东宝区",
+ "value": "420802"
+ },
+ {
+ "label": "掇刀区",
+ "value": "420804"
+ },
+ {
+ "label": "京山县",
+ "value": "420821"
+ },
+ {
+ "label": "沙洋县",
+ "value": "420822"
+ },
+ {
+ "label": "钟祥市",
+ "value": "420881"
+ }
+ ],
+ [{
+ "label": "孝南区",
+ "value": "420902"
+ },
+ {
+ "label": "孝昌县",
+ "value": "420921"
+ },
+ {
+ "label": "大悟县",
+ "value": "420922"
+ },
+ {
+ "label": "云梦县",
+ "value": "420923"
+ },
+ {
+ "label": "应城市",
+ "value": "420981"
+ },
+ {
+ "label": "安陆市",
+ "value": "420982"
+ },
+ {
+ "label": "汉川市",
+ "value": "420984"
+ }
+ ],
+ [{
+ "label": "沙市区",
+ "value": "421002"
+ },
+ {
+ "label": "荆州区",
+ "value": "421003"
+ },
+ {
+ "label": "公安县",
+ "value": "421022"
+ },
+ {
+ "label": "监利县",
+ "value": "421023"
+ },
+ {
+ "label": "江陵县",
+ "value": "421024"
+ },
+ {
+ "label": "荆州经济技术开发区",
+ "value": "421071"
+ },
+ {
+ "label": "石首市",
+ "value": "421081"
+ },
+ {
+ "label": "洪湖市",
+ "value": "421083"
+ },
+ {
+ "label": "松滋市",
+ "value": "421087"
+ }
+ ],
+ [{
+ "label": "黄州区",
+ "value": "421102"
+ },
+ {
+ "label": "团风县",
+ "value": "421121"
+ },
+ {
+ "label": "红安县",
+ "value": "421122"
+ },
+ {
+ "label": "罗田县",
+ "value": "421123"
+ },
+ {
+ "label": "英山县",
+ "value": "421124"
+ },
+ {
+ "label": "浠水县",
+ "value": "421125"
+ },
+ {
+ "label": "蕲春县",
+ "value": "421126"
+ },
+ {
+ "label": "黄梅县",
+ "value": "421127"
+ },
+ {
+ "label": "龙感湖管理区",
+ "value": "421171"
+ },
+ {
+ "label": "麻城市",
+ "value": "421181"
+ },
+ {
+ "label": "武穴市",
+ "value": "421182"
+ }
+ ],
+ [{
+ "label": "咸安区",
+ "value": "421202"
+ },
+ {
+ "label": "嘉鱼县",
+ "value": "421221"
+ },
+ {
+ "label": "通城县",
+ "value": "421222"
+ },
+ {
+ "label": "崇阳县",
+ "value": "421223"
+ },
+ {
+ "label": "通山县",
+ "value": "421224"
+ },
+ {
+ "label": "赤壁市",
+ "value": "421281"
+ }
+ ],
+ [{
+ "label": "曾都区",
+ "value": "421303"
+ },
+ {
+ "label": "随县",
+ "value": "421321"
+ },
+ {
+ "label": "广水市",
+ "value": "421381"
+ }
+ ],
+ [{
+ "label": "恩施市",
+ "value": "422801"
+ },
+ {
+ "label": "利川市",
+ "value": "422802"
+ },
+ {
+ "label": "建始县",
+ "value": "422822"
+ },
+ {
+ "label": "巴东县",
+ "value": "422823"
+ },
+ {
+ "label": "宣恩县",
+ "value": "422825"
+ },
+ {
+ "label": "咸丰县",
+ "value": "422826"
+ },
+ {
+ "label": "来凤县",
+ "value": "422827"
+ },
+ {
+ "label": "鹤峰县",
+ "value": "422828"
+ }
+ ],
+ [{
+ "label": "仙桃市",
+ "value": "429004"
+ },
+ {
+ "label": "潜江市",
+ "value": "429005"
+ },
+ {
+ "label": "天门市",
+ "value": "429006"
+ },
+ {
+ "label": "神农架林区",
+ "value": "429021"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "芙蓉区",
+ "value": "430102"
+ },
+ {
+ "label": "天心区",
+ "value": "430103"
+ },
+ {
+ "label": "岳麓区",
+ "value": "430104"
+ },
+ {
+ "label": "开福区",
+ "value": "430105"
+ },
+ {
+ "label": "雨花区",
+ "value": "430111"
+ },
+ {
+ "label": "望城区",
+ "value": "430112"
+ },
+ {
+ "label": "长沙县",
+ "value": "430121"
+ },
+ {
+ "label": "浏阳市",
+ "value": "430181"
+ },
+ {
+ "label": "宁乡市",
+ "value": "430182"
+ }
+ ],
+ [{
+ "label": "荷塘区",
+ "value": "430202"
+ },
+ {
+ "label": "芦淞区",
+ "value": "430203"
+ },
+ {
+ "label": "石峰区",
+ "value": "430204"
+ },
+ {
+ "label": "天元区",
+ "value": "430211"
+ },
+ {
+ "label": "株洲县",
+ "value": "430221"
+ },
+ {
+ "label": "攸县",
+ "value": "430223"
+ },
+ {
+ "label": "茶陵县",
+ "value": "430224"
+ },
+ {
+ "label": "炎陵县",
+ "value": "430225"
+ },
+ {
+ "label": "云龙示范区",
+ "value": "430271"
+ },
+ {
+ "label": "醴陵市",
+ "value": "430281"
+ }
+ ],
+ [{
+ "label": "雨湖区",
+ "value": "430302"
+ },
+ {
+ "label": "岳塘区",
+ "value": "430304"
+ },
+ {
+ "label": "湘潭县",
+ "value": "430321"
+ },
+ {
+ "label": "湖南湘潭高新技术产业园区",
+ "value": "430371"
+ },
+ {
+ "label": "湘潭昭山示范区",
+ "value": "430372"
+ },
+ {
+ "label": "湘潭九华示范区",
+ "value": "430373"
+ },
+ {
+ "label": "湘乡市",
+ "value": "430381"
+ },
+ {
+ "label": "韶山市",
+ "value": "430382"
+ }
+ ],
+ [{
+ "label": "珠晖区",
+ "value": "430405"
+ },
+ {
+ "label": "雁峰区",
+ "value": "430406"
+ },
+ {
+ "label": "石鼓区",
+ "value": "430407"
+ },
+ {
+ "label": "蒸湘区",
+ "value": "430408"
+ },
+ {
+ "label": "南岳区",
+ "value": "430412"
+ },
+ {
+ "label": "衡阳县",
+ "value": "430421"
+ },
+ {
+ "label": "衡南县",
+ "value": "430422"
+ },
+ {
+ "label": "衡山县",
+ "value": "430423"
+ },
+ {
+ "label": "衡东县",
+ "value": "430424"
+ },
+ {
+ "label": "祁东县",
+ "value": "430426"
+ },
+ {
+ "label": "衡阳综合保税区",
+ "value": "430471"
+ },
+ {
+ "label": "湖南衡阳高新技术产业园区",
+ "value": "430472"
+ },
+ {
+ "label": "湖南衡阳松木经济开发区",
+ "value": "430473"
+ },
+ {
+ "label": "耒阳市",
+ "value": "430481"
+ },
+ {
+ "label": "常宁市",
+ "value": "430482"
+ }
+ ],
+ [{
+ "label": "双清区",
+ "value": "430502"
+ },
+ {
+ "label": "大祥区",
+ "value": "430503"
+ },
+ {
+ "label": "北塔区",
+ "value": "430511"
+ },
+ {
+ "label": "邵东县",
+ "value": "430521"
+ },
+ {
+ "label": "新邵县",
+ "value": "430522"
+ },
+ {
+ "label": "邵阳县",
+ "value": "430523"
+ },
+ {
+ "label": "隆回县",
+ "value": "430524"
+ },
+ {
+ "label": "洞口县",
+ "value": "430525"
+ },
+ {
+ "label": "绥宁县",
+ "value": "430527"
+ },
+ {
+ "label": "新宁县",
+ "value": "430528"
+ },
+ {
+ "label": "城步苗族自治县",
+ "value": "430529"
+ },
+ {
+ "label": "武冈市",
+ "value": "430581"
+ }
+ ],
+ [{
+ "label": "岳阳楼区",
+ "value": "430602"
+ },
+ {
+ "label": "云溪区",
+ "value": "430603"
+ },
+ {
+ "label": "君山区",
+ "value": "430611"
+ },
+ {
+ "label": "岳阳县",
+ "value": "430621"
+ },
+ {
+ "label": "华容县",
+ "value": "430623"
+ },
+ {
+ "label": "湘阴县",
+ "value": "430624"
+ },
+ {
+ "label": "平江县",
+ "value": "430626"
+ },
+ {
+ "label": "岳阳市屈原管理区",
+ "value": "430671"
+ },
+ {
+ "label": "汨罗市",
+ "value": "430681"
+ },
+ {
+ "label": "临湘市",
+ "value": "430682"
+ }
+ ],
+ [{
+ "label": "武陵区",
+ "value": "430702"
+ },
+ {
+ "label": "鼎城区",
+ "value": "430703"
+ },
+ {
+ "label": "安乡县",
+ "value": "430721"
+ },
+ {
+ "label": "汉寿县",
+ "value": "430722"
+ },
+ {
+ "label": "澧县",
+ "value": "430723"
+ },
+ {
+ "label": "临澧县",
+ "value": "430724"
+ },
+ {
+ "label": "桃源县",
+ "value": "430725"
+ },
+ {
+ "label": "石门县",
+ "value": "430726"
+ },
+ {
+ "label": "常德市西洞庭管理区",
+ "value": "430771"
+ },
+ {
+ "label": "津市市",
+ "value": "430781"
+ }
+ ],
+ [{
+ "label": "永定区",
+ "value": "430802"
+ },
+ {
+ "label": "武陵源区",
+ "value": "430811"
+ },
+ {
+ "label": "慈利县",
+ "value": "430821"
+ },
+ {
+ "label": "桑植县",
+ "value": "430822"
+ }
+ ],
+ [{
+ "label": "资阳区",
+ "value": "430902"
+ },
+ {
+ "label": "赫山区",
+ "value": "430903"
+ },
+ {
+ "label": "南县",
+ "value": "430921"
+ },
+ {
+ "label": "桃江县",
+ "value": "430922"
+ },
+ {
+ "label": "安化县",
+ "value": "430923"
+ },
+ {
+ "label": "益阳市大通湖管理区",
+ "value": "430971"
+ },
+ {
+ "label": "湖南益阳高新技术产业园区",
+ "value": "430972"
+ },
+ {
+ "label": "沅江市",
+ "value": "430981"
+ }
+ ],
+ [{
+ "label": "北湖区",
+ "value": "431002"
+ },
+ {
+ "label": "苏仙区",
+ "value": "431003"
+ },
+ {
+ "label": "桂阳县",
+ "value": "431021"
+ },
+ {
+ "label": "宜章县",
+ "value": "431022"
+ },
+ {
+ "label": "永兴县",
+ "value": "431023"
+ },
+ {
+ "label": "嘉禾县",
+ "value": "431024"
+ },
+ {
+ "label": "临武县",
+ "value": "431025"
+ },
+ {
+ "label": "汝城县",
+ "value": "431026"
+ },
+ {
+ "label": "桂东县",
+ "value": "431027"
+ },
+ {
+ "label": "安仁县",
+ "value": "431028"
+ },
+ {
+ "label": "资兴市",
+ "value": "431081"
+ }
+ ],
+ [{
+ "label": "零陵区",
+ "value": "431102"
+ },
+ {
+ "label": "冷水滩区",
+ "value": "431103"
+ },
+ {
+ "label": "祁阳县",
+ "value": "431121"
+ },
+ {
+ "label": "东安县",
+ "value": "431122"
+ },
+ {
+ "label": "双牌县",
+ "value": "431123"
+ },
+ {
+ "label": "道县",
+ "value": "431124"
+ },
+ {
+ "label": "江永县",
+ "value": "431125"
+ },
+ {
+ "label": "宁远县",
+ "value": "431126"
+ },
+ {
+ "label": "蓝山县",
+ "value": "431127"
+ },
+ {
+ "label": "新田县",
+ "value": "431128"
+ },
+ {
+ "label": "江华瑶族自治县",
+ "value": "431129"
+ },
+ {
+ "label": "永州经济技术开发区",
+ "value": "431171"
+ },
+ {
+ "label": "永州市金洞管理区",
+ "value": "431172"
+ },
+ {
+ "label": "永州市回龙圩管理区",
+ "value": "431173"
+ }
+ ],
+ [{
+ "label": "鹤城区",
+ "value": "431202"
+ },
+ {
+ "label": "中方县",
+ "value": "431221"
+ },
+ {
+ "label": "沅陵县",
+ "value": "431222"
+ },
+ {
+ "label": "辰溪县",
+ "value": "431223"
+ },
+ {
+ "label": "溆浦县",
+ "value": "431224"
+ },
+ {
+ "label": "会同县",
+ "value": "431225"
+ },
+ {
+ "label": "麻阳苗族自治县",
+ "value": "431226"
+ },
+ {
+ "label": "新晃侗族自治县",
+ "value": "431227"
+ },
+ {
+ "label": "芷江侗族自治县",
+ "value": "431228"
+ },
+ {
+ "label": "靖州苗族侗族自治县",
+ "value": "431229"
+ },
+ {
+ "label": "通道侗族自治县",
+ "value": "431230"
+ },
+ {
+ "label": "怀化市洪江管理区",
+ "value": "431271"
+ },
+ {
+ "label": "洪江市",
+ "value": "431281"
+ }
+ ],
+ [{
+ "label": "娄星区",
+ "value": "431302"
+ },
+ {
+ "label": "双峰县",
+ "value": "431321"
+ },
+ {
+ "label": "新化县",
+ "value": "431322"
+ },
+ {
+ "label": "冷水江市",
+ "value": "431381"
+ },
+ {
+ "label": "涟源市",
+ "value": "431382"
+ }
+ ],
+ [{
+ "label": "吉首市",
+ "value": "433101"
+ },
+ {
+ "label": "泸溪县",
+ "value": "433122"
+ },
+ {
+ "label": "凤凰县",
+ "value": "433123"
+ },
+ {
+ "label": "花垣县",
+ "value": "433124"
+ },
+ {
+ "label": "保靖县",
+ "value": "433125"
+ },
+ {
+ "label": "古丈县",
+ "value": "433126"
+ },
+ {
+ "label": "永顺县",
+ "value": "433127"
+ },
+ {
+ "label": "龙山县",
+ "value": "433130"
+ },
+ {
+ "label": "湖南吉首经济开发区",
+ "value": "433172"
+ },
+ {
+ "label": "湖南永顺经济开发区",
+ "value": "433173"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "荔湾区",
+ "value": "440103"
+ },
+ {
+ "label": "越秀区",
+ "value": "440104"
+ },
+ {
+ "label": "海珠区",
+ "value": "440105"
+ },
+ {
+ "label": "天河区",
+ "value": "440106"
+ },
+ {
+ "label": "白云区",
+ "value": "440111"
+ },
+ {
+ "label": "黄埔区",
+ "value": "440112"
+ },
+ {
+ "label": "番禺区",
+ "value": "440113"
+ },
+ {
+ "label": "花都区",
+ "value": "440114"
+ },
+ {
+ "label": "南沙区",
+ "value": "440115"
+ },
+ {
+ "label": "从化区",
+ "value": "440117"
+ },
+ {
+ "label": "增城区",
+ "value": "440118"
+ }
+ ],
+ [{
+ "label": "武江区",
+ "value": "440203"
+ },
+ {
+ "label": "浈江区",
+ "value": "440204"
+ },
+ {
+ "label": "曲江区",
+ "value": "440205"
+ },
+ {
+ "label": "始兴县",
+ "value": "440222"
+ },
+ {
+ "label": "仁化县",
+ "value": "440224"
+ },
+ {
+ "label": "翁源县",
+ "value": "440229"
+ },
+ {
+ "label": "乳源瑶族自治县",
+ "value": "440232"
+ },
+ {
+ "label": "新丰县",
+ "value": "440233"
+ },
+ {
+ "label": "乐昌市",
+ "value": "440281"
+ },
+ {
+ "label": "南雄市",
+ "value": "440282"
+ }
+ ],
+ [{
+ "label": "罗湖区",
+ "value": "440303"
+ },
+ {
+ "label": "福田区",
+ "value": "440304"
+ },
+ {
+ "label": "南山区",
+ "value": "440305"
+ },
+ {
+ "label": "宝安区",
+ "value": "440306"
+ },
+ {
+ "label": "龙岗区",
+ "value": "440307"
+ },
+ {
+ "label": "盐田区",
+ "value": "440308"
+ },
+ {
+ "label": "龙华区",
+ "value": "440309"
+ },
+ {
+ "label": "坪山区",
+ "value": "440310"
+ }
+ ],
+ [{
+ "label": "香洲区",
+ "value": "440402"
+ },
+ {
+ "label": "斗门区",
+ "value": "440403"
+ },
+ {
+ "label": "金湾区",
+ "value": "440404"
+ }
+ ],
+ [{
+ "label": "龙湖区",
+ "value": "440507"
+ },
+ {
+ "label": "金平区",
+ "value": "440511"
+ },
+ {
+ "label": "濠江区",
+ "value": "440512"
+ },
+ {
+ "label": "潮阳区",
+ "value": "440513"
+ },
+ {
+ "label": "潮南区",
+ "value": "440514"
+ },
+ {
+ "label": "澄海区",
+ "value": "440515"
+ },
+ {
+ "label": "南澳县",
+ "value": "440523"
+ }
+ ],
+ [{
+ "label": "禅城区",
+ "value": "440604"
+ },
+ {
+ "label": "南海区",
+ "value": "440605"
+ },
+ {
+ "label": "顺德区",
+ "value": "440606"
+ },
+ {
+ "label": "三水区",
+ "value": "440607"
+ },
+ {
+ "label": "高明区",
+ "value": "440608"
+ }
+ ],
+ [{
+ "label": "蓬江区",
+ "value": "440703"
+ },
+ {
+ "label": "江海区",
+ "value": "440704"
+ },
+ {
+ "label": "新会区",
+ "value": "440705"
+ },
+ {
+ "label": "台山市",
+ "value": "440781"
+ },
+ {
+ "label": "开平市",
+ "value": "440783"
+ },
+ {
+ "label": "鹤山市",
+ "value": "440784"
+ },
+ {
+ "label": "恩平市",
+ "value": "440785"
+ }
+ ],
+ [{
+ "label": "赤坎区",
+ "value": "440802"
+ },
+ {
+ "label": "霞山区",
+ "value": "440803"
+ },
+ {
+ "label": "坡头区",
+ "value": "440804"
+ },
+ {
+ "label": "麻章区",
+ "value": "440811"
+ },
+ {
+ "label": "遂溪县",
+ "value": "440823"
+ },
+ {
+ "label": "徐闻县",
+ "value": "440825"
+ },
+ {
+ "label": "廉江市",
+ "value": "440881"
+ },
+ {
+ "label": "雷州市",
+ "value": "440882"
+ },
+ {
+ "label": "吴川市",
+ "value": "440883"
+ }
+ ],
+ [{
+ "label": "茂南区",
+ "value": "440902"
+ },
+ {
+ "label": "电白区",
+ "value": "440904"
+ },
+ {
+ "label": "高州市",
+ "value": "440981"
+ },
+ {
+ "label": "化州市",
+ "value": "440982"
+ },
+ {
+ "label": "信宜市",
+ "value": "440983"
+ }
+ ],
+ [{
+ "label": "端州区",
+ "value": "441202"
+ },
+ {
+ "label": "鼎湖区",
+ "value": "441203"
+ },
+ {
+ "label": "高要区",
+ "value": "441204"
+ },
+ {
+ "label": "广宁县",
+ "value": "441223"
+ },
+ {
+ "label": "怀集县",
+ "value": "441224"
+ },
+ {
+ "label": "封开县",
+ "value": "441225"
+ },
+ {
+ "label": "德庆县",
+ "value": "441226"
+ },
+ {
+ "label": "四会市",
+ "value": "441284"
+ }
+ ],
+ [{
+ "label": "惠城区",
+ "value": "441302"
+ },
+ {
+ "label": "惠阳区",
+ "value": "441303"
+ },
+ {
+ "label": "博罗县",
+ "value": "441322"
+ },
+ {
+ "label": "惠东县",
+ "value": "441323"
+ },
+ {
+ "label": "龙门县",
+ "value": "441324"
+ }
+ ],
+ [{
+ "label": "梅江区",
+ "value": "441402"
+ },
+ {
+ "label": "梅县区",
+ "value": "441403"
+ },
+ {
+ "label": "大埔县",
+ "value": "441422"
+ },
+ {
+ "label": "丰顺县",
+ "value": "441423"
+ },
+ {
+ "label": "五华县",
+ "value": "441424"
+ },
+ {
+ "label": "平远县",
+ "value": "441426"
+ },
+ {
+ "label": "蕉岭县",
+ "value": "441427"
+ },
+ {
+ "label": "兴宁市",
+ "value": "441481"
+ }
+ ],
+ [{
+ "label": "城区",
+ "value": "441502"
+ },
+ {
+ "label": "海丰县",
+ "value": "441521"
+ },
+ {
+ "label": "陆河县",
+ "value": "441523"
+ },
+ {
+ "label": "陆丰市",
+ "value": "441581"
+ }
+ ],
+ [{
+ "label": "源城区",
+ "value": "441602"
+ },
+ {
+ "label": "紫金县",
+ "value": "441621"
+ },
+ {
+ "label": "龙川县",
+ "value": "441622"
+ },
+ {
+ "label": "连平县",
+ "value": "441623"
+ },
+ {
+ "label": "和平县",
+ "value": "441624"
+ },
+ {
+ "label": "东源县",
+ "value": "441625"
+ }
+ ],
+ [{
+ "label": "江城区",
+ "value": "441702"
+ },
+ {
+ "label": "阳东区",
+ "value": "441704"
+ },
+ {
+ "label": "阳西县",
+ "value": "441721"
+ },
+ {
+ "label": "阳春市",
+ "value": "441781"
+ }
+ ],
+ [{
+ "label": "清城区",
+ "value": "441802"
+ },
+ {
+ "label": "清新区",
+ "value": "441803"
+ },
+ {
+ "label": "佛冈县",
+ "value": "441821"
+ },
+ {
+ "label": "阳山县",
+ "value": "441823"
+ },
+ {
+ "label": "连山壮族瑶族自治县",
+ "value": "441825"
+ },
+ {
+ "label": "连南瑶族自治县",
+ "value": "441826"
+ },
+ {
+ "label": "英德市",
+ "value": "441881"
+ },
+ {
+ "label": "连州市",
+ "value": "441882"
+ }
+ ],
+ [{
+ "label": "东莞市",
+ "value": "441900"
+ }],
+ [{
+ "label": "中山市",
+ "value": "442000"
+ }],
+ [{
+ "label": "湘桥区",
+ "value": "445102"
+ },
+ {
+ "label": "潮安区",
+ "value": "445103"
+ },
+ {
+ "label": "饶平县",
+ "value": "445122"
+ }
+ ],
+ [{
+ "label": "榕城区",
+ "value": "445202"
+ },
+ {
+ "label": "揭东区",
+ "value": "445203"
+ },
+ {
+ "label": "揭西县",
+ "value": "445222"
+ },
+ {
+ "label": "惠来县",
+ "value": "445224"
+ },
+ {
+ "label": "普宁市",
+ "value": "445281"
+ }
+ ],
+ [{
+ "label": "云城区",
+ "value": "445302"
+ },
+ {
+ "label": "云安区",
+ "value": "445303"
+ },
+ {
+ "label": "新兴县",
+ "value": "445321"
+ },
+ {
+ "label": "郁南县",
+ "value": "445322"
+ },
+ {
+ "label": "罗定市",
+ "value": "445381"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "兴宁区",
+ "value": "450102"
+ },
+ {
+ "label": "青秀区",
+ "value": "450103"
+ },
+ {
+ "label": "江南区",
+ "value": "450105"
+ },
+ {
+ "label": "西乡塘区",
+ "value": "450107"
+ },
+ {
+ "label": "良庆区",
+ "value": "450108"
+ },
+ {
+ "label": "邕宁区",
+ "value": "450109"
+ },
+ {
+ "label": "武鸣区",
+ "value": "450110"
+ },
+ {
+ "label": "隆安县",
+ "value": "450123"
+ },
+ {
+ "label": "马山县",
+ "value": "450124"
+ },
+ {
+ "label": "上林县",
+ "value": "450125"
+ },
+ {
+ "label": "宾阳县",
+ "value": "450126"
+ },
+ {
+ "label": "横县",
+ "value": "450127"
+ }
+ ],
+ [{
+ "label": "城中区",
+ "value": "450202"
+ },
+ {
+ "label": "鱼峰区",
+ "value": "450203"
+ },
+ {
+ "label": "柳南区",
+ "value": "450204"
+ },
+ {
+ "label": "柳北区",
+ "value": "450205"
+ },
+ {
+ "label": "柳江区",
+ "value": "450206"
+ },
+ {
+ "label": "柳城县",
+ "value": "450222"
+ },
+ {
+ "label": "鹿寨县",
+ "value": "450223"
+ },
+ {
+ "label": "融安县",
+ "value": "450224"
+ },
+ {
+ "label": "融水苗族自治县",
+ "value": "450225"
+ },
+ {
+ "label": "三江侗族自治县",
+ "value": "450226"
+ }
+ ],
+ [{
+ "label": "秀峰区",
+ "value": "450302"
+ },
+ {
+ "label": "叠彩区",
+ "value": "450303"
+ },
+ {
+ "label": "象山区",
+ "value": "450304"
+ },
+ {
+ "label": "七星区",
+ "value": "450305"
+ },
+ {
+ "label": "雁山区",
+ "value": "450311"
+ },
+ {
+ "label": "临桂区",
+ "value": "450312"
+ },
+ {
+ "label": "阳朔县",
+ "value": "450321"
+ },
+ {
+ "label": "灵川县",
+ "value": "450323"
+ },
+ {
+ "label": "全州县",
+ "value": "450324"
+ },
+ {
+ "label": "兴安县",
+ "value": "450325"
+ },
+ {
+ "label": "永福县",
+ "value": "450326"
+ },
+ {
+ "label": "灌阳县",
+ "value": "450327"
+ },
+ {
+ "label": "龙胜各族自治县",
+ "value": "450328"
+ },
+ {
+ "label": "资源县",
+ "value": "450329"
+ },
+ {
+ "label": "平乐县",
+ "value": "450330"
+ },
+ {
+ "label": "荔浦县",
+ "value": "450331"
+ },
+ {
+ "label": "恭城瑶族自治县",
+ "value": "450332"
+ }
+ ],
+ [{
+ "label": "万秀区",
+ "value": "450403"
+ },
+ {
+ "label": "长洲区",
+ "value": "450405"
+ },
+ {
+ "label": "龙圩区",
+ "value": "450406"
+ },
+ {
+ "label": "苍梧县",
+ "value": "450421"
+ },
+ {
+ "label": "藤县",
+ "value": "450422"
+ },
+ {
+ "label": "蒙山县",
+ "value": "450423"
+ },
+ {
+ "label": "岑溪市",
+ "value": "450481"
+ }
+ ],
+ [{
+ "label": "海城区",
+ "value": "450502"
+ },
+ {
+ "label": "银海区",
+ "value": "450503"
+ },
+ {
+ "label": "铁山港区",
+ "value": "450512"
+ },
+ {
+ "label": "合浦县",
+ "value": "450521"
+ }
+ ],
+ [{
+ "label": "港口区",
+ "value": "450602"
+ },
+ {
+ "label": "防城区",
+ "value": "450603"
+ },
+ {
+ "label": "上思县",
+ "value": "450621"
+ },
+ {
+ "label": "东兴市",
+ "value": "450681"
+ }
+ ],
+ [{
+ "label": "钦南区",
+ "value": "450702"
+ },
+ {
+ "label": "钦北区",
+ "value": "450703"
+ },
+ {
+ "label": "灵山县",
+ "value": "450721"
+ },
+ {
+ "label": "浦北县",
+ "value": "450722"
+ }
+ ],
+ [{
+ "label": "港北区",
+ "value": "450802"
+ },
+ {
+ "label": "港南区",
+ "value": "450803"
+ },
+ {
+ "label": "覃塘区",
+ "value": "450804"
+ },
+ {
+ "label": "平南县",
+ "value": "450821"
+ },
+ {
+ "label": "桂平市",
+ "value": "450881"
+ }
+ ],
+ [{
+ "label": "玉州区",
+ "value": "450902"
+ },
+ {
+ "label": "福绵区",
+ "value": "450903"
+ },
+ {
+ "label": "容县",
+ "value": "450921"
+ },
+ {
+ "label": "陆川县",
+ "value": "450922"
+ },
+ {
+ "label": "博白县",
+ "value": "450923"
+ },
+ {
+ "label": "兴业县",
+ "value": "450924"
+ },
+ {
+ "label": "北流市",
+ "value": "450981"
+ }
+ ],
+ [{
+ "label": "右江区",
+ "value": "451002"
+ },
+ {
+ "label": "田阳县",
+ "value": "451021"
+ },
+ {
+ "label": "田东县",
+ "value": "451022"
+ },
+ {
+ "label": "平果县",
+ "value": "451023"
+ },
+ {
+ "label": "德保县",
+ "value": "451024"
+ },
+ {
+ "label": "那坡县",
+ "value": "451026"
+ },
+ {
+ "label": "凌云县",
+ "value": "451027"
+ },
+ {
+ "label": "乐业县",
+ "value": "451028"
+ },
+ {
+ "label": "田林县",
+ "value": "451029"
+ },
+ {
+ "label": "西林县",
+ "value": "451030"
+ },
+ {
+ "label": "隆林各族自治县",
+ "value": "451031"
+ },
+ {
+ "label": "靖西市",
+ "value": "451081"
+ }
+ ],
+ [{
+ "label": "八步区",
+ "value": "451102"
+ },
+ {
+ "label": "平桂区",
+ "value": "451103"
+ },
+ {
+ "label": "昭平县",
+ "value": "451121"
+ },
+ {
+ "label": "钟山县",
+ "value": "451122"
+ },
+ {
+ "label": "富川瑶族自治县",
+ "value": "451123"
+ }
+ ],
+ [{
+ "label": "金城江区",
+ "value": "451202"
+ },
+ {
+ "label": "宜州区",
+ "value": "451203"
+ },
+ {
+ "label": "南丹县",
+ "value": "451221"
+ },
+ {
+ "label": "天峨县",
+ "value": "451222"
+ },
+ {
+ "label": "凤山县",
+ "value": "451223"
+ },
+ {
+ "label": "东兰县",
+ "value": "451224"
+ },
+ {
+ "label": "罗城仫佬族自治县",
+ "value": "451225"
+ },
+ {
+ "label": "环江毛南族自治县",
+ "value": "451226"
+ },
+ {
+ "label": "巴马瑶族自治县",
+ "value": "451227"
+ },
+ {
+ "label": "都安瑶族自治县",
+ "value": "451228"
+ },
+ {
+ "label": "大化瑶族自治县",
+ "value": "451229"
+ }
+ ],
+ [{
+ "label": "兴宾区",
+ "value": "451302"
+ },
+ {
+ "label": "忻城县",
+ "value": "451321"
+ },
+ {
+ "label": "象州县",
+ "value": "451322"
+ },
+ {
+ "label": "武宣县",
+ "value": "451323"
+ },
+ {
+ "label": "金秀瑶族自治县",
+ "value": "451324"
+ },
+ {
+ "label": "合山市",
+ "value": "451381"
+ }
+ ],
+ [{
+ "label": "江州区",
+ "value": "451402"
+ },
+ {
+ "label": "扶绥县",
+ "value": "451421"
+ },
+ {
+ "label": "宁明县",
+ "value": "451422"
+ },
+ {
+ "label": "龙州县",
+ "value": "451423"
+ },
+ {
+ "label": "大新县",
+ "value": "451424"
+ },
+ {
+ "label": "天等县",
+ "value": "451425"
+ },
+ {
+ "label": "凭祥市",
+ "value": "451481"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "秀英区",
+ "value": "460105"
+ },
+ {
+ "label": "龙华区",
+ "value": "460106"
+ },
+ {
+ "label": "琼山区",
+ "value": "460107"
+ },
+ {
+ "label": "美兰区",
+ "value": "460108"
+ }
+ ],
+ [{
+ "label": "海棠区",
+ "value": "460202"
+ },
+ {
+ "label": "吉阳区",
+ "value": "460203"
+ },
+ {
+ "label": "天涯区",
+ "value": "460204"
+ },
+ {
+ "label": "崖州区",
+ "value": "460205"
+ }
+ ],
+ [{
+ "label": "西沙群岛",
+ "value": "460321"
+ },
+ {
+ "label": "南沙群岛",
+ "value": "460322"
+ },
+ {
+ "label": "中沙群岛的岛礁及其海域",
+ "value": "460323"
+ }
+ ],
+ [{
+ "label": "儋州市",
+ "value": "460400"
+ }],
+ [{
+ "label": "五指山市",
+ "value": "469001"
+ },
+ {
+ "label": "琼海市",
+ "value": "469002"
+ },
+ {
+ "label": "文昌市",
+ "value": "469005"
+ },
+ {
+ "label": "万宁市",
+ "value": "469006"
+ },
+ {
+ "label": "东方市",
+ "value": "469007"
+ },
+ {
+ "label": "定安县",
+ "value": "469021"
+ },
+ {
+ "label": "屯昌县",
+ "value": "469022"
+ },
+ {
+ "label": "澄迈县",
+ "value": "469023"
+ },
+ {
+ "label": "临高县",
+ "value": "469024"
+ },
+ {
+ "label": "白沙黎族自治县",
+ "value": "469025"
+ },
+ {
+ "label": "昌江黎族自治县",
+ "value": "469026"
+ },
+ {
+ "label": "乐东黎族自治县",
+ "value": "469027"
+ },
+ {
+ "label": "陵水黎族自治县",
+ "value": "469028"
+ },
+ {
+ "label": "保亭黎族苗族自治县",
+ "value": "469029"
+ },
+ {
+ "label": "琼中黎族苗族自治县",
+ "value": "469030"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "万州区",
+ "value": "500101"
+ },
+ {
+ "label": "涪陵区",
+ "value": "500102"
+ },
+ {
+ "label": "渝中区",
+ "value": "500103"
+ },
+ {
+ "label": "大渡口区",
+ "value": "500104"
+ },
+ {
+ "label": "江北区",
+ "value": "500105"
+ },
+ {
+ "label": "沙坪坝区",
+ "value": "500106"
+ },
+ {
+ "label": "九龙坡区",
+ "value": "500107"
+ },
+ {
+ "label": "南岸区",
+ "value": "500108"
+ },
+ {
+ "label": "北碚区",
+ "value": "500109"
+ },
+ {
+ "label": "綦江区",
+ "value": "500110"
+ },
+ {
+ "label": "大足区",
+ "value": "500111"
+ },
+ {
+ "label": "渝北区",
+ "value": "500112"
+ },
+ {
+ "label": "巴南区",
+ "value": "500113"
+ },
+ {
+ "label": "黔江区",
+ "value": "500114"
+ },
+ {
+ "label": "长寿区",
+ "value": "500115"
+ },
+ {
+ "label": "江津区",
+ "value": "500116"
+ },
+ {
+ "label": "合川区",
+ "value": "500117"
+ },
+ {
+ "label": "永川区",
+ "value": "500118"
+ },
+ {
+ "label": "南川区",
+ "value": "500119"
+ },
+ {
+ "label": "璧山区",
+ "value": "500120"
+ },
+ {
+ "label": "铜梁区",
+ "value": "500151"
+ },
+ {
+ "label": "潼南区",
+ "value": "500152"
+ },
+ {
+ "label": "荣昌区",
+ "value": "500153"
+ },
+ {
+ "label": "开州区",
+ "value": "500154"
+ },
+ {
+ "label": "梁平区",
+ "value": "500155"
+ },
+ {
+ "label": "武隆区",
+ "value": "500156"
+ }
+ ],
+ [{
+ "label": "城口县",
+ "value": "500229"
+ },
+ {
+ "label": "丰都县",
+ "value": "500230"
+ },
+ {
+ "label": "垫江县",
+ "value": "500231"
+ },
+ {
+ "label": "忠县",
+ "value": "500233"
+ },
+ {
+ "label": "云阳县",
+ "value": "500235"
+ },
+ {
+ "label": "奉节县",
+ "value": "500236"
+ },
+ {
+ "label": "巫山县",
+ "value": "500237"
+ },
+ {
+ "label": "巫溪县",
+ "value": "500238"
+ },
+ {
+ "label": "石柱土家族自治县",
+ "value": "500240"
+ },
+ {
+ "label": "秀山土家族苗族自治县",
+ "value": "500241"
+ },
+ {
+ "label": "酉阳土家族苗族自治县",
+ "value": "500242"
+ },
+ {
+ "label": "彭水苗族土家族自治县",
+ "value": "500243"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "锦江区",
+ "value": "510104"
+ },
+ {
+ "label": "青羊区",
+ "value": "510105"
+ },
+ {
+ "label": "金牛区",
+ "value": "510106"
+ },
+ {
+ "label": "武侯区",
+ "value": "510107"
+ },
+ {
+ "label": "成华区",
+ "value": "510108"
+ },
+ {
+ "label": "龙泉驿区",
+ "value": "510112"
+ },
+ {
+ "label": "青白江区",
+ "value": "510113"
+ },
+ {
+ "label": "新都区",
+ "value": "510114"
+ },
+ {
+ "label": "温江区",
+ "value": "510115"
+ },
+ {
+ "label": "双流区",
+ "value": "510116"
+ },
+ {
+ "label": "郫都区",
+ "value": "510117"
+ },
+ {
+ "label": "金堂县",
+ "value": "510121"
+ },
+ {
+ "label": "大邑县",
+ "value": "510129"
+ },
+ {
+ "label": "蒲江县",
+ "value": "510131"
+ },
+ {
+ "label": "新津县",
+ "value": "510132"
+ },
+ {
+ "label": "都江堰市",
+ "value": "510181"
+ },
+ {
+ "label": "彭州市",
+ "value": "510182"
+ },
+ {
+ "label": "邛崃市",
+ "value": "510183"
+ },
+ {
+ "label": "崇州市",
+ "value": "510184"
+ },
+ {
+ "label": "简阳市",
+ "value": "510185"
+ }
+ ],
+ [{
+ "label": "自流井区",
+ "value": "510302"
+ },
+ {
+ "label": "贡井区",
+ "value": "510303"
+ },
+ {
+ "label": "大安区",
+ "value": "510304"
+ },
+ {
+ "label": "沿滩区",
+ "value": "510311"
+ },
+ {
+ "label": "荣县",
+ "value": "510321"
+ },
+ {
+ "label": "富顺县",
+ "value": "510322"
+ }
+ ],
+ [{
+ "label": "东区",
+ "value": "510402"
+ },
+ {
+ "label": "西区",
+ "value": "510403"
+ },
+ {
+ "label": "仁和区",
+ "value": "510411"
+ },
+ {
+ "label": "米易县",
+ "value": "510421"
+ },
+ {
+ "label": "盐边县",
+ "value": "510422"
+ }
+ ],
+ [{
+ "label": "江阳区",
+ "value": "510502"
+ },
+ {
+ "label": "纳溪区",
+ "value": "510503"
+ },
+ {
+ "label": "龙马潭区",
+ "value": "510504"
+ },
+ {
+ "label": "泸县",
+ "value": "510521"
+ },
+ {
+ "label": "合江县",
+ "value": "510522"
+ },
+ {
+ "label": "叙永县",
+ "value": "510524"
+ },
+ {
+ "label": "古蔺县",
+ "value": "510525"
+ }
+ ],
+ [{
+ "label": "旌阳区",
+ "value": "510603"
+ },
+ {
+ "label": "罗江区",
+ "value": "510604"
+ },
+ {
+ "label": "中江县",
+ "value": "510623"
+ },
+ {
+ "label": "广汉市",
+ "value": "510681"
+ },
+ {
+ "label": "什邡市",
+ "value": "510682"
+ },
+ {
+ "label": "绵竹市",
+ "value": "510683"
+ }
+ ],
+ [{
+ "label": "涪城区",
+ "value": "510703"
+ },
+ {
+ "label": "游仙区",
+ "value": "510704"
+ },
+ {
+ "label": "安州区",
+ "value": "510705"
+ },
+ {
+ "label": "三台县",
+ "value": "510722"
+ },
+ {
+ "label": "盐亭县",
+ "value": "510723"
+ },
+ {
+ "label": "梓潼县",
+ "value": "510725"
+ },
+ {
+ "label": "北川羌族自治县",
+ "value": "510726"
+ },
+ {
+ "label": "平武县",
+ "value": "510727"
+ },
+ {
+ "label": "江油市",
+ "value": "510781"
+ }
+ ],
+ [{
+ "label": "利州区",
+ "value": "510802"
+ },
+ {
+ "label": "昭化区",
+ "value": "510811"
+ },
+ {
+ "label": "朝天区",
+ "value": "510812"
+ },
+ {
+ "label": "旺苍县",
+ "value": "510821"
+ },
+ {
+ "label": "青川县",
+ "value": "510822"
+ },
+ {
+ "label": "剑阁县",
+ "value": "510823"
+ },
+ {
+ "label": "苍溪县",
+ "value": "510824"
+ }
+ ],
+ [{
+ "label": "船山区",
+ "value": "510903"
+ },
+ {
+ "label": "安居区",
+ "value": "510904"
+ },
+ {
+ "label": "蓬溪县",
+ "value": "510921"
+ },
+ {
+ "label": "射洪县",
+ "value": "510922"
+ },
+ {
+ "label": "大英县",
+ "value": "510923"
+ }
+ ],
+ [{
+ "label": "市中区",
+ "value": "511002"
+ },
+ {
+ "label": "东兴区",
+ "value": "511011"
+ },
+ {
+ "label": "威远县",
+ "value": "511024"
+ },
+ {
+ "label": "资中县",
+ "value": "511025"
+ },
+ {
+ "label": "内江经济开发区",
+ "value": "511071"
+ },
+ {
+ "label": "隆昌市",
+ "value": "511083"
+ }
+ ],
+ [{
+ "label": "市中区",
+ "value": "511102"
+ },
+ {
+ "label": "沙湾区",
+ "value": "511111"
+ },
+ {
+ "label": "五通桥区",
+ "value": "511112"
+ },
+ {
+ "label": "金口河区",
+ "value": "511113"
+ },
+ {
+ "label": "犍为县",
+ "value": "511123"
+ },
+ {
+ "label": "井研县",
+ "value": "511124"
+ },
+ {
+ "label": "夹江县",
+ "value": "511126"
+ },
+ {
+ "label": "沐川县",
+ "value": "511129"
+ },
+ {
+ "label": "峨边彝族自治县",
+ "value": "511132"
+ },
+ {
+ "label": "马边彝族自治县",
+ "value": "511133"
+ },
+ {
+ "label": "峨眉山市",
+ "value": "511181"
+ }
+ ],
+ [{
+ "label": "顺庆区",
+ "value": "511302"
+ },
+ {
+ "label": "高坪区",
+ "value": "511303"
+ },
+ {
+ "label": "嘉陵区",
+ "value": "511304"
+ },
+ {
+ "label": "南部县",
+ "value": "511321"
+ },
+ {
+ "label": "营山县",
+ "value": "511322"
+ },
+ {
+ "label": "蓬安县",
+ "value": "511323"
+ },
+ {
+ "label": "仪陇县",
+ "value": "511324"
+ },
+ {
+ "label": "西充县",
+ "value": "511325"
+ },
+ {
+ "label": "阆中市",
+ "value": "511381"
+ }
+ ],
+ [{
+ "label": "东坡区",
+ "value": "511402"
+ },
+ {
+ "label": "彭山区",
+ "value": "511403"
+ },
+ {
+ "label": "仁寿县",
+ "value": "511421"
+ },
+ {
+ "label": "洪雅县",
+ "value": "511423"
+ },
+ {
+ "label": "丹棱县",
+ "value": "511424"
+ },
+ {
+ "label": "青神县",
+ "value": "511425"
+ }
+ ],
+ [{
+ "label": "翠屏区",
+ "value": "511502"
+ },
+ {
+ "label": "南溪区",
+ "value": "511503"
+ },
+ {
+ "label": "宜宾县",
+ "value": "511521"
+ },
+ {
+ "label": "江安县",
+ "value": "511523"
+ },
+ {
+ "label": "长宁县",
+ "value": "511524"
+ },
+ {
+ "label": "高县",
+ "value": "511525"
+ },
+ {
+ "label": "珙县",
+ "value": "511526"
+ },
+ {
+ "label": "筠连县",
+ "value": "511527"
+ },
+ {
+ "label": "兴文县",
+ "value": "511528"
+ },
+ {
+ "label": "屏山县",
+ "value": "511529"
+ }
+ ],
+ [{
+ "label": "广安区",
+ "value": "511602"
+ },
+ {
+ "label": "前锋区",
+ "value": "511603"
+ },
+ {
+ "label": "岳池县",
+ "value": "511621"
+ },
+ {
+ "label": "武胜县",
+ "value": "511622"
+ },
+ {
+ "label": "邻水县",
+ "value": "511623"
+ },
+ {
+ "label": "华蓥市",
+ "value": "511681"
+ }
+ ],
+ [{
+ "label": "通川区",
+ "value": "511702"
+ },
+ {
+ "label": "达川区",
+ "value": "511703"
+ },
+ {
+ "label": "宣汉县",
+ "value": "511722"
+ },
+ {
+ "label": "开江县",
+ "value": "511723"
+ },
+ {
+ "label": "大竹县",
+ "value": "511724"
+ },
+ {
+ "label": "渠县",
+ "value": "511725"
+ },
+ {
+ "label": "达州经济开发区",
+ "value": "511771"
+ },
+ {
+ "label": "万源市",
+ "value": "511781"
+ }
+ ],
+ [{
+ "label": "雨城区",
+ "value": "511802"
+ },
+ {
+ "label": "名山区",
+ "value": "511803"
+ },
+ {
+ "label": "荥经县",
+ "value": "511822"
+ },
+ {
+ "label": "汉源县",
+ "value": "511823"
+ },
+ {
+ "label": "石棉县",
+ "value": "511824"
+ },
+ {
+ "label": "天全县",
+ "value": "511825"
+ },
+ {
+ "label": "芦山县",
+ "value": "511826"
+ },
+ {
+ "label": "宝兴县",
+ "value": "511827"
+ }
+ ],
+ [{
+ "label": "巴州区",
+ "value": "511902"
+ },
+ {
+ "label": "恩阳区",
+ "value": "511903"
+ },
+ {
+ "label": "通江县",
+ "value": "511921"
+ },
+ {
+ "label": "南江县",
+ "value": "511922"
+ },
+ {
+ "label": "平昌县",
+ "value": "511923"
+ },
+ {
+ "label": "巴中经济开发区",
+ "value": "511971"
+ }
+ ],
+ [{
+ "label": "雁江区",
+ "value": "512002"
+ },
+ {
+ "label": "安岳县",
+ "value": "512021"
+ },
+ {
+ "label": "乐至县",
+ "value": "512022"
+ }
+ ],
+ [{
+ "label": "马尔康市",
+ "value": "513201"
+ },
+ {
+ "label": "汶川县",
+ "value": "513221"
+ },
+ {
+ "label": "理县",
+ "value": "513222"
+ },
+ {
+ "label": "茂县",
+ "value": "513223"
+ },
+ {
+ "label": "松潘县",
+ "value": "513224"
+ },
+ {
+ "label": "九寨沟县",
+ "value": "513225"
+ },
+ {
+ "label": "金川县",
+ "value": "513226"
+ },
+ {
+ "label": "小金县",
+ "value": "513227"
+ },
+ {
+ "label": "黑水县",
+ "value": "513228"
+ },
+ {
+ "label": "壤塘县",
+ "value": "513230"
+ },
+ {
+ "label": "阿坝县",
+ "value": "513231"
+ },
+ {
+ "label": "若尔盖县",
+ "value": "513232"
+ },
+ {
+ "label": "红原县",
+ "value": "513233"
+ }
+ ],
+ [{
+ "label": "康定市",
+ "value": "513301"
+ },
+ {
+ "label": "泸定县",
+ "value": "513322"
+ },
+ {
+ "label": "丹巴县",
+ "value": "513323"
+ },
+ {
+ "label": "九龙县",
+ "value": "513324"
+ },
+ {
+ "label": "雅江县",
+ "value": "513325"
+ },
+ {
+ "label": "道孚县",
+ "value": "513326"
+ },
+ {
+ "label": "炉霍县",
+ "value": "513327"
+ },
+ {
+ "label": "甘孜县",
+ "value": "513328"
+ },
+ {
+ "label": "新龙县",
+ "value": "513329"
+ },
+ {
+ "label": "德格县",
+ "value": "513330"
+ },
+ {
+ "label": "白玉县",
+ "value": "513331"
+ },
+ {
+ "label": "石渠县",
+ "value": "513332"
+ },
+ {
+ "label": "色达县",
+ "value": "513333"
+ },
+ {
+ "label": "理塘县",
+ "value": "513334"
+ },
+ {
+ "label": "巴塘县",
+ "value": "513335"
+ },
+ {
+ "label": "乡城县",
+ "value": "513336"
+ },
+ {
+ "label": "稻城县",
+ "value": "513337"
+ },
+ {
+ "label": "得荣县",
+ "value": "513338"
+ }
+ ],
+ [{
+ "label": "西昌市",
+ "value": "513401"
+ },
+ {
+ "label": "木里藏族自治县",
+ "value": "513422"
+ },
+ {
+ "label": "盐源县",
+ "value": "513423"
+ },
+ {
+ "label": "德昌县",
+ "value": "513424"
+ },
+ {
+ "label": "会理县",
+ "value": "513425"
+ },
+ {
+ "label": "会东县",
+ "value": "513426"
+ },
+ {
+ "label": "宁南县",
+ "value": "513427"
+ },
+ {
+ "label": "普格县",
+ "value": "513428"
+ },
+ {
+ "label": "布拖县",
+ "value": "513429"
+ },
+ {
+ "label": "金阳县",
+ "value": "513430"
+ },
+ {
+ "label": "昭觉县",
+ "value": "513431"
+ },
+ {
+ "label": "喜德县",
+ "value": "513432"
+ },
+ {
+ "label": "冕宁县",
+ "value": "513433"
+ },
+ {
+ "label": "越西县",
+ "value": "513434"
+ },
+ {
+ "label": "甘洛县",
+ "value": "513435"
+ },
+ {
+ "label": "美姑县",
+ "value": "513436"
+ },
+ {
+ "label": "雷波县",
+ "value": "513437"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "南明区",
+ "value": "520102"
+ },
+ {
+ "label": "云岩区",
+ "value": "520103"
+ },
+ {
+ "label": "花溪区",
+ "value": "520111"
+ },
+ {
+ "label": "乌当区",
+ "value": "520112"
+ },
+ {
+ "label": "白云区",
+ "value": "520113"
+ },
+ {
+ "label": "观山湖区",
+ "value": "520115"
+ },
+ {
+ "label": "开阳县",
+ "value": "520121"
+ },
+ {
+ "label": "息烽县",
+ "value": "520122"
+ },
+ {
+ "label": "修文县",
+ "value": "520123"
+ },
+ {
+ "label": "清镇市",
+ "value": "520181"
+ }
+ ],
+ [{
+ "label": "钟山区",
+ "value": "520201"
+ },
+ {
+ "label": "六枝特区",
+ "value": "520203"
+ },
+ {
+ "label": "水城县",
+ "value": "520221"
+ },
+ {
+ "label": "盘州市",
+ "value": "520281"
+ }
+ ],
+ [{
+ "label": "红花岗区",
+ "value": "520302"
+ },
+ {
+ "label": "汇川区",
+ "value": "520303"
+ },
+ {
+ "label": "播州区",
+ "value": "520304"
+ },
+ {
+ "label": "桐梓县",
+ "value": "520322"
+ },
+ {
+ "label": "绥阳县",
+ "value": "520323"
+ },
+ {
+ "label": "正安县",
+ "value": "520324"
+ },
+ {
+ "label": "道真仡佬族苗族自治县",
+ "value": "520325"
+ },
+ {
+ "label": "务川仡佬族苗族自治县",
+ "value": "520326"
+ },
+ {
+ "label": "凤冈县",
+ "value": "520327"
+ },
+ {
+ "label": "湄潭县",
+ "value": "520328"
+ },
+ {
+ "label": "余庆县",
+ "value": "520329"
+ },
+ {
+ "label": "习水县",
+ "value": "520330"
+ },
+ {
+ "label": "赤水市",
+ "value": "520381"
+ },
+ {
+ "label": "仁怀市",
+ "value": "520382"
+ }
+ ],
+ [{
+ "label": "西秀区",
+ "value": "520402"
+ },
+ {
+ "label": "平坝区",
+ "value": "520403"
+ },
+ {
+ "label": "普定县",
+ "value": "520422"
+ },
+ {
+ "label": "镇宁布依族苗族自治县",
+ "value": "520423"
+ },
+ {
+ "label": "关岭布依族苗族自治县",
+ "value": "520424"
+ },
+ {
+ "label": "紫云苗族布依族自治县",
+ "value": "520425"
+ }
+ ],
+ [{
+ "label": "七星关区",
+ "value": "520502"
+ },
+ {
+ "label": "大方县",
+ "value": "520521"
+ },
+ {
+ "label": "黔西县",
+ "value": "520522"
+ },
+ {
+ "label": "金沙县",
+ "value": "520523"
+ },
+ {
+ "label": "织金县",
+ "value": "520524"
+ },
+ {
+ "label": "纳雍县",
+ "value": "520525"
+ },
+ {
+ "label": "威宁彝族回族苗族自治县",
+ "value": "520526"
+ },
+ {
+ "label": "赫章县",
+ "value": "520527"
+ }
+ ],
+ [{
+ "label": "碧江区",
+ "value": "520602"
+ },
+ {
+ "label": "万山区",
+ "value": "520603"
+ },
+ {
+ "label": "江口县",
+ "value": "520621"
+ },
+ {
+ "label": "玉屏侗族自治县",
+ "value": "520622"
+ },
+ {
+ "label": "石阡县",
+ "value": "520623"
+ },
+ {
+ "label": "思南县",
+ "value": "520624"
+ },
+ {
+ "label": "印江土家族苗族自治县",
+ "value": "520625"
+ },
+ {
+ "label": "德江县",
+ "value": "520626"
+ },
+ {
+ "label": "沿河土家族自治县",
+ "value": "520627"
+ },
+ {
+ "label": "松桃苗族自治县",
+ "value": "520628"
+ }
+ ],
+ [{
+ "label": "兴义市",
+ "value": "522301"
+ },
+ {
+ "label": "兴仁县",
+ "value": "522322"
+ },
+ {
+ "label": "普安县",
+ "value": "522323"
+ },
+ {
+ "label": "晴隆县",
+ "value": "522324"
+ },
+ {
+ "label": "贞丰县",
+ "value": "522325"
+ },
+ {
+ "label": "望谟县",
+ "value": "522326"
+ },
+ {
+ "label": "册亨县",
+ "value": "522327"
+ },
+ {
+ "label": "安龙县",
+ "value": "522328"
+ }
+ ],
+ [{
+ "label": "凯里市",
+ "value": "522601"
+ },
+ {
+ "label": "黄平县",
+ "value": "522622"
+ },
+ {
+ "label": "施秉县",
+ "value": "522623"
+ },
+ {
+ "label": "三穗县",
+ "value": "522624"
+ },
+ {
+ "label": "镇远县",
+ "value": "522625"
+ },
+ {
+ "label": "岑巩县",
+ "value": "522626"
+ },
+ {
+ "label": "天柱县",
+ "value": "522627"
+ },
+ {
+ "label": "锦屏县",
+ "value": "522628"
+ },
+ {
+ "label": "剑河县",
+ "value": "522629"
+ },
+ {
+ "label": "台江县",
+ "value": "522630"
+ },
+ {
+ "label": "黎平县",
+ "value": "522631"
+ },
+ {
+ "label": "榕江县",
+ "value": "522632"
+ },
+ {
+ "label": "从江县",
+ "value": "522633"
+ },
+ {
+ "label": "雷山县",
+ "value": "522634"
+ },
+ {
+ "label": "麻江县",
+ "value": "522635"
+ },
+ {
+ "label": "丹寨县",
+ "value": "522636"
+ }
+ ],
+ [{
+ "label": "都匀市",
+ "value": "522701"
+ },
+ {
+ "label": "福泉市",
+ "value": "522702"
+ },
+ {
+ "label": "荔波县",
+ "value": "522722"
+ },
+ {
+ "label": "贵定县",
+ "value": "522723"
+ },
+ {
+ "label": "瓮安县",
+ "value": "522725"
+ },
+ {
+ "label": "独山县",
+ "value": "522726"
+ },
+ {
+ "label": "平塘县",
+ "value": "522727"
+ },
+ {
+ "label": "罗甸县",
+ "value": "522728"
+ },
+ {
+ "label": "长顺县",
+ "value": "522729"
+ },
+ {
+ "label": "龙里县",
+ "value": "522730"
+ },
+ {
+ "label": "惠水县",
+ "value": "522731"
+ },
+ {
+ "label": "三都水族自治县",
+ "value": "522732"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "五华区",
+ "value": "530102"
+ },
+ {
+ "label": "盘龙区",
+ "value": "530103"
+ },
+ {
+ "label": "官渡区",
+ "value": "530111"
+ },
+ {
+ "label": "西山区",
+ "value": "530112"
+ },
+ {
+ "label": "东川区",
+ "value": "530113"
+ },
+ {
+ "label": "呈贡区",
+ "value": "530114"
+ },
+ {
+ "label": "晋宁区",
+ "value": "530115"
+ },
+ {
+ "label": "富民县",
+ "value": "530124"
+ },
+ {
+ "label": "宜良县",
+ "value": "530125"
+ },
+ {
+ "label": "石林彝族自治县",
+ "value": "530126"
+ },
+ {
+ "label": "嵩明县",
+ "value": "530127"
+ },
+ {
+ "label": "禄劝彝族苗族自治县",
+ "value": "530128"
+ },
+ {
+ "label": "寻甸回族彝族自治县",
+ "value": "530129"
+ },
+ {
+ "label": "安宁市",
+ "value": "530181"
+ }
+ ],
+ [{
+ "label": "麒麟区",
+ "value": "530302"
+ },
+ {
+ "label": "沾益区",
+ "value": "530303"
+ },
+ {
+ "label": "马龙县",
+ "value": "530321"
+ },
+ {
+ "label": "陆良县",
+ "value": "530322"
+ },
+ {
+ "label": "师宗县",
+ "value": "530323"
+ },
+ {
+ "label": "罗平县",
+ "value": "530324"
+ },
+ {
+ "label": "富源县",
+ "value": "530325"
+ },
+ {
+ "label": "会泽县",
+ "value": "530326"
+ },
+ {
+ "label": "宣威市",
+ "value": "530381"
+ }
+ ],
+ [{
+ "label": "红塔区",
+ "value": "530402"
+ },
+ {
+ "label": "江川区",
+ "value": "530403"
+ },
+ {
+ "label": "澄江县",
+ "value": "530422"
+ },
+ {
+ "label": "通海县",
+ "value": "530423"
+ },
+ {
+ "label": "华宁县",
+ "value": "530424"
+ },
+ {
+ "label": "易门县",
+ "value": "530425"
+ },
+ {
+ "label": "峨山彝族自治县",
+ "value": "530426"
+ },
+ {
+ "label": "新平彝族傣族自治县",
+ "value": "530427"
+ },
+ {
+ "label": "元江哈尼族彝族傣族自治县",
+ "value": "530428"
+ }
+ ],
+ [{
+ "label": "隆阳区",
+ "value": "530502"
+ },
+ {
+ "label": "施甸县",
+ "value": "530521"
+ },
+ {
+ "label": "龙陵县",
+ "value": "530523"
+ },
+ {
+ "label": "昌宁县",
+ "value": "530524"
+ },
+ {
+ "label": "腾冲市",
+ "value": "530581"
+ }
+ ],
+ [{
+ "label": "昭阳区",
+ "value": "530602"
+ },
+ {
+ "label": "鲁甸县",
+ "value": "530621"
+ },
+ {
+ "label": "巧家县",
+ "value": "530622"
+ },
+ {
+ "label": "盐津县",
+ "value": "530623"
+ },
+ {
+ "label": "大关县",
+ "value": "530624"
+ },
+ {
+ "label": "永善县",
+ "value": "530625"
+ },
+ {
+ "label": "绥江县",
+ "value": "530626"
+ },
+ {
+ "label": "镇雄县",
+ "value": "530627"
+ },
+ {
+ "label": "彝良县",
+ "value": "530628"
+ },
+ {
+ "label": "威信县",
+ "value": "530629"
+ },
+ {
+ "label": "水富县",
+ "value": "530630"
+ }
+ ],
+ [{
+ "label": "古城区",
+ "value": "530702"
+ },
+ {
+ "label": "玉龙纳西族自治县",
+ "value": "530721"
+ },
+ {
+ "label": "永胜县",
+ "value": "530722"
+ },
+ {
+ "label": "华坪县",
+ "value": "530723"
+ },
+ {
+ "label": "宁蒗彝族自治县",
+ "value": "530724"
+ }
+ ],
+ [{
+ "label": "思茅区",
+ "value": "530802"
+ },
+ {
+ "label": "宁洱哈尼族彝族自治县",
+ "value": "530821"
+ },
+ {
+ "label": "墨江哈尼族自治县",
+ "value": "530822"
+ },
+ {
+ "label": "景东彝族自治县",
+ "value": "530823"
+ },
+ {
+ "label": "景谷傣族彝族自治县",
+ "value": "530824"
+ },
+ {
+ "label": "镇沅彝族哈尼族拉祜族自治县",
+ "value": "530825"
+ },
+ {
+ "label": "江城哈尼族彝族自治县",
+ "value": "530826"
+ },
+ {
+ "label": "孟连傣族拉祜族佤族自治县",
+ "value": "530827"
+ },
+ {
+ "label": "澜沧拉祜族自治县",
+ "value": "530828"
+ },
+ {
+ "label": "西盟佤族自治县",
+ "value": "530829"
+ }
+ ],
+ [{
+ "label": "临翔区",
+ "value": "530902"
+ },
+ {
+ "label": "凤庆县",
+ "value": "530921"
+ },
+ {
+ "label": "云县",
+ "value": "530922"
+ },
+ {
+ "label": "永德县",
+ "value": "530923"
+ },
+ {
+ "label": "镇康县",
+ "value": "530924"
+ },
+ {
+ "label": "双江拉祜族佤族布朗族傣族自治县",
+ "value": "530925"
+ },
+ {
+ "label": "耿马傣族佤族自治县",
+ "value": "530926"
+ },
+ {
+ "label": "沧源佤族自治县",
+ "value": "530927"
+ }
+ ],
+ [{
+ "label": "楚雄市",
+ "value": "532301"
+ },
+ {
+ "label": "双柏县",
+ "value": "532322"
+ },
+ {
+ "label": "牟定县",
+ "value": "532323"
+ },
+ {
+ "label": "南华县",
+ "value": "532324"
+ },
+ {
+ "label": "姚安县",
+ "value": "532325"
+ },
+ {
+ "label": "大姚县",
+ "value": "532326"
+ },
+ {
+ "label": "永仁县",
+ "value": "532327"
+ },
+ {
+ "label": "元谋县",
+ "value": "532328"
+ },
+ {
+ "label": "武定县",
+ "value": "532329"
+ },
+ {
+ "label": "禄丰县",
+ "value": "532331"
+ }
+ ],
+ [{
+ "label": "个旧市",
+ "value": "532501"
+ },
+ {
+ "label": "开远市",
+ "value": "532502"
+ },
+ {
+ "label": "蒙自市",
+ "value": "532503"
+ },
+ {
+ "label": "弥勒市",
+ "value": "532504"
+ },
+ {
+ "label": "屏边苗族自治县",
+ "value": "532523"
+ },
+ {
+ "label": "建水县",
+ "value": "532524"
+ },
+ {
+ "label": "石屏县",
+ "value": "532525"
+ },
+ {
+ "label": "泸西县",
+ "value": "532527"
+ },
+ {
+ "label": "元阳县",
+ "value": "532528"
+ },
+ {
+ "label": "红河县",
+ "value": "532529"
+ },
+ {
+ "label": "金平苗族瑶族傣族自治县",
+ "value": "532530"
+ },
+ {
+ "label": "绿春县",
+ "value": "532531"
+ },
+ {
+ "label": "河口瑶族自治县",
+ "value": "532532"
+ }
+ ],
+ [{
+ "label": "文山市",
+ "value": "532601"
+ },
+ {
+ "label": "砚山县",
+ "value": "532622"
+ },
+ {
+ "label": "西畴县",
+ "value": "532623"
+ },
+ {
+ "label": "麻栗坡县",
+ "value": "532624"
+ },
+ {
+ "label": "马关县",
+ "value": "532625"
+ },
+ {
+ "label": "丘北县",
+ "value": "532626"
+ },
+ {
+ "label": "广南县",
+ "value": "532627"
+ },
+ {
+ "label": "富宁县",
+ "value": "532628"
+ }
+ ],
+ [{
+ "label": "景洪市",
+ "value": "532801"
+ },
+ {
+ "label": "勐海县",
+ "value": "532822"
+ },
+ {
+ "label": "勐腊县",
+ "value": "532823"
+ }
+ ],
+ [{
+ "label": "大理市",
+ "value": "532901"
+ },
+ {
+ "label": "漾濞彝族自治县",
+ "value": "532922"
+ },
+ {
+ "label": "祥云县",
+ "value": "532923"
+ },
+ {
+ "label": "宾川县",
+ "value": "532924"
+ },
+ {
+ "label": "弥渡县",
+ "value": "532925"
+ },
+ {
+ "label": "南涧彝族自治县",
+ "value": "532926"
+ },
+ {
+ "label": "巍山彝族回族自治县",
+ "value": "532927"
+ },
+ {
+ "label": "永平县",
+ "value": "532928"
+ },
+ {
+ "label": "云龙县",
+ "value": "532929"
+ },
+ {
+ "label": "洱源县",
+ "value": "532930"
+ },
+ {
+ "label": "剑川县",
+ "value": "532931"
+ },
+ {
+ "label": "鹤庆县",
+ "value": "532932"
+ }
+ ],
+ [{
+ "label": "瑞丽市",
+ "value": "533102"
+ },
+ {
+ "label": "芒市",
+ "value": "533103"
+ },
+ {
+ "label": "梁河县",
+ "value": "533122"
+ },
+ {
+ "label": "盈江县",
+ "value": "533123"
+ },
+ {
+ "label": "陇川县",
+ "value": "533124"
+ }
+ ],
+ [{
+ "label": "泸水市",
+ "value": "533301"
+ },
+ {
+ "label": "福贡县",
+ "value": "533323"
+ },
+ {
+ "label": "贡山独龙族怒族自治县",
+ "value": "533324"
+ },
+ {
+ "label": "兰坪白族普米族自治县",
+ "value": "533325"
+ }
+ ],
+ [{
+ "label": "香格里拉市",
+ "value": "533401"
+ },
+ {
+ "label": "德钦县",
+ "value": "533422"
+ },
+ {
+ "label": "维西傈僳族自治县",
+ "value": "533423"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "城关区",
+ "value": "540102"
+ },
+ {
+ "label": "堆龙德庆区",
+ "value": "540103"
+ },
+ {
+ "label": "林周县",
+ "value": "540121"
+ },
+ {
+ "label": "当雄县",
+ "value": "540122"
+ },
+ {
+ "label": "尼木县",
+ "value": "540123"
+ },
+ {
+ "label": "曲水县",
+ "value": "540124"
+ },
+ {
+ "label": "达孜县",
+ "value": "540126"
+ },
+ {
+ "label": "墨竹工卡县",
+ "value": "540127"
+ },
+ {
+ "label": "格尔木藏青工业园区",
+ "value": "540171"
+ },
+ {
+ "label": "拉萨经济技术开发区",
+ "value": "540172"
+ },
+ {
+ "label": "西藏文化旅游创意园区",
+ "value": "540173"
+ },
+ {
+ "label": "达孜工业园区",
+ "value": "540174"
+ }
+ ],
+ [{
+ "label": "桑珠孜区",
+ "value": "540202"
+ },
+ {
+ "label": "南木林县",
+ "value": "540221"
+ },
+ {
+ "label": "江孜县",
+ "value": "540222"
+ },
+ {
+ "label": "定日县",
+ "value": "540223"
+ },
+ {
+ "label": "萨迦县",
+ "value": "540224"
+ },
+ {
+ "label": "拉孜县",
+ "value": "540225"
+ },
+ {
+ "label": "昂仁县",
+ "value": "540226"
+ },
+ {
+ "label": "谢通门县",
+ "value": "540227"
+ },
+ {
+ "label": "白朗县",
+ "value": "540228"
+ },
+ {
+ "label": "仁布县",
+ "value": "540229"
+ },
+ {
+ "label": "康马县",
+ "value": "540230"
+ },
+ {
+ "label": "定结县",
+ "value": "540231"
+ },
+ {
+ "label": "仲巴县",
+ "value": "540232"
+ },
+ {
+ "label": "亚东县",
+ "value": "540233"
+ },
+ {
+ "label": "吉隆县",
+ "value": "540234"
+ },
+ {
+ "label": "聂拉木县",
+ "value": "540235"
+ },
+ {
+ "label": "萨嘎县",
+ "value": "540236"
+ },
+ {
+ "label": "岗巴县",
+ "value": "540237"
+ }
+ ],
+ [{
+ "label": "卡若区",
+ "value": "540302"
+ },
+ {
+ "label": "江达县",
+ "value": "540321"
+ },
+ {
+ "label": "贡觉县",
+ "value": "540322"
+ },
+ {
+ "label": "类乌齐县",
+ "value": "540323"
+ },
+ {
+ "label": "丁青县",
+ "value": "540324"
+ },
+ {
+ "label": "察雅县",
+ "value": "540325"
+ },
+ {
+ "label": "八宿县",
+ "value": "540326"
+ },
+ {
+ "label": "左贡县",
+ "value": "540327"
+ },
+ {
+ "label": "芒康县",
+ "value": "540328"
+ },
+ {
+ "label": "洛隆县",
+ "value": "540329"
+ },
+ {
+ "label": "边坝县",
+ "value": "540330"
+ }
+ ],
+ [{
+ "label": "巴宜区",
+ "value": "540402"
+ },
+ {
+ "label": "工布江达县",
+ "value": "540421"
+ },
+ {
+ "label": "米林县",
+ "value": "540422"
+ },
+ {
+ "label": "墨脱县",
+ "value": "540423"
+ },
+ {
+ "label": "波密县",
+ "value": "540424"
+ },
+ {
+ "label": "察隅县",
+ "value": "540425"
+ },
+ {
+ "label": "朗县",
+ "value": "540426"
+ }
+ ],
+ [{
+ "label": "乃东区",
+ "value": "540502"
+ },
+ {
+ "label": "扎囊县",
+ "value": "540521"
+ },
+ {
+ "label": "贡嘎县",
+ "value": "540522"
+ },
+ {
+ "label": "桑日县",
+ "value": "540523"
+ },
+ {
+ "label": "琼结县",
+ "value": "540524"
+ },
+ {
+ "label": "曲松县",
+ "value": "540525"
+ },
+ {
+ "label": "措美县",
+ "value": "540526"
+ },
+ {
+ "label": "洛扎县",
+ "value": "540527"
+ },
+ {
+ "label": "加查县",
+ "value": "540528"
+ },
+ {
+ "label": "隆子县",
+ "value": "540529"
+ },
+ {
+ "label": "错那县",
+ "value": "540530"
+ },
+ {
+ "label": "浪卡子县",
+ "value": "540531"
+ }
+ ],
+ [{
+ "label": "那曲县",
+ "value": "542421"
+ },
+ {
+ "label": "嘉黎县",
+ "value": "542422"
+ },
+ {
+ "label": "比如县",
+ "value": "542423"
+ },
+ {
+ "label": "聂荣县",
+ "value": "542424"
+ },
+ {
+ "label": "安多县",
+ "value": "542425"
+ },
+ {
+ "label": "申扎县",
+ "value": "542426"
+ },
+ {
+ "label": "索县",
+ "value": "542427"
+ },
+ {
+ "label": "班戈县",
+ "value": "542428"
+ },
+ {
+ "label": "巴青县",
+ "value": "542429"
+ },
+ {
+ "label": "尼玛县",
+ "value": "542430"
+ },
+ {
+ "label": "双湖县",
+ "value": "542431"
+ }
+ ],
+ [{
+ "label": "普兰县",
+ "value": "542521"
+ },
+ {
+ "label": "札达县",
+ "value": "542522"
+ },
+ {
+ "label": "噶尔县",
+ "value": "542523"
+ },
+ {
+ "label": "日土县",
+ "value": "542524"
+ },
+ {
+ "label": "革吉县",
+ "value": "542525"
+ },
+ {
+ "label": "改则县",
+ "value": "542526"
+ },
+ {
+ "label": "措勤县",
+ "value": "542527"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "新城区",
+ "value": "610102"
+ },
+ {
+ "label": "碑林区",
+ "value": "610103"
+ },
+ {
+ "label": "莲湖区",
+ "value": "610104"
+ },
+ {
+ "label": "灞桥区",
+ "value": "610111"
+ },
+ {
+ "label": "未央区",
+ "value": "610112"
+ },
+ {
+ "label": "雁塔区",
+ "value": "610113"
+ },
+ {
+ "label": "阎良区",
+ "value": "610114"
+ },
+ {
+ "label": "临潼区",
+ "value": "610115"
+ },
+ {
+ "label": "长安区",
+ "value": "610116"
+ },
+ {
+ "label": "高陵区",
+ "value": "610117"
+ },
+ {
+ "label": "鄠邑区",
+ "value": "610118"
+ },
+ {
+ "label": "蓝田县",
+ "value": "610122"
+ },
+ {
+ "label": "周至县",
+ "value": "610124"
+ }
+ ],
+ [{
+ "label": "王益区",
+ "value": "610202"
+ },
+ {
+ "label": "印台区",
+ "value": "610203"
+ },
+ {
+ "label": "耀州区",
+ "value": "610204"
+ },
+ {
+ "label": "宜君县",
+ "value": "610222"
+ }
+ ],
+ [{
+ "label": "渭滨区",
+ "value": "610302"
+ },
+ {
+ "label": "金台区",
+ "value": "610303"
+ },
+ {
+ "label": "陈仓区",
+ "value": "610304"
+ },
+ {
+ "label": "凤翔县",
+ "value": "610322"
+ },
+ {
+ "label": "岐山县",
+ "value": "610323"
+ },
+ {
+ "label": "扶风县",
+ "value": "610324"
+ },
+ {
+ "label": "眉县",
+ "value": "610326"
+ },
+ {
+ "label": "陇县",
+ "value": "610327"
+ },
+ {
+ "label": "千阳县",
+ "value": "610328"
+ },
+ {
+ "label": "麟游县",
+ "value": "610329"
+ },
+ {
+ "label": "凤县",
+ "value": "610330"
+ },
+ {
+ "label": "太白县",
+ "value": "610331"
+ }
+ ],
+ [{
+ "label": "秦都区",
+ "value": "610402"
+ },
+ {
+ "label": "杨陵区",
+ "value": "610403"
+ },
+ {
+ "label": "渭城区",
+ "value": "610404"
+ },
+ {
+ "label": "三原县",
+ "value": "610422"
+ },
+ {
+ "label": "泾阳县",
+ "value": "610423"
+ },
+ {
+ "label": "乾县",
+ "value": "610424"
+ },
+ {
+ "label": "礼泉县",
+ "value": "610425"
+ },
+ {
+ "label": "永寿县",
+ "value": "610426"
+ },
+ {
+ "label": "彬县",
+ "value": "610427"
+ },
+ {
+ "label": "长武县",
+ "value": "610428"
+ },
+ {
+ "label": "旬邑县",
+ "value": "610429"
+ },
+ {
+ "label": "淳化县",
+ "value": "610430"
+ },
+ {
+ "label": "武功县",
+ "value": "610431"
+ },
+ {
+ "label": "兴平市",
+ "value": "610481"
+ }
+ ],
+ [{
+ "label": "临渭区",
+ "value": "610502"
+ },
+ {
+ "label": "华州区",
+ "value": "610503"
+ },
+ {
+ "label": "潼关县",
+ "value": "610522"
+ },
+ {
+ "label": "大荔县",
+ "value": "610523"
+ },
+ {
+ "label": "合阳县",
+ "value": "610524"
+ },
+ {
+ "label": "澄城县",
+ "value": "610525"
+ },
+ {
+ "label": "蒲城县",
+ "value": "610526"
+ },
+ {
+ "label": "白水县",
+ "value": "610527"
+ },
+ {
+ "label": "富平县",
+ "value": "610528"
+ },
+ {
+ "label": "韩城市",
+ "value": "610581"
+ },
+ {
+ "label": "华阴市",
+ "value": "610582"
+ }
+ ],
+ [{
+ "label": "宝塔区",
+ "value": "610602"
+ },
+ {
+ "label": "安塞区",
+ "value": "610603"
+ },
+ {
+ "label": "延长县",
+ "value": "610621"
+ },
+ {
+ "label": "延川县",
+ "value": "610622"
+ },
+ {
+ "label": "子长县",
+ "value": "610623"
+ },
+ {
+ "label": "志丹县",
+ "value": "610625"
+ },
+ {
+ "label": "吴起县",
+ "value": "610626"
+ },
+ {
+ "label": "甘泉县",
+ "value": "610627"
+ },
+ {
+ "label": "富县",
+ "value": "610628"
+ },
+ {
+ "label": "洛川县",
+ "value": "610629"
+ },
+ {
+ "label": "宜川县",
+ "value": "610630"
+ },
+ {
+ "label": "黄龙县",
+ "value": "610631"
+ },
+ {
+ "label": "黄陵县",
+ "value": "610632"
+ }
+ ],
+ [{
+ "label": "汉台区",
+ "value": "610702"
+ },
+ {
+ "label": "南郑区",
+ "value": "610703"
+ },
+ {
+ "label": "城固县",
+ "value": "610722"
+ },
+ {
+ "label": "洋县",
+ "value": "610723"
+ },
+ {
+ "label": "西乡县",
+ "value": "610724"
+ },
+ {
+ "label": "勉县",
+ "value": "610725"
+ },
+ {
+ "label": "宁强县",
+ "value": "610726"
+ },
+ {
+ "label": "略阳县",
+ "value": "610727"
+ },
+ {
+ "label": "镇巴县",
+ "value": "610728"
+ },
+ {
+ "label": "留坝县",
+ "value": "610729"
+ },
+ {
+ "label": "佛坪县",
+ "value": "610730"
+ }
+ ],
+ [{
+ "label": "榆阳区",
+ "value": "610802"
+ },
+ {
+ "label": "横山区",
+ "value": "610803"
+ },
+ {
+ "label": "府谷县",
+ "value": "610822"
+ },
+ {
+ "label": "靖边县",
+ "value": "610824"
+ },
+ {
+ "label": "定边县",
+ "value": "610825"
+ },
+ {
+ "label": "绥德县",
+ "value": "610826"
+ },
+ {
+ "label": "米脂县",
+ "value": "610827"
+ },
+ {
+ "label": "佳县",
+ "value": "610828"
+ },
+ {
+ "label": "吴堡县",
+ "value": "610829"
+ },
+ {
+ "label": "清涧县",
+ "value": "610830"
+ },
+ {
+ "label": "子洲县",
+ "value": "610831"
+ },
+ {
+ "label": "神木市",
+ "value": "610881"
+ }
+ ],
+ [{
+ "label": "汉滨区",
+ "value": "610902"
+ },
+ {
+ "label": "汉阴县",
+ "value": "610921"
+ },
+ {
+ "label": "石泉县",
+ "value": "610922"
+ },
+ {
+ "label": "宁陕县",
+ "value": "610923"
+ },
+ {
+ "label": "紫阳县",
+ "value": "610924"
+ },
+ {
+ "label": "岚皋县",
+ "value": "610925"
+ },
+ {
+ "label": "平利县",
+ "value": "610926"
+ },
+ {
+ "label": "镇坪县",
+ "value": "610927"
+ },
+ {
+ "label": "旬阳县",
+ "value": "610928"
+ },
+ {
+ "label": "白河县",
+ "value": "610929"
+ }
+ ],
+ [{
+ "label": "商州区",
+ "value": "611002"
+ },
+ {
+ "label": "洛南县",
+ "value": "611021"
+ },
+ {
+ "label": "丹凤县",
+ "value": "611022"
+ },
+ {
+ "label": "商南县",
+ "value": "611023"
+ },
+ {
+ "label": "山阳县",
+ "value": "611024"
+ },
+ {
+ "label": "镇安县",
+ "value": "611025"
+ },
+ {
+ "label": "柞水县",
+ "value": "611026"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "城关区",
+ "value": "620102"
+ },
+ {
+ "label": "七里河区",
+ "value": "620103"
+ },
+ {
+ "label": "西固区",
+ "value": "620104"
+ },
+ {
+ "label": "安宁区",
+ "value": "620105"
+ },
+ {
+ "label": "红古区",
+ "value": "620111"
+ },
+ {
+ "label": "永登县",
+ "value": "620121"
+ },
+ {
+ "label": "皋兰县",
+ "value": "620122"
+ },
+ {
+ "label": "榆中县",
+ "value": "620123"
+ },
+ {
+ "label": "兰州新区",
+ "value": "620171"
+ }
+ ],
+ [{
+ "label": "嘉峪关市",
+ "value": "620201"
+ }],
+ [{
+ "label": "金川区",
+ "value": "620302"
+ },
+ {
+ "label": "永昌县",
+ "value": "620321"
+ }
+ ],
+ [{
+ "label": "白银区",
+ "value": "620402"
+ },
+ {
+ "label": "平川区",
+ "value": "620403"
+ },
+ {
+ "label": "靖远县",
+ "value": "620421"
+ },
+ {
+ "label": "会宁县",
+ "value": "620422"
+ },
+ {
+ "label": "景泰县",
+ "value": "620423"
+ }
+ ],
+ [{
+ "label": "秦州区",
+ "value": "620502"
+ },
+ {
+ "label": "麦积区",
+ "value": "620503"
+ },
+ {
+ "label": "清水县",
+ "value": "620521"
+ },
+ {
+ "label": "秦安县",
+ "value": "620522"
+ },
+ {
+ "label": "甘谷县",
+ "value": "620523"
+ },
+ {
+ "label": "武山县",
+ "value": "620524"
+ },
+ {
+ "label": "张家川回族自治县",
+ "value": "620525"
+ }
+ ],
+ [{
+ "label": "凉州区",
+ "value": "620602"
+ },
+ {
+ "label": "民勤县",
+ "value": "620621"
+ },
+ {
+ "label": "古浪县",
+ "value": "620622"
+ },
+ {
+ "label": "天祝藏族自治县",
+ "value": "620623"
+ }
+ ],
+ [{
+ "label": "甘州区",
+ "value": "620702"
+ },
+ {
+ "label": "肃南裕固族自治县",
+ "value": "620721"
+ },
+ {
+ "label": "民乐县",
+ "value": "620722"
+ },
+ {
+ "label": "临泽县",
+ "value": "620723"
+ },
+ {
+ "label": "高台县",
+ "value": "620724"
+ },
+ {
+ "label": "山丹县",
+ "value": "620725"
+ }
+ ],
+ [{
+ "label": "崆峒区",
+ "value": "620802"
+ },
+ {
+ "label": "泾川县",
+ "value": "620821"
+ },
+ {
+ "label": "灵台县",
+ "value": "620822"
+ },
+ {
+ "label": "崇信县",
+ "value": "620823"
+ },
+ {
+ "label": "华亭县",
+ "value": "620824"
+ },
+ {
+ "label": "庄浪县",
+ "value": "620825"
+ },
+ {
+ "label": "静宁县",
+ "value": "620826"
+ },
+ {
+ "label": "平凉工业园区",
+ "value": "620871"
+ }
+ ],
+ [{
+ "label": "肃州区",
+ "value": "620902"
+ },
+ {
+ "label": "金塔县",
+ "value": "620921"
+ },
+ {
+ "label": "瓜州县",
+ "value": "620922"
+ },
+ {
+ "label": "肃北蒙古族自治县",
+ "value": "620923"
+ },
+ {
+ "label": "阿克塞哈萨克族自治县",
+ "value": "620924"
+ },
+ {
+ "label": "玉门市",
+ "value": "620981"
+ },
+ {
+ "label": "敦煌市",
+ "value": "620982"
+ }
+ ],
+ [{
+ "label": "西峰区",
+ "value": "621002"
+ },
+ {
+ "label": "庆城县",
+ "value": "621021"
+ },
+ {
+ "label": "环县",
+ "value": "621022"
+ },
+ {
+ "label": "华池县",
+ "value": "621023"
+ },
+ {
+ "label": "合水县",
+ "value": "621024"
+ },
+ {
+ "label": "正宁县",
+ "value": "621025"
+ },
+ {
+ "label": "宁县",
+ "value": "621026"
+ },
+ {
+ "label": "镇原县",
+ "value": "621027"
+ }
+ ],
+ [{
+ "label": "安定区",
+ "value": "621102"
+ },
+ {
+ "label": "通渭县",
+ "value": "621121"
+ },
+ {
+ "label": "陇西县",
+ "value": "621122"
+ },
+ {
+ "label": "渭源县",
+ "value": "621123"
+ },
+ {
+ "label": "临洮县",
+ "value": "621124"
+ },
+ {
+ "label": "漳县",
+ "value": "621125"
+ },
+ {
+ "label": "岷县",
+ "value": "621126"
+ }
+ ],
+ [{
+ "label": "武都区",
+ "value": "621202"
+ },
+ {
+ "label": "成县",
+ "value": "621221"
+ },
+ {
+ "label": "文县",
+ "value": "621222"
+ },
+ {
+ "label": "宕昌县",
+ "value": "621223"
+ },
+ {
+ "label": "康县",
+ "value": "621224"
+ },
+ {
+ "label": "西和县",
+ "value": "621225"
+ },
+ {
+ "label": "礼县",
+ "value": "621226"
+ },
+ {
+ "label": "徽县",
+ "value": "621227"
+ },
+ {
+ "label": "两当县",
+ "value": "621228"
+ }
+ ],
+ [{
+ "label": "临夏市",
+ "value": "622901"
+ },
+ {
+ "label": "临夏县",
+ "value": "622921"
+ },
+ {
+ "label": "康乐县",
+ "value": "622922"
+ },
+ {
+ "label": "永靖县",
+ "value": "622923"
+ },
+ {
+ "label": "广河县",
+ "value": "622924"
+ },
+ {
+ "label": "和政县",
+ "value": "622925"
+ },
+ {
+ "label": "东乡族自治县",
+ "value": "622926"
+ },
+ {
+ "label": "积石山保安族东乡族撒拉族自治县",
+ "value": "622927"
+ }
+ ],
+ [{
+ "label": "合作市",
+ "value": "623001"
+ },
+ {
+ "label": "临潭县",
+ "value": "623021"
+ },
+ {
+ "label": "卓尼县",
+ "value": "623022"
+ },
+ {
+ "label": "舟曲县",
+ "value": "623023"
+ },
+ {
+ "label": "迭部县",
+ "value": "623024"
+ },
+ {
+ "label": "玛曲县",
+ "value": "623025"
+ },
+ {
+ "label": "碌曲县",
+ "value": "623026"
+ },
+ {
+ "label": "夏河县",
+ "value": "623027"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "城东区",
+ "value": "630102"
+ },
+ {
+ "label": "城中区",
+ "value": "630103"
+ },
+ {
+ "label": "城西区",
+ "value": "630104"
+ },
+ {
+ "label": "城北区",
+ "value": "630105"
+ },
+ {
+ "label": "大通回族土族自治县",
+ "value": "630121"
+ },
+ {
+ "label": "湟中县",
+ "value": "630122"
+ },
+ {
+ "label": "湟源县",
+ "value": "630123"
+ }
+ ],
+ [{
+ "label": "乐都区",
+ "value": "630202"
+ },
+ {
+ "label": "平安区",
+ "value": "630203"
+ },
+ {
+ "label": "民和回族土族自治县",
+ "value": "630222"
+ },
+ {
+ "label": "互助土族自治县",
+ "value": "630223"
+ },
+ {
+ "label": "化隆回族自治县",
+ "value": "630224"
+ },
+ {
+ "label": "循化撒拉族自治县",
+ "value": "630225"
+ }
+ ],
+ [{
+ "label": "门源回族自治县",
+ "value": "632221"
+ },
+ {
+ "label": "祁连县",
+ "value": "632222"
+ },
+ {
+ "label": "海晏县",
+ "value": "632223"
+ },
+ {
+ "label": "刚察县",
+ "value": "632224"
+ }
+ ],
+ [{
+ "label": "同仁县",
+ "value": "632321"
+ },
+ {
+ "label": "尖扎县",
+ "value": "632322"
+ },
+ {
+ "label": "泽库县",
+ "value": "632323"
+ },
+ {
+ "label": "河南蒙古族自治县",
+ "value": "632324"
+ }
+ ],
+ [{
+ "label": "共和县",
+ "value": "632521"
+ },
+ {
+ "label": "同德县",
+ "value": "632522"
+ },
+ {
+ "label": "贵德县",
+ "value": "632523"
+ },
+ {
+ "label": "兴海县",
+ "value": "632524"
+ },
+ {
+ "label": "贵南县",
+ "value": "632525"
+ }
+ ],
+ [{
+ "label": "玛沁县",
+ "value": "632621"
+ },
+ {
+ "label": "班玛县",
+ "value": "632622"
+ },
+ {
+ "label": "甘德县",
+ "value": "632623"
+ },
+ {
+ "label": "达日县",
+ "value": "632624"
+ },
+ {
+ "label": "久治县",
+ "value": "632625"
+ },
+ {
+ "label": "玛多县",
+ "value": "632626"
+ }
+ ],
+ [{
+ "label": "玉树市",
+ "value": "632701"
+ },
+ {
+ "label": "杂多县",
+ "value": "632722"
+ },
+ {
+ "label": "称多县",
+ "value": "632723"
+ },
+ {
+ "label": "治多县",
+ "value": "632724"
+ },
+ {
+ "label": "囊谦县",
+ "value": "632725"
+ },
+ {
+ "label": "曲麻莱县",
+ "value": "632726"
+ }
+ ],
+ [{
+ "label": "格尔木市",
+ "value": "632801"
+ },
+ {
+ "label": "德令哈市",
+ "value": "632802"
+ },
+ {
+ "label": "乌兰县",
+ "value": "632821"
+ },
+ {
+ "label": "都兰县",
+ "value": "632822"
+ },
+ {
+ "label": "天峻县",
+ "value": "632823"
+ },
+ {
+ "label": "大柴旦行政委员会",
+ "value": "632857"
+ },
+ {
+ "label": "冷湖行政委员会",
+ "value": "632858"
+ },
+ {
+ "label": "茫崖行政委员会",
+ "value": "632859"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "兴庆区",
+ "value": "640104"
+ },
+ {
+ "label": "西夏区",
+ "value": "640105"
+ },
+ {
+ "label": "金凤区",
+ "value": "640106"
+ },
+ {
+ "label": "永宁县",
+ "value": "640121"
+ },
+ {
+ "label": "贺兰县",
+ "value": "640122"
+ },
+ {
+ "label": "灵武市",
+ "value": "640181"
+ }
+ ],
+ [{
+ "label": "大武口区",
+ "value": "640202"
+ },
+ {
+ "label": "惠农区",
+ "value": "640205"
+ },
+ {
+ "label": "平罗县",
+ "value": "640221"
+ }
+ ],
+ [{
+ "label": "利通区",
+ "value": "640302"
+ },
+ {
+ "label": "红寺堡区",
+ "value": "640303"
+ },
+ {
+ "label": "盐池县",
+ "value": "640323"
+ },
+ {
+ "label": "同心县",
+ "value": "640324"
+ },
+ {
+ "label": "青铜峡市",
+ "value": "640381"
+ }
+ ],
+ [{
+ "label": "原州区",
+ "value": "640402"
+ },
+ {
+ "label": "西吉县",
+ "value": "640422"
+ },
+ {
+ "label": "隆德县",
+ "value": "640423"
+ },
+ {
+ "label": "泾源县",
+ "value": "640424"
+ },
+ {
+ "label": "彭阳县",
+ "value": "640425"
+ }
+ ],
+ [{
+ "label": "沙坡头区",
+ "value": "640502"
+ },
+ {
+ "label": "中宁县",
+ "value": "640521"
+ },
+ {
+ "label": "海原县",
+ "value": "640522"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "天山区",
+ "value": "650102"
+ },
+ {
+ "label": "沙依巴克区",
+ "value": "650103"
+ },
+ {
+ "label": "新市区",
+ "value": "650104"
+ },
+ {
+ "label": "水磨沟区",
+ "value": "650105"
+ },
+ {
+ "label": "头屯河区",
+ "value": "650106"
+ },
+ {
+ "label": "达坂城区",
+ "value": "650107"
+ },
+ {
+ "label": "米东区",
+ "value": "650109"
+ },
+ {
+ "label": "乌鲁木齐县",
+ "value": "650121"
+ },
+ {
+ "label": "乌鲁木齐经济技术开发区",
+ "value": "650171"
+ },
+ {
+ "label": "乌鲁木齐高新技术产业开发区",
+ "value": "650172"
+ }
+ ],
+ [{
+ "label": "独山子区",
+ "value": "650202"
+ },
+ {
+ "label": "克拉玛依区",
+ "value": "650203"
+ },
+ {
+ "label": "白碱滩区",
+ "value": "650204"
+ },
+ {
+ "label": "乌尔禾区",
+ "value": "650205"
+ }
+ ],
+ [{
+ "label": "高昌区",
+ "value": "650402"
+ },
+ {
+ "label": "鄯善县",
+ "value": "650421"
+ },
+ {
+ "label": "托克逊县",
+ "value": "650422"
+ }
+ ],
+ [{
+ "label": "伊州区",
+ "value": "650502"
+ },
+ {
+ "label": "巴里坤哈萨克自治县",
+ "value": "650521"
+ },
+ {
+ "label": "伊吾县",
+ "value": "650522"
+ }
+ ],
+ [{
+ "label": "昌吉市",
+ "value": "652301"
+ },
+ {
+ "label": "阜康市",
+ "value": "652302"
+ },
+ {
+ "label": "呼图壁县",
+ "value": "652323"
+ },
+ {
+ "label": "玛纳斯县",
+ "value": "652324"
+ },
+ {
+ "label": "奇台县",
+ "value": "652325"
+ },
+ {
+ "label": "吉木萨尔县",
+ "value": "652327"
+ },
+ {
+ "label": "木垒哈萨克自治县",
+ "value": "652328"
+ }
+ ],
+ [{
+ "label": "博乐市",
+ "value": "652701"
+ },
+ {
+ "label": "阿拉山口市",
+ "value": "652702"
+ },
+ {
+ "label": "精河县",
+ "value": "652722"
+ },
+ {
+ "label": "温泉县",
+ "value": "652723"
+ }
+ ],
+ [{
+ "label": "库尔勒市",
+ "value": "652801"
+ },
+ {
+ "label": "轮台县",
+ "value": "652822"
+ },
+ {
+ "label": "尉犁县",
+ "value": "652823"
+ },
+ {
+ "label": "若羌县",
+ "value": "652824"
+ },
+ {
+ "label": "且末县",
+ "value": "652825"
+ },
+ {
+ "label": "焉耆回族自治县",
+ "value": "652826"
+ },
+ {
+ "label": "和静县",
+ "value": "652827"
+ },
+ {
+ "label": "和硕县",
+ "value": "652828"
+ },
+ {
+ "label": "博湖县",
+ "value": "652829"
+ },
+ {
+ "label": "库尔勒经济技术开发区",
+ "value": "652871"
+ }
+ ],
+ [{
+ "label": "阿克苏市",
+ "value": "652901"
+ },
+ {
+ "label": "温宿县",
+ "value": "652922"
+ },
+ {
+ "label": "库车县",
+ "value": "652923"
+ },
+ {
+ "label": "沙雅县",
+ "value": "652924"
+ },
+ {
+ "label": "新和县",
+ "value": "652925"
+ },
+ {
+ "label": "拜城县",
+ "value": "652926"
+ },
+ {
+ "label": "乌什县",
+ "value": "652927"
+ },
+ {
+ "label": "阿瓦提县",
+ "value": "652928"
+ },
+ {
+ "label": "柯坪县",
+ "value": "652929"
+ }
+ ],
+ [{
+ "label": "阿图什市",
+ "value": "653001"
+ },
+ {
+ "label": "阿克陶县",
+ "value": "653022"
+ },
+ {
+ "label": "阿合奇县",
+ "value": "653023"
+ },
+ {
+ "label": "乌恰县",
+ "value": "653024"
+ }
+ ],
+ [{
+ "label": "喀什市",
+ "value": "653101"
+ },
+ {
+ "label": "疏附县",
+ "value": "653121"
+ },
+ {
+ "label": "疏勒县",
+ "value": "653122"
+ },
+ {
+ "label": "英吉沙县",
+ "value": "653123"
+ },
+ {
+ "label": "泽普县",
+ "value": "653124"
+ },
+ {
+ "label": "莎车县",
+ "value": "653125"
+ },
+ {
+ "label": "叶城县",
+ "value": "653126"
+ },
+ {
+ "label": "麦盖提县",
+ "value": "653127"
+ },
+ {
+ "label": "岳普湖县",
+ "value": "653128"
+ },
+ {
+ "label": "伽师县",
+ "value": "653129"
+ },
+ {
+ "label": "巴楚县",
+ "value": "653130"
+ },
+ {
+ "label": "塔什库尔干塔吉克自治县",
+ "value": "653131"
+ }
+ ],
+ [{
+ "label": "和田市",
+ "value": "653201"
+ },
+ {
+ "label": "和田县",
+ "value": "653221"
+ },
+ {
+ "label": "墨玉县",
+ "value": "653222"
+ },
+ {
+ "label": "皮山县",
+ "value": "653223"
+ },
+ {
+ "label": "洛浦县",
+ "value": "653224"
+ },
+ {
+ "label": "策勒县",
+ "value": "653225"
+ },
+ {
+ "label": "于田县",
+ "value": "653226"
+ },
+ {
+ "label": "民丰县",
+ "value": "653227"
+ }
+ ],
+ [{
+ "label": "伊宁市",
+ "value": "654002"
+ },
+ {
+ "label": "奎屯市",
+ "value": "654003"
+ },
+ {
+ "label": "霍尔果斯市",
+ "value": "654004"
+ },
+ {
+ "label": "伊宁县",
+ "value": "654021"
+ },
+ {
+ "label": "察布查尔锡伯自治县",
+ "value": "654022"
+ },
+ {
+ "label": "霍城县",
+ "value": "654023"
+ },
+ {
+ "label": "巩留县",
+ "value": "654024"
+ },
+ {
+ "label": "新源县",
+ "value": "654025"
+ },
+ {
+ "label": "昭苏县",
+ "value": "654026"
+ },
+ {
+ "label": "特克斯县",
+ "value": "654027"
+ },
+ {
+ "label": "尼勒克县",
+ "value": "654028"
+ }
+ ],
+ [{
+ "label": "塔城市",
+ "value": "654201"
+ },
+ {
+ "label": "乌苏市",
+ "value": "654202"
+ },
+ {
+ "label": "额敏县",
+ "value": "654221"
+ },
+ {
+ "label": "沙湾县",
+ "value": "654223"
+ },
+ {
+ "label": "托里县",
+ "value": "654224"
+ },
+ {
+ "label": "裕民县",
+ "value": "654225"
+ },
+ {
+ "label": "和布克赛尔蒙古自治县",
+ "value": "654226"
+ }
+ ],
+ [{
+ "label": "阿勒泰市",
+ "value": "654301"
+ },
+ {
+ "label": "布尔津县",
+ "value": "654321"
+ },
+ {
+ "label": "富蕴县",
+ "value": "654322"
+ },
+ {
+ "label": "福海县",
+ "value": "654323"
+ },
+ {
+ "label": "哈巴河县",
+ "value": "654324"
+ },
+ {
+ "label": "青河县",
+ "value": "654325"
+ },
+ {
+ "label": "吉木乃县",
+ "value": "654326"
+ }
+ ],
+ [{
+ "label": "石河子市",
+ "value": "659001"
+ },
+ {
+ "label": "阿拉尔市",
+ "value": "659002"
+ },
+ {
+ "label": "图木舒克市",
+ "value": "659003"
+ },
+ {
+ "label": "五家渠市",
+ "value": "659004"
+ },
+ {
+ "label": "铁门关市",
+ "value": "659006"
+ }
+ ]
+ ],
+ [
+ [{
+ "label": "台北",
+ "value": "660101"
+ }],
+ [{
+ "label": "高雄",
+ "value": "660201"
+ }],
+ [{
+ "label": "基隆",
+ "value": "660301"
+ }],
+ [{
+ "label": "台中",
+ "value": "660401"
+ }],
+ [{
+ "label": "台南",
+ "value": "660501"
+ }],
+ [{
+ "label": "新竹",
+ "value": "660601"
+ }],
+ [{
+ "label": "嘉义",
+ "value": "660701"
+ }],
+ [{
+ "label": "宜兰",
+ "value": "660801"
+ }],
+ [{
+ "label": "桃园",
+ "value": "660901"
+ }],
+ [{
+ "label": "苗栗",
+ "value": "661001"
+ }],
+ [{
+ "label": "彰化",
+ "value": "661101"
+ }],
+ [{
+ "label": "南投",
+ "value": "661201"
+ }],
+ [{
+ "label": "云林",
+ "value": "661301"
+ }],
+ [{
+ "label": "屏东",
+ "value": "661401"
+ }],
+ [{
+ "label": "台东",
+ "value": "661501"
+ }],
+ [{
+ "label": "花莲",
+ "value": "661601"
+ }],
+ [{
+ "label": "澎湖",
+ "value": "661701"
+ }]
+ ],
+ [
+ [{
+ "label": "香港岛",
+ "value": "670101"
+ }],
+ [{
+ "label": "九龙",
+ "value": "670201"
+ }],
+ [{
+ "label": "新界",
+ "value": "670301"
+ }]
+ ],
+ [
+ [{
+ "label": "澳门半岛",
+ "value": "680101"
+ }],
+ [{
+ "label": "氹仔岛",
+ "value": "680201"
+ }],
+ [{
+ "label": "路环岛",
+ "value": "680301"
+ }],
+ [{
+ "label": "路氹城",
+ "value": "680401"
+ }]
+ ]
+]
+export default areaData;
diff --git a/components/mpvue-citypicker/city-data/city.js b/components/mpvue-citypicker/city-data/city.js
new file mode 100644
index 0000000..8c1dc26
--- /dev/null
+++ b/components/mpvue-citypicker/city-data/city.js
@@ -0,0 +1,1503 @@
+/* eslint-disable */
+var cityData = [
+ [{
+ "label": "市辖区",
+ "value": "1101"
+ }],
+ [{
+ "label": "市辖区",
+ "value": "1201"
+ }],
+ [{
+ "label": "石家庄市",
+ "value": "1301"
+ },
+ {
+ "label": "唐山市",
+ "value": "1302"
+ },
+ {
+ "label": "秦皇岛市",
+ "value": "1303"
+ },
+ {
+ "label": "邯郸市",
+ "value": "1304"
+ },
+ {
+ "label": "邢台市",
+ "value": "1305"
+ },
+ {
+ "label": "保定市",
+ "value": "1306"
+ },
+ {
+ "label": "张家口市",
+ "value": "1307"
+ },
+ {
+ "label": "承德市",
+ "value": "1308"
+ },
+ {
+ "label": "沧州市",
+ "value": "1309"
+ },
+ {
+ "label": "廊坊市",
+ "value": "1310"
+ },
+ {
+ "label": "衡水市",
+ "value": "1311"
+ }
+ ],
+ [{
+ "label": "太原市",
+ "value": "1401"
+ },
+ {
+ "label": "大同市",
+ "value": "1402"
+ },
+ {
+ "label": "阳泉市",
+ "value": "1403"
+ },
+ {
+ "label": "长治市",
+ "value": "1404"
+ },
+ {
+ "label": "晋城市",
+ "value": "1405"
+ },
+ {
+ "label": "朔州市",
+ "value": "1406"
+ },
+ {
+ "label": "晋中市",
+ "value": "1407"
+ },
+ {
+ "label": "运城市",
+ "value": "1408"
+ },
+ {
+ "label": "忻州市",
+ "value": "1409"
+ },
+ {
+ "label": "临汾市",
+ "value": "1410"
+ },
+ {
+ "label": "吕梁市",
+ "value": "1411"
+ }
+ ],
+ [{
+ "label": "呼和浩特市",
+ "value": "1501"
+ },
+ {
+ "label": "包头市",
+ "value": "1502"
+ },
+ {
+ "label": "乌海市",
+ "value": "1503"
+ },
+ {
+ "label": "赤峰市",
+ "value": "1504"
+ },
+ {
+ "label": "通辽市",
+ "value": "1505"
+ },
+ {
+ "label": "鄂尔多斯市",
+ "value": "1506"
+ },
+ {
+ "label": "呼伦贝尔市",
+ "value": "1507"
+ },
+ {
+ "label": "巴彦淖尔市",
+ "value": "1508"
+ },
+ {
+ "label": "乌兰察布市",
+ "value": "1509"
+ },
+ {
+ "label": "兴安盟",
+ "value": "1522"
+ },
+ {
+ "label": "锡林郭勒盟",
+ "value": "1525"
+ },
+ {
+ "label": "阿拉善盟",
+ "value": "1529"
+ }
+ ],
+ [{
+ "label": "沈阳市",
+ "value": "2101"
+ },
+ {
+ "label": "大连市",
+ "value": "2102"
+ },
+ {
+ "label": "鞍山市",
+ "value": "2103"
+ },
+ {
+ "label": "抚顺市",
+ "value": "2104"
+ },
+ {
+ "label": "本溪市",
+ "value": "2105"
+ },
+ {
+ "label": "丹东市",
+ "value": "2106"
+ },
+ {
+ "label": "锦州市",
+ "value": "2107"
+ },
+ {
+ "label": "营口市",
+ "value": "2108"
+ },
+ {
+ "label": "阜新市",
+ "value": "2109"
+ },
+ {
+ "label": "辽阳市",
+ "value": "2110"
+ },
+ {
+ "label": "盘锦市",
+ "value": "2111"
+ },
+ {
+ "label": "铁岭市",
+ "value": "2112"
+ },
+ {
+ "label": "朝阳市",
+ "value": "2113"
+ },
+ {
+ "label": "葫芦岛市",
+ "value": "2114"
+ }
+ ],
+ [{
+ "label": "长春市",
+ "value": "2201"
+ },
+ {
+ "label": "吉林市",
+ "value": "2202"
+ },
+ {
+ "label": "四平市",
+ "value": "2203"
+ },
+ {
+ "label": "辽源市",
+ "value": "2204"
+ },
+ {
+ "label": "通化市",
+ "value": "2205"
+ },
+ {
+ "label": "白山市",
+ "value": "2206"
+ },
+ {
+ "label": "松原市",
+ "value": "2207"
+ },
+ {
+ "label": "白城市",
+ "value": "2208"
+ },
+ {
+ "label": "延边朝鲜族自治州",
+ "value": "2224"
+ }
+ ],
+ [{
+ "label": "哈尔滨市",
+ "value": "2301"
+ },
+ {
+ "label": "齐齐哈尔市",
+ "value": "2302"
+ },
+ {
+ "label": "鸡西市",
+ "value": "2303"
+ },
+ {
+ "label": "鹤岗市",
+ "value": "2304"
+ },
+ {
+ "label": "双鸭山市",
+ "value": "2305"
+ },
+ {
+ "label": "大庆市",
+ "value": "2306"
+ },
+ {
+ "label": "伊春市",
+ "value": "2307"
+ },
+ {
+ "label": "佳木斯市",
+ "value": "2308"
+ },
+ {
+ "label": "七台河市",
+ "value": "2309"
+ },
+ {
+ "label": "牡丹江市",
+ "value": "2310"
+ },
+ {
+ "label": "黑河市",
+ "value": "2311"
+ },
+ {
+ "label": "绥化市",
+ "value": "2312"
+ },
+ {
+ "label": "大兴安岭地区",
+ "value": "2327"
+ }
+ ],
+ [{
+ "label": "市辖区",
+ "value": "3101"
+ }],
+ [{
+ "label": "南京市",
+ "value": "3201"
+ },
+ {
+ "label": "无锡市",
+ "value": "3202"
+ },
+ {
+ "label": "徐州市",
+ "value": "3203"
+ },
+ {
+ "label": "常州市",
+ "value": "3204"
+ },
+ {
+ "label": "苏州市",
+ "value": "3205"
+ },
+ {
+ "label": "南通市",
+ "value": "3206"
+ },
+ {
+ "label": "连云港市",
+ "value": "3207"
+ },
+ {
+ "label": "淮安市",
+ "value": "3208"
+ },
+ {
+ "label": "盐城市",
+ "value": "3209"
+ },
+ {
+ "label": "扬州市",
+ "value": "3210"
+ },
+ {
+ "label": "镇江市",
+ "value": "3211"
+ },
+ {
+ "label": "泰州市",
+ "value": "3212"
+ },
+ {
+ "label": "宿迁市",
+ "value": "3213"
+ }
+ ],
+ [{
+ "label": "杭州市",
+ "value": "3301"
+ },
+ {
+ "label": "宁波市",
+ "value": "3302"
+ },
+ {
+ "label": "温州市",
+ "value": "3303"
+ },
+ {
+ "label": "嘉兴市",
+ "value": "3304"
+ },
+ {
+ "label": "湖州市",
+ "value": "3305"
+ },
+ {
+ "label": "绍兴市",
+ "value": "3306"
+ },
+ {
+ "label": "金华市",
+ "value": "3307"
+ },
+ {
+ "label": "衢州市",
+ "value": "3308"
+ },
+ {
+ "label": "舟山市",
+ "value": "3309"
+ },
+ {
+ "label": "台州市",
+ "value": "3310"
+ },
+ {
+ "label": "丽水市",
+ "value": "3311"
+ }
+ ],
+ [{
+ "label": "合肥市",
+ "value": "3401"
+ },
+ {
+ "label": "芜湖市",
+ "value": "3402"
+ },
+ {
+ "label": "蚌埠市",
+ "value": "3403"
+ },
+ {
+ "label": "淮南市",
+ "value": "3404"
+ },
+ {
+ "label": "马鞍山市",
+ "value": "3405"
+ },
+ {
+ "label": "淮北市",
+ "value": "3406"
+ },
+ {
+ "label": "铜陵市",
+ "value": "3407"
+ },
+ {
+ "label": "安庆市",
+ "value": "3408"
+ },
+ {
+ "label": "黄山市",
+ "value": "3410"
+ },
+ {
+ "label": "滁州市",
+ "value": "3411"
+ },
+ {
+ "label": "阜阳市",
+ "value": "3412"
+ },
+ {
+ "label": "宿州市",
+ "value": "3413"
+ },
+ {
+ "label": "六安市",
+ "value": "3415"
+ },
+ {
+ "label": "亳州市",
+ "value": "3416"
+ },
+ {
+ "label": "池州市",
+ "value": "3417"
+ },
+ {
+ "label": "宣城市",
+ "value": "3418"
+ }
+ ],
+ [{
+ "label": "福州市",
+ "value": "3501"
+ },
+ {
+ "label": "厦门市",
+ "value": "3502"
+ },
+ {
+ "label": "莆田市",
+ "value": "3503"
+ },
+ {
+ "label": "三明市",
+ "value": "3504"
+ },
+ {
+ "label": "泉州市",
+ "value": "3505"
+ },
+ {
+ "label": "漳州市",
+ "value": "3506"
+ },
+ {
+ "label": "南平市",
+ "value": "3507"
+ },
+ {
+ "label": "龙岩市",
+ "value": "3508"
+ },
+ {
+ "label": "宁德市",
+ "value": "3509"
+ }
+ ],
+ [{
+ "label": "南昌市",
+ "value": "3601"
+ },
+ {
+ "label": "景德镇市",
+ "value": "3602"
+ },
+ {
+ "label": "萍乡市",
+ "value": "3603"
+ },
+ {
+ "label": "九江市",
+ "value": "3604"
+ },
+ {
+ "label": "新余市",
+ "value": "3605"
+ },
+ {
+ "label": "鹰潭市",
+ "value": "3606"
+ },
+ {
+ "label": "赣州市",
+ "value": "3607"
+ },
+ {
+ "label": "吉安市",
+ "value": "3608"
+ },
+ {
+ "label": "宜春市",
+ "value": "3609"
+ },
+ {
+ "label": "抚州市",
+ "value": "3610"
+ },
+ {
+ "label": "上饶市",
+ "value": "3611"
+ }
+ ],
+ [{
+ "label": "济南市",
+ "value": "3701"
+ },
+ {
+ "label": "青岛市",
+ "value": "3702"
+ },
+ {
+ "label": "淄博市",
+ "value": "3703"
+ },
+ {
+ "label": "枣庄市",
+ "value": "3704"
+ },
+ {
+ "label": "东营市",
+ "value": "3705"
+ },
+ {
+ "label": "烟台市",
+ "value": "3706"
+ },
+ {
+ "label": "潍坊市",
+ "value": "3707"
+ },
+ {
+ "label": "济宁市",
+ "value": "3708"
+ },
+ {
+ "label": "泰安市",
+ "value": "3709"
+ },
+ {
+ "label": "威海市",
+ "value": "3710"
+ },
+ {
+ "label": "日照市",
+ "value": "3711"
+ },
+ {
+ "label": "莱芜市",
+ "value": "3712"
+ },
+ {
+ "label": "临沂市",
+ "value": "3713"
+ },
+ {
+ "label": "德州市",
+ "value": "3714"
+ },
+ {
+ "label": "聊城市",
+ "value": "3715"
+ },
+ {
+ "label": "滨州市",
+ "value": "3716"
+ },
+ {
+ "label": "菏泽市",
+ "value": "3717"
+ }
+ ],
+ [{
+ "label": "郑州市",
+ "value": "4101"
+ },
+ {
+ "label": "开封市",
+ "value": "4102"
+ },
+ {
+ "label": "洛阳市",
+ "value": "4103"
+ },
+ {
+ "label": "平顶山市",
+ "value": "4104"
+ },
+ {
+ "label": "安阳市",
+ "value": "4105"
+ },
+ {
+ "label": "鹤壁市",
+ "value": "4106"
+ },
+ {
+ "label": "新乡市",
+ "value": "4107"
+ },
+ {
+ "label": "焦作市",
+ "value": "4108"
+ },
+ {
+ "label": "濮阳市",
+ "value": "4109"
+ },
+ {
+ "label": "许昌市",
+ "value": "4110"
+ },
+ {
+ "label": "漯河市",
+ "value": "4111"
+ },
+ {
+ "label": "三门峡市",
+ "value": "4112"
+ },
+ {
+ "label": "南阳市",
+ "value": "4113"
+ },
+ {
+ "label": "商丘市",
+ "value": "4114"
+ },
+ {
+ "label": "信阳市",
+ "value": "4115"
+ },
+ {
+ "label": "周口市",
+ "value": "4116"
+ },
+ {
+ "label": "驻马店市",
+ "value": "4117"
+ },
+ {
+ "label": "省直辖县级行政区划",
+ "value": "4190"
+ }
+ ],
+ [{
+ "label": "武汉市",
+ "value": "4201"
+ },
+ {
+ "label": "黄石市",
+ "value": "4202"
+ },
+ {
+ "label": "十堰市",
+ "value": "4203"
+ },
+ {
+ "label": "宜昌市",
+ "value": "4205"
+ },
+ {
+ "label": "襄阳市",
+ "value": "4206"
+ },
+ {
+ "label": "鄂州市",
+ "value": "4207"
+ },
+ {
+ "label": "荆门市",
+ "value": "4208"
+ },
+ {
+ "label": "孝感市",
+ "value": "4209"
+ },
+ {
+ "label": "荆州市",
+ "value": "4210"
+ },
+ {
+ "label": "黄冈市",
+ "value": "4211"
+ },
+ {
+ "label": "咸宁市",
+ "value": "4212"
+ },
+ {
+ "label": "随州市",
+ "value": "4213"
+ },
+ {
+ "label": "恩施土家族苗族自治州",
+ "value": "4228"
+ },
+ {
+ "label": "省直辖县级行政区划",
+ "value": "4290"
+ }
+ ],
+ [{
+ "label": "长沙市",
+ "value": "4301"
+ },
+ {
+ "label": "株洲市",
+ "value": "4302"
+ },
+ {
+ "label": "湘潭市",
+ "value": "4303"
+ },
+ {
+ "label": "衡阳市",
+ "value": "4304"
+ },
+ {
+ "label": "邵阳市",
+ "value": "4305"
+ },
+ {
+ "label": "岳阳市",
+ "value": "4306"
+ },
+ {
+ "label": "常德市",
+ "value": "4307"
+ },
+ {
+ "label": "张家界市",
+ "value": "4308"
+ },
+ {
+ "label": "益阳市",
+ "value": "4309"
+ },
+ {
+ "label": "郴州市",
+ "value": "4310"
+ },
+ {
+ "label": "永州市",
+ "value": "4311"
+ },
+ {
+ "label": "怀化市",
+ "value": "4312"
+ },
+ {
+ "label": "娄底市",
+ "value": "4313"
+ },
+ {
+ "label": "湘西土家族苗族自治州",
+ "value": "4331"
+ }
+ ],
+ [{
+ "label": "广州市",
+ "value": "4401"
+ },
+ {
+ "label": "韶关市",
+ "value": "4402"
+ },
+ {
+ "label": "深圳市",
+ "value": "4403"
+ },
+ {
+ "label": "珠海市",
+ "value": "4404"
+ },
+ {
+ "label": "汕头市",
+ "value": "4405"
+ },
+ {
+ "label": "佛山市",
+ "value": "4406"
+ },
+ {
+ "label": "江门市",
+ "value": "4407"
+ },
+ {
+ "label": "湛江市",
+ "value": "4408"
+ },
+ {
+ "label": "茂名市",
+ "value": "4409"
+ },
+ {
+ "label": "肇庆市",
+ "value": "4412"
+ },
+ {
+ "label": "惠州市",
+ "value": "4413"
+ },
+ {
+ "label": "梅州市",
+ "value": "4414"
+ },
+ {
+ "label": "汕尾市",
+ "value": "4415"
+ },
+ {
+ "label": "河源市",
+ "value": "4416"
+ },
+ {
+ "label": "阳江市",
+ "value": "4417"
+ },
+ {
+ "label": "清远市",
+ "value": "4418"
+ },
+ {
+ "label": "东莞市",
+ "value": "4419"
+ },
+ {
+ "label": "中山市",
+ "value": "4420"
+ },
+ {
+ "label": "潮州市",
+ "value": "4451"
+ },
+ {
+ "label": "揭阳市",
+ "value": "4452"
+ },
+ {
+ "label": "云浮市",
+ "value": "4453"
+ }
+ ],
+ [{
+ "label": "南宁市",
+ "value": "4501"
+ },
+ {
+ "label": "柳州市",
+ "value": "4502"
+ },
+ {
+ "label": "桂林市",
+ "value": "4503"
+ },
+ {
+ "label": "梧州市",
+ "value": "4504"
+ },
+ {
+ "label": "北海市",
+ "value": "4505"
+ },
+ {
+ "label": "防城港市",
+ "value": "4506"
+ },
+ {
+ "label": "钦州市",
+ "value": "4507"
+ },
+ {
+ "label": "贵港市",
+ "value": "4508"
+ },
+ {
+ "label": "玉林市",
+ "value": "4509"
+ },
+ {
+ "label": "百色市",
+ "value": "4510"
+ },
+ {
+ "label": "贺州市",
+ "value": "4511"
+ },
+ {
+ "label": "河池市",
+ "value": "4512"
+ },
+ {
+ "label": "来宾市",
+ "value": "4513"
+ },
+ {
+ "label": "崇左市",
+ "value": "4514"
+ }
+ ],
+ [{
+ "label": "海口市",
+ "value": "4601"
+ },
+ {
+ "label": "三亚市",
+ "value": "4602"
+ },
+ {
+ "label": "三沙市",
+ "value": "4603"
+ },
+ {
+ "label": "儋州市",
+ "value": "4604"
+ },
+ {
+ "label": "省直辖县级行政区划",
+ "value": "4690"
+ }
+ ],
+ [{
+ "label": "市辖区",
+ "value": "5001"
+ },
+ {
+ "label": "县",
+ "value": "5002"
+ }
+ ],
+ [{
+ "label": "成都市",
+ "value": "5101"
+ },
+ {
+ "label": "自贡市",
+ "value": "5103"
+ },
+ {
+ "label": "攀枝花市",
+ "value": "5104"
+ },
+ {
+ "label": "泸州市",
+ "value": "5105"
+ },
+ {
+ "label": "德阳市",
+ "value": "5106"
+ },
+ {
+ "label": "绵阳市",
+ "value": "5107"
+ },
+ {
+ "label": "广元市",
+ "value": "5108"
+ },
+ {
+ "label": "遂宁市",
+ "value": "5109"
+ },
+ {
+ "label": "内江市",
+ "value": "5110"
+ },
+ {
+ "label": "乐山市",
+ "value": "5111"
+ },
+ {
+ "label": "南充市",
+ "value": "5113"
+ },
+ {
+ "label": "眉山市",
+ "value": "5114"
+ },
+ {
+ "label": "宜宾市",
+ "value": "5115"
+ },
+ {
+ "label": "广安市",
+ "value": "5116"
+ },
+ {
+ "label": "达州市",
+ "value": "5117"
+ },
+ {
+ "label": "雅安市",
+ "value": "5118"
+ },
+ {
+ "label": "巴中市",
+ "value": "5119"
+ },
+ {
+ "label": "资阳市",
+ "value": "5120"
+ },
+ {
+ "label": "阿坝藏族羌族自治州",
+ "value": "5132"
+ },
+ {
+ "label": "甘孜藏族自治州",
+ "value": "5133"
+ },
+ {
+ "label": "凉山彝族自治州",
+ "value": "5134"
+ }
+ ],
+ [{
+ "label": "贵阳市",
+ "value": "5201"
+ },
+ {
+ "label": "六盘水市",
+ "value": "5202"
+ },
+ {
+ "label": "遵义市",
+ "value": "5203"
+ },
+ {
+ "label": "安顺市",
+ "value": "5204"
+ },
+ {
+ "label": "毕节市",
+ "value": "5205"
+ },
+ {
+ "label": "铜仁市",
+ "value": "5206"
+ },
+ {
+ "label": "黔西南布依族苗族自治州",
+ "value": "5223"
+ },
+ {
+ "label": "黔东南苗族侗族自治州",
+ "value": "5226"
+ },
+ {
+ "label": "黔南布依族苗族自治州",
+ "value": "5227"
+ }
+ ],
+ [{
+ "label": "昆明市",
+ "value": "5301"
+ },
+ {
+ "label": "曲靖市",
+ "value": "5303"
+ },
+ {
+ "label": "玉溪市",
+ "value": "5304"
+ },
+ {
+ "label": "保山市",
+ "value": "5305"
+ },
+ {
+ "label": "昭通市",
+ "value": "5306"
+ },
+ {
+ "label": "丽江市",
+ "value": "5307"
+ },
+ {
+ "label": "普洱市",
+ "value": "5308"
+ },
+ {
+ "label": "临沧市",
+ "value": "5309"
+ },
+ {
+ "label": "楚雄彝族自治州",
+ "value": "5323"
+ },
+ {
+ "label": "红河哈尼族彝族自治州",
+ "value": "5325"
+ },
+ {
+ "label": "文山壮族苗族自治州",
+ "value": "5326"
+ },
+ {
+ "label": "西双版纳傣族自治州",
+ "value": "5328"
+ },
+ {
+ "label": "大理白族自治州",
+ "value": "5329"
+ },
+ {
+ "label": "德宏傣族景颇族自治州",
+ "value": "5331"
+ },
+ {
+ "label": "怒江傈僳族自治州",
+ "value": "5333"
+ },
+ {
+ "label": "迪庆藏族自治州",
+ "value": "5334"
+ }
+ ],
+ [{
+ "label": "拉萨市",
+ "value": "5401"
+ },
+ {
+ "label": "日喀则市",
+ "value": "5402"
+ },
+ {
+ "label": "昌都市",
+ "value": "5403"
+ },
+ {
+ "label": "林芝市",
+ "value": "5404"
+ },
+ {
+ "label": "山南市",
+ "value": "5405"
+ },
+ {
+ "label": "那曲地区",
+ "value": "5424"
+ },
+ {
+ "label": "阿里地区",
+ "value": "5425"
+ }
+ ],
+ [{
+ "label": "西安市",
+ "value": "6101"
+ },
+ {
+ "label": "铜川市",
+ "value": "6102"
+ },
+ {
+ "label": "宝鸡市",
+ "value": "6103"
+ },
+ {
+ "label": "咸阳市",
+ "value": "6104"
+ },
+ {
+ "label": "渭南市",
+ "value": "6105"
+ },
+ {
+ "label": "延安市",
+ "value": "6106"
+ },
+ {
+ "label": "汉中市",
+ "value": "6107"
+ },
+ {
+ "label": "榆林市",
+ "value": "6108"
+ },
+ {
+ "label": "安康市",
+ "value": "6109"
+ },
+ {
+ "label": "商洛市",
+ "value": "6110"
+ }
+ ],
+ [{
+ "label": "兰州市",
+ "value": "6201"
+ },
+ {
+ "label": "嘉峪关市",
+ "value": "6202"
+ },
+ {
+ "label": "金昌市",
+ "value": "6203"
+ },
+ {
+ "label": "白银市",
+ "value": "6204"
+ },
+ {
+ "label": "天水市",
+ "value": "6205"
+ },
+ {
+ "label": "武威市",
+ "value": "6206"
+ },
+ {
+ "label": "张掖市",
+ "value": "6207"
+ },
+ {
+ "label": "平凉市",
+ "value": "6208"
+ },
+ {
+ "label": "酒泉市",
+ "value": "6209"
+ },
+ {
+ "label": "庆阳市",
+ "value": "6210"
+ },
+ {
+ "label": "定西市",
+ "value": "6211"
+ },
+ {
+ "label": "陇南市",
+ "value": "6212"
+ },
+ {
+ "label": "临夏回族自治州",
+ "value": "6229"
+ },
+ {
+ "label": "甘南藏族自治州",
+ "value": "6230"
+ }
+ ],
+ [{
+ "label": "西宁市",
+ "value": "6301"
+ },
+ {
+ "label": "海东市",
+ "value": "6302"
+ },
+ {
+ "label": "海北藏族自治州",
+ "value": "6322"
+ },
+ {
+ "label": "黄南藏族自治州",
+ "value": "6323"
+ },
+ {
+ "label": "海南藏族自治州",
+ "value": "6325"
+ },
+ {
+ "label": "果洛藏族自治州",
+ "value": "6326"
+ },
+ {
+ "label": "玉树藏族自治州",
+ "value": "6327"
+ },
+ {
+ "label": "海西蒙古族藏族自治州",
+ "value": "6328"
+ }
+ ],
+ [{
+ "label": "银川市",
+ "value": "6401"
+ },
+ {
+ "label": "石嘴山市",
+ "value": "6402"
+ },
+ {
+ "label": "吴忠市",
+ "value": "6403"
+ },
+ {
+ "label": "固原市",
+ "value": "6404"
+ },
+ {
+ "label": "中卫市",
+ "value": "6405"
+ }
+ ],
+ [{
+ "label": "乌鲁木齐市",
+ "value": "6501"
+ },
+ {
+ "label": "克拉玛依市",
+ "value": "6502"
+ },
+ {
+ "label": "吐鲁番市",
+ "value": "6504"
+ },
+ {
+ "label": "哈密市",
+ "value": "6505"
+ },
+ {
+ "label": "昌吉回族自治州",
+ "value": "6523"
+ },
+ {
+ "label": "博尔塔拉蒙古自治州",
+ "value": "6527"
+ },
+ {
+ "label": "巴音郭楞蒙古自治州",
+ "value": "6528"
+ },
+ {
+ "label": "阿克苏地区",
+ "value": "6529"
+ },
+ {
+ "label": "克孜勒苏柯尔克孜自治州",
+ "value": "6530"
+ },
+ {
+ "label": "喀什地区",
+ "value": "6531"
+ },
+ {
+ "label": "和田地区",
+ "value": "6532"
+ },
+ {
+ "label": "伊犁哈萨克自治州",
+ "value": "6540"
+ },
+ {
+ "label": "塔城地区",
+ "value": "6542"
+ },
+ {
+ "label": "阿勒泰地区",
+ "value": "6543"
+ },
+ {
+ "label": "自治区直辖县级行政区划",
+ "value": "6590"
+ }
+ ],
+ [{
+ "label": "台北",
+ "value": "6601"
+ },
+ {
+ "label": "高雄",
+ "value": "6602"
+ },
+ {
+ "label": "基隆",
+ "value": "6603"
+ },
+ {
+ "label": "台中",
+ "value": "6604"
+ },
+ {
+ "label": "台南",
+ "value": "6605"
+ },
+ {
+ "label": "新竹",
+ "value": "6606"
+ },
+ {
+ "label": "嘉义",
+ "value": "6607"
+ },
+ {
+ "label": "宜兰",
+ "value": "6608"
+ },
+ {
+ "label": "桃园",
+ "value": "6609"
+ },
+ {
+ "label": "苗栗",
+ "value": "6610"
+ },
+ {
+ "label": "彰化",
+ "value": "6611"
+ },
+ {
+ "label": "南投",
+ "value": "6612"
+ },
+ {
+ "label": "云林",
+ "value": "6613"
+ },
+ {
+ "label": "屏东",
+ "value": "6614"
+ },
+ {
+ "label": "台东",
+ "value": "6615"
+ },
+ {
+ "label": "花莲",
+ "value": "6616"
+ },
+ {
+ "label": "澎湖",
+ "value": "6617"
+ }
+ ],
+ [{
+ "label": "香港岛",
+ "value": "6701"
+ },
+ {
+ "label": "九龙",
+ "value": "6702"
+ },
+ {
+ "label": "新界",
+ "value": "6703"
+ }
+ ],
+ [{
+ "label": "澳门半岛",
+ "value": "6801"
+ },
+ {
+ "label": "氹仔岛",
+ "value": "6802"
+ },
+ {
+ "label": "路环岛",
+ "value": "6803"
+ },
+ {
+ "label": "路氹城",
+ "value": "6804"
+ }
+ ]
+]
+export default cityData;
diff --git a/components/mpvue-citypicker/city-data/province.js b/components/mpvue-citypicker/city-data/province.js
new file mode 100644
index 0000000..1bd680e
--- /dev/null
+++ b/components/mpvue-citypicker/city-data/province.js
@@ -0,0 +1,139 @@
+/* eslint-disable */
+var provinceData = [{
+ "label": "北京市",
+ "value": "11"
+ },
+ {
+ "label": "天津市",
+ "value": "12"
+ },
+ {
+ "label": "河北省",
+ "value": "13"
+ },
+ {
+ "label": "山西省",
+ "value": "14"
+ },
+ {
+ "label": "内蒙古自治区",
+ "value": "15"
+ },
+ {
+ "label": "辽宁省",
+ "value": "21"
+ },
+ {
+ "label": "吉林省",
+ "value": "22"
+ },
+ {
+ "label": "黑龙江省",
+ "value": "23"
+ },
+ {
+ "label": "上海市",
+ "value": "31"
+ },
+ {
+ "label": "江苏省",
+ "value": "32"
+ },
+ {
+ "label": "浙江省",
+ "value": "33"
+ },
+ {
+ "label": "安徽省",
+ "value": "34"
+ },
+ {
+ "label": "福建省",
+ "value": "35"
+ },
+ {
+ "label": "江西省",
+ "value": "36"
+ },
+ {
+ "label": "山东省",
+ "value": "37"
+ },
+ {
+ "label": "河南省",
+ "value": "41"
+ },
+ {
+ "label": "湖北省",
+ "value": "42"
+ },
+ {
+ "label": "湖南省",
+ "value": "43"
+ },
+ {
+ "label": "广东省",
+ "value": "44"
+ },
+ {
+ "label": "广西壮族自治区",
+ "value": "45"
+ },
+ {
+ "label": "海南省",
+ "value": "46"
+ },
+ {
+ "label": "重庆市",
+ "value": "50"
+ },
+ {
+ "label": "四川省",
+ "value": "51"
+ },
+ {
+ "label": "贵州省",
+ "value": "52"
+ },
+ {
+ "label": "云南省",
+ "value": "53"
+ },
+ {
+ "label": "西藏自治区",
+ "value": "54"
+ },
+ {
+ "label": "陕西省",
+ "value": "61"
+ },
+ {
+ "label": "甘肃省",
+ "value": "62"
+ },
+ {
+ "label": "青海省",
+ "value": "63"
+ },
+ {
+ "label": "宁夏回族自治区",
+ "value": "64"
+ },
+ {
+ "label": "新疆维吾尔自治区",
+ "value": "65"
+ },
+ {
+ "label": "台湾",
+ "value": "66"
+ },
+ {
+ "label": "香港",
+ "value": "67"
+ },
+ {
+ "label": "澳门",
+ "value": "68"
+ }
+]
+export default provinceData;
diff --git a/components/mpvue-citypicker/mpvueCityPicker.vue b/components/mpvue-citypicker/mpvueCityPicker.vue
new file mode 100644
index 0000000..ec02c8b
--- /dev/null
+++ b/components/mpvue-citypicker/mpvueCityPicker.vue
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+
+ {{item.label}}
+
+
+ {{item.label}}
+
+
+ {{item.label}}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/mpvue-echarts/src/echarts.vue b/components/mpvue-echarts/src/echarts.vue
new file mode 100644
index 0000000..e1cbb66
--- /dev/null
+++ b/components/mpvue-echarts/src/echarts.vue
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
diff --git a/components/mpvue-echarts/src/wx-canvas.js b/components/mpvue-echarts/src/wx-canvas.js
new file mode 100644
index 0000000..ef58893
--- /dev/null
+++ b/components/mpvue-echarts/src/wx-canvas.js
@@ -0,0 +1,73 @@
+export default class WxCanvas {
+ constructor(ctx, canvasId) {
+ this.ctx = ctx;
+ this.canvasId = canvasId;
+ this.chart = null;
+
+ WxCanvas.initStyle(ctx);
+ this.initEvent();
+ }
+
+ getContext(contextType) {
+ return contextType === '2d' ? this.ctx : null;
+ }
+
+ setChart(chart) {
+ this.chart = chart;
+ }
+
+ attachEvent() {
+ // noop
+ }
+
+ detachEvent() {
+ // noop
+ }
+
+ static initStyle(ctx) {
+ const styles = ['fillStyle', 'strokeStyle', 'globalAlpha',
+ 'textAlign', 'textBaseAlign', 'shadow', 'lineWidth',
+ 'lineCap', 'lineJoin', 'lineDash', 'miterLimit', 'fontSize'];
+
+ styles.forEach((style) => {
+ Object.defineProperty(ctx, style, {
+ set: (value) => {
+ if ((style !== 'fillStyle' && style !== 'strokeStyle')
+ || (value !== 'none' && value !== null)
+ ) {
+ ctx[`set${style.charAt(0).toUpperCase()}${style.slice(1)}`](value);
+ }
+ },
+ });
+ });
+
+ ctx.createRadialGradient = () => ctx.createCircularGradient(arguments);
+ }
+
+ initEvent() {
+ this.event = {};
+ const eventNames = [{
+ wxName: 'touchStart',
+ ecName: 'mousedown',
+ }, {
+ wxName: 'touchMove',
+ ecName: 'mousemove',
+ }, {
+ wxName: 'touchEnd',
+ ecName: 'mouseup',
+ }, {
+ wxName: 'touchEnd',
+ ecName: 'click',
+ }];
+
+ eventNames.forEach((name) => {
+ this.event[name.wxName] = (e) => {
+ const touch = e.mp.touches[0];
+ this.chart._zr.handler.dispatch(name.ecName, {
+ zrX: name.wxName === 'tap' ? touch.clientX : touch.x,
+ zrY: name.wxName === 'tap' ? touch.clientY : touch.y,
+ });
+ };
+ });
+ }
+}
diff --git a/components/mpvue-picker/mpvuePicker.vue b/components/mpvue-picker/mpvuePicker.vue
new file mode 100644
index 0000000..93397ee
--- /dev/null
+++ b/components/mpvue-picker/mpvuePicker.vue
@@ -0,0 +1,484 @@
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+ {{item.label}}
+
+
+ {{item.label}}
+
+
+
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+ {{item.label}}
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/mpvueGestureLock/gestureLock.js b/components/mpvueGestureLock/gestureLock.js
new file mode 100644
index 0000000..21cf459
--- /dev/null
+++ b/components/mpvueGestureLock/gestureLock.js
@@ -0,0 +1,175 @@
+class GestureLock {
+
+ constructor(containerWidth, cycleRadius) {
+ this.containerWidth = containerWidth; // 容器宽度
+ this.cycleRadius = cycleRadius; // 圆的半径
+
+ this.circleArray = []; // 全部圆的对象数组
+ this.checkPoints = []; // 选中的圆的对象数组
+ this.lineArray = []; // 已激活锁之间的线段数组
+ this.lastCheckPoint = 0; // 最后一个激活的锁
+ this.offsetX = 0; // 容器的 X 偏移
+ this.offsetY = 0; // 容器的 Y 偏移
+ this.activeLine = {}; // 最后一个激活的锁与当前位置之间的线段
+
+ this.windowWidth = wx.getSystemInfoSync().windowWidth; // 窗口大小(用于rpx 和 px 转换)
+
+ this.initCircleArray();
+ }
+
+ // 初始化 画布上的 9个圆
+ initCircleArray() {
+ const cycleMargin = (this.containerWidth - 6 * this.cycleRadius) / 6;
+ let count = 0;
+ for (let i = 0; i < 3; i++) {
+ for (let j = 0; j < 3; j++) {
+ count++;
+ this.circleArray.push({
+ count: count,
+ x: this.rpxTopx((cycleMargin + this.cycleRadius) * (j * 2 + 1)),
+ y: this.rpxTopx((cycleMargin + this.cycleRadius) * (i * 2 + 1)),
+ radius: this.rpxTopx(this.cycleRadius),
+ check: false,
+ style: {
+ left: (cycleMargin + this.cycleRadius) * (j * 2 + 1) - this.cycleRadius + 'rpx',
+ top: (cycleMargin + this.cycleRadius) * (i * 2 + 1) - this.cycleRadius + 'rpx',
+ width: this.cycleRadius * 2 + 'rpx',
+ }
+ });
+ }
+ }
+ }
+
+ onTouchStart(e) {
+ this.setOffset(e);
+ this.checkTouch({
+ x: e.touches[0].pageX - this.offsetX,
+ y: e.touches[0].pageY - this.offsetY
+ });
+ }
+
+ onTouchMove(e) {
+ this.moveDraw(e)
+ }
+
+ onTouchEnd(e) {
+ const checkPoints = this.checkPoints;
+ this.reset();
+ return checkPoints;
+ }
+
+ // 初始化 偏移量
+ setOffset(e) {
+ this.offsetX = e.currentTarget.offsetLeft;
+ this.offsetY = e.currentTarget.offsetTop;
+ }
+
+ // 检测当时 触摸位置是否位于 锁上
+ checkTouch({
+ x,
+ y
+ }) {
+ for (let i = 0; i < this.circleArray.length; i++) {
+ let point = this.circleArray[i];
+ if (this.isPointInCycle(x, y, point.x, point.y, point.radius)) {
+ if (!point.check) {
+ this.checkPoints.push(point.count);
+ if (this.lastCheckPoint != 0) {
+ // 已激活锁之间的线段
+ const line = this.drawLine(this.lastCheckPoint, point);
+ this.lineArray.push(line);
+ }
+ this.lastCheckPoint = point;
+ }
+ point.check = true;
+ return;
+ }
+ }
+ }
+
+ // 画线 - 返回 样式 对象
+ drawLine(start, end) {
+ const width = this.getPointDis(start.x, start.y, end.x, end.y);
+ const rotate = this.getAngle(start, end);
+
+ return {
+ activeLeft: start.x + 'px',
+ activeTop: start.y + 'px',
+ activeWidth: width + 'px',
+ activeRotate: rotate + 'deg'
+ }
+
+ }
+
+ // 获取 画线的 角度
+ getAngle(start, end) {
+ var diff_x = end.x - start.x,
+ diff_y = end.y - start.y;
+ if (diff_x >= 0) {
+ return 360 * Math.atan(diff_y / diff_x) / (2 * Math.PI);
+ } else {
+ return 180 + 360 * Math.atan(diff_y / diff_x) / (2 * Math.PI);
+ }
+ }
+
+ // 判断 当前点是否位于 锁内
+ isPointInCycle(x, y, circleX, circleY, radius) {
+ return (this.getPointDis(x, y, circleX, circleY) < radius) ? true : false;
+ }
+
+ // 获取两点之间距离
+ getPointDis(ax, ay, bx, by) {
+ return Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2));
+ }
+
+ // 移动 绘制
+ moveDraw(e) {
+ // 画经过的圆
+ const x = e.touches[0].pageX - this.offsetX;
+ const y = e.touches[0].pageY - this.offsetY;
+ this.checkTouch({
+ x,
+ y
+ });
+
+ // 画 最后一个激活的锁与当前位置之间的线段
+ this.activeLine = this.drawLine(this.lastCheckPoint, {
+ x,
+ y
+ });
+ }
+
+ // 使 画布 恢复初始状态
+ reset() {
+ this.circleArray.forEach((item) => {
+ item.check = false;
+ });
+ this.checkPoints = [];
+ this.lineArray = [];
+ this.activeLine = {};
+ this.lastCheckPoint = 0;
+ }
+
+
+ // 获取 最后一个激活的锁与当前位置之间的线段
+ getActiveLine() {
+ return this.activeLine;
+ }
+
+ // 获取 圆对象数组
+ getCycleArray() {
+ return this.circleArray;
+ }
+
+ // 获取 已激活锁之间的线段
+ getLineArray() {
+ return this.lineArray;
+ }
+
+ // 将 RPX 转换成 PX
+ rpxTopx(rpx) {
+ return rpx / 750 * this.windowWidth;
+ }
+}
+
+export default GestureLock;
diff --git a/components/mpvueGestureLock/index.vue b/components/mpvueGestureLock/index.vue
new file mode 100644
index 0000000..a2cefdd
--- /dev/null
+++ b/components/mpvueGestureLock/index.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/page-foot/page-foot.vue b/components/page-foot/page-foot.vue
new file mode 100644
index 0000000..1154dbe
--- /dev/null
+++ b/components/page-foot/page-foot.vue
@@ -0,0 +1,38 @@
+
+
+ 感谢{{name}}提供本示例,
+ 我也提交
+
+
+
+
+
diff --git a/components/page-head/page-head.vue b/components/page-head/page-head.vue
new file mode 100644
index 0000000..07ed46d
--- /dev/null
+++ b/components/page-head/page-head.vue
@@ -0,0 +1,16 @@
+
+
+ {{title}}
+
+
+
diff --git a/components/product.vue b/components/product.vue
new file mode 100644
index 0000000..bfa9726
--- /dev/null
+++ b/components/product.vue
@@ -0,0 +1,66 @@
+
+
+
+ {{title}}
+
+ ¥{{originalPrice}}
+ ¥{{favourPrice}}
+ {{tip}}
+
+
+
+
+
+
+
diff --git a/components/tab-nvue/mediaList.vue b/components/tab-nvue/mediaList.vue
new file mode 100644
index 0000000..ea3d224
--- /dev/null
+++ b/components/tab-nvue/mediaList.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+ {{options.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/u-charts/u-charts.js b/components/u-charts/u-charts.js
new file mode 100644
index 0000000..3b1b798
--- /dev/null
+++ b/components/u-charts/u-charts.js
@@ -0,0 +1,5046 @@
+/*
+ * uCharts v1.8.5.20190815
+ * uni-app平台高性能跨全端图表,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)
+ * Copyright (c) 2019 QIUN秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ *
+ * uCharts官方网站
+ * https://www.uCharts.cn
+ *
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ *
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ *
+ */
+
+'use strict';
+
+var config = {
+ yAxisWidth: 15,
+ yAxisSplit: 5,
+ xAxisHeight: 15,
+ xAxisLineHeight: 15,
+ legendHeight: 15,
+ yAxisTitleWidth: 15,
+ padding: [10, 10, 10, 10],
+ pixelRatio: 1,
+ rotate: false,
+ columePadding: 3,
+ fontSize: 13,
+ //dataPointShape: ['diamond', 'circle', 'triangle', 'rect'],
+ dataPointShape: ['circle', 'circle', 'circle', 'circle'],
+ colors: ['#1890ff', '#2fc25b', '#facc14', '#f04864', '#8543e0', '#90ed7d'],
+ pieChartLinePadding: 15,
+ pieChartTextPadding: 5,
+ xAxisTextPadding: 3,
+ titleColor: '#333333',
+ titleFontSize: 20,
+ subtitleColor: '#999999',
+ subtitleFontSize: 15,
+ toolTipPadding: 3,
+ toolTipBackground: '#000000',
+ toolTipOpacity: 0.7,
+ toolTipLineHeight: 20,
+ radarGridCount: 3,
+ radarLabelTextMargin: 15,
+ gaugeLabelTextMargin: 15
+};
+
+let assign;
+if (Object.assign) {
+ assign = Object.assign;
+} else {
+ // 使用polyfill
+ assign = function(target, varArgs) {
+ if (target == null) {
+ throw new TypeError('Cannot convert undefined or null to object');
+ }
+ var to = Object(target);
+ for (var index = 1; index < arguments.length; index++) {
+ var nextSource = arguments[index];
+ if (nextSource != null) {
+ for (var nextKey in nextSource) {
+ if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
+ to[nextKey] = nextSource[nextKey];
+ }
+ }
+ }
+ }
+ return to;
+ }
+}
+
+var util = {
+ toFixed: function toFixed(num, limit) {
+ limit = limit || 2;
+ if (this.isFloat(num)) {
+ num = num.toFixed(limit);
+ }
+ return num;
+ },
+ isFloat: function isFloat(num) {
+ return num % 1 !== 0;
+ },
+ approximatelyEqual: function approximatelyEqual(num1, num2) {
+ return Math.abs(num1 - num2) < 1e-10;
+ },
+ isSameSign: function isSameSign(num1, num2) {
+ return Math.abs(num1) === num1 && Math.abs(num2) === num2 || Math.abs(num1) !== num1 && Math.abs(num2) !== num2;
+ },
+ isSameXCoordinateArea: function isSameXCoordinateArea(p1, p2) {
+ return this.isSameSign(p1.x, p2.x);
+ },
+ isCollision: function isCollision(obj1, obj2) {
+ obj1.end = {};
+ obj1.end.x = obj1.start.x + obj1.width;
+ obj1.end.y = obj1.start.y - obj1.height;
+ obj2.end = {};
+ obj2.end.x = obj2.start.x + obj2.width;
+ obj2.end.y = obj2.start.y - obj2.height;
+ var flag = obj2.start.x > obj1.end.x || obj2.end.x < obj1.start.x || obj2.end.y > obj1.start.y || obj2.start.y < obj1.end.y;
+ return !flag;
+ }
+};
+
+//兼容H5点击事件
+function getH5Offset(e) {
+ e.mp = {
+ changedTouches: []
+ };
+ e.mp.changedTouches.push({
+ x: e.offsetX,
+ y: e.offsetY
+ });
+ return e;
+}
+
+// hex 转 rgba
+function hexToRgb(hexValue, opc) {
+ var rgx = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
+ var hex = hexValue.replace(rgx, function(m, r, g, b) {
+ return r + r + g + g + b + b;
+ });
+ var rgb = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
+ var r = parseInt(rgb[1], 16);
+ var g = parseInt(rgb[2], 16);
+ var b = parseInt(rgb[3], 16);
+ return 'rgba(' + r + ',' + g + ',' + b + ',' + opc + ')';
+}
+
+function findRange(num, type, limit) {
+ if (isNaN(num)) {
+ throw new Error('[uCharts] unvalid series data!');
+ }
+ limit = limit || 10;
+ type = type ? type : 'upper';
+ var multiple = 1;
+ while (limit < 1) {
+ limit *= 10;
+ multiple *= 10;
+ }
+ if (type === 'upper') {
+ num = Math.ceil(num * multiple);
+ } else {
+ num = Math.floor(num * multiple);
+ }
+ while (num % limit !== 0) {
+ if (type === 'upper') {
+ num++;
+ } else {
+ num--;
+ }
+ }
+ return num / multiple;
+}
+
+function calCandleMA(dayArr, nameArr, colorArr, kdata) {
+ let seriesTemp = [];
+ for (let k = 0; k < dayArr.length; k++) {
+ let seriesItem = {
+ data: [],
+ name: nameArr[k],
+ color: colorArr[k]
+ };
+ for (let i = 0, len = kdata.length; i < len; i++) {
+ if (i < dayArr[k]) {
+ seriesItem.data.push(null);
+ continue;
+ }
+ let sum = 0;
+ for (let j = 0; j < dayArr[k]; j++) {
+ sum += kdata[i - j][1];
+ }
+ seriesItem.data.push(+(sum / dayArr[k]).toFixed(3));
+ }
+ seriesTemp.push(seriesItem);
+ }
+ return seriesTemp;
+}
+
+function calValidDistance(distance, chartData, config, opts) {
+ var dataChartAreaWidth = opts.width - opts.area[1] - opts.area[3];
+ var dataChartWidth = chartData.eachSpacing * (opts.chartData.xAxisData.xAxisPoints.length-1);
+ var validDistance = distance;
+ if (distance >= 0) {
+ validDistance = 0;
+ } else if (Math.abs(distance) >= dataChartWidth - dataChartAreaWidth) {
+ validDistance = dataChartAreaWidth - dataChartWidth;
+ }
+ return validDistance;
+}
+
+function isInAngleRange(angle, startAngle, endAngle) {
+ function adjust(angle) {
+ while (angle < 0) {
+ angle += 2 * Math.PI;
+ }
+ while (angle > 2 * Math.PI) {
+ angle -= 2 * Math.PI;
+ }
+ return angle;
+ }
+ angle = adjust(angle);
+ startAngle = adjust(startAngle);
+ endAngle = adjust(endAngle);
+ if (startAngle > endAngle) {
+ endAngle += 2 * Math.PI;
+ if (angle < startAngle) {
+ angle += 2 * Math.PI;
+ }
+ }
+ return angle >= startAngle && angle <= endAngle;
+}
+
+function calRotateTranslate(x, y, h) {
+ var xv = x;
+ var yv = h - y;
+ var transX = xv + (h - yv - xv) / Math.sqrt(2);
+ transX *= -1;
+ var transY = (h - yv) * (Math.sqrt(2) - 1) - (h - yv - xv) / Math.sqrt(2);
+ return {
+ transX: transX,
+ transY: transY
+ };
+}
+
+function createCurveControlPoints(points, i) {
+
+ function isNotMiddlePoint(points, i) {
+ if (points[i - 1] && points[i + 1]) {
+ return points[i].y >= Math.max(points[i - 1].y, points[i + 1].y) || points[i].y <= Math.min(points[i - 1].y,
+ points[
+ i + 1].y);
+ } else {
+ return false;
+ }
+ }
+ var a = 0.2;
+ var b = 0.2;
+ var pAx = null;
+ var pAy = null;
+ var pBx = null;
+ var pBy = null;
+ if (i < 1) {
+ pAx = points[0].x + (points[1].x - points[0].x) * a;
+ pAy = points[0].y + (points[1].y - points[0].y) * a;
+ } else {
+ pAx = points[i].x + (points[i + 1].x - points[i - 1].x) * a;
+ pAy = points[i].y + (points[i + 1].y - points[i - 1].y) * a;
+ }
+
+ if (i > points.length - 3) {
+ var last = points.length - 1;
+ pBx = points[last].x - (points[last].x - points[last - 1].x) * b;
+ pBy = points[last].y - (points[last].y - points[last - 1].y) * b;
+ } else {
+ pBx = points[i + 1].x - (points[i + 2].x - points[i].x) * b;
+ pBy = points[i + 1].y - (points[i + 2].y - points[i].y) * b;
+ }
+ if (isNotMiddlePoint(points, i + 1)) {
+ pBy = points[i + 1].y;
+ }
+ if (isNotMiddlePoint(points, i)) {
+ pAy = points[i].y;
+ }
+ return {
+ ctrA: {
+ x: pAx,
+ y: pAy
+ },
+ ctrB: {
+ x: pBx,
+ y: pBy
+ }
+ };
+}
+
+function convertCoordinateOrigin(x, y, center) {
+ return {
+ x: center.x + x,
+ y: center.y - y
+ };
+}
+
+function avoidCollision(obj, target) {
+ if (target) {
+ // is collision test
+ while (util.isCollision(obj, target)) {
+ if (obj.start.x > 0) {
+ obj.start.y--;
+ } else if (obj.start.x < 0) {
+ obj.start.y++;
+ } else {
+ if (obj.start.y > 0) {
+ obj.start.y++;
+ } else {
+ obj.start.y--;
+ }
+ }
+ }
+ }
+ return obj;
+}
+
+function fillSeries(series, opts, config) {
+ var index = 0;
+ return series.map(function(item) {
+ if (!item.color) {
+ item.color = config.colors[index];
+ index = (index + 1) % config.colors.length;
+ }
+ if (!item.type) {
+ item.type = opts.type;
+ }
+ if (typeof item.show == "undefined") {
+ item.show = true;
+ }
+ if (!item.type) {
+ item.type = opts.type;
+ }
+ if (!item.pointShape) {
+ item.pointShape = "circle";
+ }
+ if (!item.legendShape) {
+ switch (item.type) {
+ case 'line':
+ item.legendShape = "line";
+ break;
+ case 'column':
+ item.legendShape = "rect";
+ break;
+ case 'area':
+ item.legendShape = "triangle";
+ break;
+ default:
+ item.legendShape = "circle";
+ }
+ }
+ return item;
+ });
+}
+
+function getDataRange(minData, maxData) {
+ var limit = 0;
+ var range = maxData - minData;
+ if (range >= 10000) {
+ limit = 1000;
+ } else if (range >= 1000) {
+ limit = 100;
+ } else if (range >= 100) {
+ limit = 10;
+ } else if (range >= 10) {
+ limit = 5;
+ } else if (range >= 1) {
+ limit = 1;
+ } else if (range >= 0.1) {
+ limit = 0.1;
+ } else if (range >= 0.01) {
+ limit = 0.01;
+ } else if (range >= 0.001) {
+ limit = 0.001;
+ } else if (range >= 0.0001) {
+ limit = 0.0001;
+ } else if (range >= 0.00001) {
+ limit = 0.00001;
+ } else {
+ limit = 0.000001;
+ }
+ return {
+ minRange: findRange(minData, 'lower', limit),
+ maxRange: findRange(maxData, 'upper', limit)
+ };
+}
+
+function measureText(text) {
+ var fontSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : config.fontSize;
+ text = String(text);
+ var text = text.split('');
+ var width = 0;
+ for (let i = 0; i < text.length; i++) {
+ let item = text[i];
+ if (/[a-zA-Z]/.test(item)) {
+ width += 7;
+ } else if (/[0-9]/.test(item)) {
+ width += 5.5;
+ } else if (/\./.test(item)) {
+ width += 2.7;
+ } else if (/-/.test(item)) {
+ width += 3.25;
+ } else if (/[\u4e00-\u9fa5]/.test(item)) {
+ width += 10;
+ } else if (/\(|\)/.test(item)) {
+ width += 3.73;
+ } else if (/\s/.test(item)) {
+ width += 2.5;
+ } else if (/%/.test(item)) {
+ width += 8;
+ } else {
+ width += 10;
+ }
+ }
+ return width * fontSize / 10;
+}
+
+function dataCombine(series) {
+ return series.reduce(function(a, b) {
+ return (a.data ? a.data : a).concat(b.data);
+ }, []);
+}
+
+function dataCombineStack(series, len) {
+ var sum = new Array(len);
+ for (var j = 0; j < sum.length; j++) {
+ sum[j] = 0;
+ }
+ for (var i = 0; i < series.length; i++) {
+ for (var j = 0; j < sum.length; j++) {
+ sum[j] += series[i].data[j];
+ }
+ }
+ return series.reduce(function(a, b) {
+ return (a.data ? a.data : a).concat(b.data).concat(sum);
+ }, []);
+}
+
+function getTouches(touches, opts, e) {
+ let x, y;
+ if (touches.clientX) {
+ if (opts.rotate) {
+ y = opts.height - touches.clientX * opts.pixelRatio;
+ x = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pixelRatio / 2) * (opts.pixelRatio - 1)) *
+ opts.pixelRatio;
+ } else {
+ x = touches.clientX * opts.pixelRatio;
+ y = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pixelRatio / 2) * (opts.pixelRatio - 1)) *
+ opts.pixelRatio;
+ }
+ } else {
+ if (opts.rotate) {
+ y = opts.height - touches.x * opts.pixelRatio;
+ x = touches.y * opts.pixelRatio;
+ } else {
+ x = touches.x * opts.pixelRatio;
+ y = touches.y * opts.pixelRatio;
+ }
+ }
+ return {
+ x: x,
+ y: y
+ }
+}
+
+function getSeriesDataItem(series, index) {
+ var data = [];
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ if (item.data[index] !== null && typeof item.data[index] !== 'undefined' && item.show) {
+ let seriesItem = {};
+ seriesItem.color = item.color;
+ seriesItem.type = item.type;
+ seriesItem.style = item.style;
+ seriesItem.pointShape = item.pointShape;
+ seriesItem.disableLegend = item.disableLegend;
+ seriesItem.name = item.name;
+ seriesItem.show = item.show;
+ seriesItem.data = item.format ? item.format(item.data[index]) : item.data[index];
+ data.push(seriesItem);
+ }
+ }
+ return data;
+}
+
+function getMaxTextListLength(list) {
+ var lengthList = list.map(function(item) {
+ return measureText(item);
+ });
+ return Math.max.apply(null, lengthList);
+}
+
+function getRadarCoordinateSeries(length) {
+ var eachAngle = 2 * Math.PI / length;
+ var CoordinateSeries = [];
+ for (var i = 0; i < length; i++) {
+ CoordinateSeries.push(eachAngle * i);
+ }
+
+ return CoordinateSeries.map(function(item) {
+ return -1 * item + Math.PI / 2;
+ });
+}
+
+function getToolTipData(seriesData, calPoints, index, categories) {
+ var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
+
+ var textList = seriesData.map(function(item) {
+ return {
+ text: option.format ? option.format(item, categories[index]) : item.name + ': ' + item.data,
+ color: item.color
+ };
+ });
+ var validCalPoints = [];
+ var offset = {
+ x: 0,
+ y: 0
+ };
+ for (let i = 0; i < calPoints.length; i++) {
+ let points = calPoints[i];
+ if (typeof points[index] !== 'undefined' && points[index] !== null) {
+ validCalPoints.push(points[index]);
+ }
+ }
+ for (let i = 0; i < validCalPoints.length; i++) {
+ let item = validCalPoints[i];
+ offset.x = Math.round(item.x);
+ offset.y += item.y;
+ }
+ offset.y /= validCalPoints.length;
+ return {
+ textList: textList,
+ offset: offset
+ };
+}
+
+function getMixToolTipData(seriesData, calPoints, index, categories) {
+ var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
+ var textList = seriesData.map(function(item) {
+ return {
+ text: option.format ? option.format(item, categories[index]) : item.name + ': ' + item.data,
+ color: item.color,
+ disableLegend: item.disableLegend ? true : false
+ };
+ });
+ textList = textList.filter(function(item) {
+ if (item.disableLegend !== true) {
+ return item;
+ }
+ });
+ var validCalPoints = [];
+ var offset = {
+ x: 0,
+ y: 0
+ };
+ for (let i = 0; i < calPoints.length; i++) {
+ let points = calPoints[i];
+ if (typeof points[index] !== 'undefined' && points[index] !== null) {
+ validCalPoints.push(points[index]);
+ }
+ }
+ for (let i = 0; i < validCalPoints.length; i++) {
+ let item = validCalPoints[i];
+ offset.x = Math.round(item.x);
+ offset.y += item.y;
+ }
+ offset.y /= validCalPoints.length;
+ return {
+ textList: textList,
+ offset: offset
+ };
+}
+
+function getCandleToolTipData(series, seriesData, calPoints, index, categories, extra) {
+ var option = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
+ let upColor = extra.color.upFill;
+ let downColor = extra.color.downFill;
+ //颜色顺序为开盘,收盘,最低,最高
+ let color = [upColor, upColor, downColor, upColor];
+ var textList = [];
+ let text0 = {
+ text: categories[index],
+ color: null
+ };
+ textList.push(text0);
+ seriesData.map(function(item) {
+ if (index == 0 && item.data[1] - item.data[0] < 0) {
+ color[1] = downColor;
+ } else {
+ if (item.data[0] < series[index - 1][1]) {
+ color[0] = downColor;
+ }
+ if (item.data[1] < item.data[0]) {
+ color[1] = downColor;
+ }
+ if (item.data[2] > series[index - 1][1]) {
+ color[2] = upColor;
+ }
+ if (item.data[3] < series[index - 1][1]) {
+ color[3] = downColor;
+ }
+ }
+ let text1 = {
+ text: '开盘:' + item.data[0],
+ color: color[0]
+ };
+ let text2 = {
+ text: '收盘:' + item.data[1],
+ color: color[1]
+ };
+ let text3 = {
+ text: '最低:' + item.data[2],
+ color: color[2]
+ };
+ let text4 = {
+ text: '最高:' + item.data[3],
+ color: color[3]
+ };
+ textList.push(text1, text2, text3, text4);
+ });
+ var validCalPoints = [];
+ var offset = {
+ x: 0,
+ y: 0
+ };
+ for (let i = 0; i < calPoints.length; i++) {
+ let points = calPoints[i];
+ if (typeof points[index] !== 'undefined' && points[index] !== null) {
+ validCalPoints.push(points[index]);
+ }
+ }
+ offset.x = Math.round(validCalPoints[0][0].x);
+ return {
+ textList: textList,
+ offset: offset
+ };
+}
+
+function filterSeries(series) {
+ let tempSeries = [];
+ for (let i = 0; i < series.length; i++) {
+ if (series[i].show == true) {
+ tempSeries.push(series[i])
+ }
+ }
+ return tempSeries;
+}
+
+function findCurrentIndex(currentPoints, xAxisPoints, opts, config) {
+ var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
+ var currentIndex = -1;
+ var spacing = 0;
+ if((opts.type=='line' || opts.type=='area') && opts.xAxis.boundaryGap=='justify'){
+ spacing = opts.chartData.eachSpacing/2;
+ }
+ if (isInExactChartArea(currentPoints, opts, config)) {
+ xAxisPoints.forEach(function(item, index) {
+ if (currentPoints.x + offset + spacing > item) {
+ currentIndex = index;
+ }
+ });
+ }
+ return currentIndex;
+}
+
+function findLegendIndex(currentPoints, legendData, opts) {
+ let currentIndex = -1;
+ if (isInExactLegendArea(currentPoints, legendData.area)) {
+ let points = legendData.points;
+ let index = -1;
+ for (let i = 0, len = points.length; i < len; i++) {
+ let item = points[i];
+ for (let j = 0; j < item.length; j++) {
+ index += 1;
+ let area = item[j]['area'];
+ if (currentPoints.x > area[0] && currentPoints.x < area[2] && currentPoints.y > area[1] && currentPoints.y < area[3]) {
+ currentIndex = index;
+ break;
+ }
+ }
+ }
+ return currentIndex;
+ }
+ return currentIndex;
+}
+
+function isInExactLegendArea(currentPoints, area) {
+ return currentPoints.x > area.start.x && currentPoints.x < area.end.x && currentPoints.y > area.start.y &&
+ currentPoints.y < area.end.y;
+}
+
+function isInExactChartArea(currentPoints, opts, config) {
+ return currentPoints.x < opts.width - opts.area[1] + 10 && currentPoints.x > opts.area[3] -10 && currentPoints.y > opts.area[0] && currentPoints.y < opts.height - opts.area[2];
+}
+
+function findRadarChartCurrentIndex(currentPoints, radarData, count) {
+ var eachAngleArea = 2 * Math.PI / count;
+ var currentIndex = -1;
+ if (isInExactPieChartArea(currentPoints, radarData.center, radarData.radius)) {
+ var fixAngle = function fixAngle(angle) {
+ if (angle < 0) {
+ angle += 2 * Math.PI;
+ }
+ if (angle > 2 * Math.PI) {
+ angle -= 2 * Math.PI;
+ }
+ return angle;
+ };
+
+ var angle = Math.atan2(radarData.center.y - currentPoints.y, currentPoints.x - radarData.center.x);
+ angle = -1 * angle;
+ if (angle < 0) {
+ angle += 2 * Math.PI;
+ }
+
+ var angleList = radarData.angleList.map(function(item) {
+ item = fixAngle(-1 * item);
+
+ return item;
+ });
+
+ angleList.forEach(function(item, index) {
+ var rangeStart = fixAngle(item - eachAngleArea / 2);
+ var rangeEnd = fixAngle(item + eachAngleArea / 2);
+ if (rangeEnd < rangeStart) {
+ rangeEnd += 2 * Math.PI;
+ }
+ if (angle >= rangeStart && angle <= rangeEnd || angle + 2 * Math.PI >= rangeStart && angle + 2 * Math.PI <=
+ rangeEnd) {
+ currentIndex = index;
+ }
+ });
+ }
+
+ return currentIndex;
+}
+
+function findFunnelChartCurrentIndex(currentPoints, funnelData) {
+ var currentIndex = -1;
+ for (var i = 0, len = funnelData.series.length; i < len; i++) {
+ var item = funnelData.series[i];
+ if (currentPoints.x > item.funnelArea[0] && currentPoints.x < item.funnelArea[2] && currentPoints.y > item.funnelArea[1] && currentPoints.y < item.funnelArea[3]) {
+ currentIndex = i;
+ break;
+ }
+ }
+ return currentIndex;
+}
+
+function findWordChartCurrentIndex(currentPoints, wordData) {
+ var currentIndex = -1;
+ for (var i = 0, len = wordData.length; i < len; i++) {
+ var item = wordData[i];
+ if (currentPoints.x > item.area[0] && currentPoints.x < item.area[2] && currentPoints.y > item.area[1] && currentPoints.y < item.area[3]) {
+ currentIndex = i;
+ break;
+ }
+ }
+ return currentIndex;
+}
+
+function findMapChartCurrentIndex(currentPoints, opts) {
+ var currentIndex = -1;
+ var cData=opts.chartData.mapData;
+ var data=opts.series;
+ var tmp=pointToCoordinate(currentPoints.y, currentPoints.x,cData.bounds,cData.scale,cData.xoffset,cData.yoffset);
+ var poi=[tmp.x, tmp.y];
+ for (var i = 0, len = data.length; i < len; i++) {
+ var item = data[i].geometry.coordinates;
+ if(isPoiWithinPoly(poi,item)){
+ currentIndex = i;
+ break;
+ }
+ }
+ return currentIndex;
+}
+
+function findPieChartCurrentIndex(currentPoints, pieData) {
+ var currentIndex = -1;
+ if (isInExactPieChartArea(currentPoints, pieData.center, pieData.radius)) {
+ var angle = Math.atan2(pieData.center.y - currentPoints.y, currentPoints.x - pieData.center.x);
+ angle = -angle;
+ for (var i = 0, len = pieData.series.length; i < len; i++) {
+ var item = pieData.series[i];
+ if (isInAngleRange(angle, item._start_, item._start_ + item._proportion_ * 2 * Math.PI)) {
+ currentIndex = i;
+ break;
+ }
+ }
+ }
+
+ return currentIndex;
+}
+
+function isInExactPieChartArea(currentPoints, center, radius) {
+ return Math.pow(currentPoints.x - center.x, 2) + Math.pow(currentPoints.y - center.y, 2) <= Math.pow(radius, 2);
+}
+
+function splitPoints(points) {
+ var newPoints = [];
+ var items = [];
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ items.push(item);
+ } else {
+ if (items.length) {
+ newPoints.push(items);
+ }
+ items = [];
+ }
+ });
+ if (items.length) {
+ newPoints.push(items);
+ }
+
+ return newPoints;
+}
+
+function calLegendData(series, opts, config, chartData) {
+ let legendData = {
+ area: {
+ start: {
+ x: 0,
+ y: 0
+ },
+ end: {
+ x: 0,
+ y: 0
+ },
+ width: 0,
+ height: 0,
+ wholeWidth: 0,
+ wholeHeight: 0
+ },
+ points: [],
+ widthArr: [],
+ heightArr: []
+ };
+ if (opts.legend.show === false) {
+ chartData.legendData = legendData;
+ return legendData;
+ }
+
+ let padding = opts.legend.padding;
+ let margin = opts.legend.margin;
+ let fontSize = opts.legend.fontSize;
+ let shapeWidth = 15 * opts.pixelRatio;
+ let shapeRight = 5 * opts.pixelRatio;
+ let lineHeight = Math.max(opts.legend.lineHeight * opts.pixelRatio, fontSize);
+ if (opts.legend.position == 'top' || opts.legend.position == 'bottom') {
+ let legendList = [];
+ let widthCount = 0;
+ let widthCountArr = [];
+ let currentRow = [];
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ let itemWidth = shapeWidth + shapeRight + measureText(item.name || 'undefined', fontSize) + opts.legend.itemGap;
+ if (widthCount + itemWidth > opts.width - opts.padding[1] - opts.padding[3]) {
+ legendList.push(currentRow);
+ widthCountArr.push(widthCount - opts.legend.itemGap);
+ widthCount = itemWidth;
+ currentRow = [item];
+ } else {
+ widthCount += itemWidth;
+ currentRow.push(item);
+ }
+ }
+ if (currentRow.length) {
+ legendList.push(currentRow);
+ widthCountArr.push(widthCount - opts.legend.itemGap);
+ legendData.widthArr = widthCountArr;
+ let legendWidth = Math.max.apply(null, widthCountArr);
+ switch (opts.legend.float) {
+ case 'left':
+ legendData.area.start.x = opts.padding[3];
+ legendData.area.end.x = opts.padding[3] + 2 * padding;
+ break;
+ case 'right':
+ legendData.area.start.x = opts.width - opts.padding[1] - legendWidth - 2 * padding;
+ legendData.area.end.x = opts.width - opts.padding[1];
+ break;
+ default:
+ legendData.area.start.x = (opts.width - legendWidth) / 2 - padding;
+ legendData.area.end.x = (opts.width + legendWidth) / 2 + padding;
+ }
+ legendData.area.width = legendWidth + 2 * padding;
+ legendData.area.wholeWidth = legendWidth + 2 * padding;
+ legendData.area.height = legendList.length * lineHeight + 2 * padding;
+ legendData.area.wholeHeight = legendList.length * lineHeight + 2 * padding + 2 * margin;
+ legendData.points = legendList;
+ }
+ } else {
+ let len = series.length;
+ let maxHeight = opts.height - opts.padding[0] - opts.padding[2] - 2 * margin - 2 * padding;
+ let maxLength = Math.min(Math.floor(maxHeight / lineHeight), len);
+ legendData.area.height = maxLength * lineHeight + padding * 2;
+ legendData.area.wholeHeight = maxLength * lineHeight + padding * 2;
+ switch (opts.legend.float) {
+ case 'top':
+ legendData.area.start.y = opts.padding[0] + margin;
+ legendData.area.end.y = opts.padding[0] + margin + legendData.area.height;
+ break;
+ case 'bottom':
+ legendData.area.start.y = opts.height - opts.padding[2] - margin - legendData.area.height;
+ legendData.area.end.y = opts.height - opts.padding[2] - margin;
+ break;
+ default:
+ legendData.area.start.y = (opts.height - legendData.area.height) / 2;
+ legendData.area.end.y = (opts.height + legendData.area.height) / 2;
+ }
+ let lineNum = len % maxLength === 0 ? len / maxLength : Math.floor((len / maxLength) + 1);
+ let currentRow = [];
+ for (let i = 0; i < lineNum; i++) {
+ let temp = series.slice(i * maxLength, i * maxLength + maxLength);
+ currentRow.push(temp);
+ }
+
+ legendData.points = currentRow;
+
+ if (currentRow.length) {
+ for (let i = 0; i < currentRow.length; i++) {
+ let item = currentRow[i];
+ let maxWidth = 0;
+ for (let j = 0; j < item.length; j++) {
+ let itemWidth = shapeWidth + shapeRight + measureText(item[j].name || 'undefined', fontSize) + opts.legend.itemGap;
+ if (itemWidth > maxWidth) {
+ maxWidth = itemWidth;
+ }
+ }
+ legendData.widthArr.push(maxWidth);
+ legendData.heightArr.push(item.length * lineHeight + padding * 2);
+ }
+ let legendWidth = 0
+ for (let i = 0; i < legendData.widthArr.length; i++) {
+ legendWidth += legendData.widthArr[i];
+ }
+ legendData.area.width = legendWidth - opts.legend.itemGap + 2 * padding;
+ legendData.area.wholeWidth = legendData.area.width + padding;
+ }
+ }
+
+ switch (opts.legend.position) {
+ case 'top':
+ legendData.area.start.y = opts.padding[0] + margin;
+ legendData.area.end.y = opts.padding[0] + margin + legendData.area.height;
+ break;
+ case 'bottom':
+ legendData.area.start.y = opts.height - opts.padding[2] - legendData.area.height - margin;
+ legendData.area.end.y = opts.height - opts.padding[2] - margin;
+ break;
+ case 'left':
+ legendData.area.start.x = opts.padding[3];
+ legendData.area.end.x = opts.padding[3] + legendData.area.width;
+ break;
+ case 'right':
+ legendData.area.start.x = opts.width - opts.padding[1] - legendData.area.width;
+ legendData.area.end.x = opts.width - opts.padding[1];
+ break;
+ }
+ chartData.legendData = legendData;
+ return legendData;
+}
+
+function calCategoriesData(categories, opts, config, eachSpacing) {
+ var result = {
+ angle: 0,
+ xAxisHeight: config.xAxisHeight
+ };
+ var categoriesTextLenth = categories.map(function(item) {
+ return measureText(item);
+ });
+ var maxTextLength = Math.max.apply(this, categoriesTextLenth);
+
+ if (opts.xAxis.rotateLabel == true && maxTextLength + 2 * config.xAxisTextPadding > eachSpacing) {
+ result.angle = 45 * Math.PI / 180;
+ result.xAxisHeight = 2 * config.xAxisTextPadding + maxTextLength * Math.sin(result.angle);
+ }
+ return result;
+}
+
+function getRadarDataPoints(angleList, center, radius, series, opts) {
+ var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1;
+
+ var radarOption = opts.extra.radar || {};
+ radarOption.max = radarOption.max || 0;
+ var maxData = Math.max(radarOption.max, Math.max.apply(null, dataCombine(series)));
+
+ var data = [];
+ for (let i = 0; i < series.length; i++) {
+ let each = series[i];
+ let listItem = {};
+ listItem.color = each.color;
+ listItem.data = [];
+ each.data.forEach(function(item, index) {
+ let tmp = {};
+ tmp.angle = angleList[index];
+
+ tmp.proportion = item / maxData;
+ tmp.position = convertCoordinateOrigin(radius * tmp.proportion * process * Math.cos(tmp.angle), radius * tmp.proportion *
+ process * Math.sin(tmp.angle), center);
+ listItem.data.push(tmp);
+ });
+
+ data.push(listItem);
+ }
+
+ return data;
+}
+
+function getPieDataPoints(series, radius) {
+ var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
+
+ var count = 0;
+ var _start_ = 0;
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ item.data = item.data === null ? 0 : item.data;
+ count += item.data;
+ }
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ item.data = item.data === null ? 0 : item.data;
+ if (count === 0) {
+ item._proportion_ = 1 / series.length * process;
+ } else {
+ item._proportion_ = item.data / count * process;
+ }
+ item._radius_ = radius;
+ }
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ item._start_ = _start_;
+ _start_ += 2 * item._proportion_ * Math.PI;
+ }
+
+ return series;
+}
+
+function getFunnelDataPoints(series, radius) {
+ var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
+ series = series.sort(function(a,b){return parseInt(b.data)-parseInt(a.data);});
+ for (let i = 0; i < series.length; i++) {
+ series[i].radius = series[i].data/series[0].data*radius*process;
+ series[i]._proportion_ = series[i].data/series[0].data;
+ }
+ return series.reverse();
+}
+
+function getRoseDataPoints(series, type, minRadius, radius) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ var count = 0;
+ var _start_ = 0;
+
+ var dataArr = [];
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ item.data = item.data === null ? 0 : item.data;
+ count += item.data;
+ dataArr.push(item.data);
+ }
+
+ var minData = Math.min.apply(null, dataArr);
+ var maxData = Math.max.apply(null, dataArr);
+ var radiusLength = radius - minRadius;
+
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ item.data = item.data === null ? 0 : item.data;
+ if (count === 0 || type == 'area') {
+ item._proportion_ = item.data / count * process;
+ item._rose_proportion_ = 1 / series.length * process;
+ } else {
+ item._proportion_ = item.data / count * process;
+ item._rose_proportion_ = item.data / count * process;
+ }
+ item._radius_ = minRadius + radiusLength * ((item.data - minData) / (maxData - minData));
+ }
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ item._start_ = _start_;
+ _start_ += 2 * item._rose_proportion_ * Math.PI;
+ }
+
+ return series;
+}
+
+function getArcbarDataPoints(series, arcbarOption) {
+ var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
+ if (process == 1) {
+ process = 0.999999;
+ }
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ item.data = item.data === null ? 0 : item.data;
+ let totalAngle;
+ if (arcbarOption.type == 'default') {
+ if (arcbarOption.endAngle < arcbarOption.startAngle) {
+ totalAngle = 2 + arcbarOption.endAngle - arcbarOption.startAngle;
+ } else{
+ totalAngle = arcbarOption.startAngle - arcbarOption.endAngle;
+ }
+ } else {
+ totalAngle = 2;
+ }
+ item._proportion_ = totalAngle * item.data * process + arcbarOption.startAngle;
+ if (item._proportion_ >= 2) {
+ item._proportion_ = item._proportion_ % 2;
+ }
+ }
+ return series;
+}
+
+function getGaugeAxisPoints(categories, startAngle, endAngle) {
+ let totalAngle = startAngle - endAngle + 1;
+ let tempStartAngle = startAngle;
+ for (let i = 0; i < categories.length; i++) {
+ categories[i].value = categories[i].value === null ? 0 : categories[i].value;
+ categories[i]._startAngle_ = tempStartAngle;
+ categories[i]._endAngle_ = totalAngle * categories[i].value + startAngle;
+ if (categories[i]._endAngle_ >= 2) {
+ categories[i]._endAngle_ = categories[i]._endAngle_ % 2;
+ }
+ tempStartAngle = categories[i]._endAngle_;
+ }
+ return categories;
+}
+
+function getGaugeDataPoints(series, categories, gaugeOption) {
+ let process = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ item.data = item.data === null ? 0 : item.data;
+ if (gaugeOption.pointer.color == 'auto') {
+ for (let i = 0; i < categories.length; i++) {
+ if (item.data <= categories[i].value) {
+ item.color = categories[i].color;
+ break;
+ }
+ }
+ } else {
+ item.color = gaugeOption.pointer.color;
+ }
+ let totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1;
+ item._endAngle_ = totalAngle * item.data + gaugeOption.startAngle;
+ item._oldAngle_ = gaugeOption.oldAngle;
+ if (gaugeOption.oldAngle < gaugeOption.endAngle) {
+ item._oldAngle_ += 2;
+ }
+ if (item.data >= gaugeOption.oldData) {
+ item._proportion_ = (item._endAngle_ - item._oldAngle_) * process + gaugeOption.oldAngle;
+ } else {
+ item._proportion_ = item._oldAngle_ - (item._oldAngle_ - item._endAngle_) * process;
+ }
+ if (item._proportion_ >= 2) {
+ item._proportion_ = item._proportion_ % 2;
+ }
+ }
+ return series;
+}
+
+function getPieTextMaxLength(series) {
+ series = getPieDataPoints(series);
+ let maxLength = 0;
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ let text = item.format ? item.format(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_ * 100) + '%';
+ maxLength = Math.max(maxLength, measureText(text));
+ }
+
+ return maxLength;
+}
+
+function fixColumeData(points, eachSpacing, columnLen, index, config, opts) {
+ return points.map(function(item) {
+ if (item === null) {
+ return null;
+ }
+ item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / columnLen);
+
+ if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.column.width);
+ }
+ if (item.width <= 0) {
+ item.width = 1;
+ }
+ item.x += (index + 0.5 - columnLen / 2) * item.width;
+ return item;
+ });
+}
+
+function fixColumeMeterData(points, eachSpacing, columnLen, index, config, opts, border) {
+ return points.map(function(item) {
+ if (item === null) {
+ return null;
+ }
+ item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / 2);
+
+ if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.column.width);
+ }
+
+ if (index > 0) {
+ item.width -= 2 * border;
+ }
+ return item;
+ });
+}
+
+function fixColumeStackData(points, eachSpacing, columnLen, index, config, opts, series) {
+
+ return points.map(function(item, indexn) {
+
+ if (item === null) {
+ return null;
+ }
+ item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / 2);
+
+ if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.column.width);
+ }
+ return item;
+ });
+}
+
+function getXAxisPoints(categories, opts, config) {
+ var yAxisTotalWidth = config.yAxisWidth + config.yAxisTitleWidth;
+ var spacingValid = opts.width - opts.area[1] - opts.area[3];
+ var dataCount = opts.enableScroll ? Math.min(opts.xAxis.itemCount, categories.length) : categories.length;
+ if((opts.type=='line' || opts.type=='area') && dataCount>1 && opts.xAxis.boundaryGap=='justify'){
+ dataCount -=1;
+ }
+ var eachSpacing = spacingValid / dataCount;
+
+ var xAxisPoints = [];
+ var startX = opts.area[3];
+ var endX = opts.width - opts.area[1];
+ categories.forEach(function(item, index) {
+ xAxisPoints.push(startX + index * eachSpacing);
+ });
+ if(opts.xAxis.boundaryGap !=='justify'){
+ if (opts.enableScroll === true) {
+ xAxisPoints.push(startX + categories.length * eachSpacing);
+ } else {
+ xAxisPoints.push(endX);
+ }
+ }
+ return {
+ xAxisPoints: xAxisPoints,
+ startX: startX,
+ endX: endX,
+ eachSpacing: eachSpacing
+ };
+}
+
+function getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) {
+ var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1;
+ var points = [];
+ var validHeight = opts.height - opts.area[0] - opts.area[2];
+ data.forEach(function(item, index) {
+ if (item === null) {
+ points.push(null);
+ } else {
+ var cPoints = [];
+ item.forEach(function(items, indexs) {
+ var point = {};
+ point.x = xAxisPoints[index] + Math.round(eachSpacing / 2);
+ var value = items.value || items;
+ var height = validHeight * (value - minRange) / (maxRange - minRange);
+ height *= process;
+ point.y = opts.height - Math.round(height) - opts.area[2];
+ cPoints.push(point);
+ });
+ points.push(cPoints);
+ }
+ });
+
+ return points;
+}
+
+function getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) {
+ var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1;
+ var boundaryGap='center';
+ if (opts.type == 'line'||opts.type == 'area'){
+ boundaryGap=opts.xAxis.boundaryGap;
+ }
+ var points = [];
+ var validHeight = opts.height - opts.area[0] - opts.area[2];
+ data.forEach(function(item, index) {
+ if (item === null) {
+ points.push(null);
+ } else {
+ var point = {};
+ point.color = item.color;
+ point.x = xAxisPoints[index];
+ if(boundaryGap=='center'){
+ point.x += Math.round(eachSpacing / 2);
+ }
+ var value = item;
+ if (typeof item === 'object' && item !== null) {
+ value = item.value
+ }
+ var height = validHeight * (value - minRange) / (maxRange - minRange);
+ height *= process;
+ point.y = opts.height - Math.round(height) - opts.area[2];
+ points.push(point);
+ }
+ });
+
+ return points;
+}
+
+function getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, stackSeries) {
+ var process = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : 1;
+ var points = [];
+ var validHeight = opts.height - opts.area[0] - opts.area[2];
+
+ data.forEach(function(item, index) {
+ if (item === null) {
+ points.push(null);
+ } else {
+ var point = {};
+ point.color = item.color;
+ point.x = xAxisPoints[index] + Math.round(eachSpacing / 2);
+
+ if (seriesIndex > 0) {
+ var value = 0;
+ for (let i = 0; i <= seriesIndex; i++) {
+ value += stackSeries[i].data[index];
+ }
+ var value0 = value - item;
+ var height = validHeight * (value - minRange) / (maxRange - minRange);
+ var height0 = validHeight * (value0 - minRange) / (maxRange - minRange);
+ } else {
+ var value = item;
+ var height = validHeight * (value - minRange) / (maxRange - minRange);
+ var height0 = 0;
+ }
+ var heightc = height0;
+ height *= process;
+ heightc *= process;
+ point.y = opts.height - Math.round(height) - opts.area[2];
+ point.y0 = opts.height - Math.round(heightc) - opts.area[2];
+ points.push(point);
+ }
+ });
+
+ return points;
+}
+
+function getYAxisTextList(series, opts, config, stack) {
+ var data;
+ if (stack == 'stack') {
+ data = dataCombineStack(series, opts.categories.length);
+ } else {
+ data = dataCombine(series);
+ }
+ var sorted = [];
+ // remove null from data
+ data = data.filter(function(item) {
+ //return item !== null;
+ if (typeof item === 'object' && item !== null) {
+ if (Array.isArray(item)) {
+ return item !== null;
+ } else {
+ return item.value !== null;
+ }
+ } else {
+ return item !== null;
+ }
+ });
+ data.map(function(item) {
+ if (typeof item === 'object') {
+ if (Array.isArray(item)) {
+ item.map(function(subitem) {
+ sorted.push(subitem);
+ })
+ } else {
+ sorted.push(item.value);
+ }
+ } else {
+ sorted.push(item);
+ }
+ })
+ var minData = 0;
+ var maxData = 0;
+ if (sorted.length > 0) {
+ minData = Math.min.apply(this, sorted);
+ maxData = Math.max.apply(this, sorted);
+ }
+ if (typeof opts.yAxis.min === 'number') {
+ minData = Math.min(opts.yAxis.min, minData);
+ }
+ if (typeof opts.yAxis.max === 'number') {
+ maxData = Math.max(opts.yAxis.max, maxData);
+ }
+
+ if (minData === maxData) {
+ var rangeSpan = maxData || 10;
+ maxData += rangeSpan;
+ }
+
+ var dataRange = getDataRange(minData, maxData);
+ var minRange = dataRange.minRange;
+ var maxRange = dataRange.maxRange;
+
+ var range = [];
+ var eachRange = (maxRange - minRange) / config.yAxisSplit;
+
+ for (var i = 0; i <= config.yAxisSplit; i++) {
+ range.push(minRange + eachRange * i);
+ }
+ return range.reverse();
+}
+
+function calYAxisData(series, opts, config) {
+ //堆叠图重算Y轴
+ var columnstyle = assign({}, {
+ type: ""
+ }, opts.extra.column);
+ var ranges = getYAxisTextList(series, opts, config, columnstyle.type);
+ var yAxisWidth = config.yAxisWidth;
+ var yAxisFontSize = opts.yAxis.fontSize || config.fontSize;
+ var rangesFormat = ranges.map(function(item) {
+ item = util.toFixed(item, 6);
+ item = opts.yAxis.format ? opts.yAxis.format(Number(item)) : item;
+ yAxisWidth = Math.max(yAxisWidth, measureText(item, yAxisFontSize) + 5);
+ return item;
+ });
+ if (opts.yAxis.disabled === true) {
+ yAxisWidth = 0;
+ }
+
+ return {
+ rangesFormat: rangesFormat,
+ ranges: ranges,
+ yAxisWidth: yAxisWidth
+ };
+}
+
+function calTooltipYAxisData(point, series, opts, config, eachSpacing) {
+ var ranges = getYAxisTextList(series, opts, config);
+ var spacingValid = opts.height - opts.area[0] - opts.area[2];
+ let maxVal = ranges[0];
+ let minVal = ranges[ranges.length - 1];
+ let minAxis = opts.padding[3];
+ let maxAxis = opts.padding[1] + spacingValid;
+ let item = maxVal - (maxVal - minVal) * (point - minAxis) / (maxAxis - minAxis);
+ item = opts.yAxis.format ? opts.yAxis.format(Number(item)) : item;
+ return item;
+}
+
+function calMarkLineData(minRange, maxRange, points, opts) {
+ let spacingValid = opts.height - opts.area[0] - opts.area[2];
+ for (let i = 0; i < points.length; i++) {
+ let height = spacingValid * (points[i].value - minRange) / (maxRange - minRange);
+ points[i].y = opts.height - Math.round(height) - opts.area[2];
+ }
+ return points;
+}
+
+function contextRotate(context, opts) {
+ if (opts.rotateLock !== true) {
+ context.translate(opts.height, 0);
+ context.rotate(90 * Math.PI / 180);
+ } else if (opts._rotate_ !== true) {
+ context.translate(opts.height, 0);
+ context.rotate(90 * Math.PI / 180);
+ opts._rotate_ = true;
+ }
+}
+
+function drawPointShape(points, color, shape, context, opts) {
+ context.beginPath();
+ context.setStrokeStyle("#ffffff");
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.setFillStyle(color);
+ if (shape === 'diamond') {
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ context.moveTo(item.x, item.y - 4.5);
+ context.lineTo(item.x - 4.5, item.y);
+ context.lineTo(item.x, item.y + 4.5);
+ context.lineTo(item.x + 4.5, item.y);
+ context.lineTo(item.x, item.y - 4.5);
+ }
+ });
+ } else if (shape === 'circle') {
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ context.moveTo(item.x + 3.5 * opts.pixelRatio, item.y);
+ context.arc(item.x, item.y, 4 * opts.pixelRatio, 0, 2 * Math.PI, false);
+ }
+ });
+ } else if (shape === 'rect') {
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ context.moveTo(item.x - 3.5, item.y - 3.5);
+ context.rect(item.x - 3.5, item.y - 3.5, 7, 7);
+ }
+ });
+ } else if (shape === 'triangle') {
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ context.moveTo(item.x, item.y - 4.5);
+ context.lineTo(item.x - 4.5, item.y + 4.5);
+ context.lineTo(item.x + 4.5, item.y + 4.5);
+ context.lineTo(item.x, item.y - 4.5);
+ }
+ });
+ }
+ context.closePath();
+ context.fill();
+ context.stroke();
+}
+
+function drawRingTitle(opts, config, context, center) {
+ var titlefontSize = opts.title.fontSize || config.titleFontSize;
+ var subtitlefontSize = opts.subtitle.fontSize || config.subtitleFontSize;
+ var title = opts.title.name || '';
+ var subtitle = opts.subtitle.name || '';
+ var titleFontColor = opts.title.color || config.titleColor;
+ var subtitleFontColor = opts.subtitle.color || config.subtitleColor;
+ var titleHeight = title ? titlefontSize : 0;
+ var subtitleHeight = subtitle ? subtitlefontSize : 0;
+ var margin = 5;
+
+ if (subtitle) {
+ var textWidth = measureText(subtitle, subtitlefontSize);
+ var startX = center.x - textWidth / 2 + (opts.subtitle.offsetX || 0);
+ var startY = center.y + subtitlefontSize / 2 + (opts.subtitle.offsetY || 0);
+ if (title) {
+ startY += (titleHeight + margin) / 2;
+ }
+ context.beginPath();
+ context.setFontSize(subtitlefontSize);
+ context.setFillStyle(subtitleFontColor);
+ context.fillText(subtitle, startX, startY);
+ context.closePath();
+ context.stroke();
+ }
+ if (title) {
+ var _textWidth = measureText(title, titlefontSize);
+ var _startX = center.x - _textWidth / 2 + (opts.title.offsetX || 0);
+ var _startY = center.y + titlefontSize / 2 + (opts.title.offsetY || 0);
+ if (subtitle) {
+ _startY -= (subtitleHeight + margin) / 2;
+ }
+ context.beginPath();
+ context.setFontSize(titlefontSize);
+ context.setFillStyle(titleFontColor);
+ context.fillText(title, _startX, _startY);
+ context.closePath();
+ context.stroke();
+ }
+}
+
+function drawPointText(points, series, config, context) {
+ // 绘制数据文案
+ var data = series.data;
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ //var formatVal = series.format ? series.format(data[index]) : data[index];
+ context.beginPath();
+ context.setFontSize(series.textSize || config.fontSize);
+ context.setFillStyle(series.textColor || '#666666');
+ var value = data[index]
+ if (typeof data[index] === 'object' && data[index] !== null) {
+ value = data[index].value
+ }
+ var formatVal = series.format ? series.format(value) : value;
+ context.fillText(String(formatVal), item.x - measureText(formatVal, series.textSize || config.fontSize) / 2, item.y -
+ 2);
+ context.closePath();
+ context.stroke();
+ }
+ });
+
+}
+
+function drawGaugeLabel(gaugeOption, radius, centerPosition, opts, config, context) {
+ radius -= gaugeOption.width / 2 + config.gaugeLabelTextMargin;
+
+ let totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1;
+ let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber;
+ let totalNumber = gaugeOption.endNumber - gaugeOption.startNumber;
+ let splitNumber = totalNumber / gaugeOption.splitLine.splitNumber;
+ let nowAngle = gaugeOption.startAngle;
+ let nowNumber = gaugeOption.startNumber;
+ for (let i = 0; i < gaugeOption.splitLine.splitNumber + 1; i++) {
+ var pos = {
+ x: radius * Math.cos(nowAngle * Math.PI),
+ y: radius * Math.sin(nowAngle * Math.PI)
+ };
+ var labelText = gaugeOption.labelFormat ? gaugeOption.labelFormat(nowNumber) : nowNumber;
+ pos.x += centerPosition.x - measureText(labelText) / 2;
+ pos.y += centerPosition.y;
+ var startX = pos.x;
+ var startY = pos.y;
+ context.beginPath();
+ context.setFontSize(config.fontSize);
+ context.setFillStyle(gaugeOption.labelColor || '#666666');
+ context.fillText(labelText, startX, startY + config.fontSize / 2);
+ context.closePath();
+ context.stroke();
+
+ nowAngle += splitAngle;
+ if (nowAngle >= 2) {
+ nowAngle = nowAngle % 2;
+ }
+ nowNumber += splitNumber;
+ }
+
+}
+
+function drawRadarLabel(angleList, radius, centerPosition, opts, config, context) {
+ var radarOption = opts.extra.radar || {};
+ radius += config.radarLabelTextMargin;
+
+ angleList.forEach(function(angle, index) {
+ var pos = {
+ x: radius * Math.cos(angle),
+ y: radius * Math.sin(angle)
+ };
+ var posRelativeCanvas = convertCoordinateOrigin(pos.x, pos.y, centerPosition);
+ var startX = posRelativeCanvas.x;
+ var startY = posRelativeCanvas.y;
+ if (util.approximatelyEqual(pos.x, 0)) {
+ startX -= measureText(opts.categories[index] || '') / 2;
+ } else if (pos.x < 0) {
+ startX -= measureText(opts.categories[index] || '');
+ }
+ context.beginPath();
+ context.setFontSize(config.fontSize);
+ context.setFillStyle(radarOption.labelColor || '#666666');
+ context.fillText(opts.categories[index] || '', startX, startY + config.fontSize / 2);
+ context.closePath();
+ context.stroke();
+ });
+
+}
+
+function drawPieText(series, opts, config, context, radius, center) {
+ var lineRadius = config.pieChartLinePadding;
+ var textObjectCollection = [];
+ var lastTextObject = null;
+
+ var seriesConvert = series.map(function(item) {
+ var text = item.format ? item.format(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_.toFixed(4) * 100) +'%';
+ if(item._rose_proportion_) item._proportion_=item._rose_proportion_;
+ var arc = 2 * Math.PI - (item._start_ + 2 * Math.PI * item._proportion_ / 2);
+ var color = item.color;
+ var radius = item._radius_;
+ return {
+ arc: arc,
+ text: text,
+ color: color,
+ radius: radius,
+ textColor: item.textColor,
+ textSize: item.textSize,
+ };
+ });
+ for (let i = 0; i < seriesConvert.length; i++) {
+ let item = seriesConvert[i];
+ // line end
+ let orginX1 = Math.cos(item.arc) * (item.radius + lineRadius);
+ let orginY1 = Math.sin(item.arc) * (item.radius + lineRadius);
+
+ // line start
+ let orginX2 = Math.cos(item.arc) * item.radius;
+ let orginY2 = Math.sin(item.arc) * item.radius;
+
+ // text start
+ let orginX3 = orginX1 >= 0 ? orginX1 + config.pieChartTextPadding : orginX1 - config.pieChartTextPadding;
+ let orginY3 = orginY1;
+ let textWidth = measureText(item.text);
+ let startY = orginY3;
+
+ if (lastTextObject && util.isSameXCoordinateArea(lastTextObject.start, {
+ x: orginX3
+ })) {
+ if (orginX3 > 0) {
+ startY = Math.min(orginY3, lastTextObject.start.y);
+ } else if (orginX1 < 0) {
+ startY = Math.max(orginY3, lastTextObject.start.y);
+ } else {
+ if (orginY3 > 0) {
+ startY = Math.max(orginY3, lastTextObject.start.y);
+ } else {
+ startY = Math.min(orginY3, lastTextObject.start.y);
+ }
+ }
+ }
+ if (orginX3 < 0) {
+ orginX3 -= textWidth;
+ }
+
+ let textObject = {
+ lineStart: {
+ x: orginX2,
+ y: orginY2
+ },
+ lineEnd: {
+ x: orginX1,
+ y: orginY1
+ },
+ start: {
+ x: orginX3,
+ y: startY
+ },
+ width: textWidth,
+ height: config.fontSize,
+ text: item.text,
+ color: item.color,
+ textColor: item.textColor,
+ textSize: item.textSize
+ };
+ lastTextObject = avoidCollision(textObject, lastTextObject);
+ textObjectCollection.push(lastTextObject);
+ }
+
+ for (let i = 0; i < textObjectCollection.length; i++) {
+ let item = textObjectCollection[i];
+ let lineStartPoistion = convertCoordinateOrigin(item.lineStart.x, item.lineStart.y, center);
+ let lineEndPoistion = convertCoordinateOrigin(item.lineEnd.x, item.lineEnd.y, center);
+ let textPosition = convertCoordinateOrigin(item.start.x, item.start.y, center);
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.setFontSize(config.fontSize);
+ context.beginPath();
+ context.setStrokeStyle(item.color);
+ context.setFillStyle(item.color);
+ context.moveTo(lineStartPoistion.x, lineStartPoistion.y);
+ let curveStartX = item.start.x < 0 ? textPosition.x + item.width : textPosition.x;
+ let textStartX = item.start.x < 0 ? textPosition.x - 5 : textPosition.x + 5;
+ context.quadraticCurveTo(lineEndPoistion.x, lineEndPoistion.y, curveStartX, textPosition.y);
+ context.moveTo(lineStartPoistion.x, lineStartPoistion.y);
+ context.stroke();
+ context.closePath();
+ context.beginPath();
+ context.moveTo(textPosition.x + item.width, textPosition.y);
+ context.arc(curveStartX, textPosition.y, 2, 0, 2 * Math.PI);
+ context.closePath();
+ context.fill();
+ context.beginPath();
+ context.setFontSize(item.textSize || config.fontSize);
+ context.setFillStyle(item.textColor || '#666666');
+ context.fillText(item.text, textStartX, textPosition.y + 3);
+ context.closePath();
+ context.stroke();
+ context.closePath();
+ }
+}
+
+function drawToolTipSplitLine(offsetX, opts, config, context) {
+ var toolTipOption = opts.extra.tooltip || {};
+ toolTipOption.gridType = toolTipOption.gridType == undefined ? 'solid' : toolTipOption.gridType;
+ toolTipOption.dashLength = toolTipOption.dashLength == undefined ? 4 : toolTipOption.dashLength;
+ var startY = opts.area[0];
+ var endY = opts.height - opts.area[2];
+
+ if (toolTipOption.gridType == 'dash') {
+ context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength]);
+ }
+ context.setStrokeStyle(toolTipOption.gridColor || '#cccccc');
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.beginPath();
+ context.moveTo(offsetX, startY);
+ context.lineTo(offsetX, endY);
+ context.stroke();
+ context.setLineDash([]);
+
+ if (toolTipOption.xAxisLabel) {
+ let labelText = opts.categories[opts.tooltip.index];
+ context.setFontSize(config.fontSize);
+ let textWidth = measureText(labelText, config.fontSize);
+
+ let textX = offsetX - 0.5 * textWidth;
+ let textY = endY;
+ context.beginPath();
+ context.setFillStyle(hexToRgb(toolTipOption.labelBgColor || config.toolTipBackground, toolTipOption.labelBgOpacity || config.toolTipOpacity));
+ context.setStrokeStyle(toolTipOption.labelBgColor || config.toolTipBackground);
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.rect(textX - config.toolTipPadding, textY, textWidth + 2 * config.toolTipPadding, config.fontSize + 2 * config.toolTipPadding);
+ context.closePath();
+ context.stroke();
+ context.fill();
+
+ context.beginPath();
+ context.setFontSize(config.fontSize);
+ context.setFillStyle(toolTipOption.labelFontColor || config.fontColor);
+ context.fillText(String(labelText), textX, textY + config.toolTipPadding + config.fontSize);
+ context.closePath();
+ context.stroke();
+ }
+}
+
+function drawMarkLine(minRange, maxRange, opts, config, context) {
+ let markLineOption = assign({}, {
+ type: 'solid',
+ dashLength: 4,
+ data: []
+ }, opts.extra.markLine);
+ let startX = opts.area[3];
+ let endX = opts.width - opts.padding[1];
+ let points = calMarkLineData(minRange, maxRange, markLineOption.data, opts);
+
+ for (let i = 0; i < points.length; i++) {
+ let item = assign({}, {
+ lineColor: '#DE4A42',
+ showLabel: false,
+ labelFontColor: '#666666',
+ labelBgColor: '#DFE8FF',
+ labelBgOpacity: 0.8,
+ yAxisIndex: 0
+ }, points[i]);
+
+ if (markLineOption.type == 'dash') {
+ context.setLineDash([markLineOption.dashLength, markLineOption.dashLength]);
+ }
+ context.setStrokeStyle(item.lineColor);
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.beginPath();
+ context.moveTo(startX, item.y);
+ context.lineTo(endX, item.y);
+ context.stroke();
+ context.setLineDash([]);
+ if (item.showLabel) {
+ let labelText = opts.yAxis.format ? opts.yAxis.format(Number(item.value)) : item.value;
+ context.setFontSize(config.fontSize);
+ let textWidth = measureText(labelText, config.fontSize);
+ let bgStartX = opts.padding[3] + config.yAxisTitleWidth - config.toolTipPadding;
+ let bgEndX = Math.max(opts.area[3], textWidth + config.toolTipPadding * 2);
+ let bgWidth = bgEndX - bgStartX;
+
+ let textX = bgStartX + (bgWidth - textWidth) / 2;
+ let textY = item.y;
+ context.setFillStyle(hexToRgb(item.labelBgColor, item.labelBgOpacity));
+ context.setStrokeStyle(item.labelBgColor);
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.beginPath();
+ context.rect(bgStartX, textY - 0.5 * config.fontSize - config.toolTipPadding, bgWidth, config.fontSize + 2 * config.toolTipPadding);
+ context.closePath();
+ context.stroke();
+ context.fill();
+
+ context.beginPath();
+ context.setFontSize(config.fontSize);
+ context.setFillStyle(item.labelFontColor);
+ context.fillText(String(labelText), textX, textY + 0.5 * config.fontSize);
+ context.stroke();
+ }
+ }
+}
+
+function drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints) {
+ var toolTipOption = assign({}, {
+ gridType: 'solid',
+ dashLength: 4
+ }, opts.extra.tooltip);
+
+ var startX = opts.area[3];
+ var endX = opts.width - opts.padding[1];
+
+ if (toolTipOption.gridType == 'dash') {
+ context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength]);
+ }
+ context.setStrokeStyle(toolTipOption.gridColor || '#cccccc');
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.beginPath();
+ context.moveTo(startX, opts.tooltip.offset.y);
+ context.lineTo(endX, opts.tooltip.offset.y);
+ context.stroke();
+ context.setLineDash([]);
+
+ if (toolTipOption.yAxisLabel) {
+ let labelText = calTooltipYAxisData(opts.tooltip.offset.y, opts.series, opts, config, eachSpacing);
+ context.setFontSize(config.fontSize);
+ let textWidth = measureText(labelText, config.fontSize);
+ let bgStartX = opts.padding[3] + config.yAxisTitleWidth - config.toolTipPadding;
+ let bgEndX = Math.max(opts.area[3], textWidth + config.toolTipPadding * 2);
+ let bgWidth = bgEndX - bgStartX;
+
+ let textX = bgStartX + (bgWidth - textWidth) / 2;
+ let textY = opts.tooltip.offset.y;
+ context.beginPath();
+ context.setFillStyle(hexToRgb(toolTipOption.labelBgColor || config.toolTipBackground, toolTipOption.labelBgOpacity || config.toolTipOpacity));
+ context.setStrokeStyle(toolTipOption.labelBgColor || config.toolTipBackground);
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.rect(bgStartX, textY - 0.5 * config.fontSize - config.toolTipPadding, bgWidth, config.fontSize + 2 * config.toolTipPadding);
+ context.closePath();
+ context.stroke();
+ context.fill();
+
+ context.beginPath();
+ context.setFontSize(config.fontSize);
+ context.setFillStyle(toolTipOption.labelFontColor || config.fontColor);
+ context.fillText(labelText, textX, textY + 0.5 * config.fontSize);
+ context.closePath();
+ context.stroke();
+ }
+}
+
+function drawToolTipSplitArea(offsetX, opts, config, context, eachSpacing) {
+ var toolTipOption = assign({}, {
+ activeBgColor: '#000000',
+ activeBgOpacity: 0.08
+ }, opts.extra.tooltip);
+ var startY = opts.area[0];
+ var endY = opts.height - opts.area[2];
+ context.beginPath();
+ context.setFillStyle(hexToRgb(toolTipOption.activeBgColor, toolTipOption.activeBgOpacity));
+ context.rect(offsetX - eachSpacing / 2, startY, eachSpacing, endY - startY);
+ context.closePath();
+ context.fill();
+}
+
+function drawToolTip(textList, offset, opts, config, context, eachSpacing, xAxisPoints) {
+ var toolTipOption = assign({}, {
+ bgColor: '#000000',
+ bgOpacity: 0.7,
+ fontColor: '#FFFFFF'
+ }, opts.extra.tooltip);
+ var legendWidth = 4 * opts.pixelRatio;
+ var legendMarginRight = 5 * opts.pixelRatio;
+ var arrowWidth = 8 * opts.pixelRatio;
+ var isOverRightBorder = false;
+ if (opts.type == 'line' || opts.type == 'area' || opts.type == 'candle' || opts.type == 'mix') {
+ drawToolTipSplitLine(opts.tooltip.offset.x, opts, config, context);
+ }
+
+ offset = assign({
+ x: 0,
+ y: 0
+ }, offset);
+ offset.y -= 8 * opts.pixelRatio;
+ var textWidth = textList.map(function(item) {
+ return measureText(item.text, config.fontSize);
+ });
+ var toolTipWidth = legendWidth + legendMarginRight + 4 * config.toolTipPadding + Math.max.apply(null, textWidth);
+ var toolTipHeight = 2 * config.toolTipPadding + textList.length * config.toolTipLineHeight;
+
+ // if beyond the right border
+ if (offset.x - Math.abs(opts._scrollDistance_) + arrowWidth + toolTipWidth > opts.width) {
+ isOverRightBorder = true;
+ }
+ if (toolTipHeight + offset.y > opts.height) {
+ offset.y = opts.height - toolTipHeight;
+ }
+ // draw background rect
+ context.beginPath();
+ context.setFillStyle(hexToRgb(toolTipOption.bgColor || config.toolTipBackground, toolTipOption.bgOpacity || config.toolTipOpacity));
+ if (isOverRightBorder) {
+ context.moveTo(offset.x, offset.y + 10 * opts.pixelRatio);
+ context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pixelRatio - 5 * opts.pixelRatio);
+ context.lineTo(offset.x - arrowWidth, offset.y);
+ context.lineTo(offset.x - arrowWidth - Math.round(toolTipWidth), offset.y);
+ context.lineTo(offset.x - arrowWidth - Math.round(toolTipWidth), offset.y + toolTipHeight);
+ context.lineTo(offset.x - arrowWidth, offset.y + toolTipHeight);
+ context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pixelRatio + 5 * opts.pixelRatio);
+ context.lineTo(offset.x, offset.y + 10 * opts.pixelRatio);
+ } else {
+ context.moveTo(offset.x, offset.y + 10 * opts.pixelRatio);
+ context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pixelRatio - 5 * opts.pixelRatio);
+ context.lineTo(offset.x + arrowWidth, offset.y);
+ context.lineTo(offset.x + arrowWidth + Math.round(toolTipWidth), offset.y);
+ context.lineTo(offset.x + arrowWidth + Math.round(toolTipWidth), offset.y + toolTipHeight);
+ context.lineTo(offset.x + arrowWidth, offset.y + toolTipHeight);
+ context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pixelRatio + 5 * opts.pixelRatio);
+ context.lineTo(offset.x, offset.y + 10 * opts.pixelRatio);
+ }
+
+ context.closePath();
+ context.fill();
+
+ // draw legend
+ textList.forEach(function(item, index) {
+ if (item.color !== null) {
+ context.beginPath();
+ context.setFillStyle(item.color);
+ var startX = offset.x + arrowWidth + 2 * config.toolTipPadding;
+ var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index +
+ config.toolTipPadding + 1;
+ if (isOverRightBorder) {
+ startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding;
+ }
+ context.fillRect(startX, startY, legendWidth, config.fontSize);
+ context.closePath();
+ }
+ });
+
+ // draw text list
+
+ textList.forEach(function(item, index) {
+ var startX = offset.x + arrowWidth + 2 * config.toolTipPadding + legendWidth + legendMarginRight;
+ if (isOverRightBorder) {
+ startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding + +legendWidth + legendMarginRight;
+ }
+ var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index +
+ config.toolTipPadding;
+ context.beginPath();
+ context.setFontSize(config.fontSize);
+ context.setFillStyle(toolTipOption.fontColor);
+ context.fillText(item.text, startX, startY + config.fontSize);
+ context.closePath();
+ context.stroke();
+ });
+}
+
+function drawYAxisTitle(title, opts, config, context) {
+ var startX = config.xAxisHeight + (opts.height - config.xAxisHeight - measureText(title)) / 2;
+ context.save();
+ context.beginPath();
+ context.setFontSize(config.fontSize);
+ context.setFillStyle(opts.yAxis.titleFontColor || '#333333');
+ context.translate(0, opts.height);
+ context.rotate(-90 * Math.PI / 180);
+ context.fillText(title, startX, opts.padding[3] + 0.5 * config.fontSize);
+ context.closePath();
+ context.stroke();
+ context.restore();
+}
+
+function drawColumnDataPoints(series, opts, config, context) {
+ let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ let ranges = [].concat(opts.chartData.yAxisData.ranges);
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing;
+ let columnOption = assign({}, {
+ type: 'group',
+ width: eachSpacing / 2,
+ meter: {
+ border: 4,
+ fillColor: '#FFFFFF'
+ }
+ }, opts.extra.column);
+ let minRange = ranges.pop();
+ let maxRange = ranges.shift();
+ let calPoints = [];
+
+ context.save();
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0);
+ }
+ if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) {
+ drawToolTipSplitArea(opts.tooltip.offset.x, opts, config, context, eachSpacing);
+ }
+
+ series.forEach(function(eachSeries, seriesIndex) {
+ var data = eachSeries.data;
+ switch (columnOption.type) {
+ case 'group':
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ var tooltipPoints = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process);
+ calPoints.push(tooltipPoints);
+ points = fixColumeData(points, eachSpacing, series.length, seriesIndex, config, opts);
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ context.beginPath();
+ context.setStrokeStyle(item.color || eachSeries.color);
+ context.setLineWidth(1)
+ context.setFillStyle(item.color || eachSeries.color);
+ var startX = item.x - item.width / 2;
+ var height = opts.height - item.y - opts.area[2];
+ context.moveTo(startX-1, item.y);
+ context.lineTo(startX+item.width-2,item.y);
+ context.lineTo(startX+item.width-2,opts.height - opts.area[2]);
+ context.lineTo(startX,opts.height - opts.area[2]);
+ context.lineTo(startX,item.y);
+ //context.rect(startX, item.y, item.width, height);
+ context.closePath();
+ context.stroke();
+ context.fill();
+ }
+ });
+ break;
+ case 'stack':
+ // 绘制堆叠数据图
+ var points = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config,
+ seriesIndex,
+ series, process);
+ calPoints.push(points);
+ points = fixColumeStackData(points, eachSpacing, series.length, seriesIndex, config, opts, series);
+
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ context.beginPath();
+ context.setFillStyle(item.color || eachSeries.color);
+ var startX = item.x - item.width / 2 + 1;
+ var height = opts.height - item.y - opts.area[2];
+ var height0 = opts.height - item.y0 - opts.area[2];
+ if (seriesIndex > 0) {
+ height -= height0;
+ }
+ context.moveTo(startX, item.y);
+ context.fillRect(startX, item.y, item.width - 2, height);
+ context.closePath();
+ context.fill();
+ }
+ });
+ break;
+ case 'meter':
+ // 绘制温度计数据图
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ calPoints.push(points);
+ points = fixColumeMeterData(points, eachSpacing, series.length, seriesIndex, config, opts, columnOption.meter
+ .border);
+ if (seriesIndex == 0) {
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ //画背景颜色
+ context.beginPath();
+ context.setFillStyle(columnOption.meter.fillColor);
+ var startX = item.x - item.width / 2;
+ var height = opts.height - item.y - opts.area[2];
+ context.moveTo(startX, item.y);
+ context.fillRect(startX, item.y, item.width, height);
+ context.closePath();
+ context.fill();
+ //画边框线
+ if (columnOption.meter.border > 0) {
+ context.beginPath();
+ context.setStrokeStyle(eachSeries.color);
+ context.setLineWidth(columnOption.meter.border * opts.pixelRatio);
+ context.moveTo(startX + columnOption.meter.border * 0.5, item.y + height);
+ context.lineTo(startX + columnOption.meter.border * 0.5, item.y + columnOption.meter.border * 0.5);
+ context.lineTo(startX + item.width - columnOption.meter.border * 0.5, item.y + columnOption.meter.border * 0.5);
+ context.lineTo(startX + item.width - columnOption.meter.border * 0.5, item.y + height);
+ context.stroke();
+ }
+ }
+ });
+ } else {
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ context.beginPath();
+ context.setFillStyle(item.color || eachSeries.color);
+ var startX = item.x - item.width / 2;
+ var height = opts.height - item.y - opts.area[2];
+ context.moveTo(startX, item.y);
+ context.fillRect(startX, item.y, item.width, height);
+ context.closePath();
+ context.fill();
+ }
+ });
+ }
+ break;
+ }
+ });
+
+ if (opts.dataLabel !== false && process === 1) {
+ series.forEach(function(eachSeries, seriesIndex) {
+ var data = eachSeries.data;
+ switch (columnOption.type) {
+ case 'group':
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ points = fixColumeData(points, eachSpacing, series.length, seriesIndex, config, opts);
+
+ drawPointText(points, eachSeries, config, context);
+ break;
+ case 'stack':
+ var points = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config,
+ seriesIndex,
+ series, process);
+ drawPointText(points, eachSeries, config, context);
+ break;
+ case 'meter':
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ drawPointText(points, eachSeries, config, context);
+ break;
+ }
+ });
+ }
+
+ context.restore();
+
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ minRange: minRange,
+ maxRange: maxRange
+ };
+}
+
+function drawCandleDataPoints(series, seriesMA, opts, config, context) {
+ var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1;
+ var candleOption = assign({}, {
+ color: {},
+ average: {}
+ }, opts.extra.candle);
+ candleOption.color = assign({}, {
+ upLine: '#f04864',
+ upFill: '#f04864',
+ downLine: '#2fc25b',
+ downFill: '#2fc25b'
+ }, candleOption.color);
+ candleOption.average = assign({}, {
+ show: false,
+ name: [],
+ day: [],
+ color: config.colors
+ }, candleOption.average);
+ opts.extra.candle = candleOption;
+
+ let ranges = [].concat(opts.chartData.yAxisData.ranges);
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing;
+
+ let minRange = ranges.pop();
+ let maxRange = ranges.shift();
+ let calPoints = [];
+
+ context.save();
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0);
+ }
+ //画均线
+ if (candleOption.average.show) {
+ seriesMA.forEach(function(eachSeries, seriesIndex) {
+ var data = eachSeries.data;
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ //calPoints.push(points);
+ var splitPointList = splitPoints(points);
+
+ splitPointList.forEach(function(points, index) {
+ context.beginPath();
+ context.setStrokeStyle(eachSeries.color);
+ context.setLineWidth(1);
+ if (points.length === 1) {
+ context.moveTo(points[0].x, points[0].y);
+ context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+ } else {
+ context.moveTo(points[0].x, points[0].y);
+ points.forEach(function(item, index) {
+ if (index > 0) {
+ var ctrlPoint = createCurveControlPoints(points, index - 1);
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,
+ item.x, item
+ .y);
+ }
+ });
+ context.moveTo(points[0].x, points[0].y);
+ }
+ context.closePath();
+ context.stroke();
+ });
+ });
+ }
+ //画K线
+ series.forEach(function(eachSeries, seriesIndex) {
+ var data = eachSeries.data;
+ var points = getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ calPoints.push(points);
+ var splitPointList = splitPoints(points);
+ splitPointList = splitPointList[0];
+
+ splitPointList.forEach(function(points, index) {
+ context.beginPath();
+ //如果上涨
+ if (data[index][1] - data[index][0] > 0) {
+ context.setStrokeStyle(candleOption.color.upLine);
+ context.setFillStyle(candleOption.color.upFill);
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.moveTo(points[3].x, points[3].y); //顶点
+ context.lineTo(points[1].x, points[1].y); //收盘中间点
+ context.lineTo(points[1].x - eachSpacing / 4, points[1].y); //收盘左侧点
+ context.lineTo(points[0].x - eachSpacing / 4, points[0].y); //开盘左侧点
+ context.lineTo(points[0].x, points[0].y); //开盘中间点
+ context.lineTo(points[2].x, points[2].y); //底点
+ context.lineTo(points[0].x, points[0].y); //开盘中间点
+ context.lineTo(points[0].x + eachSpacing / 4, points[0].y); //开盘右侧点
+ context.lineTo(points[1].x + eachSpacing / 4, points[1].y); //收盘右侧点
+ context.lineTo(points[1].x, points[1].y); //收盘中间点
+ context.moveTo(points[3].x, points[3].y); //顶点
+ } else {
+ context.setStrokeStyle(candleOption.color.downLine);
+ context.setFillStyle(candleOption.color.downFill);
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.moveTo(points[3].x, points[3].y); //顶点
+ context.lineTo(points[0].x, points[0].y); //开盘中间点
+ context.lineTo(points[0].x - eachSpacing / 4, points[0].y); //开盘左侧点
+ context.lineTo(points[1].x - eachSpacing / 4, points[1].y); //收盘左侧点
+ context.lineTo(points[1].x, points[1].y); //收盘中间点
+ context.lineTo(points[2].x, points[2].y); //底点
+ context.lineTo(points[1].x, points[1].y); //收盘中间点
+ context.lineTo(points[1].x + eachSpacing / 4, points[1].y); //收盘右侧点
+ context.lineTo(points[0].x + eachSpacing / 4, points[0].y); //开盘右侧点
+ context.lineTo(points[0].x, points[0].y); //开盘中间点
+ context.moveTo(points[3].x, points[3].y); //顶点
+ }
+ context.closePath();
+ context.fill();
+ context.stroke();
+ });
+ });
+
+ context.restore();
+
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ minRange: minRange,
+ maxRange: maxRange
+ };
+}
+
+function drawAreaDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ var areaOption = assign({},{
+ type: 'straight',
+ opacity: 0.2,
+ addLine: false,
+ width: 2
+ },opts.extra.area);
+
+ let ranges = [].concat(opts.chartData.yAxisData.ranges);
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing;
+
+ let minRange = ranges.pop();
+ let maxRange = ranges.shift();
+ let endY = opts.height - opts.area[2];
+ let calPoints = [];
+
+ context.save();
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0);
+ }
+
+ series.forEach(function(eachSeries, seriesIndex) {
+ let data = eachSeries.data;
+ let points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ calPoints.push(points);
+
+ let splitPointList = splitPoints(points);
+
+ for (let i = 0; i < splitPointList.length; i++) {
+ let points = splitPointList[i];
+ // 绘制区域数
+ context.beginPath();
+ context.setStrokeStyle(hexToRgb(eachSeries.color, areaOption.opacity));
+ context.setFillStyle(hexToRgb(eachSeries.color, areaOption.opacity));
+ context.setLineWidth(areaOption.width * opts.pixelRatio);
+ if (points.length > 1) {
+ let firstPoint = points[0];
+ let lastPoint = points[points.length - 1];
+
+ context.moveTo(firstPoint.x, firstPoint.y);
+ if (areaOption.type === 'curve') {
+ points.forEach(function(item, index) {
+ if (index > 0) {
+ let ctrlPoint = createCurveControlPoints(points, index - 1);
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y);
+ }
+ });
+ } else {
+ points.forEach(function(item, index) {
+ if (index > 0) {
+ context.lineTo(item.x, item.y);
+ }
+ });
+ }
+
+ context.lineTo(lastPoint.x, endY);
+ context.lineTo(firstPoint.x, endY);
+ context.lineTo(firstPoint.x, firstPoint.y);
+ } else {
+ let item = points[0];
+ context.moveTo(item.x - eachSpacing / 2, item.y);
+ context.lineTo(item.x + eachSpacing / 2, item.y);
+ context.lineTo(item.x + eachSpacing / 2, endY);
+ context.lineTo(item.x - eachSpacing / 2, endY);
+ context.moveTo(item.x - eachSpacing / 2, item.y);
+ }
+ context.closePath();
+ context.fill();
+
+ //画连线
+ if (areaOption.addLine) {
+ context.beginPath();
+ context.setStrokeStyle(eachSeries.color);
+ context.setLineWidth(areaOption.width * opts.pixelRatio);
+ if (points.length === 1) {
+ context.moveTo(points[0].x, points[0].y);
+ context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+ } else {
+ context.moveTo(points[0].x, points[0].y);
+ if (areaOption.type === 'curve') {
+ points.forEach(function(item, index) {
+ if (index > 0) {
+ let ctrlPoint = createCurveControlPoints(points, index - 1);
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x,item.y);
+ }
+ });
+ } else {
+ points.forEach(function(item, index) {
+ if (index > 0) {
+ context.lineTo(item.x, item.y);
+ }
+ });
+ }
+ context.moveTo(points[0].x, points[0].y);
+ }
+ context.closePath();
+ context.stroke();
+ }
+ }
+
+ //画点
+ if (opts.dataPointShape !== false) {
+ var shape = config.dataPointShape[seriesIndex % config.dataPointShape.length];
+ drawPointShape(points, eachSeries.color, shape, context, opts);
+ }
+
+ });
+
+ if (opts.dataLabel !== false && process === 1) {
+ series.forEach(function(eachSeries, seriesIndex) {
+ var data = eachSeries.data;
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ drawPointText(points, eachSeries, config, context);
+ });
+ }
+
+ context.restore();
+
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ minRange: minRange,
+ maxRange: maxRange
+ };
+}
+
+function drawLineDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ var lineOption = opts.extra.line || {
+ type: 'straight',
+ width: 2
+ };
+ lineOption.type = lineOption.type ? lineOption.type : 'straight';
+ lineOption.width = lineOption.width ? lineOption.width : 2;
+
+ let ranges = [].concat(opts.chartData.yAxisData.ranges);
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing;
+
+ var minRange = ranges.pop();
+ var maxRange = ranges.shift();
+ var calPoints = [];
+
+ context.save();
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0);
+ }
+
+ series.forEach(function(eachSeries, seriesIndex) {
+ var data = eachSeries.data;
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ calPoints.push(points);
+ var splitPointList = splitPoints(points);
+
+ splitPointList.forEach(function(points, index) {
+ context.beginPath();
+ context.setStrokeStyle(eachSeries.color);
+ context.setLineWidth(lineOption.width * opts.pixelRatio);
+ if (points.length === 1) {
+ context.moveTo(points[0].x, points[0].y);
+ context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+ } else {
+ context.moveTo(points[0].x, points[0].y);
+ if (lineOption.type === 'curve') {
+ points.forEach(function(item, index) {
+ if (index > 0) {
+ var ctrlPoint = createCurveControlPoints(points, index - 1);
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,
+ item.x, item
+ .y);
+ }
+ });
+ } else {
+ points.forEach(function(item, index) {
+ if (index > 0) {
+ context.lineTo(item.x, item.y);
+ }
+ });
+ }
+ context.moveTo(points[0].x, points[0].y);
+ }
+ context.closePath();
+ context.stroke();
+ });
+
+ if (opts.dataPointShape !== false) {
+ var shape = config.dataPointShape[seriesIndex % config.dataPointShape.length];
+ drawPointShape(points, eachSeries.color, shape, context, opts);
+ }
+ });
+
+ if (opts.dataLabel !== false && process === 1) {
+ series.forEach(function(eachSeries, seriesIndex) {
+ var data = eachSeries.data;
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ drawPointText(points, eachSeries, config, context);
+ });
+ }
+
+ context.restore();
+
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ minRange: minRange,
+ maxRange: maxRange
+ };
+}
+
+function drawMixDataPoints(series, opts, config, context) {
+ let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ let ranges = [].concat(opts.chartData.yAxisData.ranges);
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ eachSpacing = xAxisData.eachSpacing;
+
+ let minRange = ranges.pop();
+ let maxRange = ranges.shift();
+ let endY = opts.height - opts.area[2];
+ let calPoints = [];
+
+ var columnIndex = 0;
+ var columnLength = 0;
+ series.forEach(function(eachSeries, seriesIndex) {
+ if (eachSeries.type == 'column') {
+ columnLength += 1;
+ }
+ });
+ context.save();
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0);
+ }
+
+ series.forEach(function(eachSeries, seriesIndex) {
+ var data = eachSeries.data;
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ calPoints.push(points);
+
+ // 绘制柱状数据图
+ if (eachSeries.type == 'column') {
+ points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts);
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ context.beginPath();
+ context.setStrokeStyle(item.color || eachSeries.color);
+ context.setLineWidth(1)
+ context.setFillStyle(item.color || eachSeries.color);
+ var startX = item.x - item.width / 2;
+ var height = opts.height - item.y - opts.area[2];
+ context.moveTo(startX, item.y);
+ context.moveTo(startX-1, item.y);
+ context.lineTo(startX+item.width-2,item.y);
+ context.lineTo(startX+item.width-2,opts.height - opts.area[2]);
+ context.lineTo(startX,opts.height - opts.area[2]);
+ context.lineTo(startX,item.y);
+ //context.rect(startX, item.y, item.width, height);
+ context.closePath();
+ context.stroke();
+ context.fill();
+ context.closePath();
+ context.fill();
+ }
+ });
+ columnIndex += 1;
+ }
+
+ //绘制区域图数据
+
+ if (eachSeries.type == 'area') {
+ let splitPointList = splitPoints(points);
+ for (let i = 0; i < splitPointList.length; i++) {
+ let points = splitPointList[i];
+ // 绘制区域数据
+ context.beginPath();
+ context.setStrokeStyle(eachSeries.color);
+ context.setFillStyle(hexToRgb(eachSeries.color, 0.2));
+ context.setLineWidth(2 * opts.pixelRatio);
+ if (points.length > 1) {
+ var firstPoint = points[0];
+ let lastPoint = points[points.length - 1];
+ context.moveTo(firstPoint.x, firstPoint.y);
+ if (eachSeries.style === 'curve') {
+ points.forEach(function(item, index) {
+ if (index > 0) {
+ var ctrlPoint = createCurveControlPoints(points, index - 1);
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y, item.x, item.y);
+ }
+ });
+ } else {
+ points.forEach(function(item, index) {
+ if (index > 0) {
+ context.lineTo(item.x, item.y);
+ }
+ });
+ }
+ context.lineTo(lastPoint.x, endY);
+ context.lineTo(firstPoint.x, endY);
+ context.lineTo(firstPoint.x, firstPoint.y);
+ } else {
+ let item = points[0];
+ context.moveTo(item.x - eachSpacing / 2, item.y);
+ context.lineTo(item.x + eachSpacing / 2, item.y);
+ context.lineTo(item.x + eachSpacing / 2, endY);
+ context.lineTo(item.x - eachSpacing / 2, endY);
+ context.moveTo(item.x - eachSpacing / 2, item.y);
+ }
+ context.closePath();
+ context.fill();
+ }
+ }
+
+ // 绘制折线数据图
+ if (eachSeries.type == 'line') {
+ var splitPointList = splitPoints(points);
+ splitPointList.forEach(function(points, index) {
+ context.beginPath();
+ context.setStrokeStyle(eachSeries.color);
+ context.setLineWidth(2 * opts.pixelRatio);
+ if (points.length === 1) {
+ context.moveTo(points[0].x, points[0].y);
+ context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+ } else {
+ context.moveTo(points[0].x, points[0].y);
+ if (eachSeries.style == 'curve') {
+ points.forEach(function(item, index) {
+ if (index > 0) {
+ var ctrlPoint = createCurveControlPoints(points, index - 1);
+ context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,
+ item.x,
+ item.y);
+ }
+ });
+ } else {
+ points.forEach(function(item, index) {
+ if (index > 0) {
+ context.lineTo(item.x, item.y);
+ }
+ });
+ }
+ context.moveTo(points[0].x, points[0].y);
+ }
+ context.closePath();
+ context.stroke();
+ });
+ }
+
+ // 绘制点数据图
+ if (eachSeries.type == 'point') {
+ points.forEach(function(pointsa, index) {
+ if (pointsa) {
+ context.beginPath();
+ context.setFillStyle(eachSeries.color);
+ context.setStrokeStyle('#FFFFFF');
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.moveTo(pointsa.x + 3.5 * opts.pixelRatio, pointsa.y);
+ context.arc(pointsa.x, pointsa.y, 4 * opts.pixelRatio, 0, 2 * Math.PI);
+ context.closePath();
+ context.fill();
+ context.stroke();
+ }
+ });
+ }
+
+ if (eachSeries.addPoint == true && eachSeries.type !== 'column') {
+ var shape = config.dataPointShape[seriesIndex % config.dataPointShape.length];
+ drawPointShape(points, eachSeries.color, shape, context, opts);
+ }
+ });
+ if (opts.dataLabel !== false && process === 1) {
+ var columnIndex = 0;
+ series.forEach(function(eachSeries, seriesIndex) {
+ var data = eachSeries.data;
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ if (eachSeries.type !== 'column') {
+ drawPointText(points, eachSeries, config, context);
+ } else {
+ points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts);
+ drawPointText(points, eachSeries, config, context);
+ columnIndex += 1;
+ }
+
+ });
+ }
+
+ context.restore();
+
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing,
+ minRange: minRange,
+ maxRange: maxRange
+ };
+}
+
+function drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints) {
+ var toolTipOption = opts.extra.tooltip || {};
+ if (toolTipOption.horizentalLine && opts.tooltip && process === 1 && (opts.type == 'line' || opts.type == 'area' || opts.type == 'column' || opts.type == 'candle' || opts.type == 'mix')) {
+ drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints)
+ }
+ context.save();
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+ context.translate(opts._scrollDistance_, 0);
+ }
+ if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) {
+ drawToolTip(opts.tooltip.textList, opts.tooltip.offset, opts, config, context, eachSpacing, xAxisPoints);
+ }
+ context.restore();
+
+}
+
+function drawXAxis(categories, opts, config, context) {
+
+ let xAxisData = opts.chartData.xAxisData,
+ xAxisPoints = xAxisData.xAxisPoints,
+ startX = xAxisData.startX,
+ endX = xAxisData.endX,
+ eachSpacing = xAxisData.eachSpacing;
+ var boundaryGap='center';
+ if (opts.type == 'line'||opts.type == 'area'){
+ boundaryGap=opts.xAxis.boundaryGap;
+ }
+ var startY = opts.height - opts.area[2];
+ var endY = opts.area[0];
+
+ //绘制滚动条
+ if (opts.enableScroll && opts.xAxis.scrollShow) {
+ var scrollY = opts.height - opts.area[2] + config.xAxisHeight;
+ var scrollScreenWidth = endX - startX;
+ var scrollTotalWidth = eachSpacing * (xAxisPoints.length - 1);
+ var scrollWidth = scrollScreenWidth * scrollScreenWidth / scrollTotalWidth;
+ var scrollLeft = 0;
+ if (opts._scrollDistance_) {
+ scrollLeft = -opts._scrollDistance_ * (scrollScreenWidth) / scrollTotalWidth;
+ }
+ context.beginPath();
+ context.setLineCap('round');
+ context.setLineWidth(6 * opts.pixelRatio);
+ context.setStrokeStyle(opts.xAxis.scrollBackgroundColor || "#EFEBEF");
+ context.moveTo(startX, scrollY);
+ context.lineTo(endX, scrollY);
+ context.stroke();
+ context.closePath();
+ context.beginPath();
+ context.setLineCap('round');
+ context.setLineWidth(6 * opts.pixelRatio);
+ context.setStrokeStyle(opts.xAxis.scrollColor || "#A6A6A6");
+ context.moveTo(startX + scrollLeft, scrollY);
+ context.lineTo(startX + scrollLeft + scrollWidth, scrollY);
+ context.stroke();
+ context.closePath();
+ context.setLineCap('butt');
+ }
+
+ context.save();
+
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) {
+ context.translate(opts._scrollDistance_, 0);
+ }
+
+
+ if (opts.xAxis.disableGrid !== true) {
+ context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc");
+ context.setLineCap('butt');
+ context.setLineWidth(1 * opts.pixelRatio);
+ if (opts.xAxis.gridType == 'dash') {
+ context.setLineDash([opts.xAxis.dashLength, opts.xAxis.dashLength]);
+ }
+ if (opts.xAxis.type === 'calibration') {
+ xAxisPoints.forEach(function(item, index) {
+ if (index > 0) {
+ context.beginPath();
+ context.moveTo(item - eachSpacing / 2, startY);
+ context.lineTo(item - eachSpacing / 2, startY + 4 * opts.pixelRatio);
+ context.closePath();
+ context.stroke();
+ }
+ });
+ } else {
+ opts.xAxis.gridEval = opts.xAxis.gridEval || 1;
+ xAxisPoints.forEach(function(item, index) {
+ if (index % opts.xAxis.gridEval == 0) {
+ context.beginPath();
+ context.moveTo(item, startY);
+ context.lineTo(item, endY);
+ context.stroke();
+ }
+ });
+ }
+ context.setLineDash([]);
+ }
+
+
+ //不绘制X轴
+ if (opts.xAxis.disabled !== true) {
+ // 对X轴列表做抽稀处理
+ let validWidth = opts.width - opts.padding[1] - opts.padding[3] - config.yAxisWidth - config.yAxisTitleWidth;
+ //默认全部显示X轴标签
+ let maxXAxisListLength = categories.length;
+ //如果设置了X轴单屏数量
+ if (opts.xAxis.labelCount) {
+ //如果设置X轴密度
+ if (opts.xAxis.itemCount) {
+ maxXAxisListLength = Math.ceil(categories.length / opts.xAxis.itemCount * opts.xAxis.labelCount);
+ } else {
+ maxXAxisListLength = opts.xAxis.labelCount;
+ }
+ maxXAxisListLength -= 1;
+ }
+
+ let ratio = Math.ceil(categories.length / maxXAxisListLength);
+
+ let newCategories = [];
+ let cgLength = categories.length;
+ for (let i = 0; i < cgLength; i++) {
+ if (i % ratio !== 0) {
+ newCategories.push("");
+ } else {
+ newCategories.push(categories[i]);
+ }
+ }
+ newCategories[cgLength - 1] = categories[cgLength - 1];
+
+ var xAxisFontSize = opts.xAxis.fontSize || config.fontSize;
+ if (config._xAxisTextAngle_ === 0) {
+ newCategories.forEach(function(item, index) {
+ var offset = - measureText(item, xAxisFontSize) / 2;
+ if(boundaryGap == 'center'){
+ offset+=eachSpacing / 2;
+ }
+ context.beginPath();
+ context.setFontSize(xAxisFontSize);
+ context.setFillStyle(opts.xAxis.fontColor || '#666666');
+ context.fillText(item, xAxisPoints[index] + offset, startY + xAxisFontSize + (config.xAxisHeight - xAxisFontSize) / 2);
+ context.closePath();
+ context.stroke();
+ });
+
+ } else {
+ newCategories.forEach(function(item, index) {
+ context.save();
+ context.beginPath();
+ context.setFontSize(xAxisFontSize);
+ context.setFillStyle(opts.xAxis.fontColor || '#666666');
+ var textWidth = measureText(item);
+ var offset = - textWidth;
+ if(boundaryGap == 'center'){
+ offset+=eachSpacing / 2;
+ }
+ var _calRotateTranslate = calRotateTranslate(xAxisPoints[index] + eachSpacing / 2, startY + xAxisFontSize / 2 + 5, opts.height),
+ transX = _calRotateTranslate.transX,
+ transY = _calRotateTranslate.transY;
+
+ context.rotate(-1 * config._xAxisTextAngle_);
+ context.translate(transX, transY);
+ context.fillText(item, xAxisPoints[index] + offset, startY + xAxisFontSize + 5);
+ context.closePath();
+ context.stroke();
+ context.restore();
+ });
+ }
+ }
+ context.restore();
+
+}
+
+function drawYAxisGrid(categories, opts, config, context) {
+ if (opts.yAxis.disableGrid === true) {
+ return;
+ }
+ let spacingValid = opts.height - opts.area[0] - opts.area[2];
+ let eachSpacing = spacingValid / config.yAxisSplit;
+ let startX = opts.area[3];
+ let xAxisPoints = opts.chartData.xAxisData.xAxisPoints,
+ xAxiseachSpacing = opts.chartData.xAxisData.eachSpacing;
+ let TotalWidth = xAxiseachSpacing * (xAxisPoints.length - 1);
+ let endX = startX + TotalWidth;
+
+ let points = [];
+ for (let i = 0; i < config.yAxisSplit + 1; i++) {
+ points.push(opts.height - opts.area[2] - eachSpacing * i);
+ }
+
+ context.save();
+ if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) {
+ context.translate(opts._scrollDistance_, 0);
+ }
+
+ if (opts.yAxis.gridType == 'dash') {
+ context.setLineDash([opts.yAxis.dashLength, opts.yAxis.dashLength]);
+ }
+ context.setStrokeStyle(opts.yAxis.gridColor || "#cccccc");
+ context.setLineWidth(1 * opts.pixelRatio);
+ points.forEach(function(item, index) {
+ context.beginPath();
+ context.moveTo(startX, item);
+ context.lineTo(endX, item);
+ context.stroke();
+ });
+ context.setLineDash([]);
+
+ context.restore();
+}
+
+function drawYAxis(series, opts, config, context) {
+ if (opts.yAxis.disabled === true) {
+ return;
+ }
+ let rangesFormat = opts.chartData.yAxisData.rangesFormat;
+ var spacingValid = opts.height - opts.area[0] - opts.area[2];
+ var eachSpacing = Math.floor(spacingValid / config.yAxisSplit);
+ var startX = opts.area[3];
+ var endX = opts.width - opts.area[1];
+ var endY = opts.height - opts.area[2];
+ var fillEndY = endY + config.xAxisHeight;
+ if (opts.xAxis.scrollShow) {
+ fillEndY -= 3 * opts.pixelRatio;
+ }
+ // set YAxis background
+ context.beginPath();
+ context.setFillStyle(opts.background || '#ffffff');
+ if (opts._scrollDistance_ < 0) {
+ context.fillRect(0, 0, startX, fillEndY);
+ }
+ if(opts.enableScroll == true){
+ context.fillRect(endX, 0, opts.width, fillEndY);
+ }
+ context.closePath();
+ context.stroke();
+
+ var points = [];
+ for (var i = 0; i <= config.yAxisSplit; i++) {
+ points.push(opts.area[0] + eachSpacing * i);
+ }
+
+ var yAxisFontSize = opts.yAxis.fontSize || config.fontSize;
+ rangesFormat.forEach(function(item, index) {
+ var pos = points[index] ? points[index] : endY;
+ context.beginPath();
+ context.setFontSize(yAxisFontSize);
+ context.setFillStyle(opts.yAxis.fontColor || '#666666');
+ context.fillText(String(item), opts.area[3] - config.yAxisWidth, pos + yAxisFontSize / 2);
+ context.closePath();
+ context.stroke();
+ });
+
+ if (opts.yAxis.title) {
+ drawYAxisTitle(opts.yAxis.title, opts, config, context);
+ }
+}
+
+function drawLegend(series, opts, config, context, chartData) {
+ if (opts.legend.show === false) {
+ return;
+ }
+ let legendData = chartData.legendData;
+ let legendList = legendData.points;
+ let legendArea = legendData.area;
+ let padding = opts.legend.padding;
+ let fontSize = opts.legend.fontSize;
+ let shapeWidth = 15 * opts.pixelRatio;
+ let shapeRight = 5 * opts.pixelRatio;
+ let itemGap = opts.legend.itemGap;
+ let lineHeight = Math.max(opts.legend.lineHeight * opts.pixelRatio, fontSize);
+
+ //画背景及边框
+ context.beginPath();
+ context.setLineWidth(opts.legend.borderWidth);
+ context.setStrokeStyle(opts.legend.borderColor);
+ context.setFillStyle(opts.legend.backgroundColor);
+ context.moveTo(legendArea.start.x, legendArea.start.y);
+ context.rect(legendArea.start.x, legendArea.start.y, legendArea.width, legendArea.height);
+ context.closePath();
+ context.fill();
+ context.stroke();
+
+ legendList.forEach(function(itemList, listIndex) {
+ let width = 0;
+ let height = 0;
+ width = legendData.widthArr[listIndex];
+ height = legendData.heightArr[listIndex];
+ let startX = 0;
+ let startY = 0;
+ if (opts.legend.position == 'top' || opts.legend.position == 'bottom') {
+ startX = legendArea.start.x + (legendArea.width - width) / 2;
+ startY = legendArea.start.y + padding + listIndex * lineHeight;
+ } else {
+ if (listIndex == 0) {
+ width = 0;
+ } else {
+ width = legendData.widthArr[listIndex - 1];
+ }
+ startX = legendArea.start.x + padding + width;
+ startY = legendArea.start.y + padding + (legendArea.height - height) / 2;
+ }
+
+ context.setFontSize(config.fontSize);
+ for (let i = 0; i < itemList.length; i++) {
+ let item = itemList[i];
+ item.area = [0, 0, 0, 0];
+ item.area[0] = startX;
+ item.area[1] = startY;
+ item.area[3] = startY + lineHeight;
+ context.beginPath();
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.setStrokeStyle(item.show ? item.color : opts.legend.hiddenColor);
+ context.setFillStyle(item.show ? item.color : opts.legend.hiddenColor);
+ switch (item.legendShape) {
+ case 'line':
+ context.moveTo(startX, startY + 0.5 * lineHeight - 2 * opts.pixelRatio);
+ context.fillRect(startX, startY + 0.5 * lineHeight - 2 * opts.pixelRatio, 15 * opts.pixelRatio, 4 * opts.pixelRatio);
+ break;
+ case 'triangle':
+ context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+ context.lineTo(startX + 2.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio);
+ context.lineTo(startX + 12.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio);
+ context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+ break;
+ case 'diamond':
+ context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+ context.lineTo(startX + 2.5 * opts.pixelRatio, startY + 0.5 * lineHeight);
+ context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio);
+ context.lineTo(startX + 12.5 * opts.pixelRatio, startY + 0.5 * lineHeight);
+ context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+ break;
+ case 'circle':
+ context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight);
+ context.arc(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight, 5 * opts.pixelRatio, 0, 2 * Math.PI);
+ break;
+ case 'rect':
+ context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+ context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio, 15 * opts.pixelRatio, 10 * opts.pixelRatio);
+ break;
+ default:
+ context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+ context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio, 15 * opts.pixelRatio, 10 * opts.pixelRatio);
+ }
+ context.closePath();
+ context.fill();
+ context.stroke();
+
+ startX += shapeWidth + shapeRight;
+ let fontTrans = 0.5 * lineHeight + 0.5 * fontSize - 2;
+ context.beginPath();
+ context.setFontSize(fontSize);
+ context.setFillStyle(item.show ? opts.legend.fontColor : opts.legend.hiddenColor);
+ context.fillText(item.name, startX, startY + fontTrans);
+ context.closePath();
+ context.stroke();
+ if (opts.legend.position == 'top' || opts.legend.position == 'bottom') {
+ startX += measureText(item.name, fontSize) + itemGap;
+ item.area[2] = startX;
+ } else {
+ item.area[2] = startX + measureText(item.name, fontSize) + itemGap;;
+ startX -= shapeWidth + shapeRight;
+ startY += lineHeight;
+ }
+ }
+ });
+}
+
+function drawPieDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ var pieOption = assign({}, {
+ activeOpacity: 0.5,
+ activeRadius: 10 * opts.pixelRatio,
+ offsetAngle: 0,
+ labelWidth: 15 * opts.pixelRatio,
+ ringWidth: 0,
+ border:false,
+ borderWidth:2,
+ borderColor:'#FFFFFF'
+ }, opts.extra.pie);
+ var centerPosition = {
+ x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+ y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2
+ };
+ if (config.pieChartLinePadding == 0) {
+ config.pieChartLinePadding = pieOption.activeRadius;
+ }
+
+ var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding);
+
+ series = getPieDataPoints(series, radius, process);
+
+ var activeRadius = pieOption.activeRadius;
+
+ series = series.map(function(eachSeries) {
+ eachSeries._start_ += (pieOption.offsetAngle) * Math.PI / 180;
+ return eachSeries;
+ });
+ series.forEach(function(eachSeries, seriesIndex) {
+ if (opts.tooltip) {
+ if (opts.tooltip.index == seriesIndex) {
+ context.beginPath();
+ context.setFillStyle(hexToRgb(eachSeries.color, opts.extra.pie.activeOpacity || 0.5));
+ context.moveTo(centerPosition.x, centerPosition.y);
+ context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_ + activeRadius, eachSeries._start_,
+ eachSeries._start_ + 2 *
+ eachSeries._proportion_ * Math.PI);
+ context.closePath();
+ context.fill();
+ }
+ }
+ context.beginPath();
+ context.setLineWidth(pieOption.borderWidth * opts.pixelRatio);
+ context.lineJoin = "round";
+ context.setStrokeStyle(pieOption.borderColor);
+ context.setFillStyle(eachSeries.color);
+ context.moveTo(centerPosition.x, centerPosition.y);
+ context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_, eachSeries._start_, eachSeries._start_ + 2 * eachSeries._proportion_ * Math.PI);
+ context.closePath();
+ context.fill();
+ if (pieOption.border == true) {
+ context.stroke();
+ }
+ });
+
+ if (opts.type === 'ring') {
+ var innerPieWidth = radius * 0.6;
+ if (typeof opts.extra.pie.ringWidth === 'number' && opts.extra.pie.ringWidth > 0) {
+ innerPieWidth = Math.max(0, radius - opts.extra.pie.ringWidth);
+ }
+ context.beginPath();
+ context.setFillStyle(opts.background || '#ffffff');
+ context.moveTo(centerPosition.x, centerPosition.y);
+ context.arc(centerPosition.x, centerPosition.y, innerPieWidth, 0, 2 * Math.PI);
+ context.closePath();
+ context.fill();
+ }
+
+ if (opts.dataLabel !== false && process === 1) {
+ var valid = false;
+ for (var i = 0, len = series.length; i < len; i++) {
+ if (series[i].data > 0) {
+ valid = true;
+ break;
+ }
+ }
+
+ if (valid) {
+ drawPieText(series, opts, config, context, radius, centerPosition);
+ }
+ }
+
+ if (process === 1 && opts.type === 'ring') {
+ drawRingTitle(opts, config, context, centerPosition);
+ }
+
+ return {
+ center: centerPosition,
+ radius: radius,
+ series: series
+ };
+}
+
+function drawRoseDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ var roseOption = assign({}, {
+ type: 'area',
+ activeOpacity: 0.5,
+ activeRadius: 10 * opts.pixelRatio,
+ offsetAngle: 0,
+ labelWidth: 15 * opts.pixelRatio,
+ border:false,
+ borderWidth:2,
+ borderColor:'#FFFFFF'
+ }, opts.extra.rose);
+ if (config.pieChartLinePadding == 0) {
+ config.pieChartLinePadding = roseOption.activeRadius;
+ }
+ var centerPosition = {
+ x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+ y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2
+ };
+ var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding);
+ var minRadius = roseOption.minRadius || radius * 0.5;
+
+ series = getRoseDataPoints(series, roseOption.type, minRadius, radius, process);
+
+ var activeRadius = roseOption.activeRadius;
+
+ series = series.map(function(eachSeries) {
+ eachSeries._start_ += (roseOption.offsetAngle || 0) * Math.PI / 180;
+ return eachSeries;
+ });
+
+ series.forEach(function(eachSeries, seriesIndex) {
+ if (opts.tooltip) {
+ if (opts.tooltip.index == seriesIndex) {
+ context.beginPath();
+ context.setFillStyle(hexToRgb(eachSeries.color, roseOption.activeOpacity || 0.5));
+ context.moveTo(centerPosition.x, centerPosition.y);
+ context.arc(centerPosition.x, centerPosition.y, activeRadius + eachSeries._radius_, eachSeries._start_,
+ eachSeries._start_ + 2 * eachSeries._rose_proportion_ * Math.PI);
+ context.closePath();
+ context.fill();
+ }
+ }
+ context.beginPath();
+ context.setLineWidth(roseOption.borderWidth * opts.pixelRatio);
+ context.lineJoin = "round";
+ context.setStrokeStyle(roseOption.borderColor);
+ context.setFillStyle(eachSeries.color);
+ context.moveTo(centerPosition.x, centerPosition.y);
+ context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_, eachSeries._start_, eachSeries._start_ + 2 *
+ eachSeries._rose_proportion_ * Math.PI);
+ context.closePath();
+ context.fill();
+ if (roseOption.border == true) {
+ context.stroke();
+ }
+ });
+
+ if (opts.dataLabel !== false && process === 1) {
+ var valid = false;
+ for (var i = 0, len = series.length; i < len; i++) {
+ if (series[i].data > 0) {
+ valid = true;
+ break;
+ }
+ }
+
+ if (valid) {
+ drawPieText(series, opts, config, context, radius, centerPosition);
+ }
+ }
+
+ return {
+ center: centerPosition,
+ radius: radius,
+ series: series
+ };
+}
+
+function drawArcbarDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ var arcbarOption = assign({}, {
+ startAngle: 0.75,
+ endAngle: 0.25,
+ type: 'default',
+ width: 12 * opts.pixelRatio
+ }, opts.extra.arcbar);
+
+ series = getArcbarDataPoints(series, arcbarOption, process);
+ var centerPosition = {
+ x: opts.width / 2,
+ y: opts.height / 2
+ };
+ var radius = Math.min(centerPosition.x, centerPosition.y);
+ radius -= 5 * opts.pixelRatio;
+ radius -= arcbarOption.width / 2;
+
+ //背景颜色
+ context.setLineWidth(arcbarOption.width);
+ context.setStrokeStyle(arcbarOption.backgroundColor || '#E9E9E9');
+ context.setLineCap('round');
+ context.beginPath();
+ if (arcbarOption.type == 'default') {
+ context.arc(centerPosition.x, centerPosition.y, radius, arcbarOption.startAngle * Math.PI, arcbarOption.endAngle *
+ Math.PI, false);
+ } else {
+ context.arc(centerPosition.x, centerPosition.y, radius, 0, 2 * Math.PI, false);
+ }
+ context.stroke();
+
+ for (let i = 0; i < series.length; i++) {
+ let eachSeries = series[i];
+ context.setLineWidth(arcbarOption.width);
+ context.setStrokeStyle(eachSeries.color);
+ context.setLineCap('round');
+ context.beginPath();
+ context.arc(centerPosition.x, centerPosition.y, radius, arcbarOption.startAngle * Math.PI, eachSeries._proportion_ *
+ Math.PI, false);
+ context.stroke();
+ }
+
+ drawRingTitle(opts, config, context, centerPosition);
+
+ return {
+ center: centerPosition,
+ radius: radius,
+ series: series
+ };
+}
+
+function drawGaugeDataPoints(categories, series, opts, config, context) {
+ var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1;
+ var gaugeOption = assign({}, {
+ startAngle: 0.75,
+ endAngle: 0.25,
+ width: 15,
+ splitLine: {
+ fixRadius: 0,
+ splitNumber: 10,
+ width: 15,
+ color: '#FFFFFF',
+ childNumber: 5,
+ childWidth: 5
+ },
+ pointer: {
+ width: 15,
+ color: 'auto'
+ }
+ }, opts.extra.gauge);
+
+ if (gaugeOption.oldAngle == undefined) {
+ gaugeOption.oldAngle = gaugeOption.startAngle;
+ }
+ if (gaugeOption.oldData == undefined) {
+ gaugeOption.oldData = 0;
+ }
+ categories = getGaugeAxisPoints(categories, gaugeOption.startAngle, gaugeOption.endAngle);
+
+ var centerPosition = {
+ x: opts.width / 2,
+ y: opts.height / 2
+ };
+ var radius = Math.min(centerPosition.x, centerPosition.y);
+ radius -= 5 * opts.pixelRatio;
+ radius -= gaugeOption.width / 2;
+ var innerRadius = radius - gaugeOption.width;
+
+ //画背景
+ context.setLineWidth(gaugeOption.width);
+ context.setLineCap('butt');
+ for (let i = 0; i < categories.length; i++) {
+ let eachCategories = categories[i];
+ context.beginPath();
+ context.setStrokeStyle(eachCategories.color);
+ context.arc(centerPosition.x, centerPosition.y, radius, eachCategories._startAngle_ * Math.PI, eachCategories._endAngle_ *
+ Math.PI, false);
+ context.stroke();
+ }
+ context.save();
+
+ //画刻度线
+ let totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1;
+ let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber;
+ let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber;
+ let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius;
+ let endX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.width;
+ let childendX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.childWidth;
+
+ context.translate(centerPosition.x, centerPosition.y);
+ context.rotate((gaugeOption.startAngle - 1) * Math.PI);
+
+ for (let i = 0; i < gaugeOption.splitLine.splitNumber + 1; i++) {
+ context.beginPath();
+ context.setStrokeStyle(gaugeOption.splitLine.color);
+ context.setLineWidth(2 * opts.pixelRatio);
+ context.moveTo(startX, 0);
+ context.lineTo(endX, 0);
+ context.stroke();
+ context.rotate(splitAngle * Math.PI);
+ }
+ context.restore();
+
+ context.save();
+ context.translate(centerPosition.x, centerPosition.y);
+ context.rotate((gaugeOption.startAngle - 1) * Math.PI);
+
+ for (let i = 0; i < gaugeOption.splitLine.splitNumber * gaugeOption.splitLine.childNumber + 1; i++) {
+ context.beginPath();
+ context.setStrokeStyle(gaugeOption.splitLine.color);
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.moveTo(startX, 0);
+ context.lineTo(childendX, 0);
+ context.stroke();
+ context.rotate(childAngle * Math.PI);
+ }
+ context.restore();
+
+ //画指针
+ series = getGaugeDataPoints(series, categories, gaugeOption, process);
+
+ for (let i = 0; i < series.length; i++) {
+ let eachSeries = series[i];
+ context.save();
+ context.translate(centerPosition.x, centerPosition.y);
+ context.rotate((eachSeries._proportion_ - 1) * Math.PI);
+ context.beginPath();
+ context.setFillStyle(eachSeries.color);
+ context.moveTo(gaugeOption.pointer.width, 0);
+ context.lineTo(0, -gaugeOption.pointer.width / 2);
+ context.lineTo(-innerRadius, 0);
+ context.lineTo(0, gaugeOption.pointer.width / 2);
+ context.lineTo(gaugeOption.pointer.width, 0);
+ context.closePath();
+ context.fill();
+ context.beginPath();
+ context.setFillStyle('#FFFFFF');
+ context.arc(0, 0, gaugeOption.pointer.width / 6, 0, 2 * Math.PI, false);
+ context.fill();
+ context.restore();
+ }
+
+ if (opts.dataLabel !== false) {
+ drawGaugeLabel(gaugeOption, radius, centerPosition, opts, config, context);
+ }
+
+ drawRingTitle(opts, config, context, centerPosition);
+
+ if (process === 1 && opts.type === 'gauge') {
+ opts.extra.gauge.oldAngle = series[0]._proportion_;
+ opts.extra.gauge.oldData = series[0].data;
+ }
+ return {
+ center: centerPosition,
+ radius: radius,
+ innerRadius: innerRadius,
+ categories: categories,
+ totalAngle: totalAngle
+ };
+}
+
+function drawRadarDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ var radarOption = assign({},{
+ gridColor: '#cccccc',
+ labelColor: '#666666',
+ opacity: 0.2
+ },opts.extra.radar);
+
+ var coordinateAngle = getRadarCoordinateSeries(opts.categories.length);
+
+ var centerPosition = {
+ x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+ y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2
+ };
+
+ var radius = Math.min(centerPosition.x - (getMaxTextListLength(opts.categories) + config.radarLabelTextMargin),
+ centerPosition.y - config.radarLabelTextMargin);
+ //TODO逻辑不对
+ radius -= opts.padding[1];
+
+ // draw grid
+ context.beginPath();
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.setStrokeStyle(radarOption.gridColor);
+ coordinateAngle.forEach(function(angle) {
+ var pos = convertCoordinateOrigin(radius * Math.cos(angle), radius * Math.sin(angle), centerPosition);
+ context.moveTo(centerPosition.x, centerPosition.y);
+ context.lineTo(pos.x, pos.y);
+ });
+ context.stroke();
+ context.closePath();
+ // draw split line grid
+
+ var _loop = function _loop(i) {
+ var startPos = {};
+ context.beginPath();
+ context.setLineWidth(1 * opts.pixelRatio);
+ context.setStrokeStyle(radarOption.gridColor);
+ coordinateAngle.forEach(function(angle, index) {
+ var pos = convertCoordinateOrigin(radius / config.radarGridCount * i * Math.cos(angle), radius / config.radarGridCount *
+ i * Math.sin(angle), centerPosition);
+ if (index === 0) {
+ startPos = pos;
+ context.moveTo(pos.x, pos.y);
+ } else {
+ context.lineTo(pos.x, pos.y);
+ }
+ });
+ context.lineTo(startPos.x, startPos.y);
+ context.stroke();
+ context.closePath();
+ };
+
+ for (var i = 1; i <= config.radarGridCount; i++) {
+ _loop(i);
+ }
+
+ var radarDataPoints = getRadarDataPoints(coordinateAngle, centerPosition, radius, series, opts, process);
+
+ radarDataPoints.forEach(function(eachSeries, seriesIndex) {
+ // 绘制区域数据
+ context.beginPath();
+ context.setFillStyle(hexToRgb(eachSeries.color, radarOption.opacity));
+ eachSeries.data.forEach(function(item, index) {
+ if (index === 0) {
+ context.moveTo(item.position.x, item.position.y);
+ } else {
+ context.lineTo(item.position.x, item.position.y);
+ }
+ });
+ context.closePath();
+ context.fill();
+
+ if (opts.dataPointShape !== false) {
+ var shape = config.dataPointShape[seriesIndex % config.dataPointShape.length];
+ var points = eachSeries.data.map(function(item) {
+ return item.position;
+ });
+ drawPointShape(points, eachSeries.color, shape, context, opts);
+ }
+ });
+ // draw label text
+ drawRadarLabel(coordinateAngle, radius, centerPosition, opts, config, context);
+
+ return {
+ center: centerPosition,
+ radius: radius,
+ angleList: coordinateAngle
+ };
+}
+
+function normalInt(min, max, iter) {
+ iter = iter==0?1:iter;
+ var arr = [];
+ for (var i = 0; i < iter; i++) {
+ arr[i] = Math.random();
+ };
+ return Math.floor(arr.reduce(function(i,j){return i+j})/iter*(max-min))+min;
+};
+
+function collisionNew(area,points,width,height){
+ var isIn=false;
+ for(let i=0;ipoints[i].area[2]||area[1]>points[i].area[3]||area[2]width || area[3]>height){
+ isIn=true;
+ break;
+ }else{
+ isIn=false;
+ }
+ }else{
+ isIn=true;
+ break;
+ }
+ }
+ }
+ return isIn;
+};
+
+function getBoundingBox(data) {
+ var bounds = {}, coords;
+ bounds.xMin = 180;
+ bounds.xMax = 0;
+ bounds.yMin = 90;
+ bounds.yMax = 0
+ for (var i = 0; i < data.length; i++) {
+ var coorda = data[i].geometry.coordinates
+ for (var k = 0; k < coorda.length; k++) {
+ coords = coorda[k];
+ if (coords.length == 1) {
+ coords = coords[0]
+ }
+ for (var j = 0; j < coords.length; j++) {
+ var longitude = coords[j][0];
+ var latitude = coords[j][1];
+ var point = {
+ x: longitude,
+ y: latitude
+ }
+ bounds.xMin = bounds.xMin < point.x ? bounds.xMin : point.x;
+ bounds.xMax = bounds.xMax > point.x ? bounds.xMax : point.x;
+ bounds.yMin = bounds.yMin < point.y ? bounds.yMin : point.y;
+ bounds.yMax = bounds.yMax > point.y ? bounds.yMax : point.y;
+ }
+ }
+ }
+ return bounds;
+}
+
+function coordinateToPoint(latitude, longitude,bounds,scale,xoffset,yoffset) {
+ return {
+ x: (longitude - bounds.xMin) * scale+xoffset,
+ y: (bounds.yMax - latitude) * scale+yoffset
+ };
+}
+
+function pointToCoordinate(pointY, pointX,bounds,scale,xoffset,yoffset) {
+ return {
+ x: (pointX-xoffset)/scale+bounds.xMin,
+ y: bounds.yMax - (pointY-yoffset)/scale
+ };
+}
+
+function isRayIntersectsSegment(poi,s_poi,e_poi){
+ if (s_poi[1]==e_poi[1]){return false;}
+ if (s_poi[1]>poi[1] && e_poi[1]>poi[1]){return false;}
+ if (s_poi[1]poi[1]){return false;}
+ if (e_poi[1]==poi[1] && s_poi[1]>poi[1]){return false;}
+ if (s_poi[0]0.7) {
+ return true;
+ }else {return false};
+ };
+ for (let i = 0; i < points.length; i++) {
+ let text = points[i].name;
+ let tHeight = points[i].textSize;
+ let tWidth = measureText(text,tHeight);
+ let isSpin = Spin();
+ let x,y,area,areav;
+ let breaknum=0;
+ while(true) {
+ breaknum++;
+ let isCollision;
+ if (isSpin) {
+ x = normalInt(-opts.width/2, opts.width/2,5) - tWidth/2;
+ y = normalInt(-opts.height/2, opts.height/2,5)+tHeight/2;
+ area=[y-5-tWidth+opts.width/2,(-x-5+opts.height/2),y+5+opts.width/2,(-x+tHeight+5+opts.height/2)];
+ areav=[opts.width-(opts.width/2-opts.height/2)-(-x+tHeight+5+opts.height/2)-5,(opts.height/2-opts.width/2)+(y-5-tWidth+opts.width/2)-5,opts.width-(opts.width/2-opts.height/2)-(-x+tHeight+5+opts.height/2)+tHeight,(opts.height/2-opts.width/2)+(y-5-tWidth+opts.width/2)+tWidth+5];
+ isCollision = collisionNew(areav,points,opts.height,opts.width);
+ }else{
+ x = normalInt(-opts.width/2, opts.width/2,5) - tWidth/2;
+ y = normalInt(-opts.height/2, opts.height/2,5)+tHeight/2;
+ area=[x-5+opts.width/2,y-5-tHeight+opts.height/2,x+tWidth+5+opts.width/2,y+5+opts.height/2];
+ isCollision = collisionNew(area,points,opts.width,opts.height);
+ }
+ if (!isCollision) break;
+ if (breaknum==1000){
+ area=[-1000,-1000,-1000,-1000];
+ break;
+ }
+ };
+ if (isSpin) {
+ points[i].area=areav;
+ points[i].areav=area;
+ }else{
+ points[i].area=area;
+ }
+ points[i].rotate=isSpin;
+ };
+ break;
+ }
+ return points;
+}
+
+
+function drawWordCloudDataPoints(series, opts, config, context) {
+ let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ let wordOption = assign({},{
+ type: 'normal',
+ autoColors: true
+ },opts.extra.word);
+
+ context.beginPath();
+ context.setFillStyle(opts.background||'#FFFFFF');
+ context.rect(0,0,opts.width,opts.height);
+ context.fill();
+ context.save();
+ let points = opts.chartData.wordCloudData;
+ context.translate(opts.width/2,opts.height/2);
+
+ for(let i=0;i0){
+ if (opts.tooltip) {
+ if (opts.tooltip.index == i) {
+ context.strokeText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process);
+ }else{
+ context.fillText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process);
+ }
+ }else{
+ context.fillText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process);
+ }
+ }
+ }else{
+ if(points[i].area[0]>0){
+ if (opts.tooltip) {
+ if (opts.tooltip.index == i) {
+ context.strokeText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process);
+ }else{
+ context.fillText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process);
+ }
+ }else{
+ context.fillText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process);
+ }
+
+ }
+ }
+
+ context.stroke();
+ context.restore();
+ }
+ context.restore();
+}
+
+function drawFunnelDataPoints(series, opts, config, context) {
+ let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ let funnelOption = assign({},{
+ activeWidth:10,
+ activeOpacity:0.3,
+ border:false,
+ borderWidth:2,
+ borderColor:'#FFFFFF',
+ fillOpacity:1,
+ labelAlign:'right'
+ },opts.extra.funnel);
+ let eachSpacing = (opts.height - opts.area[0] - opts.area[2])/series.length;
+ let centerPosition = {
+ x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+ y: opts.height-opts.area[2]
+ };
+ let activeWidth = funnelOption.activeWidth;
+ let radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - activeWidth, (opts.height - opts.area[0] - opts.area[2]) / 2 - activeWidth);
+ series = getFunnelDataPoints(series, radius, process);
+ context.save();
+ context.translate(centerPosition.x,centerPosition.y);
+ for(let i=0;i 0 && arguments[0] !== undefined ? arguments[0] : {};
+ this.opts = assign({}, this.opts, data);
+ this.opts.updateData = true;
+ let scrollPosition = data.scrollPosition || 'current';
+ switch (scrollPosition) {
+ case 'current':
+ this.opts._scrollDistance_ = this.scrollOption.currentOffset;
+ break;
+ case 'left':
+ this.opts._scrollDistance_ = 0;
+ this.scrollOption = {
+ currentOffset: 0,
+ startTouchX: 0,
+ distance: 0,
+ lastMoveTime: 0
+ };
+ break;
+ case 'right':
+ let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config),
+ yAxisWidth = _calYAxisData.yAxisWidth;
+ this.config.yAxisWidth = yAxisWidth;
+ let offsetLeft = 0;
+ let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config),
+ xAxisPoints = _getXAxisPoints0.xAxisPoints,
+ startX = _getXAxisPoints0.startX,
+ endX = _getXAxisPoints0.endX,
+ eachSpacing = _getXAxisPoints0.eachSpacing;
+ let totalWidth = eachSpacing * (xAxisPoints.length - 1);
+ let screenWidth = endX - startX;
+ offsetLeft = screenWidth - totalWidth;
+ this.scrollOption = {
+ currentOffset: offsetLeft,
+ startTouchX: offsetLeft,
+ distance: 0,
+ lastMoveTime: 0
+ };
+ this.opts._scrollDistance_ = offsetLeft;
+ break;
+ }
+ drawCharts.call(this, this.opts.type, this.opts, this.config, this.context);
+};
+
+Charts.prototype.zoom = function() {
+ var val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.opts.xAxis.itemCount;
+ if (this.opts.enableScroll !== true) {
+ console.log('请启用滚动条后使用!')
+ return;
+ }
+ //当前屏幕中间点
+ let centerPoint = Math.round(Math.abs(this.scrollOption.currentOffset) / this.opts.chartData.eachSpacing) + Math.round(
+ this.opts.xAxis.itemCount / 2);
+ this.opts.animation = false;
+ this.opts.xAxis.itemCount = val.itemCount;
+ //重新计算x轴偏移距离
+ let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config),
+ yAxisWidth = _calYAxisData.yAxisWidth;
+ this.config.yAxisWidth = yAxisWidth;
+ let offsetLeft = 0;
+ let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config),
+ xAxisPoints = _getXAxisPoints0.xAxisPoints,
+ startX = _getXAxisPoints0.startX,
+ endX = _getXAxisPoints0.endX,
+ eachSpacing = _getXAxisPoints0.eachSpacing;
+ let centerLeft = eachSpacing * centerPoint;
+ let screenWidth = endX - startX;
+ let MaxLeft = screenWidth - eachSpacing * (xAxisPoints.length - 1);
+ offsetLeft = screenWidth / 2 - centerLeft;
+ if (offsetLeft > 0) {
+ offsetLeft = 0;
+ }
+ if (offsetLeft < MaxLeft) {
+ offsetLeft = MaxLeft;
+ }
+ this.scrollOption = {
+ currentOffset: offsetLeft,
+ startTouchX: offsetLeft,
+ distance: 0,
+ lastMoveTime: 0
+ };
+ this.opts._scrollDistance_ = offsetLeft;
+ drawCharts.call(this, this.opts.type, this.opts, this.config, this.context);
+};
+
+Charts.prototype.stopAnimation = function() {
+ this.animationInstance && this.animationInstance.stop();
+};
+
+Charts.prototype.addEventListener = function(type, listener) {
+ this.event.addEventListener(type, listener);
+};
+
+Charts.prototype.getCurrentDataIndex = function(e) {
+ var touches = null;
+ if (e.changedTouches) {
+ touches = e.changedTouches[0];
+ } else {
+ touches = e.mp.changedTouches[0];
+ }
+ if (touches) {
+ let _touches$ = getTouches(touches, this.opts, e);
+ if (this.opts.type === 'pie' || this.opts.type === 'ring' || this.opts.type === 'rose') {
+ return findPieChartCurrentIndex({
+ x: _touches$.x,
+ y: _touches$.y
+ }, this.opts.chartData.pieData);
+ } else if (this.opts.type === 'radar') {
+ return findRadarChartCurrentIndex({
+ x: _touches$.x,
+ y: _touches$.y
+ }, this.opts.chartData.radarData, this.opts.categories.length);
+ } else if (this.opts.type === 'funnel') {
+ return findFunnelChartCurrentIndex({
+ x: _touches$.x,
+ y: _touches$.y
+ }, this.opts.chartData.funnelData);
+ } else if (this.opts.type === 'map') {
+ return findMapChartCurrentIndex({
+ x: _touches$.x,
+ y: _touches$.y
+ }, this.opts);
+ }else if (this.opts.type === 'word') {
+ return findWordChartCurrentIndex({
+ x: _touches$.x,
+ y: _touches$.y
+ }, this.opts.chartData.wordCloudData);
+ } else {
+ return findCurrentIndex({
+ x: _touches$.x,
+ y: _touches$.y
+ }, this.opts.chartData.xAxisPoints, this.opts, this.config, Math.abs(this.scrollOption.currentOffset));
+ }
+ }
+ return -1;
+};
+
+Charts.prototype.getLegendDataIndex = function(e) {
+ var touches = null;
+ if (e.changedTouches) {
+ touches = e.changedTouches[0];
+ } else {
+ touches = e.mp.changedTouches[0];
+ }
+ if (touches) {
+ let _touches$ = getTouches(touches, this.opts, e);
+ return findLegendIndex({
+ x: _touches$.x,
+ y: _touches$.y
+ }, this.opts.chartData.legendData);
+ }
+ return -1;
+};
+
+Charts.prototype.touchLegend = function(e) {
+ var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ var touches = null;
+ if (e.changedTouches) {
+ touches = e.changedTouches[0];
+ } else {
+ touches = e.mp.changedTouches[0];
+ }
+ if (touches) {
+ var _touches$ = getTouches(touches, this.opts, e);
+ var index = this.getLegendDataIndex(e);
+ if (index >= 0) {
+ this.opts.series[index].show = !this.opts.series[index].show;
+ this.opts.animation = option.animation ? true : false;
+ drawCharts.call(this, this.opts.type, this.opts, this.config, this.context);
+ }
+ }
+
+};
+
+Charts.prototype.showToolTip = function(e) {
+ var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ var touches = null;
+ if (e.changedTouches) {
+ touches = e.changedTouches[0];
+ } else {
+ touches = e.mp.changedTouches[0];
+ }
+ if (!touches) {
+ console.log("touchError");
+ }
+ var _touches$ = getTouches(touches, this.opts, e);
+ var currentOffset = this.scrollOption.currentOffset;
+ var opts = assign({}, this.opts, {
+ _scrollDistance_: currentOffset,
+ animation: false
+ });
+ if (this.opts.type === 'line' || this.opts.type === 'area' || this.opts.type === 'column') {
+ var index = this.getCurrentDataIndex(e);
+ if (index > -1) {
+ var seriesData = getSeriesDataItem(this.opts.series, index);
+ if (seriesData.length !== 0) {
+ var _getToolTipData = getToolTipData(seriesData, this.opts.chartData.calPoints, index, this.opts.categories,option),
+ textList = _getToolTipData.textList,
+ offset = _getToolTipData.offset;
+ offset.y = _touches$.y;
+ opts.tooltip = {
+ textList: textList,
+ offset: offset,
+ option: option,
+ index: index
+ };
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+ if (this.opts.type === 'mix') {
+ var index = this.getCurrentDataIndex(e);
+ if (index > -1) {
+ var currentOffset = this.scrollOption.currentOffset;
+ var opts = assign({}, this.opts, {
+ _scrollDistance_: currentOffset,
+ animation: false
+ });
+ var seriesData = getSeriesDataItem(this.opts.series, index);
+ if (seriesData.length !== 0) {
+ var _getMixToolTipData = getMixToolTipData(seriesData, this.opts.chartData.calPoints, index, this.opts.categories,option),
+ textList = _getMixToolTipData.textList,
+ offset = _getMixToolTipData.offset;
+ offset.y = _touches$.y;
+ opts.tooltip = {
+ textList: textList,
+ offset: offset,
+ option: option,
+ index: index
+ };
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+ if (this.opts.type === 'candle') {
+ var index = this.getCurrentDataIndex(e);
+ if (index > -1) {
+ var currentOffset = this.scrollOption.currentOffset;
+ var opts = assign({}, this.opts, {
+ _scrollDistance_: currentOffset,
+ animation: false
+ });
+ var seriesData = getSeriesDataItem(this.opts.series, index);
+ if (seriesData.length !== 0) {
+ var _getToolTipData = getCandleToolTipData(this.opts.series[0].data, seriesData, this.opts.chartData.calPoints,
+ index, this.opts.categories, this.opts.extra.candle, option),
+ textList = _getToolTipData.textList,
+ offset = _getToolTipData.offset;
+ offset.y = _touches$.y;
+ opts.tooltip = {
+ textList: textList,
+ offset: offset,
+ option: option,
+ index: index
+ };
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+ if (this.opts.type === 'pie' || this.opts.type === 'ring' || this.opts.type === 'rose'||this.opts.type === 'funnel' ) {
+ var index = this.getCurrentDataIndex(e);
+ if (index > -1) {
+ var currentOffset = this.scrollOption.currentOffset;
+ var opts = assign({}, this.opts, {
+ _scrollDistance_: currentOffset,
+ animation: false
+ });
+ var seriesData = this.opts._series_[index];
+ var textList = [{
+ text: option.format ? option.format(seriesData) : seriesData.name + ': ' + seriesData.data,
+ color: seriesData.color
+ }];
+ var offset = {
+ x: _touches$.x,
+ y: _touches$.y
+ };
+ opts.tooltip = {
+ textList: textList,
+ offset: offset,
+ option: option,
+ index: index
+ };
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+ if (this.opts.type === 'map'||this.opts.type === 'word') {
+ var index = this.getCurrentDataIndex(e);
+ if (index > -1) {
+ var currentOffset = this.scrollOption.currentOffset;
+ var opts = assign({}, this.opts, {
+ _scrollDistance_: currentOffset,
+ animation: false
+ });
+ var seriesData = this.opts._series_[index];
+ var textList = [{
+ text: option.format ? option.format(seriesData) : seriesData.properties.name ,
+ color: seriesData.color
+ }];
+ var offset = {
+ x: _touches$.x,
+ y: _touches$.y
+ };
+ opts.tooltip = {
+ textList: textList,
+ offset: offset,
+ option: option,
+ index: index
+ };
+ }
+ opts.updateData = false;
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+ if (this.opts.type === 'radar') {
+ var index = this.getCurrentDataIndex(e);
+ if (index > -1) {
+ var currentOffset = this.scrollOption.currentOffset;
+ var opts = assign({}, this.opts, {
+ _scrollDistance_: currentOffset,
+ animation: false
+ });
+ var seriesData = getSeriesDataItem(this.opts.series, index);
+ if (seriesData.length !== 0) {
+ var textList = seriesData.map(function(item) {
+ return {
+ text: option.format ? option.format(item) : item.name + ': ' + item.data,
+ color: item.color
+ };
+ });
+ var offset = {
+ x: _touches$.x,
+ y: _touches$.y
+ };
+ opts.tooltip = {
+ textList: textList,
+ offset: offset,
+ option: option,
+ index: index
+ };
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+};
+
+Charts.prototype.translate = function(distance) {
+ this.scrollOption = {
+ currentOffset: distance,
+ startTouchX: distance,
+ distance: 0,
+ lastMoveTime: 0
+ };
+ let opts = assign({}, this.opts, {
+ _scrollDistance_: distance,
+ animation: false
+ });
+ drawCharts.call(this, this.opts.type, opts, this.config, this.context);
+};
+
+Charts.prototype.scrollStart = function(e) {
+ var touches = null;
+ if (e.changedTouches) {
+ touches = e.changedTouches[0];
+ } else {
+ touches = e.mp.changedTouches[0];
+ }
+ var _touches$ = getTouches(touches, this.opts, e);
+ if (touches && this.opts.enableScroll === true) {
+ this.scrollOption.startTouchX = _touches$.x;
+ }
+};
+
+Charts.prototype.scroll = function(e) {
+ if (this.scrollOption.lastMoveTime === 0) {
+ this.scrollOption.lastMoveTime = Date.now();
+ }
+ let Limit = this.opts.extra.touchMoveLimit || 20;
+ let currMoveTime = Date.now();
+ let duration = currMoveTime - this.scrollOption.lastMoveTime;
+ if (duration < Math.floor(1000 / Limit)) return;
+ this.scrollOption.lastMoveTime = currMoveTime;
+ var touches = null;
+ if (e.changedTouches) {
+ touches = e.changedTouches[0];
+ } else {
+ touches = e.mp.changedTouches[0];
+ }
+ if (touches && this.opts.enableScroll === true) {
+ var _touches$ = getTouches(touches, this.opts, e);
+ var _distance;
+ _distance = _touches$.x - this.scrollOption.startTouchX;
+ var currentOffset = this.scrollOption.currentOffset;
+ var validDistance = calValidDistance(currentOffset + _distance, this.opts.chartData, this.config, this.opts);
+ this.scrollOption.distance = _distance = validDistance - currentOffset;
+ var opts = assign({}, this.opts, {
+ _scrollDistance_: currentOffset + _distance,
+ animation: false
+ });
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ return currentOffset + _distance;
+ }
+};
+
+Charts.prototype.scrollEnd = function(e) {
+ if (this.opts.enableScroll === true) {
+ var _scrollOption = this.scrollOption,
+ currentOffset = _scrollOption.currentOffset,
+ distance = _scrollOption.distance;
+ this.scrollOption.currentOffset = currentOffset + distance;
+ this.scrollOption.distance = 0;
+ }
+};
+if (typeof module === "object" && typeof module.exports === "object") {
+ module.exports = Charts;
+ //export default Charts;//建议使用nodejs的module导出方式,如报错请使用export方式导出
+}
diff --git a/components/u-link/u-link.vue b/components/u-link/u-link.vue
new file mode 100644
index 0000000..de56c41
--- /dev/null
+++ b/components/u-link/u-link.vue
@@ -0,0 +1,59 @@
+
+ {{text}}
+
+
+
+
+
diff --git a/hybrid/html/local.html b/hybrid/html/local.html
new file mode 100644
index 0000000..9a21210
--- /dev/null
+++ b/hybrid/html/local.html
@@ -0,0 +1,88 @@
+
+
+
+
+
+ 本地网页
+
+
+
+ web-view 组件加载本地 html 示例,仅在 App 环境下生效。点击下列按钮,跳转至其它页面。
+
+
+
+
+
+
+
+ 网页向应用发送消息。注意:小程序端应用会在此页面后退时接收到消息。
+
+
+
+
+
+
+
+
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..c3ff205
--- /dev/null
+++ b/index.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..be05ed1
--- /dev/null
+++ b/main.js
@@ -0,0 +1,39 @@
+import App from './App'
+import store from './store'
+
+// #ifndef VUE3
+import Vue from 'vue'
+Vue.config.productionTip = false
+Vue.prototype.$store = store
+Vue.prototype.$adpid = "1111111111"
+Vue.prototype.$backgroundAudioData = {
+ playing: false,
+ playTime: 0,
+ formatedPlayTime: '00:00:00'
+}
+App.mpType = 'app'
+const app = new Vue({
+ store,
+ ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import {
+ createSSRApp
+} from 'vue'
+export function createApp() {
+ const app = createSSRApp(App)
+ app.use(store)
+ app.config.globalProperties.$adpid = "1111111111"
+ app.config.globalProperties.$backgroundAudioData = {
+ playing: false,
+ playTime: 0,
+ formatedPlayTime: '00:00:00'
+ }
+ return {
+ app
+ }
+}
+// #endif
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..83f4c70
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,192 @@
+{
+ "name" : "mini-test",
+ "appid" : "__UNI__7850BDB",
+ "description" : "uni-app 框架示例,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,请使用手机扫码快速体验 uni-app 的强大功能",
+ "versionName" : "1.0.0",
+ "versionCode" : "100",
+ "transformPx" : false,
+ "app-plus" : {
+ "usingComponents" : true,
+ "nvueCompiler" : "uni-app",
+ "nvueStyleCompiler" : "uni-app",
+ "compilerVersion" : 3,
+ "nvueLaunchMode" : "fast",
+ "splashscreen" : {
+ "alwaysShowBeforeRender" : true,
+ "waiting" : true,
+ "autoclose" : true,
+ "delay" : 0
+ },
+ "modules" : {
+ "OAuth" : {},
+ "Payment" : {},
+ "Push" : {},
+ "Share" : {},
+ "Speech" : {},
+ "VideoPlayer" : {}
+ },
+ "distribute" : {
+ "android" : {
+ "permissions" : [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ "ios" : {
+ "UIBackgroundModes" : [ "audio" ],
+ "urlschemewhitelist" : [ "baidumap", "iosamap" ]
+ },
+ "sdkConfigs" : {
+ "speech" : {
+ "ifly" : {}
+ }
+ },
+ "orientation" : [ "portrait-primary" ]
+ },
+ "uniStatistics" : {
+ "enable" : true
+ }
+ },
+ "quickapp" : {},
+ "quickapp-native" : {
+ "icon" : "/static/logo.png",
+ "package" : "com.example.demo",
+ "features" : [
+ {
+ "name" : "system.clipboard"
+ }
+ ]
+ },
+ "quickapp-webview" : {
+ "icon" : "/static/logo.png",
+ "package" : "com.example.demo",
+ "minPlatformVersion" : 1070,
+ "versionName" : "1.0.0",
+ "versionCode" : 100
+ },
+ "mp-weixin" : {
+ "appid" : "wxdaa0c852bdfa9d24",
+ "setting" : {
+ "urlCheck" : false
+ },
+ "usingComponents" : true,
+ "permission" : {
+ "scope.userLocation" : {
+ "desc" : "演示定位能力"
+ }
+ },
+ "uniStatistics" : {
+ "enable" : true
+ }
+ },
+ "mp-alipay" : {
+ "usingComponents" : true,
+ "uniStatistics" : {
+ "enable" : true
+ }
+ },
+ "mp-baidu" : {
+ "usingComponents" : true,
+ "uniStatistics" : {
+ "enable" : true
+ },
+ "dynamicLib" : {
+ "editorLib" : {
+ "provider" : "swan-editor"
+ }
+ }
+ },
+ "mp-toutiao" : {
+ "usingComponents" : true,
+ "uniStatistics" : {
+ "enable" : true
+ }
+ },
+ "mp-jd" : {
+ "usingComponents" : true,
+ "uniStatistics" : {
+ "enable" : true
+ }
+ },
+ "h5" : {
+ "template" : "template.h5.html",
+ "router" : {
+ "mode" : "history",
+ "base" : ""
+ },
+ "sdkConfigs" : {
+ "maps" : {
+ "qqmap" : {
+ "key" : "TKUBZ-D24AF-GJ4JY-JDVM2-IBYKK-KEBCU"
+ }
+ }
+ },
+ "async" : {
+ "timeout" : 20000
+ },
+ "uniStatistics" : {
+ "enable" : true
+ }
+ },
+ "vueVersion" : "3",
+ "mp-kuaishou" : {
+ "uniStatistics" : {
+ "enable" : true
+ }
+ },
+ "mp-lark" : {
+ "uniStatistics" : {
+ "enable" : true
+ }
+ },
+ "mp-qq" : {
+ "uniStatistics" : {
+ "enable" : true
+ }
+ },
+ "quickapp-webview-huawei" : {
+ "uniStatistics" : {
+ "enable" : true
+ }
+ },
+ "quickapp-webview-union" : {
+ "uniStatistics" : {
+ "enable" : true
+ }
+ },
+ "uniStatistics" : {
+ "version" : "2",
+ "enable" : true
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..b9c298a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,115 @@
+{
+ "id": "hello-uniapp",
+ "name": "hello-uniapp",
+ "displayName": "hello-uniapp 示例工程",
+ "version": "3.4.5",
+ "description": "uni-app 框架示例,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,请使用手机扫码快速体验 uni-app 的强大功能",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": "https://github.com/dcloudio/hello-uniapp.git",
+ "keywords": [
+ "hello-uniapp",
+ "uni-app",
+ "uni-ui",
+ "示例工程"
+ ],
+ "author": "",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/dcloudio/hello-uniapp/issues"
+ },
+ "homepage": "https://github.com/dcloudio/hello-uniapp#readme",
+ "dependencies": {},
+ "dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "",
+ "type": "uniapp-template-project"
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "京东": "y",
+ "钉钉": "y",
+ "快手": "y",
+ "飞书": "y"
+ },
+ "快应用": {
+ "华为": "y",
+ "联盟": "y"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ },
+
+ "uni-app": {
+ "scripts": {
+ "mp-dingtalk": {
+ "title": "钉钉小程序",
+ "env": {
+ "UNI_PLATFORM": "mp-alipay"
+ },
+ "define": {
+ "MP-DINGTALK": true
+ }
+ },
+ "hello-uniapp-demo": {
+ "title": "hello-uniapp 演示网站",
+ "env": {
+ "UNI_PLATFORM": "h5"
+ },
+ "define": {
+ "H5-DEMO": true
+ }
+ }
+ }
+ }
+}
diff --git a/pages.json b/pages.json
new file mode 100644
index 0000000..63df920
--- /dev/null
+++ b/pages.json
@@ -0,0 +1,1510 @@
+{
+ "leftWindow": {
+ "path": "windows/left-window.vue",
+ "style": {
+ "width": "350px"
+ }
+ },
+ "topWindow": {
+ "path": "windows/top-window.vue",
+ "style": {
+ "height": "60px"
+ }
+ },
+ "pages": [
+ // pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+ {
+ "path": "pages/zyb/home",
+ "style": {
+ "navigationBarTitleText": "首页",
+ "app-plus": {
+ "bounce": "vertical",
+ "titleNView": {
+ "buttons": [{
+ "text": "\ue534",
+ "fontSrc": "/static/uni.ttf",
+ "fontSize": "22px",
+ "color": "#FFFFFF"
+ }]
+ }
+ }
+ }
+ },
+ /*我的志愿*/
+ {
+ "path": "pages/zyb/fillVolunteer/list",
+ "style": {
+ "navigationBarTitleText": "我的志愿",
+ "navigationBarBackgroundColor": "#ffffff",
+ "navigationBarTextStyle":"black",
+ "app-plus": {
+ "bounce": "vertical",
+ "titleNView": {
+ "buttons": [{
+ "text": "\ue534",
+ "fontSrc": "/static/uni.ttf",
+ "fontSize": "22px",
+ "color": "#FFFFFF"
+ }]
+ }
+ }
+ }
+ },
+ /*我的志愿-详情明细*/
+ {
+ "path": "pages/zyb/fillVolunteer/detail",
+ "style": {
+ "navigationBarTitleText": "我的志愿",
+ "navigationBarBackgroundColor": "#ffffff",
+ "navigationBarTextStyle":"black",
+ "app-plus": {
+ "bounce": "vertical",
+ "titleNView": {
+ "buttons": [{
+ "text": "\ue534",
+ "fontSrc": "/static/uni.ttf",
+ "fontSize": "22px",
+ "color": "#FFFFFF"
+ }]
+ }
+ }
+ }
+ },
+ {
+ "path": "pages/zyb/user/center",
+ "style": {
+ "navigationBarTitleText": "个人中心",
+ "app-plus": {
+ "bounce": "vertical",
+ "titleNView": {
+ "buttons": [{
+ "text": "\ue534",
+ "fontSrc": "/static/uni.ttf",
+ "fontSize": "22px",
+ "color": "#FFFFFF"
+ }]
+ }
+ }
+ }
+ },
+
+ {
+ "path": "pages/zyb/fillVolunteer/index",
+ "style": {
+ "navigationBarTitleText": "智能推荐",
+ "navigationBarBackgroundColor": "#ffffff",
+ "navigationBarTextStyle":"black",
+ "app-plus": {
+ "bounce": "vertical",
+ "titleNView": {
+ "buttons": [{
+ "text": "\ue534",
+ "fontSrc": "/static/uni.ttf",
+ "fontSize": "22px",
+ "color": "#FFFFFF"
+ }]
+ }
+ }
+ }
+ },
+ {
+ "path": "pages/zyb/score/edit",
+ "style": {
+ "navigationBarTitleText": "成绩管理",
+ "app-plus": {
+ "bounce": "vertical",
+ "titleNView": {
+ "buttons": [{
+ "text": "\ue534",
+ "fontSrc": "/static/uni.ttf",
+ "fontSize": "22px",
+ "color": "#FFFFFF"
+ }]
+ }
+ }
+ }
+ },
+
+
+ {
+ "path": "pages/tabBar/component/component",
+ "style": {
+ "navigationBarTitleText": "内置组件",
+ "app-plus": {
+ "bounce": "vertical",
+ "titleNView": {
+ "buttons": [{
+ "text": "\ue534",
+ "fontSrc": "/static/uni.ttf",
+ "fontSize": "22px",
+ "color": "#FFFFFF"
+ }]
+ }
+ }
+ }
+ },
+ {
+ "path": "pages/tabBar/API/API",
+ "style": {
+ "navigationBarTitleText": "接口",
+ "app-plus": {
+ "titleNView": {
+ "buttons": [{
+ "text": "\ue534",
+ "fontSrc": "/static/uni.ttf",
+ "fontSize": "22px",
+ "color": "#FFFFFF"
+ }]
+ }
+ }
+ }
+ },
+ {
+ "path": "pages/tabBar/template/template",
+ "style": {
+ "navigationBarTitleText": "模版",
+ "app-plus": {
+ "titleNView": {
+ "buttons": [{
+ "text": "\ue534",
+ "fontSrc": "/static/uni.ttf",
+ "fontSize": "22px",
+ "color": "#FFFFFF"
+ }]
+ }
+ }
+ }
+ },
+ {
+ "path": "pages/tabBar/extUI/extUI",
+ "style": {
+ "navigationBarTitleText": "扩展组件",
+ "app-plus": {
+ "titleNView": {
+ "buttons": [{
+ "text": "\ue534",
+ "fontSrc": "/static/uni.ttf",
+ "fontSize": "22px",
+ "color": "#FFFFFF"
+ }]
+ }
+ }
+ }
+ },
+ {
+ "path": "pages/component/view/view",
+ "style": {
+ "navigationBarTitleText": "view"
+ }
+ },
+ {
+ "path": "pages/component/scroll-view/scroll-view",
+ "style": {
+ "navigationBarTitleText": "scroll-view"
+ }
+ },
+ {
+ "path": "pages/component/swiper/swiper",
+ "style": {
+ "navigationBarTitleText": "swiper"
+ }
+ },
+ // #ifndef MP-TOUTIAO
+ {
+ "path": "pages/component/cover-view/cover-view",
+ "style": {
+ "navigationBarTitleText": "cover-view"
+ }
+ },
+ {
+ "path": "pages/component/movable-view/movable-view",
+ "style": {
+ "navigationBarTitleText": "movable-view"
+ }
+ },
+ // #endif
+ {
+ "path": "pages/component/text/text",
+ "style": {
+ "navigationBarTitleText": "text"
+ }
+ },
+ {
+ "path": "pages/component/rich-text/rich-text",
+ "style": {
+ "navigationBarTitleText": "rich-text"
+ }
+ },
+ {
+ "path": "pages/component/progress/progress",
+ "style": {
+ "navigationBarTitleText": "progress"
+ }
+ },
+ {
+ "path": "pages/component/button/button",
+ "style": {
+ "navigationBarTitleText": "button"
+ }
+ },
+ {
+ "path": "pages/component/checkbox/checkbox",
+ "style": {
+ "navigationBarTitleText": "checkbox"
+ }
+ },
+ {
+ "path": "pages/component/form/form",
+ "style": {
+ "navigationBarTitleText": "form"
+ }
+ },
+ {
+ "path": "pages/component/input/input",
+ "style": {
+ "navigationBarTitleText": "input",
+ "app-plus": {
+ "softinputNavBar": "none"
+ }
+ }
+ },
+ {
+ "path": "pages/component/label/label",
+ "style": {
+ "navigationBarTitleText": "label"
+ }
+ },
+ {
+ "path": "pages/component/picker/picker",
+ "style": {
+ "navigationBarTitleText": "picker"
+ }
+ },
+ {
+ "path": "pages/component/picker-view/picker-view",
+ "style": {
+ "navigationBarTitleText": "picker-view"
+ }
+ },
+ {
+ "path": "pages/component/radio/radio",
+ "style": {
+ "navigationBarTitleText": "radio"
+ }
+ },
+ {
+ "path": "pages/component/slider/slider",
+ "style": {
+ "navigationBarTitleText": "slider"
+ }
+ },
+ {
+ "path": "pages/component/switch/switch",
+ "style": {
+ "navigationBarTitleText": "switch"
+ }
+ },
+ {
+ "path": "pages/component/textarea/textarea",
+ "style": {
+ "navigationBarTitleText": "textarea"
+ }
+ },
+ // #ifdef APP-PLUS || MP-WEIXIN || H5 || MP-BAIDU
+ {
+ "path": "pages/component/editor/editor",
+ "style": {
+ "navigationBarTitleText": "editor",
+ "app-plus": {
+ "softinputMode": "adjustResize"
+ }
+ // #ifdef MP-BAIDU
+ ,"usingComponents": {
+ "editor": "dynamicLib://editorLib/editor"
+ }
+ // #endif
+ }
+ },
+ // #endif
+ {
+ "path": "pages/component/navigator/navigator",
+ "style": {
+ "navigationBarTitleText": "navigator"
+ }
+ },
+ {
+ "path": "pages/component/navigator/navigate/navigate",
+ "style": {
+ "navigationBarTitleText": "navigatePage"
+ }
+ },
+ {
+ "path": "pages/component/navigator/redirect/redirect",
+ "style": {
+ "navigationBarTitleText": "redirectPage"
+ }
+ },
+ {
+ "path": "pages/component/image/image",
+ "style": {
+ "navigationBarTitleText": "image"
+ }
+ },
+ {
+ "path": "pages/component/video/video",
+ "style": {
+ "navigationBarTitleText": "video"
+ }
+ },
+ // #ifndef MP-ALIPAY || MP-TOUTIAO || VUE3
+ // {
+ // "path": "pages/component/audio/audio",
+ // "style": {
+ // "navigationBarTitleText": "audio"
+ // }
+ // },
+ // #endif
+ // #ifndef MP-TOUTIAO
+ {
+ "path": "pages/component/map/map",
+ "style": {
+ "navigationBarTitleText": "map"
+ }
+ },
+ // #endif
+ {
+ "path": "pages/component/canvas/canvas",
+ "style": {
+ "navigationBarTitleText": "canvas"
+ }
+ },
+ {
+ "path": "pages/component/web-view/web-view",
+ "style": {
+ "navigationBarTitleText": "web-view"
+ }
+ },
+ // #ifdef APP-VUE || APP-NVUE
+ {
+ "path": "pages/component/ad/ad",
+ "style": {
+ "navigationBarTitleText": "AD"
+ }
+ },
+ // #endif
+ // #ifdef APP-PLUS || H5
+ {
+ "path": "pages/component/web-view-local/web-view-local",
+ "style": {}
+ },
+ // #endif
+ {
+ "path": "platforms/app-plus/speech/speech",
+ "style": {
+ "navigationBarTitleText": "语音识别"
+ }
+ },
+ {
+ "path": "platforms/app-plus/orientation/orientation",
+ "style": {
+ "navigationBarTitleText": "方向传感器"
+ }
+ },
+ {
+ "path": "platforms/app-plus/proximity/proximity",
+ "style": {
+ "navigationBarTitleText": "距离传感器"
+ }
+ },
+ {
+ "path": "platforms/app-plus/push/push",
+ "style": {
+ "navigationBarTitleText": "推送"
+ }
+ },
+ {
+ "path": "platforms/app-plus/shake/shake",
+ "style": {
+ "navigationBarTitleText": "摇一摇"
+ }
+ },
+ // #ifdef H5 || APP-PLUS
+ {
+ "path": "pages/about/about",
+ "style": {
+ "navigationBarTitleText": "关于"
+ }
+ },
+ // #endif
+ {
+ "path": "platforms/app-plus/feedback/feedback",
+ "style": {
+ "navigationBarTitleText": "问题反馈"
+ }
+ }
+ // #ifdef H5
+ , {
+ "path": "pages/error/404",
+ "style": {
+ "navigationBarTitleText": "Not Found"
+ }
+ }
+ // #endif
+ ,{
+ "path": "uni_modules/uni-upgrade-center-app/pages/upgrade-popup",
+ "style": {
+ "app-plus": {
+ "animationDuration": 200,
+ "animationType": "fade-in",
+ "background": "transparent",
+ "backgroundColorTop": "transparent",
+ "popGesture": "none",
+ "scrollIndicator": false,
+ "titleNView": false
+ },
+ "disableScroll": true
+ }
+}
+],
+ "subPackages": [{
+ "root": "pages/API",
+ "pages": [{
+ "path": "login/login",
+ "style": {
+ "navigationBarTitleText": "授权登录"
+ }
+ },
+ // #ifdef APP-PLUS
+ {
+ "path": "subnvue/subnvue",
+ "style": {
+ "navigationBarTitleText": "原生子窗体",
+ "app-plus": {
+ "subNVues": [{
+ "id": "drawer",
+ "path": "subnvue/subnvue/drawer",
+ "type": "popup",
+ "style": {
+ "width": "50%"
+ }
+ }, {
+ "id": "popup",
+ "path": "subnvue/subnvue/popup",
+ "type": "popup",
+ "style": {
+ "margin": "auto",
+ "width": "80%",
+ "height": "600rpx"
+ }
+ }, {
+ "id": "video_mask",
+ "path": "subnvue/subnvue/video-mask",
+ "style": {
+ "position": "absolute",
+ "bottom": "30px",
+ "left": "0",
+ "width": "230px",
+ "height": "110px",
+ "background": "transparent"
+ }
+ }]
+ }
+ }
+ },
+ // #endif
+ {
+ "path": "get-user-info/get-user-info",
+ "style": {
+ "navigationBarTitleText": "获取用户信息"
+ }
+ },
+ {
+ "path": "request-payment/request-payment",
+ "style": {
+ "navigationBarTitleText": "发起支付"
+ }
+ },
+ {
+ "path": "share/share",
+ "style": {
+ "navigationBarTitleText": "分享"
+ }
+ },
+ {
+ "path": "set-navigation-bar-title/set-navigation-bar-title",
+ "style": {
+ "navigationBarTitleText": "设置界面标题"
+ }
+ },
+ {
+ "path": "show-loading/show-loading",
+ "style": {
+ "navigationBarTitleText": "加载提示框"
+ }
+ },
+ {
+ "path": "navigator/navigator",
+ "style": {
+ "navigationBarTitleText": "页面跳转"
+ }
+ },
+ {
+ "path": "navigator/new-page/new-vue-page-1",
+ "style": {
+ "navigationBarTitleText": "新VUE页面1"
+ }
+ },
+ {
+ "path": "navigator/new-page/new-vue-page-2",
+ "style": {
+ "navigationBarTitleText": "新VUE页面2"
+ }
+ },
+ // #ifndef VUE3
+ {
+ "path": "navigator/new-page/new-nvue-page-1",
+ "style": {
+ "navigationBarTitleText": "新NVUE页面1"
+ }
+ },
+ {
+ "path": "navigator/new-page/new-nvue-page-2",
+ "style": {
+ "navigationBarTitleText": "新NVUE页面2"
+ }
+ },
+ // #endif
+ {
+ "path": "pull-down-refresh/pull-down-refresh",
+ "style": {
+ "navigationBarTitleText": "下拉刷新",
+ "enablePullDownRefresh": true
+ }
+ },
+ {
+ "path": "animation/animation",
+ "style": {
+ "navigationBarTitleText": "创建动画"
+ }
+ },
+ {
+ "path": "get-node-info/get-node-info",
+ "style": {
+ "navigationBarTitleText": "节点信息"
+ }
+ },
+ {
+ "path": "intersection-observer/intersection-observer",
+ "style": {
+ "navigationBarTitleText": "节点布局相交状态"
+ }
+ },
+ {
+ "path": "canvas/canvas",
+ "style": {
+ "navigationBarTitleText": "创建绘画"
+ }
+ },
+ {
+ "path": "action-sheet/action-sheet",
+ "style": {
+ "navigationBarTitleText": "操作菜单"
+ }
+ },
+ {
+ "path": "modal/modal",
+ "style": {
+ "navigationBarTitleText": "模态弹窗"
+ }
+ },
+ {
+ "path": "toast/toast",
+ "style": {
+ "navigationBarTitleText": "消息提示框"
+ }
+ },
+ {
+ "path": "get-network-type/get-network-type",
+ "style": {
+ "navigationBarTitleText": "获取设备网络状态"
+ }
+ },
+ {
+ "path": "get-system-info/get-system-info",
+ "style": {
+ "navigationBarTitleText": "获取设备系统信息"
+ }
+ },
+ {
+ "path": "add-phone-contact/add-phone-contact",
+ "style": {
+ "navigationBarTitleText": "添加手机联系人"
+ }
+ },
+ {
+ "path": "on-accelerometer-change/on-accelerometer-change",
+ "style": {
+ "navigationBarTitleText": "监听加速度计数据"
+ }
+ },
+ {
+ "path": "on-compass-change/on-compass-change",
+ "style": {
+ "navigationBarTitleText": "监听罗盘数据"
+ }
+ },
+ {
+ "path": "make-phone-call/make-phone-call",
+ "style": {
+ "navigationBarTitleText": "打电话"
+ }
+ },
+ {
+ "path": "scan-code/scan-code",
+ "style": {
+ "navigationBarTitleText": "扫码"
+ }
+ },
+ {
+ "path": "clipboard/clipboard",
+ "style": {
+ "navigationBarTitleText": "剪贴板"
+ }
+ },
+ {
+ "path": "request/request",
+ "style": {
+ "navigationBarTitleText": "网络请求"
+ }
+ },
+ {
+ "path": "upload-file/upload-file",
+ "style": {
+ "navigationBarTitleText": "上传文件"
+ }
+ },
+ {
+ "path": "download-file/download-file",
+ "style": {
+ "navigationBarTitleText": "下载文件"
+ }
+ },
+ {
+ "path": "image/image",
+ "style": {
+ "navigationBarTitleText": "图片"
+ }
+ },
+ {
+ "path": "voice/voice",
+ "style": {
+ "navigationBarTitleText": "录音"
+ }
+ },
+ {
+ "path": "inner-audio/inner-audio",
+ "style": {
+ "navigationBarTitleText": "音频"
+ }
+ },
+ {
+ "path": "background-audio/background-audio",
+ "style": {
+ "navigationBarTitleText": "背景音频"
+ }
+ },
+ {
+ "path": "video/video",
+ "style": {
+ "navigationBarTitleText": "视频"
+ }
+ },
+ {
+ "path": "file/file",
+ "style": {
+ "navigationBarTitleText": "文件"
+ }
+ },
+ // #ifndef MP-QQ || MP-TOUTIAO
+ {
+ "path": "map/map",
+ "style": {
+ "navigationBarTitleText": "map"
+ }
+ },
+ // #endif
+ // #ifdef APP-PLUS
+ {
+ "path": "map-search/map-search",
+ "style": {
+ "navigationBarTitleText": "map search"
+ }
+ },
+ // #endif
+ {
+ "path": "get-location/get-location",
+ "style": {
+ "navigationBarTitleText": "获取位置"
+ }
+ },
+ {
+ "path": "open-location/open-location",
+ "style": {
+ "navigationBarTitleText": "查看位置"
+ }
+ },
+ // #ifndef MP-TOUTIAO
+ {
+ "path": "choose-location/choose-location",
+ "style": {
+ "navigationBarTitleText": "使用地图选择位置"
+ }
+ },
+ // #endif
+ {
+ "path": "storage/storage",
+ "style": {
+ "navigationBarTitleText": "数据存储"
+ }
+ },
+ {
+ "path": "sqlite/sqlite",
+ "style": {
+ "navigationBarTitleText": "SQLite"
+ }
+ },
+ // #ifdef APP-PLUS || MP-WEIXIN
+ {
+ "path": "rewarded-video-ad/rewarded-video-ad",
+ "style": {
+ "navigationBarTitleText": "激励视频广告"
+ }
+ },
+ // #endif
+ // #ifdef APP-PLUS
+ {
+ "path": "full-screen-video-ad/full-screen-video-ad",
+ "style": {
+ "navigationBarTitleText": "全屏视频广告"
+ }
+ },
+ // #endif
+ // #ifndef H5
+ {
+ "path": "brightness/brightness",
+ "style": {
+ "navigationBarTitleText": "屏幕亮度"
+ }
+ },
+ // #endif
+ // #ifndef H5 || MP-ALIPAY
+ {
+ "path": "save-media/save-media",
+ "style": {
+ "navigationBarTitleText": "保存媒体到本地"
+ }
+ },
+ // #endif
+ // #ifdef APP-PLUS || MP-WEIXIN || MP-QQ || MP-JD
+ {
+ "path": "bluetooth/bluetooth",
+ "style": {
+ "navigationBarTitleText": "蓝牙"
+ }
+ },
+ {
+ "path": "soter/soter",
+ "style": {
+ "navigationBarTitleText": "生物认证"
+ }
+ },
+ // #endif
+ // #ifdef APP-PLUS || MP-WEIXIN
+ {
+ "path": "ibeacon/ibeacon",
+ "style": {
+ "navigationBarTitleText": "iBeacon"
+ }
+ },
+ // #endif
+ {
+ "path": "vibrate/vibrate",
+ "style": {
+ "navigationBarTitleText": "震动"
+ }
+ },
+ // #ifndef MP-ALIPAY
+ {
+ "path": "websocket-socketTask/websocket-socketTask",
+ "style": {
+ "navigationBarTitleText": "websocket-socketTask"
+ }
+ },
+ // #endif
+ {
+ "path": "websocket-global/websocket-global",
+ "style": {
+ "navigationBarTitleText": "websocket-global"
+ }
+ }
+ ]
+ },
+ {
+ "root": "pages/extUI",
+ "pages": [{
+ "path": "forms/forms",
+ "style": {
+ "navigationBarTitleText": "Form 表单"
+ }
+ },
+ {
+ "path": "group/group",
+ "style": {
+ "navigationBarTitleText": "Group 分组"
+ }
+ },
+ {
+ "path": "badge/badge",
+ "style": {
+ "navigationBarTitleText": "Badge 数字角标"
+ }
+ },
+ {
+ "path": "breadcrumb/breadcrumb",
+ "style": {
+ "navigationBarTitleText": "Breadcrumb 面包屑"
+ }
+ },
+ {
+ "path": "countdown/countdown",
+ "style": {
+ "navigationBarTitleText": "Countdown 倒计时"
+ }
+ },
+ {
+ "path": "drawer/drawer",
+ "style": {
+ "navigationBarTitleText": "Drawer 抽屉"
+ }
+ },
+ {
+ "path": "icons/icons",
+ "style": {
+ "navigationBarTitleText": "Icons 图标"
+ }
+ },
+ {
+ "path": "load-more/load-more",
+ "style": {
+ "navigationBarTitleText": "LoadMore 加载更多"
+ }
+ },
+ {
+ "path": "nav-bar/nav-bar",
+ "style": {
+ "navigationBarTitleText": "NavBar 导航栏",
+ "navigationStyle": "custom",
+ "enablePullDownRefresh": true,
+ "app-plus": {
+ "titleNView": false,
+ "bounce": "none",
+ "pullToRefresh": {
+ "style": "circle",
+ "offset": "70px"
+ }
+ }
+ }
+ },
+ {
+ "path": "number-box/number-box",
+ "style": {
+ "navigationBarTitleText": "NumberBox 数字输入框"
+ }
+ },
+ {
+ "path": "popup/popup",
+ "style": {
+ "navigationBarTitleText": "Popup 弹出层",
+ "app-plus": {
+ "softinputMode": "adjustResize"
+ }
+ }
+ },
+ {
+ "path": "segmented-control/segmented-control",
+ "style": {
+ "navigationBarTitleText": "SegmentedControl 分段器"
+ }
+ },
+ {
+ "path": "tag/tag",
+ "style": {
+ "navigationBarTitleText": "Tag 标签"
+ }
+ },
+ {
+ "path": "list/list",
+ "style": {
+ "navigationBarTitleText": "List 列表"
+ }
+ },
+ {
+ "path": "card/card",
+ "style": {
+ "navigationBarTitleText": "Card 卡片"
+ }
+ },
+ {
+ "path": "collapse/collapse",
+ "style": {
+ "navigationBarTitleText": "Collapse 折叠面板"
+ }
+ },
+ {
+ "path": "pagination/pagination",
+ "style": {
+ "navigationBarTitleText": "Pagination 分页器"
+ }
+ },
+ {
+ "path": "swiper-dot/swiper-dot",
+ "style": {
+ "navigationBarTitleText": "SwiperDot 轮播图指示点",
+ "mp-baidu": {
+ "disableSwipeBack": true
+ }
+ }
+ },
+ {
+ "path": "grid/grid",
+ "style": {
+ "navigationBarTitleText": "Grid 宫格"
+ }
+ },
+ {
+ "path": "rate/rate",
+ "style": {
+ "navigationBarTitleText": "Rate 评分"
+ }
+ },
+ {
+ "path": "steps/steps",
+ "style": {
+ "navigationBarTitleText": "Steps 步骤条"
+ }
+ },
+ {
+ "path": "notice-bar/notice-bar",
+ "style": {
+ "navigationBarTitleText": "NoticeBar 通告栏"
+ }
+ },
+ {
+ "path": "swipe-action/swipe-action",
+ "style": {
+ "navigationBarTitleText": "SwipeAction 滑动操作",
+ "app-plus": {
+ "bounce": "none"
+ }
+ }
+ },
+ {
+ "path": "search-bar/search-bar",
+ "style": {
+ "navigationBarTitleText": "SearchBar 搜索栏"
+ }
+ },
+ {
+ "path": "calendar/calendar",
+ "style": {
+ "navigationBarTitleText": "Calendar 日历"
+ }
+ },
+ {
+ "path": "indexed-list/indexed-list",
+ "style": {
+ "navigationBarTitleText": "IndexedList 索引列表",
+ "mp-weixin": {
+ "disableScroll": true
+ },
+ "app-plus": {
+ "bounce": "none"
+ },
+ "mp-alipay": {
+ "allowsBounceVertical": "NO"
+ },
+ "mp-baidu": {
+ "disableScroll": true
+ }
+ }
+ },
+ {
+ "path": "fab/fab",
+ "style": {
+ "navigationBarTitleText": "Fab 悬浮按钮"
+ }
+ },
+ {
+ "path": "fav/fav",
+ "style": {
+ "navigationBarTitleText": "Fav 收藏按钮"
+ }
+ },
+ {
+ "path": "goods-nav/goods-nav",
+ "style": {
+ "navigationBarTitleText": "GoodsNav 商品导航"
+ }
+ },
+ {
+ "path": "section/section",
+ "style": {
+ "navigationBarTitleText": "Section 标题栏"
+ }
+ },
+ {
+ "path": "transition/transition",
+ "style": {
+ "navigationBarTitleText": "Transition 过渡动画"
+ }
+ },
+ {
+ "path": "title/title",
+ "style": {
+ "navigationBarTitleText": "Title 章节标题"
+ }
+ },
+ {
+ "path": "tooltip/tooltip",
+ "style": {
+ "navigationBarTitleText": "Tooltip 文字提示"
+ }
+ },
+ {
+ "path": "link/link",
+ "style": {
+ "navigationBarTitleText": "Link 链接"
+ }
+ },
+ {
+ "path": "combox/combox",
+ "style": {
+ "navigationBarTitleText": "Combox 组合框"
+ }
+ },
+ {
+ "path": "list/chat",
+ "style": {}
+ },
+ {
+ "path": "table/table",
+ "style": {
+ "navigationBarTitleText": "",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "dateformat/dateformat",
+ "style": {
+ "navigationBarTitleText": "Dateformat 日期格式化",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "data-checkbox/data-checkbox",
+ "style": {
+ "navigationBarTitleText": "DataCheckbox 单选复选框",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "easyinput/easyinput",
+ "style": {
+ "navigationBarTitleText": "Easyinput 增强输入框",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "data-picker/data-picker",
+ "style": {
+ "navigationBarTitleText": "DataPicker 级联选择",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "data-select/data-select",
+ "style": {
+ "navigationBarTitleText": "DataSelect 下拉框",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "datetime-picker/datetime-picker",
+ "style": {
+ "navigationBarTitleText": "DatetimePicker 日期时间",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "row/row",
+ "style": {
+ "navigationBarTitleText": "Layout 布局",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "file-picker/file-picker",
+ "style": {
+ "navigationBarTitleText": "FilePicker 文件选择上传",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "space/space",
+ "style": {
+ "navigationBarTitleText": "间距",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "font/font",
+ "style": {
+ "navigationBarTitleText": "字体",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "color/color",
+ "style": {
+ "navigationBarTitleText": "颜色",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "radius/radius",
+ "style": {
+ "navigationBarTitleText": "圆角",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "button/button",
+ "style": {
+ "navigationBarTitleText": "",
+ "enablePullDownRefresh": false
+ }
+ }
+ ]
+ },
+ {
+ "root": "pages/template",
+ "pages": [
+ // #ifndef VUE3
+ {
+ "path": "ucharts/ucharts",
+ "style": {
+ "navigationBarTitleText": "uCharts 图表"
+ }
+ },
+ // #endif
+ {
+ "path": "nav-default/nav-default",
+ "style": {
+ "navigationBarTitleText": "默认导航栏"
+ }
+ },
+ {
+ "path": "component-communication/component-communication",
+ "style": {
+ "navigationBarTitleText": "组件通讯"
+ }
+ },
+ // #ifdef APP-PLUS || H5 || MP-ALIPAY
+ {
+ "path": "nav-transparent/nav-transparent",
+ "style": {
+ "navigationBarTitleText": "透明渐变导航栏",
+ "transparentTitle": "auto"
+ }
+ },
+ // #endif
+ // #ifdef APP-PLUS || H5
+ {
+ "path": "nav-button/nav-button",
+ "style": {
+ "navigationBarTitleText": "导航栏带自定义按钮",
+ "app-plus": {
+ "titleNView": {
+ "buttons": [{
+ "type": "share"
+ },
+ {
+ "type": "favorite"
+ }
+ ]
+ }
+ }
+ }
+ },
+ // #endif
+ // #ifdef APP-PLUS || H5 || MP-ALIPAY
+ {
+ "path": "nav-image/nav-image",
+ "style": {
+ "navigationBarBackgroundColor": "#FFFFFF",
+ "navigationBarTextStyle": "black",
+ "titleImage": "https://web-assets.dcloud.net.cn/unidoc/zh/logo1@2x.png"
+ }
+ },
+ // #endif
+ // #ifdef APP-PLUS || H5
+ {
+ "path": "nav-city-dropdown/nav-city-dropdown",
+ "style": {
+ "navigationBarTitleText": "导航栏带城市选择",
+ "app-plus": {
+ "titleNView": {
+ "buttons": [{
+ "text": "北京市",
+ "fontSize": "14",
+ "select": true,
+ "width": "auto"
+ }]
+ }
+ }
+ }
+ },
+ {
+ "path": "nav-dot/nav-dot",
+ "style": {
+ "navigationBarTitleText": "导航栏带红点和角标",
+ "app-plus": {
+ "titleNView": {
+ "buttons": [{
+ "text": "消息",
+ "fontSize": "14",
+ "redDot": true
+ },
+ {
+ "text": "关注",
+ "fontSize": "14",
+ "badgeText": "12"
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "path": "nav-search-input/nav-search-input",
+ "style": {
+ "navigationBarTitleText": "导航栏带搜索框",
+ "app-plus": {
+ "titleNView": {
+ "type": "transparent",
+ "titleColor": "#fff",
+ "backgroundColor": "#007AFF",
+ "buttons": [{
+ "fontSrc": "/static/uni.ttf",
+ "text": "\ue537",
+ "width": "40px",
+ "fontSize": "28px",
+ "color": "#fff",
+ "background": "rgba(0,0,0,0)"
+ }],
+ "searchInput": {
+ "backgroundColor": "#fff",
+ "borderRadius": "6px",
+ "placeholder": "请输入地址 如:大钟寺",
+ "disabled": true
+ }
+ }
+ }
+ }
+ },
+ {
+ "path": "nav-search-input/detail/detail",
+ "style": {
+ "navigationBarTitleText": "搜索",
+ "app-plus": {
+ "titleNView": {
+ "titleColor": "#fff",
+ "backgroundColor": "#007AFF",
+ "buttons": [{
+ "fontSrc": "/static/uni.ttf",
+ "text": "\ue537",
+ "width": "auto",
+ "fontSize": "28px",
+ "color": "#fff"
+ }],
+ "searchInput": {
+ "backgroundColor": "#fff",
+ "borderRadius": "6px",
+ "placeholder": "请输入地址 如:大钟寺",
+ "autoFocus": true
+ }
+ }
+ }
+ }
+ },
+ // #endif
+ {
+ "path": "list2detail-list/list2detail-list",
+ "style": {
+ "navigationBarTitleText": "列表到详情示例",
+ "enablePullDownRefresh": true
+ }
+ },
+ {
+ "path": "list2detail-detail/list2detail-detail",
+ "style": {
+ "navigationBarTitleText": "详情",
+ "app-plus": {
+ "titleNView": {
+ "type": "transparent",
+ "buttons": [{
+ "type": "share"
+ }]
+ }
+ },
+ "h5": {
+ "titleNView": {
+ "type": "transparent",
+ "buttons": []
+ }
+ }
+ }
+ },
+ {
+ "path": "tabbar/tabbar",
+ "style": {
+ "navigationBarTitleText": "可拖动顶部选项卡"
+ }
+ },
+ {
+ "path": "tabbar/detail/detail",
+ "style": {
+ "navigationBarTitleText": "详情页面"
+ }
+ },
+ // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-QQ
+ {
+ "path": "swiper-vertical/swiper-vertical",
+ "style": {
+ "navigationBarTitleText": "上下滑动切换视频",
+ "app-plus": {
+ "titleNView": false
+ }
+ }
+ },
+ {
+ "path": "swiper-list/swiper-list",
+ "style": {
+ "navigationBarTitleText": "swiper-list"
+ }
+ },
+ // #endif
+ // #ifdef APP-PLUS
+ {
+ "path": "swiper-list-nvue/swiper-list-nvue",
+ "style": {
+ "navigationBarTitleText": "swiper-list"
+ }
+ },
+ // #endif
+ {
+ "path": "scheme/scheme",
+ "style": {
+ "navigationBarTitleText": "打开外部应用"
+ }
+ },
+ // #ifdef APP-PLUS || MP-WEIXIN || MP-QQ || H5
+ // #ifndef VUE3
+ {
+ "path": "vant-button/vant-button",
+ "style": {
+ "navigationBarTitleText": "微信自定义组件示例",
+ "usingComponents": {
+ "van-button": "/wxcomponents/vant/button/index"
+ }
+ }
+ },
+ // #endif
+ // #endif
+ {
+ "path": "global/global",
+ "style": {
+ "navigationBarTitleText": "GlobalData和vuex"
+ }
+ }
+ ]
+ }
+ ],
+ "globalStyle": {
+ "pageOrientation": "portrait",
+ "navigationBarTitleText": "Hello uniapp",
+ "navigationBarTextStyle": "white",
+ "navigationBarBackgroundColor": "#007AFF",
+ "backgroundColor": "#F8F8F8",
+ "backgroundColorTop": "#F4F5F6",
+ "backgroundColorBottom": "#F4F5F6",
+ "mp-360": {
+ "navigationStyle": "custom"
+ },
+ "h5": {
+ "maxWidth": 1190,
+ "navigationBarTextStyle": "black",
+ "navigationBarBackgroundColor": "#F1F1F1"
+ }
+
+ },
+ "tabBar": {
+ "color": "#7A7E83",
+ "selectedColor": "#007AFF",
+ "borderStyle": "black",
+ "backgroundColor": "#F8F8F8",
+ "list": [
+ {
+ "pagePath": "pages/zyb/home",
+ "iconPath": "static/home.png",
+ "selectedIconPath": "static/home-active.png",
+ "text": "首页"
+ },
+ {
+ "pagePath": "pages/zyb/fillVolunteer/list",
+ "iconPath": "static/icons/write-l.png",
+ "selectedIconPath": "static/icons/write-l-active.png",
+ "text": "填志愿"
+ },
+ {
+ "pagePath": "pages/tabBar/component/component",
+ "iconPath": "static/component.png",
+ "selectedIconPath": "static/componentHL.png",
+ "text": "内置组件"
+ },
+ {
+ "pagePath": "pages/tabBar/API/API",
+ "iconPath": "static/api.png",
+ "selectedIconPath": "static/apiHL.png",
+ "text": "接口"
+ }, {
+ "pagePath": "pages/tabBar/extUI/extUI",
+ "iconPath": "static/extui.png",
+ "selectedIconPath": "static/extuiHL.png",
+ "text": "扩展组件"
+ }/*,
+ {
+ "pagePath": "pages/tabBar/template/template",
+ "iconPath": "static/template.png",
+ "selectedIconPath": "static/templateHL.png",
+ "text": "模板"
+ }*/
+ /*{
+ "pagePath": "pages/zyb/user/center",
+ "iconPath": "static/home.png",
+ "selectedIconPath": "static/home-active.png",
+ "text": "个人中心"
+ }*/
+ ]
+ }
+}
diff --git a/pages/API/action-sheet/action-sheet.vue b/pages/API/action-sheet/action-sheet.vue
new file mode 100644
index 0000000..90c035d
--- /dev/null
+++ b/pages/API/action-sheet/action-sheet.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/add-phone-contact/add-phone-contact.vue b/pages/API/add-phone-contact/add-phone-contact.vue
new file mode 100644
index 0000000..f4c39a3
--- /dev/null
+++ b/pages/API/add-phone-contact/add-phone-contact.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+ 名称
+
+
+
+
+
+
+
+ 手机号
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/animation/animation.vue b/pages/API/animation/animation.vue
new file mode 100644
index 0000000..379858d
--- /dev/null
+++ b/pages/API/animation/animation.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/background-audio/background-audio.vue b/pages/API/background-audio/background-audio.vue
new file mode 100644
index 0000000..e7ccb17
--- /dev/null
+++ b/pages/API/background-audio/background-audio.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+ {{formatedPlayTime}}
+
+
+
+
+
+ 00:00
+ 00:21
+
+ 注意:离开当前页面后背景音乐将保持播放,但退出uni-app将停止
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/bluetooth/bluetooth.vue b/pages/API/bluetooth/bluetooth.vue
new file mode 100644
index 0000000..d9bc4da
--- /dev/null
+++ b/pages/API/bluetooth/bluetooth.vue
@@ -0,0 +1,723 @@
+
+
+
+
+
+ 本蓝牙协议只支持低功耗蓝牙协议ble。如果想连接非ble蓝牙设备,请在社区搜索 Native.js 蓝牙。
+
+
+
+
+ {{ '蓝牙适配器不可用,请初始化蓝牙模块' }}
+
+
+
+
+
+ {{
+ (connected ? '已连接设备' : '已选择设备') +
+ ' : ' +
+ equipment[0].name +
+ ' (' +
+ equipment[0].deviceId +
+ ')'
+ }}
+
+
+
+ 已选服务uuid:{{ servicesData[0].uuid }}
+
+
+ uuid:{{ characteristicsData[0].uuid }}
+
+ 是否支持 read 操作:{{ characteristicsData[0].properties.read }}
+
+
+ 是否支持 write 操作:{{ characteristicsData[0].properties.write }}
+
+
+ 是否支持 notify 操作:{{ characteristicsData[0].properties.notify }}
+
+
+ 是否支持 indicate 操作:{{ characteristicsData[0].properties.indicate }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 已经发现{{ list.length }}{{ showMaskType === 'device' ? '台设备' : '个服务' }}:
+
+
+
+ {{ item.name || item.localName }}
+ 信号强度:{{ item.RSSI }}dBm
+ UUID:{{ item.deviceId }}
+
+
+
+
+ UUID: {{ item.uuid }}
+
+ {{ item.isPrimary ? '(主服务)' : '' }}
+
+
+
+
+ uuid:{{ item.uuid }}
+ 是否支持 read 操作:{{ item.properties.read }}
+
+ 是否支持 write 操作:{{ item.properties.write }}
+
+
+ 是否支持 notify 操作:{{ item.properties.notify }}
+
+
+ 是否支持 indicate 操作:{{ item.properties.indicate }}
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/brightness/brightness.vue b/pages/API/brightness/brightness.vue
new file mode 100644
index 0000000..a0c9e12
--- /dev/null
+++ b/pages/API/brightness/brightness.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+ 亮度 : {{ screen }}
+
+
+
+
+ 保持常亮时,屏幕不会熄灭。仅在当前应用生效,离开应用后设置失效。
+
+
+
+
+
+
+
diff --git a/pages/API/canvas/canvas.vue b/pages/API/canvas/canvas.vue
new file mode 100644
index 0000000..f0f34a1
--- /dev/null
+++ b/pages/API/canvas/canvas.vue
@@ -0,0 +1,366 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/choose-location/choose-location.vue b/pages/API/choose-location/choose-location.vue
new file mode 100644
index 0000000..3b30801
--- /dev/null
+++ b/pages/API/choose-location/choose-location.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+ 当前位置信息
+
+ 未选择位置
+
+
+
+ {{locationAddress}}
+
+
+ E: {{location.longitude[0]}}°{{location.longitude[1]}}′
+ \nN: {{location.latitude[0]}}°{{location.latitude[1]}}′
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/clipboard/clipboard.vue b/pages/API/clipboard/clipboard.vue
new file mode 100644
index 0000000..648fc4d
--- /dev/null
+++ b/pages/API/clipboard/clipboard.vue
@@ -0,0 +1,91 @@
+
+
+
+
+ 请输入剪贴板内容
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/download-file/download-file.vue b/pages/API/download-file/download-file.vue
new file mode 100644
index 0000000..8ae41ad
--- /dev/null
+++ b/pages/API/download-file/download-file.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+ 点击按钮下载服务端示例图片(下载网络文件到本地临时目录)
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/file/file.vue b/pages/API/file/file.vue
new file mode 100644
index 0000000..faa66c7
--- /dev/null
+++ b/pages/API/file/file.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+ + 请选择文件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/full-screen-video-ad/full-screen-video-ad.vue b/pages/API/full-screen-video-ad/full-screen-video-ad.vue
new file mode 100644
index 0000000..5224ed8
--- /dev/null
+++ b/pages/API/full-screen-video-ad/full-screen-video-ad.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/get-location/get-location.vue b/pages/API/get-location/get-location.vue
new file mode 100644
index 0000000..26dfd16
--- /dev/null
+++ b/pages/API/get-location/get-location.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+ 当前位置经纬度
+
+ 未获取
+
+
+
+ E: {{location.longitude[0]}}°{{location.longitude[1]}}′
+ \nN: {{location.latitude[0]}}°{{location.latitude[1]}}′
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/get-network-type/get-network-type.vue b/pages/API/get-network-type/get-network-type.vue
new file mode 100644
index 0000000..740d99e
--- /dev/null
+++ b/pages/API/get-network-type/get-network-type.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+ 网络状态
+
+ 未获取
+ 请点击下面按钮获取网络状态
+
+
+ {{networkType}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/get-node-info/get-node-info.vue b/pages/API/get-node-info/get-node-info.vue
new file mode 100644
index 0000000..870ab16
--- /dev/null
+++ b/pages/API/get-node-info/get-node-info.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+ Drag
+
+
+
+ Click
+
+
+
+
+
+ {{item.key}}
+ {{item.val}}
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/get-system-info/get-system-info.vue b/pages/API/get-system-info/get-system-info.vue
new file mode 100644
index 0000000..feac3b5
--- /dev/null
+++ b/pages/API/get-system-info/get-system-info.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+ 设备型号
+
+
+
+
+
+
+
+ 客户端平台
+
+
+
+
+
+
+
+ 操作系统版本
+
+
+
+
+
+
+
+ 语言
+
+
+
+
+
+
+
+ 版本
+
+
+
+
+
+
+
+ 屏幕宽度
+
+
+
+
+
+
+
+ 屏幕高度
+
+
+
+
+
+
+
+ 可使用窗口高度
+
+
+
+
+
+
+
+ 可使用窗口的顶部位置
+
+
+
+
+
+
+
+ 可使用窗口的底部位置
+
+
+
+
+
+
+
+ 状态栏的高度
+
+
+
+
+
+
+
+ DPI
+
+
+
+
+
+
+
+
+ 基础库版本
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/get-user-info/get-user-info.vue b/pages/API/get-user-info/get-user-info.vue
new file mode 100644
index 0000000..f3ac928
--- /dev/null
+++ b/pages/API/get-user-info/get-user-info.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+ 请点击下方按钮获取用户头像及昵称或手机号
+
+
+
+ {{userInfo.nickName || userInfo.nickname || userInfo.gender || userInfo.email || userInfo.phoneNumber}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/ibeacon/ibeacon.vue b/pages/API/ibeacon/ibeacon.vue
new file mode 100644
index 0000000..0b19e4f
--- /dev/null
+++ b/pages/API/ibeacon/ibeacon.vue
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 已经发现 {{ deviceList.length }} 台设备:
+
+
+ UUID: {{ item.uuid }}
+ major: {{ item.major }}
+ minor: {{ item.minor }}
+ rssi: {{ item.rssi }} dBm
+ accuracy: {{ item.accuracy }}
+ heading: {{ item.heading }}
+
+
+
+
+
+
+
+
diff --git a/pages/API/image/image.vue b/pages/API/image/image.vue
new file mode 100644
index 0000000..2427939
--- /dev/null
+++ b/pages/API/image/image.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/inner-audio/inner-audio.vue b/pages/API/inner-audio/inner-audio.vue
new file mode 100644
index 0000000..ba6a2c2
--- /dev/null
+++ b/pages/API/inner-audio/inner-audio.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/intersection-observer/intersection-observer.vue b/pages/API/intersection-observer/intersection-observer.vue
new file mode 100644
index 0000000..80e5d9b
--- /dev/null
+++ b/pages/API/intersection-observer/intersection-observer.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+ {{appear ? '小球出现' : '小球消失'}}
+
+
+
+ 向下滚动让小球出现
+
+
+
+
+
+
+
+
diff --git a/pages/API/login/login.vue b/pages/API/login/login.vue
new file mode 100644
index 0000000..9ab812f
--- /dev/null
+++ b/pages/API/login/login.vue
@@ -0,0 +1,322 @@
+
+
+
+
+
+
+ 已登录
+
+
+ ({{phoneNumber}})
+
+
+
+ 每个账号仅需登录 1 次,\n后续每次进入页面即可自动拉取用户信息。
+
+
+
+ 未登录
+
+ 请点击按钮登录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/make-phone-call/make-phone-call.vue b/pages/API/make-phone-call/make-phone-call.vue
new file mode 100644
index 0000000..0e3cdee
--- /dev/null
+++ b/pages/API/make-phone-call/make-phone-call.vue
@@ -0,0 +1,50 @@
+
+
+
+
+ 请在下方输入电话号码
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/map-search/map-search.nvue b/pages/API/map-search/map-search.nvue
new file mode 100644
index 0000000..9dc8ef6
--- /dev/null
+++ b/pages/API/map-search/map-search.nvue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/map/map.nvue b/pages/API/map/map.nvue
new file mode 100644
index 0000000..e9d0d4c
--- /dev/null
+++ b/pages/API/map/map.nvue
@@ -0,0 +1,447 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/modal/modal.vue b/pages/API/modal/modal.vue
new file mode 100644
index 0000000..65dff73
--- /dev/null
+++ b/pages/API/modal/modal.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/API/navigator/navigator.vue b/pages/API/navigator/navigator.vue
new file mode 100644
index 0000000..b58504f
--- /dev/null
+++ b/pages/API/navigator/navigator.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/navigator/new-page/new-nvue-page-1.nvue b/pages/API/navigator/new-page/new-nvue-page-1.nvue
new file mode 100644
index 0000000..5c25cea
--- /dev/null
+++ b/pages/API/navigator/new-page/new-nvue-page-1.nvue
@@ -0,0 +1,83 @@
+
+
+
+ 1?0:colorIndex+1)" :style="{backgroundColor:currentColor}">
+ 点击改变颜色
+
+
+ 点击上方色块使用vuex在页面之间进行通讯
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/navigator/new-page/new-nvue-page-2.nvue b/pages/API/navigator/new-page/new-nvue-page-2.nvue
new file mode 100644
index 0000000..a5d0780
--- /dev/null
+++ b/pages/API/navigator/new-page/new-nvue-page-2.nvue
@@ -0,0 +1,69 @@
+
+
+
+ 1?0:colorIndex+1)" :style="{backgroundColor:currentColor}">
+ 点击改变颜色
+
+
+ 点击上方色块使用vuex在页面之间进行通讯
+
+
+
+
+
+
diff --git a/pages/API/navigator/new-page/new-vue-page-1.vue b/pages/API/navigator/new-page/new-vue-page-1.vue
new file mode 100644
index 0000000..0b6c608
--- /dev/null
+++ b/pages/API/navigator/new-page/new-vue-page-1.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+ 从上个页面接收到参数:{{data}}
+
+ 1?0:colorIndex+1)" :style="{backgroundColor:currentColor}">
+ 点击改变颜色
+
+
+ 点击上方色块使用vuex在页面之间进行通讯
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/navigator/new-page/new-vue-page-2.vue b/pages/API/navigator/new-page/new-vue-page-2.vue
new file mode 100644
index 0000000..925badd
--- /dev/null
+++ b/pages/API/navigator/new-page/new-vue-page-2.vue
@@ -0,0 +1,84 @@
+
+
+
+ 1?0:colorIndex+1)" :style="{backgroundColor:currentColor}">
+ 点击改变颜色
+
+
+ 点击上方色块使用vuex在页面之间进行通讯
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/on-accelerometer-change/on-accelerometer-change.vue b/pages/API/on-accelerometer-change/on-accelerometer-change.vue
new file mode 100644
index 0000000..0565b42
--- /dev/null
+++ b/pages/API/on-accelerometer-change/on-accelerometer-change.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/on-compass-change/on-compass-change.vue b/pages/API/on-compass-change/on-compass-change.vue
new file mode 100644
index 0000000..72ddd89
--- /dev/null
+++ b/pages/API/on-compass-change/on-compass-change.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+ 旋转手机即可获取方位信息
+
+
+
+
+
+ {{direction}}
+ o
+
+
+
+
+
+
+
+
diff --git a/pages/API/open-location/open-location.vue b/pages/API/open-location/open-location.vue
new file mode 100644
index 0000000..f9dceb3
--- /dev/null
+++ b/pages/API/open-location/open-location.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/pull-down-refresh/pull-down-refresh.vue b/pages/API/pull-down-refresh/pull-down-refresh.vue
new file mode 100644
index 0000000..708e655
--- /dev/null
+++ b/pages/API/pull-down-refresh/pull-down-refresh.vue
@@ -0,0 +1,83 @@
+
+
+
+
+ 注:PC 不支持下拉刷新
+ list - {{num}}
+ {{loadMoreText}}
+
+
+
+
+
+
diff --git a/pages/API/request-payment/request-payment.vue b/pages/API/request-payment/request-payment.vue
new file mode 100644
index 0000000..b83a6f2
--- /dev/null
+++ b/pages/API/request-payment/request-payment.vue
@@ -0,0 +1,256 @@
+
+
+
+
+
+ 支付金额
+
+ ¥
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/request/request.vue b/pages/API/request/request.vue
new file mode 100644
index 0000000..8ee1503
--- /dev/null
+++ b/pages/API/request/request.vue
@@ -0,0 +1,176 @@
+
+
+
+
+
+ 请点击按钮向服务器发起请求
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/rewarded-video-ad/rewarded-video-ad.vue b/pages/API/rewarded-video-ad/rewarded-video-ad.vue
new file mode 100644
index 0000000..a6d7b99
--- /dev/null
+++ b/pages/API/rewarded-video-ad/rewarded-video-ad.vue
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+ 小程序端的广告ID由小程序平台提供
+
+
+
+
+
+
+
+
diff --git a/pages/API/save-media/save-media.vue b/pages/API/save-media/save-media.vue
new file mode 100644
index 0000000..9b30d56
--- /dev/null
+++ b/pages/API/save-media/save-media.vue
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/scan-code/scan-code.vue b/pages/API/scan-code/scan-code.vue
new file mode 100644
index 0000000..89006de
--- /dev/null
+++ b/pages/API/scan-code/scan-code.vue
@@ -0,0 +1,76 @@
+
+
+
+
+ 扫码结果:
+
+
+
+ {{result}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/set-navigation-bar-title/set-navigation-bar-title.test.js b/pages/API/set-navigation-bar-title/set-navigation-bar-title.test.js
new file mode 100644
index 0000000..4023b73
--- /dev/null
+++ b/pages/API/set-navigation-bar-title/set-navigation-bar-title.test.js
@@ -0,0 +1,22 @@
+
+describe('pages/API/set-navigation-bar-title/set-navigation-bar-title.vue', () => {
+ let page
+ beforeAll(async () => {
+ // 重新reLaunch至首页,并获取首页page对象(其中 program 是uni-automator自动注入的全局对象)
+ page = await program.reLaunch('/pages/API/set-navigation-bar-title/set-navigation-bar-title')
+
+ if (process.env.UNI_PLATFORM === "mp-weixin") {
+ await page.waitFor(10000)
+ } else {
+ await page.waitFor(5000)
+ }
+
+ page = await program.currentPage()
+
+ })
+
+ it('set-navigation-bar-title 组件标题', async () => {
+ let view = await page.$('.common-page-head-title')
+ expect(await view.text()).toBe('nav-default')
+ })
+})
diff --git a/pages/API/set-navigation-bar-title/set-navigation-bar-title.vue b/pages/API/set-navigation-bar-title/set-navigation-bar-title.vue
new file mode 100644
index 0000000..5854621
--- /dev/null
+++ b/pages/API/set-navigation-bar-title/set-navigation-bar-title.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+ 本页标题栏是uni-app的默认配置,开发者可在pages.json里配置文字内容及标题颜色,也可通过api接口将其改变。
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/share/share.vue b/pages/API/share/share.vue
new file mode 100644
index 0000000..0ef0e4a
--- /dev/null
+++ b/pages/API/share/share.vue
@@ -0,0 +1,293 @@
+
+
+
+
+ 分享内容
+
+
+
+ 分享图片:
+
+
+
+
+
+ 分享类型:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/show-loading/show-loading.vue b/pages/API/show-loading/show-loading.vue
new file mode 100644
index 0000000..20dc7fd
--- /dev/null
+++ b/pages/API/show-loading/show-loading.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/soter/soter.vue b/pages/API/soter/soter.vue
new file mode 100644
index 0000000..f477e39
--- /dev/null
+++ b/pages/API/soter/soter.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ result }}
+
+
+
+
+
+
+
diff --git a/pages/API/sqlite/sqlite.vue b/pages/API/sqlite/sqlite.vue
new file mode 100644
index 0000000..7627670
--- /dev/null
+++ b/pages/API/sqlite/sqlite.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/storage/storage.vue b/pages/API/storage/storage.vue
new file mode 100644
index 0000000..9dac7b0
--- /dev/null
+++ b/pages/API/storage/storage.vue
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+ key
+
+
+
+
+
+
+
+ value
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/subnvue/subnvue.vue b/pages/API/subnvue/subnvue.vue
new file mode 100644
index 0000000..80746c2
--- /dev/null
+++ b/pages/API/subnvue/subnvue.vue
@@ -0,0 +1,137 @@
+
+
+
+
+ 从左侧滑出
+
+
+
+ 从上侧竖向滑出
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/subnvue/subnvue/drawer.nvue b/pages/API/subnvue/subnvue/drawer.nvue
new file mode 100644
index 0000000..1fb883b
--- /dev/null
+++ b/pages/API/subnvue/subnvue/drawer.nvue
@@ -0,0 +1,103 @@
+
+
+
左侧列表
+
+ |
+
+ {{item.name}}
+
+
+ |
+
+
+
+
+
+
+
+
diff --git a/pages/API/subnvue/subnvue/popup.nvue b/pages/API/subnvue/subnvue/popup.nvue
new file mode 100644
index 0000000..2d6a431
--- /dev/null
+++ b/pages/API/subnvue/subnvue/popup.nvue
@@ -0,0 +1,121 @@
+
+
+
{{title}}
+
+
+ {{content}}
+
+
+ 以下为 Popup 内部滚动示例:
+
+
+ {{item}}
+
+
+
+ 向页面发送消息
+
+
+
+
+
+
+
diff --git a/pages/API/subnvue/subnvue/video-mask.nvue b/pages/API/subnvue/subnvue/video-mask.nvue
new file mode 100644
index 0000000..d7ba10c
--- /dev/null
+++ b/pages/API/subnvue/subnvue/video-mask.nvue
@@ -0,0 +1,114 @@
+
+
+
+ |
+ {{item.name}}:
+ {{item.content}}
+ |
+
+
+
+
+
+
+
diff --git a/pages/API/toast/toast.vue b/pages/API/toast/toast.vue
new file mode 100644
index 0000000..f75cb50
--- /dev/null
+++ b/pages/API/toast/toast.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/upload-file/upload-file.vue b/pages/API/upload-file/upload-file.vue
new file mode 100644
index 0000000..86c42a9
--- /dev/null
+++ b/pages/API/upload-file/upload-file.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+ + 选择图片
+
+
+
+
+
+
+
+
diff --git a/pages/API/vibrate/vibrate.vue b/pages/API/vibrate/vibrate.vue
new file mode 100644
index 0000000..f8fadf7
--- /dev/null
+++ b/pages/API/vibrate/vibrate.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+ Tips
+ iOS上只有长震动,没有短震动
+ iOS上需要手机设置“打开响铃时震动”或“静音时震动”,否则无法震动
+
+
+
+
+
+
+
diff --git a/pages/API/video/video.vue b/pages/API/video/video.vue
new file mode 100644
index 0000000..b371608
--- /dev/null
+++ b/pages/API/video/video.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+ 视频来源
+
+
+
+ {{sourceType[sourceTypeIndex]}}
+
+
+
+
+
+
+ 摄像头位置
+ 注意:部分 Android 手机下由于系统 ROM 不支持无法生效,打开拍摄界面后可操作切换
+
+
+
+
+
+
+
+ + 添加视频
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/voice/voice.vue b/pages/API/voice/voice.vue
new file mode 100644
index 0000000..0e9e319
--- /dev/null
+++ b/pages/API/voice/voice.vue
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+ {{formatedRecordTime}}
+
+
+
+
+
+
+
+
+
+
+
+ {{formatedRecordTime}}
+
+
+
+
+
+
+
+
+
+
+
+ {{formatedPlayTime}}
+ {{formatedRecordTime}}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{formatedPlayTime}}
+ {{formatedRecordTime}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/API/websocket-global/websocket-global.vue b/pages/API/websocket-global/websocket-global.vue
new file mode 100644
index 0000000..3d7f1ac
--- /dev/null
+++ b/pages/API/websocket-global/websocket-global.vue
@@ -0,0 +1,160 @@
+
+
+
+
+
+ {{showMsg}}
+
+
+
+ 发送消息后会收到一条服务器返回的消息(与发送的消息内容一致)
+
+
+
+
+
+
+
+
diff --git a/pages/API/websocket-socketTask/websocket-socketTask.vue b/pages/API/websocket-socketTask/websocket-socketTask.vue
new file mode 100644
index 0000000..a891359
--- /dev/null
+++ b/pages/API/websocket-socketTask/websocket-socketTask.vue
@@ -0,0 +1,160 @@
+
+
+
+
+
+ {{showMsg}}
+
+
+
+ 发送消息后会收到一条服务器返回的消息(与发送的消息内容一致)
+
+
+
+
+
+
+
+
diff --git a/pages/about/about.vue b/pages/about/about.vue
new file mode 100644
index 0000000..b51f145
--- /dev/null
+++ b/pages/about/about.vue
@@ -0,0 +1,217 @@
+
+
+
+
+
+ 扫码体验uni-app
+
+
+ uni-app
+ 是一个使用 Vue.js 开发跨平台应用的前端框架。
+
+
+ 本示例源码获取方式:
+
+
+ 1.
+ 下载 HBuilderX,新建 uni-app 项目时选择 Hello uni-app 模板。
+
+
+ 2.
+
+
+
+
+
+
+
+
+
+
+ 当前版本:{{version}}
+
+
+
+
+
+
+
+
diff --git a/pages/component/ad/ad.vue b/pages/component/ad/ad.vue
new file mode 100644
index 0000000..450e5d6
--- /dev/null
+++ b/pages/component/ad/ad.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{adMessage}}
+
+
+
+
+ 小程序端的广告ID由小程序平台提供
+
+
+
+
+ 本示例页面仅演示ad组件。另点此可体验激励视频API。
+
+
+
+
+
+
+
diff --git a/pages/component/audio/audio.vue b/pages/component/audio/audio.vue
new file mode 100644
index 0000000..0c926a5
--- /dev/null
+++ b/pages/component/audio/audio.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+ audio组件不再维护,建议使用能力更强的uni.createInnerAudioContext()
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/component/button/button.vue b/pages/component/button/button.vue
new file mode 100644
index 0000000..b62fdac
--- /dev/null
+++ b/pages/component/button/button.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/canvas/canvas.vue b/pages/component/canvas/canvas.vue
new file mode 100644
index 0000000..c4699a4
--- /dev/null
+++ b/pages/component/canvas/canvas.vue
@@ -0,0 +1,263 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/checkbox/checkbox.vue b/pages/component/checkbox/checkbox.vue
new file mode 100644
index 0000000..de5bb05
--- /dev/null
+++ b/pages/component/checkbox/checkbox.vue
@@ -0,0 +1,101 @@
+
+
+
+
+ 默认样式
+
+
+
+
+
+
+ 不同颜色和尺寸的checkbox
+
+
+
+
+
+
+
+
+
+
+ 推荐展示样式
+ \n使用 uni-list 布局
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/cover-view/cover-view.nvue b/pages/component/cover-view/cover-view.nvue
new file mode 100644
index 0000000..377d1cc
--- /dev/null
+++ b/pages/component/cover-view/cover-view.nvue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/cover-view/cover-view.vue b/pages/component/cover-view/cover-view.vue
new file mode 100644
index 0000000..ace1bf9
--- /dev/null
+++ b/pages/component/cover-view/cover-view.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 简单的cover-view
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/editor/editor-icon.css b/pages/component/editor/editor-icon.css
new file mode 100644
index 0000000..e8f0345
--- /dev/null
+++ b/pages/component/editor/editor-icon.css
@@ -0,0 +1,238 @@
+@font-face {
+ font-family: 'iconfont';
+ src: url('data:font/truetype;charset=utf-8;base64,AAEAAAANAIAAAwBQRkZUTYZt980AACuYAAAAHEdERUYAKQBBAAAreAAAAB5PUy8yPJdOmAAAAVgAAABWY21hcLyvuFAAAAJMAAACGmdhc3D//wADAAArcAAAAAhnbHlm1+PZcgAABOAAACD0aGVhZBRVFL8AAADcAAAANmhoZWEISgQAAAABFAAAACRobXR4TS8LYAAAAbAAAACcbG9jYQhHD/wAAARoAAAAeG1heHABTgChAAABOAAAACBuYW1lKeYRVQAAJdQAAAKIcG9zdLoCe30AAChcAAADEgABAAAAAQAAUo9exF8PPPUACwQAAAAAANhk6GIAAAAA2GToYgAA/34EbAOAAAAACAACAAAAAAAAAAEAAAOA/4AAXARsAAAAAARsAAEAAAAAAAAAAAAAAAAAAAATAAEAAAA7AJUACQAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAQQBAZAABQAAAokCzAAAAI8CiQLMAAAB6wAyAQgAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA5ifspQOA/4AAXAOAAIIAAAABAAAAAAAABAAAAAAAAAABVQAABAAALwQAAJ0EAAAeBAAAQARsAAAEAAACBAAANwQAADcEAACVBAAAmgQAAJoEAAA+BAAAQAQAACUEAQAABAAAQAAnAIAAgABgAIAAgACAAIAAeAAAAFAAMABgAEAAYAAgAEAAOQAgAGAAYACAAD8AYAAgAEAA1wBeACEAwACAAOAAogBgABoAIQBgADIAiwBAAAAAAwAAAAMAAAAcAAEAAAAAARQAAwABAAAAHAAEAPgAAAA6ACAABAAa5ifmK+Yx5jPmPuZN5mDmZOZu5njmfuaE5ujm/ecs513n+Ohg6GXpZOso7AnsE+x87JTsnuyg7KX//wAA5ifmK+Yx5jPmPuZN5l/mZOZt5njmfuaE5ujm/ecs51zn+Ohg6GPpZOso7AnsE+x67H/snuyg7KX//xncGdkZ1BnTGckZuxmqGacZnxmWGZEZjBkpGRUY5xi4GB4Xtxe1FrcU9BQUFAsTpROjE5oTmROVAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBgAAAQAAAAAAAAABAgAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgB8ANIA7AGaAiwCugNGBCAEgATiBRgFfgXyBl4GfAbGBwAHOAeWB7wH5ggoCGgI5AlSCaIKIgqmCxILPAtKC64L+gw8DIQMpgzKDQYNKA1GDaAN4g4MDlIObA6gDs4O6g8MD2APpA/GD+gQHhB6AAEAL/+AA8ADgAAJAAABNQkBNQQCFyYSAkABgP6A/r1YYdeEAoj4/oD+gP4G/rCo+QIEAAACAJ0ACANqAtQAKwA9AAAlIS4BJxE+ATchHgEXFQ4BIiY9AS4BJyEOAQcRHgEzITI2NzU0NjIWFxUOASUiLwEmNDYyHwEBNjIWFAcBBgL2/hsxQQICQTEB6y4+AgESGxIBGhP+FRYdAQEdFgHlFh0BEhsSAQJB/qoNCqMKFBkKjQFgChkUCv6KCggBQTEB5jBCAQE+Lx4NEhINHhQZAQEdFf4aFh0dFvkOEhIO+TFBnwqjChoTCY0BYAoUGQr+iQkAAAAABAAeAEoD4gJoAA8AGwAnADAAAAEGBAcmJC8BNzYkNxYEHwElDgEHHgEXPgE3LgEDLgEnPgE3HgEXDgEnDgEUFjI2NCYD0Ar+/sTE/v4LERELAQLExAECChL+Ho3WKirWjY3WKirWjTpNAQFNOjpNAQFNOh8qKj4qKgFEFtUPD9UWFRUX1Q4O1RcVzgeVMjKUCAiUMjKV/qwCTzw8UAEBUDw8T9cBK0ArK0ArAAEAQP+AA9EDgAAJAAAFNgIlFQkBFQQSAvphWP69/oABgAGNhICoAVAG/gGAAYD4C/38AAAIAAD/gARsA4AAHwArAEAATABVAGIAaAB1AAAFIikBLgEnET4BNzMVIyIGHQEhNS4BKwE1Mx4BFxEOARMiKQERFBYzITI2NwEwDwEGDwEjNzEuASc+ATceARcUBycOARQWMj8BNjcuAQUGDwE1NzMRIwEuASc1PgEyFh0BFAYlMjMhFSEHLgE9ATQ2MhYdARQGBAA5/m/+Ni49AQE9LlFRFx8EAAEeF1FRLj0BAT0IQP5A/gAfFwOUFx4B/uUCAgUGhTpiM0UBAUUzNEQBDmscJiY5FAkJAQEm/q0FIylTNDYCAAsPAQEPFw8P/aMi7AEN/eU1DA8PFw8PgAE9LgLXLj0BNh8Xa2sXHzYBPS79KS49AqH9yhcfHxcBIAMDCQjSoAJMOTlMAgJMOSIcjwEuRC4YEBIWIi4VBCAkQ1D+UgKGAQ8LogsQEAuiCw+GNlEBDwuiCxAQC6ILDwADAAL/fgPvA3AAKwBNAGcAAAEjNS4BJyMOAQcVIw4BBxUUFhcDHgE3ITUzFjI3MxYyNzMWNjcRPgE9AS4BAyM1NCYiBh0BIzU0JiIGBxUjNS4BIgYdASMiJicRIREUBhMUBiMhIiYnNT4BMyE1PgE3Mx4BFxUhMhYVA3/fAS8kpyQvAeAvPwEeGgEKYAYBMxUEBwO2AwcEhQZgCRoeAT+DVBAYEIwQGA8BiwEPGBBUJC8BAw4vZyAY/PIXIAEBIBcBGAEvIzgkLwEBFxggAnSoIzABATAjqAE/MDcgMg/+hlEjBAEBAQEBBCNQAXoPMiA3MD/9SN4MEBAM3t4MEBAM398MEBAM3ywoAU/+sScsAhIYICAYNxggqCMwAQEwI6ggGAAABQA3/8ED2gNPABEAIAAzAEQAXwAAASIjISYnJj4BMyEyFxYOASMGAzI7AR4BBwYHIS4BNzYzBSIjJSInJjY3NjMlIR4BFAYHIxUyOwEWFxYGBwYjBS4BNDYzATQmIg8BNTQmIgYdAScmIgYUFzEXFjI/ATE2ApxL0v7jHQgEBxgOAwQhCAQGGBBnZzlQiRcWBwke/LkXFwYIIAIjRs3+7RwJBAYKDQ8BcAFvFBYWFLwuJVQcCQQGCgwP/TcTFhYSAjQVHwotFB8ULQogFAlrCiEKawkB0AEZDBcOGgwXDgEBgAEeFBgBARwUG+YBGQwWBwkBARUiFAHoARgMFwcIAQEUIhX+2g8UCzKpDxQUD6kyCxQdCnYMDHYKAAAFADf/wQPaA00AEQAgADMARABeAAAlIiMhJicmPgE3ITIXFg4BIwYDMjsBHgEHBiMhIiY3NjcFIiMhJicmNjc2NykBMhYUBisBFTIzFxYXFgYHBgchIiY0NjMBMScmIg8BMQYUFjI/ARUUFjI2PQEXFjI2NAKcS9L+4x0IBAcYDgMEIQgEBhgQZ2c5UIkXFgcJHvy5FxcGCCACI0bN/u0cCQQGCg0PAXABbxQWFhS8LiVUHAkEBgoMD/03ExYWEgIrawohCmsJFCAKLRQfFC0KHxVbARkNFw0BGg0WDgEBgAEeFRgdFBoB5gEYDBcHCAEVIhXoAQEYCxcHCAEVIRUCv3cLC3cKHRQMMagPFBQPqDEMFB0AAAAACQCV/4EDawN+AB8ALwA9AE4AWgBrAHcAiACUAAABIzUuAScjLgEiBgcjDgEHFSMiBhURFBYXIT4BNRE0JiUzMjY3PgEyFhceATsBFSEBIREzFR4BMyEyNjc1MwUHJyYiBhQfARYyPwE2NCYiFyIGFBYzITI2NCYjBQcnJiIGFB8BFjI/ATY0JiIFIQ4BFBYzITI2NCYFBycmIgYUHwEWMj8BNjQmIgUhIgYUFhchPgE0JgNZVQEKB4IJPVQ9CYIHCgFVCAoKCAKyCAoK/b9/BwoBAyxALAMBCgd//kACJ/1yQwEKBwHkBwoBQ/4zSiEFDwoFLQYOBlYFCw5WBwoKBwEpBwoKB/58SiEFDwoFLQYOBlYFCw4Bf/7XBwoKBwEpBwoK/nVKIQUPCgUtBg4GVgULDgF//tcHCgoHASkHCgoC4TEHCgEoMjIoAQoHMQoI/MQHCgEBCgcDPAgKHwkIICkpIAgJbf0SAxg8CAoKCDzCSiEFCg8FLgUFVwUOCysKDwsLDwqlSSEFCw4GLQUFVgYOCysBCg8KCg8KpEohBgsPBS4FBVcFDgsrCg8KAQEKDwoAAAMAmv+AAzMDTQAXADQAPQAAJScmIgYUHwEhDgEUFhchBwYUFjI/ATY0ESEOAQceARczFRQWMjY1ETMRHgEyNjcRMzI2NCYBIy4BJz4BNzMDEmYIFBAIOv4kCg8PCgHcOggPFQhmCP5MV3MCAnNXNA4WD5kBDhYOAYAKDw/+djRBVwEBV0E0EmcHEBQIOgEOFg4BOggVDwhmCBQDQwJ0V1d0AuYLDw8LAk39swsPDwsCTQ4WD/6ZAldBQVcCAAAAAAMAmv+AAzMDTQAcACUAPQAAASEOAQceARczFRQWMjY1ETMRHgEyNjcRMzI2NCYBIy4BJz4BNzMBITc2LgEiDwEGFB8BFjI2NC8BIT4BNCYDGv5MV3MCAnNXNA4WD5kBDhYOAYAKDw/+djRBVwEBV0E0AUz+JToIAQ8UCGYICGYIFQ8IOgHbCw8PA00CdFdXdALmCw4OCwJN/bMLDg4LAk0OFg/+mQJXQUFXAv0AOggUEAdnCBQIZggPFQg6AQ4WDgAAAAADAD7/vgPCA0IADwAXABsAAAEhDgEHER4BFyE+ATcRLgEDJyMHIxMzEwEDMwMDUv1cL0ABAUAvAqQvQAEBQM82+DZn4m7i/uZevl0DQgFAL/1cL0ABAUAvAqQvQPzuqKgCav2WAfr+5wEZAAADAEAAAAPAAsAAFgAjAD8AAAEzPgE0JichDgEUFhczBwMGHgE2NxM2AT4BNyEeARQGByEuASUnJiIGFB8BBwYUFjI/ARcWMjY0LwE3NjQmIgcBtMwbJCQb/gAbJCQbuQEtBB02KgUtAv6IASQbAYAbJCQb/oAbJAK/VxMxJRJXVxIlMRNXVxMxJRJXVxIlMRMCQAEkNiQBASQ2JAEH/tgfMQsiHwEoEf4QGyQBASQ2JAEBJPJXEiUxE1dXEzElEldXEiUxE1dXEzElEgACACX/yQPbAzcABwBLAAABAxcWMzI3JgE3PgQ3GwEzFhcTHgEXHgEXFhceARcWHQEiJiMiBiM0PwI2PwE+ATU0Ji8BJQ4BFB4CHwEWFRQHIiYjIgYjBgHDYU47IAsWMv4rAQ0mGx0WB4egSQUCdRNTFwkxEQsJC04JAySRJSufFgJbCAYDBgQCIxcY/v4OOhAiFRYXAQEhhSIEFQIuAkH+/gEBAZH9+i0EBwULFhIBYAGeCAT+7i3NNhR+IRoHCBEDFgsPCQgYFBQCAgIFAgcFCVw3OgEhnhoSCgYCAgsWBQsMBQgAAAAABQAAABIEAAM3AA0AHQAtAD0ATQAAExEUBiIvASY0PwE2MhYBFRQGIyEiJj0BNDYzITIWNRUUBiMhIiY9ATQ2MyEyFjUVFAYjISImPQE0NjMhMhY1FRQGIyEiJj0BNDYzITIW2woQBaUFBaUFEAoDJQsH/CQHCwsHA9wHCwsH/ZIHCwsHAm4HCwsH/ZIHCwsHAm4HCwsH/CQHCwsHA9wHCwJJ/rcHCwWkBhAFpAUK/kFtCAsLCG0ICwvUbgcLCwduBwsL1G4HCwsHbggKCtRuCAoKCG4HCwsAAgBA/4ADwAMAAAcADwAAEyEVIxEjESMBIxEjESM1IUABgICAgAOA/Ij8AoABgID+gAGAAYD9AAMAgAAAAwAn/88D2QMxABgAHAAsAAA3MzI2PwEhFx4BOwE+AScDJicjIgYHAwYWATMXIwEhIgYHFR4BMyEyNjc1LgHNUQkPAz8BCEUDDwlRCwsE7AcTjAkPA9kECwEqElWyAhj8igwRAQERDAN2DBEBARG7DQmvrwkNAQ8KAkkSAQoJ/bcKDwH/xf5PEQ07DBERDDsNEQAAAAIAgACAA4AC1QALACQAABMzETMRMxEjESMRIykBIiY0PwE2NCYiBhUjPgE3HgEXFAYPASGAVatVVatVAwD/ACMyF88ZMkYyVQFhSElgAhsXzgEAAtX/AAEA/asBAP8AMkYX4BhHMjIjSGEBAWFIJD0Y3QAAAgCAAIADgALVAAsAJwAAEzMRMxEzESMRIxEjATMyFhURFAYrASImPQEzFTM1IzUzNSMVIzU0NoBVq1VVq1UCAKsjMjIjqyMyVaurq6tVMgLV/wABAP2rAQD/AAJVMiP+VSMyMiMrK6tVqysrIzIAAAIAYAAgA6EC4AAjAD0AAAEhBgcVFhczNjc1MxEjBgcVFhchNjc1JicjETMVFhczNjc1JgEjETMyNi8BJg8BBhY7AREjIgYfARY/ATYmAoj94AcBAQc4BwGoXAcBAQcBCAcBAQdcqAEHOAcBAQEKQUEEBAJlBgZkAwQEQUEEBANkBgZkAwQC4AEHgAcBAQdA/dABBzgHAQEHOAcBAjBABwEBB4AH/d8BhAgEfwYGfwQI/nwIBH8GBn8ECAAAAgCAAIADVQLVAAsAFgAAEzMRMxEzESMRIxEjITUzEQc1NzMRMxWAVatVVatVAdVWa2tVVQLV/wABAP2rAQD/AFUBnj5jPf4AVQAAAAMAgACAA4AC1QALABYAGQAAEzMRMxEzESMRIxEjITUjNRMzETMVIxUDNQeAVatVVatVAoDV1VUrK1VtAtX/AAEA/asBAP8A1VYBKv7WVtUBK5iYAAIAgACAA4AC1QALACsAABMzETMRMxEjESMRIwEzFSMVMx4BFw4BByMuASc1MxUzPgE0JicjLgEnNT4BgFWrVVWrVQIA1dVVSWACAmBJVSQwAVVVJDExJFUkMAEBMALV/wABAP2rAQD/AAJVVasBYUhJYAIBMCQrKwExSDABATAkqyQwAAMAgACAA4AC1QALACQAKAAAEzMRMxEzESMRIxEjATMeARcVIzUjFTMeARcVDgEHIy4BJxE+ARMVMzWAVatVVatVAgCrJDABVaurJDABATAkqyQwAQEwJKsC1f8AAQD9qwEA/wACVQEwJCsrqwEwJKskMAEBMCQBqyQw/qyrqwAAAgB4/6IDiQNeAC8AVgAAJSY1Ji8BJiIGFB8BITc2NCYiDwEOAR0BFBYfARYyPgEvASEHBhQWMj8CPgE1NyYBPgE9ASERIyIGFBY7ATI2NCYrAREhFRQWMjY9ATQmIyEiBh0BFBYDiAEBA2YFDgoFSf1jSQUKDgVmAgICAmYFDQoBBUkCnUkFCg4FZwEBAgEB/UUHCgERMwgJCQiICAkJCDMBEQoOCgoH/ZoHCgoeAQEDA2YFCg4FSUkFDgoFZwIFAwMCBQJoBAoNBUpKBQ4KBWYCAgQDAgIC2wEJCDP9MwoOCgoOCgLNMwgJCQhEBwoKB0QICQAAAAAFAAAAEgQAAzcADgAeAC4APgBOAAATFA8BBiImNRE0NjIfARYBFRQGIyEiJj0BNDYzITIWNRUUBiMhIiY9ATQ2MyEyFjUVFAYjISImPQE0NjMhMhY1FRQGIyEiJj0BNDYzITIWyQWlBQ8LCw8FpQUDNwsH/CQHCwsHA9wHCwsH/ZIHCwsHAm4HCwsH/ZIHCwsHAm4HCwsH/CQHCwsHA9wHCwGlCAakBQsHAUkICgWkBf7lbQgLCwhtCAsL1G4HCwsHbgcLC9RuBwsLB24ICgrUbggKCghuBwsLAAAABABQ/9ADsAMwABEAFQAZADIAAAkBJiMhDgEHER4BFyE+ATcRNCUzFSMBITUhFyM1NCYjISIGHQEjETMVFBYzITI2PQEzAQOd/v4TGv4iGyQBASQbAuAbJAH9cMDAAcD+QAHAkFASDv4ADhJQUBIOAQAOEk4BAgIbAQITASQb/SAbJAEBJBsB3hrocP2QkJCwDhISDrAC4JAOEhIOkP7+AAYAMP+wA9ADUAAQACEAMgBEAFQAWAAAASMiBh0BFBYyNj0BMzI2NCYhIyIGFBY7ARUUFjI2PQE0JgEjNTQmIgYdARQWOwEyNjQmJSIGHQEjIgYUFjsBMjY9ATQmEyEOAQcRHgEXIT4BNxEuAQERIREBcZEOEhIcEnENExMBk5EOEhIOcRIbExP+U3ESHBISDpENExMBkw4ScQ4SEg6RDRMTcvzgGyQBASQbAyAbJAEBJPzFAyACwBIOig0TEw1qEhwSEhwSag0TEw2KDhL9tmoOEhIOig4SEhwSihIOahIcEhIOig4SAlABJBv84BskAQEkGwMgGyT8oQMg/OAAAAAGAGD/wAOgA0AADwAfADMAPwBLAFcAAAEhDgEHER4BFyE+ATcRLgEDFAYjISImNRE0NjMhMhYVNyEiBhQWMyEyFhURFBYyNjURLgEBISIGFBYzITI2NCYHISIGFBYzITI2NCYHIyIGFBYXMz4BNCYC0P3gIi0BAS0iAiAiLQEBLRIJB/3gBwkJBwIgBwlw/eAOEhIOAiAHCRIcEgEt/u7+wA4SEg4BQA4SEg7+wA4SEg4BQA4SEo7ADhISDsAOEhICwAEtIv2gIi0BAS0iAmAiLf1RBwkJBwJgBwkJB9ASHBIJB/2gDhISDgJgIi3+2RIcEhIcEqASHBISHBKfEhsSAQESGxIAAAAFAED/oAPAA2AAHwAjAC0AOgBHAAABIzU0JiMhIgYdASMiBhQWOwETHgEXIT4BNxMzMjY0JiUhFSEBDgEjISImJwMhAzI2NRE0JiIGFREUFiMyNjURNCYiBhURFBYDoMASDv6ADhLADhISDiJOBDUmAaImNQROIg4SEv2yAUD+wAGRAhEN/l4NEQJNAnzeDhISHBISog4SEhwSEgLwUA4SEg5QEhwS/UUlLwEBLyUCuxIcEjAw/QwMEBAMArT9mxIOAdYNExMN/ioOEhIOAdYNExMN/ioOEgADAGD/wAOmAzcABAAPABMAAAEnAQc3AScjLgEPARc3NjQBIRUhAwib/jQnvwJpgwEEDQWDm4EF/LoDQPzAAfet/lm8DQJMlwUBBXitdwQN/WtAAAABACABQAPgAbAAAwAAEyEVISADwPxAAbBwAAAAAwBA/9UDwgMyAB4AJwA/AAABITY1LgEHDgEdAQ4BByMiBhURHgEzITI2NxM2LgIBETQ7AREjIiYBAw4BIyERPgE3NTY3NhYXFAcGFjMhMhYDWf73EwJUNi4sAUo5dhsoASYcAo0lOAdKBAseKf0QA01NAQIC/0kDFQ7+AE1fAQEiFiwBHAUSEQE0EhcCJ0I0PlcFB0QzOzpTBycc/nsdJi4lAYUXLCQT/fEBhQP+dQIBov57DhEBjhBzTjs5BgExIThUDxscAAADADn/uwPXAycAEwAlACkAAAEuAQ8BFzc2FhcWBg8BFzc+AiYBBiYnJjY/AScHDgEXHgE/AScTFwEnA45U82dlM2RNsz47E0lsMmwwOQ0i/k9Msz86E0lvMm9jGk9V82dpMzcz/qkzAqpjGk9SPlI6E0lMsz9XPlcnanp0/c06E0lMsz9aPlpU82djGk9VPwGBPv7iPQAAAAUAIAAAA+ADAAASABMAHAAgACQAAAE0LwEmDwEGIi8BLgEPAQYVESEDIx4BMjY0JiIGJREhEQMhESEDgAisDAlNBQ0E/QUMBbwFAwBgQAEkNiQkNiT9PwPAQPzAA0ABDQkFaQYJXgUF/AQBBaoFB/73AeAbJCQ2JCSl/QADAP1AAoAAAAkAYAARA6AC7wADAAcACwAMABUAFgAfACAAKQAAASEVIRUhFSEVIRUhAyMeATI2NCYiBhMjHgEyNjQmIgYTIx4BMjY0JiIGASACgP2AAoD9gAKA/YCAQAEkNiQkNiQ/QAEkNiQkNiQ/QAEkNiQkNiQC4GDQYNBgApAbJCQ2JCT+tRskJDYkJP61GyQkNiQkAAQAYAAAA6ADAAADAAcACwAPAAATIRUhESEVIRMhFSERIRUhYANA/MADQPzAgAJA/cACQP3AAwBg/qBgAUBg/qBgAAAABACAAFIDdQLAAAMABwALAA8AABMhESEREzMDKQERIRETMwOAAVX+q5BukAEyAVX+q5BukAGn/qsBVQEZ/uf+qwFVARn+5wAABgA//+ADoAMpAAUADwAbAB8AIwAnAAATMzUjFTMDMwcVMzUjNzUjETMVIxUzFSMVMzUjEyEVIRUhFSEVIRUhYzdbJCNAQIBAQIBJKipJgIDgAoD9gAKA/YACgP2AAmDJN/7AWzc3Wzf+iRI3EjfJAjdg0GDQYAAABABgAAADoAMAAAMABwALAA8AABMhFSERIRUhASEVIREhFSFgA0D8wANA/MABAAJA/cACQP3AAwBg/qBgAUBg/qBgAAACACAARAPUAqAABQALAAAJAjcnNyUHFwcXAQEs/vQBDEjU1AFUSNTUSAEMAqD+0v7SQO7uQEDu7kABLgAHAED/wAPAA0AACwAXABgAIQAiACsAMgAAAQ4BBx4BFz4BNy4BAy4BJz4BNx4BFw4BASMeATI2NCYiBgUjHgEyNjQmIgYFHgEXPgE3AgC+/QUF/b6+/QUF/b6j2QQE2aOj2QQE2f6dQAEkNiQkNiQBv0ABJDYkJDYk/l8Do3p6owMDQAX9vr79BQX9vr79/MUE2aOj2QQE2aOj2QH8GyQkNiQkGxskJDYkJJt6owMDo3oAAAADANf/7QMgAwYAEwAdACYAAAEmJzU+ATc2JzQmJyERITI3Njc0ATMWFxYUBwYrAQEGByM1Mx4BFAMBIUEiLw0YAXZ1/q4BbV0/PwH+OMNCHyAgH0LDATEfQ8/PQz4BQTMRAhAoFS0xX3QB/Oc+PGc+AY8BHyFgICL+yyMC7wFFYQAAAAADAF7/4AOdAyAACwATABcAAAEhIgYUFhchPgE0JiUzNSE1IRUhETMRIwN9/QANEhINAwAOEhL+NXABIP1QASBwcAGKEhsSAQESGxI28HBw/lD+4AAEACEAAAPgA2AABwALAA4AJwAACQEzNyEXMwEDEzMTBQchAw4BFSE1IzY3PgE1NCYjIgcXNjMyFhUUBgE7/uZ8PAEmPHv+56JwAnABc5ABINorOwEgnwkqOylHPXQaXwkhEBUhAwf8+a2tAwf+DgFT/q014AKHIlsxUBAhLzomNkFnDyYVERYqAAAAAAEAwP/AA0ADIAALAAABESERIxEzESERMxEC4P5AYGABwGADIP6AAYD8oAGg/mADYAAAAAACAID/ygOAAyYAEQAdAAAlPgE3ESMRDgEHLgEnESMRHgEFISIGFBYXIT4BNCYCAIWwA3ACcVVVcQJwA7AB5f1ADhISDgLADhISVQOwhQGZ/mdVcQICcVUBmf5nhbBOEhsSAQESGxIAAAEA4P/qAyADKgAbAAABISIGFBYXMwMjIgYUFhchPgE0JisBEzM+ATQmAwD+4A4SEg5g5loOEhIOASAOEhIOXudXDhISAyoSGxIB/UASGxIBARIbEgLAARIbEgAAAgCi/+YDgAMSAAcACgAABTcBIwEzNyElGwEDGWf+vVr+v2ZDAYr+nJ+fGgIDKvzWqGABjv5yAAAEAGAAAAOgAwAAAwAHAAsADwAAEyEVIREhFSERIRUhESEVIWADQPzAA0D8wAJA/cACQP3AAwBg/qBgAUBg/qBgAAAAAAQAGgAvA+4CvwALABcAIwAvAAABAiADDgEXFiA3NiYHBiAnJjQ3NiAXHgEBDgEHHgEXPgE3LgEHIi4BND4BMx4BFAYD0uP+K+QbARvPAgDPGwFLvv5AvgsM0gGW0wsB/lJffwICf19ffwICf58RHhERHhEbJCQBugEF/vsgUCH6+iFQSOTkDiIO8fEOIgEAAn9fX38CAn9fX3/eER4iHhEBJDYkAAAAAAQAIf+5A+ADJwACAAoADgAmAAABIRclATM3IRczAQMTMxMBNjc+ATU0JiMiBxc2MzIWFRQOAhUhNQPA/uCQ/gv+5nw8ASY8e/7nonACcAFkCSo7KUc9dBpfCSEQFSFYOwEgAyDg5/z5ra0DB/4OAVP+rf7UECEvOiY2QWcPJhURFipFWzFQAAAEAGAAAAOgAwAAAwAHAAsADwAAEyEVIREhFSERIRUhESEVIWADQPzAA0D8wANA/MADQPzAAwBg/qBgAUBg/qBgAAAAAAEAMgBGA+ICrwAPAAABNjIWFAcBDgEnASY+ARcBA6sKGhMJ/eYJGQr+rQ4HIg8BPAKlChMaCv3YCQEIASQMJAwM/vEAAQCLABsDZQL1ABoAAAkBNjQmIgcJASYiBhQXCQEGHgE3CQEWMjY0JwInATQKExoK/sz+ywoZFAoBNP7MDQojDQE1ATQKGhMKAYoBNAoaEwn+ywE1CRMaCv7M/ssOIwkMATX+ywkTGgoAAAAAAwBAABgDwALNABEAJgA5AAABNzYWFxEOAS8BIyImNRE0NjMBBiImNDc+ATU0JicmPgEXHgEVFAYXBi4BNz4BNCYnJj4BMhceARQGAQTNDyQBASQP0p8OEhIOAj8KGRMJHyEcHAwLJA0jJStwDSQJDDo9OzcJARMaCUBERwIbpAwRFP2eFBEMqBIOAQgOEv6VCRMaCh5PLChKHg4jCA4nYDQ5ZrMNCSMOO5ellDoKGhIKRKq/rQAAAAAAEgDeAAEAAAAAAAAAFQAsAAEAAAAAAAEACABUAAEAAAAAAAIABwBtAAEAAAAAAAMACACHAAEAAAAAAAQACACiAAEAAAAAAAUACwDDAAEAAAAAAAYACADhAAEAAAAAAAoAKwFCAAEAAAAAAAsAEwGWAAMAAQQJAAAAKgAAAAMAAQQJAAEAEABCAAMAAQQJAAIADgBdAAMAAQQJAAMAEAB1AAMAAQQJAAQAEACQAAMAAQQJAAUAFgCrAAMAAQQJAAYAEADPAAMAAQQJAAoAVgDqAAMAAQQJAAsAJgFuAAoAQwByAGUAYQB0AGUAZAAgAGIAeQAgAGkAYwBvAG4AZgBvAG4AdAAKAAAKQ3JlYXRlZCBieSBpY29uZm9udAoAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAFIAZQBnAHUAbABhAHIAAFJlZ3VsYXIAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAAVmVyc2lvbiAxLjAAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAEcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAAcwB2AGcAMgB0AHQAZgAgAGYAcgBvAG0AIABGAG8AbgB0AGUAbABsAG8AIABwAHIAbwBqAGUAYwB0AC4AAEdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC4AAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAGh0dHA6Ly9mb250ZWxsby5jb20AAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAAEAAgECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkEcmVkbwlzZWxlY3RhbGwHcHJldmlldwR1bmRvBGRhdGUHY2xlYXJ1cBU3MjNiaWFuamlxaV9kdWFuaG91anUWNzIyYmlhbmppcWlfZHVhbnFpYW5qdQotY2hlY2tsaXN0DWRpcmVjdGlvbi1sdHINZGlyZWN0aW9uLXJ0bAtmb250Ymdjb2xvcg1jbGVhcmVkZm9ybWF0BGZvbnQHb3V0ZGVudAhmb250c2l6ZQp0ZXh0X2NvbG9yD2Zvcm1hdC1oZWFkZXItMg9mb3JtYXQtaGVhZGVyLTMLbGluZS1oZWlnaHQPZm9ybWF0LWhlYWRlci0xD2Zvcm1hdC1oZWFkZXItNA9mb3JtYXQtaGVhZGVyLTUPZm9ybWF0LWhlYWRlci02EUNoYXJhY3Rlci1TcGFjaW5nBmluZGVudAZiYW9jdW4IcXVhbnBpbmcFZnV6aGkHc2hhbmNodQxiaWFuamlzZWt1YWkJZmVuZ2V4aWFuB2RpYW56YW4MY2hhcnVsaWFuamllC2NoYXJ1dHVwaWFuCnd1eHVwYWlsaWUManV6aG9uZ2R1aXFpB3lpbnlvbmcLeW91eHVwYWlsaWUIeW91ZHVpcWkJeml0aWRhaW1hCHhpYW9saWFuCXppdGlqaWFjdQ96aXRpc2hhbmNodXhpYW4Neml0aXNoYW5nYmlhbwp6aXRpYmlhb3RpDnppdGl4aWFodWF4aWFuCXppdGl4aWV0aQl6aXRpeWFuc2UIenVvZHVpcWkJeml0aXl1bGFuC3ppdGl4aWFiaWFvC3p1b3lvdWR1aXFpB2R1aWdvdXgGZ3VhbmJpDnNoZW5neWluX3NoaXRpAAAAAAAB//8AAgABAAAADAAAABYAAAACAAEAAwA6AAEABAAAAAIAAAAAAAAAAQAAAADVpCcIAAAAANhk6GIAAAAA2GToYg==') format('truetype');
+ font-weight: normal;
+ font-style: normal;
+ font-display: swap;
+}
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-redo:before {
+ content: "\e627";
+}
+
+.icon-undo:before {
+ content: "\e633";
+}
+
+.icon-indent:before {
+ content: "\eb28";
+}
+
+.icon-outdent:before {
+ content: "\e6e8";
+}
+
+.icon-fontsize:before {
+ content: "\e6fd";
+}
+
+.icon-format-header-1:before {
+ content: "\e860";
+}
+
+.icon-format-header-4:before {
+ content: "\e863";
+}
+
+.icon-format-header-5:before {
+ content: "\e864";
+}
+
+.icon-format-header-6:before {
+ content: "\e865";
+}
+
+.icon-clearup:before {
+ content: "\e64d";
+}
+
+.icon-preview:before {
+ content: "\e631";
+}
+
+.icon-date:before {
+ content: "\e63e";
+}
+
+.icon-fontbgcolor:before {
+ content: "\e678";
+}
+
+.icon-clearedformat:before {
+ content: "\e67e";
+}
+
+.icon-font:before {
+ content: "\e684";
+}
+
+.icon-723bianjiqi_duanhouju:before {
+ content: "\e65f";
+}
+
+.icon-722bianjiqi_duanqianju:before {
+ content: "\e660";
+}
+
+.icon-text_color:before {
+ content: "\e72c";
+}
+
+.icon-format-header-2:before {
+ content: "\e75c";
+}
+
+.icon-format-header-3:before {
+ content: "\e75d";
+}
+
+.icon--checklist:before {
+ content: "\e664";
+}
+
+.icon-baocun:before {
+ content: "\ec09";
+}
+
+.icon-line-height:before {
+ content: "\e7f8";
+}
+
+.icon-quanping:before {
+ content: "\ec13";
+}
+
+.icon-direction-rtl:before {
+ content: "\e66e";
+}
+
+.icon-direction-ltr:before {
+ content: "\e66d";
+}
+
+.icon-selectall:before {
+ content: "\e62b";
+}
+
+.icon-fuzhi:before {
+ content: "\ec7a";
+}
+
+.icon-shanchu:before {
+ content: "\ec7b";
+}
+
+.icon-bianjisekuai:before {
+ content: "\ec7c";
+}
+
+.icon-fengexian:before {
+ content: "\ec7f";
+}
+
+.icon-dianzan:before {
+ content: "\ec80";
+}
+
+.icon-charulianjie:before {
+ content: "\ec81";
+}
+
+.icon-charutupian:before {
+ content: "\ec82";
+}
+
+.icon-wuxupailie:before {
+ content: "\ec83";
+}
+
+.icon-juzhongduiqi:before {
+ content: "\ec84";
+}
+
+.icon-yinyong:before {
+ content: "\ec85";
+}
+
+.icon-youxupailie:before {
+ content: "\ec86";
+}
+
+.icon-youduiqi:before {
+ content: "\ec87";
+}
+
+.icon-zitidaima:before {
+ content: "\ec88";
+}
+
+.icon-xiaolian:before {
+ content: "\ec89";
+}
+
+.icon-zitijiacu:before {
+ content: "\ec8a";
+}
+
+.icon-zitishanchuxian:before {
+ content: "\ec8b";
+}
+
+.icon-zitishangbiao:before {
+ content: "\ec8c";
+}
+
+.icon-zitibiaoti:before {
+ content: "\ec8d";
+}
+
+.icon-zitixiahuaxian:before {
+ content: "\ec8e";
+}
+
+.icon-zitixieti:before {
+ content: "\ec8f";
+}
+
+.icon-zitiyanse:before {
+ content: "\ec90";
+}
+
+.icon-zuoduiqi:before {
+ content: "\ec91";
+}
+
+.icon-zitiyulan:before {
+ content: "\ec92";
+}
+
+.icon-zitixiabiao:before {
+ content: "\ec93";
+}
+
+.icon-zuoyouduiqi:before {
+ content: "\ec94";
+}
+
+.icon-duigoux:before {
+ content: "\ec9e";
+}
+
+.icon-guanbi:before {
+ content: "\eca0";
+}
+
+.icon-shengyin_shiti:before {
+ content: "\eca5";
+}
+
+.icon-Character-Spacing:before {
+ content: "\e964";
+}
diff --git a/pages/component/editor/editor.vue b/pages/component/editor/editor.vue
new file mode 100644
index 0000000..c83582b
--- /dev/null
+++ b/pages/component/editor/editor.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/editor/iconfont.ttf b/pages/component/editor/iconfont.ttf
new file mode 100644
index 0000000..8ade3a4
Binary files /dev/null and b/pages/component/editor/iconfont.ttf differ
diff --git a/pages/component/form/form.vue b/pages/component/form/form.vue
new file mode 100644
index 0000000..a336962
--- /dev/null
+++ b/pages/component/form/form.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/image/image.vue b/pages/component/image/image.vue
new file mode 100644
index 0000000..91a157a
--- /dev/null
+++ b/pages/component/image/image.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+ 示例1 \n本地图片
+
+
+
+
+
+ 示例2 \n网络图片
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/input/input.nvue b/pages/component/input/input.nvue
new file mode 100644
index 0000000..c6624ab
--- /dev/null
+++ b/pages/component/input/input.nvue
@@ -0,0 +1,245 @@
+
+
+
+
+ {{title}}
+
+
+
+
+ 可自动聚焦的 input
+
+
+
+
+
+
+ 隐藏 iOS 软键盘上的导航条
+
+
+
+
+
+
+ 键盘右下角按钮显示为搜索
+
+
+
+
+
+
+ 键盘右下角按钮显示为发送
+
+
+
+
+
+
+ 控制最大输入长度的 input
+
+
+
+
+
+ 实时获取输入值:{{inputValue}}
+
+
+
+
+
+ 控制输入的 input
+
+
+
+
+
+
+ 控制键盘的 input
+
+
+
+
+
+
+ 数字输入的 input
+
+
+
+
+
+ 密码输入的 input
+
+
+
+
+
+ 带小数点的 input
+
+
+
+
+ 身份证输入的 input
+
+
+
+
+ 控制占位符颜色的 input
+
+
+
+
+
+ 带清除按钮的输入框
+
+
+
+
+
+
+ 可查看密码的输入框
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/label/label.vue b/pages/component/label/label.vue
new file mode 100644
index 0000000..b920cce
--- /dev/null
+++ b/pages/component/label/label.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+ 表单组件在label内
+
+
+
+
+
+
+ label用for标识表单组件
+
+
+
+
+
+
+
+
+
+
+
+ label内有多个时选中第一个
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/map/map.nvue b/pages/component/map/map.nvue
new file mode 100644
index 0000000..a3696ff
--- /dev/null
+++ b/pages/component/map/map.nvue
@@ -0,0 +1,295 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/map/map.vue b/pages/component/map/map.vue
new file mode 100644
index 0000000..ea8b201
--- /dev/null
+++ b/pages/component/map/map.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/movable-view/movable-view.vue b/pages/component/movable-view/movable-view.vue
new file mode 100644
index 0000000..c93e9f6
--- /dev/null
+++ b/pages/component/movable-view/movable-view.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+ 示例 1
+ \nmovable-view 区域小于 movable-area
+
+
+ text
+
+
+ 点击这里移动至 (30px, 30px)
+
+
+ 示例 2
+ \nmovable-view区域大于movable-area
+
+
+ text
+
+
+ 示例 3
+ \n只可以横向移动
+
+
+ text
+
+
+ 示例 4
+ \n只可以纵向移动
+
+
+ text
+
+
+ 示例 5
+ \n可超出边界
+
+
+ text
+
+
+ 示例 6
+ \n带有惯性
+
+
+ text
+
+
+ 示例 7
+ \n可放缩
+
+
+ text
+
+
+ 点击这里放大3倍
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/component/navigator/navigate/navigate.vue b/pages/component/navigator/navigate/navigate.vue
new file mode 100644
index 0000000..d293fa4
--- /dev/null
+++ b/pages/component/navigator/navigate/navigate.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/pages/component/navigator/navigator.vue b/pages/component/navigator/navigator.vue
new file mode 100644
index 0000000..2c98518
--- /dev/null
+++ b/pages/component/navigator/navigator.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/navigator/redirect/redirect.vue b/pages/component/navigator/redirect/redirect.vue
new file mode 100644
index 0000000..246011a
--- /dev/null
+++ b/pages/component/navigator/redirect/redirect.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/pages/component/picker-view/picker-view.vue b/pages/component/picker-view/picker-view.vue
new file mode 100644
index 0000000..0fd4c51
--- /dev/null
+++ b/pages/component/picker-view/picker-view.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+ 日期:{{year}}年{{month}}月{{day}}日
+
+
+
+
+ {{item}}年
+
+
+ {{item}}月
+
+
+ {{item}}日
+
+
+
+
+
+
+
+
diff --git a/pages/component/picker/picker.vue b/pages/component/picker/picker.vue
new file mode 100644
index 0000000..2288adf
--- /dev/null
+++ b/pages/component/picker/picker.vue
@@ -0,0 +1,178 @@
+
+
+
+ 普通选择器
+
+
+
+ 当前选择
+
+
+
+ {{array[index].name}}
+
+
+
+
+
+
+ 多列选择器
+
+
+
+ 当前选择
+
+
+
+ {{multiArray[0][multiIndex[0]]}},{{multiArray[1][multiIndex[1]]}},{{multiArray[2][multiIndex[2]]}}
+
+
+
+
+
+
+ 时间选择器
+
+
+
+ 当前选择
+
+
+
+ {{time}}
+
+
+
+
+
+ 注:选择 09:01 ~ 21:01 之间的时间, 不在区间内不能选中
+
+
+ 日期选择器
+
+
+
+ 当前选择
+
+
+
+ {{date}}
+
+
+
+
+
+ 注:选择当前时间 ±10 年之间的时间, 不在区间内不能选中
+
+
+
+
+
+
diff --git a/pages/component/progress/progress.vue b/pages/component/progress/progress.vue
new file mode 100644
index 0000000..1541d7d
--- /dev/null
+++ b/pages/component/progress/progress.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/radio/radio.vue b/pages/component/radio/radio.vue
new file mode 100644
index 0000000..44f7b77
--- /dev/null
+++ b/pages/component/radio/radio.vue
@@ -0,0 +1,90 @@
+
+
+
+
+ 默认样式
+
+
+
+
+
+
+ 不同颜色和尺寸的radio
+
+
+
+
+
+ 推荐展示样式
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/rich-text/rich-text.vue b/pages/component/rich-text/rich-text.vue
new file mode 100644
index 0000000..2d621f5
--- /dev/null
+++ b/pages/component/rich-text/rich-text.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+ 数组类型
+ \nnodes属性为Array
+
+
+
+
+
+
+ 字符串类型
+ \nnodes属性为String
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/scroll-view/scroll-view.vue b/pages/component/scroll-view/scroll-view.vue
new file mode 100644
index 0000000..60c88bf
--- /dev/null
+++ b/pages/component/scroll-view/scroll-view.vue
@@ -0,0 +1,97 @@
+
+
+
+
+
+ Vertical Scroll
+ \n纵向滚动
+
+
+
+ A
+ B
+ C
+
+
+
+ 点击这里返回顶部
+
+
+
+ Horizontal Scroll
+ \n横向滚动
+
+
+
+ A
+ B
+ C
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/component/slider/slider.vue b/pages/component/slider/slider.vue
new file mode 100644
index 0000000..a44d480
--- /dev/null
+++ b/pages/component/slider/slider.vue
@@ -0,0 +1,40 @@
+
+
+
+
+ 显示当前value
+
+
+
+
+ 设置步进step跳动
+
+
+
+
+ 设置最小/最大值
+
+
+
+
+ 不同颜色和大小的滑块
+
+
+
+
+
+
+
diff --git a/pages/component/swiper/swiper.vue b/pages/component/swiper/swiper.vue
new file mode 100644
index 0000000..de4df51
--- /dev/null
+++ b/pages/component/swiper/swiper.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+ A
+
+
+ B
+
+
+ C
+
+
+
+
+
+
+ 指示点
+
+
+
+ 自动播放
+
+
+
+
+
+
+ 幻灯片切换时长(ms)
+ {{duration}}
+
+
+
+ 自动播放间隔时长(ms)
+ {{interval}}
+
+
+
+
+
+
+
+
diff --git a/pages/component/switch/switch.vue b/pages/component/switch/switch.vue
new file mode 100644
index 0000000..32c6437
--- /dev/null
+++ b/pages/component/switch/switch.vue
@@ -0,0 +1,47 @@
+
+
+
+
+ 默认样式
+
+
+
+
+ 不同颜色和尺寸的switch
+
+
+
+
+
+ 推荐展示样式
+
+
+
+ 开启中
+
+
+
+ 关闭
+
+
+
+
+
+
+
diff --git a/pages/component/text/text.vue b/pages/component/text/text.vue
new file mode 100644
index 0000000..0494e20
--- /dev/null
+++ b/pages/component/text/text.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
+ {{text}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/textarea/textarea.vue b/pages/component/textarea/textarea.vue
new file mode 100644
index 0000000..b20a27e
--- /dev/null
+++ b/pages/component/textarea/textarea.vue
@@ -0,0 +1,31 @@
+
+
+
+ 输入区域高度自适应,不会出现滚动条
+
+
+
+ 占位符字体是红色的textarea
+
+
+
+
+
+
+
+
diff --git a/pages/component/video/video.nvue b/pages/component/video/video.nvue
new file mode 100644
index 0000000..29eca51
--- /dev/null
+++ b/pages/component/video/video.nvue
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/video/video.vue b/pages/component/video/video.vue
new file mode 100644
index 0000000..0767431
--- /dev/null
+++ b/pages/component/video/video.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+ 弹幕内容
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/view/view.test.js b/pages/component/view/view.test.js
new file mode 100644
index 0000000..4755f38
--- /dev/null
+++ b/pages/component/view/view.test.js
@@ -0,0 +1,36 @@
+describe('pages/component/view/view.vue', () => {
+ let page
+ beforeAll(async () => {
+ // 重新reLaunch至首页,并获取首页page对象(其中 program 是uni-automator自动注入的全局对象)
+ page = await program.reLaunch('/pages/component/view/view')
+ await page.waitFor(1000)
+ })
+
+ /**
+ * 测试步骤
+ * 1. 检测页面标题是否为 view
+ */
+ it('view 组件标题', async () => {
+ let view = await page.$('.common-page-head-title')
+ expect(await view.text()).toBe('view')
+ })
+ /**
+ * 测试步骤
+ * 1. uni-flex 的个数
+ * 2. flex-item 的个数
+ */
+ it('view 个数', async () => {
+ let viewLen = await page.$$('.uni-flex')
+ expect(viewLen.length).toBe(18)
+ let viewItemLen = await page.$$('.flex-item')
+ expect(viewItemLen.length).toBe(6)
+ })
+ /**
+ * 测试步骤
+ * 1. 第一个颜色块的色值是否为 rgb(247, 98, 96)
+ */
+ it('view 前三个元素颜色', async () => {
+ let viewRed = await page.$('.uni-bg-red')
+ expect(await viewRed.style('backgroundColor')).toBe('rgb(247, 98, 96)')
+ })
+})
diff --git a/pages/component/view/view.vue b/pages/component/view/view.vue
new file mode 100644
index 0000000..df7145f
--- /dev/null
+++ b/pages/component/view/view.vue
@@ -0,0 +1,146 @@
+
+
+
+
+
+ Flex是Flexible Box的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性。当设置display: flex后,继续给view等容器组件设置flex-direction:
+ row或column,就可以在该容器内按行或列排布子组件。uni-app推荐使用flex布局。因为flex布局有利于跨更多平台,尤其是采用原生渲染的平台。
+
+
+
+ flex-direction: row
+ \n横向布局
+
+
+ A
+ B
+ C
+
+
+
+ flex-direction: column
+ \n纵向布局
+
+
+ A
+ B
+ C
+
+
+
+ 更多布局示例
+ \nflex布局演示
+
+
+ 纵向布局-自动宽度
+ 纵向布局-固定宽度
+
+ 横向布局-自动宽度
+ 横向布局-自动宽度
+
+
+ 横向布局-居中
+ 横向布局-居中
+
+
+ 横向布局-居右
+ 横向布局-居右
+
+
+ 横向布局-平均分布
+ 横向布局-平均分布
+
+
+ 横向布局-两端对齐
+ 横向布局-两端对齐
+
+
+ 固定宽度
+ 自动占满余量
+
+
+ 固定宽度
+ 自动占满
+ 固定宽度
+
+
+ 一行显示不全,wrap折行
+ 一行显示不全,wrap折行
+ 一行显示不全,wrap折行
+
+
+
+ 垂直居顶
+
+
+ 垂直居中
+
+
+ 垂直居底
+
+
+
+
+
+ 组合示例
+ \nflex布局演示
+
+
+
+
+
+
+
+ 文字居左,留出左间距
+
+
+ 剩余数量
+ 立即购买
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/web-view-local/web-view-local.vue b/pages/component/web-view-local/web-view-local.vue
new file mode 100644
index 0000000..a9c9e36
--- /dev/null
+++ b/pages/component/web-view-local/web-view-local.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
diff --git a/pages/component/web-view/web-view.vue b/pages/component/web-view/web-view.vue
new file mode 100644
index 0000000..0e78c25
--- /dev/null
+++ b/pages/component/web-view/web-view.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
diff --git a/pages/error/404.vue b/pages/error/404.vue
new file mode 100644
index 0000000..2f29e39
--- /dev/null
+++ b/pages/error/404.vue
@@ -0,0 +1,34 @@
+
+
+
+
+ 404 Page Not Found
+
+
+
+
+ {{errMsg}}
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/badge/badge.vue b/pages/extUI/badge/badge.vue
new file mode 100644
index 0000000..ff1bea5
--- /dev/null
+++ b/pages/extUI/badge/badge.vue
@@ -0,0 +1,113 @@
+
+
+
+ 数字角标通用来标记重点信息使用,如接受到新消息、有未读消息等
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 右上
+
+
+
+
+
+ 右上
+
+
+
+
+ 圆点
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/breadcrumb/breadcrumb.vue b/pages/extUI/breadcrumb/breadcrumb.vue
new file mode 100644
index 0000000..bd4055d
--- /dev/null
+++ b/pages/extUI/breadcrumb/breadcrumb.vue
@@ -0,0 +1,41 @@
+
+
+
+ 面包屑导航显示当前页面的路径,快速返回之前的任意可跳转页面
+
+
+
+ {{route.name}}
+
+
+
+
+ {{route.name}}
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/button/button.vue b/pages/extUI/button/button.vue
new file mode 100644
index 0000000..f42df35
--- /dev/null
+++ b/pages/extUI/button/button.vue
@@ -0,0 +1,107 @@
+
+
+
+
+ 使用 '.uni-btn' 样式,可对内置button组件设置样式
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/calendar/calendar.vue b/pages/extUI/calendar/calendar.vue
new file mode 100644
index 0000000..2efc74e
--- /dev/null
+++ b/pages/extUI/calendar/calendar.vue
@@ -0,0 +1,136 @@
+
+
+
+ 日历组件可以查看日期,选择任意范围内的日期,打点操作。常用场景如:酒店日期预订、火车机票选择购买日期、上下班打卡等。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/card/card.nvue b/pages/extUI/card/card.nvue
new file mode 100644
index 0000000..b9806de
--- /dev/null
+++ b/pages/extUI/card/card.nvue
@@ -0,0 +1,196 @@
+
+
+
+ 卡片组件通用来显示完整独立的一段信息,同时让用户理解他的作用。例如一篇文章的预览图、作者信息、时间等,卡片通常是更复杂和更详细信息的入口点。
+
+
+
+ 这是一个基础卡片示例,内容较少,此示例展示了一个没有任何属性不带阴影的卡片。
+
+
+
+
+ 这是一个基础卡片示例,此示例展示了一个标题加标题额外信息的标准卡片。
+
+
+
+
+
+ 这是一个带头像和双标题的基础卡片,此示例展示了一个完整的卡片。
+
+
+
+
+
+ 这是一个通栏卡片 ,通栏没有外边距,左右会贴合父元素。
+
+
+
+
+
+
+ 这是一个带封面和操作栏的卡片示例,此示例展示了封面插槽和操作栏插槽的用法。
+
+
+
+ 分享
+
+
+
+ 点赞
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 卡片组件通用来显示完整独立的一段信息,同时让用户理解他的作用。例如一篇文章的预览图、作者信息、时间等,卡片通常是更复杂和更详细信息的入口点。
+
+
+
+ 分享
+
+
+
+ 点赞
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+ 今日新闻热点
+
+
+
+
+
+
+
+
+
+
+ 分享
+
+
+
+ 点赞
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/collapse/collapse.vue b/pages/extUI/collapse/collapse.vue
new file mode 100644
index 0000000..788f98b
--- /dev/null
+++ b/pages/extUI/collapse/collapse.vue
@@ -0,0 +1,171 @@
+
+
+
+ 折叠面板用来折叠/显示过长的内容或者是列表。通常是在多内容分类项使用,折叠不重要的内容,显示重要内容。点击可以展开折叠部分。
+
+
+
+
+
+ {{content}}
+
+
+
+
+ 折叠内容主体,这是一段比较长内容。默认折叠主要内容,只显示当前项标题。点击标题展开,才能看到这段文字。再次点击标题,折叠内容。
+
+
+
+
+ 禁用状态内容主体,页面上是看不到这段话的。
+
+
+
+
+
+
+
+
+
+
+
+ 默认开启组件动画,使用动画效果折叠内容会有一个从上到下的动画。
+
+
+
+
+ 设置 show-animation="false",关闭当前组件动画效果。
+
+
+
+
+
+
+
+
+ 手风琴效果同时只会保留一个组件的打开状态,其余组件会自动关闭。
+
+
+
+
+ 手风琴效果同时只会保留一个组件的打开状态,其余组件会自动关闭。
+
+
+
+
+ 手风琴效果同时只会保留一个组件的打开状态,其余组件会自动关闭。
+
+
+
+
+
+
+
+
+
+ 折叠内容主体,可自定义内容及样式
+
+
+
+
+ 折叠内容主体,可自定义内容及样式
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 折叠内容主体,可自定义内容及样式
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/color/color.nvue b/pages/extUI/color/color.nvue
new file mode 100644
index 0000000..aba053b
--- /dev/null
+++ b/pages/extUI/color/color.nvue
@@ -0,0 +1,150 @@
+
+
+
+ uni-ui 规范颜色色板,通过内置样式快速指定元素前景和背景色。
+
+
+
+
+ primary
+
+ disable
+
+ light
+
+
+
+
+
+
+
+ success
+
+ disable
+
+ light
+
+
+
+ warning
+
+ disable
+
+ light
+
+
+
+ error
+
+ disable
+ light
+
+
+
+ info
+
+ disable
+
+ light
+
+
+
+
+
+
+
+ main-color
+ base-color
+ secondary-color
+
+
+
+
+
+
+ border-4
+ border-3
+ border-2
+ border-1
+
+
+
+
+
+ white
+ black
+ transparent
+
+ bg-color
+
+
+
+
+ shadow-sm
+ shadow-base
+ shadow-lg
+
+
+
+
+
+
+
diff --git a/pages/extUI/combox/combox.vue b/pages/extUI/combox/combox.vue
new file mode 100644
index 0000000..3a1300d
--- /dev/null
+++ b/pages/extUI/combox/combox.vue
@@ -0,0 +1,55 @@
+
+
+
+ 组合框一般用于可以选择也可以输入的表单项。
+
+
+
+
+
+ 所选城市为:{{city}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/countdown/countdown.nvue b/pages/extUI/countdown/countdown.nvue
new file mode 100644
index 0000000..7fb7a14
--- /dev/null
+++ b/pages/extUI/countdown/countdown.nvue
@@ -0,0 +1,71 @@
+
+
+
+ 倒计时组件主要用于促销商品剩余时间,发送短信验证等待时间等场景
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/data-checkbox/data-checkbox.vue b/pages/extUI/data-checkbox/data-checkbox.vue
new file mode 100644
index 0000000..1347e8c
--- /dev/null
+++ b/pages/extUI/data-checkbox/data-checkbox.vue
@@ -0,0 +1,159 @@
+
+
+
+ 通过数据驱动的单选框和复选框,可直接通过连接 uniCloud 获取数据,同时可以配合表单组件 uni-forms 使用
+
+
+
+ 单选选中:{{JSON.stringify(radio1)}}
+
+
+
+
+
+ 多选选中:{{JSON.stringify(checkbox1)}}
+
+
+
+
+
+
+ 选中:{{JSON.stringify(checkbox6)}}
+
+
+
+
+
+
+ 单选选中:{{JSON.stringify(radio2)}}
+
+
+
+ 多选选中:{{JSON.stringify(checkbox2)}}
+
+
+
+
+
+
+ 单选选中:{{JSON.stringify(radio3)}}
+
+
+
+ 多选选中:{{JSON.stringify(checkbox3)}}
+
+
+
+
+
+
+ 单选选中:{{JSON.stringify(radio4)}}
+
+
+
+ 多选选中:{{JSON.stringify(checkbox4)}}
+
+
+
+
+
+
+
+
+
+ 单选选中:{{JSON.stringify(radio5)}}
+
+
+
+ 多选选中:{{JSON.stringify(checkbox5)}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/data-indexed-list/data-indexed-list.vue b/pages/extUI/data-indexed-list/data-indexed-list.vue
new file mode 100644
index 0000000..8562b9b
--- /dev/null
+++ b/pages/extUI/data-indexed-list/data-indexed-list.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/extUI/data-picker/data-picker.nvue b/pages/extUI/data-picker/data-picker.nvue
new file mode 100644
index 0000000..89b22f9
--- /dev/null
+++ b/pages/extUI/data-picker/data-picker.nvue
@@ -0,0 +1,164 @@
+
+
+ 标签组件多用于商品分类、重点内容显示等场景。
+
+
+
+
+
+
+
+
+
+
+
+ {{ error }}
+
+
+
+ {{ item.text }}
+
+
+ 请选择
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/data-select/data-select.vue b/pages/extUI/data-select/data-select.vue
new file mode 100644
index 0000000..ad305f1
--- /dev/null
+++ b/pages/extUI/data-select/data-select.vue
@@ -0,0 +1,76 @@
+
+
+
+ 通过数据驱动的单选框和复选框,可直接通过连接 uniCloud 获取数据,同时可以配合表单组件 uni-forms 使用
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/dateformat/dateformat.vue b/pages/extUI/dateformat/dateformat.vue
new file mode 100644
index 0000000..9a9ab81
--- /dev/null
+++ b/pages/extUI/dateformat/dateformat.vue
@@ -0,0 +1,47 @@
+
+
+
+ 日期格式化组件,通常用于需要展示友好的日期格式的场景。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/datetime-picker/datetime-picker.vue b/pages/extUI/datetime-picker/datetime-picker.vue
new file mode 100644
index 0000000..5c2b063
--- /dev/null
+++ b/pages/extUI/datetime-picker/datetime-picker.vue
@@ -0,0 +1,113 @@
+
+
+
+ 可以同时选择日期和时间的选择器
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我是一个插槽,点击我
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/drawer/drawer.vue b/pages/extUI/drawer/drawer.vue
new file mode 100644
index 0000000..bdcbdd0
--- /dev/null
+++ b/pages/extUI/drawer/drawer.vue
@@ -0,0 +1,129 @@
+
+
+
+ 这是抽屉式导航组件使用示例,可以指定菜单左侧或者右侧弹出(仅初始化生效),组件内部可以放置任何内容。点击页面按钮即可显示导航菜单。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 右侧遮罩只能通过按钮关闭,不能通过点击遮罩关闭
+
+
+
+
+
+ 可滚动内容 {{item}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/easyinput/easyinput.vue b/pages/extUI/easyinput/easyinput.vue
new file mode 100644
index 0000000..9cb4fec
--- /dev/null
+++ b/pages/extUI/easyinput/easyinput.vue
@@ -0,0 +1,101 @@
+
+
+
+ easyinput 组件是对原生input组件的增强 ,是专门为配合表单组件 uni-forms 而设计的,easyinput 内置了边框,图标等,同时包含 input
+ 所有功能
+
+
+
+
+
+
+ 输入内容:{{ '"'+value+'"' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/fab/fab.vue b/pages/extUI/fab/fab.vue
new file mode 100644
index 0000000..418390e
--- /dev/null
+++ b/pages/extUI/fab/fab.vue
@@ -0,0 +1,123 @@
+
+
+
+ uni-ui 规范颜色色板,通过内置样式快速指定元素前景和背景色。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/fav/fav.vue b/pages/extUI/fav/fav.vue
new file mode 100644
index 0000000..85e8a48
--- /dev/null
+++ b/pages/extUI/fav/fav.vue
@@ -0,0 +1,93 @@
+
+
+
+ 用于收藏功能,可点击切换选中、不选中的状态。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/file-picker/file-picker.vue b/pages/extUI/file-picker/file-picker.vue
new file mode 100644
index 0000000..07eba95
--- /dev/null
+++ b/pages/extUI/file-picker/file-picker.vue
@@ -0,0 +1,117 @@
+
+
+
+ 文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择头像
+ 选择
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/font/font.nvue b/pages/extUI/font/font.nvue
new file mode 100644
index 0000000..5b87914
--- /dev/null
+++ b/pages/extUI/font/font.nvue
@@ -0,0 +1,53 @@
+
+
+
+ 字体辅助样式提供了常见的字体样式类
+
+
+
+ 一级标题
+
+
+
+
+ 二级标题
+
+
+
+
+ 三级标题
+
+
+
+
+ 四级标题
+
+
+
+
+ 五级标题
+
+
+
+
+ 六级标题
+
+
+
+
+ 副标题
+
+
+
+
+ uni-ui 是 DCloud 官方面向 uni-app 开发者提供的一套 ui 解决方案
+
+
+
+
+ 标注说明文字
+
+
+
+
+
diff --git a/pages/extUI/forms/forms.vue b/pages/extUI/forms/forms.vue
new file mode 100644
index 0000000..eaf4c4b
--- /dev/null
+++ b/pages/extUI/forms/forms.vue
@@ -0,0 +1,355 @@
+
+
+
+ uni-forms 组件一般由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/goods-nav/goods-nav.nvue b/pages/extUI/goods-nav/goods-nav.nvue
new file mode 100644
index 0000000..b6449fa
--- /dev/null
+++ b/pages/extUI/goods-nav/goods-nav.nvue
@@ -0,0 +1,109 @@
+
+
+
+ uni-goods-nav 组件主要用于电商类应用底部导航,可自定义加入购物车,购买等操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/grid/grid.nvue b/pages/extUI/grid/grid.nvue
new file mode 100644
index 0000000..6278e79
--- /dev/null
+++ b/pages/extUI/grid/grid.nvue
@@ -0,0 +1,282 @@
+
+
+
+ 宫格组件主要使用场景如:商品推荐列表、热门内容等
+
+
+
+
+
+
+ 文本信息
+
+
+
+
+
+
+
+
+
+ 文本信息
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.text}}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/group/group.vue b/pages/extUI/group/group.vue
new file mode 100644
index 0000000..9a15d8c
--- /dev/null
+++ b/pages/extUI/group/group.vue
@@ -0,0 +1,88 @@
+
+
+
+ 分组组件可用于将组件分组,添加间隔,以产生明显的区块。
+
+
+
+ 分组内容
+ 分组内容
+ 分组内容
+ 分组内容
+
+
+ 分组内容
+ 分组内容
+ 分组内容
+ 分组内容
+
+
+
+
+
+
+
+
+ 分组内容
+ 分组内容
+ 分组内容
+ 分组内容
+
+
+
+ 分组内容
+ 分组内容
+ 分组内容
+ 分组内容
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/icons/icons.nvue b/pages/extUI/icons/icons.nvue
new file mode 100644
index 0000000..df07ec8
--- /dev/null
+++ b/pages/extUI/icons/icons.nvue
@@ -0,0 +1,569 @@
+
+
+
+ 图标组件方便用户在设计页面的时候,减少小图片的使用。可方便自定义图标单色、尺寸。
+
+
+
+
+
+
+
+
+
+
+ {{ checked? item.unicode: item.name }}
+
+
+
+
+
+
+
+
+ youxi
+
+
+
+ wenjian
+
+
+
+ zhuanfa
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/indexed-list/indexed-list.nvue b/pages/extUI/indexed-list/indexed-list.nvue
new file mode 100644
index 0000000..16c0408
--- /dev/null
+++ b/pages/extUI/indexed-list/indexed-list.nvue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/pages/extUI/link/link.vue b/pages/extUI/link/link.vue
new file mode 100644
index 0000000..a834ca7
--- /dev/null
+++ b/pages/extUI/link/link.vue
@@ -0,0 +1,37 @@
+
+
+
+ 超链接组件,在小程序内复制url,在app内打开外部浏览器,在h5端打开新网页。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击跳转
+
+
+
+
+
+
+
diff --git a/pages/extUI/list/chat.vue b/pages/extUI/list/chat.vue
new file mode 100644
index 0000000..6fc75a0
--- /dev/null
+++ b/pages/extUI/list/chat.vue
@@ -0,0 +1,176 @@
+
+
+
+ 此示例展示了聊天列表的使用场景。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 刚刚
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/list/list.nvue b/pages/extUI/list/list.nvue
new file mode 100644
index 0000000..99ffbdc
--- /dev/null
+++ b/pages/extUI/list/list.nvue
@@ -0,0 +1,164 @@
+
+
+
+ 列表组件可以在其中使用图标、略缩图或放置任何你想放的元素,使用场景如:导航菜单、列表、设置中心排版等
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 使用 body 插槽
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 自定义两侧插槽
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/load-more/load-more.nvue b/pages/extUI/load-more/load-more.nvue
new file mode 100644
index 0000000..110b52a
--- /dev/null
+++ b/pages/extUI/load-more/load-more.nvue
@@ -0,0 +1,105 @@
+
+
+
+ 加载更多组件用于页面加载更多数据时,页面底部显示内容等场景
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/nav-bar/nav-bar.nvue b/pages/extUI/nav-bar/nav-bar.nvue
new file mode 100644
index 0000000..bc2b387
--- /dev/null
+++ b/pages/extUI/nav-bar/nav-bar.nvue
@@ -0,0 +1,186 @@
+
+
+
+
+ 本导航栏为自定义组件,并非原生导航栏。除非原生导航栏无法满足需求,否则不推荐使用自定义导航栏组件。具体参考https://ask.dcloud.net.cn/article/34921
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ city }}
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/notice-bar/notice-bar.vue b/pages/extUI/notice-bar/notice-bar.vue
new file mode 100644
index 0000000..d43d239
--- /dev/null
+++ b/pages/extUI/notice-bar/notice-bar.vue
@@ -0,0 +1,64 @@
+
+
+
+ 通告栏组件多用于系统通知,广告通知等场景,可自定义图标,颜色,展现方式等。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/number-box/number-box.nvue b/pages/extUI/number-box/number-box.nvue
new file mode 100644
index 0000000..cccdce3
--- /dev/null
+++ b/pages/extUI/number-box/number-box.nvue
@@ -0,0 +1,56 @@
+
+
+
+ 数字输入框组件多用于购物车加减商品等场景
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/pagination/pagination.vue b/pages/extUI/pagination/pagination.vue
new file mode 100644
index 0000000..82f8577
--- /dev/null
+++ b/pages/extUI/pagination/pagination.vue
@@ -0,0 +1,94 @@
+
+
+
+ 分页器组件,用于展示页码、请求数据等
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 当前页:{{ current }},数据总量:{{ total }}条,每页数据:{{ pageSize }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/popup/popup.vue b/pages/extUI/popup/popup.vue
new file mode 100644
index 0000000..63bdd16
--- /dev/null
+++ b/pages/extUI/popup/popup.vue
@@ -0,0 +1,276 @@
+
+
+
+ 弹出层组件用于弹出一个覆盖到页面上的内容,使用场景如:底部弹出分享弹窗、页面插屏广告等。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 输入内容:{{ value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/radius/radius.nvue b/pages/extUI/radius/radius.nvue
new file mode 100644
index 0000000..64585c8
--- /dev/null
+++ b/pages/extUI/radius/radius.nvue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+ 各值的含义请参考文档
+
+
+
+
+ 通过下面的选项控制圆角
+
+
+
+ 位置
+
+
+
+ 大小
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/rate/rate.nvue b/pages/extUI/rate/rate.nvue
new file mode 100644
index 0000000..4e1bdb4
--- /dev/null
+++ b/pages/extUI/rate/rate.nvue
@@ -0,0 +1,63 @@
+
+
+
+ 评分组件多用于商品评价打分、服务态度评价、用户满意度等场景。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/row/row.vue b/pages/extUI/row/row.vue
new file mode 100644
index 0000000..fe370bc
--- /dev/null
+++ b/pages/extUI/row/row.vue
@@ -0,0 +1,230 @@
+
+
+
+
+ 流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局
+
+
+ 流式栅格系统,在nvue不可使用媒体查询
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/search-bar/search-bar.vue b/pages/extUI/search-bar/search-bar.vue
new file mode 100644
index 0000000..42227cc
--- /dev/null
+++ b/pages/extUI/search-bar/search-bar.vue
@@ -0,0 +1,111 @@
+
+
+
+ 搜索栏组件,通常用于搜索商品、文章等。
+
+
+
+
+
+
+ 当前输入为:{{ searchValue }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/section/section.vue b/pages/extUI/section/section.vue
new file mode 100644
index 0000000..2144efa
--- /dev/null
+++ b/pages/extUI/section/section.vue
@@ -0,0 +1,62 @@
+
+
+
+ uni-section 组件主要用于文章、列表详情等标题展示
+
+
+
+
+
+
+
+
+ 默认插槽内容
+
+
+ right slot
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/segmented-control/segmented-control.vue b/pages/extUI/segmented-control/segmented-control.vue
new file mode 100644
index 0000000..76cde2b
--- /dev/null
+++ b/pages/extUI/segmented-control/segmented-control.vue
@@ -0,0 +1,168 @@
+
+
+
+ 标签组件多用于商品分类、重点内容显示等场景。
+
+
+
+
+
+
+
+ 选项卡1的内容
+ 选项卡2的内容
+ 选项卡3的内容
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/space/space.nvue b/pages/extUI/space/space.nvue
new file mode 100644
index 0000000..0173168
--- /dev/null
+++ b/pages/extUI/space/space.nvue
@@ -0,0 +1,151 @@
+
+
+
+
+
+ 各值的含义请参考文档
+
+
+
+
+
+ 通过下面的选项控制边距
+
+
+
+
+ 外边距
+
+
+
+ 外边距大小
+
+
+
+
+ 内边距
+
+
+
+ 内边距大小
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/steps/steps.vue b/pages/extUI/steps/steps.vue
new file mode 100644
index 0000000..612238a
--- /dev/null
+++ b/pages/extUI/steps/steps.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/swipe-action/swipe-action.vue b/pages/extUI/swipe-action/swipe-action.vue
new file mode 100644
index 0000000..d5e924d
--- /dev/null
+++ b/pages/extUI/swipe-action/swipe-action.vue
@@ -0,0 +1,350 @@
+
+
+
+ 通过滑动触发选项的容器,容器内可放置列表等组件,通过左右滑动来触发一些操作。
+
+
+
+
+
+ 使用数据填充
+
+
+
+
+
+ 置顶
+
+
+
+ 使用左右插槽
+
+
+ 删除
+
+
+
+
+ 置顶
+
+
+ 数据与插槽混合使用
+
+
+
+
+
+
+
+ 禁止左右滚动
+
+
+
+
+
+
+ 当前状态:{{ isOpened }}
+
+
+
+
+
+ 使用变量控制SwipeAction的开启状态
+
+
+
+
+
+
+
+
+ {{ item.content }}
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/swiper-dot/swiper-dot.nvue b/pages/extUI/swiper-dot/swiper-dot.nvue
new file mode 100644
index 0000000..e17024f
--- /dev/null
+++ b/pages/extUI/swiper-dot/swiper-dot.nvue
@@ -0,0 +1,244 @@
+
+
+
+
+
+
+ {{index+1}}
+
+
+
+
+
+
+
+ default
+ dot
+
+ round
+ nav
+
+ indexes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 内容
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/table/table.vue b/pages/extUI/table/table.vue
new file mode 100644
index 0000000..efd002f
--- /dev/null
+++ b/pages/extUI/table/table.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+ 日期
+ 姓名
+ 地址
+ 设置
+
+
+ {{ item.date }}
+
+ {{ item.name }}
+
+ {{ item.address }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/table/tableData.js b/pages/extUI/table/tableData.js
new file mode 100644
index 0000000..14ac826
--- /dev/null
+++ b/pages/extUI/table/tableData.js
@@ -0,0 +1,193 @@
+export default [{
+ "date": "2020-09-01",
+ "name": "Dcloud1",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-02",
+ "name": "Dcloud2",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-03",
+ "name": "Dcloud3",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-04",
+ "name": "Dcloud4",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}, {
+ "date": "2020-09-05",
+ "name": "Dcloud5",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-06",
+ "name": "Dcloud6",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-07",
+ "name": "Dcloud7",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-08",
+ "name": "Dcloud8",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}, {
+ "date": "2020-09-09",
+ "name": "Dcloud9",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-10",
+ "name": "Dcloud10",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-11",
+ "name": "Dcloud11",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-12",
+ "name": "Dcloud12",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}, {
+ "date": "2020-09-13",
+ "name": "Dcloud13",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-14",
+ "name": "Dcloud14",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-15",
+ "name": "Dcloud15",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-16",
+ "name": "Dcloud16",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}, {
+ "date": "2020-09-01",
+ "name": "Dcloud17",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-02",
+ "name": "Dcloud18",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-03",
+ "name": "Dcloud19",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-04",
+ "name": "Dcloud20",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}, {
+ "date": "2020-09-05",
+ "name": "Dcloud21",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-06",
+ "name": "Dcloud22",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-07",
+ "name": "Dcloud23",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-08",
+ "name": "Dcloud24",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}, {
+ "date": "2020-09-09",
+ "name": "Dcloud25",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-10",
+ "name": "Dcloud26",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-11",
+ "name": "Dcloud27",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-12",
+ "name": "Dcloud28",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}, {
+ "date": "2020-09-13",
+ "name": "Dcloud29",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-14",
+ "name": "Dcloud30",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-15",
+ "name": "Dcloud31",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-16",
+ "name": "Dcloud32",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}, {
+ "date": "2020-09-01",
+ "name": "Dcloud33",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-02",
+ "name": "Dcloud34",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-03",
+ "name": "Dcloud35",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-04",
+ "name": "Dcloud36",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}, {
+ "date": "2020-09-05",
+ "name": "Dcloud37",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-06",
+ "name": "Dcloud38",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-07",
+ "name": "Dcloud39",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-08",
+ "name": "Dcloud40",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}, {
+ "date": "2020-09-09",
+ "name": "Dcloud41",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-10",
+ "name": "Dcloud42",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-11",
+ "name": "Dcloud43",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-12",
+ "name": "Dcloud44",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}, {
+ "date": "2020-09-13",
+ "name": "Dcloud45",
+ "address": "上海市普陀区金沙江路 1518 弄"
+}, {
+ "date": "2020-09-14",
+ "name": "Dcloud46",
+ "address": "上海市普陀区金沙江路 1517 弄"
+}, {
+ "date": "2020-09-15",
+ "name": "Dcloud47",
+ "address": "上海市普陀区金沙江路 1519 弄"
+}, {
+ "date": "2020-09-16",
+ "name": "Dcloud48",
+ "address": "上海市普陀区金沙江路 1516 弄"
+}]
diff --git a/pages/extUI/tag/tag.nvue b/pages/extUI/tag/tag.nvue
new file mode 100644
index 0000000..d2ab644
--- /dev/null
+++ b/pages/extUI/tag/tag.nvue
@@ -0,0 +1,157 @@
+
+
+
+ 标签组件多用于商品分类、重点内容显示等场景。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/title/title.vue b/pages/extUI/title/title.vue
new file mode 100644
index 0000000..23ccdef
--- /dev/null
+++ b/pages/extUI/title/title.vue
@@ -0,0 +1,97 @@
+
+
+
+ 标题组件,通常用于记录页面标题,使用当前组件在 uni-app 开启统计的情况下,将会自动统计页面标题.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ uni-app是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台。即使不跨端,uni-app同时也是更好的小程序开发框架。DCloud公司拥有370万开发者用户,旗下uni-app有5万+案例、900款插件、50+微信/qq群,并且被阿里小程序工具内置,开发者可以放心选择。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/tooltip/tooltip.vue b/pages/extUI/tooltip/tooltip.vue
new file mode 100644
index 0000000..f243d4b
--- /dev/null
+++ b/pages/extUI/tooltip/tooltip.vue
@@ -0,0 +1,41 @@
+
+
+
+ 常用于展示鼠标 hover 时的提示信息,注意:无法覆盖原生组件
+
+
+
+
+
+
+
+
+
+
+
+
+ 一段文字一段文字一段文字一段文字一段文字一段文字一段文字
+ 一段文字一段文字一段文字一段文字一段文字一段文字一段文字
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/extUI/transition/transition.vue b/pages/extUI/transition/transition.vue
new file mode 100644
index 0000000..dae2344
--- /dev/null
+++ b/pages/extUI/transition/transition.vue
@@ -0,0 +1,160 @@
+
+
+
+ 过渡动画,通常用于元素的过渡效果,例如淡隐淡出效果,遮罩层的效果、放大缩小的效果等
+
+
+
+ 示例元素
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/tabBar/API/API.nvue b/pages/tabBar/API/API.nvue
new file mode 100644
index 0000000..47e2e74
--- /dev/null
+++ b/pages/tabBar/API/API.nvue
@@ -0,0 +1,494 @@
+
+
+
+
+
+
+
+
+ 以下将演示uni-app接口能力,详细文档见:
+
+
+
+
+ {{item.name}}
+ {{item.pages ? '' : ''}}
+
+
+
+ {{item2.name ? item2.name : item2}}
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/tabBar/component/component.nvue b/pages/tabBar/component/component.nvue
new file mode 100644
index 0000000..6b8fbd7
--- /dev/null
+++ b/pages/tabBar/component/component.nvue
@@ -0,0 +1,216 @@
+
+
+
+
+ uni-app内置组件,展示样式仅供参考,文档详见:
+
+
+
+
+ {{item.name}}
+ {{item.pages ? '' : ''}}
+
+
+
+ {{item2.name ? item2.name : item2}}
+
+
+
+
+
+
+
+
+
diff --git a/pages/tabBar/component/component.test.js b/pages/tabBar/component/component.test.js
new file mode 100644
index 0000000..1706a09
--- /dev/null
+++ b/pages/tabBar/component/component.test.js
@@ -0,0 +1,57 @@
+describe('pages/tabBar/component/component.nvue', () => {
+ let page
+ beforeAll(async () => {
+ // 重新reLaunch至首页,并获取首页page对象(其中 program 是uni-automator自动注入的全局对象)
+ page = await program.reLaunch('/pages/tabBar/component/component')
+ await page.waitFor(1000)
+ })
+
+ it('u-link', async () => {
+ // 检测首页u-link的文本内容
+ expect(await (await page.$('.hello-link')).text()).toBe(
+ 'https://uniapp.dcloud.io/component/')
+ })
+
+ it('视图容器', async () => {
+ let panelText = await page.$('.uni-panel-text')
+ // 检测首个 panel 是视图容器
+ expect(await panelText.text()).toBe(
+ '视图容器')
+
+ // 检测首个 panel 切换展开
+ const panelH = await page.$('.uni-panel-h');
+ // 不能做完全匹配,百度小程序会生成额外的class
+ expect(await panelH.attribute('class')).toContain('uni-panel-h')
+ await panelH.tap()
+ await page.waitFor(500)
+ // 已展开
+ expect(await panelH.attribute('class')).toContain('uni-panel-h-on')
+ })
+
+ // it('.uni-panel', async () => {
+ // const lists = await page.$$('.uni-panel')
+ // expect(lists.length).toBe(9)
+ // })
+
+ it('.uni-panel action', async () => {
+ const listHead = await page.$('.uni-panel-h')
+ expect(await listHead.attribute('class')).toContain('uni-panel-h-on')
+ await listHead.tap()
+ await page.waitFor(200)
+ expect(await listHead.attribute('class')).toContain(
+ 'uni-panel-h',
+ )
+
+ // 展开第一个 panel,点击第一个 item,验证打开的新页面是否正确
+ await listHead.tap()
+ await page.waitFor(200)
+ const item = await page.$('.uni-navigate-item')
+ await item.tap()
+ await page.waitFor(500)
+ expect((await program.currentPage()).path).toBe('pages/component/view/view')
+ await page.waitFor(500)
+
+ // 执行 navigateBack 验证是否返回
+ expect((await program.navigateBack()).path).toBe('pages/tabBar/component/component')
+ })
+})
diff --git a/pages/tabBar/extUI/extUI.nvue b/pages/tabBar/extUI/extUI.nvue
new file mode 100644
index 0000000..b5bd578
--- /dev/null
+++ b/pages/tabBar/extUI/extUI.nvue
@@ -0,0 +1,266 @@
+
+
+
+
+ 以下是uni-app扩展组件示例,更多组件见插件市场:
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
diff --git a/pages/tabBar/extUI/extUI.test.js b/pages/tabBar/extUI/extUI.test.js
new file mode 100644
index 0000000..c2ca5d8
--- /dev/null
+++ b/pages/tabBar/extUI/extUI.test.js
@@ -0,0 +1,58 @@
+describe('pages/tabBar/extUI/extUI.nvue', () => {
+ let page
+ beforeAll(async () => {
+ // 重新reLaunch至首页,并获取首页page对象(其中 program 是uni-automator自动注入的全局对象)
+ page = await program.reLaunch('/pages/tabBar/extUI/extUI')
+ if (process.env.UNI_PLATFORM === "h5") {
+ await page.waitFor(1000)
+ }
+ if (process.env.UNI_PLATFORM === "mp-weixin" || process.env.UNI_PLATFORM === "mp-baidu") {
+ await page.waitFor(10000)
+ }
+
+ page = await program.currentPage()
+
+ })
+ /**
+ * 点击 u-link 组件
+ */
+ it('u-link 点击', async () => {
+ const helloLink = await page.$('.hello-link')
+ // 检测首页u-link的文本内容
+ expect(await helloLink.text()).toBe(
+ 'https://ext.dcloud.net.cn')
+ })
+
+ /**
+ * 检测列表长度,是否发生变化
+ */
+ // it('.uni-panel 列表长度', async () => {
+ // const lists = await page.$$('.uni-panel')
+ // expect(lists.length).toBe(29)
+ // })
+
+ /**
+ * 检测打开列表第一个元素是否正确
+ */
+ it('.uni-panel-h tap 打开 badge 组件', async () => {
+ // 检测首个 panel 是视图容器
+ expect(await (await page.$('.uni-panel-text')).text()).toBe(
+ 'uni-badge 数字角标')
+
+ const listHead = await page.$('.uni-panel-h')
+ // 是否获取正确的元素
+ expect(await listHead.attribute('class')).toContain(
+ 'uni-panel-h',
+ )
+
+ // 点击第一个 item,验证打开的新页面是否正确
+ await listHead.tap()
+ await page.waitFor(2000)
+
+ expect((await program.currentPage()).path).toBe('pages/extUI/badge/badge')
+ await page.waitFor(500)
+ // 执行 navigateBack 验证是否返回
+ expect((await program.navigateBack()).path).toBe('pages/tabBar/extUI/extUI')
+ })
+
+})
diff --git a/pages/tabBar/template/template.nvue b/pages/tabBar/template/template.nvue
new file mode 100644
index 0000000..ed52983
--- /dev/null
+++ b/pages/tabBar/template/template.nvue
@@ -0,0 +1,210 @@
+
+
+
+
+ 以下是部分模板示例,更多模板见插件市场:
+
+
+
+
+ {{item.name}}
+ {{item.pages ? '' : ''}}
+
+
+
+ {{item2.name ? item2.name : item2}}
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/component-communication/bus.js b/pages/template/component-communication/bus.js
new file mode 100644
index 0000000..94950da
--- /dev/null
+++ b/pages/template/component-communication/bus.js
@@ -0,0 +1,3 @@
+import Vue from 'vue'
+
+export default new Vue()
\ No newline at end of file
diff --git a/pages/template/component-communication/component-communication.vue b/pages/template/component-communication/component-communication.vue
new file mode 100644
index 0000000..851345f
--- /dev/null
+++ b/pages/template/component-communication/component-communication.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/component-communication/reciver.vue b/pages/template/component-communication/reciver.vue
new file mode 100644
index 0000000..c307e1c
--- /dev/null
+++ b/pages/template/component-communication/reciver.vue
@@ -0,0 +1,36 @@
+
+
+
+ {{msg===''?'等待发送':'收到消息:'}}{{msg}}
+
+
+
+
+
+
+
diff --git a/pages/template/component-communication/sender-bus.vue b/pages/template/component-communication/sender-bus.vue
new file mode 100644
index 0000000..ceb4f82
--- /dev/null
+++ b/pages/template/component-communication/sender-bus.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/component-communication/sender.vue b/pages/template/component-communication/sender.vue
new file mode 100644
index 0000000..59eb69d
--- /dev/null
+++ b/pages/template/component-communication/sender.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/crop/crop.vue b/pages/template/crop/crop.vue
new file mode 100644
index 0000000..a02a3c1
--- /dev/null
+++ b/pages/template/crop/crop.vue
@@ -0,0 +1,639 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/global/global.vue b/pages/template/global/global.vue
new file mode 100644
index 0000000..481efaa
--- /dev/null
+++ b/pages/template/global/global.vue
@@ -0,0 +1,66 @@
+
+
+
+ globalData
+
+
+ globalData中text的值: {{gd.test}}
+
+
+
+ vuex
+
+
+ vuex中hasLogin的值: {{testvuex}}
+
+
+
+
+
+
+
+
diff --git a/pages/template/list-with-badges/list-with-badges.vue b/pages/template/list-with-badges/list-with-badges.vue
new file mode 100644
index 0000000..b0fa31e
--- /dev/null
+++ b/pages/template/list-with-badges/list-with-badges.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+ 右侧带箭头
+
+
+
+ Item1
+
+
+
+
+ Item2
+
+
+
+ 右侧带数字角标
+
+
+
+ Item2
+
+
+
+
+
+ Item1
+
+
+
+
+ 右侧带数字角标+箭头
+
+
+
+ Item1
+
+
+
+
+
+ Item2
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/list-with-collapses/list-with-collapses.vue b/pages/template/list-with-collapses/list-with-collapses.vue
new file mode 100644
index 0000000..d33228a
--- /dev/null
+++ b/pages/template/list-with-collapses/list-with-collapses.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+ {{list.title}}
+
+
+
+ {{item}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/list2detail-detail/list2detail-detail.vue b/pages/template/list2detail-detail/list2detail-detail.vue
new file mode 100644
index 0000000..62d858c
--- /dev/null
+++ b/pages/template/list2detail-detail/list2detail-detail.vue
@@ -0,0 +1,191 @@
+
+
+
+
+ {{banner.title}}
+
+
+ {{banner.author_name}}
+ 发表于
+ {{banner.published_at}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/list2detail-list/list2detail-list.vue b/pages/template/list2detail-list/list2detail-list.vue
new file mode 100644
index 0000000..48ec8e5
--- /dev/null
+++ b/pages/template/list2detail-list/list2detail-list.vue
@@ -0,0 +1,196 @@
+
+
+
+
+ {{ banner.title }}
+
+
+
+
+
+
+
+ {{ value.title }}
+
+ {{ value.author_name }}
+ {{ value.published_at }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/nav-button/nav-button.vue b/pages/template/nav-button/nav-button.vue
new file mode 100644
index 0000000..85d1676
--- /dev/null
+++ b/pages/template/nav-button/nav-button.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+ 说明 :
+
+ 在App端可在pages.json里配置buttons,暂不支持动态改变buttons的样式,使用onNavigationBarButtonTap可监听buttons的点击事件。
+ 在小程序端,不支持配置buttons,故按钮不见了。
+
+
+
+
+
+
+
diff --git a/pages/template/nav-city-dropdown/nav-city-dropdown.vue b/pages/template/nav-city-dropdown/nav-city-dropdown.vue
new file mode 100644
index 0000000..3dfb263
--- /dev/null
+++ b/pages/template/nav-city-dropdown/nav-city-dropdown.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+ 说明 :
+
+
+
+ 在App端可在pages.json里配置buttons,暂不支持动态改变buttons的样式,使用onNavigationBarButtonTap可监听城市选择按钮的点击事件。
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/nav-default/nav-default.vue b/pages/template/nav-default/nav-default.vue
new file mode 100644
index 0000000..e902134
--- /dev/null
+++ b/pages/template/nav-default/nav-default.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
+ 本页标题栏是uni-app的默认配置,开发者可在pages.json里配置文字内容及标题颜色,也可通过api接口将其改变。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/nav-dot/nav-dot.vue b/pages/template/nav-dot/nav-dot.vue
new file mode 100644
index 0000000..502134f
--- /dev/null
+++ b/pages/template/nav-dot/nav-dot.vue
@@ -0,0 +1,66 @@
+
+
+
+
+ 说明 :
+
+ 在App端可在pages.json里配置buttons,暂不支持动态改变buttons的样式,使用onNavigationBarButtonTap可监听红点按钮的点击事件。
+
+
+
+
+
+
+
diff --git a/pages/template/nav-image/nav-image.vue b/pages/template/nav-image/nav-image.vue
new file mode 100644
index 0000000..829208f
--- /dev/null
+++ b/pages/template/nav-image/nav-image.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+ 说明 :
+
+ 在App端可在pages.json里通过 style -> titleImage 配置,支付宝小程序只支持https地址的图片,暂不支持动态改变;常用于App首页顶部导航显示产品Logo。
+ 在支付宝小程序里请使用真机调试查看效果。
+
+
+
+
+
+
+
diff --git a/pages/template/nav-search-input/detail/detail.vue b/pages/template/nav-search-input/detail/detail.vue
new file mode 100644
index 0000000..eb70baf
--- /dev/null
+++ b/pages/template/nav-search-input/detail/detail.vue
@@ -0,0 +1,213 @@
+
+
+
+
+
+ 搜索历史
+
+
+
+
+ {{ item.name }}
+
+
+
+ 您还没有历史记录
+
+
+
+
+
+
+
+ 没有搜索到相关内容
+
+
+
+
+
+
+
diff --git a/pages/template/nav-search-input/nav-search-input.vue b/pages/template/nav-search-input/nav-search-input.vue
new file mode 100644
index 0000000..c275894
--- /dev/null
+++ b/pages/template/nav-search-input/nav-search-input.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+ 本示例为导航栏带搜索框完整功能演示,主要演示有:
+ 1. 导航栏为 transparent 模式,向上滑动页面,导航栏会从透明变为实色。
+ 2. 点击搜索框跳转到搜索页面。
+ 3. 点击导航栏右侧按钮实现关联操作。
+ 4. 搜索页面为提示词搜索,输入内容实时显示关联词。
+ 5. 搜索结果根据搜索内容高亮显示文字。
+ 6. 点击搜索列表或者软键盘搜索按钮,会将结果保存到搜索历史列表。
+ 7. 点击删除图标,清空历史搜索列表。
+ Tips
+ 1. 本示例目前仅支持 App 端
+ 2. 所有示例均为演示使用,具体逻辑需要自己实现。
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/nav-transparent/nav-transparent.vue b/pages/template/nav-transparent/nav-transparent.vue
new file mode 100644
index 0000000..903646e
--- /dev/null
+++ b/pages/template/nav-transparent/nav-transparent.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 在App端默认为标题栏透明,当用户向下滚动时,标题栏逐渐由透明转变为不透明;当用户再次向上滚动时,标题栏又从不透明变为透明状态。
+ 在微信小程序端,导航栏始终为不透明样式。
+
+
+ 图片类型
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/scheme/scheme.vue b/pages/template/scheme/scheme.vue
new file mode 100644
index 0000000..8a79d37
--- /dev/null
+++ b/pages/template/scheme/scheme.vue
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+ 打开QQ
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/swiper-list-nvue/swiper-list-nvue.nvue b/pages/template/swiper-list-nvue/swiper-list-nvue.nvue
new file mode 100644
index 0000000..373cf09
--- /dev/null
+++ b/pages/template/swiper-list-nvue/swiper-list-nvue.nvue
@@ -0,0 +1,434 @@
+
+
+
+
+ {{refreshText}}
+
+
+
+
+ |
+
+
+
+
+
+
+ {{tab.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
diff --git a/pages/template/swiper-list-nvue/swiper-page.nvue b/pages/template/swiper-list-nvue/swiper-page.nvue
new file mode 100644
index 0000000..4ca76b2
--- /dev/null
+++ b/pages/template/swiper-list-nvue/swiper-page.nvue
@@ -0,0 +1,90 @@
+
+
+
+ |
+
+ {{item.name}}
+
+ |
+ |
+
+
+
+
+
+
+
diff --git a/pages/template/swiper-list/swiper-list.nvue b/pages/template/swiper-list/swiper-list.nvue
new file mode 100644
index 0000000..aedbddb
--- /dev/null
+++ b/pages/template/swiper-list/swiper-list.nvue
@@ -0,0 +1,363 @@
+
+
+
+
+
+
+ {{tab.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/swiper-list/swiper-page.nvue b/pages/template/swiper-list/swiper-page.nvue
new file mode 100644
index 0000000..bb8135f
--- /dev/null
+++ b/pages/template/swiper-list/swiper-page.nvue
@@ -0,0 +1,45 @@
+
+
+ Tab View {{ pid}}
+
+
+
+
+
+
diff --git a/pages/template/swiper-vertical/swiper-vertical.nvue b/pages/template/swiper-vertical/swiper-vertical.nvue
new file mode 100644
index 0000000..4a276b1
--- /dev/null
+++ b/pages/template/swiper-vertical/swiper-vertical.nvue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/tabbar/detail/detail.vue b/pages/template/tabbar/detail/detail.vue
new file mode 100644
index 0000000..7025348
--- /dev/null
+++ b/pages/template/tabbar/detail/detail.vue
@@ -0,0 +1,22 @@
+
+
+
+ 这是选项卡页面跳转详情页面的演示,下面是页面跳转时传递过来的标题:
+ {{title}}
+
+
+
+
+
diff --git a/pages/template/tabbar/news-item.nvue b/pages/template/tabbar/news-item.nvue
new file mode 100644
index 0000000..5102b51
--- /dev/null
+++ b/pages/template/tabbar/news-item.nvue
@@ -0,0 +1,211 @@
+
+
+
+
+
+
+
+ {{options.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/tabbar/tabbar.nvue b/pages/template/tabbar/tabbar.nvue
new file mode 100644
index 0000000..17b812d
--- /dev/null
+++ b/pages/template/tabbar/tabbar.nvue
@@ -0,0 +1,436 @@
+
+
+
+
+ {{tab.name}}
+
+
+
+
+
+
+
+
+
+
+
+ {{tab.refreshText}}
+
+
+
+
+ |
+
+ {{tab.loadingText}}
+ |
+
+
+
+
+
+
+
+
+ {{tab.loadingText}}
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/ucharts/ucharts.vue b/pages/template/ucharts/ucharts.vue
new file mode 100644
index 0000000..db80d11
--- /dev/null
+++ b/pages/template/ucharts/ucharts.vue
@@ -0,0 +1,1226 @@
+
+
+
+ {{tips}}
+
+
+ 更新柱状图数据
+
+
+ 柱状图
+
+
+
+
+
+
+
+
+
+
+ 温度计式图表
+
+
+
+
+
+
+
+
+
+
+ 混合图(单坐标系支持画点、线、面、柱)
+
+
+
+
+
+
+
+
+
+
+ K线图(蜡烛图)
+
+
+
+
+
+
+
+
+
+
+
+
+ 更新仪表盘数据
+
+
+ 仪表盘
+
+
+
+
+
+
+
+
+
+
+ 圆弧进度图
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 漏斗图
+
+
+
+
+
+
+
+
+
+
+ 折线图一(可横向拖拽带滚动条)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 折线图二(横屏图表)
+
+
+
+
+
+
+
+
+
+
+ 区域图
+
+
+
+
+
+
+
+
+
+
+ 饼状图
+
+
+
+
+
+
+
+
+
+
+ 环形图
+
+
+
+
+
+
+
+
+
+
+ 雷达图
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/template/vant-button/vant-button.vue b/pages/template/vant-button/vant-button.vue
new file mode 100644
index 0000000..dd07066
--- /dev/null
+++ b/pages/template/vant-button/vant-button.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+ uni-app支持在微信小程序、QQ小程序端、App端、H5端引入微信小程序自定义组件。以下以vant weapp组件为例演示
+
+
+
+ vant weapp的van-button按钮组件
+
+
+
+
+
+
+
diff --git a/pages/zyb/fillVolunteer/detail.vue b/pages/zyb/fillVolunteer/detail.vue
new file mode 100644
index 0000000..56dbd63
--- /dev/null
+++ b/pages/zyb/fillVolunteer/detail.vue
@@ -0,0 +1,686 @@
+
+
+
+
+
+
+
+
+
+
+ {{ tab.name }}
+
+
+
+
+
+
+
+
+ {{this.selectForm.batch}}({{filledVolunteer.volunteerRecordEarlyAdmissionNum}}/2)
+ {{this.selectForm.batch}}({{filledVolunteer.volunteerUndergraduateANum}}/12)
+ {{this.selectForm.batch}}({{filledVolunteer.volunteerUndergraduateBNum}}/12)
+ {{this.selectForm.batch}}({{filledVolunteer.volunteerUndergraduateNum}}/12)
+ {{this.selectForm.batch}}({{filledVolunteer.volunteerJuniorCollegeNum}}/12)
+
+
+
+
+
+
+
+
+ {{item.indexs}}
+
+
+
+ [{{item.institutionCode}}]
+ {{item.schoolName}}
+
+
+ {{item.province}}省
+ {{item.propertyName}}
+
+
+
+
+
+
+
+
+
+
+ {{item.enrollProbability}}%
+
+
+
+ [{{item.enrollmentCode}}]
+ {{item.majorName}}{{item.majorDetail}}
+
+
+ 学费:{{item.studyCost}}
+ 招生{{item.jhs}}人
+
+
+ 2023年录取最低分{{item.historyMajorEnrollMap['2023'].admissionLine}}分
+ 2022年录取最低分{{item.historyMajorEnrollMap['2022'].admissionLine}}分
+ 2021年录取最低分{{item.historyMajorEnrollMap['2021'].admissionLine}}分
+
+
+ 录取方式:{{item.rulesEnrollProbability}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.indexs}}
+
+
+
+ 点击添加
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/zyb/fillVolunteer/index.vue b/pages/zyb/fillVolunteer/index.vue
new file mode 100644
index 0000000..7c935c6
--- /dev/null
+++ b/pages/zyb/fillVolunteer/index.vue
@@ -0,0 +1,945 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我的成绩
+
+
+ 修改
+
+
+
+
+ 省份:{{ scoreInfo.province }}
+ 选科:{{ scoreInfo.cognitioPolyclinic }}
+ 类别:{{ scoreInfo.professionalCategory }}
+
+
+ 文化成绩:{{ scoreInfo.culturalScore }}
+ 统考成绩:{{ scoreInfo.professionalScore }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ tab.name }}
+
+
+
+
+
+
+ 可保底
+
+
+
+
+ 较稳妥
+
+
+
+
+ 可冲击
+
+
+
+
+ 难录取
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t }}
+
+
+
+
+ [{{ item.enrollmentCode }}] {{ item.majorName }}
+ {{ item.majorDetail }}
+
+
+
+ 保
+ 稳
+ 冲
+ 难
+ {{ item.enrollProbability }}%
+
+
+
+
+
+
+
+ {{ item.historyMajorEnrollMap['2023'].year }}年录取最低分:
+ {{ item.historyMajorEnrollMap['2023'].admissionLine }}分
+
+
+ {{ item.historyMajorEnrollMap['2022'].year }}年录取最低分:
+ {{ item.historyMajorEnrollMap['2022'].admissionLine }}分
+
+
+
+ {{ nowYear }}录取方式:
+ {{ item.rulesEnrollProbability }}
+ 暂未发布
+
+
+ {{ nowYear }}省内计划数:
+ {{ item.planNum }}人
+ 暂未发布
+
+
+
+
+
+ 折合分:
+ {{ item.studentConvertedScore }}分
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 当前页:{{ page.current }},数据总量:{{ page.total }}条,每页数据:{{ page.pageSize }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/zyb/fillVolunteer/list.vue b/pages/zyb/fillVolunteer/list.vue
new file mode 100644
index 0000000..ed2fefc
--- /dev/null
+++ b/pages/zyb/fillVolunteer/list.vue
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.volunteerName }}
+
+
+
+
+ 更新:
+ {{ item.updateTime }}
+ {{ item.createTime }}
+
+
+
+
+
+ {{ item.userScoreInfo.cognitioPolyclinic }} | {{ item.userScoreInfo.professionalCategory }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/zyb/home.vue b/pages/zyb/home.vue
new file mode 100644
index 0000000..ca0ac99
--- /dev/null
+++ b/pages/zyb/home.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+ {{scoreInfo.province}}
+ {{StaticConstant.year}}年填报
+
+
+
+ 942个
+ 院校志愿适合你
+
+
+
+
+
+ {{tjlb.kcj}}
+ 可冲击
+
+
+ {{tjlb.jwt}}
+ 较稳妥
+
+
+ {{tjlb.kbd}}
+ 可保底
+
+
+
+
+
+
+
+
+
diff --git a/pages/zyb/score/edit.vue b/pages/zyb/score/edit.vue
new file mode 100644
index 0000000..1714912
--- /dev/null
+++ b/pages/zyb/score/edit.vue
@@ -0,0 +1,206 @@
+
+
+
+
+
+
+
+ 统考/省联考成绩
+ \n暂仅支持统考及省组织的联考科类成绩评估
+
+
+
+
+
+
+
+
+
diff --git a/pages/zyb/user/center.vue b/pages/zyb/user/center.vue
new file mode 100644
index 0000000..7915a9b
--- /dev/null
+++ b/pages/zyb/user/center.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
diff --git a/platforms/app-plus/feedback/feedback.vue b/platforms/app-plus/feedback/feedback.vue
new file mode 100644
index 0000000..0373166
--- /dev/null
+++ b/platforms/app-plus/feedback/feedback.vue
@@ -0,0 +1,232 @@
+
+
+
+ 问题和意见
+ 快速键入
+
+
+ 图片(选填,提供问题截图,总大小10M以下)
+
+
+
+ 点击预览图片
+ {{ imageList.length }}/5
+
+
+
+
+
+
+ x
+
+
+
+
+
+
+
+ QQ/邮箱
+
+
+ 应用评分
+
+
+
+ 用户反馈的结果可在app打包后于DCloud开发者中心查看
+
+
+
+
+
+
diff --git a/platforms/app-plus/orientation/orientation.vue b/platforms/app-plus/orientation/orientation.vue
new file mode 100644
index 0000000..ba636c4
--- /dev/null
+++ b/platforms/app-plus/orientation/orientation.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/platforms/app-plus/proximity/proximity.vue b/platforms/app-plus/proximity/proximity.vue
new file mode 100644
index 0000000..ee4af46
--- /dev/null
+++ b/platforms/app-plus/proximity/proximity.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+ 手机顶部听筒处有传感器监听距离手机屏幕的障碍物,覆盖该传感器会触发本事件变化
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/platforms/app-plus/push/push.vue b/platforms/app-plus/push/push.vue
new file mode 100644
index 0000000..91aa675
--- /dev/null
+++ b/platforms/app-plus/push/push.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+ 透传内容:
+
+
+
+
+
+
+
+
+
diff --git a/platforms/app-plus/shake/shake.vue b/platforms/app-plus/shake/shake.vue
new file mode 100644
index 0000000..ef839f0
--- /dev/null
+++ b/platforms/app-plus/shake/shake.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/platforms/app-plus/speech/speech.vue b/platforms/app-plus/speech/speech.vue
new file mode 100644
index 0000000..cae663e
--- /dev/null
+++ b/platforms/app-plus/speech/speech.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/60x60.png b/static/60x60.png
new file mode 100644
index 0000000..6984932
Binary files /dev/null and b/static/60x60.png differ
diff --git a/static/api.png b/static/api.png
new file mode 100644
index 0000000..58f93e1
Binary files /dev/null and b/static/api.png differ
diff --git a/static/apiHL.png b/static/apiHL.png
new file mode 100644
index 0000000..f8cbd7d
Binary files /dev/null and b/static/apiHL.png differ
diff --git a/static/apiIndex.png b/static/apiIndex.png
new file mode 100644
index 0000000..890dba5
Binary files /dev/null and b/static/apiIndex.png differ
diff --git a/static/app-plus/location@3x.png b/static/app-plus/location@3x.png
new file mode 100644
index 0000000..c195e0a
Binary files /dev/null and b/static/app-plus/location@3x.png differ
diff --git a/static/app-plus/uni@2x.png b/static/app-plus/uni@2x.png
new file mode 100644
index 0000000..8e3a80f
Binary files /dev/null and b/static/app-plus/uni@2x.png differ
diff --git a/static/c1.png b/static/c1.png
new file mode 100644
index 0000000..9d38fdc
Binary files /dev/null and b/static/c1.png differ
diff --git a/static/c2.png b/static/c2.png
new file mode 100644
index 0000000..ce956d7
Binary files /dev/null and b/static/c2.png differ
diff --git a/static/c3.png b/static/c3.png
new file mode 100644
index 0000000..216202a
Binary files /dev/null and b/static/c3.png differ
diff --git a/static/c4.png b/static/c4.png
new file mode 100644
index 0000000..fb8b477
Binary files /dev/null and b/static/c4.png differ
diff --git a/static/c5.png b/static/c5.png
new file mode 100644
index 0000000..310bfb1
Binary files /dev/null and b/static/c5.png differ
diff --git a/static/c6.png b/static/c6.png
new file mode 100644
index 0000000..c3c45d8
Binary files /dev/null and b/static/c6.png differ
diff --git a/static/c7.png b/static/c7.png
new file mode 100644
index 0000000..a1e7390
Binary files /dev/null and b/static/c7.png differ
diff --git a/static/c8.png b/static/c8.png
new file mode 100644
index 0000000..c32633c
Binary files /dev/null and b/static/c8.png differ
diff --git a/static/c9.png b/static/c9.png
new file mode 100644
index 0000000..51bcf6a
Binary files /dev/null and b/static/c9.png differ
diff --git a/static/compass.png b/static/compass.png
new file mode 100644
index 0000000..fba87a5
Binary files /dev/null and b/static/compass.png differ
diff --git a/static/component.png b/static/component.png
new file mode 100644
index 0000000..fbb116d
Binary files /dev/null and b/static/component.png differ
diff --git a/static/componentHL.png b/static/componentHL.png
new file mode 100644
index 0000000..31f83a0
Binary files /dev/null and b/static/componentHL.png differ
diff --git a/static/componentIndex.png b/static/componentIndex.png
new file mode 100644
index 0000000..8ad0534
Binary files /dev/null and b/static/componentIndex.png differ
diff --git a/static/customicons.css b/static/customicons.css
new file mode 100644
index 0000000..14ed5fa
--- /dev/null
+++ b/static/customicons.css
@@ -0,0 +1,20 @@
+@font-face {
+ font-family: "customicons"; /* Project id 2878519 */
+ src:url('/static/customicons.ttf') format('truetype');
+}
+
+.customicons {
+ font-family: "customicons" !important;
+}
+
+.youxi:before {
+ content: "\e60e";
+}
+
+.wenjian:before {
+ content: "\e60f";
+}
+
+.zhuanfa:before {
+ content: "\e610";
+}
diff --git a/static/customicons.ttf b/static/customicons.ttf
new file mode 100644
index 0000000..a3c8ab9
Binary files /dev/null and b/static/customicons.ttf differ
diff --git a/static/extui.png b/static/extui.png
new file mode 100644
index 0000000..7508e08
Binary files /dev/null and b/static/extui.png differ
diff --git a/static/extuiHL.png b/static/extuiHL.png
new file mode 100644
index 0000000..612b499
Binary files /dev/null and b/static/extuiHL.png differ
diff --git a/static/extuiIndex.png b/static/extuiIndex.png
new file mode 100644
index 0000000..dd4d963
Binary files /dev/null and b/static/extuiIndex.png differ
diff --git a/static/home-active.png b/static/home-active.png
new file mode 100644
index 0000000..ccba950
Binary files /dev/null and b/static/home-active.png differ
diff --git a/static/home.png b/static/home.png
new file mode 100644
index 0000000..569c7d0
Binary files /dev/null and b/static/home.png differ
diff --git a/static/iconfont.css b/static/iconfont.css
new file mode 100644
index 0000000..18cf80a
--- /dev/null
+++ b/static/iconfont.css
@@ -0,0 +1,32 @@
+@font-face {
+ font-family: "iconfont"; /* Project id */
+ src: url('@/static/iconfont.ttf') format('truetype');
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-link:before {
+ content: "\e772";
+}
+
+.icon-poweroff:before {
+ content: "\e774";
+}
+
+.icon-safety-certificate:before {
+ content: "\e776";
+}
+
+.icon-chart-pie-alt:before {
+ content: "\e78c";
+}
+
+.icon-kongxincai:before {
+ content: "\e642";
+}
diff --git a/static/iconfont.ttf b/static/iconfont.ttf
new file mode 100644
index 0000000..2b132b6
Binary files /dev/null and b/static/iconfont.ttf differ
diff --git a/static/icons/arrow/angle-down-active.png b/static/icons/arrow/angle-down-active.png
new file mode 100644
index 0000000..98033db
Binary files /dev/null and b/static/icons/arrow/angle-down-active.png differ
diff --git a/static/icons/arrow/angle-down.png b/static/icons/arrow/angle-down.png
new file mode 100644
index 0000000..2b8381f
Binary files /dev/null and b/static/icons/arrow/angle-down.png differ
diff --git a/static/icons/badge.png b/static/icons/badge.png
new file mode 100644
index 0000000..b32a7a5
Binary files /dev/null and b/static/icons/badge.png differ
diff --git a/static/icons/button.png b/static/icons/button.png
new file mode 100644
index 0000000..461fe67
Binary files /dev/null and b/static/icons/button.png differ
diff --git a/static/icons/calendar.png b/static/icons/calendar.png
new file mode 100644
index 0000000..e8beb9c
Binary files /dev/null and b/static/icons/calendar.png differ
diff --git a/static/icons/card.png b/static/icons/card.png
new file mode 100644
index 0000000..8426e99
Binary files /dev/null and b/static/icons/card.png differ
diff --git a/static/icons/collapse.png b/static/icons/collapse.png
new file mode 100644
index 0000000..87da4bb
Binary files /dev/null and b/static/icons/collapse.png differ
diff --git a/static/icons/color.png b/static/icons/color.png
new file mode 100644
index 0000000..a774143
Binary files /dev/null and b/static/icons/color.png differ
diff --git a/static/icons/combox.png b/static/icons/combox.png
new file mode 100644
index 0000000..c1cb660
Binary files /dev/null and b/static/icons/combox.png differ
diff --git a/static/icons/countdown.png b/static/icons/countdown.png
new file mode 100644
index 0000000..aa4bf10
Binary files /dev/null and b/static/icons/countdown.png differ
diff --git a/static/icons/cuti/delete-active.png b/static/icons/cuti/delete-active.png
new file mode 100644
index 0000000..fd5b99d
Binary files /dev/null and b/static/icons/cuti/delete-active.png differ
diff --git a/static/icons/cuti/delete.png b/static/icons/cuti/delete.png
new file mode 100644
index 0000000..ad1bcf9
Binary files /dev/null and b/static/icons/cuti/delete.png differ
diff --git a/static/icons/cuti/done-active.png b/static/icons/cuti/done-active.png
new file mode 100644
index 0000000..ba341ac
Binary files /dev/null and b/static/icons/cuti/done-active.png differ
diff --git a/static/icons/cuti/done.png b/static/icons/cuti/done.png
new file mode 100644
index 0000000..6aecccf
Binary files /dev/null and b/static/icons/cuti/done.png differ
diff --git a/static/icons/cuti/edit-active.png b/static/icons/cuti/edit-active.png
new file mode 100644
index 0000000..63b41d9
Binary files /dev/null and b/static/icons/cuti/edit-active.png differ
diff --git a/static/icons/cuti/edit.png b/static/icons/cuti/edit.png
new file mode 100644
index 0000000..29664e8
Binary files /dev/null and b/static/icons/cuti/edit.png differ
diff --git a/static/icons/cuti/file-download-active.png b/static/icons/cuti/file-download-active.png
new file mode 100644
index 0000000..03e68f3
Binary files /dev/null and b/static/icons/cuti/file-download-active.png differ
diff --git a/static/icons/cuti/file-download.png b/static/icons/cuti/file-download.png
new file mode 100644
index 0000000..2773ce4
Binary files /dev/null and b/static/icons/cuti/file-download.png differ
diff --git a/static/icons/data-checkbox.png b/static/icons/data-checkbox.png
new file mode 100644
index 0000000..748bdcb
Binary files /dev/null and b/static/icons/data-checkbox.png differ
diff --git a/static/icons/data-picker.png b/static/icons/data-picker.png
new file mode 100644
index 0000000..5712964
Binary files /dev/null and b/static/icons/data-picker.png differ
diff --git a/static/icons/dateformat.png b/static/icons/dateformat.png
new file mode 100644
index 0000000..097cbe7
Binary files /dev/null and b/static/icons/dateformat.png differ
diff --git a/static/icons/datetime-picker.png b/static/icons/datetime-picker.png
new file mode 100644
index 0000000..24753fd
Binary files /dev/null and b/static/icons/datetime-picker.png differ
diff --git a/static/icons/drawer.png b/static/icons/drawer.png
new file mode 100644
index 0000000..73a9802
Binary files /dev/null and b/static/icons/drawer.png differ
diff --git a/static/icons/easyinput.png b/static/icons/easyinput.png
new file mode 100644
index 0000000..569ea58
Binary files /dev/null and b/static/icons/easyinput.png differ
diff --git a/static/icons/fab.png b/static/icons/fab.png
new file mode 100644
index 0000000..e953d90
Binary files /dev/null and b/static/icons/fab.png differ
diff --git a/static/icons/fav.png b/static/icons/fav.png
new file mode 100644
index 0000000..a51153c
Binary files /dev/null and b/static/icons/fav.png differ
diff --git a/static/icons/file-picker.png b/static/icons/file-picker.png
new file mode 100644
index 0000000..3424795
Binary files /dev/null and b/static/icons/file-picker.png differ
diff --git a/static/icons/font.png b/static/icons/font.png
new file mode 100644
index 0000000..610983b
Binary files /dev/null and b/static/icons/font.png differ
diff --git a/static/icons/forms.png b/static/icons/forms.png
new file mode 100644
index 0000000..8bc60b4
Binary files /dev/null and b/static/icons/forms.png differ
diff --git a/static/icons/goods-nav.png b/static/icons/goods-nav.png
new file mode 100644
index 0000000..83ae3f9
Binary files /dev/null and b/static/icons/goods-nav.png differ
diff --git a/static/icons/grid.png b/static/icons/grid.png
new file mode 100644
index 0000000..e50cb7f
Binary files /dev/null and b/static/icons/grid.png differ
diff --git a/static/icons/group.png b/static/icons/group.png
new file mode 100644
index 0000000..9fe980b
Binary files /dev/null and b/static/icons/group.png differ
diff --git a/static/icons/icons.png b/static/icons/icons.png
new file mode 100644
index 0000000..d354ccd
Binary files /dev/null and b/static/icons/icons.png differ
diff --git a/static/icons/indexed-list.png b/static/icons/indexed-list.png
new file mode 100644
index 0000000..dd94bb0
Binary files /dev/null and b/static/icons/indexed-list.png differ
diff --git a/static/icons/link.png b/static/icons/link.png
new file mode 100644
index 0000000..de0f33f
Binary files /dev/null and b/static/icons/link.png differ
diff --git a/static/icons/list.png b/static/icons/list.png
new file mode 100644
index 0000000..688602e
Binary files /dev/null and b/static/icons/list.png differ
diff --git a/static/icons/load-more.png b/static/icons/load-more.png
new file mode 100644
index 0000000..6f45cc4
Binary files /dev/null and b/static/icons/load-more.png differ
diff --git a/static/icons/nav-bar.png b/static/icons/nav-bar.png
new file mode 100644
index 0000000..5157ead
Binary files /dev/null and b/static/icons/nav-bar.png differ
diff --git a/static/icons/notice-bar.png b/static/icons/notice-bar.png
new file mode 100644
index 0000000..1f73775
Binary files /dev/null and b/static/icons/notice-bar.png differ
diff --git a/static/icons/number-box.png b/static/icons/number-box.png
new file mode 100644
index 0000000..c454a03
Binary files /dev/null and b/static/icons/number-box.png differ
diff --git a/static/icons/pagination.png b/static/icons/pagination.png
new file mode 100644
index 0000000..b516577
Binary files /dev/null and b/static/icons/pagination.png differ
diff --git a/static/icons/popup.png b/static/icons/popup.png
new file mode 100644
index 0000000..1058ca4
Binary files /dev/null and b/static/icons/popup.png differ
diff --git a/static/icons/radius.png b/static/icons/radius.png
new file mode 100644
index 0000000..2a173ca
Binary files /dev/null and b/static/icons/radius.png differ
diff --git a/static/icons/rate.png b/static/icons/rate.png
new file mode 100644
index 0000000..2c58206
Binary files /dev/null and b/static/icons/rate.png differ
diff --git a/static/icons/row.png b/static/icons/row.png
new file mode 100644
index 0000000..48620d8
Binary files /dev/null and b/static/icons/row.png differ
diff --git a/static/icons/search-bar.png b/static/icons/search-bar.png
new file mode 100644
index 0000000..6a82efd
Binary files /dev/null and b/static/icons/search-bar.png differ
diff --git a/static/icons/section.png b/static/icons/section.png
new file mode 100644
index 0000000..69dffeb
Binary files /dev/null and b/static/icons/section.png differ
diff --git a/static/icons/segmented-control.png b/static/icons/segmented-control.png
new file mode 100644
index 0000000..5cbe60d
Binary files /dev/null and b/static/icons/segmented-control.png differ
diff --git a/static/icons/space.png b/static/icons/space.png
new file mode 100644
index 0000000..38c30e0
Binary files /dev/null and b/static/icons/space.png differ
diff --git a/static/icons/steps.png b/static/icons/steps.png
new file mode 100644
index 0000000..142ea74
Binary files /dev/null and b/static/icons/steps.png differ
diff --git a/static/icons/swipe-action.png b/static/icons/swipe-action.png
new file mode 100644
index 0000000..204b7f9
Binary files /dev/null and b/static/icons/swipe-action.png differ
diff --git a/static/icons/swiper-dot.png b/static/icons/swiper-dot.png
new file mode 100644
index 0000000..7d68269
Binary files /dev/null and b/static/icons/swiper-dot.png differ
diff --git a/static/icons/tag.png b/static/icons/tag.png
new file mode 100644
index 0000000..fe8f27d
Binary files /dev/null and b/static/icons/tag.png differ
diff --git a/static/icons/title.png b/static/icons/title.png
new file mode 100644
index 0000000..298336c
Binary files /dev/null and b/static/icons/title.png differ
diff --git a/static/icons/transition.png b/static/icons/transition.png
new file mode 100644
index 0000000..4824802
Binary files /dev/null and b/static/icons/transition.png differ
diff --git a/static/icons/write-l-active.png b/static/icons/write-l-active.png
new file mode 100644
index 0000000..408ddb6
Binary files /dev/null and b/static/icons/write-l-active.png differ
diff --git a/static/icons/write-l.png b/static/icons/write-l.png
new file mode 100644
index 0000000..0de27a1
Binary files /dev/null and b/static/icons/write-l.png differ
diff --git a/static/image-active.png b/static/image-active.png
new file mode 100644
index 0000000..407cabb
Binary files /dev/null and b/static/image-active.png differ
diff --git a/static/image.png b/static/image.png
new file mode 100644
index 0000000..008a677
Binary files /dev/null and b/static/image.png differ
diff --git a/static/image/uniui-header-bg.png b/static/image/uniui-header-bg.png
new file mode 100644
index 0000000..aa3827c
Binary files /dev/null and b/static/image/uniui-header-bg.png differ
diff --git a/static/image/uniui-logo.png b/static/image/uniui-logo.png
new file mode 100644
index 0000000..5a3f0a8
Binary files /dev/null and b/static/image/uniui-logo.png differ
diff --git a/static/location.png b/static/location.png
new file mode 100644
index 0000000..c195e0a
Binary files /dev/null and b/static/location.png differ
diff --git a/static/logo.png b/static/logo.png
new file mode 100644
index 0000000..b5771e2
Binary files /dev/null and b/static/logo.png differ
diff --git a/static/menu.png b/static/menu.png
new file mode 100644
index 0000000..a3a92c1
Binary files /dev/null and b/static/menu.png differ
diff --git a/static/nav.png b/static/nav.png
new file mode 100644
index 0000000..57b420b
Binary files /dev/null and b/static/nav.png differ
diff --git a/static/pause.png b/static/pause.png
new file mode 100644
index 0000000..9acb73d
Binary files /dev/null and b/static/pause.png differ
diff --git a/static/play.png b/static/play.png
new file mode 100644
index 0000000..982f2f2
Binary files /dev/null and b/static/play.png differ
diff --git a/static/plus.png b/static/plus.png
new file mode 100644
index 0000000..73ddfe3
Binary files /dev/null and b/static/plus.png differ
diff --git a/static/record.png b/static/record.png
new file mode 100644
index 0000000..a62ef81
Binary files /dev/null and b/static/record.png differ
diff --git a/static/shuijiao.jpg b/static/shuijiao.jpg
new file mode 100644
index 0000000..b654b9c
Binary files /dev/null and b/static/shuijiao.jpg differ
diff --git a/static/star-active.png b/static/star-active.png
new file mode 100644
index 0000000..9ca15ab
Binary files /dev/null and b/static/star-active.png differ
diff --git a/static/star.png b/static/star.png
new file mode 100644
index 0000000..40eb232
Binary files /dev/null and b/static/star.png differ
diff --git a/static/stop.png b/static/stop.png
new file mode 100644
index 0000000..9e65f3e
Binary files /dev/null and b/static/stop.png differ
diff --git a/static/template.png b/static/template.png
new file mode 100644
index 0000000..409ec9b
Binary files /dev/null and b/static/template.png differ
diff --git a/static/templateHL.png b/static/templateHL.png
new file mode 100644
index 0000000..4018448
Binary files /dev/null and b/static/templateHL.png differ
diff --git a/static/templateIndex.png b/static/templateIndex.png
new file mode 100644
index 0000000..7c986ea
Binary files /dev/null and b/static/templateIndex.png differ
diff --git a/static/trash.png b/static/trash.png
new file mode 100644
index 0000000..83d68f3
Binary files /dev/null and b/static/trash.png differ
diff --git a/static/uni.png b/static/uni.png
new file mode 100644
index 0000000..8e3a80f
Binary files /dev/null and b/static/uni.png differ
diff --git a/static/uni.ttf b/static/uni.ttf
new file mode 100644
index 0000000..60a1968
Binary files /dev/null and b/static/uni.ttf differ
diff --git a/store/index.js b/store/index.js
new file mode 100644
index 0000000..c7c84e6
--- /dev/null
+++ b/store/index.js
@@ -0,0 +1,130 @@
+// #ifndef VUE3
+import Vue from 'vue'
+import Vuex from 'vuex'
+Vue.use(Vuex)
+const store = new Vuex.Store({
+// #endif
+
+// #ifdef VUE3
+import { createStore } from 'vuex'
+const store = createStore({
+// #endif
+ state: {
+ hasLogin: false,
+ isUniverifyLogin: false,
+ loginProvider: "",
+ openid: null,
+ testvuex: false,
+ colorIndex: 0,
+ colorList: ['#FF0000', '#00FF00', '#0000FF'],
+ noMatchLeftWindow: true,
+ active: 'componentPage',
+ leftWinActive: '/pages/component/view/view',
+ activeOpen: '',
+ menu: [],
+ univerifyErrorMsg: ''
+ },
+ mutations: {
+ login(state, provider) {
+ state.hasLogin = true;
+ state.loginProvider = provider;
+ },
+ logout(state) {
+ state.hasLogin = false
+ state.openid = null
+ },
+ setOpenid(state, openid) {
+ state.openid = openid
+ },
+ setTestTrue(state) {
+ state.testvuex = true
+ },
+ setTestFalse(state) {
+ state.testvuex = false
+ },
+ setColorIndex(state, index) {
+ state.colorIndex = index
+ },
+ setMatchLeftWindow(state, matchLeftWindow) {
+ state.noMatchLeftWindow = !matchLeftWindow
+ },
+ setActive(state, tabPage) {
+ state.active = tabPage
+ },
+ setLeftWinActive(state, leftWinActive) {
+ state.leftWinActive = leftWinActive
+ },
+ setActiveOpen(state, activeOpen) {
+ state.activeOpen = activeOpen
+ },
+ setMenu(state, menu) {
+ state.menu = menu
+ },
+ setUniverifyLogin(state, payload) {
+ typeof payload !== 'boolean' ? payload = !!payload : '';
+ state.isUniverifyLogin = payload;
+ },
+ setUniverifyErrorMsg(state,payload = ''){
+ state.univerifyErrorMsg = payload
+ }
+ },
+ getters: {
+ currentColor(state) {
+ return state.colorList[state.colorIndex]
+ }
+ },
+ actions: {
+ // lazy loading openid
+ getUserOpenId: async function({
+ commit,
+ state
+ }) {
+ return await new Promise((resolve, reject) => {
+ if (state.openid) {
+ resolve(state.openid)
+ } else {
+ uni.login({
+ success: (data) => {
+ commit('login')
+ setTimeout(function() { //模拟异步请求服务器获取 openid
+ const openid = '123456789'
+ console.log('uni.request mock openid[' + openid + ']');
+ commit('setOpenid', openid)
+ resolve(openid)
+ }, 1000)
+ },
+ fail: (err) => {
+ console.log('uni.login 接口调用失败,将无法正常使用开放接口等服务', err)
+ reject(err)
+ }
+ })
+ }
+ })
+ },
+ getPhoneNumber: function({
+ commit
+ }, univerifyInfo) {
+ return new Promise((resolve, reject) => {
+ uni.request({
+ url: 'https://97fca9f2-41f6-449f-a35e-3f135d4c3875.bspapp.com/http/univerify-login',
+ method: 'POST',
+ data: univerifyInfo,
+ success: (res) => {
+ const data = res.data
+ if (data.success) {
+ resolve(data.phoneNumber)
+ } else {
+ reject(res)
+ }
+
+ },
+ fail: (err) => {
+ reject(res)
+ }
+ })
+ })
+ }
+ }
+})
+
+export default store
diff --git a/template.h5.html b/template.h5.html
new file mode 100644
index 0000000..c79b26a
--- /dev/null
+++ b/template.h5.html
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+ <%= htmlWebpackPlugin.options.title %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni.scss b/uni.scss
new file mode 100644
index 0000000..aa8c548
--- /dev/null
+++ b/uni.scss
@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$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:16;
+
+/* 图片尺寸 */
+$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;
diff --git a/uni_modules/lime-circle/changelog.md b/uni_modules/lime-circle/changelog.md
new file mode 100644
index 0000000..8d04f90
--- /dev/null
+++ b/uni_modules/lime-circle/changelog.md
@@ -0,0 +1,31 @@
+## 0.1.5(2023-12-16)
+- chore: hb升级到3.99后支持vue2 nvue ts
+## 0.1.4(2023-08-10)
+- chore: 文档更新,因文档的`dashboard`写错了
+## 0.1.3(2023-06-28)
+- chore: 文档更新
+## 0.1.2(2023-06-13)
+- feat: 增加 canvas 实现方式
+## 0.1.1(2023-06-08)
+- feat: 去掉`units.ts`改用`lime-shared`
+## 0.1.0(2023-04-13)
+- chore: 修改文档中的错误
+## 0.0.9(2023-04-13)
+- chore: 文档增加vue2使用方法示例
+## 0.0.8(2023-04-04)
+- chore: 去掉 script-setup 语法糖
+- chore: 文档增加 vue2 使用方法
+## 0.0.7(2022-11-09)
+- feat: 破坏性更新,由原来的canvas改为css3实现
+## 0.0.6(2022-11-04)
+- feat: 增加使用uni-popup示例
+## 0.0.5(2022-11-03)
+- fix: 修复 有毛点问题(因清空尺寸不对)
+## 0.0.4(2022-11-02)
+- feat: 增加 `delay` props 延时渲染,用于把组件放在弹窗时,无法正确获取尺寸时。
+## 0.0.3(2022-11-02)
+更新文档
+## 0.0.2(2022-11-01)
+更新文档
+## 0.0.1(2022-11-01)
+首次上传
diff --git a/uni_modules/lime-circle/components/l-circle/animation/bezier.ts b/uni_modules/lime-circle/components/l-circle/animation/bezier.ts
new file mode 100644
index 0000000..062909a
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/animation/bezier.ts
@@ -0,0 +1,82 @@
+export function cubicBezier(p1x: number, p1y: number, p2x: number, p2y: number) {
+ const ZERO_LIMIT = 1e-6;
+ // Calculate the polynomial coefficients,
+ // implicit first and last control points are (0,0) and (1,1).
+ const ax = 3 * p1x - 3 * p2x + 1;
+ const bx = 3 * p2x - 6 * p1x;
+ const cx = 3 * p1x;
+
+ const ay = 3 * p1y - 3 * p2y + 1;
+ const by = 3 * p2y - 6 * p1y;
+ const cy = 3 * p1y;
+
+ function sampleCurveDerivativeX(t: number) {
+ // `ax t^3 + bx t^2 + cx t` expanded using Horner's rule
+ return (3 * ax * t + 2 * bx) * t + cx;
+ }
+
+ function sampleCurveX(t: number) {
+ return ((ax * t + bx) * t + cx) * t;
+ }
+
+ function sampleCurveY(t: number) {
+ return ((ay * t + by) * t + cy) * t;
+ }
+
+ // Given an x value, find a parametric value it came from.
+ function solveCurveX(x: number) {
+ let t2 = x;
+ let derivative: number;
+ let x2: number;
+
+ // https://trac.webkit.org/browser/trunk/Source/WebCore/platform/animation
+ // first try a few iterations of Newton's method -- normally very fast.
+ // http://en.wikipedia.org/wikiNewton's_method
+ for (let i = 0; i < 8; i++) {
+ // f(t) - x = 0
+ x2 = sampleCurveX(t2) - x;
+ if (Math.abs(x2) < ZERO_LIMIT) {
+ return t2;
+ }
+ derivative = sampleCurveDerivativeX(t2);
+ // == 0, failure
+ /* istanbul ignore if */
+ if (Math.abs(derivative) < ZERO_LIMIT) {
+ break;
+ }
+ t2 -= x2 / derivative;
+ }
+
+ // Fall back to the bisection method for reliability.
+ // bisection
+ // http://en.wikipedia.org/wiki/Bisection_method
+ let t1 = 1;
+ /* istanbul ignore next */
+ let t0 = 0;
+
+ /* istanbul ignore next */
+ t2 = x;
+ /* istanbul ignore next */
+ while (t1 > t0) {
+ x2 = sampleCurveX(t2) - x;
+ if (Math.abs(x2) < ZERO_LIMIT) {
+ return t2;
+ }
+ if (x2 > 0) {
+ t1 = t2;
+ } else {
+ t0 = t2;
+ }
+ t2 = (t1 + t0) / 2;
+ }
+
+ // Failure
+ return t2;
+ }
+
+ function solve(x: number) {
+ return sampleCurveY(solveCurveX(x));
+ }
+
+ return solve;
+}
diff --git a/uni_modules/lime-circle/components/l-circle/animation/ease.ts b/uni_modules/lime-circle/components/l-circle/animation/ease.ts
new file mode 100644
index 0000000..9358c6d
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/animation/ease.ts
@@ -0,0 +1,2 @@
+import {cubicBezier} from './bezier';
+export let ease = cubicBezier(0.25, 0.1, 0.25, 1);
\ No newline at end of file
diff --git a/uni_modules/lime-circle/components/l-circle/animation/index.ts b/uni_modules/lime-circle/components/l-circle/animation/index.ts
new file mode 100644
index 0000000..bf1633e
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/animation/index.ts
@@ -0,0 +1,99 @@
+// @ts-nocheck
+const TICK = Symbol('tick');
+const TICK_HANDLER = Symbol('tick-handler');
+const ANIMATIONS = Symbol('animations');
+const START_TIMES = Symbol('start-times');
+const PAUSE_START = Symbol('pause-start');
+const PAUSE_TIME = Symbol('pause-time');
+const _raf = typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame : function(cb: Function) {return setTimeout(cb, 1000/60)}
+const _caf = typeof cancelAnimationFrame !== 'undefined' ? cancelAnimationFrame: function(id: any) {clearTimeout(id)}
+
+export class Timeline {
+ state: string
+ constructor() {
+ this.state = 'Initiated';
+ this[ANIMATIONS] = new Set();
+ this[START_TIMES] = new Map();
+ }
+ start() {
+ if (!(this.state === 'Initiated')) return;
+ this.state = 'Started';
+
+ let startTime = Date.now();
+ this[PAUSE_TIME] = 0;
+ this[TICK] = () => {
+ let now = Date.now();
+ for (let animation of this[ANIMATIONS]) {
+ let t: number;
+
+ if (this[START_TIMES].get(animation) < startTime) {
+ t = now - startTime - animation.delay - this[PAUSE_TIME];
+ } else {
+ t = now - this[START_TIMES].get(animation) - animation.delay - this[PAUSE_TIME];
+ }
+
+ if (t > animation.duration) {
+ this[ANIMATIONS].delete(animation);
+ t = animation.duration;
+ }
+ if (t > 0) animation.run(t);
+ }
+ this[TICK_HANDLER] = _raf(this[TICK]);
+ };
+ this[TICK]();
+ }
+ pause() {
+ if (!(this.state === 'Started')) return;
+ this.state = 'Paused';
+
+ this[PAUSE_START] = Date.now();
+ _caf(this[TICK_HANDLER]);
+ }
+ resume() {
+ if (!(this.state === 'Paused')) return;
+ this.state = 'Started';
+
+ this[PAUSE_TIME] += Date.now() - this[PAUSE_START];
+ this[TICK]();
+ }
+ reset() {
+ this.pause();
+ this.state = 'Initiated';
+ this[PAUSE_TIME] = 0;
+ this[PAUSE_START] = 0;
+ this[ANIMATIONS] = new Set();
+ this[START_TIMES] = new Map();
+ this[TICK_HANDLER] = null;
+ }
+ add(animation: any, startTime?: number) {
+ if (arguments.length < 2) startTime = Date.now();
+ this[ANIMATIONS].add(animation);
+ this[START_TIMES].set(animation, startTime);
+ }
+}
+
+export class Animation {
+ startValue: number
+ endValue: number
+ duration: number
+ timingFunction: (t: number) => number
+ delay: number
+ template: (t: number) => void
+ constructor(startValue: number, endValue: number, duration: number, delay: number, timingFunction: (t: number) => number, template: (v: number) => void) {
+ timingFunction = timingFunction || (v => v);
+ template = template || (v => v);
+
+ this.startValue = startValue;
+ this.endValue = endValue;
+ this.duration = duration;
+ this.timingFunction = timingFunction;
+ this.delay = delay;
+ this.template = template;
+ }
+
+ run(time: number) {
+ let range = this.endValue - this.startValue;
+ let progress = this.timingFunction(time / this.duration);
+ this.template(this.startValue + range * progress)
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/lime-circle/components/l-circle/circle.js b/uni_modules/lime-circle/components/l-circle/circle.js
new file mode 100644
index 0000000..9ec70d3
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/circle.js
@@ -0,0 +1 @@
+function t(t,i){if(!(t instanceof i))throw new TypeError("Cannot call a class as a function")}function i(t,i){for(var e=0;i.length>e;e++){var n=i[e];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function e(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),Object.defineProperty(t,"prototype",{writable:!1}),t}function n(t,i){(null==i||i>t.length)&&(i=t.length);for(var e=0,n=Array(i);i>e;e++)n[e]=t[e];return n}function r(t,i){var e="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!e){if(Array.isArray(t)||(e=function(t,i){if(t){if("string"==typeof t)return n(t,i);var e=Object.prototype.toString.call(t).slice(8,-1);return"Object"===e&&t.constructor&&(e=t.constructor.name),"Map"===e||"Set"===e?Array.from(t):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?n(t,i):void 0}}(t))||i&&t&&"number"==typeof t.length){e&&(t=e);var r=0,a=function(){};return{s:a,n:function(){return t.length>r?{done:!1,value:t[r++]}:{done:!0}},e:function(t){throw t},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,o=!0,h=!1;return{s:function(){e=e.call(t)},n:function(){var t=e.next();return o=t.done,t},e:function(t){h=!0,s=t},f:function(){try{o||null==e.return||e.return()}finally{if(h)throw s}}}}var a=function(t){return/^#.{3,6}$/.test(t)?4===t.length?t.substring(1).split("").map((function(t){return 17*parseInt(t,16)})):[t.substring(1,3),t.substring(3,5),t.substring(5,7)].map((function(t){return parseInt(t,16)})):(console.error("lime-circle: 渐变仅支持hex值"),[0,0,0])},s=function(t){return 1===t.length?"0"+t:t},o=function(t,i,e){var n,r,o,h,u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,c=[],l=[],d=function(t){return Math.pow(t/255,u)};for(t=a(t).map(d),i=a(i).map(d),n=0;e>n;n++){for(h=1-(o=n/(e-1)),r=0;3>r;r++)l[r]=s(Math.round(255*Math.pow(t[r]*h+i[r]*o,1/u)).toString(16));c.push("#"+l.join(""))}return c};var h=function(t,i,e,n){var r=1e-6,a=3*t-3*e+1,s=3*e-6*t,o=3*t,h=3*i-3*n+1,u=3*n-6*i,c=3*i;function l(t){return((a*t+s)*t+o)*t}return function(t){return i=function(t){for(var i,e,n,h=t,u=0;8>u;u++){if(e=l(h)-t,r>Math.abs(e))return h;if(r>Math.abs(i=(3*a*(n=h)+2*s)*n+o))break;h-=e/i}var c=1,d=0;for(h=t;c>d;){if(e=l(h)-t,r>Math.abs(e))return h;e>0?c=h:d=h,h=(c+d)/2}return h}(t),((h*i+u)*i+c)*i;var i}}(.25,.1,.25,1),u=Symbol("tick"),c=Symbol("tick-handler"),l=Symbol("animations"),d=Symbol("start-times"),f=Symbol("pause-start"),v=Symbol("pause-time"),g="undefined"!=typeof requestAnimationFrame?requestAnimationFrame:function(t){return setTimeout(t,1e3/60)},m="undefined"!=typeof cancelAnimationFrame?cancelAnimationFrame:function(t){clearTimeout(t)},y=function(){function i(){t(this,i),this.state=void 0,this.state="Initiated",this[l]=new Set,this[d]=new Map}return e(i,[{key:"start",value:function(){var t=this;if("Initiated"===this.state){this.state="Started";var i=Date.now();this[v]=0,this[u]=function(){var e,n=Date.now(),a=r(t[l]);try{for(a.s();!(e=a.n()).done;){var s=e.value,o=void 0;(o=t[d].get(s)s.duration&&(t[l].delete(s),o=s.duration),o>0&&s.run(o)}}catch(t){a.e(t)}finally{a.f()}t[c]=g(t[u])},this[u]()}}},{key:"pause",value:function(){"Started"===this.state&&(this.state="Paused",this[f]=Date.now(),m(this[c]))}},{key:"resume",value:function(){"Paused"===this.state&&(this.state="Started",this[v]+=Date.now()-this[f],this[u]())}},{key:"reset",value:function(){this.pause(),this.state="Initiated",this[v]=0,this[f]=0,this[l]=new Set,this[d]=new Map,this[c]=null}},{key:"add",value:function(t,i){2>arguments.length&&(i=Date.now()),this[l].add(t),this[d].set(t,i)}}]),i}(),p=function(){function i(e,n,r,a,s,o){t(this,i),this.startValue=void 0,this.endValue=void 0,this.duration=void 0,this.timingFunction=void 0,this.delay=void 0,this.template=void 0,s=s||function(t){return t},o=o||function(t){return t},this.startValue=e,this.endValue=n,this.duration=r,this.timingFunction=s,this.delay=a,this.template=o}return e(i,[{key:"run",value:function(t){var i=this.endValue-this.startValue,e=this.timingFunction(t/this.duration);this.template(this.startValue+i*e)}}]),i}(),w=Math.PI/180,b=function(){function i(e,n){t(this,i),this.canvas=void 0,this.context=void 0,this.current=0,this.size=0,this.pixelRatio=1,this._isConicGradient=!1,this._attrs={percent:0,size:"120px",lineCap:"round",strokeWidth:6,strokeColor:"#2db7f5",trailWidth:6,trailColor:"#ddd",dashboard:!1,clockwise:!0,duration:300,max:100,beforeAnimate:!0,animate:!0,formatter:"{d}{d}.{d}{d}%",fontSize:"16px",showText:!1},this._timer=void 0,this.startTime=0,this.target=0,this._colors=[],this._gradientColors=[],this._rAF=function(t){},this._cAf=function(t){},this.timeline=void 0,this.run=void 0,this.canvas=e,this.run=n.run,this.size=n.size||120,this.pixelRatio=n.pixelRatio||1,this.init(),this.initRaf(),this.timeline=new y(this._rAF,this._cAf)}return e(i,[{key:"init",value:function(){var t=this.size,i=this.pixelRatio;if(this.canvas){this.canvas.width=t*i,this.canvas.height=t*i;var e=this.canvas.getContext("2d");this._isConicGradient=!!e.createConicGradient,this.context=e}}},{key:"initRaf",value:function(){var t=this.canvas;"undefined"!=typeof window?(this._rAF=window.requestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},this._cAf=window.cancelAnimationFrame||function(t){window.clearTimeout(t)}):t&&t.requestAnimationFrame?(this._rAF=t.requestAnimationFrame,this._cAf=t.cancelAnimationFrame):(this._rAF=function(t){return setTimeout(t,16.7)},this._cAf=function(t){clearTimeout(t)})}},{key:"setOption",value:function(t){Object.assign(this._attrs,t)}},{key:"set",value:function(t,i){this._attrs[t]=i}},{key:"get",value:function(t){return this._attrs[t]||this.canvas[t]}},{key:"play",value:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.get("percent");this.target=Math.max(Math.min(i,this.get("max")||100),0),this.createConicGradient(),this.timeline.start(),this.timeline.add(new p(this.current,i,this.get("duration"),0,h,(function(i){t.current=1e-4>i?0:i,t.render(t.current),t.run(t.current)})))}},{key:"createConicGradient",value:function(){if(!this._isConicGradient){var t=this.get("strokeColor");if("string"!=typeof t&&this._colors!==t){this._colors=t,this._gradientColors=[];for(var i=this.getArc(),e=t.length-1,n=Math.floor(i/e),r=0;e>r;r++){i-=n,this._gradientColors=this._gradientColors.concat(o(t[r],t[r+1],r+1===e?n+i:n))}}}}},{key:"render",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=this.context,e=this.size,n=this.pixelRatio,r=this.getSalce(),a=this.getRotate(),s=e/2;i.setTransform(1,0,0,1,0,0),i.clearRect(-s,-s,e,e),i.setTransform(r*n,0,0,n,s*n,s*n),i.rotate(a*w),this.drawTrail(s),this.drawStroke(s,t),i.draw&&i.draw()}},{key:"drawArc",value:function(t,i,e,n,r){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:this.get("lineCap"),s=this.context;s.beginPath(),s.lineCap=a,s.strokeStyle=i,s.lineWidth=e,s.arc(0,0,t,n,r),s.stroke()}},{key:"getArc",value:function(){var t=this.get("arc");return t||(this.get("dashboard")?270:360)}},{key:"getSalce",value:function(){return this.get("clockwise")?1:-1}},{key:"getRotate",value:function(){return this.get("arc")?180:this.get("dashboard")?135:-90}},{key:"drawTrail",value:function(t){var i=t-this.get("trailWidth")/2;this.drawArc(i,this.get("trailColor"),this.get("trailWidth"),0,this.getArc()*w)}},{key:"drawStroke",value:function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(i){var e=t-this.get("strokeWidth")/2,n=this.get("strokeColor"),r=this.getArc(),a=Math.round(r/this.get("max")*i);if("string"==typeof n||this._isConicGradient)if("string"!=typeof n&&this._isConicGradient){var s=this.context,o=s.createConicGradient(this.get("dashboard")?45:90,0,0);n.forEach((function(t,i){o.addColorStop(i/(n.length-1),t)})),this.drawArc(e,o,this.get("strokeWidth"),0,a*w)}else this.drawArc(e,n,this.get("strokeWidth"),0,a*w);else for(var h=0;a>h;h++)this.drawArc(e,this._gradientColors[h],this.get("strokeWidth"),h*w,(h+1)*w,this.get("dashboard")||r!=a?this.get("lineCap"):"butt")}}}]),i}();export{b as Circle};
diff --git a/uni_modules/lime-circle/components/l-circle/getCanvas.ts b/uni_modules/lime-circle/components/l-circle/getCanvas.ts
new file mode 100644
index 0000000..dd2d643
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/getCanvas.ts
@@ -0,0 +1,31 @@
+
+// @ts-nocheck
+import type { ComponentInternalInstance } from './vue'
+import { getRect } from '@/uni_modules/lime-shared/getRect'
+import { canIUseCanvas2d } from '@/uni_modules/lime-shared/canIUseCanvas2d'
+export let isCanvas2d = canIUseCanvas2d()
+
+export async function getCanvas(canvasId: string, options: {context: ComponentInternalInstance}) {
+ let { context } = options
+ // #ifdef MP || VUE2
+ if (context.proxy) context = context.proxy
+ // #endif
+ return getRect('#' + canvasId, {context, type: isCanvas2d ? 'fields': 'boundingClientRect'}).then(({node}) => {
+ if(node){
+ return node
+ } else {
+ isCanvas2d = false
+ const ctx = uni.createCanvasContext(canvasId, context)
+ return {
+ getContext(type: string) {
+ if(type == '2d') {
+ return ctx
+ }
+ },
+ }
+ // #ifdef H5
+ // canvas.value = context.proxy.$el.querySelector('#'+ canvasId)
+ // #endif
+ }
+ })
+}
diff --git a/uni_modules/lime-circle/components/l-circle/index.scss b/uni_modules/lime-circle/components/l-circle/index.scss
new file mode 100644
index 0000000..e28ef3c
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/index.scss
@@ -0,0 +1,116 @@
+/* #ifndef APP-NVUE */
+// @import '@/uni_modules/lime-ui/style/index.scss';
+@supports(background: conic-gradient(#000, #fff)) {
+ .check {
+ height: 1rpx;
+ position: absolute;
+ }
+}
+@property --l-circle-percent {
+ syntax: '';
+ initial-value: 25%;
+ inherits: false;
+}
+$fill-2: var(--l-fill-2, rgba(0, 0, 0, 0.06));
+$circle-trail-cap-size: var(--l-circle-trail-cap-size, 6px);
+$circle-trail-cap-color: currentColor;//var(--l-circle-trail-cap-color, currentColor);
+$circle-stroke-cap-size: var(--l-circle-stroke-cap-size, 6px);
+$circle-stroke-cap-start-color: var(--l-circle-stroke-cap-start-color, $fill-2);
+$circle-stroke-cap-end-color: var(--l-circle-stroke-cap-end-color, $fill-2);
+:root {
+ display: inline-block;
+}
+/* #endif */
+.l-circle {
+ position: relative;
+ /* #ifndef APP-NVUE */
+ display: inline-block;
+ &__canvas {
+ width: 100%;
+ height: 100%;
+ }
+ /* #endif */
+ &__inner{
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ align-items: center;
+ justify-content: center;
+ /* #ifndef APP-NVUE */
+ display: flex;
+ /* #endif */
+ }
+ /* #ifdef APP-NVUE */
+ &__view {
+ flex: 1;
+ }
+ /* #endif */
+ /* #ifndef APP-NVUE */
+ &__trail,&__stroke,&__stroke-line {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ }
+ &__stroke-line {
+ z-index: 2;
+ background: var(--l-background);
+ }
+ /* #endif */
+}
+
+/* #ifndef APP-NVUE */
+.is-round {
+ .l-circle {
+ &__trail {
+ .cap {
+ position: absolute;
+ display: block;
+ width: $circle-trail-cap-size;
+ height: $circle-trail-cap-size;
+ background-color: $circle-trail-cap-color;
+ z-index: 10;
+ border-radius: 50%;
+ &.start {
+ left: var(--l-circle-trail-cap-start-x, 14%);
+ top: var(--l-circle-trail-cap-start-y, 81%);
+ }
+ &.end {
+ left: var(--l-circle-trail-cap-end-x, 14%);
+ top: var(--l-circle-trail-cap-end-y, 81%);
+ }
+ }
+ }
+ &__stroke .cap{
+ position: absolute;
+ display: block;
+ width: $circle-stroke-cap-size;
+ height: $circle-stroke-cap-size;
+ background-color: $circle-stroke-cap-start-color;
+ /* z-index: 10; */
+ border-radius: 50%;
+ transition: opacity 300ms ease-out;
+ opacity: var(--l-circle-stroke-cap-opacity, 0);
+ &.start {
+ left: var(--l-circle-stroke-cap-start-x, 14%);
+ top: var(--l-circle-stroke-cap-start-y, 81%);
+ background-color: $circle-stroke-cap-start-color;
+ }
+ &.end {
+ left: var(--l-circle-stroke-cap-end-x, 14%);
+ top: var(--l-circle-stroke-cap-end-y, 81%);
+ z-index: -1;
+ background-color: $circle-stroke-cap-end-color;
+ }
+ }
+ }
+}
+.clockwise {
+ transform: translateY(var(--l-circle-offset-top, 0)) scale(-1,1);
+}
+.clockwise .l-circle__inner{
+ transform: scale(-1,1);
+}
+/* #endif */
\ No newline at end of file
diff --git a/uni_modules/lime-circle/components/l-circle/l-circle.vue b/uni_modules/lime-circle/components/l-circle/l-circle.vue
new file mode 100644
index 0000000..48a2c0f
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/l-circle.vue
@@ -0,0 +1,314 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uni_modules/lime-circle/components/l-circle/props.ts b/uni_modules/lime-circle/components/l-circle/props.ts
new file mode 100644
index 0000000..d6c36b7
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/props.ts
@@ -0,0 +1,56 @@
+// @ts-nocheck
+// import { CircleProps} from './type';
+// import { PropType } from 'vue';
+
+export default {
+ percent: {
+ type: Number,
+ default: 0
+ },
+ size: {
+ type: String,
+ default: '120px'
+ },
+ lineCap: {
+ type: String,
+ default: 'round'
+ },
+ strokeWidth: {
+ type: [String, Number],
+ default: 6
+ },
+ strokeColor: {
+ type: [String , Array],
+ default: '#2db7f5'
+ },
+ trailWidth: {
+ type: [String, Number],
+ default: 6
+ },
+ trailColor: {
+ type: String,
+ default: '#ddd'
+ },
+ dashboard: Boolean,
+ clockwise: {
+ type: Boolean,
+ default: true
+ },
+ duration: {
+ type: Number,
+ default: 300
+ },
+ max: {
+ type: Number,
+ default: 100
+ },
+ /**缺口角度 暂未实现*/
+ // gapDegree: {
+ // type: Number,
+ // },
+ /**成功配置 暂未实现*/
+ // success: {
+ // type: Object
+ // },
+ canvas: Boolean
+}
\ No newline at end of file
diff --git a/uni_modules/lime-circle/components/l-circle/type.ts b/uni_modules/lime-circle/components/l-circle/type.ts
new file mode 100644
index 0000000..cf979f5
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/type.ts
@@ -0,0 +1,59 @@
+// @ts-nocheck
+
+export interface CircleProps {
+ /**
+ * 进度环尺寸
+ * @default 120pxs
+ */
+ size: string
+ /**
+ * 百分比
+ * @default 0
+ */
+ percent: number
+ /**
+ * 顶端形态
+ * @default 'round'
+ */
+ lineCap: string
+ /**
+ * 进度环线宽
+ * @default 6
+ */
+ strokeWidth: number | string
+ /**
+ * 进度环颜色
+ * @default #2db7f5
+ */
+ strokeColor: string | string[]
+ /**
+ * 轨道环线宽
+ * @default 6
+ */
+ trailWidth: number | string
+ /**
+ * 轨道环颜色
+ * @default #eaeef2
+ */
+ trailColor: string
+ /**
+ * 是否显示为仪表盘
+ * @default false
+ */
+ dashboard: boolean
+ /**
+ * 是否为顺时针
+ * @default true
+ */
+ clockwise: boolean
+ /**
+ * 持续时间
+ * @default 300
+ */
+ duration: number
+ /**
+ * 总长度
+ * @default 100
+ */
+ max: number
+}
\ No newline at end of file
diff --git a/uni_modules/lime-circle/components/l-circle/useTransition.ts b/uni_modules/lime-circle/components/l-circle/useTransition.ts
new file mode 100644
index 0000000..ab9038c
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/useTransition.ts
@@ -0,0 +1,28 @@
+// @ts-nocheck
+import {ease} from './animation/ease';
+import {Timeline, Animation} from './animation/';
+import {ref, watch, Ref} from './vue'
+
+export function useTransition(percent: Ref, options: {duration: number}) {
+ const current = ref(0)
+ const {immediate, duration} = options
+ let tl = new Timeline();
+
+ const stop = watch(() => percent.value, (v) => {
+ tl.start();
+ tl.add(
+ new Animation(
+ current.value,
+ v,
+ duration,
+ 0,
+ ease,
+ v => {
+ current.value = v < 0.0001 ? 0: v
+ }
+ )
+ );
+ }, {immediate})
+
+ return [current, stop]
+}
\ No newline at end of file
diff --git a/uni_modules/lime-circle/components/l-circle/utils.ts b/uni_modules/lime-circle/components/l-circle/utils.ts
new file mode 100644
index 0000000..979f271
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/utils.ts
@@ -0,0 +1,50 @@
+// @ts-nocheck
+export function isDef(value: unknown): boolean {
+ return value !== undefined && value !== null;
+}
+
+export function isNumber(value: string) {
+ return /^\d+(\.\d+)?$/.test(value);
+}
+
+/**
+ * 换成 px number
+ */
+
+export function toPx(value: string | number) {
+ // 如果是数字
+ if (typeof value === 'number') {
+ return value
+ }
+ // 如果是字符串数字
+ if (isNumber(value)) {
+ return Number(value)
+ }
+ // 如果有单位
+ if (typeof value === 'string') {
+ const reg = /^-?([0-9]+)?([.]{1}[0-9]+){0,1}(em|rpx|px|%)$/g
+ const results = reg.exec(value);
+ if (!value || !results) {
+ return 0;
+ }
+ const unit = results[3];
+ value = parseFloat(value);
+ if (unit === 'rpx') {
+ return uni.upx2px(value);
+ }
+ if (unit === 'px') {
+ return value * 1;
+ }
+ }
+ return 0
+}
+
+
+export function addUnit(value?: string | number): string | undefined {
+ if (!isDef(value)) {
+ return undefined;
+ }
+
+ value = String(value);
+ return isNumber(value) ? `${value}px` : value;
+}
\ No newline at end of file
diff --git a/uni_modules/lime-circle/components/l-circle/vue.ts b/uni_modules/lime-circle/components/l-circle/vue.ts
new file mode 100644
index 0000000..d5df33c
--- /dev/null
+++ b/uni_modules/lime-circle/components/l-circle/vue.ts
@@ -0,0 +1,14 @@
+// @ts-nocheck
+// export * from '@/uni_modules/lime-vue'
+
+// #ifdef VUE3
+export * from 'vue';
+// #endif
+// #ifndef VUE3
+export * from '@vue/composition-api';
+// #endif
+// #ifdef APP-NVUE
+import Vue from 'vue'
+import VueCompositionAPI from '@vue/composition-api'
+Vue.use(VueCompositionAPI)
+// #endif
\ No newline at end of file
diff --git a/uni_modules/lime-circle/components/lime-circle/lime-circle.vue b/uni_modules/lime-circle/components/lime-circle/lime-circle.vue
new file mode 100644
index 0000000..b066b81
--- /dev/null
+++ b/uni_modules/lime-circle/components/lime-circle/lime-circle.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+ {{modelValue1}}%
+
+
+
+ {{modelValue1}}%
+
+
+ {{modelValue1}}%
+
+
+
+
+
+ {{modelValue1}}%
+
+
+
+ {{modelValue1}}%
+
+
+ {{modelValue1}}%
+
+
+
+
+
+
+
+
+
+ {{modelValue2}}
+
+
+
+
+
+ {{modelValue2}}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/lime-circle/hybrid/html/circle.min.js b/uni_modules/lime-circle/hybrid/html/circle.min.js
new file mode 100644
index 0000000..dd28594
--- /dev/null
+++ b/uni_modules/lime-circle/hybrid/html/circle.min.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).lime={})}(this,(function(t){"use strict";function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){for(var i=0;e.length>i;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function n(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),Object.defineProperty(t,"prototype",{writable:!1}),t}function r(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=Array(e);e>i;i++)n[i]=t[i];return n}function a(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=function(t,e){if(t){if("string"==typeof t)return r(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?r(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){i&&(t=i);var n=0,a=function(){};return{s:a,n:function(){return t.length>n?{done:!1,value:t[n++]}:{done:!0}},e:function(t){throw t},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,h=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return s=t.done,t},e:function(t){h=!0,o=t},f:function(){try{s||null==i.return||i.return()}finally{if(h)throw o}}}}var o=function(t){return/^#.{3,6}$/.test(t)?4===t.length?t.substring(1).split("").map((function(t){return 17*parseInt(t,16)})):[t.substring(1,3),t.substring(3,5),t.substring(5,7)].map((function(t){return parseInt(t,16)})):(console.error("lime-circle: 渐变仅支持hex值"),[0,0,0])},s=function(t){return 1===t.length?"0"+t:t},h=function(t,e,i){var n,r,a,h,u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,c=[],l=[],d=function(t){return Math.pow(t/255,u)};for(t=o(t).map(d),e=o(e).map(d),n=0;i>n;n++){for(h=1-(a=n/(i-1)),r=0;3>r;r++)l[r]=s(Math.round(255*Math.pow(t[r]*h+e[r]*a,1/u)).toString(16));c.push("#"+l.join(""))}return c};var u=function(t,e,i,n){var r=1e-6,a=3*t-3*i+1,o=3*i-6*t,s=3*t,h=3*e-3*n+1,u=3*n-6*e,c=3*e;function l(t){return((a*t+o)*t+s)*t}return function(t){return e=function(t){for(var e,i,n,h=t,u=0;8>u;u++){if(i=l(h)-t,r>Math.abs(i))return h;if(r>Math.abs(e=(3*a*(n=h)+2*o)*n+s))break;h-=i/e}var c=1,d=0;for(h=t;c>d;){if(i=l(h)-t,r>Math.abs(i))return h;i>0?c=h:d=h,h=(c+d)/2}return h}(t),((h*e+u)*e+c)*e;var e}}(.25,.1,.25,1),c=Symbol("tick"),l=Symbol("tick-handler"),d=Symbol("animations"),f=Symbol("start-times"),v=Symbol("pause-start"),m=Symbol("pause-time"),g="undefined"!=typeof requestAnimationFrame?requestAnimationFrame:function(t){return setTimeout(t,1e3/60)},y="undefined"!=typeof cancelAnimationFrame?cancelAnimationFrame:function(t){clearTimeout(t)},p=function(){function t(){e(this,t),this.state=void 0,this.state="Initiated",this[d]=new Set,this[f]=new Map}return n(t,[{key:"start",value:function(){var t=this;if("Initiated"===this.state){this.state="Started";var e=Date.now();this[m]=0,this[c]=function(){var i,n=Date.now(),r=a(t[d]);try{for(r.s();!(i=r.n()).done;){var o=i.value,s=void 0;(s=t[f].get(o)o.duration&&(t[d].delete(o),s=o.duration),s>0&&o.run(s)}}catch(t){r.e(t)}finally{r.f()}t[l]=g(t[c])},this[c]()}}},{key:"pause",value:function(){"Started"===this.state&&(this.state="Paused",this[v]=Date.now(),y(this[l]))}},{key:"resume",value:function(){"Paused"===this.state&&(this.state="Started",this[m]+=Date.now()-this[v],this[c]())}},{key:"reset",value:function(){this.pause(),this.state="Initiated",this[m]=0,this[v]=0,this[d]=new Set,this[f]=new Map,this[l]=null}},{key:"add",value:function(t,e){2>arguments.length&&(e=Date.now()),this[d].add(t),this[f].set(t,e)}}]),t}(),w=function(){function t(i,n,r,a,o,s){e(this,t),this.startValue=void 0,this.endValue=void 0,this.duration=void 0,this.timingFunction=void 0,this.delay=void 0,this.template=void 0,o=o||function(t){return t},s=s||function(t){return t},this.startValue=i,this.endValue=n,this.duration=r,this.timingFunction=o,this.delay=a,this.template=s}return n(t,[{key:"run",value:function(t){var e=this.endValue-this.startValue,i=this.timingFunction(t/this.duration);this.template(this.startValue+e*i)}}]),t}(),b=Math.PI/180,k=function(){function t(i,n){e(this,t),this.canvas=void 0,this.context=void 0,this.current=0,this.size=0,this.pixelRatio=1,this._isConicGradient=!1,this._attrs={percent:0,size:"120px",lineCap:"round",strokeWidth:6,strokeColor:"#2db7f5",trailWidth:6,trailColor:"#ddd",dashboard:!1,clockwise:!0,duration:300,max:100,beforeAnimate:!0,animate:!0,formatter:"{d}{d}.{d}{d}%",fontSize:"16px",showText:!1},this._timer=void 0,this.startTime=0,this.target=0,this._colors=[],this._gradientColors=[],this._rAF=function(t){},this._cAf=function(t){},this.timeline=void 0,this.run=void 0,this.canvas=i,this.run=n.run,this.size=n.size||120,this.pixelRatio=n.pixelRatio||1,this.init(),this.initRaf(),this.timeline=new p(this._rAF,this._cAf)}return n(t,[{key:"init",value:function(){var t=this.size,e=this.pixelRatio;if(this.canvas){this.canvas.width=t*e,this.canvas.height=t*e;var i=this.canvas.getContext("2d");this._isConicGradient=!!i.createConicGradient,this.context=i}}},{key:"initRaf",value:function(){var t=this.canvas;"undefined"!=typeof window?(this._rAF=window.requestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},this._cAf=window.cancelAnimationFrame||function(t){window.clearTimeout(t)}):t&&t.requestAnimationFrame?(this._rAF=t.requestAnimationFrame,this._cAf=t.cancelAnimationFrame):(this._rAF=function(t){return setTimeout(t,16.7)},this._cAf=function(t){clearTimeout(t)})}},{key:"setOption",value:function(t){Object.assign(this._attrs,t)}},{key:"set",value:function(t,e){this._attrs[t]=e}},{key:"get",value:function(t){return this._attrs[t]||this.canvas[t]}},{key:"play",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.get("percent");this.target=Math.max(Math.min(e,this.get("max")||100),0),this.createConicGradient(),this.timeline.start(),this.timeline.add(new w(this.current,e,this.get("duration"),0,u,(function(e){t.current=1e-4>e?0:e,t.render(t.current),t.run(t.current)})))}},{key:"createConicGradient",value:function(){if(!this._isConicGradient){var t=this.get("strokeColor");if("string"!=typeof t&&this._colors!==t){this._colors=t,this._gradientColors=[];for(var e=this.getArc(),i=t.length-1,n=Math.floor(e/i),r=0;i>r;r++){e-=n,this._gradientColors=this._gradientColors.concat(h(t[r],t[r+1],r+1===i?n+e:n))}}}}},{key:"render",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=this.context,i=this.size,n=this.pixelRatio,r=this.getSalce(),a=this.getRotate(),o=i/2;e.setTransform(1,0,0,1,0,0),e.clearRect(-o,-o,i,i),e.setTransform(r*n,0,0,n,o*n,o*n),e.rotate(a*b),this.drawTrail(o),this.drawStroke(o,t),e.draw&&e.draw()}},{key:"drawArc",value:function(t,e,i,n,r){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:this.get("lineCap"),o=this.context;o.beginPath(),o.lineCap=a,o.strokeStyle=e,o.lineWidth=i,o.arc(0,0,t,n,r),o.stroke()}},{key:"getArc",value:function(){var t=this.get("arc");return t||(this.get("dashboard")?270:360)}},{key:"getSalce",value:function(){return this.get("clockwise")?1:-1}},{key:"getRotate",value:function(){return this.get("arc")?180:this.get("dashboard")?135:-90}},{key:"drawTrail",value:function(t){var e=t-this.get("trailWidth")/2;this.drawArc(e,this.get("trailColor"),this.get("trailWidth"),0,this.getArc()*b)}},{key:"drawStroke",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(e){var i=t-this.get("strokeWidth")/2,n=this.get("strokeColor"),r=this.getArc(),a=Math.round(r/this.get("max")*e);if("string"==typeof n||this._isConicGradient)if("string"!=typeof n&&this._isConicGradient){var o=this.context,s=o.createConicGradient(this.get("dashboard")?45:90,0,0);n.forEach((function(t,e){s.addColorStop(e/(n.length-1),t)})),this.drawArc(i,s,this.get("strokeWidth"),0,a*b)}else this.drawArc(i,n,this.get("strokeWidth"),0,a*b);else for(var h=0;a>h;h++)this.drawArc(i,this._gradientColors[h],this.get("strokeWidth"),h*b,(h+1)*b,this.get("dashboard")||r!=a?this.get("lineCap"):"butt")}}}]),t}();t.Circle=k,Object.defineProperty(t,"__esModule",{value:!0})}));
diff --git a/uni_modules/lime-circle/hybrid/html/index.html b/uni_modules/lime-circle/hybrid/html/index.html
new file mode 100644
index 0000000..0dcf706
--- /dev/null
+++ b/uni_modules/lime-circle/hybrid/html/index.html
@@ -0,0 +1,237 @@
+
+
+
+
+
+
+ lime-circle
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uni_modules/lime-circle/hybrid/html/uni.webview.1.5.3.js b/uni_modules/lime-circle/hybrid/html/uni.webview.1.5.3.js
new file mode 100644
index 0000000..d6524fa
--- /dev/null
+++ b/uni_modules/lime-circle/hybrid/html/uni.webview.1.5.3.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e=e||self).uni=n()}(this,(function(){"use strict";try{var e={};Object.defineProperty(e,"passive",{get:function(){!0}}),window.addEventListener("test-passive",null,e)}catch(e){}var n=Object.prototype.hasOwnProperty;function i(e,i){return n.call(e,i)}var t=[];function o(){return window.__dcloud_weex_postMessage||window.__dcloud_weex_}var r=function(e,n){var i={options:{timestamp:+new Date},name:e,arg:n};if(o()){if("postMessage"===e){var r={data:[n]};return window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(r):window.__dcloud_weex_.postMessage(JSON.stringify(r))}var a={type:"WEB_INVOKE_APPSERVICE",args:{data:i,webviewIds:t}};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessageToService(a):window.__dcloud_weex_.postMessageToService(JSON.stringify(a))}if(!window.plus)return window.parent.postMessage({type:"WEB_INVOKE_APPSERVICE",data:i,pageId:""},"*");if(0===t.length){var d=plus.webview.currentWebview();if(!d)throw new Error("plus.webview.currentWebview() is undefined");var s=d.parent(),w="";w=s?s.id:d.id,t.push(w)}if(plus.webview.getWebviewById("__uniapp__service"))plus.webview.postMessageToUniNView({type:"WEB_INVOKE_APPSERVICE",args:{data:i,webviewIds:t}},"__uniapp__service");else{var u=JSON.stringify(i);plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat("WEB_INVOKE_APPSERVICE",'",').concat(u,",").concat(JSON.stringify(t),");"))}},a={navigateTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("navigateTo",{url:encodeURI(n)})},navigateBack:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.delta;r("navigateBack",{delta:parseInt(n)||1})},switchTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("switchTab",{url:encodeURI(n)})},reLaunch:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("reLaunch",{url:encodeURI(n)})},redirectTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("redirectTo",{url:encodeURI(n)})},getEnv:function(e){o()?e({nvue:!0}):window.plus?e({plus:!0}):e({h5:!0})},postMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};r("postMessage",e.data||{})}},d=/uni-app/i.test(navigator.userAgent),s=/Html5Plus/i.test(navigator.userAgent),w=/complete|loaded|interactive/;var u=window.my&&navigator.userAgent.indexOf("AlipayClient")>-1;var g=window.swan&&window.swan.webView&&/swan/i.test(navigator.userAgent);var c=window.qq&&window.qq.miniProgram&&/QQ/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var v=window.tt&&window.tt.miniProgram&&/toutiaomicroapp/i.test(navigator.userAgent);var m=window.wx&&window.wx.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var p=window.qa&&/quickapp/i.test(navigator.userAgent);var f=window.ks&&window.ks.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var l=window.tt&&window.tt.miniProgram&&/Lark|Feishu/i.test(navigator.userAgent);var _=window.jd&&window.jd.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);for(var E,b=function(){window.UniAppJSBridge=!0,document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady",{bubbles:!0,cancelable:!0}))},h=[function(e){if(d||s)return window.__dcloud_weex_postMessage||window.__dcloud_weex_?document.addEventListener("DOMContentLoaded",e):window.plus&&w.test(document.readyState)?setTimeout(e,0):document.addEventListener("plusready",e),a},function(e){if(m)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.wx.miniProgram},function(e){if(c)return window.QQJSBridge&&window.QQJSBridge.invoke?setTimeout(e,0):document.addEventListener("QQJSBridgeReady",e),window.qq.miniProgram},function(e){if(u){document.addEventListener("DOMContentLoaded",e);var n=window.my;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(g)return document.addEventListener("DOMContentLoaded",e),window.swan.webView},function(e){if(v)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(p){window.QaJSBridge&&window.QaJSBridge.invoke?setTimeout(e,0):document.addEventListener("QaJSBridgeReady",e);var n=window.qa;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(f)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.ks.miniProgram},function(e){if(l)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(_)return window.JDJSBridgeReady&&window.JDJSBridgeReady.invoke?setTimeout(e,0):document.addEventListener("JDJSBridgeReady",e),window.jd.miniProgram},function(e){return document.addEventListener("DOMContentLoaded",e),a}],y=0;y
+ {{modelVale}}%
+
+```
+```js
+const target = ref(50)
+const modelVale = ref(0)
+```
+
+### canvas渲染
+- 也可以主动设置 `canvas` 使用canvas方式渲染
+
+```html
+
+ {{modelVale}}%
+
+```
+```js
+const target = ref(50)
+const modelVale = ref(0)
+```
+
+### 查看示例
+导入后直接使用这个标签查看演示效果
+
+```html
+// 代码位于 uni_modules/lime-circle/compoents/lime-circle
+
+```
+
+
+### 插件标签
+- 默认 l-circle 为 component
+- 默认 lime-circle 为 demo
+
+### 关于vue2的使用方式
+- 插件使用了`composition-api`, 如果你希望在vue2中使用请按官方的教程[vue-composition-api](https://uniapp.dcloud.net.cn/tutorial/vue-composition-api.html)配置
+- 关键代码是: 在main.js中 在vue2部分加上这一段即可,官方是把它单独成了一个文件.
+
+```js
+// main.js vue2
+import Vue from 'vue'
+import VueCompositionAPI from '@vue/composition-api'
+Vue.use(VueCompositionAPI)
+```
+另外插件也用到了TS,vue2可能会遇过官方的TS版本过低的问题,找到HX目录下的`compile-typescript`目录
+```cmd
+// \HBuilderX\plugins\compile-typescript
+yarn add typescript -D
+- or -
+npm install typescript -D
+```
+
+#### 使用
+
+```html
+
+ {{modelVale}}%
+
+
+
+```
+```js
+export default {
+ data() {
+ return {
+ modelVale: 0,
+ target: 50
+ }
+ },
+ methods: {
+ onClick(number) {
+ this.target = Math.max(Math.min(100, this.target + number), 0)
+ }
+ }
+}
+```
+
+
+## API
+
+### Props
+
+| 参数 | 说明 | 类型 | 默认值 |
+| --------------------------| ------------------------------------------------------------ | ---------------- | ------------ |
+| percent | 进度环目标值 | number | `0` |
+| v-model:current | 进度环当前值(从上一个percent到当前percent的过渡值) | number | `-` |
+| size | 进度环尺寸 | string | `120px` |
+| lineCap | 进度条顶端形态 , 可选值 `butt` `round` | string | `round` |
+| strokeWidth | 进度条宽度 | number,string | `6` |
+| strokeColor | 进度条颜色, 若为数组即为渐变色(渐变色值仅支持hex) | string、string[] | `#2db7f5` |
+| trailWidth | 轨道环线宽度 | number,string | `6` |
+| trailColor | 轨道环线颜色 | string | `#eaeef2` |
+| dashboard | 是否为仪表盘样式 | boolean | `false` |
+| clockwise | 是否为顺时针 | boolean | `true` |
+| duration | 变化过渡时间, ms | number | `300` |
+| max | 总长度(例如:max 100,percent 50 时,进度为50%) | number | `100` |
+| canvas | 是否使用canvas渲染 | boolean | `false` |
+
+
+## 打赏
+
+如果你觉得本插件,解决了你的问题,赠人玫瑰,手留余香。
+
+
\ No newline at end of file
diff --git a/uni_modules/lime-shared/addUnit/index.ts b/uni_modules/lime-shared/addUnit/index.ts
new file mode 100644
index 0000000..2468a3a
--- /dev/null
+++ b/uni_modules/lime-shared/addUnit/index.ts
@@ -0,0 +1,25 @@
+// @ts-nocheck
+import {isNumeric} from '../isNumeric'
+import {isDef} from '../isDef'
+/**
+ * 给一个值添加单位(像素 px)
+ * @param value 要添加单位的值,可以是字符串或数字
+ * @returns 添加了单位的值,如果值为 undefined 则返回 undefined
+ */
+export function addUnit(value?: string | number): string | undefined {
+ if (!isDef(value)) {
+ return undefined;
+ }
+
+ value = String(value); // 将值转换为字符串
+
+ // 如果值是数字,则在后面添加单位 "px",否则保持原始值
+ return isNumeric(value) ? `${value}px` : value;
+}
+
+
+// console.log(addUnit(100)); // 输出: "100px"
+// console.log(addUnit("200")); // 输出: "200px"
+// console.log(addUnit("300px")); // 输出: "300px"(已经包含单位)
+// console.log(addUnit()); // 输出: undefined(值为 undefined)
+// console.log(addUnit(null)); // 输出: undefined(值为 null)
\ No newline at end of file
diff --git a/uni_modules/lime-shared/arrayBufferToFile/index.ts b/uni_modules/lime-shared/arrayBufferToFile/index.ts
new file mode 100644
index 0000000..9760b20
--- /dev/null
+++ b/uni_modules/lime-shared/arrayBufferToFile/index.ts
@@ -0,0 +1,63 @@
+// @ts-nocheck
+import {platform} from '../platform'
+/**
+ * buffer转路径
+ * @param {Object} buffer
+ */
+// @ts-nocheck
+export function arrayBufferToFile(buffer: ArrayBuffer | Blob, name?: string, format?:string):Promise<(File|string)> {
+ return new Promise((resolve, reject) => {
+ // #ifdef MP
+ const fs = uni.getFileSystemManager()
+ //自定义文件名
+ if (!name && !format) {
+ reject(new Error('ERROR_NAME_PARSE'))
+ }
+ const fileName = `${name || new Date().getTime()}.${format.replace(/(.+)?\//,'')}`;
+ let pre = platform()
+ const filePath = `${pre.env.USER_DATA_PATH}/${fileName}`
+ fs.writeFile({
+ filePath,
+ data: buffer,
+ success() {
+ resolve(filePath)
+ },
+ fail(err) {
+ console.error(err)
+ reject(err)
+ }
+ })
+ // #endif
+
+ // #ifdef H5
+ const file = new File([buffer], name, {
+ type: format,
+ });
+ resolve(file)
+ // #endif
+
+ // #ifdef APP-PLUS
+ const bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now())
+ const base64 = uni.arrayBufferToBase64(buffer)
+ bitmap.loadBase64Data(base64, () => {
+ if (!name && !format) {
+ reject(new Error('ERROR_NAME_PARSE'))
+ }
+ const fileNmae = `${name || new Date().getTime()}.${format.replace(/(.+)?\//,'')}`;
+ const filePath = `_doc/uniapp_temp/${fileNmae}`
+ bitmap.save(filePath, {},
+ () => {
+ bitmap.clear()
+ resolve(filePath)
+ },
+ (error) => {
+ bitmap.clear()
+ reject(error)
+ })
+ }, (error) => {
+ bitmap.clear()
+ reject(error)
+ })
+ // #endif
+ })
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/base64ToArrayBuffer/index.ts b/uni_modules/lime-shared/base64ToArrayBuffer/index.ts
new file mode 100644
index 0000000..f83b640
--- /dev/null
+++ b/uni_modules/lime-shared/base64ToArrayBuffer/index.ts
@@ -0,0 +1,13 @@
+// @ts-nocheck
+// 未完成
+export function base64ToArrayBuffer(base64 : string) {
+ const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64) || [];
+ if (!format) {
+ new Error('ERROR_BASE64SRC_PARSE')
+ }
+ if(uni.base64ToArrayBuffer) {
+ return uni.base64ToArrayBuffer(bodyData)
+ } else {
+
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/base64ToPath/index.ts b/uni_modules/lime-shared/base64ToPath/index.ts
new file mode 100644
index 0000000..1f14d0a
--- /dev/null
+++ b/uni_modules/lime-shared/base64ToPath/index.ts
@@ -0,0 +1,76 @@
+// @ts-nocheck
+import {platform} from '../platform'
+/**
+ * base64转路径
+ * @param {Object} base64
+ */
+export function base64ToPath(base64: string, filename?: string):Promise {
+ const [, format] = /^data:image\/(\w+);base64,/.exec(base64) || [];
+ console.log('format', format)
+ return new Promise((resolve, reject) => {
+ // #ifdef MP
+ const fs = uni.getFileSystemManager()
+ //自定义文件名
+ if (!filename && !format) {
+ reject(new Error('ERROR_BASE64SRC_PARSE'))
+ }
+ // const time = new Date().getTime();
+ const name = filename || `${new Date().getTime()}.${format}`;
+ let pre = platform()
+ const filePath = `${pre.env.USER_DATA_PATH}/${name}`
+ fs.writeFile({
+ filePath,
+ data: base64.split(',')[1],
+ encoding: 'base64',
+ success() {
+ resolve(filePath)
+ },
+ fail(err) {
+ console.error(err)
+ reject(err)
+ }
+ })
+ // #endif
+
+ // #ifdef H5
+ // mime类型
+ let mimeString = base64.split(',')[0].split(':')[1].split(';')[0];
+ //base64 解码
+ let byteString = atob(base64.split(',')[1]);
+ //创建缓冲数组
+ let arrayBuffer = new ArrayBuffer(byteString.length);
+ //创建视图
+ let intArray = new Uint8Array(arrayBuffer);
+ for (let i = 0; i < byteString.length; i++) {
+ intArray[i] = byteString.charCodeAt(i);
+ }
+ resolve(URL.createObjectURL(new Blob([intArray], {
+ type: mimeString
+ })))
+ // #endif
+
+ // #ifdef APP-PLUS
+ const bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now())
+ bitmap.loadBase64Data(base64, () => {
+ if (!filename && !format) {
+ reject(new Error('ERROR_BASE64SRC_PARSE'))
+ }
+ // const time = new Date().getTime();
+ const name = filename || `${new Date().getTime()}.${format}`;
+ const filePath = `_doc/uniapp_temp/${name}`
+ bitmap.save(filePath, {},
+ () => {
+ bitmap.clear()
+ resolve(filePath)
+ },
+ (error) => {
+ bitmap.clear()
+ reject(error)
+ })
+ }, (error) => {
+ bitmap.clear()
+ reject(error)
+ })
+ // #endif
+ })
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/camelCase/index.ts b/uni_modules/lime-shared/camelCase/index.ts
new file mode 100644
index 0000000..78a81c8
--- /dev/null
+++ b/uni_modules/lime-shared/camelCase/index.ts
@@ -0,0 +1,21 @@
+/**
+ * 将字符串转换为 camelCase 或 PascalCase 风格的命名约定
+ * @param str 要转换的字符串
+ * @param isPascalCase 指示是否转换为 PascalCase 的布尔值,默认为 false
+ * @returns 转换后的字符串
+ */
+export function camelCase(str: string, isPascalCase: boolean = false): string {
+ // 将字符串分割成单词数组
+ let words: string[] = str.split(/[\s_-]+/);
+
+ // 将数组中的每个单词首字母大写(除了第一个单词)
+ let camelCased: string[] = words.map((word, index) => {
+ if (index === 0 && !isPascalCase) {
+ return word.toLowerCase(); // 第一个单词全小写
+ }
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
+ });
+
+ // 将数组中的单词拼接成一个字符串
+ return camelCased.join('');
+};
\ No newline at end of file
diff --git a/uni_modules/lime-shared/canIUseCanvas2d/index.ts b/uni_modules/lime-shared/canIUseCanvas2d/index.ts
new file mode 100644
index 0000000..22e4416
--- /dev/null
+++ b/uni_modules/lime-shared/canIUseCanvas2d/index.ts
@@ -0,0 +1,58 @@
+// @ts-nocheck
+// #ifdef MP-ALIPAY
+interface My {
+ SDKVersion: string
+}
+declare var my: My
+// #endif
+
+function compareVersion(v1:string, v2:string) {
+ let a1 = v1.split('.');
+ let a2 = v2.split('.');
+ const len = Math.max(a1.length, a2.length);
+
+ while (a1.length < len) {
+ a1.push('0');
+ }
+ while (a2.length < len) {
+ a2.push('0');
+ }
+
+ for (let i = 0; i < len; i++) {
+ const num1 = parseInt(a1[i], 10);
+ const num2 = parseInt(a2[i], 10);
+
+ if (num1 > num2) {
+ return 1;
+ }
+ if (num1 < num2) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+function gte(version: string) {
+ let {SDKVersion} = uni.getSystemInfoSync();
+ // #ifdef MP-ALIPAY
+ SDKVersion = my.SDKVersion
+ // #endif
+ return compareVersion(SDKVersion, version) >= 0;
+}
+
+/** 环境是否支持canvas 2d */
+export function canIUseCanvas2d() {
+ // #ifdef MP-WEIXIN
+ return gte('2.9.0');
+ // #endif
+ // #ifdef MP-ALIPAY
+ return gte('2.7.0');
+ // #endif
+ // #ifdef MP-TOUTIAO
+ return gte('1.78.0');
+ // #endif
+ // #ifndef MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO
+ return false
+ // #endif
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/changelog.md b/uni_modules/lime-shared/changelog.md
new file mode 100644
index 0000000..62c3f5b
--- /dev/null
+++ b/uni_modules/lime-shared/changelog.md
@@ -0,0 +1,30 @@
+## 0.1.4(2023-09-05)
+- feat: 增加 Hooks `useIntersectionObserver`
+- feat: 增加 `floatAdd`
+- feat: 因为本人插件兼容 vue2 需要使用 `composition-api`,故增加vue文件代码插件的条件编译
+## 0.1.3(2023-08-13)
+- feat: 增加 `camelCase`
+## 0.1.2(2023-07-17)
+- feat: 增加 `getClassStr`
+## 0.1.1(2023-07-06)
+- feat: 增加 `isNumeric`, 区别于 `isNumber`
+## 0.1.0(2023-06-30)
+- fix: `clamp`忘记导出了
+## 0.0.9(2023-06-27)
+- feat: 增加`arrayBufferToFile`
+## 0.0.8(2023-06-19)
+- feat: 增加`createAnimation`、`clamp`
+## 0.0.7(2023-06-08)
+- chore: 更新注释
+## 0.0.6(2023-06-08)
+- chore: 增加`createImage`为`lime-watermark`和`lime-qrcode`提供依赖
+## 0.0.5(2023-06-03)
+- chore: 更新注释
+## 0.0.4(2023-05-22)
+- feat: 增加`range`,`exif`,`selectComponent`
+## 0.0.3(2023-05-08)
+- feat: 增加`fillZero`,`debounce`,`throttle`,`random`
+## 0.0.2(2023-05-05)
+- chore: 更新文档
+## 0.0.1(2023-05-05)
+- 无
diff --git a/uni_modules/lime-shared/clamp/index.ts b/uni_modules/lime-shared/clamp/index.ts
new file mode 100644
index 0000000..b62565c
--- /dev/null
+++ b/uni_modules/lime-shared/clamp/index.ts
@@ -0,0 +1,16 @@
+// @ts-nocheck
+/**
+ * 将一个值限制在指定的范围内
+ * @param min 最小值
+ * @param max 最大值
+ * @param val 要限制的值
+ * @returns 限制后的值
+ */
+export function clamp(min: number, max: number, val: number): number {
+ return Math.max(min, Math.min(max, val));
+}
+
+
+// console.log(clamp(0, 10, 5)); // 输出: 5(在范围内,不做更改)
+// console.log(clamp(0, 10, -5)); // 输出: 0(小于最小值,被限制为最小值)
+// console.log(clamp(0, 10, 15)); // 输出: 10(大于最大值,被限制为最大值)
\ No newline at end of file
diff --git a/uni_modules/lime-shared/cloneDeep/index.ts b/uni_modules/lime-shared/cloneDeep/index.ts
new file mode 100644
index 0000000..ded334d
--- /dev/null
+++ b/uni_modules/lime-shared/cloneDeep/index.ts
@@ -0,0 +1,103 @@
+// @ts-nocheck
+/**
+ * 深度克隆一个对象或数组
+ * @param obj 要克隆的对象或数组
+ * @returns 克隆后的对象或数组
+ */
+export function cloneDeep(obj: any): T {
+ // 如果传入的对象为空,返回空
+ if (obj === null) {
+ return null as unknown as T;
+ }
+
+ // 如果传入的对象是 Set 类型,则将其转换为数组,并通过新的 Set 构造函数创建一个新的 Set 对象
+ if (obj instanceof Set) {
+ return new Set([...obj]) as unknown as T;
+ }
+
+ // 如果传入的对象是 Map 类型,则将其转换为数组,并通过新的 Map 构造函数创建一个新的 Map 对象
+ if (obj instanceof Map) {
+ return new Map([...obj]) as unknown as T;
+ }
+
+ // 如果传入的对象是 WeakMap 类型,则直接用传入的 WeakMap 对象进行赋值
+ if (obj instanceof WeakMap) {
+ let weakMap = new WeakMap();
+ weakMap = obj;
+ return weakMap as unknown as T;
+ }
+
+ // 如果传入的对象是 WeakSet 类型,则直接用传入的 WeakSet 对象进行赋值
+ if (obj instanceof WeakSet) {
+ let weakSet = new WeakSet();
+ weakSet = obj;
+ return weakSet as unknown as T;
+ }
+
+ // 如果传入的对象是 RegExp 类型,则通过新的 RegExp 构造函数创建一个新的 RegExp 对象
+ if (obj instanceof RegExp) {
+ return new RegExp(obj) as unknown as T;
+ }
+
+ // 如果传入的对象是 undefined 类型,则返回 undefined
+ if (typeof obj === 'undefined') {
+ return undefined as unknown as T;
+ }
+
+ // 如果传入的对象是数组,则递归调用 cloneDeep 函数对数组中的每个元素进行克隆
+ if (Array.isArray(obj)) {
+ return obj.map(cloneDeep) as unknown as T;
+ }
+
+ // 如果传入的对象是 Date 类型,则通过新的 Date 构造函数创建一个新的 Date 对象
+ if (obj instanceof Date) {
+ return new Date(obj.getTime()) as unknown as T;
+ }
+
+ // 如果传入的对象是普通对象,则使用递归调用 cloneDeep 函数对对象的每个属性进行克隆
+ if (typeof obj === 'object') {
+ const newObj: any = {};
+ for (const [key, value] of Object.entries(obj)) {
+ newObj[key] = cloneDeep(value);
+ }
+ const symbolKeys = Object.getOwnPropertySymbols(obj);
+ for (const key of symbolKeys) {
+ newObj[key] = cloneDeep(obj[key]);
+ }
+ return newObj;
+ }
+
+ // 如果传入的对象是基本数据类型(如字符串、数字等),则直接返回
+ return obj;
+}
+
+// 示例使用
+
+// // 克隆一个对象
+// const obj = { name: 'John', age: 30 };
+// const clonedObj = cloneDeep(obj);
+
+// console.log(clonedObj); // 输出: { name: 'John', age: 30 }
+// console.log(clonedObj === obj); // 输出: false (副本与原对象是独立的)
+
+// // 克隆一个数组
+// const arr = [1, 2, 3];
+// const clonedArr = cloneDeep(arr);
+
+// console.log(clonedArr); // 输出: [1, 2, 3]
+// console.log(clonedArr === arr); // 输出: false (副本与原数组是独立的)
+
+// // 克隆一个包含嵌套对象的对象
+// const person = {
+// name: 'Alice',
+// age: 25,
+// address: {
+// city: 'New York',
+// country: 'USA',
+// },
+// };
+// const clonedPerson = cloneDeep(person);
+
+// console.log(clonedPerson); // 输出: { name: 'Alice', age: 25, address: { city: 'New York', country: 'USA' } }
+// console.log(clonedPerson === person); // 输出: false (副本与原对象是独立的)
+// console.log(clonedPerson.address === person.address); // 输出: false (嵌套对象的副本也是独立的)
\ No newline at end of file
diff --git a/uni_modules/lime-shared/closest/index.ts b/uni_modules/lime-shared/closest/index.ts
new file mode 100644
index 0000000..95804cd
--- /dev/null
+++ b/uni_modules/lime-shared/closest/index.ts
@@ -0,0 +1,22 @@
+// @ts-nocheck
+
+/**
+ * 在给定数组中找到最接近目标数字的元素。
+ * @param arr 要搜索的数字数组。
+ * @param target 目标数字。
+ * @returns 最接近目标数字的数组元素。
+ */
+export function closest(arr: number[], target: number) {
+ return arr.reduce((pre, cur) =>
+ Math.abs(pre - target) < Math.abs(cur - target) ? pre : cur
+ );
+}
+
+// 示例
+// // 定义一个数字数组
+// const numbers = [1, 3, 5, 7, 9];
+
+// // 在数组中找到最接近目标数字 6 的元素
+// const closestNumber = closest(numbers, 6);
+
+// console.log(closestNumber); // 输出结果: 5
\ No newline at end of file
diff --git a/uni_modules/lime-shared/createAnimation/index.ts b/uni_modules/lime-shared/createAnimation/index.ts
new file mode 100644
index 0000000..5b6e2da
--- /dev/null
+++ b/uni_modules/lime-shared/createAnimation/index.ts
@@ -0,0 +1,149 @@
+// @ts-nocheck
+// nvue 需要在节点上设置ref或在export里传入
+// const animation = createAnimation({
+// ref: this.$refs['xxx'],
+// duration: 0,
+// timingFunction: 'linear'
+// })
+// animation.opacity(1).translate(x, y).step({duration})
+// animation.export(ref)
+
+// 抹平nvue 与 uni.createAnimation的使用差距
+// 但是nvue动画太慢~~~无语
+
+
+
+
+// #ifdef APP-NVUE
+const nvueAnimation = uni.requireNativePlugin('animation')
+
+type AnimationTypes = 'matrix' | 'matrix3d' | 'rotate' | 'rotate3d' | 'rotateX' | 'rotateY' | 'rotateZ' | 'scale' | 'scale3d' | 'scaleX' | 'scaleY' | 'scaleZ' | 'skew' | 'skewX' | 'skewY' | 'translate' | 'translate3d' | 'translateX' | 'translateY' | 'translateZ'
+ | 'opacity' | 'backgroundColor' | 'width' | 'height' | 'left' | 'right' | 'top' | 'bottom'
+
+interface Styles {
+ [key : string] : any
+}
+
+interface StepConfig {
+ duration?: number
+ timingFunction?: string
+ delay?: number
+ needLayout?: boolean
+ transformOrigin?: string
+}
+interface StepAnimate {
+ styles?: Styles
+ config?: StepConfig
+}
+interface StepAnimates {
+ [key: number]: StepAnimate
+}
+interface CreateAnimationOptions extends UniApp.CreateAnimationOptions {
+ ref?: string
+}
+
+type Callback = (time: number) => void
+const animateTypes1 : AnimationTypes[] = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d',
+ 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY',
+ 'translateZ'
+]
+const animateTypes2 : AnimationTypes[] = ['opacity', 'backgroundColor']
+const animateTypes3 : AnimationTypes[] = ['width', 'height', 'left', 'right', 'top', 'bottom']
+
+class LimeAnimation {
+ ref : any
+ context : any
+ options : UniApp.CreateAnimationOptions
+ // stack : any[] = []
+ next : number = 0
+ currentStepAnimates : StepAnimates = {}
+ duration : number = 0
+ constructor(options : CreateAnimationOptions) {
+ const {ref} = options
+ this.ref = ref
+ this.options = options
+ }
+ addAnimate(type : AnimationTypes, args: (string | number)[]) {
+ let aniObj = this.currentStepAnimates[this.next]
+ let stepAnimate:StepAnimate = {}
+ if (!aniObj) {
+ stepAnimate = {styles: {}, config: {}}
+ } else {
+ stepAnimate = aniObj
+ }
+
+ if (animateTypes1.includes(type)) {
+ if (!stepAnimate.styles.transform) {
+ stepAnimate.styles.transform = ''
+ }
+ let unit = ''
+ if (type === 'rotate') {
+ unit = 'deg'
+ }
+ stepAnimate.styles.transform += `${type}(${args.map((v: number) => v + unit).join(',')}) `
+ } else {
+ stepAnimate.styles[type] = `${args.join(',')}`
+ }
+ this.currentStepAnimates[this.next] = stepAnimate
+ }
+ animateRun(styles: Styles = {}, config:StepConfig = {}, ref: any) {
+ const el = ref || this.ref
+ if (!el) return
+ return new Promise((resolve) => {
+ const time = +new Date()
+ nvueAnimation.transition(el, {
+ styles,
+ ...config
+ }, () => {
+ resolve(+new Date() - time)
+ })
+ })
+ }
+ nextAnimate(animates: StepAnimates, step: number = 0, ref: any, cb: Callback) {
+ let obj = animates[step]
+ if (obj) {
+ let { styles, config } = obj
+ // this.duration += config.duration
+ this.animateRun(styles, config, ref).then((time: number) => {
+ step += 1
+ this.duration += time
+ this.nextAnimate(animates, step, ref, cb)
+ })
+ } else {
+ this.currentStepAnimates = {}
+ cb && cb(this.duration)
+ }
+ }
+ step(config:StepConfig = {}) {
+ this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config)
+ this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin
+ this.next++
+ return this
+ }
+ export(ref: any, cb?: Callback) {
+ ref = ref || this.ref
+ if(!ref) return
+ this.duration = 0
+ this.next = 0
+ this.nextAnimate(this.currentStepAnimates, 0, ref, cb)
+ return null
+ }
+}
+
+
+animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
+ LimeAnimation.prototype[type] = function(...args: (string | number)[]) {
+ this.addAnimate(type, args)
+ return this
+ }
+})
+// #endif
+export function createAnimation(options : CreateAnimationOptions) {
+ // #ifndef APP-NVUE
+ // 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误
+ return uni.createAnimation({ ...options })
+ // #endif
+ // #ifdef APP-NVUE
+ return new LimeAnimation(options)
+ // #endif
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/createImage/index.ts b/uni_modules/lime-shared/createImage/index.ts
new file mode 100644
index 0000000..674b6f5
--- /dev/null
+++ b/uni_modules/lime-shared/createImage/index.ts
@@ -0,0 +1,61 @@
+// @ts-nocheck
+import {isBrowser} from '../isBrowser'
+class Image {
+ currentSrc: string | null = null
+ naturalHeight: number = 0
+ naturalWidth: number = 0
+ width: number = 0
+ height: number = 0
+ tagName: string = 'IMG'
+ path: string = ''
+ crossOrigin: string = ''
+ referrerPolicy: string = ''
+ onload: () => void = () => {}
+ onerror: () => void = () => {}
+ complete: boolean = false
+ constructor() {}
+ set src(src: string) {
+ console.log('src', src)
+ if(!src) {
+ return this.onerror()
+ }
+ src = src.replace(/^@\//,'/')
+ this.currentSrc = src
+ uni.getImageInfo({
+ src,
+ success: (res) => {
+ const localReg = /^\.|^\/(?=[^\/])/;
+ // #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-TOUTIAO
+ res.path = localReg.test(src) ? `/${res.path}` : res.path;
+ // #endif
+ this.complete = true
+ this.path = res.path
+ this.naturalWidth = this.width = res.width
+ this.naturalHeight = this.height = res.height
+ this.onload()
+ },
+ fail: () => {
+ this.onerror()
+ }
+ })
+ }
+ get src() {
+ return this.currentSrc
+ }
+}
+interface UniImage extends WechatMiniprogram.Image {
+ complete?: boolean
+ naturalHeight?: number
+ naturalWidth?: number
+}
+/** 创建用于 canvas 的 img */
+export function createImage(canvas?: any): HTMLImageElement | UniImage {
+ if(canvas && canvas.createImage) {
+ return (canvas as WechatMiniprogram.Canvas).createImage()
+ } else if(this.tagName == 'canvas' && !('toBlob' in this) || canvas && !('toBlob' in canvas)){
+ return new Image()
+ } else if(isBrowser) {
+ return new window.Image()
+ }
+ return new Image()
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/debounce/index.ts b/uni_modules/lime-shared/debounce/index.ts
new file mode 100644
index 0000000..5875145
--- /dev/null
+++ b/uni_modules/lime-shared/debounce/index.ts
@@ -0,0 +1,38 @@
+// @ts-nocheck
+type Timeout = ReturnType | null;
+/**
+ * 防抖函数,通过延迟一定时间来限制函数的执行频率。
+ * @param fn 要防抖的函数。
+ * @param wait 触发防抖的等待时间,单位为毫秒。
+ * @returns 防抖函数。
+ */
+export function debounce(fn: (...args: any[]) => void, wait = 300) {
+ let timer: Timeout = null; // 用于存储 setTimeout 的标识符的变量
+
+ return function (this: any, ...args: any[]) {
+ if (timer) clearTimeout(timer); // 如果上一个 setTimeout 存在,则清除它
+
+ // 设置一个新的 setTimeout,在指定的等待时间后调用防抖函数
+ timer = setTimeout(() => {
+ fn.apply(this, args); // 使用提供的参数调用原始函数
+ }, wait);
+ };
+};
+
+
+
+// 示例
+// 定义一个函数
+// function saveData(data: string) {
+// // 模拟保存数据的操作
+// console.log(`Saving data: ${data}`);
+// }
+
+// // 创建一个防抖函数,延迟 500 毫秒后调用 saveData 函数
+// const debouncedSaveData = debounce(saveData, 500);
+
+// // 连续调用防抖函数
+// debouncedSaveData('Data 1'); // 不会立即调用 saveData 函数
+// debouncedSaveData('Data 2'); // 不会立即调用 saveData 函数
+
+// 在 500 毫秒后,只会调用一次 saveData 函数,输出结果为 "Saving data: Data 2"
\ No newline at end of file
diff --git a/uni_modules/lime-shared/exif/index.ts b/uni_modules/lime-shared/exif/index.ts
new file mode 100644
index 0000000..b67e233
--- /dev/null
+++ b/uni_modules/lime-shared/exif/index.ts
@@ -0,0 +1,1056 @@
+// @ts-nocheck
+import { base64ToArrayBuffer } from '../base64ToArrayBuffer';
+import { pathToBase64 } from '../pathToBase64';
+import { isBase64 } from '../isBase64';
+import { isString } from '../isString';
+
+interface File {
+ exifdata : any
+ iptcdata : any
+ xmpdata : any
+ src : string
+}
+class EXIF {
+ isXmpEnabled = false
+ debug = false
+ Tags = {
+ // version tags
+ 0x9000: "ExifVersion", // EXIF version
+ 0xA000: "FlashpixVersion", // Flashpix format version
+
+ // colorspace tags
+ 0xA001: "ColorSpace", // Color space information tag
+
+ // image configuration
+ 0xA002: "PixelXDimension", // Valid width of meaningful image
+ 0xA003: "PixelYDimension", // Valid height of meaningful image
+ 0x9101: "ComponentsConfiguration", // Information about channels
+ 0x9102: "CompressedBitsPerPixel", // Compressed bits per pixel
+
+ // user information
+ 0x927C: "MakerNote", // Any desired information written by the manufacturer
+ 0x9286: "UserComment", // Comments by user
+
+ // related file
+ 0xA004: "RelatedSoundFile", // Name of related sound file
+
+ // date and time
+ 0x9003: "DateTimeOriginal", // Date and time when the original image was generated
+ 0x9004: "DateTimeDigitized", // Date and time when the image was stored digitally
+ 0x9290: "SubsecTime", // Fractions of seconds for DateTime
+ 0x9291: "SubsecTimeOriginal", // Fractions of seconds for DateTimeOriginal
+ 0x9292: "SubsecTimeDigitized", // Fractions of seconds for DateTimeDigitized
+
+ // picture-taking conditions
+ 0x829A: "ExposureTime", // Exposure time (in seconds)
+ 0x829D: "FNumber", // F number
+ 0x8822: "ExposureProgram", // Exposure program
+ 0x8824: "SpectralSensitivity", // Spectral sensitivity
+ 0x8827: "ISOSpeedRatings", // ISO speed rating
+ 0x8828: "OECF", // Optoelectric conversion factor
+ 0x9201: "ShutterSpeedValue", // Shutter speed
+ 0x9202: "ApertureValue", // Lens aperture
+ 0x9203: "BrightnessValue", // Value of brightness
+ 0x9204: "ExposureBias", // Exposure bias
+ 0x9205: "MaxApertureValue", // Smallest F number of lens
+ 0x9206: "SubjectDistance", // Distance to subject in meters
+ 0x9207: "MeteringMode", // Metering mode
+ 0x9208: "LightSource", // Kind of light source
+ 0x9209: "Flash", // Flash status
+ 0x9214: "SubjectArea", // Location and area of main subject
+ 0x920A: "FocalLength", // Focal length of the lens in mm
+ 0xA20B: "FlashEnergy", // Strobe energy in BCPS
+ 0xA20C: "SpatialFrequencyResponse", //
+ 0xA20E: "FocalPlaneXResolution", // Number of pixels in width direction per FocalPlaneResolutionUnit
+ 0xA20F: "FocalPlaneYResolution", // Number of pixels in height direction per FocalPlaneResolutionUnit
+ 0xA210: "FocalPlaneResolutionUnit", // Unit for measuring FocalPlaneXResolution and FocalPlaneYResolution
+ 0xA214: "SubjectLocation", // Location of subject in image
+ 0xA215: "ExposureIndex", // Exposure index selected on camera
+ 0xA217: "SensingMethod", // Image sensor type
+ 0xA300: "FileSource", // Image source (3 == DSC)
+ 0xA301: "SceneType", // Scene type (1 == directly photographed)
+ 0xA302: "CFAPattern", // Color filter array geometric pattern
+ 0xA401: "CustomRendered", // Special processing
+ 0xA402: "ExposureMode", // Exposure mode
+ 0xA403: "WhiteBalance", // 1 = auto white balance, 2 = manual
+ 0xA404: "DigitalZoomRation", // Digital zoom ratio
+ 0xA405: "FocalLengthIn35mmFilm", // Equivalent foacl length assuming 35mm film camera (in mm)
+ 0xA406: "SceneCaptureType", // Type of scene
+ 0xA407: "GainControl", // Degree of overall image gain adjustment
+ 0xA408: "Contrast", // Direction of contrast processing applied by camera
+ 0xA409: "Saturation", // Direction of saturation processing applied by camera
+ 0xA40A: "Sharpness", // Direction of sharpness processing applied by camera
+ 0xA40B: "DeviceSettingDescription", //
+ 0xA40C: "SubjectDistanceRange", // Distance to subject
+
+ // other tags
+ 0xA005: "InteroperabilityIFDPointer",
+ 0xA420: "ImageUniqueID" // Identifier assigned uniquely to each image
+ }
+ TiffTags = {
+ 0x0100: "ImageWidth",
+ 0x0101: "ImageHeight",
+ 0x8769: "ExifIFDPointer",
+ 0x8825: "GPSInfoIFDPointer",
+ 0xA005: "InteroperabilityIFDPointer",
+ 0x0102: "BitsPerSample",
+ 0x0103: "Compression",
+ 0x0106: "PhotometricInterpretation",
+ 0x0112: "Orientation",
+ 0x0115: "SamplesPerPixel",
+ 0x011C: "PlanarConfiguration",
+ 0x0212: "YCbCrSubSampling",
+ 0x0213: "YCbCrPositioning",
+ 0x011A: "XResolution",
+ 0x011B: "YResolution",
+ 0x0128: "ResolutionUnit",
+ 0x0111: "StripOffsets",
+ 0x0116: "RowsPerStrip",
+ 0x0117: "StripByteCounts",
+ 0x0201: "JPEGInterchangeFormat",
+ 0x0202: "JPEGInterchangeFormatLength",
+ 0x012D: "TransferFunction",
+ 0x013E: "WhitePoint",
+ 0x013F: "PrimaryChromaticities",
+ 0x0211: "YCbCrCoefficients",
+ 0x0214: "ReferenceBlackWhite",
+ 0x0132: "DateTime",
+ 0x010E: "ImageDescription",
+ 0x010F: "Make",
+ 0x0110: "Model",
+ 0x0131: "Software",
+ 0x013B: "Artist",
+ 0x8298: "Copyright"
+ }
+ GPSTags = {
+ 0x0000: "GPSVersionID",
+ 0x0001: "GPSLatitudeRef",
+ 0x0002: "GPSLatitude",
+ 0x0003: "GPSLongitudeRef",
+ 0x0004: "GPSLongitude",
+ 0x0005: "GPSAltitudeRef",
+ 0x0006: "GPSAltitude",
+ 0x0007: "GPSTimeStamp",
+ 0x0008: "GPSSatellites",
+ 0x0009: "GPSStatus",
+ 0x000A: "GPSMeasureMode",
+ 0x000B: "GPSDOP",
+ 0x000C: "GPSSpeedRef",
+ 0x000D: "GPSSpeed",
+ 0x000E: "GPSTrackRef",
+ 0x000F: "GPSTrack",
+ 0x0010: "GPSImgDirectionRef",
+ 0x0011: "GPSImgDirection",
+ 0x0012: "GPSMapDatum",
+ 0x0013: "GPSDestLatitudeRef",
+ 0x0014: "GPSDestLatitude",
+ 0x0015: "GPSDestLongitudeRef",
+ 0x0016: "GPSDestLongitude",
+ 0x0017: "GPSDestBearingRef",
+ 0x0018: "GPSDestBearing",
+ 0x0019: "GPSDestDistanceRef",
+ 0x001A: "GPSDestDistance",
+ 0x001B: "GPSProcessingMethod",
+ 0x001C: "GPSAreaInformation",
+ 0x001D: "GPSDateStamp",
+ 0x001E: "GPSDifferential"
+ }
+ // EXIF 2.3 Spec
+ IFD1Tags = {
+ 0x0100: "ImageWidth",
+ 0x0101: "ImageHeight",
+ 0x0102: "BitsPerSample",
+ 0x0103: "Compression",
+ 0x0106: "PhotometricInterpretation",
+ 0x0111: "StripOffsets",
+ 0x0112: "Orientation",
+ 0x0115: "SamplesPerPixel",
+ 0x0116: "RowsPerStrip",
+ 0x0117: "StripByteCounts",
+ 0x011A: "XResolution",
+ 0x011B: "YResolution",
+ 0x011C: "PlanarConfiguration",
+ 0x0128: "ResolutionUnit",
+ 0x0201: "JpegIFOffset", // When image format is JPEG, this value show offset to JPEG data stored.(aka "ThumbnailOffset" or "JPEGInterchangeFormat")
+ 0x0202: "JpegIFByteCount", // When image format is JPEG, this value shows data size of JPEG image (aka "ThumbnailLength" or "JPEGInterchangeFormatLength")
+ 0x0211: "YCbCrCoefficients",
+ 0x0212: "YCbCrSubSampling",
+ 0x0213: "YCbCrPositioning",
+ 0x0214: "ReferenceBlackWhite"
+ }
+ StringValues = {
+ ExposureProgram: {
+ 0: "Not defined",
+ 1: "Manual",
+ 2: "Normal program",
+ 3: "Aperture priority",
+ 4: "Shutter priority",
+ 5: "Creative program",
+ 6: "Action program",
+ 7: "Portrait mode",
+ 8: "Landscape mode"
+ },
+ MeteringMode: {
+ 0: "Unknown",
+ 1: "Average",
+ 2: "CenterWeightedAverage",
+ 3: "Spot",
+ 4: "MultiSpot",
+ 5: "Pattern",
+ 6: "Partial",
+ 255: "Other"
+ },
+ LightSource: {
+ 0: "Unknown",
+ 1: "Daylight",
+ 2: "Fluorescent",
+ 3: "Tungsten (incandescent light)",
+ 4: "Flash",
+ 9: "Fine weather",
+ 10: "Cloudy weather",
+ 11: "Shade",
+ 12: "Daylight fluorescent (D 5700 - 7100K)",
+ 13: "Day white fluorescent (N 4600 - 5400K)",
+ 14: "Cool white fluorescent (W 3900 - 4500K)",
+ 15: "White fluorescent (WW 3200 - 3700K)",
+ 17: "Standard light A",
+ 18: "Standard light B",
+ 19: "Standard light C",
+ 20: "D55",
+ 21: "D65",
+ 22: "D75",
+ 23: "D50",
+ 24: "ISO studio tungsten",
+ 255: "Other"
+ },
+ Flash: {
+ 0x0000: "Flash did not fire",
+ 0x0001: "Flash fired",
+ 0x0005: "Strobe return light not detected",
+ 0x0007: "Strobe return light detected",
+ 0x0009: "Flash fired, compulsory flash mode",
+ 0x000D: "Flash fired, compulsory flash mode, return light not detected",
+ 0x000F: "Flash fired, compulsory flash mode, return light detected",
+ 0x0010: "Flash did not fire, compulsory flash mode",
+ 0x0018: "Flash did not fire, auto mode",
+ 0x0019: "Flash fired, auto mode",
+ 0x001D: "Flash fired, auto mode, return light not detected",
+ 0x001F: "Flash fired, auto mode, return light detected",
+ 0x0020: "No flash function",
+ 0x0041: "Flash fired, red-eye reduction mode",
+ 0x0045: "Flash fired, red-eye reduction mode, return light not detected",
+ 0x0047: "Flash fired, red-eye reduction mode, return light detected",
+ 0x0049: "Flash fired, compulsory flash mode, red-eye reduction mode",
+ 0x004D: "Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",
+ 0x004F: "Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",
+ 0x0059: "Flash fired, auto mode, red-eye reduction mode",
+ 0x005D: "Flash fired, auto mode, return light not detected, red-eye reduction mode",
+ 0x005F: "Flash fired, auto mode, return light detected, red-eye reduction mode"
+ },
+ SensingMethod: {
+ 1: "Not defined",
+ 2: "One-chip color area sensor",
+ 3: "Two-chip color area sensor",
+ 4: "Three-chip color area sensor",
+ 5: "Color sequential area sensor",
+ 7: "Trilinear sensor",
+ 8: "Color sequential linear sensor"
+ },
+ SceneCaptureType: {
+ 0: "Standard",
+ 1: "Landscape",
+ 2: "Portrait",
+ 3: "Night scene"
+ },
+ SceneType: {
+ 1: "Directly photographed"
+ },
+ CustomRendered: {
+ 0: "Normal process",
+ 1: "Custom process"
+ },
+ WhiteBalance: {
+ 0: "Auto white balance",
+ 1: "Manual white balance"
+ },
+ GainControl: {
+ 0: "None",
+ 1: "Low gain up",
+ 2: "High gain up",
+ 3: "Low gain down",
+ 4: "High gain down"
+ },
+ Contrast: {
+ 0: "Normal",
+ 1: "Soft",
+ 2: "Hard"
+ },
+ Saturation: {
+ 0: "Normal",
+ 1: "Low saturation",
+ 2: "High saturation"
+ },
+ Sharpness: {
+ 0: "Normal",
+ 1: "Soft",
+ 2: "Hard"
+ },
+ SubjectDistanceRange: {
+ 0: "Unknown",
+ 1: "Macro",
+ 2: "Close view",
+ 3: "Distant view"
+ },
+ FileSource: {
+ 3: "DSC"
+ },
+
+ Components: {
+ 0: "",
+ 1: "Y",
+ 2: "Cb",
+ 3: "Cr",
+ 4: "R",
+ 5: "G",
+ 6: "B"
+ }
+ }
+ enableXmp() {
+ this.isXmpEnabled = true
+ }
+ disableXmp() {
+ this.isXmpEnabled = false;
+ }
+ /**
+ * 获取图片数据
+ * @param img 图片地址
+ * @param callback 回调 返回图片数据
+ * */
+ getData(img : any, callback : Function) {
+ // if (((self.Image && img instanceof self.Image) || (self.HTMLImageElement && img instanceof self.HTMLImageElement)) && !img.complete)
+ // return false;
+ let file : File = {
+ src: '',
+ exifdata: null,
+ iptcdata: null,
+ xmpdata: null,
+ }
+ if (isBase64(img)) {
+ file.src = img
+ } else if (img.path) {
+ file.src = img.path
+ } else if (isString(img)) {
+ file.src = img
+ } else {
+ return false;
+ }
+
+
+ if (!imageHasData(file)) {
+ getImageData(file, callback);
+ } else {
+ if (callback) {
+ callback.call(file);
+ }
+ }
+ return true;
+ }
+ /**
+ * 获取图片tag
+ * @param img 图片数据
+ * @param tag tag 类型
+ * */
+ getTag(img : File, tag : string) {
+ if (!imageHasData(img)) return;
+ return img.exifdata[tag];
+ }
+ getIptcTag(img : File, tag : string) {
+ if (!imageHasData(img)) return;
+ return img.iptcdata[tag];
+ }
+ getAllTags(img : File) {
+ if (!imageHasData(img)) return {};
+ let a,
+ data = img.exifdata,
+ tags = {};
+ for (a in data) {
+ if (data.hasOwnProperty(a)) {
+ tags[a] = data[a];
+ }
+ }
+ return tags;
+ }
+ getAllIptcTags(img : File) {
+ if (!imageHasData(img)) return {};
+ let a,
+ data = img.iptcdata,
+ tags = {};
+ for (a in data) {
+ if (data.hasOwnProperty(a)) {
+ tags[a] = data[a];
+ }
+ }
+ return tags;
+ }
+ pretty(img : File) {
+ if (!imageHasData(img)) return "";
+ let a,
+ data = img.exifdata,
+ strPretty = "";
+ for (a in data) {
+ if (data.hasOwnProperty(a)) {
+ if (typeof data[a] == "object") {
+ if (data[a] instanceof Number) {
+ strPretty += a + " : " + data[a] + " [" + data[a].numerator + "/" + data[a]
+ .denominator + "]\r\n";
+ } else {
+ strPretty += a + " : [" + data[a].length + " values]\r\n";
+ }
+ } else {
+ strPretty += a + " : " + data[a] + "\r\n";
+ }
+ }
+ }
+ return strPretty;
+ }
+ readFromBinaryFile(file: ArrayBuffer) {
+ return findEXIFinJPEG(file);
+ }
+}
+
+export const exif = new EXIF()
+// export function getData(img, callback) {
+// const exif = new EXIF()
+// exif.getData(img, callback)
+// }
+
+// export default {getData}
+const ExifTags = exif.Tags
+const TiffTags = exif.TiffTags
+const IFD1Tags = exif.IFD1Tags
+const GPSTags = exif.GPSTags
+const StringValues = exif.StringValues
+
+
+function imageHasData(img : File) : boolean {
+ return !!(img.exifdata);
+}
+
+function objectURLToBlob(url : string, callback : Function) {
+ try {
+ const http = new XMLHttpRequest();
+ http.open("GET", url, true);
+ http.responseType = "blob";
+ http.onload = function (e) {
+ if (this.status == 200 || this.status === 0) {
+ callback(this.response);
+ }
+ };
+ http.send();
+ } catch (e) {
+ console.warn(e)
+ }
+}
+
+
+function getImageData(img : File, callback : Function) {
+ function handleBinaryFile(binFile: ArrayBuffer) {
+ const data = findEXIFinJPEG(binFile);
+ img.exifdata = data ?? {};
+ const iptcdata = findIPTCinJPEG(binFile);
+ img.iptcdata = iptcdata ?? {};
+ if (exif.isXmpEnabled) {
+ const xmpdata = findXMPinJPEG(binFile);
+ img.xmpdata = xmpdata ?? {};
+ }
+ if (callback) {
+ callback.call(img);
+ }
+ }
+
+ if (img.src) {
+ if (/^data\:/i.test(img.src)) { // Data URI
+ // var arrayBuffer = base64ToArrayBuffer(img.src);
+ handleBinaryFile(base64ToArrayBuffer(img.src));
+
+ } else if (/^blob\:/i.test(img.src) && typeof FileReader !== 'undefined') { // Object URL
+ var fileReader = new FileReader();
+ fileReader.onload = function (e) {
+ handleBinaryFile(e.target.result);
+ };
+ objectURLToBlob(img.src, function (blob : Blob) {
+ fileReader.readAsArrayBuffer(blob);
+ });
+ } else if (typeof XMLHttpRequest !== 'undefined') {
+ var http = new XMLHttpRequest();
+ http.onload = function () {
+ if (this.status == 200 || this.status === 0) {
+ handleBinaryFile(http.response);
+ } else {
+ throw "Could not load image";
+ }
+ http = null;
+ };
+ http.open("GET", img.src, true);
+ http.responseType = "arraybuffer";
+ http.send(null);
+ } else {
+ pathToBase64(img.src).then(res => {
+ handleBinaryFile(base64ToArrayBuffer(res));
+ })
+ }
+ } else if (typeof FileReader !== 'undefined' && self.FileReader && (img instanceof self.Blob || img instanceof self.File)) {
+ var fileReader = new FileReader();
+ fileReader.onload = function (e : any) {
+ if (exif.debug) console.log("Got file of length " + e.target.result.byteLength);
+ handleBinaryFile(e.target.result);
+ };
+
+ fileReader.readAsArrayBuffer(img);
+ }
+}
+
+function findEXIFinJPEG(file: ArrayBuffer) {
+ const dataView = new DataView(file);
+
+ if (exif.debug) console.log("Got file of length " + file.byteLength);
+ if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) {
+ if (exif.debug) console.log("Not a valid JPEG");
+ return false; // not a valid jpeg
+ }
+
+ let offset = 2,
+ length = file.byteLength,
+ marker;
+
+ while (offset < length) {
+ if (dataView.getUint8(offset) != 0xFF) {
+ if (exif.debug) console.log("Not a valid marker at offset " + offset + ", found: " + dataView.getUint8(
+ offset));
+ return false; // not a valid marker, something is wrong
+ }
+
+ marker = dataView.getUint8(offset + 1);
+ if (exif.debug) console.log(marker);
+
+ // we could implement handling for other markers here,
+ // but we're only looking for 0xFFE1 for EXIF data
+
+ if (marker == 225) {
+ if (exif.debug) console.log("Found 0xFFE1 marker");
+
+ return readEXIFData(dataView, offset + 4, dataView.getUint16(offset + 2) - 2);
+
+ // offset += 2 + file.getShortAt(offset+2, true);
+
+ } else {
+ offset += 2 + dataView.getUint16(offset + 2);
+ }
+
+ }
+
+}
+
+function findIPTCinJPEG(file: ArrayBuffer) {
+ const dataView = new DataView(file);
+
+ if (exif.debug) console.log("Got file of length " + file.byteLength);
+ if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) {
+ if (exif.debug) console.log("Not a valid JPEG");
+ return false; // not a valid jpeg
+ }
+
+ let offset = 2,
+ length = file.byteLength;
+
+
+ const isFieldSegmentStart = function (dataView, offset: number) {
+ return (
+ dataView.getUint8(offset) === 0x38 &&
+ dataView.getUint8(offset + 1) === 0x42 &&
+ dataView.getUint8(offset + 2) === 0x49 &&
+ dataView.getUint8(offset + 3) === 0x4D &&
+ dataView.getUint8(offset + 4) === 0x04 &&
+ dataView.getUint8(offset + 5) === 0x04
+ );
+ };
+
+ while (offset < length) {
+
+ if (isFieldSegmentStart(dataView, offset)) {
+
+ // Get the length of the name header (which is padded to an even number of bytes)
+ var nameHeaderLength = dataView.getUint8(offset + 7);
+ if (nameHeaderLength % 2 !== 0) nameHeaderLength += 1;
+ // Check for pre photoshop 6 format
+ if (nameHeaderLength === 0) {
+ // Always 4
+ nameHeaderLength = 4;
+ }
+
+ var startOffset = offset + 8 + nameHeaderLength;
+ var sectionLength = dataView.getUint16(offset + 6 + nameHeaderLength);
+
+ return readIPTCData(file, startOffset, sectionLength);
+
+ break;
+
+ }
+
+
+ // Not the marker, continue searching
+ offset++;
+
+ }
+
+}
+
+const IptcFieldMap = {
+ 0x78: 'caption',
+ 0x6E: 'credit',
+ 0x19: 'keywords',
+ 0x37: 'dateCreated',
+ 0x50: 'byline',
+ 0x55: 'bylineTitle',
+ 0x7A: 'captionWriter',
+ 0x69: 'headline',
+ 0x74: 'copyright',
+ 0x0F: 'category'
+};
+
+function readIPTCData(file: ArrayBuffer, startOffset: number, sectionLength: number) {
+ const dataView = new DataView(file);
+ let data = {};
+ let fieldValue, fieldName, dataSize, segmentType, segmentSize;
+ let segmentStartPos = startOffset;
+ while (segmentStartPos < startOffset + sectionLength) {
+ if (dataView.getUint8(segmentStartPos) === 0x1C && dataView.getUint8(segmentStartPos + 1) === 0x02) {
+ segmentType = dataView.getUint8(segmentStartPos + 2);
+ if (segmentType in IptcFieldMap) {
+ dataSize = dataView.getInt16(segmentStartPos + 3);
+ segmentSize = dataSize + 5;
+ fieldName = IptcFieldMap[segmentType];
+ fieldValue = getStringFromDB(dataView, segmentStartPos + 5, dataSize);
+ // Check if we already stored a value with this name
+ if (data.hasOwnProperty(fieldName)) {
+ // Value already stored with this name, create multivalue field
+ if (data[fieldName] instanceof Array) {
+ data[fieldName].push(fieldValue);
+ } else {
+ data[fieldName] = [data[fieldName], fieldValue];
+ }
+ } else {
+ data[fieldName] = fieldValue;
+ }
+ }
+
+ }
+ segmentStartPos++;
+ }
+ return data;
+}
+
+function readTags(file: DataView, tiffStart: number, dirStart: number, strings: any[], bigEnd: number) {
+ let entries = file.getUint16(dirStart, !bigEnd),
+ tags = {},
+ entryOffset, tag;
+
+ for (let i = 0; i < entries; i++) {
+ entryOffset = dirStart + i * 12 + 2;
+ tag = strings[file.getUint16(entryOffset, !bigEnd)];
+ if (!tag && exif.debug) console.log("Unknown tag: " + file.getUint16(entryOffset, !bigEnd));
+ tags[tag] = readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd);
+ }
+ return tags;
+}
+
+function readTagValue(file: DataView, entryOffset: number, tiffStart: number, dirStart: number, bigEnd: number) {
+ let type = file.getUint16(entryOffset + 2, !bigEnd),
+ numValues = file.getUint32(entryOffset + 4, !bigEnd),
+ valueOffset = file.getUint32(entryOffset + 8, !bigEnd) + tiffStart,
+ offset,
+ vals, val, n,
+ numerator, denominator;
+
+ switch (type) {
+ case 1: // byte, 8-bit unsigned int
+ case 7: // undefined, 8-bit byte, value depending on field
+ if (numValues == 1) {
+ return file.getUint8(entryOffset + 8, !bigEnd);
+ } else {
+ offset = numValues > 4 ? valueOffset : (entryOffset + 8);
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ vals[n] = file.getUint8(offset + n);
+ }
+ return vals;
+ }
+
+ case 2: // ascii, 8-bit byte
+ offset = numValues > 4 ? valueOffset : (entryOffset + 8);
+ return getStringFromDB(file, offset, numValues - 1);
+
+ case 3: // short, 16 bit int
+ if (numValues == 1) {
+ return file.getUint16(entryOffset + 8, !bigEnd);
+ } else {
+ offset = numValues > 2 ? valueOffset : (entryOffset + 8);
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ vals[n] = file.getUint16(offset + 2 * n, !bigEnd);
+ }
+ return vals;
+ }
+
+ case 4: // long, 32 bit int
+ if (numValues == 1) {
+ return file.getUint32(entryOffset + 8, !bigEnd);
+ } else {
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ vals[n] = file.getUint32(valueOffset + 4 * n, !bigEnd);
+ }
+ return vals;
+ }
+
+ case 5: // rational = two long values, first is numerator, second is denominator
+ if (numValues == 1) {
+ numerator = file.getUint32(valueOffset, !bigEnd);
+ denominator = file.getUint32(valueOffset + 4, !bigEnd);
+ val = new Number(numerator / denominator);
+ val.numerator = numerator;
+ val.denominator = denominator;
+ return val;
+ } else {
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ numerator = file.getUint32(valueOffset + 8 * n, !bigEnd);
+ denominator = file.getUint32(valueOffset + 4 + 8 * n, !bigEnd);
+ vals[n] = new Number(numerator / denominator);
+ vals[n].numerator = numerator;
+ vals[n].denominator = denominator;
+ }
+ return vals;
+ }
+
+ case 9: // slong, 32 bit signed int
+ if (numValues == 1) {
+ return file.getInt32(entryOffset + 8, !bigEnd);
+ } else {
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ vals[n] = file.getInt32(valueOffset + 4 * n, !bigEnd);
+ }
+ return vals;
+ }
+
+ case 10: // signed rational, two slongs, first is numerator, second is denominator
+ if (numValues == 1) {
+ return file.getInt32(valueOffset, !bigEnd) / file.getInt32(valueOffset + 4, !bigEnd);
+ } else {
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ vals[n] = file.getInt32(valueOffset + 8 * n, !bigEnd) / file.getInt32(valueOffset + 4 + 8 *
+ n, !bigEnd);
+ }
+ return vals;
+ }
+ }
+}
+/**
+ * Given an IFD (Image File Directory) start offset
+ * returns an offset to next IFD or 0 if it's the last IFD.
+ */
+function getNextIFDOffset(dataView: DataView, dirStart: number, bigEnd: number) {
+ //the first 2bytes means the number of directory entries contains in this IFD
+ var entries = dataView.getUint16(dirStart, !bigEnd);
+
+ // After last directory entry, there is a 4bytes of data,
+ // it means an offset to next IFD.
+ // If its value is '0x00000000', it means this is the last IFD and there is no linked IFD.
+
+ return dataView.getUint32(dirStart + 2 + entries * 12, !bigEnd); // each entry is 12 bytes long
+}
+
+function readThumbnailImage(dataView: DataView, tiffStart: number, firstIFDOffset: number, bigEnd: number) {
+ // get the IFD1 offset
+ const IFD1OffsetPointer = getNextIFDOffset(dataView, tiffStart + firstIFDOffset, bigEnd);
+
+ if (!IFD1OffsetPointer) {
+ // console.log('******** IFD1Offset is empty, image thumb not found ********');
+ return {};
+ } else if (IFD1OffsetPointer > dataView.byteLength) { // this should not happen
+ // console.log('******** IFD1Offset is outside the bounds of the DataView ********');
+ return {};
+ }
+ // console.log('******* thumbnail IFD offset (IFD1) is: %s', IFD1OffsetPointer);
+
+ let thumbTags : any = readTags(dataView, tiffStart, tiffStart + IFD1OffsetPointer, IFD1Tags, bigEnd)
+
+ // EXIF 2.3 specification for JPEG format thumbnail
+
+ // If the value of Compression(0x0103) Tag in IFD1 is '6', thumbnail image format is JPEG.
+ // Most of Exif image uses JPEG format for thumbnail. In that case, you can get offset of thumbnail
+ // by JpegIFOffset(0x0201) Tag in IFD1, size of thumbnail by JpegIFByteCount(0x0202) Tag.
+ // Data format is ordinary JPEG format, starts from 0xFFD8 and ends by 0xFFD9. It seems that
+ // JPEG format and 160x120pixels of size are recommended thumbnail format for Exif2.1 or later.
+
+ if (thumbTags['Compression'] && typeof Blob !== 'undefined') {
+ // console.log('Thumbnail image found!');
+
+ switch (thumbTags['Compression']) {
+ case 6:
+ // console.log('Thumbnail image format is JPEG');
+ if (thumbTags.JpegIFOffset && thumbTags.JpegIFByteCount) {
+ // extract the thumbnail
+ var tOffset = tiffStart + thumbTags.JpegIFOffset;
+ var tLength = thumbTags.JpegIFByteCount;
+ thumbTags['blob'] = new Blob([new Uint8Array(dataView.buffer, tOffset, tLength)], {
+ type: 'image/jpeg'
+ });
+ }
+ break;
+
+ case 1:
+ console.log("Thumbnail image format is TIFF, which is not implemented.");
+ break;
+ default:
+ console.log("Unknown thumbnail image format '%s'", thumbTags['Compression']);
+ }
+ } else if (thumbTags['PhotometricInterpretation'] == 2) {
+ console.log("Thumbnail image format is RGB, which is not implemented.");
+ }
+ return thumbTags;
+}
+
+function getStringFromDB(buffer: DataView, start: number, length: number) {
+ let outstr = "";
+ for (let n = start; n < start + length; n++) {
+ outstr += String.fromCharCode(buffer.getUint8(n));
+ }
+ return outstr;
+}
+
+function readEXIFData(file: DataView, start: number) {
+ if (getStringFromDB(file, start, 4) != "Exif") {
+ if (exif.debug) console.log("Not valid EXIF data! " + getStringFromDB(file, start, 4));
+ return false;
+ }
+
+ let bigEnd,
+ tags, tag,
+ exifData, gpsData,
+ tiffOffset = start + 6;
+
+ // test for TIFF validity and endianness
+ if (file.getUint16(tiffOffset) == 0x4949) {
+ bigEnd = false;
+ } else if (file.getUint16(tiffOffset) == 0x4D4D) {
+ bigEnd = true;
+ } else {
+ if (exif.debug) console.log("Not valid TIFF data! (no 0x4949 or 0x4D4D)");
+ return false;
+ }
+
+ if (file.getUint16(tiffOffset + 2, !bigEnd) != 0x002A) {
+ if (exif.debug) console.log("Not valid TIFF data! (no 0x002A)");
+ return false;
+ }
+
+ const firstIFDOffset = file.getUint32(tiffOffset + 4, !bigEnd);
+
+ if (firstIFDOffset < 0x00000008) {
+ if (exif.debug) console.log("Not valid TIFF data! (First offset less than 8)", file.getUint32(tiffOffset + 4,
+ !bigEnd));
+ return false;
+ }
+
+ tags = readTags(file, tiffOffset, tiffOffset + firstIFDOffset, TiffTags, bigEnd);
+
+ if (tags.ExifIFDPointer) {
+ exifData = readTags(file, tiffOffset, tiffOffset + tags.ExifIFDPointer, ExifTags, bigEnd);
+ for (tag in exifData) {
+ switch (tag) {
+ case "LightSource":
+ case "Flash":
+ case "MeteringMode":
+ case "ExposureProgram":
+ case "SensingMethod":
+ case "SceneCaptureType":
+ case "SceneType":
+ case "CustomRendered":
+ case "WhiteBalance":
+ case "GainControl":
+ case "Contrast":
+ case "Saturation":
+ case "Sharpness":
+ case "SubjectDistanceRange":
+ case "FileSource":
+ exifData[tag] = StringValues[tag][exifData[tag]];
+ break;
+
+ case "ExifVersion":
+ case "FlashpixVersion":
+ exifData[tag] = String.fromCharCode(exifData[tag][0], exifData[tag][1], exifData[tag][2],
+ exifData[tag][3]);
+ break;
+
+ case "ComponentsConfiguration":
+ exifData[tag] =
+ StringValues.Components[exifData[tag][0]] +
+ StringValues.Components[exifData[tag][1]] +
+ StringValues.Components[exifData[tag][2]] +
+ StringValues.Components[exifData[tag][3]];
+ break;
+ }
+ tags[tag] = exifData[tag];
+ }
+ }
+
+ if (tags.GPSInfoIFDPointer) {
+ gpsData = readTags(file, tiffOffset, tiffOffset + tags.GPSInfoIFDPointer, GPSTags, bigEnd);
+ for (tag in gpsData) {
+ switch (tag) {
+ case "GPSVersionID":
+ gpsData[tag] = gpsData[tag][0] +
+ "." + gpsData[tag][1] +
+ "." + gpsData[tag][2] +
+ "." + gpsData[tag][3];
+ break;
+ }
+ tags[tag] = gpsData[tag];
+ }
+ }
+
+ // extract thumbnail
+ tags['thumbnail'] = readThumbnailImage(file, tiffOffset, firstIFDOffset, bigEnd);
+
+ return tags;
+}
+
+function findXMPinJPEG(file: ArrayBuffer) {
+
+ if (!('DOMParser' in self)) {
+ // console.warn('XML parsing not supported without DOMParser');
+ return;
+ }
+ const dataView = new DataView(file);
+
+ if (exif.debug) console.log("Got file of length " + file.byteLength);
+ if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) {
+ if (exif.debug) console.log("Not a valid JPEG");
+ return false; // not a valid jpeg
+ }
+
+ let offset = 2,
+ length = file.byteLength,
+ dom = new DOMParser();
+
+ while (offset < (length - 4)) {
+ if (getStringFromDB(dataView, offset, 4) == "http") {
+ const startOffset = offset - 1;
+ const sectionLength = dataView.getUint16(offset - 2) - 1;
+ let xmpString = getStringFromDB(dataView, startOffset, sectionLength)
+ const xmpEndIndex = xmpString.indexOf('xmpmeta>') + 8;
+ xmpString = xmpString.substring(xmpString.indexOf(' 0) {
+ json['@attributes'] = {};
+ for (var j = 0; j < xml.attributes.length; j++) {
+ var attribute = xml.attributes.item(j);
+ json['@attributes'][attribute.nodeName] = attribute.nodeValue;
+ }
+ }
+ } else if (xml.nodeType == 3) { // text node
+ return xml.nodeValue;
+ }
+
+ // deal with children
+ if (xml.hasChildNodes()) {
+ for (var i = 0; i < xml.childNodes.length; i++) {
+ var child = xml.childNodes.item(i);
+ var nodeName = child.nodeName;
+ if (json[nodeName] == null) {
+ json[nodeName] = xml2json(child);
+ } else {
+ if (json[nodeName].push == null) {
+ var old = json[nodeName];
+ json[nodeName] = [];
+ json[nodeName].push(old);
+ }
+ json[nodeName].push(xml2json(child));
+ }
+ }
+ }
+
+ return json;
+}
+
+function xml2Object(xml: any) {
+ try {
+ var obj = {};
+ if (xml.children.length > 0) {
+ for (var i = 0; i < xml.children.length; i++) {
+ var item = xml.children.item(i);
+ var attributes = item.attributes;
+ for (var idx in attributes) {
+ var itemAtt = attributes[idx];
+ var dataKey = itemAtt.nodeName;
+ var dataValue = itemAtt.nodeValue;
+
+ if (dataKey !== undefined) {
+ obj[dataKey] = dataValue;
+ }
+ }
+ var nodeName = item.nodeName;
+
+ if (typeof (obj[nodeName]) == "undefined") {
+ obj[nodeName] = xml2json(item);
+ } else {
+ if (typeof (obj[nodeName].push) == "undefined") {
+ var old = obj[nodeName];
+
+ obj[nodeName] = [];
+ obj[nodeName].push(old);
+ }
+ obj[nodeName].push(xml2json(item));
+ }
+ }
+ } else {
+ obj = xml.textContent;
+ }
+ return obj;
+ } catch (e) {
+ console.log(e.message);
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/fillZero/index.ts b/uni_modules/lime-shared/fillZero/index.ts
new file mode 100644
index 0000000..9952c45
--- /dev/null
+++ b/uni_modules/lime-shared/fillZero/index.ts
@@ -0,0 +1,11 @@
+// @ts-nocheck
+/**
+ * 在数字前填充零,返回字符串形式的结果
+ * @param number 要填充零的数字
+ * @param length 填充零后的字符串长度,默认为2
+ * @returns 填充零后的字符串
+ */
+export function fillZero(number: number, length: number = 2): string {
+ // 将数字转换为字符串,然后使用 padStart 方法填充零到指定长度
+ return `${number}`.padStart(length, '0');
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/floatAdd/index.ts b/uni_modules/lime-shared/floatAdd/index.ts
new file mode 100644
index 0000000..aba4774
--- /dev/null
+++ b/uni_modules/lime-shared/floatAdd/index.ts
@@ -0,0 +1,36 @@
+import {isNumber} from '../isNumber'
+/**
+ * 返回两个浮点数相加的结果
+ * @param num1 第一个浮点数
+ * @param num2 第二个浮点数
+ * @returns 两个浮点数的相加结果
+ */
+export function floatAdd(num1: number, num2: number): number {
+ // 检查 num1 和 num2 是否为数字类型
+ if (!(isNumber(num1) || isNumber(num2))) {
+ console.warn('Please pass in the number type');
+ return NaN;
+ }
+
+ let r1: number, r2: number, m: number;
+
+ try {
+ // 获取 num1 小数点后的位数
+ r1 = num1.toString().split('.')[1].length;
+ } catch (error) {
+ r1 = 0;
+ }
+
+ try {
+ // 获取 num2 小数点后的位数
+ r2 = num2.toString().split('.')[1].length;
+ } catch (error) {
+ r2 = 0;
+ }
+
+ // 计算需要扩大的倍数
+ m = Math.pow(10, Math.max(r1, r2));
+
+ // 返回相加结果
+ return (num1 * m + num2 * m) / m;
+}
diff --git a/uni_modules/lime-shared/getClassStr/index.ts b/uni_modules/lime-shared/getClassStr/index.ts
new file mode 100644
index 0000000..c3c62ac
--- /dev/null
+++ b/uni_modules/lime-shared/getClassStr/index.ts
@@ -0,0 +1,27 @@
+// @ts-nocheck
+/**
+ * 获取对象的类名字符串
+ * @param obj - 需要处理的对象
+ * @returns 由对象属性作为类名组成的字符串
+ */
+export function getClassStr(obj: T): string {
+ let classNames: string[] = [];
+
+ // 遍历对象的属性
+ for (let key in obj) {
+ // 检查属性确实属于对象自身且其值为true
+ if ((obj as any).hasOwnProperty(key) && obj[key]) {
+ // 将属性名添加到类名数组中
+ classNames.push(key);
+ }
+ }
+
+ // 将类名数组用空格连接成字符串并返回
+ return classNames.join(' ');
+}
+
+
+// 示例
+// const obj = { foo: true, bar: false, baz: true };
+// const classNameStr = getClassStr(obj);
+// console.log(classNameStr); // 输出: "foo baz"
\ No newline at end of file
diff --git a/uni_modules/lime-shared/getCurrentPage/index.ts b/uni_modules/lime-shared/getCurrentPage/index.ts
new file mode 100644
index 0000000..79ecac8
--- /dev/null
+++ b/uni_modules/lime-shared/getCurrentPage/index.ts
@@ -0,0 +1,6 @@
+// @ts-nocheck
+/** 获取当前页 */
+export const getCurrentPage = () => {
+ const pages = getCurrentPages();
+ return pages[pages.length - 1] //as T & WechatMiniprogram.Page.TrivialInstance;
+};
\ No newline at end of file
diff --git a/uni_modules/lime-shared/getLocalFilePath/index.ts b/uni_modules/lime-shared/getLocalFilePath/index.ts
new file mode 100644
index 0000000..8d6a68c
--- /dev/null
+++ b/uni_modules/lime-shared/getLocalFilePath/index.ts
@@ -0,0 +1,14 @@
+// @ts-nocheck
+export const getLocalFilePath = (path: string) => {
+ if(typeof plus == 'undefined') return path
+ if(/^(_www|_doc|_documents|_downloads|file:\/\/|\/storage\/emulated\/0\/)/.test(path)) return path
+ if (/^\//.test(path)) {
+ const localFilePath = plus.io.convertAbsoluteFileSystem(path)
+ if (localFilePath !== path) {
+ return localFilePath
+ } else {
+ path = path.slice(1)
+ }
+ }
+ return '_www/' + path
+}
diff --git a/uni_modules/lime-shared/getRect/index.ts b/uni_modules/lime-shared/getRect/index.ts
new file mode 100644
index 0000000..9763ee2
--- /dev/null
+++ b/uni_modules/lime-shared/getRect/index.ts
@@ -0,0 +1,86 @@
+// @ts-nocheck
+
+// #ifdef APP-NVUE
+// 当编译环境是 APP-NVUE 时,引入 uni.requireNativePlugin('dom'),具体插件用途未知
+const dom = uni.requireNativePlugin('dom')
+// #endif
+
+interface RectOptions {
+ /**
+ * 上下文
+ */
+ context ?: any // ComponentInternalInstance 类型,用于指定上下文
+
+ /**
+ * 是否需要获取所有节点,nvue 环境下不支持
+ */
+ needAll ?: boolean,
+
+ /**
+ * 节点引用对象,类型为 UniNamespace.NodesRef
+ */
+ nodes ?: UniNamespace.NodesRef
+
+ /**
+ * 节点引用对象的键,类型为 UniNamespace.NodesRef 中的某个键
+ */
+ type ?: keyof UniNamespace.NodesRef
+}
+
+/**
+ * 获取节点信息
+ * @param selector 选择器字符串
+ * @param options RectOptions 对象,用于配置选项
+ * @returns 包含节点信息的 Promise 对象
+ */
+export function getRect(selector : string, options : RectOptions = {}) {
+ // #ifndef APP-NVUE
+ const typeDefault = 'boundingClientRect'
+ let { context, needAll, type = typeDefault } = options
+ // #endif
+
+ // #ifdef MP || VUE2
+ if (context.proxy) context = context.proxy
+ // #endif
+
+ return new Promise((resolve, reject) => {
+ // #ifndef APP-NVUE
+ const dom = uni.createSelectorQuery().in(context)[needAll ? 'selectAll' : 'select'](selector);
+ const result = (rect: UniNamespace.NodeInfo) => {
+ if (rect) {
+ resolve(rect)
+ } else {
+ reject('no rect')
+ }
+ }
+ if (type == typeDefault) {
+ dom[type](result).exec()
+ } else {
+ dom[type]({
+ node: true,
+ size: true,
+ rect: true
+ }, result).exec()
+ }
+ // #endif
+ // #ifdef APP-NVUE
+ let { context } = options
+ if (/#|\./.test(selector) && context.refs) {
+ selector = selector.replace(/#|\./, '')
+ if (context.refs[selector]) {
+ selector = context.refs[selector]
+ if(Array.isArray(selector)) {
+ selector = selector[0]
+ }
+ }
+ }
+ dom.getComponentRect(selector, (res) => {
+ if (res.size) {
+ resolve(res.size)
+ } else {
+ reject('no rect')
+ }
+ })
+ // #endif
+ });
+};
\ No newline at end of file
diff --git a/uni_modules/lime-shared/getStyleStr/index.ts b/uni_modules/lime-shared/getStyleStr/index.ts
new file mode 100644
index 0000000..33decd5
--- /dev/null
+++ b/uni_modules/lime-shared/getStyleStr/index.ts
@@ -0,0 +1,30 @@
+// @ts-nocheck
+interface CSSProperties {
+ [key: string]: string | number
+}
+/**
+ * 将字符串转换为带有连字符分隔的小写形式
+ * @param key - 要转换的字符串
+ * @returns 转换后的字符串
+ */
+export function toLowercaseSeparator(key: string) {
+ return key.replace(/([A-Z])/g, '-$1').toLowerCase();
+}
+
+/**
+ * 获取样式对象对应的样式字符串
+ * @param style - CSS样式对象
+ * @returns 由非空有效样式属性键值对组成的字符串
+ */
+export function getStyleStr(style: CSSProperties): string {
+ return Object.keys(style)
+ .filter(key => style[key] !== undefined && style[key] !== null && style[key] !== '')
+ .map((key: string) => `${toLowercaseSeparator(key)}: ${style[key]};`)
+ .join(' ');
+}
+
+// 示例
+// const style = { color: 'red', fontSize: '16px', backgroundColor: '', border: null };
+// const styleStr = getStyleStr(style);
+// console.log(styleStr);
+// 输出: "color: red; font-size: 16px;"
\ No newline at end of file
diff --git a/uni_modules/lime-shared/hasOwn/index.ts b/uni_modules/lime-shared/hasOwn/index.ts
new file mode 100644
index 0000000..7317879
--- /dev/null
+++ b/uni_modules/lime-shared/hasOwn/index.ts
@@ -0,0 +1,30 @@
+// @ts-nocheck
+const hasOwnProperty = Object.prototype.hasOwnProperty
+/**
+ * 检查对象或数组是否具有指定的属性或键
+ * @param obj 要检查的对象或数组
+ * @param key 指定的属性或键
+ * @returns 如果对象或数组具有指定的属性或键,则返回true;否则返回false
+ */
+export function hasOwn(obj: Object | Array, key: string): boolean {
+ return hasOwnProperty.call(obj, key);
+}
+
+// 示例
+// const obj = { name: 'John', age: 30 };
+
+// if (hasOwn(obj, 'name')) {
+// console.log("对象具有 'name' 属性");
+// } else {
+// console.log("对象不具有 'name' 属性");
+// }
+// // 输出: 对象具有 'name' 属性
+
+// const arr = [1, 2, 3];
+
+// if (hasOwn(arr, 'length')) {
+// console.log("数组具有 'length' 属性");
+// } else {
+// console.log("数组不具有 'length' 属性");
+// }
+// 输出: 数组具有 'length' 属性
\ No newline at end of file
diff --git a/uni_modules/lime-shared/index.ts b/uni_modules/lime-shared/index.ts
new file mode 100644
index 0000000..8ffb34d
--- /dev/null
+++ b/uni_modules/lime-shared/index.ts
@@ -0,0 +1,43 @@
+// @ts-nocheck
+// validator
+export * from './isString'
+export * from './isNumber'
+export * from './isNumeric'
+export * from './isDef'
+export * from './isFunction'
+export * from './isObject'
+export * from './isPromise'
+export * from './isBase64'
+
+export * from './hasOwn'
+
+// 单位转换
+export * from './addUnit'
+export * from './unitConvert'
+export * from './toNumber'
+
+export * from './random'
+export * from './range'
+export * from './fillZero'
+
+// image
+export * from './base64ToPath'
+export * from './pathToBase64'
+export * from './exif'
+
+// canvas
+export * from './canIUseCanvas2d'
+
+// page
+export * from './getCurrentPage'
+
+// dom
+export * from './getRect'
+export * from './selectComponent'
+export * from './createAnimation'
+
+// delay
+export * from './sleep'
+export * from './debounce'
+export * from './throttle'
+
diff --git a/uni_modules/lime-shared/isBase64/index.ts b/uni_modules/lime-shared/isBase64/index.ts
new file mode 100644
index 0000000..44d0f6d
--- /dev/null
+++ b/uni_modules/lime-shared/isBase64/index.ts
@@ -0,0 +1,9 @@
+// @ts-nocheck
+/**
+ * 判断给定的路径是否为Base64编码的图像路径
+ * @param path 图像路径
+ * @returns 如果路径是Base64编码,则返回true;否则返回false
+ */
+export const isBase64 = (path: string): boolean => {
+ return /^data:image\/(\w+);base64/.test(path);
+};
\ No newline at end of file
diff --git a/uni_modules/lime-shared/isBrowser/index.ts b/uni_modules/lime-shared/isBrowser/index.ts
new file mode 100644
index 0000000..241c7f7
--- /dev/null
+++ b/uni_modules/lime-shared/isBrowser/index.ts
@@ -0,0 +1,2 @@
+// @ts-nocheck
+export const isBrowser = typeof window !== 'undefined';
\ No newline at end of file
diff --git a/uni_modules/lime-shared/isDef/index.ts b/uni_modules/lime-shared/isDef/index.ts
new file mode 100644
index 0000000..029407e
--- /dev/null
+++ b/uni_modules/lime-shared/isDef/index.ts
@@ -0,0 +1,9 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否已定义(不为 undefined)且不为 null
+ * @param value 要检查的值
+ * @returns 如果值已定义且不为 null,则返回 true;否则返回 false
+ */
+export function isDef(value: unknown): boolean {
+ return value !== undefined && value !== null;
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/isFunction/index.ts b/uni_modules/lime-shared/isFunction/index.ts
new file mode 100644
index 0000000..981442d
--- /dev/null
+++ b/uni_modules/lime-shared/isFunction/index.ts
@@ -0,0 +1,8 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否为函数类型
+ * @param val 要检查的值
+ * @returns 如果值的类型是函数类型,则返回 true;否则返回 false
+ */
+export const isFunction = (val: unknown): val is Function =>
+ typeof val === 'function';
\ No newline at end of file
diff --git a/uni_modules/lime-shared/isNumber/index.ts b/uni_modules/lime-shared/isNumber/index.ts
new file mode 100644
index 0000000..2feff2f
--- /dev/null
+++ b/uni_modules/lime-shared/isNumber/index.ts
@@ -0,0 +1,9 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否为数字类型
+ * @param value 要检查的值,可以是 number 类型或 string 类型的数字
+ * @returns 如果值是数字类型且不是 NaN,则返回 true;否则返回 false
+ */
+export function isNumber(value: number | string): boolean {
+ return typeof value === 'number' && !isNaN(value);
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/isNumeric/index.ts b/uni_modules/lime-shared/isNumeric/index.ts
new file mode 100644
index 0000000..5ee60ba
--- /dev/null
+++ b/uni_modules/lime-shared/isNumeric/index.ts
@@ -0,0 +1,9 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否为数字类型或表示数字的字符串
+ * @param value 要检查的值,可以是 string 类型或 number 类型
+ * @returns 如果值是数字类型或表示数字的字符串,则返回 true;否则返回 false
+ */
+export function isNumeric(value: string | number): boolean {
+ return /^(-)?\d+(\.\d+)?$/.test(value);
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/isObject/index.ts b/uni_modules/lime-shared/isObject/index.ts
new file mode 100644
index 0000000..17234c9
--- /dev/null
+++ b/uni_modules/lime-shared/isObject/index.ts
@@ -0,0 +1,8 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否为对象类型
+ * @param val 要检查的值
+ * @returns 如果值的类型是对象类型,则返回 true;否则返回 false
+ */
+export const isObject = (val : unknown) : val is Record =>
+ val !== null && typeof val === 'object';
\ No newline at end of file
diff --git a/uni_modules/lime-shared/isPromise/index.ts b/uni_modules/lime-shared/isPromise/index.ts
new file mode 100644
index 0000000..63847cd
--- /dev/null
+++ b/uni_modules/lime-shared/isPromise/index.ts
@@ -0,0 +1,13 @@
+// @ts-nocheck
+import {isFunction} from '../isFunction'
+import {isObject} from '../isObject'
+/**
+ * 检查一个值是否为 Promise 类型
+ * @param val 要检查的值
+ * @returns 如果值的类型是 Promise 类型,则返回 true;否则返回 false
+ */
+export const isPromise = (val: unknown): val is Promise => {
+ // 使用 isObject 函数判断值是否为对象类型
+ // 使用 isFunction 函数判断值是否具有 then 方法和 catch 方法
+ return isObject(val) && isFunction(val.then) && isFunction(val.catch);
+};
\ No newline at end of file
diff --git a/uni_modules/lime-shared/isString/index.ts b/uni_modules/lime-shared/isString/index.ts
new file mode 100644
index 0000000..a130eb2
--- /dev/null
+++ b/uni_modules/lime-shared/isString/index.ts
@@ -0,0 +1,7 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否为字符串类型
+ * @param str 要检查的值
+ * @returns 如果值的类型是字符串类型,则返回 true;否则返回 false
+ */
+export const isString = (str: unknown): str is string => typeof str === 'string';
\ No newline at end of file
diff --git a/uni_modules/lime-shared/kebabCase/index.ts b/uni_modules/lime-shared/kebabCase/index.ts
new file mode 100644
index 0000000..fa0e4b2
--- /dev/null
+++ b/uni_modules/lime-shared/kebabCase/index.ts
@@ -0,0 +1,17 @@
+// export function toLowercaseSeparator(key: string) {
+// return key.replace(/([A-Z])/g, '-$1').toLowerCase();
+// }
+
+/**
+ * 将字符串转换为指定连接符的命名约定
+ * @param str 要转换的字符串
+ * @param separator 指定的连接符,默认为 "-"
+ * @returns 转换后的字符串
+ */
+export function kebabCase(str: string, separator: string = "-"): string {
+ return str
+ .replace(/[A-Z]/g, match => `${separator}${match.toLowerCase()}`) // 将大写字母替换为连接符加小写字母
+ .replace(/[\s_-]+/g, separator) // 将空格、下划线和短横线替换为指定连接符
+ .replace(new RegExp(`^${separator}|${separator}$`, "g"), "") // 删除开头和结尾的连接符
+ .toLowerCase(); // 将结果转换为全小写
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/package.json b/uni_modules/lime-shared/package.json
new file mode 100644
index 0000000..2e000c9
--- /dev/null
+++ b/uni_modules/lime-shared/package.json
@@ -0,0 +1,83 @@
+{
+ "id": "lime-shared",
+ "displayName": "lime-shared",
+ "version": "0.1.4",
+ "description": "本人插件的几个公共函数,获取当前页,图片的base64转临时路径,图片的exif信息等",
+ "keywords": [
+ "lime-shared",
+ "exif",
+ "selectComponent"
+],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "type": "sdk-js",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "u",
+ "Edge": "u",
+ "Firefox": "u",
+ "Safari": "u"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "钉钉": "y",
+ "快手": "y",
+ "飞书": "y",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/pathToBase64/index.ts b/uni_modules/lime-shared/pathToBase64/index.ts
new file mode 100644
index 0000000..8167f88
--- /dev/null
+++ b/uni_modules/lime-shared/pathToBase64/index.ts
@@ -0,0 +1,121 @@
+// @ts-nocheck
+
+// #ifdef APP-PLUS
+import { getLocalFilePath } from '../getLocalFilePath'
+// #endif
+function isImage(extension : string) {
+ const imageExtensions = ["jpg", "jpeg", "png", "gif", "bmp", "svg"];
+ return imageExtensions.includes(extension.toLowerCase());
+}
+// #ifdef H5
+function getSVGFromURL(url: string) {
+ return new Promise((resolve, reject) => {
+ const xhr = new XMLHttpRequest();
+ xhr.open('GET', url, true);
+ xhr.responseType = 'text';
+
+ xhr.onload = function () {
+ if (xhr.status === 200) {
+ const svg = xhr.responseText;
+ resolve(svg);
+ } else {
+ reject(new Error(xhr.statusText));
+ }
+ };
+
+ xhr.onerror = function () {
+ reject(new Error('Network error'));
+ };
+
+ xhr.send();
+ });
+}
+// #endif
+/**
+ * 路径转base64
+ * @param {Object} string
+ */
+export function pathToBase64(path : string) : Promise {
+ if (/^data:/.test(path)) return path
+ let extension = path.substring(path.lastIndexOf('.') + 1);
+ const isImageFile = isImage(extension)
+ let prefix = ''
+ if (isImageFile) {
+ prefix = 'image/';
+ if(extension == 'svg') {
+ extension += '+xml'
+ }
+ } else if (extension === 'pdf') {
+ prefix = 'application/pdf';
+ } else if (extension === 'txt') {
+ prefix = 'text/plain';
+ } else {
+ // 添加更多文件类型的判断
+ // 如果不是图片、PDF、文本等类型,可以设定默认的前缀或采取其他处理
+ prefix = 'application/octet-stream';
+ }
+ return new Promise((resolve, reject) => {
+ // #ifdef H5
+ if (isImageFile) {
+ if(extension == 'svg') {
+ getSVGFromURL(path).then(svg => {
+ const base64 = btoa(svg);
+ resolve(`data:image/svg+xml;base64,${base64}`);
+ })
+ } else {
+ let image = new Image();
+ image.setAttribute("crossOrigin", 'Anonymous');
+ image.onload = function () {
+ let canvas = document.createElement('canvas');
+ canvas.width = this.naturalWidth;
+ canvas.height = this.naturalHeight;
+ canvas.getContext('2d').drawImage(image, 0, 0);
+ let result = canvas.toDataURL(`${prefix}${extension}`)
+ resolve(result);
+ canvas.height = canvas.width = 0
+ }
+ image.src = path + '?v=' + Math.random()
+ image.onerror = (error) => {
+ reject(error);
+ };
+ }
+
+ } else {
+ reject('not image');
+ }
+
+ // #endif
+
+ // #ifdef MP
+ if (uni.canIUse('getFileSystemManager')) {
+ uni.getFileSystemManager().readFile({
+ filePath: path,
+ encoding: 'base64',
+ success: (res) => {
+ resolve(`data:${prefix}${extension};base64,${res.data}`)
+ },
+ fail: (error) => {
+ console.error({ error, path })
+ reject(error)
+ }
+ })
+ }
+ // #endif
+
+ // #ifdef APP-PLUS
+ plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), (entry) => {
+ entry.file((file : any) => {
+ const fileReader = new plus.io.FileReader()
+ fileReader.onload = (data) => {
+ resolve(data.target.result)
+ }
+ fileReader.onerror = (error) => {
+ console.error({ error, path })
+ reject(error)
+ }
+ fileReader.readAsDataURL(file)
+ }, reject)
+ }, reject)
+ // #endif
+ })
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/piexif/index.ts b/uni_modules/lime-shared/piexif/index.ts
new file mode 100644
index 0000000..6a52b10
--- /dev/null
+++ b/uni_modules/lime-shared/piexif/index.ts
@@ -0,0 +1,2320 @@
+// @ts-nocheck
+// 源于piexifjs
+import { cloneDeep } from '../cloneDeep'
+import { isString } from '../isString'
+const TAGS = {
+ 'Image': {
+ 11: {
+ 'name': 'ProcessingSoftware',
+ 'type': 'Ascii'
+ },
+ 254: {
+ 'name': 'NewSubfileType',
+ 'type': 'Long'
+ },
+ 255: {
+ 'name': 'SubfileType',
+ 'type': 'Short'
+ },
+ 256: {
+ 'name': 'ImageWidth',
+ 'type': 'Long'
+ },
+ 257: {
+ 'name': 'ImageLength',
+ 'type': 'Long'
+ },
+ 258: {
+ 'name': 'BitsPerSample',
+ 'type': 'Short'
+ },
+ 259: {
+ 'name': 'Compression',
+ 'type': 'Short'
+ },
+ 262: {
+ 'name': 'PhotometricInterpretation',
+ 'type': 'Short'
+ },
+ 263: {
+ 'name': 'Threshholding',
+ 'type': 'Short'
+ },
+ 264: {
+ 'name': 'CellWidth',
+ 'type': 'Short'
+ },
+ 265: {
+ 'name': 'CellLength',
+ 'type': 'Short'
+ },
+ 266: {
+ 'name': 'FillOrder',
+ 'type': 'Short'
+ },
+ 269: {
+ 'name': 'DocumentName',
+ 'type': 'Ascii'
+ },
+ 270: {
+ 'name': 'ImageDescription',
+ 'type': 'Ascii'
+ },
+ 271: {
+ 'name': 'Make',
+ 'type': 'Ascii'
+ },
+ 272: {
+ 'name': 'Model',
+ 'type': 'Ascii'
+ },
+ 273: {
+ 'name': 'StripOffsets',
+ 'type': 'Long'
+ },
+ 274: {
+ 'name': 'Orientation',
+ 'type': 'Short'
+ },
+ 277: {
+ 'name': 'SamplesPerPixel',
+ 'type': 'Short'
+ },
+ 278: {
+ 'name': 'RowsPerStrip',
+ 'type': 'Long'
+ },
+ 279: {
+ 'name': 'StripByteCounts',
+ 'type': 'Long'
+ },
+ 282: {
+ 'name': 'XResolution',
+ 'type': 'Rational'
+ },
+ 283: {
+ 'name': 'YResolution',
+ 'type': 'Rational'
+ },
+ 284: {
+ 'name': 'PlanarConfiguration',
+ 'type': 'Short'
+ },
+ 290: {
+ 'name': 'GrayResponseUnit',
+ 'type': 'Short'
+ },
+ 291: {
+ 'name': 'GrayResponseCurve',
+ 'type': 'Short'
+ },
+ 292: {
+ 'name': 'T4Options',
+ 'type': 'Long'
+ },
+ 293: {
+ 'name': 'T6Options',
+ 'type': 'Long'
+ },
+ 296: {
+ 'name': 'ResolutionUnit',
+ 'type': 'Short'
+ },
+ 301: {
+ 'name': 'TransferFunction',
+ 'type': 'Short'
+ },
+ 305: {
+ 'name': 'Software',
+ 'type': 'Ascii'
+ },
+ 306: {
+ 'name': 'DateTime',
+ 'type': 'Ascii'
+ },
+ 315: {
+ 'name': 'Artist',
+ 'type': 'Ascii'
+ },
+ 316: {
+ 'name': 'HostComputer',
+ 'type': 'Ascii'
+ },
+ 317: {
+ 'name': 'Predictor',
+ 'type': 'Short'
+ },
+ 318: {
+ 'name': 'WhitePoint',
+ 'type': 'Rational'
+ },
+ 319: {
+ 'name': 'PrimaryChromaticities',
+ 'type': 'Rational'
+ },
+ 320: {
+ 'name': 'ColorMap',
+ 'type': 'Short'
+ },
+ 321: {
+ 'name': 'HalftoneHints',
+ 'type': 'Short'
+ },
+ 322: {
+ 'name': 'TileWidth',
+ 'type': 'Short'
+ },
+ 323: {
+ 'name': 'TileLength',
+ 'type': 'Short'
+ },
+ 324: {
+ 'name': 'TileOffsets',
+ 'type': 'Short'
+ },
+ 325: {
+ 'name': 'TileByteCounts',
+ 'type': 'Short'
+ },
+ 330: {
+ 'name': 'SubIFDs',
+ 'type': 'Long'
+ },
+ 332: {
+ 'name': 'InkSet',
+ 'type': 'Short'
+ },
+ 333: {
+ 'name': 'InkNames',
+ 'type': 'Ascii'
+ },
+ 334: {
+ 'name': 'NumberOfInks',
+ 'type': 'Short'
+ },
+ 336: {
+ 'name': 'DotRange',
+ 'type': 'Byte'
+ },
+ 337: {
+ 'name': 'TargetPrinter',
+ 'type': 'Ascii'
+ },
+ 338: {
+ 'name': 'ExtraSamples',
+ 'type': 'Short'
+ },
+ 339: {
+ 'name': 'SampleFormat',
+ 'type': 'Short'
+ },
+ 340: {
+ 'name': 'SMinSampleValue',
+ 'type': 'Short'
+ },
+ 341: {
+ 'name': 'SMaxSampleValue',
+ 'type': 'Short'
+ },
+ 342: {
+ 'name': 'TransferRange',
+ 'type': 'Short'
+ },
+ 343: {
+ 'name': 'ClipPath',
+ 'type': 'Byte'
+ },
+ 344: {
+ 'name': 'XClipPathUnits',
+ 'type': 'Long'
+ },
+ 345: {
+ 'name': 'YClipPathUnits',
+ 'type': 'Long'
+ },
+ 346: {
+ 'name': 'Indexed',
+ 'type': 'Short'
+ },
+ 347: {
+ 'name': 'JPEGTables',
+ 'type': 'Undefined'
+ },
+ 351: {
+ 'name': 'OPIProxy',
+ 'type': 'Short'
+ },
+ 512: {
+ 'name': 'JPEGProc',
+ 'type': 'Long'
+ },
+ 513: {
+ 'name': 'JPEGInterchangeFormat',
+ 'type': 'Long'
+ },
+ 514: {
+ 'name': 'JPEGInterchangeFormatLength',
+ 'type': 'Long'
+ },
+ 515: {
+ 'name': 'JPEGRestartInterval',
+ 'type': 'Short'
+ },
+ 517: {
+ 'name': 'JPEGLosslessPredictors',
+ 'type': 'Short'
+ },
+ 518: {
+ 'name': 'JPEGPointTransforms',
+ 'type': 'Short'
+ },
+ 519: {
+ 'name': 'JPEGQTables',
+ 'type': 'Long'
+ },
+ 520: {
+ 'name': 'JPEGDCTables',
+ 'type': 'Long'
+ },
+ 521: {
+ 'name': 'JPEGACTables',
+ 'type': 'Long'
+ },
+ 529: {
+ 'name': 'YCbCrCoefficients',
+ 'type': 'Rational'
+ },
+ 530: {
+ 'name': 'YCbCrSubSampling',
+ 'type': 'Short'
+ },
+ 531: {
+ 'name': 'YCbCrPositioning',
+ 'type': 'Short'
+ },
+ 532: {
+ 'name': 'ReferenceBlackWhite',
+ 'type': 'Rational'
+ },
+ 700: {
+ 'name': 'XMLPacket',
+ 'type': 'Byte'
+ },
+ 18246: {
+ 'name': 'Rating',
+ 'type': 'Short'
+ },
+ 18249: {
+ 'name': 'RatingPercent',
+ 'type': 'Short'
+ },
+ 32781: {
+ 'name': 'ImageID',
+ 'type': 'Ascii'
+ },
+ 33421: {
+ 'name': 'CFARepeatPatternDim',
+ 'type': 'Short'
+ },
+ 33422: {
+ 'name': 'CFAPattern',
+ 'type': 'Byte'
+ },
+ 33423: {
+ 'name': 'BatteryLevel',
+ 'type': 'Rational'
+ },
+ 33432: {
+ 'name': 'Copyright',
+ 'type': 'Ascii'
+ },
+ 33434: {
+ 'name': 'ExposureTime',
+ 'type': 'Rational'
+ },
+ 34377: {
+ 'name': 'ImageResources',
+ 'type': 'Byte'
+ },
+ 34665: {
+ 'name': 'ExifTag',
+ 'type': 'Long'
+ },
+ 34675: {
+ 'name': 'InterColorProfile',
+ 'type': 'Undefined'
+ },
+ 34853: {
+ 'name': 'GPSTag',
+ 'type': 'Long'
+ },
+ 34857: {
+ 'name': 'Interlace',
+ 'type': 'Short'
+ },
+ 34858: {
+ 'name': 'TimeZoneOffset',
+ 'type': 'Long'
+ },
+ 34859: {
+ 'name': 'SelfTimerMode',
+ 'type': 'Short'
+ },
+ 37387: {
+ 'name': 'FlashEnergy',
+ 'type': 'Rational'
+ },
+ 37388: {
+ 'name': 'SpatialFrequencyResponse',
+ 'type': 'Undefined'
+ },
+ 37389: {
+ 'name': 'Noise',
+ 'type': 'Undefined'
+ },
+ 37390: {
+ 'name': 'FocalPlaneXResolution',
+ 'type': 'Rational'
+ },
+ 37391: {
+ 'name': 'FocalPlaneYResolution',
+ 'type': 'Rational'
+ },
+ 37392: {
+ 'name': 'FocalPlaneResolutionUnit',
+ 'type': 'Short'
+ },
+ 37393: {
+ 'name': 'ImageNumber',
+ 'type': 'Long'
+ },
+ 37394: {
+ 'name': 'SecurityClassification',
+ 'type': 'Ascii'
+ },
+ 37395: {
+ 'name': 'ImageHistory',
+ 'type': 'Ascii'
+ },
+ 37397: {
+ 'name': 'ExposureIndex',
+ 'type': 'Rational'
+ },
+ 37398: {
+ 'name': 'TIFFEPStandardID',
+ 'type': 'Byte'
+ },
+ 37399: {
+ 'name': 'SensingMethod',
+ 'type': 'Short'
+ },
+ 40091: {
+ 'name': 'XPTitle',
+ 'type': 'Byte'
+ },
+ 40092: {
+ 'name': 'XPComment',
+ 'type': 'Byte'
+ },
+ 40093: {
+ 'name': 'XPAuthor',
+ 'type': 'Byte'
+ },
+ 40094: {
+ 'name': 'XPKeywords',
+ 'type': 'Byte'
+ },
+ 40095: {
+ 'name': 'XPSubject',
+ 'type': 'Byte'
+ },
+ 50341: {
+ 'name': 'PrintImageMatching',
+ 'type': 'Undefined'
+ },
+ 50706: {
+ 'name': 'DNGVersion',
+ 'type': 'Byte'
+ },
+ 50707: {
+ 'name': 'DNGBackwardVersion',
+ 'type': 'Byte'
+ },
+ 50708: {
+ 'name': 'UniqueCameraModel',
+ 'type': 'Ascii'
+ },
+ 50709: {
+ 'name': 'LocalizedCameraModel',
+ 'type': 'Byte'
+ },
+ 50710: {
+ 'name': 'CFAPlaneColor',
+ 'type': 'Byte'
+ },
+ 50711: {
+ 'name': 'CFALayout',
+ 'type': 'Short'
+ },
+ 50712: {
+ 'name': 'LinearizationTable',
+ 'type': 'Short'
+ },
+ 50713: {
+ 'name': 'BlackLevelRepeatDim',
+ 'type': 'Short'
+ },
+ 50714: {
+ 'name': 'BlackLevel',
+ 'type': 'Rational'
+ },
+ 50715: {
+ 'name': 'BlackLevelDeltaH',
+ 'type': 'SRational'
+ },
+ 50716: {
+ 'name': 'BlackLevelDeltaV',
+ 'type': 'SRational'
+ },
+ 50717: {
+ 'name': 'WhiteLevel',
+ 'type': 'Short'
+ },
+ 50718: {
+ 'name': 'DefaultScale',
+ 'type': 'Rational'
+ },
+ 50719: {
+ 'name': 'DefaultCropOrigin',
+ 'type': 'Short'
+ },
+ 50720: {
+ 'name': 'DefaultCropSize',
+ 'type': 'Short'
+ },
+ 50721: {
+ 'name': 'ColorMatrix1',
+ 'type': 'SRational'
+ },
+ 50722: {
+ 'name': 'ColorMatrix2',
+ 'type': 'SRational'
+ },
+ 50723: {
+ 'name': 'CameraCalibration1',
+ 'type': 'SRational'
+ },
+ 50724: {
+ 'name': 'CameraCalibration2',
+ 'type': 'SRational'
+ },
+ 50725: {
+ 'name': 'ReductionMatrix1',
+ 'type': 'SRational'
+ },
+ 50726: {
+ 'name': 'ReductionMatrix2',
+ 'type': 'SRational'
+ },
+ 50727: {
+ 'name': 'AnalogBalance',
+ 'type': 'Rational'
+ },
+ 50728: {
+ 'name': 'AsShotNeutral',
+ 'type': 'Short'
+ },
+ 50729: {
+ 'name': 'AsShotWhiteXY',
+ 'type': 'Rational'
+ },
+ 50730: {
+ 'name': 'BaselineExposure',
+ 'type': 'SRational'
+ },
+ 50731: {
+ 'name': 'BaselineNoise',
+ 'type': 'Rational'
+ },
+ 50732: {
+ 'name': 'BaselineSharpness',
+ 'type': 'Rational'
+ },
+ 50733: {
+ 'name': 'BayerGreenSplit',
+ 'type': 'Long'
+ },
+ 50734: {
+ 'name': 'LinearResponseLimit',
+ 'type': 'Rational'
+ },
+ 50735: {
+ 'name': 'CameraSerialNumber',
+ 'type': 'Ascii'
+ },
+ 50736: {
+ 'name': 'LensInfo',
+ 'type': 'Rational'
+ },
+ 50737: {
+ 'name': 'ChromaBlurRadius',
+ 'type': 'Rational'
+ },
+ 50738: {
+ 'name': 'AntiAliasStrength',
+ 'type': 'Rational'
+ },
+ 50739: {
+ 'name': 'ShadowScale',
+ 'type': 'SRational'
+ },
+ 50740: {
+ 'name': 'DNGPrivateData',
+ 'type': 'Byte'
+ },
+ 50741: {
+ 'name': 'MakerNoteSafety',
+ 'type': 'Short'
+ },
+ 50778: {
+ 'name': 'CalibrationIlluminant1',
+ 'type': 'Short'
+ },
+ 50779: {
+ 'name': 'CalibrationIlluminant2',
+ 'type': 'Short'
+ },
+ 50780: {
+ 'name': 'BestQualityScale',
+ 'type': 'Rational'
+ },
+ 50781: {
+ 'name': 'RawDataUniqueID',
+ 'type': 'Byte'
+ },
+ 50827: {
+ 'name': 'OriginalRawFileName',
+ 'type': 'Byte'
+ },
+ 50828: {
+ 'name': 'OriginalRawFileData',
+ 'type': 'Undefined'
+ },
+ 50829: {
+ 'name': 'ActiveArea',
+ 'type': 'Short'
+ },
+ 50830: {
+ 'name': 'MaskedAreas',
+ 'type': 'Short'
+ },
+ 50831: {
+ 'name': 'AsShotICCProfile',
+ 'type': 'Undefined'
+ },
+ 50832: {
+ 'name': 'AsShotPreProfileMatrix',
+ 'type': 'SRational'
+ },
+ 50833: {
+ 'name': 'CurrentICCProfile',
+ 'type': 'Undefined'
+ },
+ 50834: {
+ 'name': 'CurrentPreProfileMatrix',
+ 'type': 'SRational'
+ },
+ 50879: {
+ 'name': 'ColorimetricReference',
+ 'type': 'Short'
+ },
+ 50931: {
+ 'name': 'CameraCalibrationSignature',
+ 'type': 'Byte'
+ },
+ 50932: {
+ 'name': 'ProfileCalibrationSignature',
+ 'type': 'Byte'
+ },
+ 50934: {
+ 'name': 'AsShotProfileName',
+ 'type': 'Byte'
+ },
+ 50935: {
+ 'name': 'NoiseReductionApplied',
+ 'type': 'Rational'
+ },
+ 50936: {
+ 'name': 'ProfileName',
+ 'type': 'Byte'
+ },
+ 50937: {
+ 'name': 'ProfileHueSatMapDims',
+ 'type': 'Long'
+ },
+ 50938: {
+ 'name': 'ProfileHueSatMapData1',
+ 'type': 'Float'
+ },
+ 50939: {
+ 'name': 'ProfileHueSatMapData2',
+ 'type': 'Float'
+ },
+ 50940: {
+ 'name': 'ProfileToneCurve',
+ 'type': 'Float'
+ },
+ 50941: {
+ 'name': 'ProfileEmbedPolicy',
+ 'type': 'Long'
+ },
+ 50942: {
+ 'name': 'ProfileCopyright',
+ 'type': 'Byte'
+ },
+ 50964: {
+ 'name': 'ForwardMatrix1',
+ 'type': 'SRational'
+ },
+ 50965: {
+ 'name': 'ForwardMatrix2',
+ 'type': 'SRational'
+ },
+ 50966: {
+ 'name': 'PreviewApplicationName',
+ 'type': 'Byte'
+ },
+ 50967: {
+ 'name': 'PreviewApplicationVersion',
+ 'type': 'Byte'
+ },
+ 50968: {
+ 'name': 'PreviewSettingsName',
+ 'type': 'Byte'
+ },
+ 50969: {
+ 'name': 'PreviewSettingsDigest',
+ 'type': 'Byte'
+ },
+ 50970: {
+ 'name': 'PreviewColorSpace',
+ 'type': 'Long'
+ },
+ 50971: {
+ 'name': 'PreviewDateTime',
+ 'type': 'Ascii'
+ },
+ 50972: {
+ 'name': 'RawImageDigest',
+ 'type': 'Undefined'
+ },
+ 50973: {
+ 'name': 'OriginalRawFileDigest',
+ 'type': 'Undefined'
+ },
+ 50974: {
+ 'name': 'SubTileBlockSize',
+ 'type': 'Long'
+ },
+ 50975: {
+ 'name': 'RowInterleaveFactor',
+ 'type': 'Long'
+ },
+ 50981: {
+ 'name': 'ProfileLookTableDims',
+ 'type': 'Long'
+ },
+ 50982: {
+ 'name': 'ProfileLookTableData',
+ 'type': 'Float'
+ },
+ 51008: {
+ 'name': 'OpcodeList1',
+ 'type': 'Undefined'
+ },
+ 51009: {
+ 'name': 'OpcodeList2',
+ 'type': 'Undefined'
+ },
+ 51022: {
+ 'name': 'OpcodeList3',
+ 'type': 'Undefined'
+ }
+ },
+ 'Exif': {
+ 33434: {
+ 'name': 'ExposureTime',
+ 'type': 'Rational'
+ },
+ 33437: {
+ 'name': 'FNumber',
+ 'type': 'Rational'
+ },
+ 34850: {
+ 'name': 'ExposureProgram',
+ 'type': 'Short'
+ },
+ 34852: {
+ 'name': 'SpectralSensitivity',
+ 'type': 'Ascii'
+ },
+ 34855: {
+ 'name': 'ISOSpeedRatings',
+ 'type': 'Short'
+ },
+ 34856: {
+ 'name': 'OECF',
+ 'type': 'Undefined'
+ },
+ 34864: {
+ 'name': 'SensitivityType',
+ 'type': 'Short'
+ },
+ 34865: {
+ 'name': 'StandardOutputSensitivity',
+ 'type': 'Long'
+ },
+ 34866: {
+ 'name': 'RecommendedExposureIndex',
+ 'type': 'Long'
+ },
+ 34867: {
+ 'name': 'ISOSpeed',
+ 'type': 'Long'
+ },
+ 34868: {
+ 'name': 'ISOSpeedLatitudeyyy',
+ 'type': 'Long'
+ },
+ 34869: {
+ 'name': 'ISOSpeedLatitudezzz',
+ 'type': 'Long'
+ },
+ 36864: {
+ 'name': 'ExifVersion',
+ 'type': 'Undefined'
+ },
+ 36867: {
+ 'name': 'DateTimeOriginal',
+ 'type': 'Ascii'
+ },
+ 36868: {
+ 'name': 'DateTimeDigitized',
+ 'type': 'Ascii'
+ },
+ 37121: {
+ 'name': 'ComponentsConfiguration',
+ 'type': 'Undefined'
+ },
+ 37122: {
+ 'name': 'CompressedBitsPerPixel',
+ 'type': 'Rational'
+ },
+ 37377: {
+ 'name': 'ShutterSpeedValue',
+ 'type': 'SRational'
+ },
+ 37378: {
+ 'name': 'ApertureValue',
+ 'type': 'Rational'
+ },
+ 37379: {
+ 'name': 'BrightnessValue',
+ 'type': 'SRational'
+ },
+ 37380: {
+ 'name': 'ExposureBiasValue',
+ 'type': 'SRational'
+ },
+ 37381: {
+ 'name': 'MaxApertureValue',
+ 'type': 'Rational'
+ },
+ 37382: {
+ 'name': 'SubjectDistance',
+ 'type': 'Rational'
+ },
+ 37383: {
+ 'name': 'MeteringMode',
+ 'type': 'Short'
+ },
+ 37384: {
+ 'name': 'LightSource',
+ 'type': 'Short'
+ },
+ 37385: {
+ 'name': 'Flash',
+ 'type': 'Short'
+ },
+ 37386: {
+ 'name': 'FocalLength',
+ 'type': 'Rational'
+ },
+ 37396: {
+ 'name': 'SubjectArea',
+ 'type': 'Short'
+ },
+ 37500: {
+ 'name': 'MakerNote',
+ 'type': 'Undefined'
+ },
+ 37510: {
+ 'name': 'UserComment',
+ 'type': 'Ascii'
+ },
+ 37520: {
+ 'name': 'SubSecTime',
+ 'type': 'Ascii'
+ },
+ 37521: {
+ 'name': 'SubSecTimeOriginal',
+ 'type': 'Ascii'
+ },
+ 37522: {
+ 'name': 'SubSecTimeDigitized',
+ 'type': 'Ascii'
+ },
+ 40960: {
+ 'name': 'FlashpixVersion',
+ 'type': 'Undefined'
+ },
+ 40961: {
+ 'name': 'ColorSpace',
+ 'type': 'Short'
+ },
+ 40962: {
+ 'name': 'PixelXDimension',
+ 'type': 'Long'
+ },
+ 40963: {
+ 'name': 'PixelYDimension',
+ 'type': 'Long'
+ },
+ 40964: {
+ 'name': 'RelatedSoundFile',
+ 'type': 'Ascii'
+ },
+ 40965: {
+ 'name': 'InteroperabilityTag',
+ 'type': 'Long'
+ },
+ 41483: {
+ 'name': 'FlashEnergy',
+ 'type': 'Rational'
+ },
+ 41484: {
+ 'name': 'SpatialFrequencyResponse',
+ 'type': 'Undefined'
+ },
+ 41486: {
+ 'name': 'FocalPlaneXResolution',
+ 'type': 'Rational'
+ },
+ 41487: {
+ 'name': 'FocalPlaneYResolution',
+ 'type': 'Rational'
+ },
+ 41488: {
+ 'name': 'FocalPlaneResolutionUnit',
+ 'type': 'Short'
+ },
+ 41492: {
+ 'name': 'SubjectLocation',
+ 'type': 'Short'
+ },
+ 41493: {
+ 'name': 'ExposureIndex',
+ 'type': 'Rational'
+ },
+ 41495: {
+ 'name': 'SensingMethod',
+ 'type': 'Short'
+ },
+ 41728: {
+ 'name': 'FileSource',
+ 'type': 'Undefined'
+ },
+ 41729: {
+ 'name': 'SceneType',
+ 'type': 'Undefined'
+ },
+ 41730: {
+ 'name': 'CFAPattern',
+ 'type': 'Undefined'
+ },
+ 41985: {
+ 'name': 'CustomRendered',
+ 'type': 'Short'
+ },
+ 41986: {
+ 'name': 'ExposureMode',
+ 'type': 'Short'
+ },
+ 41987: {
+ 'name': 'WhiteBalance',
+ 'type': 'Short'
+ },
+ 41988: {
+ 'name': 'DigitalZoomRatio',
+ 'type': 'Rational'
+ },
+ 41989: {
+ 'name': 'FocalLengthIn35mmFilm',
+ 'type': 'Short'
+ },
+ 41990: {
+ 'name': 'SceneCaptureType',
+ 'type': 'Short'
+ },
+ 41991: {
+ 'name': 'GainControl',
+ 'type': 'Short'
+ },
+ 41992: {
+ 'name': 'Contrast',
+ 'type': 'Short'
+ },
+ 41993: {
+ 'name': 'Saturation',
+ 'type': 'Short'
+ },
+ 41994: {
+ 'name': 'Sharpness',
+ 'type': 'Short'
+ },
+ 41995: {
+ 'name': 'DeviceSettingDescription',
+ 'type': 'Undefined'
+ },
+ 41996: {
+ 'name': 'SubjectDistanceRange',
+ 'type': 'Short'
+ },
+ 42016: {
+ 'name': 'ImageUniqueID',
+ 'type': 'Ascii'
+ },
+ 42032: {
+ 'name': 'CameraOwnerName',
+ 'type': 'Ascii'
+ },
+ 42033: {
+ 'name': 'BodySerialNumber',
+ 'type': 'Ascii'
+ },
+ 42034: {
+ 'name': 'LensSpecification',
+ 'type': 'Rational'
+ },
+ 42035: {
+ 'name': 'LensMake',
+ 'type': 'Ascii'
+ },
+ 42036: {
+ 'name': 'LensModel',
+ 'type': 'Ascii'
+ },
+ 42037: {
+ 'name': 'LensSerialNumber',
+ 'type': 'Ascii'
+ },
+ 42240: {
+ 'name': 'Gamma',
+ 'type': 'Rational'
+ }
+ },
+ 'GPS': {
+ 0: {
+ 'name': 'GPSVersionID',
+ 'type': 'Byte'
+ },
+ 1: {
+ 'name': 'GPSLatitudeRef',
+ 'type': 'Ascii'
+ },
+ 2: {
+ 'name': 'GPSLatitude',
+ 'type': 'Rational'
+ },
+ 3: {
+ 'name': 'GPSLongitudeRef',
+ 'type': 'Ascii'
+ },
+ 4: {
+ 'name': 'GPSLongitude',
+ 'type': 'Rational'
+ },
+ 5: {
+ 'name': 'GPSAltitudeRef',
+ 'type': 'Byte'
+ },
+ 6: {
+ 'name': 'GPSAltitude',
+ 'type': 'Rational'
+ },
+ 7: {
+ 'name': 'GPSTimeStamp',
+ 'type': 'Rational'
+ },
+ 8: {
+ 'name': 'GPSSatellites',
+ 'type': 'Ascii'
+ },
+ 9: {
+ 'name': 'GPSStatus',
+ 'type': 'Ascii'
+ },
+ 10: {
+ 'name': 'GPSMeasureMode',
+ 'type': 'Ascii'
+ },
+ 11: {
+ 'name': 'GPSDOP',
+ 'type': 'Rational'
+ },
+ 12: {
+ 'name': 'GPSSpeedRef',
+ 'type': 'Ascii'
+ },
+ 13: {
+ 'name': 'GPSSpeed',
+ 'type': 'Rational'
+ },
+ 14: {
+ 'name': 'GPSTrackRef',
+ 'type': 'Ascii'
+ },
+ 15: {
+ 'name': 'GPSTrack',
+ 'type': 'Rational'
+ },
+ 16: {
+ 'name': 'GPSImgDirectionRef',
+ 'type': 'Ascii'
+ },
+ 17: {
+ 'name': 'GPSImgDirection',
+ 'type': 'Rational'
+ },
+ 18: {
+ 'name': 'GPSMapDatum',
+ 'type': 'Ascii'
+ },
+ 19: {
+ 'name': 'GPSDestLatitudeRef',
+ 'type': 'Ascii'
+ },
+ 20: {
+ 'name': 'GPSDestLatitude',
+ 'type': 'Rational'
+ },
+ 21: {
+ 'name': 'GPSDestLongitudeRef',
+ 'type': 'Ascii'
+ },
+ 22: {
+ 'name': 'GPSDestLongitude',
+ 'type': 'Rational'
+ },
+ 23: {
+ 'name': 'GPSDestBearingRef',
+ 'type': 'Ascii'
+ },
+ 24: {
+ 'name': 'GPSDestBearing',
+ 'type': 'Rational'
+ },
+ 25: {
+ 'name': 'GPSDestDistanceRef',
+ 'type': 'Ascii'
+ },
+ 26: {
+ 'name': 'GPSDestDistance',
+ 'type': 'Rational'
+ },
+ 27: {
+ 'name': 'GPSProcessingMethod',
+ 'type': 'Undefined'
+ },
+ 28: {
+ 'name': 'GPSAreaInformation',
+ 'type': 'Undefined'
+ },
+ 29: {
+ 'name': 'GPSDateStamp',
+ 'type': 'Ascii'
+ },
+ 30: {
+ 'name': 'GPSDifferential',
+ 'type': 'Short'
+ },
+ 31: {
+ 'name': 'GPSHPositioningError',
+ 'type': 'Rational'
+ }
+ },
+ 'Interop': {
+ 1: {
+ 'name': 'InteroperabilityIndex',
+ 'type': 'Ascii'
+ }
+ },
+};
+const TYPES = {
+ "Byte": 1,
+ "Ascii": 2,
+ "Short": 3,
+ "Long": 4,
+ "Rational": 5,
+ "Undefined": 7,
+ "SLong": 9,
+ "SRational": 10
+};
+TAGS["0th"] = TAGS["Image"];
+TAGS["1st"] = TAGS["Image"];
+class Piexif {
+ version = "1.0.4"
+ TAGS = TAGS
+ ImageIFD = {
+ ProcessingSoftware: 11,
+ NewSubfileType: 254,
+ SubfileType: 255,
+ ImageWidth: 256,
+ ImageLength: 257,
+ BitsPerSample: 258,
+ Compression: 259,
+ PhotometricInterpretation: 262,
+ Threshholding: 263,
+ CellWidth: 264,
+ CellLength: 265,
+ FillOrder: 266,
+ DocumentName: 269,
+ ImageDescription: 270,
+ Make: 271,
+ Model: 272,
+ StripOffsets: 273,
+ Orientation: 274,
+ SamplesPerPixel: 277,
+ RowsPerStrip: 278,
+ StripByteCounts: 279,
+ XResolution: 282,
+ YResolution: 283,
+ PlanarConfiguration: 284,
+ GrayResponseUnit: 290,
+ GrayResponseCurve: 291,
+ T4Options: 292,
+ T6Options: 293,
+ ResolutionUnit: 296,
+ TransferFunction: 301,
+ Software: 305,
+ DateTime: 306,
+ Artist: 315,
+ HostComputer: 316,
+ Predictor: 317,
+ WhitePoint: 318,
+ PrimaryChromaticities: 319,
+ ColorMap: 320,
+ HalftoneHints: 321,
+ TileWidth: 322,
+ TileLength: 323,
+ TileOffsets: 324,
+ TileByteCounts: 325,
+ SubIFDs: 330,
+ InkSet: 332,
+ InkNames: 333,
+ NumberOfInks: 334,
+ DotRange: 336,
+ TargetPrinter: 337,
+ ExtraSamples: 338,
+ SampleFormat: 339,
+ SMinSampleValue: 340,
+ SMaxSampleValue: 341,
+ TransferRange: 342,
+ ClipPath: 343,
+ XClipPathUnits: 344,
+ YClipPathUnits: 345,
+ Indexed: 346,
+ JPEGTables: 347,
+ OPIProxy: 351,
+ JPEGProc: 512,
+ JPEGInterchangeFormat: 513,
+ JPEGInterchangeFormatLength: 514,
+ JPEGRestartInterval: 515,
+ JPEGLosslessPredictors: 517,
+ JPEGPointTransforms: 518,
+ JPEGQTables: 519,
+ JPEGDCTables: 520,
+ JPEGACTables: 521,
+ YCbCrCoefficients: 529,
+ YCbCrSubSampling: 530,
+ YCbCrPositioning: 531,
+ ReferenceBlackWhite: 532,
+ XMLPacket: 700,
+ Rating: 18246,
+ RatingPercent: 18249,
+ ImageID: 32781,
+ CFARepeatPatternDim: 33421,
+ CFAPattern: 33422,
+ BatteryLevel: 33423,
+ Copyright: 33432,
+ ExposureTime: 33434,
+ ImageResources: 34377,
+ ExifTag: 34665,
+ InterColorProfile: 34675,
+ GPSTag: 34853,
+ Interlace: 34857,
+ TimeZoneOffset: 34858,
+ SelfTimerMode: 34859,
+ FlashEnergy: 37387,
+ SpatialFrequencyResponse: 37388,
+ Noise: 37389,
+ FocalPlaneXResolution: 37390,
+ FocalPlaneYResolution: 37391,
+ FocalPlaneResolutionUnit: 37392,
+ ImageNumber: 37393,
+ SecurityClassification: 37394,
+ ImageHistory: 37395,
+ ExposureIndex: 37397,
+ TIFFEPStandardID: 37398,
+ SensingMethod: 37399,
+ XPTitle: 40091,
+ XPComment: 40092,
+ XPAuthor: 40093,
+ XPKeywords: 40094,
+ XPSubject: 40095,
+ PrintImageMatching: 50341,
+ DNGVersion: 50706,
+ DNGBackwardVersion: 50707,
+ UniqueCameraModel: 50708,
+ LocalizedCameraModel: 50709,
+ CFAPlaneColor: 50710,
+ CFALayout: 50711,
+ LinearizationTable: 50712,
+ BlackLevelRepeatDim: 50713,
+ BlackLevel: 50714,
+ BlackLevelDeltaH: 50715,
+ BlackLevelDeltaV: 50716,
+ WhiteLevel: 50717,
+ DefaultScale: 50718,
+ DefaultCropOrigin: 50719,
+ DefaultCropSize: 50720,
+ ColorMatrix1: 50721,
+ ColorMatrix2: 50722,
+ CameraCalibration1: 50723,
+ CameraCalibration2: 50724,
+ ReductionMatrix1: 50725,
+ ReductionMatrix2: 50726,
+ AnalogBalance: 50727,
+ AsShotNeutral: 50728,
+ AsShotWhiteXY: 50729,
+ BaselineExposure: 50730,
+ BaselineNoise: 50731,
+ BaselineSharpness: 50732,
+ BayerGreenSplit: 50733,
+ LinearResponseLimit: 50734,
+ CameraSerialNumber: 50735,
+ LensInfo: 50736,
+ ChromaBlurRadius: 50737,
+ AntiAliasStrength: 50738,
+ ShadowScale: 50739,
+ DNGPrivateData: 50740,
+ MakerNoteSafety: 50741,
+ CalibrationIlluminant1: 50778,
+ CalibrationIlluminant2: 50779,
+ BestQualityScale: 50780,
+ RawDataUniqueID: 50781,
+ OriginalRawFileName: 50827,
+ OriginalRawFileData: 50828,
+ ActiveArea: 50829,
+ MaskedAreas: 50830,
+ AsShotICCProfile: 50831,
+ AsShotPreProfileMatrix: 50832,
+ CurrentICCProfile: 50833,
+ CurrentPreProfileMatrix: 50834,
+ ColorimetricReference: 50879,
+ CameraCalibrationSignature: 50931,
+ ProfileCalibrationSignature: 50932,
+ AsShotProfileName: 50934,
+ NoiseReductionApplied: 50935,
+ ProfileName: 50936,
+ ProfileHueSatMapDims: 50937,
+ ProfileHueSatMapData1: 50938,
+ ProfileHueSatMapData2: 50939,
+ ProfileToneCurve: 50940,
+ ProfileEmbedPolicy: 50941,
+ ProfileCopyright: 50942,
+ ForwardMatrix1: 50964,
+ ForwardMatrix2: 50965,
+ PreviewApplicationName: 50966,
+ PreviewApplicationVersion: 50967,
+ PreviewSettingsName: 50968,
+ PreviewSettingsDigest: 50969,
+ PreviewColorSpace: 50970,
+ PreviewDateTime: 50971,
+ RawImageDigest: 50972,
+ OriginalRawFileDigest: 50973,
+ SubTileBlockSize: 50974,
+ RowInterleaveFactor: 50975,
+ ProfileLookTableDims: 50981,
+ ProfileLookTableData: 50982,
+ OpcodeList1: 51008,
+ OpcodeList2: 51009,
+ OpcodeList3: 51022,
+ NoiseProfile: 51041,
+ }
+ ExifIFD = {
+ ExposureTime: 33434,
+ FNumber: 33437,
+ ExposureProgram: 34850,
+ SpectralSensitivity: 34852,
+ ISOSpeedRatings: 34855,
+ OECF: 34856,
+ SensitivityType: 34864,
+ StandardOutputSensitivity: 34865,
+ RecommendedExposureIndex: 34866,
+ ISOSpeed: 34867,
+ ISOSpeedLatitudeyyy: 34868,
+ ISOSpeedLatitudezzz: 34869,
+ ExifVersion: 36864,
+ DateTimeOriginal: 36867,
+ DateTimeDigitized: 36868,
+ ComponentsConfiguration: 37121,
+ CompressedBitsPerPixel: 37122,
+ ShutterSpeedValue: 37377,
+ ApertureValue: 37378,
+ BrightnessValue: 37379,
+ ExposureBiasValue: 37380,
+ MaxApertureValue: 37381,
+ SubjectDistance: 37382,
+ MeteringMode: 37383,
+ LightSource: 37384,
+ Flash: 37385,
+ FocalLength: 37386,
+ SubjectArea: 37396,
+ MakerNote: 37500,
+ UserComment: 37510,
+ SubSecTime: 37520,
+ SubSecTimeOriginal: 37521,
+ SubSecTimeDigitized: 37522,
+ FlashpixVersion: 40960,
+ ColorSpace: 40961,
+ PixelXDimension: 40962,
+ PixelYDimension: 40963,
+ RelatedSoundFile: 40964,
+ InteroperabilityTag: 40965,
+ FlashEnergy: 41483,
+ SpatialFrequencyResponse: 41484,
+ FocalPlaneXResolution: 41486,
+ FocalPlaneYResolution: 41487,
+ FocalPlaneResolutionUnit: 41488,
+ SubjectLocation: 41492,
+ ExposureIndex: 41493,
+ SensingMethod: 41495,
+ FileSource: 41728,
+ SceneType: 41729,
+ CFAPattern: 41730,
+ CustomRendered: 41985,
+ ExposureMode: 41986,
+ WhiteBalance: 41987,
+ DigitalZoomRatio: 41988,
+ FocalLengthIn35mmFilm: 41989,
+ SceneCaptureType: 41990,
+ GainControl: 41991,
+ Contrast: 41992,
+ Saturation: 41993,
+ Sharpness: 41994,
+ DeviceSettingDescription: 41995,
+ SubjectDistanceRange: 41996,
+ ImageUniqueID: 42016,
+ CameraOwnerName: 42032,
+ BodySerialNumber: 42033,
+ LensSpecification: 42034,
+ LensMake: 42035,
+ LensModel: 42036,
+ LensSerialNumber: 42037,
+ Gamma: 42240,
+ }
+ GPSIFD = {
+ GPSVersionID: 0,
+ GPSLatitudeRef: 1,
+ GPSLatitude: 2,
+ GPSLongitudeRef: 3,
+ GPSLongitude: 4,
+ GPSAltitudeRef: 5,
+ GPSAltitude: 6,
+ GPSTimeStamp: 7,
+ GPSSatellites: 8,
+ GPSStatus: 9,
+ GPSMeasureMode: 10,
+ GPSDOP: 11,
+ GPSSpeedRef: 12,
+ GPSSpeed: 13,
+ GPSTrackRef: 14,
+ GPSTrack: 15,
+ GPSImgDirectionRef: 16,
+ GPSImgDirection: 17,
+ GPSMapDatum: 18,
+ GPSDestLatitudeRef: 19,
+ GPSDestLatitude: 20,
+ GPSDestLongitudeRef: 21,
+ GPSDestLongitude: 22,
+ GPSDestBearingRef: 23,
+ GPSDestBearing: 24,
+ GPSDestDistanceRef: 25,
+ GPSDestDistance: 26,
+ GPSProcessingMethod: 27,
+ GPSAreaInformation: 28,
+ GPSDateStamp: 29,
+ GPSDifferential: 30,
+ GPSHPositioningError: 31,
+ }
+ InteropIFD = {
+ InteroperabilityIndex: 1,
+ }
+ GPSHelper = {
+ degToDmsRational(degFloat : number) {
+ const degAbs = Math.abs(degFloat);
+ const minFloat = degAbs % 1 * 60;
+ const secFloat = minFloat % 1 * 60;
+ const deg = Math.floor(degAbs);
+ const min = Math.floor(minFloat);
+ const sec = Math.round(secFloat * 100);
+
+ return [
+ [deg, 1],
+ [min, 1],
+ [sec, 100]
+ ];
+ },
+ dmsRationalToDeg(dmsArray : number[][], ref : string) {
+ const sign = (ref === 'S' || ref === 'W') ? -1.0 : 1.0;
+ const deg = dmsArray[0][0] / dmsArray[0][1] +
+ dmsArray[1][0] / dmsArray[1][1] / 60.0 +
+ dmsArray[2][0] / dmsArray[2][1] / 3600.0;
+
+ return deg * sign;
+ },
+ }
+ remove(jpeg) {
+ let b64 = false;
+ if (jpeg.slice(0, 2) == "\xff\xd8") { } else if (jpeg.slice(0, 23) == "data:image/jpeg;base64," || jpeg
+ .slice(0, 22) == "data:image/jpg;base64,") {
+ jpeg = atob(jpeg.split(",")[1]);
+ b64 = true;
+ } else {
+ throw new Error("Given data is not jpeg.");
+ }
+
+ const segments = splitIntoSegments(jpeg);
+ const newSegments = segments.filter(function (seg) {
+ return !(seg.slice(0, 2) == "\xff\xe1" &&
+ seg.slice(4, 10) == "Exif\x00\x00");
+ });
+
+ let new_data = newSegments.join("");
+ if (b64) {
+ new_data = "data:image/jpeg;base64," + btoa(new_data);
+ }
+
+ return new_data;
+ }
+ insert(exif, jpeg) {
+ let b64 = false;
+ if (exif.slice(0, 6) != "\x45\x78\x69\x66\x00\x00") {
+ throw new Error("Given data is not exif.");
+ }
+ if (jpeg.slice(0, 2) == "\xff\xd8") { } else if (jpeg.slice(0, 23) == "data:image/jpeg;base64," || jpeg
+ .slice(0, 22) == "data:image/jpg;base64,") {
+ jpeg = atob(jpeg.split(",")[1]);
+ b64 = true;
+ } else {
+ throw new Error("Given data is not jpeg.");
+ }
+
+ const exifStr = "\xff\xe1" + pack(">H", [exif.length + 2]) + exif;
+ const segments = splitIntoSegments(jpeg);
+ let new_data = mergeSegments(segments, exifStr);
+ if (b64) {
+ new_data = "data:image/jpeg;base64," + btoa(new_data);
+ }
+
+ return new_data;
+ }
+ load(data) {
+ let input_data;
+ if (isString(data)) {
+ if (data.slice(0, 2) == "\xff\xd8") {
+ input_data = data;
+ } else if (data.slice(0, 23) == "data:image/jpeg;base64," || data.slice(0, 22) == "data:image/jpg;base64,") {
+ input_data = atob(data.split(",")[1]);
+ } else if (data.slice(0, 4) == "Exif") {
+ input_data = data.slice(6);
+ } else {
+ throw new Error("'load' gots invalid file data.");
+ }
+ } else {
+ throw new Error("'load' gots invalid type argument.");
+ }
+
+ let exifDict = {};
+ let exif_dict = {
+ "0th": {},
+ "Exif": {},
+ "GPS": {},
+ "Interop": {},
+ "1st": {},
+ "thumbnail": null
+ };
+ const exifReader = new ExifReader(input_data);
+ if (exifReader.tiftag === null) {
+ return exif_dict;
+ }
+
+ if (exifReader.tiftag.slice(0, 2) == "\x49\x49") {
+ exifReader.endian_mark = "<";
+ } else {
+ exifReader.endian_mark = ">";
+ }
+
+ let pointer = unpack(exifReader.endian_mark + "L",
+ exifReader.tiftag.slice(4, 8))[0];
+ exif_dict["0th"] = exifReader.get_ifd(pointer, "0th");
+
+ const first_ifd_pointer = exif_dict["0th"]["first_ifd_pointer"];
+ delete exif_dict["0th"]["first_ifd_pointer"];
+
+ if (34665 in exif_dict["0th"]) {
+ pointer = exif_dict["0th"][34665];
+ exif_dict["Exif"] = exifReader.get_ifd(pointer, "Exif");
+ }
+ if (34853 in exif_dict["0th"]) {
+ pointer = exif_dict["0th"][34853];
+ exif_dict["GPS"] = exifReader.get_ifd(pointer, "GPS");
+ }
+ if (40965 in exif_dict["Exif"]) {
+ pointer = exif_dict["Exif"][40965];
+ exif_dict["Interop"] = exifReader.get_ifd(pointer, "Interop");
+ }
+ if (first_ifd_pointer != "\x00\x00\x00\x00") {
+ pointer = unpack(exifReader.endian_mark + "L",
+ first_ifd_pointer)[0];
+ exif_dict["1st"] = exifReader.get_ifd(pointer, "1st");
+ if ((513 in exif_dict["1st"]) && (514 in exif_dict["1st"])) {
+ var end = exif_dict["1st"][513] + exif_dict["1st"][514];
+ var thumb = exifReader.tiftag.slice(exif_dict["1st"][513], end);
+ exif_dict["thumbnail"] = thumb;
+ }
+ }
+
+ return exif_dict;
+ }
+ dump(exif_dict_original) {
+ const TIFF_HEADER_LENGTH = 8;
+
+ const exif_dict : any = cloneDeep(exif_dict_original);
+ const header = "Exif\x00\x00\x4d\x4d\x00\x2a\x00\x00\x00\x08";
+ let exif_is = 0//false;
+ let gps_is = 0 //false;
+ let interop_is = 0//false;
+ let first_is = false;
+
+ let zeroth_ifd,
+ exif_ifd,
+ interop_ifd,
+ gps_ifd,
+ first_ifd;
+
+ if ("0th" in exif_dict) {
+ zeroth_ifd = exif_dict["0th"];
+ } else {
+ zeroth_ifd = {};
+ }
+
+ if ((("Exif" in exif_dict) && (Object.keys(exif_dict["Exif"]).length)) ||
+ (("Interop" in exif_dict) && (Object.keys(exif_dict["Interop"]).length))) {
+ zeroth_ifd[34665] = 1;
+ exif_is = 1//true;
+ exif_ifd = exif_dict["Exif"];
+ if (("Interop" in exif_dict) && Object.keys(exif_dict["Interop"]).length) {
+ exif_ifd[40965] = 1;
+ interop_is = 1//true;
+ interop_ifd = exif_dict["Interop"];
+ } else if (Object.keys(exif_ifd).indexOf(this.ExifIFD.InteroperabilityTag.toString()) > -1) {
+ delete exif_ifd[40965];
+ }
+ } else if (Object.keys(zeroth_ifd).indexOf(this.ImageIFD.ExifTag.toString()) > -1) {
+ delete zeroth_ifd[34665];
+ }
+
+ if (("GPS" in exif_dict) && (Object.keys(exif_dict["GPS"]).length)) {
+ zeroth_ifd[this.ImageIFD.GPSTag] = 1;
+ gps_is = 1 //true;
+ gps_ifd = exif_dict["GPS"];
+ } else if (Object.keys(zeroth_ifd).indexOf(this.ImageIFD.GPSTag.toString()) > -1) {
+ delete zeroth_ifd[this.ImageIFD.GPSTag];
+ }
+
+ if (("1st" in exif_dict) &&
+ ("thumbnail" in exif_dict) &&
+ (exif_dict["thumbnail"] != null)) {
+ first_is = true;
+ exif_dict["1st"][513] = 1;
+ exif_dict["1st"][514] = 1;
+ first_ifd = exif_dict["1st"];
+ }
+
+ const zeroth_set = _dict_to_bytes(zeroth_ifd, "0th", 0);
+ const zeroth_length = (zeroth_set[0].length + exif_is * 12 + gps_is * 12 + 4 +
+ zeroth_set[1].length);
+
+ let exif_set,
+ exif_bytes = "",
+ exif_length = 0,
+ gps_set,
+ gps_bytes = "",
+ gps_length = 0,
+ interop_set,
+ interop_bytes = "",
+ interop_length = 0,
+ first_set,
+ first_bytes = "",
+ thumbnail;
+ if (exif_is) {
+ exif_set = _dict_to_bytes(exif_ifd, "Exif", zeroth_length);
+ exif_length = exif_set[0].length + interop_is * 12 + exif_set[1].length;
+ }
+ if (gps_is) {
+ gps_set = _dict_to_bytes(gps_ifd, "GPS", zeroth_length + exif_length);
+ gps_bytes = gps_set.join("");
+ gps_length = gps_bytes.length;
+ }
+ if (interop_is) {
+ const offset = zeroth_length + exif_length + gps_length;
+ interop_set = _dict_to_bytes(interop_ifd, "Interop", offset);
+ interop_bytes = interop_set.join("");
+ interop_length = interop_bytes.length;
+ }
+ if (first_is) {
+ const offset = zeroth_length + exif_length + gps_length + interop_length;
+ first_set = _dict_to_bytes(first_ifd, "1st", offset);
+ thumbnail = _get_thumbnail(exif_dict["thumbnail"]);
+ if (thumbnail.length > 64000) {
+ throw new Error("Given thumbnail is too large. max 64kB");
+ }
+ }
+
+ let exif_pointer = "",
+ gps_pointer = "",
+ interop_pointer = "",
+ first_ifd_pointer = "\x00\x00\x00\x00";
+ if (exif_is) {
+ const pointer_value = TIFF_HEADER_LENGTH + zeroth_length;
+ const pointer_str = pack(">L", [pointer_value]);
+ const key = 34665;
+ const key_str = pack(">H", [key]);
+ const type_str = pack(">H", [TYPES["Long"]]);
+ const length_str = pack(">L", [1]);
+ exif_pointer = key_str + type_str + length_str + pointer_str;
+ }
+ if (gps_is) {
+ const pointer_value = TIFF_HEADER_LENGTH + zeroth_length + exif_length;
+ const pointer_str = pack(">L", [pointer_value]);
+ const key = 34853;
+ const key_str = pack(">H", [key]);
+ const type_str = pack(">H", [TYPES["Long"]]);
+ const length_str = pack(">L", [1]);
+ gps_pointer = key_str + type_str + length_str + pointer_str;
+ }
+ if (interop_is) {
+ const pointer_value = (TIFF_HEADER_LENGTH +
+ zeroth_length + exif_length + gps_length);
+ const pointer_str = pack(">L", [pointer_value]);
+ const key = 40965;
+ const key_str = pack(">H", [key]);
+ const type_str = pack(">H", [TYPES["Long"]]);
+ const length_str = pack(">L", [1]);
+ interop_pointer = key_str + type_str + length_str + pointer_str;
+ }
+ if (first_is) {
+ const pointer_value = (TIFF_HEADER_LENGTH + zeroth_length +
+ exif_length + gps_length + interop_length);
+ first_ifd_pointer = pack(">L", [pointer_value]);
+ const thumbnail_pointer = (pointer_value + first_set[0].length + 24 +
+ 4 + first_set[1].length);
+ const thumbnail_p_bytes = ("\x02\x01\x00\x04\x00\x00\x00\x01" +
+ pack(">L", [thumbnail_pointer]));
+ const thumbnail_length_bytes = ("\x02\x02\x00\x04\x00\x00\x00\x01" +
+ pack(">L", [thumbnail.length]));
+ first_bytes = (first_set[0] + thumbnail_p_bytes +
+ thumbnail_length_bytes + "\x00\x00\x00\x00" +
+ first_set[1] + thumbnail);
+ }
+
+ const zeroth_bytes = (zeroth_set[0] + exif_pointer + gps_pointer +
+ first_ifd_pointer + zeroth_set[1]);
+ if (exif_is) {
+ exif_bytes = exif_set[0] + interop_pointer + exif_set[1];
+ }
+
+ return (header + zeroth_bytes + exif_bytes + gps_bytes +
+ interop_bytes + first_bytes);
+ }
+}
+
+
+
+function _get_thumbnail(jpeg) {
+ let segments = splitIntoSegments(jpeg);
+ while (("\xff\xe0" <= segments[1].slice(0, 2)) && (segments[1].slice(0, 2) <= "\xff\xef")) {
+ segments = [segments[0]].concat(segments.slice(2));
+ }
+ return segments.join("");
+}
+function _pack_byte(array) {
+ return pack(">" + nStr("B", array.length), array);
+}
+
+function _pack_short(array) {
+ return pack(">" + nStr("H", array.length), array);
+}
+
+function _pack_long(array) {
+ return pack(">" + nStr("L", array.length), array);
+}
+
+function _value_to_bytes(raw_value, value_type, offset) {
+ let four_bytes_over = "";
+ let value_str = "";
+ let length,
+ new_value,
+ num,
+ den;
+
+ if (value_type == "Byte") {
+ length = raw_value.length;
+ if (length <= 4) {
+ value_str = (_pack_byte(raw_value) +
+ nStr("\x00", 4 - length));
+ } else {
+ value_str = pack(">L", [offset]);
+ four_bytes_over = _pack_byte(raw_value);
+ }
+ } else if (value_type == "Short") {
+ length = raw_value.length;
+ if (length <= 2) {
+ value_str = (_pack_short(raw_value) +
+ nStr("\x00\x00", 2 - length));
+ } else {
+ value_str = pack(">L", [offset]);
+ four_bytes_over = _pack_short(raw_value);
+ }
+ } else if (value_type == "Long") {
+ length = raw_value.length;
+ if (length <= 1) {
+ value_str = _pack_long(raw_value);
+ } else {
+ value_str = pack(">L", [offset]);
+ four_bytes_over = _pack_long(raw_value);
+ }
+ } else if (value_type == "Ascii") {
+ new_value = raw_value + "\x00";
+ length = new_value.length;
+ if (length > 4) {
+ value_str = pack(">L", [offset]);
+ four_bytes_over = new_value;
+ } else {
+ value_str = new_value + nStr("\x00", 4 - length);
+ }
+ } else if (value_type == "Rational") {
+ if (typeof (raw_value[0]) == "number") {
+ length = 1;
+ num = raw_value[0];
+ den = raw_value[1];
+ new_value = pack(">L", [num]) + pack(">L", [den]);
+ } else {
+ length = raw_value.length;
+ new_value = "";
+ for (var n = 0; n < length; n++) {
+ num = raw_value[n][0];
+ den = raw_value[n][1];
+ new_value += (pack(">L", [num]) +
+ pack(">L", [den]));
+ }
+ }
+ value_str = pack(">L", [offset]);
+ four_bytes_over = new_value;
+ } else if (value_type == "SRational") {
+ if (typeof (raw_value[0]) == "number") {
+ length = 1;
+ num = raw_value[0];
+ den = raw_value[1];
+ new_value = pack(">l", [num]) + pack(">l", [den]);
+ } else {
+ length = raw_value.length;
+ new_value = "";
+ for (var n = 0; n < length; n++) {
+ num = raw_value[n][0];
+ den = raw_value[n][1];
+ new_value += (pack(">l", [num]) +
+ pack(">l", [den]));
+ }
+ }
+ value_str = pack(">L", [offset]);
+ four_bytes_over = new_value;
+ } else if (value_type == "Undefined") {
+ length = raw_value.length;
+ if (length > 4) {
+ value_str = pack(">L", [offset]);
+ four_bytes_over = raw_value;
+ } else {
+ value_str = raw_value + nStr("\x00", 4 - length);
+ }
+ }
+
+ var length_str = pack(">L", [length]);
+
+ return [length_str, value_str, four_bytes_over];
+}
+
+function _dict_to_bytes(ifd_dict, ifd, ifd_offset) {
+ const TIFF_HEADER_LENGTH = 8;
+ const tag_count = Object.keys(ifd_dict).length;
+ const entry_header = pack(">H", [tag_count]);
+ let entries_length;
+ if (["0th", "1st"].indexOf(ifd) > -1) {
+ entries_length = 2 + tag_count * 12 + 4;
+ } else {
+ entries_length = 2 + tag_count * 12;
+ }
+ let entries = "";
+ let values = "";
+ let key;
+
+ for (key in ifd_dict) {
+ if (typeof (key) == "string") {
+ key = parseInt(key);
+ }
+ if ((ifd == "0th") && ([34665, 34853].indexOf(key) > -1)) {
+ continue;
+ } else if ((ifd == "Exif") && (key == 40965)) {
+ continue;
+ } else if ((ifd == "1st") && ([513, 514].indexOf(key) > -1)) {
+ continue;
+ }
+
+ var raw_value = ifd_dict[key];
+ var key_str = pack(">H", [key]);
+ var value_type = TAGS[ifd][key]["type"];
+ var type_str = pack(">H", [TYPES[value_type]]);
+
+ if (typeof (raw_value) == "number") {
+ raw_value = [raw_value];
+ }
+ var offset = TIFF_HEADER_LENGTH + entries_length + ifd_offset + values.length;
+ var b = _value_to_bytes(raw_value, value_type, offset);
+ var length_str = b[0];
+ var value_str = b[1];
+ var four_bytes_over = b[2];
+
+ entries += key_str + type_str + length_str + value_str;
+ values += four_bytes_over;
+ }
+
+ return [entry_header + entries, values];
+}
+
+
+
+class ExifReader {
+ tiftag = null
+ endian_mark = ''
+ constructor(data) {
+ let segments,
+ app1;
+ if (data.slice(0, 2) == "\xff\xd8") { // JPEG
+ segments = splitIntoSegments(data);
+ app1 = getExifSeg(segments);
+ if (app1) {
+ this.tiftag = app1.slice(10);
+ }
+ } else if (["\x49\x49", "\x4d\x4d"].indexOf(data.slice(0, 2)) > -1) { // TIFF
+ this.tiftag = data;
+ } else if (data.slice(0, 4) == "Exif") { // Exif
+ this.tiftag = data.slice(6);
+ } else {
+ throw new Error("Given file is neither JPEG nor TIFF.");
+ }
+ }
+ get_ifd(pointer, ifd_name) {
+ let ifd_dict = {};
+ let tag_count = unpack(this.endian_mark + "H",
+ this.tiftag.slice(pointer, pointer + 2))[0];
+ const offset = pointer + 2;
+ let t;
+ if (["0th", "1st"].indexOf(ifd_name) > -1) {
+ t = "Image";
+ } else {
+ t = ifd_name;
+ }
+
+ for (let x = 0; x < tag_count; x++) {
+ pointer = offset + 12 * x;
+ const tag = unpack(this.endian_mark + "H",
+ this.tiftag.slice(pointer, pointer + 2))[0];
+ const value_type = unpack(this.endian_mark + "H",
+ this.tiftag.slice(pointer + 2, pointer + 4))[0];
+ const value_num = unpack(this.endian_mark + "L",
+ this.tiftag.slice(pointer + 4, pointer + 8))[0];
+ const value = this.tiftag.slice(pointer + 8, pointer + 12);
+
+ const v_set = [value_type, value_num, value];
+ if (tag in TAGS[t]) {
+ ifd_dict[tag] = this.convert_value(v_set);
+ }
+ }
+
+ if (ifd_name == "0th") {
+ pointer = offset + 12 * tag_count;
+ ifd_dict["first_ifd_pointer"] = this.tiftag.slice(pointer, pointer + 4);
+ }
+
+ return ifd_dict;
+ }
+
+ convert_value(val) {
+ let data = null;
+ const t = val[0];
+ const length = val[1];
+ const value = val[2];
+ let pointer;
+
+ if (t == 1) { // BYTE
+ if (length > 4) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = unpack(this.endian_mark + nStr("B", length),
+ this.tiftag.slice(pointer, pointer + length));
+ } else {
+ data = unpack(this.endian_mark + nStr("B", length), value.slice(0, length));
+ }
+ } else if (t == 2) { // ASCII
+ if (length > 4) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = this.tiftag.slice(pointer, pointer + length - 1);
+ } else {
+ data = value.slice(0, length - 1);
+ }
+ } else if (t == 3) { // SHORT
+ if (length > 2) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = unpack(this.endian_mark + nStr("H", length),
+ this.tiftag.slice(pointer, pointer + length * 2));
+ } else {
+ data = unpack(this.endian_mark + nStr("H", length),
+ value.slice(0, length * 2));
+ }
+ } else if (t == 4) { // LONG
+ if (length > 1) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = unpack(this.endian_mark + nStr("L", length),
+ this.tiftag.slice(pointer, pointer + length * 4));
+ } else {
+ data = unpack(this.endian_mark + nStr("L", length),
+ value);
+ }
+ } else if (t == 5) { // RATIONAL
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ if (length > 1) {
+ data = [];
+ for (let x = 0; x < length; x++) {
+ data.push([unpack(this.endian_mark + "L",
+ this.tiftag.slice(pointer + x * 8, pointer + 4 + x * 8))[0],
+ unpack(this.endian_mark + "L",
+ this.tiftag.slice(pointer + 4 + x * 8, pointer + 8 + x * 8))[0]
+ ]);
+ }
+ } else {
+ data = [unpack(this.endian_mark + "L",
+ this.tiftag.slice(pointer, pointer + 4))[0],
+ unpack(this.endian_mark + "L",
+ this.tiftag.slice(pointer + 4, pointer + 8))[0]
+ ];
+ }
+ } else if (t == 7) { // UNDEFINED BYTES
+ if (length > 4) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = this.tiftag.slice(pointer, pointer + length);
+ } else {
+ data = value.slice(0, length);
+ }
+ } else if (t == 9) { // SLONG
+ if (length > 1) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = unpack(this.endian_mark + nStr("l", length),
+ this.tiftag.slice(pointer, pointer + length * 4));
+ } else {
+ data = unpack(this.endian_mark + nStr("l", length),
+ value);
+ }
+ } else if (t == 10) { // SRATIONAL
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ if (length > 1) {
+ data = [];
+ for (let x = 0; x < length; x++) {
+ data.push([unpack(this.endian_mark + "l",
+ this.tiftag.slice(pointer + x * 8, pointer + 4 + x * 8))[0],
+ unpack(this.endian_mark + "l",
+ this.tiftag.slice(pointer + 4 + x * 8, pointer + 8 + x * 8))[0]
+ ]);
+ }
+ } else {
+ data = [unpack(this.endian_mark + "l",
+ this.tiftag.slice(pointer, pointer + 4))[0],
+ unpack(this.endian_mark + "l",
+ this.tiftag.slice(pointer + 4, pointer + 8))[0]
+ ];
+ }
+ } else {
+ throw new Error("Exif might be wrong. Got incorrect value " +
+ "type to decode. type:" + t);
+ }
+
+ if ((data instanceof Array) && (data.length == 1)) {
+ return data[0];
+ } else {
+ return data;
+ }
+ }
+
+}
+
+
+function pack(mark, array) {
+ if (!(array instanceof Array)) {
+ throw new Error("'pack' error. Got invalid type argument.");
+ }
+ if ((mark.length - 1) != array.length) {
+ throw new Error("'pack' error. " + (mark.length - 1) + " marks, " + array.length + " elements.");
+ }
+
+ let littleEndian;
+ if (mark[0] == "<") {
+ littleEndian = true;
+ } else if (mark[0] == ">") {
+ littleEndian = false;
+ } else {
+ throw new Error("");
+ }
+ let packed = "";
+ let p = 1;
+ let val = null;
+ let c = null;
+ let valStr = null;
+
+ while (c = mark[p]) {
+ if (c.toLowerCase() == "b") {
+ val = array[p - 1];
+ if ((c == "b") && (val < 0)) {
+ val += 0x100;
+ }
+ if ((val > 0xff) || (val < 0)) {
+ throw new Error("'pack' error.");
+ } else {
+ valStr = String.fromCharCode(val);
+ }
+ } else if (c == "H") {
+ val = array[p - 1];
+ if ((val > 0xffff) || (val < 0)) {
+ throw new Error("'pack' error.");
+ } else {
+ valStr = String.fromCharCode(Math.floor((val % 0x10000) / 0x100)) +
+ String.fromCharCode(val % 0x100);
+ if (littleEndian) {
+ valStr = valStr.split("").reverse().join("");
+ }
+ }
+ } else if (c.toLowerCase() == "l") {
+ val = array[p - 1];
+ if ((c == "l") && (val < 0)) {
+ val += 0x100000000;
+ }
+ if ((val > 0xffffffff) || (val < 0)) {
+ throw new Error("'pack' error.");
+ } else {
+ valStr = String.fromCharCode(Math.floor(val / 0x1000000)) +
+ String.fromCharCode(Math.floor((val % 0x1000000) / 0x10000)) +
+ String.fromCharCode(Math.floor((val % 0x10000) / 0x100)) +
+ String.fromCharCode(val % 0x100);
+ if (littleEndian) {
+ valStr = valStr.split("").reverse().join("");
+ }
+ }
+ } else {
+ throw new Error("'pack' error.");
+ }
+
+ packed += valStr;
+ p += 1;
+ }
+
+ return packed;
+}
+
+
+function unpack(mark, str) {
+ if (typeof (str) != "string") {
+ throw new Error("'unpack' error. Got invalid type argument.");
+ }
+ let l = 0;
+ for (let markPointer = 1; markPointer < mark.length; markPointer++) {
+ if (mark[markPointer].toLowerCase() == "b") {
+ l += 1;
+ } else if (mark[markPointer].toLowerCase() == "h") {
+ l += 2;
+ } else if (mark[markPointer].toLowerCase() == "l") {
+ l += 4;
+ } else {
+ throw new Error("'unpack' error. Got invalid mark.");
+ }
+ }
+
+ if (l != str.length) {
+ throw new Error("'unpack' error. Mismatch between symbol and string length. " + l + ":" + str.length);
+ }
+
+ let littleEndian;
+ if (mark[0] == "<") {
+ littleEndian = true;
+ } else if (mark[0] == ">") {
+ littleEndian = false;
+ } else {
+ throw new Error("'unpack' error.");
+ }
+ let unpacked = [];
+ let strPointer = 0;
+ let p = 1;
+ let val = null;
+ let c = null;
+ let length = null;
+ let sliced = "";
+
+ while (c = mark[p]) {
+ if (c.toLowerCase() == "b") {
+ length = 1;
+ sliced = str.slice(strPointer, strPointer + length);
+ val = sliced.charCodeAt(0);
+ if ((c == "b") && (val >= 0x80)) {
+ val -= 0x100;
+ }
+ } else if (c == "H") {
+ length = 2;
+ sliced = str.slice(strPointer, strPointer + length);
+ if (littleEndian) {
+ sliced = sliced.split("").reverse().join("");
+ }
+ val = sliced.charCodeAt(0) * 0x100 +
+ sliced.charCodeAt(1);
+ } else if (c.toLowerCase() == "l") {
+ length = 4;
+ sliced = str.slice(strPointer, strPointer + length);
+ if (littleEndian) {
+ sliced = sliced.split("").reverse().join("");
+ }
+ val = sliced.charCodeAt(0) * 0x1000000 +
+ sliced.charCodeAt(1) * 0x10000 +
+ sliced.charCodeAt(2) * 0x100 +
+ sliced.charCodeAt(3);
+ if ((c == "l") && (val >= 0x80000000)) {
+ val -= 0x100000000;
+ }
+ } else {
+ throw new Error("'unpack' error. " + c);
+ }
+
+ unpacked.push(val);
+ strPointer += length;
+ p += 1;
+ }
+
+ return unpacked;
+}
+
+
+function nStr(ch, num) {
+ let str = "";
+ for (let i = 0; i < num; i++) {
+ str += ch;
+ }
+ return str;
+}
+
+
+function splitIntoSegments(data) {
+ if (data.slice(0, 2) != "\xff\xd8") {
+ throw new Error("Given data isn't JPEG.");
+ }
+
+ let head = 2;
+ const segments = ["\xff\xd8"];
+ while (true) {
+ if (data.slice(head, head + 2) == "\xff\xda") {
+ segments.push(data.slice(head));
+ break;
+ } else {
+ var length = unpack(">H", data.slice(head + 2, head + 4))[0];
+ var endPoint = head + length + 2;
+ segments.push(data.slice(head, endPoint));
+ head = endPoint;
+ }
+
+ if (head >= data.length) {
+ throw new Error("Wrong JPEG data.");
+ }
+ }
+ return segments;
+}
+
+
+function getExifSeg(segments) {
+ let seg;
+ for (let i = 0; i < segments.length; i++) {
+ seg = segments[i];
+ if (seg.slice(0, 2) == "\xff\xe1" &&
+ seg.slice(4, 10) == "Exif\x00\x00") {
+ return seg;
+ }
+ }
+ return null;
+}
+
+
+function mergeSegments(segments, exif) {
+ let hasExifSegment = false;
+ let additionalAPP1ExifSegments = [];
+
+ segments.forEach(function (segment, i) {
+ // Replace first occurence of APP1:Exif segment
+ if (segment.slice(0, 2) == "\xff\xe1" &&
+ segment.slice(4, 10) == "Exif\x00\x00"
+ ) {
+ if (!hasExifSegment) {
+ segments[i] = exif;
+ hasExifSegment = true;
+ } else {
+ additionalAPP1ExifSegments.unshift(i);
+ }
+ }
+ });
+
+ // Remove additional occurences of APP1:Exif segment
+ additionalAPP1ExifSegments.forEach(function (segmentIndex) {
+ segments.splice(segmentIndex, 1);
+ });
+
+ if (!hasExifSegment && exif) {
+ segments = [segments[0], exif].concat(segments.slice(1));
+ }
+
+ return segments.join("");
+}
+
+
diff --git a/uni_modules/lime-shared/platform/index.ts b/uni_modules/lime-shared/platform/index.ts
new file mode 100644
index 0000000..af07091
--- /dev/null
+++ b/uni_modules/lime-shared/platform/index.ts
@@ -0,0 +1,27 @@
+// @ts-nocheck
+declare var tt: Uni
+declare var swan: Uni
+declare var my: Uni
+declare var dd: Uni
+declare var ks: Uni
+declare var jd: Uni
+declare var qa: Uni
+declare var qq: Uni
+declare var qh: Uni
+declare var qq: Uni
+
+export function platform(): Uni | WechatMiniprogram.Wx {
+ const UNDEFINED = 'undefined'
+ if(typeof wx !== UNDEFINED) return wx // 微信
+ if(typeof tt !== UNDEFINED) return tt // 字节 飞书
+ if(typeof swan !== UNDEFINED) return swan // 百度
+ if(typeof my !== UNDEFINED) return my // 支付宝
+ if(typeof dd !== UNDEFINED) return dd // 钉钉
+ if(typeof ks !== UNDEFINED) return ks // 快手
+ if(typeof jd !== UNDEFINED) return jd // 京东
+ if(typeof qa !== UNDEFINED) return qa // 快应用
+ if(typeof qq !== UNDEFINED) return qq // qq
+ if(typeof qh !== UNDEFINED) return qh // 360
+ if(typeof uni !== UNDEFINED) return uni
+ return null
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/raf/index.ts b/uni_modules/lime-shared/raf/index.ts
new file mode 100644
index 0000000..ec7650d
--- /dev/null
+++ b/uni_modules/lime-shared/raf/index.ts
@@ -0,0 +1,30 @@
+// @ts-nocheck
+import {isBrowser} from '../isBrowser'
+
+// 是否支持被动事件监听
+export const supportsPassive = true;
+
+// 请求动画帧
+export function raf(fn: FrameRequestCallback): number {
+ // 如果是在浏览器环境下,使用 requestAnimationFrame 方法
+ if (isBrowser) {
+ return requestAnimationFrame(fn); // 请求动画帧
+ } else { // 在非浏览器环境下,使用 setTimeout 模拟
+ return setTimeout(fn, 1000 / 30); // 使用 setTimeout 模拟动画帧,每秒钟执行 30 次
+ }
+}
+
+// 取消动画帧
+export function cancelRaf(id: number) {
+ // 如果是在浏览器环境下,使用 cancelAnimationFrame 方法
+ if (isBrowser) {
+ cancelAnimationFrame(id); // 取消动画帧
+ } else { // 在非浏览器环境下,使用 clearTimeout 模拟
+ clearTimeout(id); // 使用 clearTimeout 模拟取消动画帧
+ }
+}
+
+// 双倍动画帧
+export function doubleRaf(fn: FrameRequestCallback): void {
+ raf(() => raf(fn)); // 在下一帧回调中再次请求动画帧,实现双倍动画帧效果
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/random/index.ts b/uni_modules/lime-shared/random/index.ts
new file mode 100644
index 0000000..dbf2681
--- /dev/null
+++ b/uni_modules/lime-shared/random/index.ts
@@ -0,0 +1,22 @@
+// @ts-nocheck
+/**
+ * 生成一个指定范围内的随机数
+ * @param min 随机数的最小值
+ * @param max 随机数的最大值
+ * @param fixed 随机数的小数位数,默认为 0
+ * @returns 生成的随机数
+ */
+export function random(min: number, max: number, fixed: number = 0) {
+ // 将 min 和 max 转换为数字类型
+ min = +min || 0;
+ max = +max || 0;
+ // 计算随机数范围内的一个随机数
+ const num = Math.random() * (max - min) + min;
+ // 如果 fixed 参数为 0,则返回四舍五入的整数随机数;否则保留固定小数位数
+ return fixed == 0 ? Math.round(num) : Number(num.toFixed(fixed));
+}
+
+// 示例
+// console.log(random(0, 10)); // 输出:在 0 和 10 之间的一个整数随机数
+// console.log(random(0, 1, 2)); // 输出:在 0 和 1 之间的一个保留两位小数的随机数
+// console.log(random(1, 100, 3)); // 输出:在 1 和 100 之间的一个保留三位小数的随机数
\ No newline at end of file
diff --git a/uni_modules/lime-shared/range/index.ts b/uni_modules/lime-shared/range/index.ts
new file mode 100644
index 0000000..80acfbf
--- /dev/null
+++ b/uni_modules/lime-shared/range/index.ts
@@ -0,0 +1,31 @@
+// @ts-nocheck
+/**
+ * 生成一个数字范围的数组
+ * @param start 范围的起始值
+ * @param end 范围的结束值
+ * @param step 步长,默认为 1
+ * @param fromRight 是否从右侧开始生成,默认为 false
+ * @returns 生成的数字范围数组
+ */
+export function range(start: number, end: number, step: number = 1, fromRight: boolean = false): number[] {
+ let index = -1;
+ // 计算范围的长度
+ let length = Math.max(Math.ceil((end - start) / (step || 1)), 0);
+ // 创建一个长度为 length 的数组
+ const result = new Array(length);
+
+ // 使用循环生成数字范围数组
+ while (length--) {
+ // 根据 fromRight 参数决定从左侧还是右侧开始填充数组
+ result[fromRight ? length : ++index] = start;
+ start += step;
+ }
+
+ return result;
+}
+
+
+// 示例
+// console.log(range(0, 5)); // 输出: [0, 1, 2, 3, 4]
+// console.log(range(1, 10, 2, true)); // 输出: [9, 7, 5, 3, 1]
+// console.log(range(5, 0, -1)); // 输出: [5, 4, 3, 2, 1]
\ No newline at end of file
diff --git a/uni_modules/lime-shared/readme.md b/uni_modules/lime-shared/readme.md
new file mode 100644
index 0000000..09ec7e9
--- /dev/null
+++ b/uni_modules/lime-shared/readme.md
@@ -0,0 +1,251 @@
+# lime-shared 工具库
+- 本人插件的几个公共函数
+
+## 引入
+```js
+// 按需引入
+// 这种只会引入相关的方法
+import {getRect} from '@/uni_modules/lime-shared/getRect'
+
+// 全量引入
+// 这种引入方式,会全量打包
+import {getRect} from '@/uni_modules/lime-shared'
+```
+
+## Utils
+
+#### getRect
+- 返回节点尺寸信息
+
+```js
+// 组件内需要传入上下文
+// 如果是nvue 则需要在节点上加与id或class同名的ref
+getRect('#id',{context: this}).then(res => {})
+```
+
+#### addUnit
+- 将未带单位的数值添加px,如果有单位则返回原值
+
+```js
+addUnit(10)
+// 10px
+```
+
+#### unitConvert
+- 将带有rpx|px的字符转成number,若本身是number则直接返回
+
+```js
+unitConvert('10rpx')
+// 5 设备不同 返回的值也不同
+unitConvert('10px')
+// 10
+unitConvert(10)
+// 10
+```
+
+#### canIUseCanvas2d
+- 环境是否支持使用 canvas 2d
+
+```js
+canIUseCanvas2d()
+// 若支持返回 true 否则 false
+```
+
+
+#### getCurrentPage
+- 获取当前页
+
+```js
+const page = getCurrentPage()
+```
+
+
+#### base64ToPath
+- 把base64的图片转成临时路径
+
+```js
+base64ToPath(`xxxxx`).then(res => {})
+```
+
+#### pathToBase64
+- 把图片的临时路径转成base64
+
+```js
+pathToBase64(`xxxxx/xxx.png`).then(res => {})
+```
+
+#### sleep
+- 睡眠,让 async 内部程序等待一定时间后再执行
+
+```js
+async next () => {
+ await sleep(300)
+ console.log('limeui');
+}
+```
+
+#### isBase64
+- 判断字符串是否为base64
+
+```js
+isBase64('xxxxx')
+```
+
+#### throttle
+- 节流
+
+```js
+throttle((nama) => {console.log(nama)}, 200)('limeui');
+```
+
+#### debounce
+- 防抖
+
+```js
+debounce((nama) => {console.log(nama)}, 200)('limeui');
+```
+
+#### random
+- 返回指定范围的随机数
+
+```js
+random(1, 5);
+```
+
+#### range
+- 生成区间数组
+
+```js
+range(0, 5)
+// [0,1,2,3,4,5]
+```
+
+#### clamp
+- 夹在min和max之间的数值,如小于min,返回min, 如大于max,返回max,否侧原值返回
+
+```js
+clamp(0, 10, -1)
+// 0
+clamp(0, 10, 11)
+// 10
+clamp(0, 10, 9)
+// 9
+```
+
+#### floatAdd
+- 返回两个浮点数相加的结果
+
+```js
+floatAdd(0.1, 0.2) // 0.3
+```
+
+
+#### fillZero
+- 补零,如果传入的是`个位数`则在前面补0
+
+```js
+fillZero(9);
+// 09
+```
+
+#### exif
+- 获取图片exif
+- 支持临时路径、base64
+
+```js
+uni.chooseImage({
+ count: 1, //最多可以选择的图片张数
+ sizeType: "original",
+ success: (res) => {
+ exif.getData(res.tempFiles[0], function() {
+ let tagj = exif.getTag(this, "GPSLongitude");
+ let Orientation = exif.getTag(this, 'Orientation');
+ console.log(tagj, Orientation)
+ })
+ }
+})
+```
+
+#### selectComponent
+- 获取页面或当前实例的指定组件,会在页面或实例向所有的节点查找(包括子组件或子子组件)
+- 仅vue3,vue2没有测试过
+
+```js
+// 当前页面
+const page = getCurrentPage()
+selectComponent('.custom', {context: page}).then(res => {
+})
+```
+
+
+#### createAnimation
+- 创建动画,与uni.createAnimation使用方法一致,只为了抹平nvue
+
+```html
+
+```
+```js
+const ball = ref(null)
+const animation = createAnimation({
+ transformOrigin: "50% 50%",
+ duration: 1000,
+ timingFunction: "ease",
+ delay: 0
+})
+
+animation.scale(2,2).rotate(45).step()
+// nvue 无导出数据,这样写只为了平台一致,
+// nvue 需要把 ref 传入,其它平台不需要
+const animationData = animation.export(ball.value)
+```
+
+
+## composition-api
+- 因本人插件需要兼容vue2/vue3,故增加一个vue文件,代替条件编译
+- vue2需要在main.js加上这一段
+```js
+// vue2
+import Vue from 'vue'
+import VueCompositionAPI from '@vue/composition-api'
+Vue.use(VueCompositionAPI)
+```
+
+```js
+//使用
+import {computed, onMounted, watch, reactive} from '@/uni_modules/lime-shared/vue'
+```
+
+
+## Hooks
+#### useIntersectionObserver
+- 使用 Intersection Observer 观察元素可见性的钩子函数
+
+```html
+
+
Hello world
+
+```
+
+```js
+// options 接口可传的参数,若在插件里context为必传
+interface UseIntersectionObserverOptions {
+ root ?: string; // 观察器的根元素选择器字符串
+ rootMargin ?: {
+ top ?: number; // 根元素顶部边距
+ bottom ?: number; // 根元素底部边距
+ left ?: number; // 根元素左侧边距
+ right ?: number; // 根元素右侧边距
+ }; // 根元素的边距
+ thresholds ?: any[]; // 交叉比例数组,用于指定何时触发回调函数
+ context ?: any; // 上下文对象,用于指定观察器的上下文
+ initialRatio ?: number; // 初始的交叉比例
+ observeAll ?: boolean; // 是否同时观察所有交叉对象
+}
+const options: UseIntersectionObserverOptions = {
+ rootMargin: {top: 44},
+ context: this
+}
+const {stop} = useIntersectionObserver('.target', (result) => {
+
+}, options)
+```
\ No newline at end of file
diff --git a/uni_modules/lime-shared/selectComponent/index.ts b/uni_modules/lime-shared/selectComponent/index.ts
new file mode 100644
index 0000000..39db2fe
--- /dev/null
+++ b/uni_modules/lime-shared/selectComponent/index.ts
@@ -0,0 +1,152 @@
+// @ts-nocheck
+interface SelectOptions {
+ context?: any
+ needAll?: boolean
+ node?: boolean
+}
+// #ifdef MP
+function selectMPComponent(key: string, name: string, context: any, needAll: boolean) {
+ const {proxy, $vm} = context
+ context = $vm || proxy
+ if(!['ref','component'].includes(key)) {
+ const queue = [context]
+ let result = null
+ const selector = (key == 'id' ? '#': '.') + name;
+ while(queue.length > 0) {
+ const child = queue.shift();
+ const flag = child?.selectComponent(selector)
+ if(flag) {
+ if(!needAll) {return result = flag.$vm}
+ return result = child.selectAllComponents(selector).map(item => item.$vm)
+ } else {
+ child.$children && (queue.push(...child.$children));
+ }
+ }
+ return result
+ } else {
+ const {$templateRefs} = context.$
+ const nameMap = {}
+ for (var i = 0; i < $templateRefs.length; i++) {
+ const item = $templateRefs[i]
+ nameMap[item.i] = item.r
+ }
+ let result = []
+ if(context.$children.length) {
+ const queue = [...context.$children]
+ while(queue.length > 0) {
+ const child = queue.shift();
+ if(key == 'component' && (child.type?.name === name || child.$?.type?.name === name)) {
+ result.push(child)
+ } else if(child.$refs && child.$refs[name]) {
+ result = child.$refs[name]
+ } else if(nameMap[child.id] === name){
+ result.push(child)
+ } else {
+ child.$children && (queue.push(...child.$children));
+ }
+ if(result.length && !needAll) {
+ return;
+ }
+ }
+ }
+ return needAll ? result : result[0]
+ }
+}
+// #endif
+// #ifdef H5
+function selectH5Component(key: string, name: string, context: any, needAll: boolean) {
+ const {_, component } = context
+ const child = {component: _ || component || context, children: null , subTree: null, props: null}
+ let result = []
+ let queue = [child]
+ while(queue.length > 0 ) {
+ const child = queue.shift()
+ const {component, children , props, subTree} = child
+ if(key === 'component' && component?.type?.name == name) {
+ result.push(component)
+ } else if(key === 'ref' && component && (props?.ref == name || component[key][name])) {
+ if(props?.ref == name) {
+ //exposed
+ result.push(component)
+ } else if(component[key][name]) {
+ result.push(component[key][name])
+ }
+ } else if(key !== 'ref' && component?.exposed && new RegExp(`\\b${name}\\b`).test(component.attrs[key])) {
+ // exposed
+ result.push(component)
+ } else if(children && Array.isArray(children)) {
+ queue.push(...children)
+ } else if(!component && subTree) {
+ queue.push(subTree)
+ } else if(component?.subTree) {
+ queue.push(component.subTree)
+ }
+ if(result.length && !needAll) {
+ break
+ }
+ }
+ return needAll ? result : result[0]
+}
+// #endif
+// #ifdef APP
+function selectAPPComponent(key: string, name: string, context: any, needAll: boolean, node: boolean) {
+ let result = []
+ // const {_, component} = context
+ // const child = {component: _ || component || context, children: null, props: null, subTree: null}
+ const queue = [context]
+ while(queue.length > 0) {
+ const child = queue.shift()
+ const {component, children, props, subTree} = child
+ const isComp = component && props && component.exposed && !node
+ if(key == 'component' && child.type && child.type.name === name) {
+ result.push(component)
+ } else if(props?.[key] === name && node) {
+ result.push(child)
+ } else if(key === 'ref' && isComp && (props.ref === name || props.ref_key === name)) {
+ // exposed
+ result.push(component)
+ } else if(key !== 'ref' && isComp && new RegExp(`\\b${name}\\b`).test(props[key])) {
+ // exposed
+ result.push(component)
+ }
+ // else if(component && component.subTree && Array.isArray(component.subTree.children)){
+ // queue.push(...component.subTree.children)
+ // }
+ else if(subTree) {
+ queue.push(subTree)
+ } else if(component && component.subTree){
+ queue.push(component.subTree)
+ }
+ else if(children && Array.isArray(children)) {
+ queue.push(...children)
+ }
+ if(result.length && !needAll) {
+ break;
+ }
+ }
+ return needAll ? result : result[0]
+}
+// #endif
+export function selectComponent(selector: string, options: SelectOptions = {}) {
+ // . class
+ // # id
+ // $ ref
+ // @ component name
+ const reg = /^(\.|#|@|\$)([a-zA-Z_0-9\-]+)$/;
+ if(!reg.test(selector)) return null
+ let { context, needAll, node} = options
+ const [,prefix, name] = selector.match(reg)
+ const symbolMappings = {'.': 'class', '#': 'id', '$':'ref', '@':'component'}
+
+ const key = symbolMappings [prefix] //prefix === '.' ? 'class' : prefix === '#' ? 'id' : 'ref';
+ console.log('key', key)
+ // #ifdef MP
+ return selectMPComponent(key, name, context, needAll)
+ // #endif
+ // #ifdef H5
+ return selectH5Component(key, name, context, needAll)
+ // #endif
+ // #ifdef APP
+ return selectAPPComponent(key, name, context, needAll, node)
+ // #endif
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/sleep/index.ts b/uni_modules/lime-shared/sleep/index.ts
new file mode 100644
index 0000000..3ae6926
--- /dev/null
+++ b/uni_modules/lime-shared/sleep/index.ts
@@ -0,0 +1,30 @@
+// @ts-nocheck
+/**
+ * 延迟指定时间后解析的 Promise
+ * @param delay 延迟的时间(以毫秒为单位),默认为 300 毫秒
+ * @returns 一个 Promise,在延迟结束后解析
+ */
+export const sleep = (delay: number = 300) =>
+ new Promise(resolve => setTimeout(resolve, delay));
+
+
+// 示例
+// async function example() {
+// console.log("Start");
+
+// // 延迟 1 秒后执行
+// await sleep(1000);
+// console.log("1 second later");
+
+// // 延迟 500 毫秒后执行
+// await sleep(500);
+// console.log("500 milliseconds later");
+
+// // 延迟 2 秒后执行
+// await sleep(2000);
+// console.log("2 seconds later");
+
+// console.log("End");
+// }
+
+// example();
\ No newline at end of file
diff --git a/uni_modules/lime-shared/throttle/index.ts b/uni_modules/lime-shared/throttle/index.ts
new file mode 100644
index 0000000..740f788
--- /dev/null
+++ b/uni_modules/lime-shared/throttle/index.ts
@@ -0,0 +1,41 @@
+// @ts-nocheck
+/**
+ * 节流函数,用于限制函数的调用频率
+ * @param fn 要进行节流的函数
+ * @param delay 两次调用之间的最小间隔时间
+ * @returns 节流后的函数
+ */
+export function throttle(fn: (...args: any[]) => void, delay: number) {
+ let flag = true; // 标记是否可以执行函数
+
+ return (...args: any[]) => {
+ if (flag) {
+ flag = false; // 设置为不可执行状态
+ fn(...args); // 执行传入的函数
+
+ setTimeout(() => {
+ flag = true; // 经过指定时间后,设置为可执行状态
+ }, delay);
+ }
+ };
+}
+
+
+// // 示例
+// // 定义一个被节流的函数
+// function handleScroll() {
+// console.log("Scroll event handled!");
+// }
+
+// // 使用节流函数对 handleScroll 进行节流,间隔时间为 500 毫秒
+// const throttledScroll = throttle(handleScroll, 500);
+
+// // 模拟多次调用 handleScroll
+// throttledScroll(); // 输出 "Scroll event handled!"
+// throttledScroll(); // 不会输出
+// throttledScroll(); // 不会输出
+
+// // 经过 500 毫秒后,再次调用 handleScroll
+// setTimeout(() => {
+// throttledScroll(); // 输出 "Scroll event handled!"
+// }, 500);
\ No newline at end of file
diff --git a/uni_modules/lime-shared/toArray/index.ts b/uni_modules/lime-shared/toArray/index.ts
new file mode 100644
index 0000000..b59b0af
--- /dev/null
+++ b/uni_modules/lime-shared/toArray/index.ts
@@ -0,0 +1,13 @@
+// @ts-nocheck
+/**
+ * 将一个或多个元素转换为数组
+ * @param item 要转换为数组的元素
+ * @returns 转换后的数组
+ */
+export const toArray = (item: T | T[]): T[] => Array.isArray(item) ? item : [item];
+
+// 示例
+// console.log(toArray(5)); // 输出: [5]
+// console.log(toArray("hello")); // 输出: ["hello"]
+// console.log(toArray([1, 2, 3])); // 输出: [1, 2, 3]
+// console.log(toArray(["apple", "banana"])); // 输出: ["apple", "banana"]
\ No newline at end of file
diff --git a/uni_modules/lime-shared/toNumber/index.ts b/uni_modules/lime-shared/toNumber/index.ts
new file mode 100644
index 0000000..a0745bb
--- /dev/null
+++ b/uni_modules/lime-shared/toNumber/index.ts
@@ -0,0 +1,15 @@
+// @ts-nocheck
+/**
+ * 将字符串转换为数字
+ * @param val 要转换的字符串
+ * @returns 转换后的数字或原始字符串
+ */
+export function toNumber(val: string): number | string {
+ const n = parseFloat(val); // 使用 parseFloat 函数将字符串转换为浮点数
+ return isNaN(n) ? val : n; // 使用 isNaN 函数判断是否为非数字,返回转换后的数字或原始字符串
+}
+
+// 示例
+// console.log(toNumber("123")); // 输出: 123
+// console.log(toNumber("3.14")); // 输出: 3.14
+// console.log(toNumber("hello")); // 输出: "hello"
\ No newline at end of file
diff --git a/uni_modules/lime-shared/unitConvert/index.ts b/uni_modules/lime-shared/unitConvert/index.ts
new file mode 100644
index 0000000..7cedccf
--- /dev/null
+++ b/uni_modules/lime-shared/unitConvert/index.ts
@@ -0,0 +1,39 @@
+// @ts-nocheck
+import {isString} from '../isString'
+import {isNumeric} from '../isNumeric'
+
+/**
+ * 单位转换函数,将字符串数字或带有单位的字符串转换为数字
+ * @param value 要转换的值,可以是字符串数字或带有单位的字符串
+ * @returns 转换后的数字,如果无法转换则返回0
+ */
+export function unitConvert(value: string | number): number {
+ // 如果是字符串数字
+ if (isNumeric(value)) {
+ return Number(value);
+ }
+ // 如果有单位
+ if (isString(value)) {
+ const reg = /^-?([0-9]+)?([.]{1}[0-9]+){0,1}(em|rpx|px|%)$/g;
+ const results = reg.exec(value);
+ if (!value || !results) {
+ return 0;
+ }
+ const unit = results[3];
+ value = parseFloat(value);
+ if (unit === 'rpx') {
+ return uni.upx2px(value);
+ }
+ if (unit === 'px') {
+ return value * 1;
+ }
+ // 如果是其他单位,可以继续添加对应的转换逻辑
+ }
+ return 0;
+}
+
+// 示例
+// console.log(unitConvert("123")); // 输出: 123 (字符串数字转换为数字)
+// console.log(unitConvert("3.14em")); // 输出: 0 (无法识别的单位)
+// console.log(unitConvert("20rpx")); // 输出: 根据具体情况而定 (根据单位进行转换)
+// console.log(unitConvert(10)); // 输出: 10 (数字不需要转换)
\ No newline at end of file
diff --git a/uni_modules/lime-shared/useIntersectionObserver/index.ts b/uni_modules/lime-shared/useIntersectionObserver/index.ts
new file mode 100644
index 0000000..b5862fe
--- /dev/null
+++ b/uni_modules/lime-shared/useIntersectionObserver/index.ts
@@ -0,0 +1,81 @@
+import { watch, unref, Ref } from "../vue"
+// #ifdef APP-NVUE
+// const dom = weex.requireModule('dom')
+// const dom = uni.requireNativePlugin('dom')
+// #endif
+
+interface UseIntersectionObserverOptions {
+ root ?: string; // 观察器的根元素选择器字符串
+ rootMargin ?: {
+ top ?: number; // 根元素顶部边距
+ bottom ?: number; // 根元素底部边距
+ left ?: number; // 根元素左侧边距
+ right ?: number; // 根元素右侧边距
+ }; // 根元素的边距
+ thresholds ?: any[]; // 交叉比例数组,用于指定何时触发回调函数
+ context ?: any; // 上下文对象,用于指定观察器的上下文
+ initialRatio ?: number; // 初始的交叉比例
+ observeAll ?: boolean; // 是否同时观察所有交叉对象
+}
+
+/**
+ * 使用 Intersection Observer 观察元素可见性的自定义钩子函数
+ * @param {Ref | string} target - 目标元素,可以是一个字符串或 ref 对象
+ * @param {(result: UniNamespace.ObserveResult) => void} callback - 回调函数,当目标元素的可见性发生变化时调用
+ * @param {UseIntersectionObserverOptions} options - 可选的配置参数
+ * @returns {Object} - 包含 stop 方法的对象,用于停止观察
+ */
+export function useIntersectionObserver(
+ target : Ref | string,
+ callback : (result : UniNamespace.ObserveResult) => void,
+ options : UseIntersectionObserverOptions = {}) {
+ const {
+ root, // 观察器的根元素选择器
+ rootMargin = { top: 0, bottom: 0 }, // 根元素的边距,默认为顶部和底部都为0
+ thresholds = [0], // 交叉比例数组,默认为[0]
+ initialRatio = 0, // 初始交叉比例,默认为0
+ observeAll = false, // 是否同时观察所有交叉对象,默认为false
+ context // 上下文对象,用于指定观察器的上下文
+ } = options
+ const noop = () => { }; // 空函数,用于初始化 cleanup
+ let cleanup = noop; // 清理函数,用于停止 Intersection Observer 的观察
+
+ const stopWatch = watch(() => ({ el: unref(target), root: unref(root) }), ({ el, root }) => {
+ if (!el) {
+ return
+ }
+ // #ifndef APP-NVUE
+ // 创建 Intersection Observer 实例
+ const observer = uni.createIntersectionObserver(context, { thresholds, initialRatio, observeAll })
+ if (root) {
+ // 相对于根元素设置边界
+ observer.relativeTo(root, rootMargin)
+ } else {
+ // 相对于视口设置边界
+ observer.relativeToViewport(rootMargin)
+ }
+ // 观察目标元素的可见性变化
+ observer.observe(el, callback)
+ cleanup = () => {
+ // 停止观察
+ observer.disconnect()
+ // 将 cleanup 函数重置为空函数
+ cleanup = noop
+ }
+ // #endif
+ // #ifdef APP-NVUE
+ // dom.getComponentRect(el, (res) => {
+ // console.log('res', res)
+ // })
+ // #endif
+ }, { immediate: true, flush: 'post' })
+
+ const stop = () => {
+ // 调用 cleanup 函数停止观察
+ cleanup && cleanup()
+ // 停止 watch
+ stopWatch && stopWatch()
+ }
+
+ return { stop }
+}
\ No newline at end of file
diff --git a/uni_modules/lime-shared/vue/index.ts b/uni_modules/lime-shared/vue/index.ts
new file mode 100644
index 0000000..91a4a7f
--- /dev/null
+++ b/uni_modules/lime-shared/vue/index.ts
@@ -0,0 +1,8 @@
+// @ts-nocheck
+
+// #ifdef VUE3
+export * from 'vue';
+// #endif
+// #ifndef VUE3
+export * from '@vue/composition-api';
+// #endif
diff --git a/uni_modules/uni-badge/changelog.md b/uni_modules/uni-badge/changelog.md
new file mode 100644
index 0000000..56581c4
--- /dev/null
+++ b/uni_modules/uni-badge/changelog.md
@@ -0,0 +1,31 @@
+## 1.2.1(2022-09-05)
+- 修复 当 text 超过 max-num 时,badge 的宽度计算是根据 text 的长度计算,更改为 css 计算实际展示宽度,详见:[https://ask.dcloud.net.cn/question/150473](https://ask.dcloud.net.cn/question/150473)
+## 1.2.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-badge](https://uniapp.dcloud.io/component/uniui/uni-badge)
+## 1.1.7(2021-11-08)
+- 优化 升级ui
+- 修改 size 属性默认值调整为 small
+- 修改 type 属性,默认值调整为 error,info 替换 default
+## 1.1.6(2021-09-22)
+- 修复 在字节小程序上样式不生效的 bug
+## 1.1.5(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.4(2021-07-29)
+- 修复 去掉 nvue 不支持css 的 align-self 属性,nvue 下不暂支持 absolute 属性
+## 1.1.3(2021-06-24)
+- 优化 示例项目
+## 1.1.1(2021-05-12)
+- 新增 组件示例地址
+## 1.1.0(2021-05-12)
+- 新增 uni-badge 的 absolute 属性,支持定位
+- 新增 uni-badge 的 offset 属性,支持定位偏移
+- 新增 uni-badge 的 is-dot 属性,支持仅显示有一个小点
+- 新增 uni-badge 的 max-num 属性,支持自定义封顶的数字值,超过 99 显示99+
+- 优化 uni-badge 属性 custom-style, 支持以对象形式自定义样式
+## 1.0.7(2021-05-07)
+- 修复 uni-badge 在 App 端,数字小于10时不是圆形的bug
+- 修复 uni-badge 在父元素不是 flex 布局时,宽度缩小的bug
+- 新增 uni-badge 属性 custom-style, 支持自定义样式
+## 1.0.6(2021-02-04)
+- 调整为uni_modules目录规范
diff --git a/uni_modules/uni-badge/components/uni-badge/uni-badge.vue b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue
new file mode 100644
index 0000000..498bb1c
--- /dev/null
+++ b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue
@@ -0,0 +1,268 @@
+
+
+
+ {{displayValue}}
+
+
+
+
+
+
diff --git a/uni_modules/uni-badge/package.json b/uni_modules/uni-badge/package.json
new file mode 100644
index 0000000..7a34d9c
--- /dev/null
+++ b/uni_modules/uni-badge/package.json
@@ -0,0 +1,85 @@
+{
+ "id": "uni-badge",
+ "displayName": "uni-badge 数字角标",
+ "version": "1.2.1",
+ "description": "数字角标(徽章)组件,在元素周围展示消息提醒,一般用于列表、九宫格、按钮等地方。",
+ "keywords": [
+ "",
+ "badge",
+ "uni-ui",
+ "uniui",
+ "数字角标",
+ "徽章"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "y",
+ "联盟": "y"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-badge/readme.md b/uni_modules/uni-badge/readme.md
new file mode 100644
index 0000000..bdf175d
--- /dev/null
+++ b/uni_modules/uni-badge/readme.md
@@ -0,0 +1,10 @@
+## Badge 数字角标
+> **组件名:uni-badge**
+> 代码块: `uBadge`
+
+数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景,
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-badge)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
+
+
diff --git a/uni_modules/uni-breadcrumb/changelog.md b/uni_modules/uni-breadcrumb/changelog.md
new file mode 100644
index 0000000..016e6ce
--- /dev/null
+++ b/uni_modules/uni-breadcrumb/changelog.md
@@ -0,0 +1,6 @@
+## 0.1.2(2022-06-08)
+- 修复 微信小程序 separator 不显示问题
+## 0.1.1(2022-06-02)
+- 新增 支持 uni.scss 修改颜色
+## 0.1.0(2022-04-21)
+- 初始化
diff --git a/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue b/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue
new file mode 100644
index 0000000..b9edbd6
--- /dev/null
+++ b/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+ {{ separator }}
+
+
+
+
diff --git a/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue
new file mode 100644
index 0000000..94493a2
--- /dev/null
+++ b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-breadcrumb/package.json b/uni_modules/uni-breadcrumb/package.json
new file mode 100644
index 0000000..e5f33e8
--- /dev/null
+++ b/uni_modules/uni-breadcrumb/package.json
@@ -0,0 +1,85 @@
+{
+ "id": "uni-breadcrumb",
+ "displayName": "uni-breadcrumb 面包屑",
+ "version": "0.1.2",
+ "description": "Breadcrumb 面包屑",
+ "keywords": [
+ "uni-breadcrumb",
+ "breadcrumb",
+ "uni-ui",
+ "面包屑导航",
+ "面包屑"
+],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "n"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "u",
+ "百度": "u",
+ "字节跳动": "u",
+ "QQ": "u",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-breadcrumb/readme.md b/uni_modules/uni-breadcrumb/readme.md
new file mode 100644
index 0000000..6976b8d
--- /dev/null
+++ b/uni_modules/uni-breadcrumb/readme.md
@@ -0,0 +1,66 @@
+
+## breadcrumb 面包屑导航
+> **组件名:uni-breadcrumb**
+> 代码块: `ubreadcrumb`
+
+显示当前页面的路径,快速返回之前的任意页面。
+
+### 安装方式
+
+本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。
+
+如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+### 基本用法
+
+在 ``template`` 中使用组件
+
+```html
+
+ {{route.name}}
+
+```
+
+```js
+export default {
+ name: "uni-stat-breadcrumb",
+ data() {
+ return {
+ routes: [{
+ to: '/A',
+ name: 'A页面'
+ }, {
+ to: '/B',
+ name: 'B页面'
+ }, {
+ to: '/C',
+ name: 'C页面'
+ }]
+ };
+ }
+ }
+```
+
+
+## API
+
+### Breadcrumb Props
+
+|属性名 |类型 |默认值 |说明 |
+|:-: |:-: |:-: |:-: |
+|separator |String |斜杠'/' |分隔符 |
+|separatorClass |String | |图标分隔符 class |
+
+### Breadcrumb Item Props
+
+|属性名 |类型 |默认值 |说明 |
+|:-: |:-: |:-: |:-: |
+|to |String | |路由跳转页面路径 |
+|replace|Boolean | |在使用 to 进行路由跳转时,启用 replace 将不会向 history 添加新记录(仅 h5 支持) |
+
+
+
+
+## 组件示例
+
+点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/breadcrumb/breadcrumb](https://hellouniapp.dcloud.net.cn/pages/extUI/breadcrumb/breadcrumb)
\ No newline at end of file
diff --git a/uni_modules/uni-calendar/changelog.md b/uni_modules/uni-calendar/changelog.md
new file mode 100644
index 0000000..0160b69
--- /dev/null
+++ b/uni_modules/uni-calendar/changelog.md
@@ -0,0 +1,20 @@
+## 1.4.7(2022-09-16)
+- 可以使用 uni-scss 控制主题色
+## 1.4.6(2022-09-08)
+- fix: 表头年月切换,导致改变当前日期为选择月1号,且未触发change事件
+## 1.4.5(2022-02-25)
+- 修复 条件编译 nvue 不支持的 css 样式
+## 1.4.4(2022-02-25)
+- 修复 条件编译 nvue 不支持的 css 样式
+## 1.4.3(2021-09-22)
+- 修复 startDate、 endDate 属性失效的 bug
+## 1.4.2(2021-08-24)
+- 新增 支持国际化
+## 1.4.1(2021-08-05)
+- 修复 弹出层被 tabbar 遮盖 bug
+## 1.4.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.3.16(2021-05-12)
+- 新增 组件示例地址
+## 1.3.15(2021-02-04)
+- 调整为uni_modules目录规范
diff --git a/uni_modules/uni-calendar/components/uni-calendar/calendar.js b/uni_modules/uni-calendar/components/uni-calendar/calendar.js
new file mode 100644
index 0000000..b8d7d6f
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/calendar.js
@@ -0,0 +1,546 @@
+/**
+* @1900-2100区间内的公历、农历互转
+* @charset UTF-8
+* @github https://github.com/jjonline/calendar.js
+* @Author Jea杨(JJonline@JJonline.Cn)
+* @Time 2014-7-21
+* @Time 2016-8-13 Fixed 2033hex、Attribution Annals
+* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug
+* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
+* @Version 1.0.3
+* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
+* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
+*/
+/* eslint-disable */
+var calendar = {
+
+ /**
+ * 农历1900-2100的润大小信息表
+ * @Array Of Property
+ * @return Hex
+ */
+ lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909
+ 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919
+ 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929
+ 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939
+ 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949
+ 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959
+ 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969
+ 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979
+ 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989
+ 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999
+ 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009
+ 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019
+ 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029
+ 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039
+ 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049
+ /** Add By JJonline@JJonline.Cn**/
+ 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059
+ 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069
+ 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079
+ 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089
+ 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099
+ 0x0d520], // 2100
+
+ /**
+ * 公历每个月份的天数普通表
+ * @Array Of Property
+ * @return Number
+ */
+ solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
+
+ /**
+ * 天干地支之天干速查表
+ * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
+ * @return Cn string
+ */
+ Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'],
+
+ /**
+ * 天干地支之地支速查表
+ * @Array Of Property
+ * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
+ * @return Cn string
+ */
+ Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'],
+
+ /**
+ * 天干地支之地支速查表<=>生肖
+ * @Array Of Property
+ * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
+ * @return Cn string
+ */
+ Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'],
+
+ /**
+ * 24节气速查表
+ * @Array Of Property
+ * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
+ * @return Cn string
+ */
+ solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'],
+
+ /**
+ * 1900-2100各年的24节气日期速查表
+ * @Array Of Property
+ * @return 0x string For splice
+ */
+ sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f',
+ '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',
+ 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',
+ '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',
+ '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',
+ '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',
+ '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',
+ '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',
+ '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+ '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+ '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',
+ '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+ '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+ '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+ '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+ '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',
+ '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',
+ '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+ '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+ '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',
+ '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',
+ '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',
+ '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',
+ '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+ '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',
+ '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',
+ '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+ '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',
+ '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',
+ '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',
+ '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',
+ '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'],
+
+ /**
+ * 数字转中文速查表
+ * @Array Of Property
+ * @trans ['日','一','二','三','四','五','六','七','八','九','十']
+ * @return Cn string
+ */
+ nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'],
+
+ /**
+ * 日期转农历称呼速查表
+ * @Array Of Property
+ * @trans ['初','十','廿','卅']
+ * @return Cn string
+ */
+ nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'],
+
+ /**
+ * 月份转农历称呼速查表
+ * @Array Of Property
+ * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
+ * @return Cn string
+ */
+ nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'],
+
+ /**
+ * 返回农历y年一整年的总天数
+ * @param lunar Year
+ * @return Number
+ * @eg:var count = calendar.lYearDays(1987) ;//count=387
+ */
+ lYearDays: function (y) {
+ var i; var sum = 348
+ for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 }
+ return (sum + this.leapDays(y))
+ },
+
+ /**
+ * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
+ * @param lunar Year
+ * @return Number (0-12)
+ * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
+ */
+ leapMonth: function (y) { // 闰字编码 \u95f0
+ return (this.lunarInfo[y - 1900] & 0xf)
+ },
+
+ /**
+ * 返回农历y年闰月的天数 若该年没有闰月则返回0
+ * @param lunar Year
+ * @return Number (0、29、30)
+ * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
+ */
+ leapDays: function (y) {
+ if (this.leapMonth(y)) {
+ return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29)
+ }
+ return (0)
+ },
+
+ /**
+ * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
+ * @param lunar Year
+ * @return Number (-1、29、30)
+ * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
+ */
+ monthDays: function (y, m) {
+ if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1
+ return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29)
+ },
+
+ /**
+ * 返回公历(!)y年m月的天数
+ * @param solar Year
+ * @return Number (-1、28、29、30、31)
+ * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
+ */
+ solarDays: function (y, m) {
+ if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
+ var ms = m - 1
+ if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29
+ return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28)
+ } else {
+ return (this.solarMonth[ms])
+ }
+ },
+
+ /**
+ * 农历年份转换为干支纪年
+ * @param lYear 农历年的年份数
+ * @return Cn string
+ */
+ toGanZhiYear: function (lYear) {
+ var ganKey = (lYear - 3) % 10
+ var zhiKey = (lYear - 3) % 12
+ if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干
+ if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支
+ return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]
+ },
+
+ /**
+ * 公历月、日判断所属星座
+ * @param cMonth [description]
+ * @param cDay [description]
+ * @return Cn string
+ */
+ toAstro: function (cMonth, cDay) {
+ var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf'
+ var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]
+ return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座
+ },
+
+ /**
+ * 传入offset偏移量返回干支
+ * @param offset 相对甲子的偏移量
+ * @return Cn string
+ */
+ toGanZhi: function (offset) {
+ return this.Gan[offset % 10] + this.Zhi[offset % 12]
+ },
+
+ /**
+ * 传入公历(!)y年获得该年第n个节气的公历日期
+ * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
+ * @return day Number
+ * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
+ */
+ getTerm: function (y, n) {
+ if (y < 1900 || y > 2100) { return -1 }
+ if (n < 1 || n > 24) { return -1 }
+ var _table = this.sTermInfo[y - 1900]
+ var _info = [
+ parseInt('0x' + _table.substr(0, 5)).toString(),
+ parseInt('0x' + _table.substr(5, 5)).toString(),
+ parseInt('0x' + _table.substr(10, 5)).toString(),
+ parseInt('0x' + _table.substr(15, 5)).toString(),
+ parseInt('0x' + _table.substr(20, 5)).toString(),
+ parseInt('0x' + _table.substr(25, 5)).toString()
+ ]
+ var _calday = [
+ _info[0].substr(0, 1),
+ _info[0].substr(1, 2),
+ _info[0].substr(3, 1),
+ _info[0].substr(4, 2),
+
+ _info[1].substr(0, 1),
+ _info[1].substr(1, 2),
+ _info[1].substr(3, 1),
+ _info[1].substr(4, 2),
+
+ _info[2].substr(0, 1),
+ _info[2].substr(1, 2),
+ _info[2].substr(3, 1),
+ _info[2].substr(4, 2),
+
+ _info[3].substr(0, 1),
+ _info[3].substr(1, 2),
+ _info[3].substr(3, 1),
+ _info[3].substr(4, 2),
+
+ _info[4].substr(0, 1),
+ _info[4].substr(1, 2),
+ _info[4].substr(3, 1),
+ _info[4].substr(4, 2),
+
+ _info[5].substr(0, 1),
+ _info[5].substr(1, 2),
+ _info[5].substr(3, 1),
+ _info[5].substr(4, 2)
+ ]
+ return parseInt(_calday[n - 1])
+ },
+
+ /**
+ * 传入农历数字月份返回汉语通俗表示法
+ * @param lunar month
+ * @return Cn string
+ * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
+ */
+ toChinaMonth: function (m) { // 月 => \u6708
+ if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
+ var s = this.nStr3[m - 1]
+ s += '\u6708'// 加上月字
+ return s
+ },
+
+ /**
+ * 传入农历日期数字返回汉字表示法
+ * @param lunar day
+ * @return Cn string
+ * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
+ */
+ toChinaDay: function (d) { // 日 => \u65e5
+ var s
+ switch (d) {
+ case 10:
+ s = '\u521d\u5341'; break
+ case 20:
+ s = '\u4e8c\u5341'; break
+ break
+ case 30:
+ s = '\u4e09\u5341'; break
+ break
+ default :
+ s = this.nStr2[Math.floor(d / 10)]
+ s += this.nStr1[d % 10]
+ }
+ return (s)
+ },
+
+ /**
+ * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
+ * @param y year
+ * @return Cn string
+ * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
+ */
+ getAnimal: function (y) {
+ return this.Animals[(y - 4) % 12]
+ },
+
+ /**
+ * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
+ * @param y solar year
+ * @param m solar month
+ * @param d solar day
+ * @return JSON object
+ * @eg:console.log(calendar.solar2lunar(1987,11,01));
+ */
+ solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31
+ // 年份限定、上限
+ if (y < 1900 || y > 2100) {
+ return -1// undefined转换为数字变为NaN
+ }
+ // 公历传参最下限
+ if (y == 1900 && m == 1 && d < 31) {
+ return -1
+ }
+ // 未传参 获得当天
+ if (!y) {
+ var objDate = new Date()
+ } else {
+ var objDate = new Date(y, parseInt(m) - 1, d)
+ }
+ var i; var leap = 0; var temp = 0
+ // 修正ymd参数
+ var y = objDate.getFullYear()
+ var m = objDate.getMonth() + 1
+ var d = objDate.getDate()
+ var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000
+ for (i = 1900; i < 2101 && offset > 0; i++) {
+ temp = this.lYearDays(i)
+ offset -= temp
+ }
+ if (offset < 0) {
+ offset += temp; i--
+ }
+
+ // 是否今天
+ var isTodayObj = new Date()
+ var isToday = false
+ if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
+ isToday = true
+ }
+ // 星期几
+ var nWeek = objDate.getDay()
+ var cWeek = this.nStr1[nWeek]
+ // 数字表示周几顺应天朝周一开始的惯例
+ if (nWeek == 0) {
+ nWeek = 7
+ }
+ // 农历年
+ var year = i
+ var leap = this.leapMonth(i) // 闰哪个月
+ var isLeap = false
+
+ // 效验闰月
+ for (i = 1; i < 13 && offset > 0; i++) {
+ // 闰月
+ if (leap > 0 && i == (leap + 1) && isLeap == false) {
+ --i
+ isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数
+ } else {
+ temp = this.monthDays(year, i)// 计算农历普通月天数
+ }
+ // 解除闰月
+ if (isLeap == true && i == (leap + 1)) { isLeap = false }
+ offset -= temp
+ }
+ // 闰月导致数组下标重叠取反
+ if (offset == 0 && leap > 0 && i == leap + 1) {
+ if (isLeap) {
+ isLeap = false
+ } else {
+ isLeap = true; --i
+ }
+ }
+ if (offset < 0) {
+ offset += temp; --i
+ }
+ // 农历月
+ var month = i
+ // 农历日
+ var day = offset + 1
+ // 天干地支处理
+ var sm = m - 1
+ var gzY = this.toGanZhiYear(year)
+
+ // 当月的两个节气
+ // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
+ var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始
+ var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始
+
+ // 依据12节气修正干支月
+ var gzM = this.toGanZhi((y - 1900) * 12 + m + 11)
+ if (d >= firstNode) {
+ gzM = this.toGanZhi((y - 1900) * 12 + m + 12)
+ }
+
+ // 传入的日期的节气与否
+ var isTerm = false
+ var Term = null
+ if (firstNode == d) {
+ isTerm = true
+ Term = this.solarTerm[m * 2 - 2]
+ }
+ if (secondNode == d) {
+ isTerm = true
+ Term = this.solarTerm[m * 2 - 1]
+ }
+ // 日柱 当月一日与 1900/1/1 相差天数
+ var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10
+ var gzD = this.toGanZhi(dayCyclical + d - 1)
+ // 该日期所属的星座
+ var astro = this.toAstro(m, d)
+
+ return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro }
+ },
+
+ /**
+ * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
+ * @param y lunar year
+ * @param m lunar month
+ * @param d lunar day
+ * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
+ * @return JSON object
+ * @eg:console.log(calendar.lunar2solar(1987,9,10));
+ */
+ lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1
+ var isLeapMonth = !!isLeapMonth
+ var leapOffset = 0
+ var leapMonth = this.leapMonth(y)
+ var leapDay = this.leapDays(y)
+ if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
+ if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值
+ var day = this.monthDays(y, m)
+ var _day = day
+ // bugFix 2016-9-25
+ // if month is leap, _day use leapDays method
+ if (isLeapMonth) {
+ _day = this.leapDays(y, m)
+ }
+ if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验
+
+ // 计算农历的时间差
+ var offset = 0
+ for (var i = 1900; i < y; i++) {
+ offset += this.lYearDays(i)
+ }
+ var leap = 0; var isAdd = false
+ for (var i = 1; i < m; i++) {
+ leap = this.leapMonth(y)
+ if (!isAdd) { // 处理闰月
+ if (leap <= i && leap > 0) {
+ offset += this.leapDays(y); isAdd = true
+ }
+ }
+ offset += this.monthDays(y, i)
+ }
+ // 转换闰月农历 需补充该年闰月的前一个月的时差
+ if (isLeapMonth) { offset += day }
+ // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
+ var stmap = Date.UTC(1900, 1, 30, 0, 0, 0)
+ var calObj = new Date((offset + d - 31) * 86400000 + stmap)
+ var cY = calObj.getUTCFullYear()
+ var cM = calObj.getUTCMonth() + 1
+ var cD = calObj.getUTCDate()
+
+ return this.solar2lunar(cY, cM, cD)
+ }
+}
+
+export default calendar
diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json
new file mode 100644
index 0000000..fcbd13c
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json
@@ -0,0 +1,12 @@
+{
+ "uni-calender.ok": "ok",
+ "uni-calender.cancel": "cancel",
+ "uni-calender.today": "today",
+ "uni-calender.MON": "MON",
+ "uni-calender.TUE": "TUE",
+ "uni-calender.WED": "WED",
+ "uni-calender.THU": "THU",
+ "uni-calender.FRI": "FRI",
+ "uni-calender.SAT": "SAT",
+ "uni-calender.SUN": "SUN"
+}
diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js b/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js
new file mode 100644
index 0000000..de7509c
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js
@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+ en,
+ 'zh-Hans': zhHans,
+ 'zh-Hant': zhHant
+}
diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json
new file mode 100644
index 0000000..1ca43de
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json
@@ -0,0 +1,12 @@
+{
+ "uni-calender.ok": "确定",
+ "uni-calender.cancel": "取消",
+ "uni-calender.today": "今日",
+ "uni-calender.SUN": "日",
+ "uni-calender.MON": "一",
+ "uni-calender.TUE": "二",
+ "uni-calender.WED": "三",
+ "uni-calender.THU": "四",
+ "uni-calender.FRI": "五",
+ "uni-calender.SAT": "六"
+}
diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json
new file mode 100644
index 0000000..e0fe33b
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json
@@ -0,0 +1,12 @@
+{
+ "uni-calender.ok": "確定",
+ "uni-calender.cancel": "取消",
+ "uni-calender.today": "今日",
+ "uni-calender.SUN": "日",
+ "uni-calender.MON": "一",
+ "uni-calender.TUE": "二",
+ "uni-calender.WED": "三",
+ "uni-calender.THU": "四",
+ "uni-calender.FRI": "五",
+ "uni-calender.SAT": "六"
+}
diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue
new file mode 100644
index 0000000..369710e
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue
@@ -0,0 +1,188 @@
+
+
+
+
+ {{weeks.date}}
+ {{todayText}}
+ {{weeks.isDay ? todayText : (weeks.lunar.IDayCn === '初一'?weeks.lunar.IMonthCn:weeks.lunar.IDayCn)}}
+ {{weeks.extraInfo.info}}
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue
new file mode 100644
index 0000000..9cd0e69
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue
@@ -0,0 +1,562 @@
+
+
+
+
+
+
+
+
+ {{nowDate.month}}
+
+
+
+ {{SUNText}}
+
+
+ {{monText}}
+
+
+ {{TUEText}}
+
+
+ {{WEDText}}
+
+
+ {{THUText}}
+
+
+ {{FRIText}}
+
+
+ {{SATText}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-calendar/components/uni-calendar/util.js b/uni_modules/uni-calendar/components/uni-calendar/util.js
new file mode 100644
index 0000000..2d6100b
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/util.js
@@ -0,0 +1,350 @@
+import CALENDAR from './calendar.js'
+
+class Calendar {
+ constructor({
+ date,
+ selected,
+ startDate,
+ endDate,
+ range
+ } = {}) {
+ // 当前日期
+ this.date = this.getDate(new Date()) // 当前初入日期
+ // 打点信息
+ this.selected = selected || [];
+ // 范围开始
+ this.startDate = startDate
+ // 范围结束
+ this.endDate = endDate
+ this.range = range
+ // 多选状态
+ this.cleanMultipleStatus()
+ // 每周日期
+ this.weeks = {}
+ // this._getWeek(this.date.fullDate)
+ }
+ /**
+ * 设置日期
+ * @param {Object} date
+ */
+ setDate(date) {
+ this.selectDate = this.getDate(date)
+ this._getWeek(this.selectDate.fullDate)
+ }
+
+ /**
+ * 清理多选状态
+ */
+ cleanMultipleStatus() {
+ this.multipleStatus = {
+ before: '',
+ after: '',
+ data: []
+ }
+ }
+
+ /**
+ * 重置开始日期
+ */
+ resetSatrtDate(startDate) {
+ // 范围开始
+ this.startDate = startDate
+
+ }
+
+ /**
+ * 重置结束日期
+ */
+ resetEndDate(endDate) {
+ // 范围结束
+ this.endDate = endDate
+ }
+
+ /**
+ * 获取任意时间
+ */
+ getDate(date, AddDayCount = 0, str = 'day') {
+ if (!date) {
+ date = new Date()
+ }
+ if (typeof date !== 'object') {
+ date = date.replace(/-/g, '/')
+ }
+ const dd = new Date(date)
+ switch (str) {
+ case 'day':
+ dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
+ break
+ case 'month':
+ if (dd.getDate() === 31) {
+ dd.setDate(dd.getDate() + AddDayCount)
+ } else {
+ dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期
+ }
+ break
+ case 'year':
+ dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期
+ break
+ }
+ const y = dd.getFullYear()
+ const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
+ const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
+ return {
+ fullDate: y + '-' + m + '-' + d,
+ year: y,
+ month: m,
+ date: d,
+ day: dd.getDay()
+ }
+ }
+
+
+ /**
+ * 获取上月剩余天数
+ */
+ _getLastMonthDays(firstDay, full) {
+ let dateArr = []
+ for (let i = firstDay; i > 0; i--) {
+ const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate()
+ dateArr.push({
+ date: beforeDate,
+ month: full.month - 1,
+ lunar: this.getlunar(full.year, full.month - 1, beforeDate),
+ disable: true
+ })
+ }
+ return dateArr
+ }
+ /**
+ * 获取本月天数
+ */
+ _currentMonthDys(dateData, full) {
+ let dateArr = []
+ let fullDate = this.date.fullDate
+ for (let i = 1; i <= dateData; i++) {
+ let nowDate = full.year + '-' + (full.month < 10 ?
+ full.month : full.month) + '-' + (i < 10 ?
+ '0' + i : i)
+ // 是否今天
+ let isDay = fullDate === nowDate
+ // 获取打点信息
+ let info = this.selected && this.selected.find((item) => {
+ if (this.dateEqual(nowDate, item.date)) {
+ return item
+ }
+ })
+
+ // 日期禁用
+ let disableBefore = true
+ let disableAfter = true
+ if (this.startDate) {
+ // let dateCompBefore = this.dateCompare(this.startDate, fullDate)
+ // disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate)
+ disableBefore = this.dateCompare(this.startDate, nowDate)
+ }
+
+ if (this.endDate) {
+ // let dateCompAfter = this.dateCompare(fullDate, this.endDate)
+ // disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate)
+ disableAfter = this.dateCompare(nowDate, this.endDate)
+ }
+ let multiples = this.multipleStatus.data
+ let checked = false
+ let multiplesStatus = -1
+ if (this.range) {
+ if (multiples) {
+ multiplesStatus = multiples.findIndex((item) => {
+ return this.dateEqual(item, nowDate)
+ })
+ }
+ if (multiplesStatus !== -1) {
+ checked = true
+ }
+ }
+ let data = {
+ fullDate: nowDate,
+ year: full.year,
+ date: i,
+ multiple: this.range ? checked : false,
+ beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate),
+ afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate),
+ month: full.month,
+ lunar: this.getlunar(full.year, full.month, i),
+ disable: !(disableBefore && disableAfter),
+ isDay
+ }
+ if (info) {
+ data.extraInfo = info
+ }
+
+ dateArr.push(data)
+ }
+ return dateArr
+ }
+ /**
+ * 获取下月天数
+ */
+ _getNextMonthDays(surplus, full) {
+ let dateArr = []
+ for (let i = 1; i < surplus + 1; i++) {
+ dateArr.push({
+ date: i,
+ month: Number(full.month) + 1,
+ lunar: this.getlunar(full.year, Number(full.month) + 1, i),
+ disable: true
+ })
+ }
+ return dateArr
+ }
+
+ /**
+ * 获取当前日期详情
+ * @param {Object} date
+ */
+ getInfo(date) {
+ if (!date) {
+ date = new Date()
+ }
+ const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate)
+ return dateInfo
+ }
+
+ /**
+ * 比较时间大小
+ */
+ dateCompare(startDate, endDate) {
+ // 计算截止时间
+ startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
+ // 计算详细项的截止时间
+ endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
+ if (startDate <= endDate) {
+ return true
+ } else {
+ return false
+ }
+ }
+
+ /**
+ * 比较时间是否相等
+ */
+ dateEqual(before, after) {
+ // 计算截止时间
+ before = new Date(before.replace('-', '/').replace('-', '/'))
+ // 计算详细项的截止时间
+ after = new Date(after.replace('-', '/').replace('-', '/'))
+ if (before.getTime() - after.getTime() === 0) {
+ return true
+ } else {
+ return false
+ }
+ }
+
+
+ /**
+ * 获取日期范围内所有日期
+ * @param {Object} begin
+ * @param {Object} end
+ */
+ geDateAll(begin, end) {
+ var arr = []
+ var ab = begin.split('-')
+ var ae = end.split('-')
+ var db = new Date()
+ db.setFullYear(ab[0], ab[1] - 1, ab[2])
+ var de = new Date()
+ de.setFullYear(ae[0], ae[1] - 1, ae[2])
+ var unixDb = db.getTime() - 24 * 60 * 60 * 1000
+ var unixDe = de.getTime() - 24 * 60 * 60 * 1000
+ for (var k = unixDb; k <= unixDe;) {
+ k = k + 24 * 60 * 60 * 1000
+ arr.push(this.getDate(new Date(parseInt(k))).fullDate)
+ }
+ return arr
+ }
+ /**
+ * 计算阴历日期显示
+ */
+ getlunar(year, month, date) {
+ return CALENDAR.solar2lunar(year, month, date)
+ }
+ /**
+ * 设置打点
+ */
+ setSelectInfo(data, value) {
+ this.selected = value
+ this._getWeek(data)
+ }
+
+ /**
+ * 获取多选状态
+ */
+ setMultiple(fullDate) {
+ let {
+ before,
+ after
+ } = this.multipleStatus
+
+ if (!this.range) return
+ if (before && after) {
+ this.multipleStatus.before = ''
+ this.multipleStatus.after = ''
+ this.multipleStatus.data = []
+ } else {
+ if (!before) {
+ this.multipleStatus.before = fullDate
+ } else {
+ this.multipleStatus.after = fullDate
+ if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+ this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after);
+ } else {
+ this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before);
+ }
+ }
+ }
+ this._getWeek(fullDate)
+ }
+
+ /**
+ * 获取每周数据
+ * @param {Object} dateData
+ */
+ _getWeek(dateData) {
+ const {
+ year,
+ month
+ } = this.getDate(dateData)
+ let firstDay = new Date(year, month - 1, 1).getDay()
+ let currentDay = new Date(year, month, 0).getDate()
+ let dates = {
+ lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天
+ currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数
+ nextMonthDays: [], // 下个月开始几天
+ weeks: []
+ }
+ let canlender = []
+ const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length)
+ dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData))
+ canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays)
+ let weeks = {}
+ // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天
+ for (let i = 0; i < canlender.length; i++) {
+ if (i % 7 === 0) {
+ weeks[parseInt(i / 7)] = new Array(7)
+ }
+ weeks[parseInt(i / 7)][i % 7] = canlender[i]
+ }
+ this.canlender = canlender
+ this.weeks = weeks
+ }
+
+ //静态方法
+ // static init(date) {
+ // if (!this.instance) {
+ // this.instance = new Calendar(date);
+ // }
+ // return this.instance;
+ // }
+}
+
+
+export default Calendar
diff --git a/uni_modules/uni-calendar/package.json b/uni_modules/uni-calendar/package.json
new file mode 100644
index 0000000..c59180c
--- /dev/null
+++ b/uni_modules/uni-calendar/package.json
@@ -0,0 +1,85 @@
+{
+ "id": "uni-calendar",
+ "displayName": "uni-calendar 日历",
+ "version": "1.4.7",
+ "description": "日历组件",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "日历",
+ "",
+ "打卡",
+ "日历选择"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-calendar/readme.md b/uni_modules/uni-calendar/readme.md
new file mode 100644
index 0000000..4f3ca0e
--- /dev/null
+++ b/uni_modules/uni-calendar/readme.md
@@ -0,0 +1,103 @@
+
+
+## Calendar 日历
+> **组件名:uni-calendar**
+> 代码块: `uCalendar`
+
+
+日历组件
+
+> **注意事项**
+> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。
+> - 本组件农历转换使用的js是 [@1900-2100区间内的公历、农历互转](https://github.com/jjonline/calendar.js)
+> - 仅支持自定义组件模式
+> - `date`属性传入的应该是一个 String ,如: 2019-06-27 ,而不是 new Date()
+> - 通过 `insert` 属性来确定当前的事件是 @change 还是 @confirm 。理应合并为一个事件,但是为了区分模式,现使用两个事件,这里需要注意
+> - 弹窗模式下无法阻止后面的元素滚动,如有需要阻止,请在弹窗弹出后,手动设置滚动元素为不可滚动
+
+
+### 安装方式
+
+本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。
+
+如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+### 基本用法
+
+在 ``template`` 中使用组件
+
+```html
+
+
+
+```
+
+### 通过方法打开日历
+
+需要设置 `insert` 为 `false`
+
+```html
+
+
+
+
+```
+
+```javascript
+
+export default {
+ data() {
+ return {};
+ },
+ methods: {
+ open(){
+ this.$refs.calendar.open();
+ },
+ confirm(e) {
+ console.log(e);
+ }
+ }
+};
+
+```
+
+
+## API
+
+### Calendar Props
+
+| 属性名 | 类型 | 默认值| 说明 |
+| | |
+| date | String |- | 自定义当前时间,默认为今天 |
+| lunar | Boolean | false | 显示农历 |
+| startDate | String |- | 日期选择范围-开始日期 |
+| endDate | String |- | 日期选择范围-结束日期 |
+| range | Boolean | false | 范围选择 |
+| insert | Boolean | false | 插入模式,可选值,ture:插入模式;false:弹窗模式;默认为插入模式 |
+|clearDate |Boolean |true |弹窗模式是否清空上次选择内容 |
+| selected | Array |- | 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}] |
+|showMonth | Boolean | true | 是否显示月份为背景 |
+
+### Calendar Events
+
+| 事件名 | 说明 |返回值|
+| | | |
+| open | 弹出日历组件,`insert :false` 时生效|- |
+
+
+
+
+
+## 组件示例
+
+点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/calendar/calendar](https://hellouniapp.dcloud.net.cn/pages/extUI/calendar/calendar)
\ No newline at end of file
diff --git a/uni_modules/uni-card/changelog.md b/uni_modules/uni-card/changelog.md
new file mode 100644
index 0000000..c3cd8c4
--- /dev/null
+++ b/uni_modules/uni-card/changelog.md
@@ -0,0 +1,26 @@
+## 1.3.1(2021-12-20)
+- 修复 在vue页面下略缩图显示不正常的bug
+## 1.3.0(2021-11-19)
+- 重构插槽的用法 ,header 替换为 title
+- 新增 actions 插槽
+- 新增 cover 封面图属性和插槽
+- 新增 padding 内容默认内边距离
+- 新增 margin 卡片默认外边距离
+- 新增 spacing 卡片默认内边距
+- 新增 shadow 卡片阴影属性
+- 取消 mode 属性,可使用组合插槽代替
+- 取消 note 属性 ,使用actions插槽代替
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-card](https://uniapp.dcloud.io/component/uniui/uni-card)
+## 1.2.1(2021-07-30)
+- 优化 vue3下事件警告的问题
+## 1.2.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.8(2021-07-01)
+- 优化 图文卡片无图片加载时,提供占位图标
+- 新增 header 插槽,自定义卡片头部( 图文卡片 mode="style" 时,不支持)
+- 修复 thumbnail 不存在仍然占位的 bug
+## 1.1.7(2021-05-12)
+- 新增 组件示例地址
+## 1.1.6(2021-02-04)
+- 调整为uni_modules目录规范
diff --git a/uni_modules/uni-card/components/uni-card/uni-card.vue b/uni_modules/uni-card/components/uni-card/uni-card.vue
new file mode 100644
index 0000000..38cf594
--- /dev/null
+++ b/uni_modules/uni-card/components/uni-card/uni-card.vue
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-card/package.json b/uni_modules/uni-card/package.json
new file mode 100644
index 0000000..f16224d
--- /dev/null
+++ b/uni_modules/uni-card/package.json
@@ -0,0 +1,90 @@
+{
+ "id": "uni-card",
+ "displayName": "uni-card 卡片",
+ "version": "1.3.1",
+ "description": "Card 组件,提供常见的卡片样式。",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "card",
+ "",
+ "卡片"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-icons",
+ "uni-scss"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-card/readme.md b/uni_modules/uni-card/readme.md
new file mode 100644
index 0000000..7434e71
--- /dev/null
+++ b/uni_modules/uni-card/readme.md
@@ -0,0 +1,12 @@
+
+
+## Card 卡片
+> **组件名:uni-card**
+> 代码块: `uCard`
+
+卡片视图组件。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-card)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
+
+
diff --git a/uni_modules/uni-collapse/changelog.md b/uni_modules/uni-collapse/changelog.md
new file mode 100644
index 0000000..292e4c7
--- /dev/null
+++ b/uni_modules/uni-collapse/changelog.md
@@ -0,0 +1,36 @@
+## 1.4.3(2022-01-25)
+- 修复 初始化的时候 ,open 属性失效的bug
+## 1.4.2(2022-01-21)
+- 修复 微信小程序resize后组件收起的bug
+## 1.4.1(2021-11-22)
+- 修复 vue3中个别scss变量无法找到的问题
+## 1.4.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-collapse](https://uniapp.dcloud.io/component/uniui/uni-collapse)
+## 1.3.3(2021-08-17)
+- 优化 show-arrow 属性默认为true
+## 1.3.2(2021-08-17)
+- 新增 show-arrow 属性,控制是否显示右侧箭头
+## 1.3.1(2021-07-30)
+- 优化 vue3下小程序事件警告的问题
+## 1.3.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.2.2(2021-07-21)
+- 修复 由1.2.0版本引起的 change 事件返回 undefined 的Bug
+## 1.2.1(2021-07-21)
+- 优化 组件示例
+## 1.2.0(2021-07-21)
+- 新增 组件折叠动画
+- 新增 value\v-model 属性 ,动态修改面板折叠状态
+- 新增 title 插槽 ,可定义面板标题
+- 新增 border 属性 ,显示隐藏面板内容分隔线
+- 新增 title-border 属性 ,显示隐藏面板标题分隔线
+- 修复 resize 方法失效的Bug
+- 修复 change 事件返回参数不正确的Bug
+- 优化 H5、App 平台自动更具内容更新高度,无需调用 reszie() 方法
+## 1.1.7(2021-05-12)
+- 新增 组件示例地址
+## 1.1.6(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+## 1.1.5(2021-02-05)
+- 调整为uni_modules目录规范
\ No newline at end of file
diff --git a/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue
new file mode 100644
index 0000000..d62a6a7
--- /dev/null
+++ b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue
@@ -0,0 +1,402 @@
+
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue b/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue
new file mode 100644
index 0000000..384c39a
--- /dev/null
+++ b/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-collapse/package.json b/uni_modules/uni-collapse/package.json
new file mode 100644
index 0000000..65349cf
--- /dev/null
+++ b/uni_modules/uni-collapse/package.json
@@ -0,0 +1,89 @@
+{
+ "id": "uni-collapse",
+ "displayName": "uni-collapse 折叠面板",
+ "version": "1.4.3",
+ "description": "Collapse 组件,可以折叠 / 展开的内容区域。",
+ "keywords": [
+ "uni-ui",
+ "折叠",
+ "折叠面板",
+ "手风琴"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-icons"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-collapse/readme.md b/uni_modules/uni-collapse/readme.md
new file mode 100644
index 0000000..bc758eb
--- /dev/null
+++ b/uni_modules/uni-collapse/readme.md
@@ -0,0 +1,12 @@
+
+
+## Collapse 折叠面板
+> **组件名:uni-collapse**
+> 代码块: `uCollapse`
+> 关联组件:`uni-collapse-item`、`uni-icons`。
+
+
+折叠面板用来折叠/显示过长的内容或者是列表。通常是在多内容分类项使用,折叠不重要的内容,显示重要内容。点击可以展开折叠部分。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-collapse)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-combox/changelog.md b/uni_modules/uni-combox/changelog.md
new file mode 100644
index 0000000..23c2748
--- /dev/null
+++ b/uni_modules/uni-combox/changelog.md
@@ -0,0 +1,15 @@
+## 1.0.1(2021-11-23)
+- 优化 label、label-width 属性
+## 1.0.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-combox](https://uniapp.dcloud.io/component/uniui/uni-combox)
+## 0.1.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 0.0.6(2021-05-12)
+- 新增 组件示例地址
+## 0.0.5(2021-04-21)
+- 优化 添加依赖 uni-icons, 导入后自动下载依赖
+## 0.0.4(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+## 0.0.3(2021-02-04)
+- 调整为uni_modules目录规范
diff --git a/uni_modules/uni-combox/components/uni-combox/uni-combox.vue b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue
new file mode 100644
index 0000000..d4cb79d
--- /dev/null
+++ b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue
@@ -0,0 +1,275 @@
+
+
+
+ {{label}}
+
+
+
+
+
+
+
+
+
+
+ {{emptyTips}}
+
+
+ {{item}}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-combox/package.json b/uni_modules/uni-combox/package.json
new file mode 100644
index 0000000..4a05c3f
--- /dev/null
+++ b/uni_modules/uni-combox/package.json
@@ -0,0 +1,90 @@
+{
+ "id": "uni-combox",
+ "displayName": "uni-combox 组合框",
+ "version": "1.0.1",
+ "description": "可以选择也可以输入的表单项 ",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "combox",
+ "组合框",
+ "select"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-icons"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "n"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-combox/readme.md b/uni_modules/uni-combox/readme.md
new file mode 100644
index 0000000..ffa2cc8
--- /dev/null
+++ b/uni_modules/uni-combox/readme.md
@@ -0,0 +1,11 @@
+
+
+## Combox 组合框
+> **组件名:uni-combox**
+> 代码块: `uCombox`
+
+
+组合框组件。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-combox)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-config-center/changelog.md b/uni_modules/uni-config-center/changelog.md
new file mode 100644
index 0000000..4d2eb92
--- /dev/null
+++ b/uni_modules/uni-config-center/changelog.md
@@ -0,0 +1,4 @@
+## 0.0.2(2021-04-16)
+- 修改插件package信息
+## 0.0.1(2021-03-15)
+- 初始化项目
diff --git a/uni_modules/uni-config-center/package.json b/uni_modules/uni-config-center/package.json
new file mode 100644
index 0000000..c5dec93
--- /dev/null
+++ b/uni_modules/uni-config-center/package.json
@@ -0,0 +1,80 @@
+{
+ "id": "uni-config-center",
+ "displayName": "uni-config-center",
+ "version": "0.0.2",
+ "description": "uniCloud 配置中心",
+ "keywords": [
+ "配置",
+ "配置中心"
+],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "category": [
+ "uniCloud",
+ "云函数模板"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "directories": {
+ "example": "../../../scripts/dist"
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "u",
+ "app-nvue": "u"
+ },
+ "H5-mobile": {
+ "Safari": "u",
+ "Android Browser": "u",
+ "微信浏览器(Android)": "u",
+ "QQ浏览器(Android)": "u"
+ },
+ "H5-pc": {
+ "Chrome": "u",
+ "IE": "u",
+ "Edge": "u",
+ "Firefox": "u",
+ "Safari": "u"
+ },
+ "小程序": {
+ "微信": "u",
+ "阿里": "u",
+ "百度": "u",
+ "字节跳动": "u",
+ "QQ": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-config-center/readme.md b/uni_modules/uni-config-center/readme.md
new file mode 100644
index 0000000..03f7fc2
--- /dev/null
+++ b/uni_modules/uni-config-center/readme.md
@@ -0,0 +1,93 @@
+# 为什么使用uni-config-center
+
+实际开发中很多插件需要配置文件才可以正常运行,如果每个插件都单独进行配置的话就会产生下面这样的目录结构
+
+```bash
+cloudfunctions
+└─────common 公共模块
+ ├─plugin-a // 插件A对应的目录
+ │ ├─index.js
+ │ ├─config.json // plugin-a对应的配置文件
+ │ └─other-file.cert // plugin-a依赖的其他文件
+ └─plugin-b // plugin-b对应的目录
+ ├─index.js
+ └─config.json // plugin-b对应的配置文件
+```
+
+假设插件作者要发布一个项目模板,里面使用了很多需要配置的插件,无论是作者发布还是用户使用都是一个大麻烦。
+
+uni-config-center就是用了统一管理这些配置文件的,使用uni-config-center后的目录结构如下
+
+```bash
+cloudfunctions
+└─────common 公共模块
+ ├─plugin-a // 插件A对应的目录
+ │ └─index.js
+ ├─plugin-b // plugin-b对应的目录
+ │ └─index.js
+ └─uni-config-center
+ ├─index.js // config-center入口文件
+ ├─plugin-a
+ │ ├─config.json // plugin-a对应的配置文件
+ │ └─other-file.cert // plugin-a依赖的其他文件
+ └─plugin-b
+ └─config.json // plugin-b对应的配置文件
+```
+
+使用uni-config-center后的优势
+
+- 配置文件统一管理,分离插件主体和配置信息,更新插件更方便
+- 支持对config.json设置schema,插件使用者在HBuilderX内编写config.json文件时会有更好的提示(后续HBuilderX会提供支持)
+
+# 用法
+
+在要使用uni-config-center的公共模块或云函数内引入uni-config-center依赖,请参考:[使用公共模块](https://uniapp.dcloud.net.cn/uniCloud/cf-common)
+
+```js
+const createConfig = require('uni-config-center')
+
+const uniIdConfig = createConfig({
+ pluginId: 'uni-id', // 插件id
+ defaultConfig: { // 默认配置
+ tokenExpiresIn: 7200,
+ tokenExpiresThreshold: 600,
+ },
+ customMerge: function(defaultConfig, userConfig) { // 自定义默认配置和用户配置的合并规则,不设置的情况侠会对默认配置和用户配置进行深度合并
+ // defaudltConfig 默认配置
+ // userConfig 用户配置
+ return Object.assign(defaultConfig, userConfig)
+ }
+})
+
+
+// 以如下配置为例
+// {
+// "tokenExpiresIn": 7200,
+// "passwordErrorLimit": 6,
+// "bindTokenToDevice": false,
+// "passwordErrorRetryTime": 3600,
+// "app-plus": {
+// "tokenExpiresIn": 2592000
+// },
+// "service": {
+// "sms": {
+// "codeExpiresIn": 300
+// }
+// }
+// }
+
+// 获取配置
+uniIdConfig.config() // 获取全部配置,注意:uni-config-center内不存在对应插件目录时会返回空对象
+uniIdConfig.config('tokenExpiresIn') // 指定键值获取配置,返回:7200
+uniIdConfig.config('service.sms.codeExpiresIn') // 指定键值获取配置,返回:300
+uniIdConfig.config('tokenExpiresThreshold', 600) // 指定键值获取配置,如果不存在则取传入的默认值,返回:600
+
+// 获取文件绝对路径
+uniIdConfig.resolve('custom-token.js') // 获取uni-config-center/uni-id/custom-token.js文件的路径
+
+// 引用文件(require)
+uniIDConfig.requireFile('custom-token.js') // 使用require方式引用uni-config-center/uni-id/custom-token.js文件。文件不存在时返回undefined,文件内有其他错误导致require失败时会抛出错误。
+
+// 判断是否包含某文件
+uniIDConfig.hasFile('custom-token.js') // 配置目录是否包含某文件,true: 文件存在,false: 文件不存在
+```
\ No newline at end of file
diff --git a/uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js b/uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js
new file mode 100644
index 0000000..e14fb3b
--- /dev/null
+++ b/uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js
@@ -0,0 +1 @@
+"use strict";var t=require("fs"),r=require("path");function e(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var n=e(t),o=e(r),i="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var u=function(t){var r={exports:{}};return t(r,r.exports),r.exports}((function(t,r){var e="__lodash_hash_undefined__",n=9007199254740991,o="[object Arguments]",u="[object Function]",c="[object Object]",a=/^\[object .+?Constructor\]$/,f=/^(?:0|[1-9]\d*)$/,s={};s["[object Float32Array]"]=s["[object Float64Array]"]=s["[object Int8Array]"]=s["[object Int16Array]"]=s["[object Int32Array]"]=s["[object Uint8Array]"]=s["[object Uint8ClampedArray]"]=s["[object Uint16Array]"]=s["[object Uint32Array]"]=!0,s[o]=s["[object Array]"]=s["[object ArrayBuffer]"]=s["[object Boolean]"]=s["[object DataView]"]=s["[object Date]"]=s["[object Error]"]=s[u]=s["[object Map]"]=s["[object Number]"]=s[c]=s["[object RegExp]"]=s["[object Set]"]=s["[object String]"]=s["[object WeakMap]"]=!1;var l="object"==typeof i&&i&&i.Object===Object&&i,h="object"==typeof self&&self&&self.Object===Object&&self,p=l||h||Function("return this")(),_=r&&!r.nodeType&&r,v=_&&t&&!t.nodeType&&t,d=v&&v.exports===_,y=d&&l.process,g=function(){try{var t=v&&v.require&&v.require("util").types;return t||y&&y.binding&&y.binding("util")}catch(t){}}(),b=g&&g.isTypedArray;function j(t,r,e){switch(e.length){case 0:return t.call(r);case 1:return t.call(r,e[0]);case 2:return t.call(r,e[0],e[1]);case 3:return t.call(r,e[0],e[1],e[2])}return t.apply(r,e)}var w,O,m,A=Array.prototype,z=Function.prototype,M=Object.prototype,x=p["__core-js_shared__"],C=z.toString,F=M.hasOwnProperty,U=(w=/[^.]+$/.exec(x&&x.keys&&x.keys.IE_PROTO||""))?"Symbol(src)_1."+w:"",S=M.toString,I=C.call(Object),P=RegExp("^"+C.call(F).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),T=d?p.Buffer:void 0,q=p.Symbol,E=p.Uint8Array,$=T?T.allocUnsafe:void 0,D=(O=Object.getPrototypeOf,m=Object,function(t){return O(m(t))}),k=Object.create,B=M.propertyIsEnumerable,N=A.splice,L=q?q.toStringTag:void 0,R=function(){try{var t=_t(Object,"defineProperty");return t({},"",{}),t}catch(t){}}(),G=T?T.isBuffer:void 0,V=Math.max,W=Date.now,H=_t(p,"Map"),J=_t(Object,"create"),K=function(){function t(){}return function(r){if(!Mt(r))return{};if(k)return k(r);t.prototype=r;var e=new t;return t.prototype=void 0,e}}();function Q(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1},X.prototype.set=function(t,r){var e=this.__data__,n=nt(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this},Y.prototype.clear=function(){this.size=0,this.__data__={hash:new Q,map:new(H||X),string:new Q}},Y.prototype.delete=function(t){var r=pt(this,t).delete(t);return this.size-=r?1:0,r},Y.prototype.get=function(t){return pt(this,t).get(t)},Y.prototype.has=function(t){return pt(this,t).has(t)},Y.prototype.set=function(t,r){var e=pt(this,t),n=e.size;return e.set(t,r),this.size+=e.size==n?0:1,this},Z.prototype.clear=function(){this.__data__=new X,this.size=0},Z.prototype.delete=function(t){var r=this.__data__,e=r.delete(t);return this.size=r.size,e},Z.prototype.get=function(t){return this.__data__.get(t)},Z.prototype.has=function(t){return this.__data__.has(t)},Z.prototype.set=function(t,r){var e=this.__data__;if(e instanceof X){var n=e.__data__;if(!H||n.length<199)return n.push([t,r]),this.size=++e.size,this;e=this.__data__=new Y(n)}return e.set(t,r),this.size=e.size,this};var it,ut=function(t,r,e){for(var n=-1,o=Object(t),i=e(t),u=i.length;u--;){var c=i[it?u:++n];if(!1===r(o[c],c,o))break}return t};function ct(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":L&&L in Object(t)?function(t){var r=F.call(t,L),e=t[L];try{t[L]=void 0;var n=!0}catch(t){}var o=S.call(t);n&&(r?t[L]=e:delete t[L]);return o}(t):function(t){return S.call(t)}(t)}function at(t){return xt(t)&&ct(t)==o}function ft(t){return!(!Mt(t)||function(t){return!!U&&U in t}(t))&&(At(t)?P:a).test(function(t){if(null!=t){try{return C.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t))}function st(t){if(!Mt(t))return function(t){var r=[];if(null!=t)for(var e in Object(t))r.push(e);return r}(t);var r=dt(t),e=[];for(var n in t)("constructor"!=n||!r&&F.call(t,n))&&e.push(n);return e}function lt(t,r,e,n,o){t!==r&&ut(r,(function(i,u){if(o||(o=new Z),Mt(i))!function(t,r,e,n,o,i,u){var a=yt(t,e),f=yt(r,e),s=u.get(f);if(s)return void rt(t,e,s);var l=i?i(a,f,e+"",t,r,u):void 0,h=void 0===l;if(h){var p=wt(f),_=!p&&mt(f),v=!p&&!_&&Ct(f);l=f,p||_||v?wt(a)?l=a:xt(j=a)&&Ot(j)?l=function(t,r){var e=-1,n=t.length;r||(r=Array(n));for(;++e-1&&t%1==0&&t0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(R?function(t,r){return R(t,"toString",{configurable:!0,enumerable:!1,value:(e=r,function(){return e}),writable:!0});var e}:It);function bt(t,r){return t===r||t!=t&&r!=r}var jt=at(function(){return arguments}())?at:function(t){return xt(t)&&F.call(t,"callee")&&!B.call(t,"callee")},wt=Array.isArray;function Ot(t){return null!=t&&zt(t.length)&&!At(t)}var mt=G||function(){return!1};function At(t){if(!Mt(t))return!1;var r=ct(t);return r==u||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}function zt(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=n}function Mt(t){var r=typeof t;return null!=t&&("object"==r||"function"==r)}function xt(t){return null!=t&&"object"==typeof t}var Ct=b?function(t){return function(r){return t(r)}}(b):function(t){return xt(t)&&zt(t.length)&&!!s[ct(t)]};function Ft(t){return Ot(t)?tt(t,!0):st(t)}var Ut,St=(Ut=function(t,r,e){lt(t,r,e)},ht((function(t,r){var e=-1,n=r.length,o=n>1?r[n-1]:void 0,i=n>2?r[2]:void 0;for(o=Ut.length>3&&"function"==typeof o?(n--,o):void 0,i&&function(t,r,e){if(!Mt(e))return!1;var n=typeof r;return!!("number"==n?Ot(e)&&vt(r,e.length):"string"==n&&r in e)&&bt(e[r],t)}(r[0],r[1],i)&&(o=n<3?void 0:o,n=1),t=Object(t);++ec.call(t,r);class f{constructor({pluginId:t,defaultConfig:r={},customMerge:e,root:n}){this.pluginId=t,this.defaultConfig=r,this.pluginConfigPath=o.default.resolve(n||__dirname,t),this.customMerge=e,this._config=void 0}resolve(t){return o.default.resolve(this.pluginConfigPath,t)}hasFile(t){return n.default.existsSync(this.resolve(t))}requireFile(t){try{return require(this.resolve(t))}catch(t){if("MODULE_NOT_FOUND"===t.code)return;throw t}}_getUserConfig(){return this.requireFile("config.json")}config(t,r){this._config||(this._config=(this.customMerge||u)(this.defaultConfig,this._getUserConfig()));let e=this._config;return t?function(t,r,e){if("number"==typeof r)return t[r];if("symbol"==typeof r)return a(t,r)?t[r]:e;const n="string"!=typeof(o=r)?o:o.split(".").reduce(((t,r)=>(r.split(/\[([^}]+)\]/g).forEach((r=>r&&t.push(r))),t)),[]);var o;let i=t;for(let t=0;t
+
+ {{ d }}
+ {{dayText}}
+ {{ h }}
+ {{ showColon ? ':' : hourText }}
+ {{ i }}
+ {{ showColon ? ':' : minuteText }}
+ {{ s }}
+ {{secondText}}
+
+
+
+
diff --git a/uni_modules/uni-countdown/package.json b/uni_modules/uni-countdown/package.json
new file mode 100644
index 0000000..70e99ee
--- /dev/null
+++ b/uni_modules/uni-countdown/package.json
@@ -0,0 +1,86 @@
+{
+ "id": "uni-countdown",
+ "displayName": "uni-countdown 倒计时",
+ "version": "1.2.2",
+ "description": "CountDown 倒计时组件",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "countdown",
+ "倒计时"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-countdown/readme.md b/uni_modules/uni-countdown/readme.md
new file mode 100644
index 0000000..4bcb1aa
--- /dev/null
+++ b/uni_modules/uni-countdown/readme.md
@@ -0,0 +1,10 @@
+
+
+## CountDown 倒计时
+> **组件名:uni-countdown**
+> 代码块: `uCountDown`
+
+倒计时组件。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-countdown)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-data-checkbox/changelog.md b/uni_modules/uni-data-checkbox/changelog.md
new file mode 100644
index 0000000..c7a468a
--- /dev/null
+++ b/uni_modules/uni-data-checkbox/changelog.md
@@ -0,0 +1,45 @@
+## 1.0.3(2022-09-16)
+- 可以使用 uni-scss 控制主题色
+## 1.0.2(2022-06-30)
+- 优化 在 uni-forms 中的依赖注入方式
+## 1.0.1(2022-02-07)
+- 修复 multiple 为 true 时,v-model 的值为 null 报错的 bug
+## 1.0.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-data-checkbox](https://uniapp.dcloud.io/component/uniui/uni-data-checkbox)
+## 0.2.5(2021-08-23)
+- 修复 在uni-forms中 modelValue 中不存在当前字段,当前字段必填写也不参与校验的问题
+## 0.2.4(2021-08-17)
+- 修复 单选 list 模式下 ,icon 为 left 时,选中图标不显示的问题
+## 0.2.3(2021-08-11)
+- 修复 在 uni-forms 中重置表单,错误信息无法清除的问题
+## 0.2.2(2021-07-30)
+- 优化 在uni-forms组件,与label不对齐的问题
+## 0.2.1(2021-07-27)
+- 修复 单选默认值为0不能选中的Bug
+## 0.2.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 0.1.11(2021-07-06)
+- 优化 删除无用日志
+## 0.1.10(2021-07-05)
+- 修复 由 0.1.9 引起的非 nvue 端图标不显示的问题
+## 0.1.9(2021-07-05)
+- 修复 nvue 黑框样式问题
+## 0.1.8(2021-06-28)
+- 修复 selectedTextColor 属性不生效的Bug
+## 0.1.7(2021-06-02)
+- 新增 map 属性,可以方便映射text/value属性
+## 0.1.6(2021-05-26)
+- 修复 不关联服务空间的情况下组件报错的Bug
+## 0.1.5(2021-05-12)
+- 新增 组件示例地址
+## 0.1.4(2021-04-09)
+- 修复 nvue 下无法选中的问题
+## 0.1.3(2021-03-22)
+- 新增 disabled属性
+## 0.1.2(2021-02-24)
+- 优化 默认颜色显示
+## 0.1.1(2021-02-24)
+- 新增 支持nvue
+## 0.1.0(2021-02-18)
+- “暂无数据”显示居中
diff --git a/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue b/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue
new file mode 100644
index 0000000..3c75d9f
--- /dev/null
+++ b/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue
@@ -0,0 +1,821 @@
+
+
+
+
+
+ {{mixinDatacomErrorMessage}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-data-checkbox/package.json b/uni_modules/uni-data-checkbox/package.json
new file mode 100644
index 0000000..113c350
--- /dev/null
+++ b/uni_modules/uni-data-checkbox/package.json
@@ -0,0 +1,84 @@
+{
+ "id": "uni-data-checkbox",
+ "displayName": "uni-data-checkbox 数据选择器",
+ "version": "1.0.3",
+ "description": "通过数据驱动的单选框和复选框",
+ "keywords": [
+ "uni-ui",
+ "checkbox",
+ "单选",
+ "多选",
+ "单选多选"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": "^3.1.1"
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-load-more","uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-data-checkbox/readme.md b/uni_modules/uni-data-checkbox/readme.md
new file mode 100644
index 0000000..6eb253d
--- /dev/null
+++ b/uni_modules/uni-data-checkbox/readme.md
@@ -0,0 +1,18 @@
+
+
+## DataCheckbox 数据驱动的单选复选框
+> **组件名:uni-data-checkbox**
+> 代码块: `uDataCheckbox`
+
+
+本组件是基于uni-app基础组件checkbox的封装。本组件要解决问题包括:
+
+1. 数据绑定型组件:给本组件绑定一个data,会自动渲染一组候选内容。再以往,开发者需要编写不少代码实现类似功能
+2. 自动的表单校验:组件绑定了data,且符合[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)组件的表单校验规范,搭配使用会自动实现表单校验
+3. 本组件合并了单选多选
+4. 本组件有若干风格选择,如普通的单选多选框、并列button风格、tag风格。开发者可以快速选择需要的风格。但作为一个封装组件,样式代码虽然不用自己写了,却会牺牲一定的样式自定义性
+
+在uniCloud开发中,`DB Schema`中配置了enum枚举等类型后,在web控制台的[自动生成表单](https://uniapp.dcloud.io/uniCloud/schema?id=autocode)功能中,会自动生成``uni-data-checkbox``组件并绑定好data
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-checkbox)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-data-picker/changelog.md b/uni_modules/uni-data-picker/changelog.md
new file mode 100644
index 0000000..8451fb3
--- /dev/null
+++ b/uni_modules/uni-data-picker/changelog.md
@@ -0,0 +1,66 @@
+## 1.0.8(2022-09-16)
+- 可以使用 uni-scss 控制主题色
+## 1.0.7(2022-07-06)
+- 优化 pc端图标位置不正确的问题
+## 1.0.6(2022-07-05)
+- 优化 显示样式
+## 1.0.5(2022-07-04)
+- 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug
+## 1.0.4(2022-04-19)
+- 修复 字节小程序 本地数据无法选择下一级的Bug
+## 1.0.3(2022-02-25)
+- 修复 nvue 不支持的 v-show 的 bug
+## 1.0.2(2022-02-25)
+- 修复 条件编译 nvue 不支持的 css 样式
+## 1.0.1(2021-11-23)
+- 修复 由上个版本引发的map、v-model等属性不生效的bug
+## 1.0.0(2021-11-19)
+- 优化 组件 UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-data-picker](https://uniapp.dcloud.io/component/uniui/uni-data-picker)
+## 0.4.9(2021-10-28)
+- 修复 VUE2 v-model 概率无效的 bug
+## 0.4.8(2021-10-27)
+- 修复 v-model 概率无效的 bug
+## 0.4.7(2021-10-25)
+- 新增 属性 spaceInfo 服务空间配置 HBuilderX 3.2.11+
+- 修复 树型 uniCloud 数据类型为 int 时报错的 bug
+## 0.4.6(2021-10-19)
+- 修复 非 VUE3 v-model 为 0 时无法选中的 bug
+## 0.4.5(2021-09-26)
+- 新增 清除已选项的功能(通过 clearIcon 属性配置是否显示按钮),同时提供 clear 方法以供调用,二者等效
+- 修复 readonly 为 true 时报错的 bug
+## 0.4.4(2021-09-26)
+- 修复 上一版本造成的 map 属性失效的 bug
+- 新增 ellipsis 属性,支持配置 tab 选项长度过长时是否自动省略
+## 0.4.3(2021-09-24)
+- 修复 某些情况下级联未触发的 bug
+## 0.4.2(2021-09-23)
+- 新增 提供 show 和 hide 方法,开发者可以通过 ref 调用
+- 新增 选项内容过长自动添加省略号
+## 0.4.1(2021-09-15)
+- 新增 map 属性 字段映射,将 text/value 映射到数据中的其他字段
+## 0.4.0(2021-07-13)
+- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 0.3.5(2021-06-04)
+- 修复 无法加载云端数据的问题
+## 0.3.4(2021-05-28)
+- 修复 v-model 无效问题
+- 修复 loaddata 为空数据组时加载时间过长问题
+- 修复 上个版本引出的本地数据无法选择带有 children 的 2 级节点
+## 0.3.3(2021-05-12)
+- 新增 组件示例地址
+## 0.3.2(2021-04-22)
+- 修复 非树形数据有 where 属性查询报错的问题
+## 0.3.1(2021-04-15)
+- 修复 本地数据概率无法回显时问题
+## 0.3.0(2021-04-07)
+- 新增 支持云端非树形表结构数据
+- 修复 根节点 parent_field 字段等于 null 时选择界面错乱问题
+## 0.2.0(2021-03-15)
+- 修复 nodeclick、popupopened、popupclosed 事件无法触发的问题
+## 0.1.9(2021-03-09)
+- 修复 微信小程序某些情况下无法选择的问题
+## 0.1.8(2021-02-05)
+- 优化 部分样式在 nvue 上的兼容表现
+## 0.1.7(2021-02-05)
+- 调整为 uni_modules 目录规范
diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js
new file mode 100644
index 0000000..6ef26a2
--- /dev/null
+++ b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js
@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+ name: 'Keypress',
+ props: {
+ disable: {
+ type: Boolean,
+ default: false
+ }
+ },
+ mounted () {
+ const keyNames = {
+ esc: ['Esc', 'Escape'],
+ tab: 'Tab',
+ enter: 'Enter',
+ space: [' ', 'Spacebar'],
+ up: ['Up', 'ArrowUp'],
+ left: ['Left', 'ArrowLeft'],
+ right: ['Right', 'ArrowRight'],
+ down: ['Down', 'ArrowDown'],
+ delete: ['Backspace', 'Delete', 'Del']
+ }
+ const listener = ($event) => {
+ if (this.disable) {
+ return
+ }
+ const keyName = Object.keys(keyNames).find(key => {
+ const keyName = $event.key
+ const value = keyNames[key]
+ return value === keyName || (Array.isArray(value) && value.includes(keyName))
+ })
+ if (keyName) {
+ // 避免和其他按键事件冲突
+ setTimeout(() => {
+ this.$emit(keyName, {})
+ }, 0)
+ }
+ }
+ document.addEventListener('keyup', listener)
+ this.$once('hook:beforeDestroy', () => {
+ document.removeEventListener('keyup', listener)
+ })
+ },
+ render: () => {}
+}
+// #endif
diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue
new file mode 100644
index 0000000..4553627
--- /dev/null
+++ b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue
@@ -0,0 +1,554 @@
+
+
+
+
+
+ {{errorMessage}}
+
+
+
+
+
+
+ {{item.text}}{{split}}
+
+
+
+ {{placeholder}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{popupTitle}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js
new file mode 100644
index 0000000..c12fd54
--- /dev/null
+++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js
@@ -0,0 +1,563 @@
+export default {
+ props: {
+ localdata: {
+ type: [Array, Object],
+ default () {
+ return []
+ }
+ },
+ spaceInfo: {
+ type: Object,
+ default () {
+ return {}
+ }
+ },
+ collection: {
+ type: String,
+ default: ''
+ },
+ action: {
+ type: String,
+ default: ''
+ },
+ field: {
+ type: String,
+ default: ''
+ },
+ orderby: {
+ type: String,
+ default: ''
+ },
+ where: {
+ type: [String, Object],
+ default: ''
+ },
+ pageData: {
+ type: String,
+ default: 'add'
+ },
+ pageCurrent: {
+ type: Number,
+ default: 1
+ },
+ pageSize: {
+ type: Number,
+ default: 20
+ },
+ getcount: {
+ type: [Boolean, String],
+ default: false
+ },
+ getone: {
+ type: [Boolean, String],
+ default: false
+ },
+ gettree: {
+ type: [Boolean, String],
+ default: false
+ },
+ manual: {
+ type: Boolean,
+ default: false
+ },
+ value: {
+ type: [Array, String, Number],
+ default () {
+ return []
+ }
+ },
+ modelValue: {
+ type: [Array, String, Number],
+ default () {
+ return []
+ }
+ },
+ preload: {
+ type: Boolean,
+ default: false
+ },
+ stepSearh: {
+ type: Boolean,
+ default: true
+ },
+ selfField: {
+ type: String,
+ default: ''
+ },
+ parentField: {
+ type: String,
+ default: ''
+ },
+ multiple: {
+ type: Boolean,
+ default: false
+ },
+ map: {
+ type: Object,
+ default() {
+ return {
+ text: "text",
+ value: "value"
+ }
+ }
+ }
+ },
+ data() {
+ return {
+ loading: false,
+ errorMessage: '',
+ loadMore: {
+ contentdown: '',
+ contentrefresh: '',
+ contentnomore: ''
+ },
+ dataList: [],
+ selected: [],
+ selectedIndex: 0,
+ page: {
+ current: this.pageCurrent,
+ size: this.pageSize,
+ count: 0
+ }
+ }
+ },
+ computed: {
+ isLocaldata() {
+ return !this.collection.length
+ },
+ postField() {
+ let fields = [this.field];
+ if (this.parentField) {
+ fields.push(`${this.parentField} as parent_value`);
+ }
+ return fields.join(',');
+ },
+ dataValue() {
+ let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || this.modelValue !== undefined)
+ return isModelValue ? this.modelValue : this.value
+ },
+ hasValue() {
+ if (typeof this.dataValue === 'number') {
+ return true
+ }
+ return (this.dataValue != null) && (this.dataValue.length > 0)
+ }
+ },
+ created() {
+ this.$watch(() => {
+ var al = [];
+ ['pageCurrent',
+ 'pageSize',
+ 'spaceInfo',
+ 'value',
+ 'modelValue',
+ 'localdata',
+ 'collection',
+ 'action',
+ 'field',
+ 'orderby',
+ 'where',
+ 'getont',
+ 'getcount',
+ 'gettree'
+ ].forEach(key => {
+ al.push(this[key])
+ });
+ return al
+ }, (newValue, oldValue) => {
+ let needReset = false
+ for (let i = 2; i < newValue.length; i++) {
+ if (newValue[i] != oldValue[i]) {
+ needReset = true
+ break
+ }
+ }
+ if (newValue[0] != oldValue[0]) {
+ this.page.current = this.pageCurrent
+ }
+ this.page.size = this.pageSize
+
+ this.onPropsChange()
+ })
+ this._treeData = []
+ },
+ methods: {
+ onPropsChange() {
+ this._treeData = []
+ },
+ getCommand(options = {}) {
+ /* eslint-disable no-undef */
+ let db = uniCloud.database(this.spaceInfo)
+
+ const action = options.action || this.action
+ if (action) {
+ db = db.action(action)
+ }
+
+ const collection = options.collection || this.collection
+ db = db.collection(collection)
+
+ const where = options.where || this.where
+ if (!(!where || !Object.keys(where).length)) {
+ db = db.where(where)
+ }
+
+ const field = options.field || this.field
+ if (field) {
+ db = db.field(field)
+ }
+
+ const orderby = options.orderby || this.orderby
+ if (orderby) {
+ db = db.orderBy(orderby)
+ }
+
+ const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current
+ const size = options.pageSize !== undefined ? options.pageSize : this.page.size
+ const getCount = options.getcount !== undefined ? options.getcount : this.getcount
+ const getTree = options.gettree !== undefined ? options.gettree : this.gettree
+
+ const getOptions = {
+ getCount,
+ getTree
+ }
+ if (options.getTreePath) {
+ getOptions.getTreePath = options.getTreePath
+ }
+
+ db = db.skip(size * (current - 1)).limit(size).get(getOptions)
+
+ return db
+ },
+ getNodeData(callback) {
+ if (this.loading) {
+ return
+ }
+ this.loading = true
+ this.getCommand({
+ field: this.postField,
+ where: this._pathWhere()
+ }).then((res) => {
+ this.loading = false
+ this.selected = res.result.data
+ callback && callback()
+ }).catch((err) => {
+ this.loading = false
+ this.errorMessage = err
+ })
+ },
+ getTreePath(callback) {
+ if (this.loading) {
+ return
+ }
+ this.loading = true
+
+ this.getCommand({
+ field: this.postField,
+ getTreePath: {
+ startWith: `${this.selfField}=='${this.dataValue}'`
+ }
+ }).then((res) => {
+ this.loading = false
+ let treePath = []
+ this._extractTreePath(res.result.data, treePath)
+ this.selected = treePath
+ callback && callback()
+ }).catch((err) => {
+ this.loading = false
+ this.errorMessage = err
+ })
+ },
+ loadData() {
+ if (this.isLocaldata) {
+ this._processLocalData()
+ return
+ }
+
+ if (this.dataValue != null) {
+ this._loadNodeData((data) => {
+ this._treeData = data
+ this._updateBindData()
+ this._updateSelected()
+ })
+ return
+ }
+
+ if (this.stepSearh) {
+ this._loadNodeData((data) => {
+ this._treeData = data
+ this._updateBindData()
+ })
+ } else {
+ this._loadAllData((data) => {
+ this._treeData = []
+ this._extractTree(data, this._treeData, null)
+ this._updateBindData()
+ })
+ }
+ },
+ _loadAllData(callback) {
+ if (this.loading) {
+ return
+ }
+ this.loading = true
+
+ this.getCommand({
+ field: this.postField,
+ gettree: true,
+ startwith: `${this.selfField}=='${this.dataValue}'`
+ }).then((res) => {
+ this.loading = false
+ callback(res.result.data)
+ this.onDataChange()
+ }).catch((err) => {
+ this.loading = false
+ this.errorMessage = err
+ })
+ },
+ _loadNodeData(callback, pw) {
+ if (this.loading) {
+ return
+ }
+ this.loading = true
+
+ this.getCommand({
+ field: this.postField,
+ where: pw || this._postWhere(),
+ pageSize: 500
+ }).then((res) => {
+ this.loading = false
+ callback(res.result.data)
+ this.onDataChange()
+ }).catch((err) => {
+ this.loading = false
+ this.errorMessage = err
+ })
+ },
+ _pathWhere() {
+ let result = []
+ let where_field = this._getParentNameByField();
+ if (where_field) {
+ result.push(`${where_field} == '${this.dataValue}'`)
+ }
+
+ if (this.where) {
+ return `(${this.where}) && (${result.join(' || ')})`
+ }
+
+ return result.join(' || ')
+ },
+ _postWhere() {
+ let result = []
+ let selected = this.selected
+ let parentField = this.parentField
+ if (parentField) {
+ result.push(`${parentField} == null || ${parentField} == ""`)
+ }
+ if (selected.length) {
+ for (var i = 0; i < selected.length - 1; i++) {
+ result.push(`${parentField} == '${selected[i].value}'`)
+ }
+ }
+
+ let where = []
+ if (this.where) {
+ where.push(`(${this.where})`)
+ }
+ if (result.length) {
+ where.push(`(${result.join(' || ')})`)
+ }
+
+ return where.join(' && ')
+ },
+ _nodeWhere() {
+ let result = []
+ let selected = this.selected
+ if (selected.length) {
+ result.push(`${this.parentField} == '${selected[selected.length - 1].value}'`)
+ }
+
+ if (this.where) {
+ return `(${this.where}) && (${result.join(' || ')})`
+ }
+
+ return result.join(' || ')
+ },
+ _getParentNameByField() {
+ const fields = this.field.split(',');
+ let where_field = null;
+ for (let i = 0; i < fields.length; i++) {
+ const items = fields[i].split('as');
+ if (items.length < 2) {
+ continue;
+ }
+ if (items[1].trim() === 'value') {
+ where_field = items[0].trim();
+ break;
+ }
+ }
+ return where_field
+ },
+ _isTreeView() {
+ return (this.parentField && this.selfField)
+ },
+ _updateSelected() {
+ var dl = this.dataList
+ var sl = this.selected
+ let textField = this.map.text
+ let valueField = this.map.value
+ for (var i = 0; i < sl.length; i++) {
+ var value = sl[i].value
+ var dl2 = dl[i]
+ for (var j = 0; j < dl2.length; j++) {
+ var item2 = dl2[j]
+ if (item2[valueField] === value) {
+ sl[i].text = item2[textField]
+ break
+ }
+ }
+ }
+ },
+ _updateBindData(node) {
+ const {
+ dataList,
+ hasNodes
+ } = this._filterData(this._treeData, this.selected)
+
+ let isleaf = this._stepSearh === false && !hasNodes
+
+ if (node) {
+ node.isleaf = isleaf
+ }
+
+ this.dataList = dataList
+ this.selectedIndex = dataList.length - 1
+
+ if (!isleaf && this.selected.length < dataList.length) {
+ this.selected.push({
+ value: null,
+ text: "请选择"
+ })
+ }
+
+ return {
+ isleaf,
+ hasNodes
+ }
+ },
+ _filterData(data, paths) {
+ let dataList = []
+ let hasNodes = true
+
+ dataList.push(data.filter((item) => {
+ return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '')
+ }))
+ for (let i = 0; i < paths.length; i++) {
+ var value = paths[i].value
+ var nodes = data.filter((item) => {
+ return item.parent_value === value
+ })
+
+ if (nodes.length) {
+ dataList.push(nodes)
+ } else {
+ hasNodes = false
+ }
+ }
+
+ return {
+ dataList,
+ hasNodes
+ }
+ },
+ _extractTree(nodes, result, parent_value) {
+ let list = result || []
+ let valueField = this.map.value
+ for (let i = 0; i < nodes.length; i++) {
+ let node = nodes[i]
+
+ let child = {}
+ for (let key in node) {
+ if (key !== 'children') {
+ child[key] = node[key]
+ }
+ }
+ if (parent_value !== null && parent_value !== undefined && parent_value !== '') {
+ child.parent_value = parent_value
+ }
+ result.push(child)
+
+ let children = node.children
+ if (children) {
+ this._extractTree(children, result, node[valueField])
+ }
+ }
+ },
+ _extractTreePath(nodes, result) {
+ let list = result || []
+ for (let i = 0; i < nodes.length; i++) {
+ let node = nodes[i]
+
+ let child = {}
+ for (let key in node) {
+ if (key !== 'children') {
+ child[key] = node[key]
+ }
+ }
+ result.push(child)
+
+ let children = node.children
+ if (children) {
+ this._extractTreePath(children, result)
+ }
+ }
+ },
+ _findNodePath(key, nodes, path = []) {
+ let textField = this.map.text
+ let valueField = this.map.value
+ for (let i = 0; i < nodes.length; i++) {
+ let node = nodes[i]
+ let children = node.children
+ let text = node[textField]
+ let value = node[valueField]
+
+ path.push({
+ value,
+ text
+ })
+
+ if (value === key) {
+ return path
+ }
+
+ if (children) {
+ const p = this._findNodePath(key, children, path)
+ if (p.length) {
+ return p
+ }
+ }
+
+ path.pop()
+ }
+ return []
+ },
+ _processLocalData() {
+ this._treeData = []
+ this._extractTree(this.localdata, this._treeData)
+
+ var inputValue = this.dataValue
+ if (inputValue === undefined) {
+ return
+ }
+
+ if (Array.isArray(inputValue)) {
+ inputValue = inputValue[inputValue.length - 1]
+ if (typeof inputValue === 'object' && inputValue[this.map.value]) {
+ inputValue = inputValue[this.map.value]
+ }
+ }
+
+ this.selected = this._findNodePath(inputValue, this.localdata)
+ }
+ }
+}
diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue
new file mode 100644
index 0000000..1a247cc
--- /dev/null
+++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue
@@ -0,0 +1,335 @@
+
+
+
+
+
+
+ {{item.text}}
+
+
+
+
+
+
+
+
+ {{item[map.text]}}
+
+
+
+
+
+
+
+
+
+ {{errorMessage}}
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-data-picker/package.json b/uni_modules/uni-data-picker/package.json
new file mode 100644
index 0000000..7b731fc
--- /dev/null
+++ b/uni_modules/uni-data-picker/package.json
@@ -0,0 +1,90 @@
+{
+ "id": "uni-data-picker",
+ "displayName": "uni-data-picker 数据驱动的picker选择器",
+ "version": "1.0.8",
+ "description": "单列、多列级联选择器,常用于省市区城市选择、公司部门选择、多级分类等场景",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "picker",
+ "级联",
+ "省市区",
+ ""
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-load-more",
+ "uni-icons",
+ "uni-scss"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "u"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-data-picker/readme.md b/uni_modules/uni-data-picker/readme.md
new file mode 100644
index 0000000..6cda224
--- /dev/null
+++ b/uni_modules/uni-data-picker/readme.md
@@ -0,0 +1,22 @@
+## DataPicker 级联选择
+> **组件名:uni-data-picker**
+> 代码块: `uDataPicker`
+> 关联组件:`uni-data-pickerview`、`uni-load-more`。
+
+
+`` 是一个选择类[datacom组件](https://uniapp.dcloud.net.cn/component/datacom)。
+
+支持单列、和多列级联选择。列数没有限制,如果屏幕显示不全,顶部tab区域会左右滚动。
+
+候选数据支持一次性加载完毕,也支持懒加载,比如示例图中,选择了“北京”后,动态加载北京的区县数据。
+
+`` 组件尤其适用于地址选择、分类选择等选择类。
+
+`` 支持本地数据、云端静态数据(json),uniCloud云数据库数据。
+
+`` 可以通过JQL直连uniCloud云数据库,配套[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema),可在schema2code中自动生成前端页面,还支持服务器端校验。
+
+在uniCloud数据表中新建表“uni-id-address”和“opendb-city-china”,这2个表的schema自带foreignKey关联。在“uni-id-address”表的表结构页面使用schema2code生成前端页面,会自动生成地址管理的维护页面,自动从“opendb-city-china”表包含的中国所有省市区信息里选择地址。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-picker)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-data-select/changelog.md b/uni_modules/uni-data-select/changelog.md
new file mode 100644
index 0000000..8397c67
--- /dev/null
+++ b/uni_modules/uni-data-select/changelog.md
@@ -0,0 +1,28 @@
+## 1.0.3(2023-01-16)
+- 修复 不关联服务空间报错的问题
+## 1.0.2(2023-01-14)
+- 新增 属性 `format` 可用于格式化显示选项内容
+## 1.0.1(2022-12-06)
+- 修复 当where变化时,数据不会自动更新的问题
+## 0.1.9(2022-09-05)
+- 修复 微信小程序下拉框出现后选择会点击到蒙板后面的输入框
+## 0.1.8(2022-08-29)
+- 修复 点击的位置不准确
+## 0.1.7(2022-08-12)
+- 新增 支持 disabled 属性
+## 0.1.6(2022-07-06)
+- 修复 pc端宽度异常的bug
+## 0.1.5
+- 修复 pc端宽度异常的bug
+## 0.1.4(2022-07-05)
+- 优化 显示样式
+## 0.1.3(2022-06-02)
+- 修复 localdata 赋值不生效的 bug
+- 新增 支持 uni.scss 修改颜色
+- 新增 支持选项禁用(数据选项设置 disabled: true 即禁用)
+## 0.1.2(2022-05-08)
+- 修复 当 value 为 0 时选择不生效的 bug
+## 0.1.1(2022-05-07)
+- 新增 记住上次的选项(仅 collection 存在时有效)
+## 0.1.0(2022-04-22)
+- 初始化
diff --git a/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue
new file mode 100644
index 0000000..fe38bdc
--- /dev/null
+++ b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue
@@ -0,0 +1,467 @@
+
+
+ {{label + ':'}}
+
+
+
+ {{current}}
+ {{typePlaceholder}}
+
+
+
+
+
+
+
+
+ {{emptyTips}}
+
+
+ {{formatItemName(item)}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json
new file mode 100644
index 0000000..c61afee
--- /dev/null
+++ b/uni_modules/uni-data-select/package.json
@@ -0,0 +1,85 @@
+{
+ "id": "uni-data-select",
+ "displayName": "uni-data-select 下拉框选择器",
+ "version": "1.0.3",
+ "description": "通过数据驱动的下拉框选择器",
+ "keywords": [
+ "uni-ui",
+ "select",
+ "uni-data-select",
+ "下拉框",
+ "下拉选"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": "^3.1.1"
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-load-more"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "u",
+ "app-nvue": "n"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "u",
+ "百度": "u",
+ "字节跳动": "u",
+ "QQ": "u",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-data-select/readme.md b/uni_modules/uni-data-select/readme.md
new file mode 100644
index 0000000..eb58de3
--- /dev/null
+++ b/uni_modules/uni-data-select/readme.md
@@ -0,0 +1,8 @@
+## DataSelect 下拉框选择器
+> **组件名:uni-data-select**
+> 代码块: `uDataSelect`
+
+当选项过多时,使用下拉菜单展示并选择内容
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
diff --git a/uni_modules/uni-dateformat/changelog.md b/uni_modules/uni-dateformat/changelog.md
new file mode 100644
index 0000000..d551d7b
--- /dev/null
+++ b/uni_modules/uni-dateformat/changelog.md
@@ -0,0 +1,10 @@
+## 1.0.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-dateformat](https://uniapp.dcloud.io/component/uniui/uni-dateformat)
+## 0.0.5(2021-07-08)
+- 调整 默认时间不再是当前时间,而是显示'-'字符
+## 0.0.4(2021-05-12)
+- 新增 组件示例地址
+## 0.0.3(2021-02-04)
+- 调整为uni_modules目录规范
+- 修复 iOS 平台日期格式化出错的问题
diff --git a/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js b/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js
new file mode 100644
index 0000000..e00d559
--- /dev/null
+++ b/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js
@@ -0,0 +1,200 @@
+// yyyy-MM-dd hh:mm:ss.SSS 所有支持的类型
+function pad(str, length = 2) {
+ str += ''
+ while (str.length < length) {
+ str = '0' + str
+ }
+ return str.slice(-length)
+}
+
+const parser = {
+ yyyy: (dateObj) => {
+ return pad(dateObj.year, 4)
+ },
+ yy: (dateObj) => {
+ return pad(dateObj.year)
+ },
+ MM: (dateObj) => {
+ return pad(dateObj.month)
+ },
+ M: (dateObj) => {
+ return dateObj.month
+ },
+ dd: (dateObj) => {
+ return pad(dateObj.day)
+ },
+ d: (dateObj) => {
+ return dateObj.day
+ },
+ hh: (dateObj) => {
+ return pad(dateObj.hour)
+ },
+ h: (dateObj) => {
+ return dateObj.hour
+ },
+ mm: (dateObj) => {
+ return pad(dateObj.minute)
+ },
+ m: (dateObj) => {
+ return dateObj.minute
+ },
+ ss: (dateObj) => {
+ return pad(dateObj.second)
+ },
+ s: (dateObj) => {
+ return dateObj.second
+ },
+ SSS: (dateObj) => {
+ return pad(dateObj.millisecond, 3)
+ },
+ S: (dateObj) => {
+ return dateObj.millisecond
+ },
+}
+
+// 这都n年了iOS依然不认识2020-12-12,需要转换为2020/12/12
+function getDate(time) {
+ if (time instanceof Date) {
+ return time
+ }
+ switch (typeof time) {
+ case 'string':
+ {
+ // 2020-12-12T12:12:12.000Z、2020-12-12T12:12:12.000
+ if (time.indexOf('T') > -1) {
+ return new Date(time)
+ }
+ return new Date(time.replace(/-/g, '/'))
+ }
+ default:
+ return new Date(time)
+ }
+}
+
+export function formatDate(date, format = 'yyyy/MM/dd hh:mm:ss') {
+ if (!date && date !== 0) {
+ return ''
+ }
+ date = getDate(date)
+ const dateObj = {
+ year: date.getFullYear(),
+ month: date.getMonth() + 1,
+ day: date.getDate(),
+ hour: date.getHours(),
+ minute: date.getMinutes(),
+ second: date.getSeconds(),
+ millisecond: date.getMilliseconds()
+ }
+ const tokenRegExp = /yyyy|yy|MM|M|dd|d|hh|h|mm|m|ss|s|SSS|SS|S/
+ let flag = true
+ let result = format
+ while (flag) {
+ flag = false
+ result = result.replace(tokenRegExp, function(matched) {
+ flag = true
+ return parser[matched](dateObj)
+ })
+ }
+ return result
+}
+
+export function friendlyDate(time, {
+ locale = 'zh',
+ threshold = [60000, 3600000],
+ format = 'yyyy/MM/dd hh:mm:ss'
+}) {
+ if (time === '-') {
+ return time
+ }
+ if (!time && time !== 0) {
+ return ''
+ }
+ const localeText = {
+ zh: {
+ year: '年',
+ month: '月',
+ day: '天',
+ hour: '小时',
+ minute: '分钟',
+ second: '秒',
+ ago: '前',
+ later: '后',
+ justNow: '刚刚',
+ soon: '马上',
+ template: '{num}{unit}{suffix}'
+ },
+ en: {
+ year: 'year',
+ month: 'month',
+ day: 'day',
+ hour: 'hour',
+ minute: 'minute',
+ second: 'second',
+ ago: 'ago',
+ later: 'later',
+ justNow: 'just now',
+ soon: 'soon',
+ template: '{num} {unit} {suffix}'
+ }
+ }
+ const text = localeText[locale] || localeText.zh
+ let date = getDate(time)
+ let ms = date.getTime() - Date.now()
+ let absMs = Math.abs(ms)
+ if (absMs < threshold[0]) {
+ return ms < 0 ? text.justNow : text.soon
+ }
+ if (absMs >= threshold[1]) {
+ return formatDate(date, format)
+ }
+ let num
+ let unit
+ let suffix = text.later
+ if (ms < 0) {
+ suffix = text.ago
+ ms = -ms
+ }
+ const seconds = Math.floor((ms) / 1000)
+ const minutes = Math.floor(seconds / 60)
+ const hours = Math.floor(minutes / 60)
+ const days = Math.floor(hours / 24)
+ const months = Math.floor(days / 30)
+ const years = Math.floor(months / 12)
+ switch (true) {
+ case years > 0:
+ num = years
+ unit = text.year
+ break
+ case months > 0:
+ num = months
+ unit = text.month
+ break
+ case days > 0:
+ num = days
+ unit = text.day
+ break
+ case hours > 0:
+ num = hours
+ unit = text.hour
+ break
+ case minutes > 0:
+ num = minutes
+ unit = text.minute
+ break
+ default:
+ num = seconds
+ unit = text.second
+ break
+ }
+
+ if (locale === 'en') {
+ if (num === 1) {
+ num = 'a'
+ } else {
+ unit += 's'
+ }
+ }
+
+ return text.template.replace(/{\s*num\s*}/g, num + '').replace(/{\s*unit\s*}/g, unit).replace(/{\s*suffix\s*}/g,
+ suffix)
+}
diff --git a/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue b/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue
new file mode 100644
index 0000000..c5ed030
--- /dev/null
+++ b/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue
@@ -0,0 +1,88 @@
+
+ {{dateShow}}
+
+
+
+
+
diff --git a/uni_modules/uni-dateformat/package.json b/uni_modules/uni-dateformat/package.json
new file mode 100644
index 0000000..786a670
--- /dev/null
+++ b/uni_modules/uni-dateformat/package.json
@@ -0,0 +1,88 @@
+{
+ "id": "uni-dateformat",
+ "displayName": "uni-dateformat 日期格式化",
+ "version": "1.0.0",
+ "description": "日期格式化组件,可以将日期格式化为1分钟前、刚刚等形式",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "日期格式化",
+ "时间格式化",
+ "格式化时间",
+ ""
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "y",
+ "联盟": "y"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-dateformat/readme.md b/uni_modules/uni-dateformat/readme.md
new file mode 100644
index 0000000..37ddb6e
--- /dev/null
+++ b/uni_modules/uni-dateformat/readme.md
@@ -0,0 +1,11 @@
+
+
+### DateFormat 日期格式化
+> **组件名:uni-dateformat**
+> 代码块: `uDateformat`
+
+
+日期格式化组件。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-dateformat)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/changelog.md b/uni_modules/uni-datetime-picker/changelog.md
new file mode 100644
index 0000000..953afea
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/changelog.md
@@ -0,0 +1,123 @@
+## 2.2.19(2023-02-09)
+- 修复 2.2.18 引起范围选择配置 end 选择无效的Bug [详情](https://github.com/dcloudio/uni-ui/issues/686)
+## 2.2.18(2023-02-08)
+- 修复 移动端范围选择change事件触发异常的Bug [详情](https://github.com/dcloudio/uni-ui/issues/684)
+- 优化 PC端输入日期格式错误时返回当前日期时间
+- 优化 PC端输入日期时间超出 start、end 限制的Bug
+- 优化 移动端日期时间范围用法时间展示不完整问题
+## 2.2.17(2023-02-04)
+- 修复 小程序端绑定 Date 类型报错的Bug [详情](https://github.com/dcloudio/uni-ui/issues/679)
+- 修复 vue3 time-picker 无法显示绑定时分秒的Bug
+## 2.2.16(2023-02-02)
+- 修复 字节小程序报错的Bug
+## 2.2.15(2023-02-02)
+- 修复 某些情况切换月份错误的Bug
+## 2.2.14(2023-01-30)
+- 修复 某些情况切换月份错误的Bug [详情](https://ask.dcloud.net.cn/question/162033)
+## 2.2.13(2023-01-10)
+- 修复 多次加载组件造成内存占用的Bug
+## 2.2.12(2022-12-01)
+- 修复 vue3 下 i18n 国际化初始值不正确的Bug
+## 2.2.11(2022-09-19)
+- 修复 支付宝小程序样式错乱的Bug [详情](https://github.com/dcloudio/uni-app/issues/3861)
+## 2.2.10(2022-09-19)
+- 修复 反向选择日期范围,日期显示异常的Bug [详情](https://ask.dcloud.net.cn/question/153401?item_id=212892&rf=false)
+## 2.2.9(2022-09-16)
+- 可以使用 uni-scss 控制主题色
+## 2.2.8(2022-09-08)
+- 修复 close事件无效的Bug
+## 2.2.7(2022-09-05)
+- 修复 移动端 maskClick 无效的Bug [详情](https://ask.dcloud.net.cn/question/140824)
+## 2.2.6(2022-06-30)
+- 优化 组件样式,调整了组件图标大小、高度、颜色等,与uni-ui风格保持一致
+## 2.2.5(2022-06-24)
+- 修复 日历顶部年月及底部确认未国际化的Bug
+## 2.2.4(2022-03-31)
+- 修复 Vue3 下动态赋值,单选类型未响应的Bug
+## 2.2.3(2022-03-28)
+- 修复 Vue3 下动态赋值未响应的Bug
+## 2.2.2(2021-12-10)
+- 修复 clear-icon 属性在小程序平台不生效的Bug
+## 2.2.1(2021-12-10)
+- 修复 日期范围选在小程序平台,必须多点击一次才能取消选中状态的Bug
+## 2.2.0(2021-11-19)
+- 优化 组件UI,并提供设计资源 [详情](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移 [https://uniapp.dcloud.io/component/uniui/uni-datetime-picker](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker)
+## 2.1.5(2021-11-09)
+- 新增 提供组件设计资源,组件样式调整
+## 2.1.4(2021-09-10)
+- 修复 hide-second 在移动端的Bug
+- 修复 单选赋默认值时,赋值日期未高亮的Bug
+- 修复 赋默认值时,移动端未正确显示时间的Bug
+## 2.1.3(2021-09-09)
+- 新增 hide-second 属性,支持只使用时分,隐藏秒
+## 2.1.2(2021-09-03)
+- 优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次
+- 优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法
+- 优化 调整字号大小,美化日历界面
+- 修复 因国际化导致的 placeholder 失效的Bug
+## 2.1.1(2021-08-24)
+- 新增 支持国际化
+- 优化 范围选择器在 pc 端过宽的问题
+## 2.1.0(2021-08-09)
+- 新增 适配 vue3
+## 2.0.19(2021-08-09)
+- 新增 支持作为 uni-forms 子组件相关功能
+- 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的Bug
+## 2.0.18(2021-08-05)
+- 修复 type 属性动态赋值无效的Bug
+- 修复 ‘确认’按钮被 tabbar 遮盖 bug
+- 修复 组件未赋值时范围选左、右日历相同的Bug
+## 2.0.17(2021-08-04)
+- 修复 范围选未正确显示当前值的Bug
+- 修复 h5 平台(移动端)报错 'cale' of undefined 的Bug
+## 2.0.16(2021-07-21)
+- 新增 return-type 属性支持返回 date 日期对象
+## 2.0.15(2021-07-14)
+- 修复 单选日期类型,初始赋值后不在当前日历的Bug
+- 新增 clearIcon 属性,显示框的清空按钮可配置显示隐藏(仅 pc 有效)
+- 优化 移动端移除显示框的清空按钮,无实际用途
+## 2.0.14(2021-07-14)
+- 修复 组件赋值为空,界面未更新的Bug
+- 修复 start 和 end 不能动态赋值的Bug
+- 修复 范围选类型,用户选择后再次选择右侧日历(结束日期)显示不正确的Bug
+## 2.0.13(2021-07-08)
+- 修复 范围选择不能动态赋值的Bug
+## 2.0.12(2021-07-08)
+- 修复 范围选择的初始时间在一个月内时,造成无法选择的bug
+## 2.0.11(2021-07-08)
+- 优化 弹出层在超出视窗边缘定位不准确的问题
+## 2.0.10(2021-07-08)
+- 修复 范围起始点样式的背景色与今日样式的字体前景色融合,导致日期字体看不清的Bug
+- 优化 弹出层在超出视窗边缘被遮盖的问题
+## 2.0.9(2021-07-07)
+- 新增 maskClick 事件
+- 修复 特殊情况日历 rpx 布局错误的Bug,rpx -> px
+- 修复 范围选择时清空返回值不合理的bug,['', ''] -> []
+## 2.0.8(2021-07-07)
+- 新增 日期时间显示框支持插槽
+## 2.0.7(2021-07-01)
+- 优化 添加 uni-icons 依赖
+## 2.0.6(2021-05-22)
+- 修复 图标在小程序上不显示的Bug
+- 优化 重命名引用组件,避免潜在组件命名冲突
+## 2.0.5(2021-05-20)
+- 优化 代码目录扁平化
+## 2.0.4(2021-05-12)
+- 新增 组件示例地址
+## 2.0.3(2021-05-10)
+- 修复 ios 下不识别 '-' 日期格式的Bug
+- 优化 pc 下弹出层添加边框和阴影
+## 2.0.2(2021-05-08)
+- 修复 在 admin 中获取弹出层定位错误的bug
+## 2.0.1(2021-05-08)
+- 修复 type 属性向下兼容,默认值从 date 变更为 datetime
+## 2.0.0(2021-04-30)
+- 支持日历形式的日期+时间的范围选择
+ > 注意:此版本不向后兼容,不再支持单独时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)
+## 1.0.6(2021-03-18)
+- 新增 hide-second 属性,时间支持仅选择时、分
+- 修复 选择跟显示的日期不一样的Bug
+- 修复 chang事件触发2次的Bug
+- 修复 分、秒 end 范围错误的Bug
+- 优化 更好的 nvue 适配
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
new file mode 100644
index 0000000..1b1a2eb
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
@@ -0,0 +1,186 @@
+
+
+
+
+ {{weeks.date}}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.js
new file mode 100644
index 0000000..b8d7d6f
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.js
@@ -0,0 +1,546 @@
+/**
+* @1900-2100区间内的公历、农历互转
+* @charset UTF-8
+* @github https://github.com/jjonline/calendar.js
+* @Author Jea杨(JJonline@JJonline.Cn)
+* @Time 2014-7-21
+* @Time 2016-8-13 Fixed 2033hex、Attribution Annals
+* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug
+* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
+* @Version 1.0.3
+* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
+* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
+*/
+/* eslint-disable */
+var calendar = {
+
+ /**
+ * 农历1900-2100的润大小信息表
+ * @Array Of Property
+ * @return Hex
+ */
+ lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909
+ 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919
+ 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929
+ 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939
+ 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949
+ 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959
+ 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969
+ 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979
+ 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989
+ 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999
+ 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009
+ 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019
+ 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029
+ 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039
+ 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049
+ /** Add By JJonline@JJonline.Cn**/
+ 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059
+ 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069
+ 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079
+ 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089
+ 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099
+ 0x0d520], // 2100
+
+ /**
+ * 公历每个月份的天数普通表
+ * @Array Of Property
+ * @return Number
+ */
+ solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
+
+ /**
+ * 天干地支之天干速查表
+ * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
+ * @return Cn string
+ */
+ Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'],
+
+ /**
+ * 天干地支之地支速查表
+ * @Array Of Property
+ * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
+ * @return Cn string
+ */
+ Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'],
+
+ /**
+ * 天干地支之地支速查表<=>生肖
+ * @Array Of Property
+ * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
+ * @return Cn string
+ */
+ Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'],
+
+ /**
+ * 24节气速查表
+ * @Array Of Property
+ * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
+ * @return Cn string
+ */
+ solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'],
+
+ /**
+ * 1900-2100各年的24节气日期速查表
+ * @Array Of Property
+ * @return 0x string For splice
+ */
+ sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f',
+ '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',
+ 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',
+ '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',
+ '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',
+ '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',
+ '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',
+ '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',
+ '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+ '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+ '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',
+ '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+ '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+ '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+ '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+ '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+ '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+ '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+ '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',
+ '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',
+ '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+ '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+ '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+ '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+ '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',
+ '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',
+ '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',
+ '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',
+ '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+ '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',
+ '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',
+ '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',
+ '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+ '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',
+ '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',
+ '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',
+ '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+ '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+ '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',
+ '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'],
+
+ /**
+ * 数字转中文速查表
+ * @Array Of Property
+ * @trans ['日','一','二','三','四','五','六','七','八','九','十']
+ * @return Cn string
+ */
+ nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'],
+
+ /**
+ * 日期转农历称呼速查表
+ * @Array Of Property
+ * @trans ['初','十','廿','卅']
+ * @return Cn string
+ */
+ nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'],
+
+ /**
+ * 月份转农历称呼速查表
+ * @Array Of Property
+ * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
+ * @return Cn string
+ */
+ nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'],
+
+ /**
+ * 返回农历y年一整年的总天数
+ * @param lunar Year
+ * @return Number
+ * @eg:var count = calendar.lYearDays(1987) ;//count=387
+ */
+ lYearDays: function (y) {
+ var i; var sum = 348
+ for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 }
+ return (sum + this.leapDays(y))
+ },
+
+ /**
+ * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
+ * @param lunar Year
+ * @return Number (0-12)
+ * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
+ */
+ leapMonth: function (y) { // 闰字编码 \u95f0
+ return (this.lunarInfo[y - 1900] & 0xf)
+ },
+
+ /**
+ * 返回农历y年闰月的天数 若该年没有闰月则返回0
+ * @param lunar Year
+ * @return Number (0、29、30)
+ * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
+ */
+ leapDays: function (y) {
+ if (this.leapMonth(y)) {
+ return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29)
+ }
+ return (0)
+ },
+
+ /**
+ * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
+ * @param lunar Year
+ * @return Number (-1、29、30)
+ * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
+ */
+ monthDays: function (y, m) {
+ if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1
+ return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29)
+ },
+
+ /**
+ * 返回公历(!)y年m月的天数
+ * @param solar Year
+ * @return Number (-1、28、29、30、31)
+ * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
+ */
+ solarDays: function (y, m) {
+ if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
+ var ms = m - 1
+ if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29
+ return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28)
+ } else {
+ return (this.solarMonth[ms])
+ }
+ },
+
+ /**
+ * 农历年份转换为干支纪年
+ * @param lYear 农历年的年份数
+ * @return Cn string
+ */
+ toGanZhiYear: function (lYear) {
+ var ganKey = (lYear - 3) % 10
+ var zhiKey = (lYear - 3) % 12
+ if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干
+ if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支
+ return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]
+ },
+
+ /**
+ * 公历月、日判断所属星座
+ * @param cMonth [description]
+ * @param cDay [description]
+ * @return Cn string
+ */
+ toAstro: function (cMonth, cDay) {
+ var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf'
+ var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]
+ return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座
+ },
+
+ /**
+ * 传入offset偏移量返回干支
+ * @param offset 相对甲子的偏移量
+ * @return Cn string
+ */
+ toGanZhi: function (offset) {
+ return this.Gan[offset % 10] + this.Zhi[offset % 12]
+ },
+
+ /**
+ * 传入公历(!)y年获得该年第n个节气的公历日期
+ * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
+ * @return day Number
+ * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
+ */
+ getTerm: function (y, n) {
+ if (y < 1900 || y > 2100) { return -1 }
+ if (n < 1 || n > 24) { return -1 }
+ var _table = this.sTermInfo[y - 1900]
+ var _info = [
+ parseInt('0x' + _table.substr(0, 5)).toString(),
+ parseInt('0x' + _table.substr(5, 5)).toString(),
+ parseInt('0x' + _table.substr(10, 5)).toString(),
+ parseInt('0x' + _table.substr(15, 5)).toString(),
+ parseInt('0x' + _table.substr(20, 5)).toString(),
+ parseInt('0x' + _table.substr(25, 5)).toString()
+ ]
+ var _calday = [
+ _info[0].substr(0, 1),
+ _info[0].substr(1, 2),
+ _info[0].substr(3, 1),
+ _info[0].substr(4, 2),
+
+ _info[1].substr(0, 1),
+ _info[1].substr(1, 2),
+ _info[1].substr(3, 1),
+ _info[1].substr(4, 2),
+
+ _info[2].substr(0, 1),
+ _info[2].substr(1, 2),
+ _info[2].substr(3, 1),
+ _info[2].substr(4, 2),
+
+ _info[3].substr(0, 1),
+ _info[3].substr(1, 2),
+ _info[3].substr(3, 1),
+ _info[3].substr(4, 2),
+
+ _info[4].substr(0, 1),
+ _info[4].substr(1, 2),
+ _info[4].substr(3, 1),
+ _info[4].substr(4, 2),
+
+ _info[5].substr(0, 1),
+ _info[5].substr(1, 2),
+ _info[5].substr(3, 1),
+ _info[5].substr(4, 2)
+ ]
+ return parseInt(_calday[n - 1])
+ },
+
+ /**
+ * 传入农历数字月份返回汉语通俗表示法
+ * @param lunar month
+ * @return Cn string
+ * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
+ */
+ toChinaMonth: function (m) { // 月 => \u6708
+ if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
+ var s = this.nStr3[m - 1]
+ s += '\u6708'// 加上月字
+ return s
+ },
+
+ /**
+ * 传入农历日期数字返回汉字表示法
+ * @param lunar day
+ * @return Cn string
+ * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
+ */
+ toChinaDay: function (d) { // 日 => \u65e5
+ var s
+ switch (d) {
+ case 10:
+ s = '\u521d\u5341'; break
+ case 20:
+ s = '\u4e8c\u5341'; break
+ break
+ case 30:
+ s = '\u4e09\u5341'; break
+ break
+ default :
+ s = this.nStr2[Math.floor(d / 10)]
+ s += this.nStr1[d % 10]
+ }
+ return (s)
+ },
+
+ /**
+ * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
+ * @param y year
+ * @return Cn string
+ * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
+ */
+ getAnimal: function (y) {
+ return this.Animals[(y - 4) % 12]
+ },
+
+ /**
+ * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
+ * @param y solar year
+ * @param m solar month
+ * @param d solar day
+ * @return JSON object
+ * @eg:console.log(calendar.solar2lunar(1987,11,01));
+ */
+ solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31
+ // 年份限定、上限
+ if (y < 1900 || y > 2100) {
+ return -1// undefined转换为数字变为NaN
+ }
+ // 公历传参最下限
+ if (y == 1900 && m == 1 && d < 31) {
+ return -1
+ }
+ // 未传参 获得当天
+ if (!y) {
+ var objDate = new Date()
+ } else {
+ var objDate = new Date(y, parseInt(m) - 1, d)
+ }
+ var i; var leap = 0; var temp = 0
+ // 修正ymd参数
+ var y = objDate.getFullYear()
+ var m = objDate.getMonth() + 1
+ var d = objDate.getDate()
+ var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000
+ for (i = 1900; i < 2101 && offset > 0; i++) {
+ temp = this.lYearDays(i)
+ offset -= temp
+ }
+ if (offset < 0) {
+ offset += temp; i--
+ }
+
+ // 是否今天
+ var isTodayObj = new Date()
+ var isToday = false
+ if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
+ isToday = true
+ }
+ // 星期几
+ var nWeek = objDate.getDay()
+ var cWeek = this.nStr1[nWeek]
+ // 数字表示周几顺应天朝周一开始的惯例
+ if (nWeek == 0) {
+ nWeek = 7
+ }
+ // 农历年
+ var year = i
+ var leap = this.leapMonth(i) // 闰哪个月
+ var isLeap = false
+
+ // 效验闰月
+ for (i = 1; i < 13 && offset > 0; i++) {
+ // 闰月
+ if (leap > 0 && i == (leap + 1) && isLeap == false) {
+ --i
+ isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数
+ } else {
+ temp = this.monthDays(year, i)// 计算农历普通月天数
+ }
+ // 解除闰月
+ if (isLeap == true && i == (leap + 1)) { isLeap = false }
+ offset -= temp
+ }
+ // 闰月导致数组下标重叠取反
+ if (offset == 0 && leap > 0 && i == leap + 1) {
+ if (isLeap) {
+ isLeap = false
+ } else {
+ isLeap = true; --i
+ }
+ }
+ if (offset < 0) {
+ offset += temp; --i
+ }
+ // 农历月
+ var month = i
+ // 农历日
+ var day = offset + 1
+ // 天干地支处理
+ var sm = m - 1
+ var gzY = this.toGanZhiYear(year)
+
+ // 当月的两个节气
+ // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
+ var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始
+ var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始
+
+ // 依据12节气修正干支月
+ var gzM = this.toGanZhi((y - 1900) * 12 + m + 11)
+ if (d >= firstNode) {
+ gzM = this.toGanZhi((y - 1900) * 12 + m + 12)
+ }
+
+ // 传入的日期的节气与否
+ var isTerm = false
+ var Term = null
+ if (firstNode == d) {
+ isTerm = true
+ Term = this.solarTerm[m * 2 - 2]
+ }
+ if (secondNode == d) {
+ isTerm = true
+ Term = this.solarTerm[m * 2 - 1]
+ }
+ // 日柱 当月一日与 1900/1/1 相差天数
+ var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10
+ var gzD = this.toGanZhi(dayCyclical + d - 1)
+ // 该日期所属的星座
+ var astro = this.toAstro(m, d)
+
+ return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro }
+ },
+
+ /**
+ * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
+ * @param y lunar year
+ * @param m lunar month
+ * @param d lunar day
+ * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
+ * @return JSON object
+ * @eg:console.log(calendar.lunar2solar(1987,9,10));
+ */
+ lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1
+ var isLeapMonth = !!isLeapMonth
+ var leapOffset = 0
+ var leapMonth = this.leapMonth(y)
+ var leapDay = this.leapDays(y)
+ if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
+ if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值
+ var day = this.monthDays(y, m)
+ var _day = day
+ // bugFix 2016-9-25
+ // if month is leap, _day use leapDays method
+ if (isLeapMonth) {
+ _day = this.leapDays(y, m)
+ }
+ if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验
+
+ // 计算农历的时间差
+ var offset = 0
+ for (var i = 1900; i < y; i++) {
+ offset += this.lYearDays(i)
+ }
+ var leap = 0; var isAdd = false
+ for (var i = 1; i < m; i++) {
+ leap = this.leapMonth(y)
+ if (!isAdd) { // 处理闰月
+ if (leap <= i && leap > 0) {
+ offset += this.leapDays(y); isAdd = true
+ }
+ }
+ offset += this.monthDays(y, i)
+ }
+ // 转换闰月农历 需补充该年闰月的前一个月的时差
+ if (isLeapMonth) { offset += day }
+ // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
+ var stmap = Date.UTC(1900, 1, 30, 0, 0, 0)
+ var calObj = new Date((offset + d - 31) * 86400000 + stmap)
+ var cY = calObj.getUTCFullYear()
+ var cM = calObj.getUTCMonth() + 1
+ var cD = calObj.getUTCDate()
+
+ return this.solar2lunar(cY, cM, cD)
+ }
+}
+
+export default calendar
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
new file mode 100644
index 0000000..d226154
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
@@ -0,0 +1,925 @@
+
+
+
+
+
+
+
+ {{nowDate.month}}
+
+
+
+ {{SUNText}}
+
+
+ {{MONText}}
+
+
+ {{TUEText}}
+
+
+ {{WEDText}}
+
+
+ {{THUText}}
+
+
+ {{FRIText}}
+
+
+ {{SATText}}
+
+
+
+
+
+
+
+
+
+
+ {{tempSingleDate ? tempSingleDate : selectDateText}}
+
+
+
+
+
+
+ {{tempRange.before ? tempRange.before : startDateText}}
+
+
+
+
+
+
+
+
+ {{tempRange.after ? tempRange.after : endDateText}}
+
+
+
+
+
+ {{confirmText}}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json
new file mode 100644
index 0000000..9acf1ab
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json
@@ -0,0 +1,22 @@
+{
+ "uni-datetime-picker.selectDate": "select date",
+ "uni-datetime-picker.selectTime": "select time",
+ "uni-datetime-picker.selectDateTime": "select datetime",
+ "uni-datetime-picker.startDate": "start date",
+ "uni-datetime-picker.endDate": "end date",
+ "uni-datetime-picker.startTime": "start time",
+ "uni-datetime-picker.endTime": "end time",
+ "uni-datetime-picker.ok": "ok",
+ "uni-datetime-picker.clear": "clear",
+ "uni-datetime-picker.cancel": "cancel",
+ "uni-datetime-picker.year": "-",
+ "uni-datetime-picker.month": "",
+ "uni-calender.MON": "MON",
+ "uni-calender.TUE": "TUE",
+ "uni-calender.WED": "WED",
+ "uni-calender.THU": "THU",
+ "uni-calender.FRI": "FRI",
+ "uni-calender.SAT": "SAT",
+ "uni-calender.SUN": "SUN",
+ "uni-calender.confirm": "confirm"
+}
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js
new file mode 100644
index 0000000..de7509c
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js
@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+ en,
+ 'zh-Hans': zhHans,
+ 'zh-Hant': zhHant
+}
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json
new file mode 100644
index 0000000..d2df5e7
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json
@@ -0,0 +1,22 @@
+{
+ "uni-datetime-picker.selectDate": "选择日期",
+ "uni-datetime-picker.selectTime": "选择时间",
+ "uni-datetime-picker.selectDateTime": "选择日期时间",
+ "uni-datetime-picker.startDate": "开始日期",
+ "uni-datetime-picker.endDate": "结束日期",
+ "uni-datetime-picker.startTime": "开始时间",
+ "uni-datetime-picker.endTime": "结束时间",
+ "uni-datetime-picker.ok": "确定",
+ "uni-datetime-picker.clear": "清除",
+ "uni-datetime-picker.cancel": "取消",
+ "uni-datetime-picker.year": "年",
+ "uni-datetime-picker.month": "月",
+ "uni-calender.SUN": "日",
+ "uni-calender.MON": "一",
+ "uni-calender.TUE": "二",
+ "uni-calender.WED": "三",
+ "uni-calender.THU": "四",
+ "uni-calender.FRI": "五",
+ "uni-calender.SAT": "六",
+ "uni-calender.confirm": "确认"
+}
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json
new file mode 100644
index 0000000..d23fa3c
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json
@@ -0,0 +1,22 @@
+{
+ "uni-datetime-picker.selectDate": "選擇日期",
+ "uni-datetime-picker.selectTime": "選擇時間",
+ "uni-datetime-picker.selectDateTime": "選擇日期時間",
+ "uni-datetime-picker.startDate": "開始日期",
+ "uni-datetime-picker.endDate": "結束日期",
+ "uni-datetime-picker.startTime": "開始时间",
+ "uni-datetime-picker.endTime": "結束时间",
+ "uni-datetime-picker.ok": "確定",
+ "uni-datetime-picker.clear": "清除",
+ "uni-datetime-picker.cancel": "取消",
+ "uni-datetime-picker.year": "年",
+ "uni-datetime-picker.month": "月",
+ "uni-calender.SUN": "日",
+ "uni-calender.MON": "一",
+ "uni-calender.TUE": "二",
+ "uni-calender.WED": "三",
+ "uni-calender.THU": "四",
+ "uni-calender.FRI": "五",
+ "uni-calender.SAT": "六",
+ "uni-calender.confirm": "確認"
+}
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js
new file mode 100644
index 0000000..9601aba
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js
@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+ name: 'Keypress',
+ props: {
+ disable: {
+ type: Boolean,
+ default: false
+ }
+ },
+ mounted () {
+ const keyNames = {
+ esc: ['Esc', 'Escape'],
+ tab: 'Tab',
+ enter: 'Enter',
+ space: [' ', 'Spacebar'],
+ up: ['Up', 'ArrowUp'],
+ left: ['Left', 'ArrowLeft'],
+ right: ['Right', 'ArrowRight'],
+ down: ['Down', 'ArrowDown'],
+ delete: ['Backspace', 'Delete', 'Del']
+ }
+ const listener = ($event) => {
+ if (this.disable) {
+ return
+ }
+ const keyName = Object.keys(keyNames).find(key => {
+ const keyName = $event.key
+ const value = keyNames[key]
+ return value === keyName || (Array.isArray(value) && value.includes(keyName))
+ })
+ if (keyName) {
+ // 避免和其他按键事件冲突
+ setTimeout(() => {
+ this.$emit(keyName, {})
+ }, 0)
+ }
+ }
+ document.addEventListener('keyup', listener)
+ this.$once('hook:beforeDestroy', () => {
+ document.removeEventListener('keyup', listener)
+ })
+ },
+ render: () => {}
+}
+// #endif
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
new file mode 100644
index 0000000..04113ac
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
@@ -0,0 +1,933 @@
+
+
+
+
+
+ {{time}}
+
+ {{selectTimeText}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker copy.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker copy.vue
new file mode 100644
index 0000000..dcee0b9
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker copy.vue
@@ -0,0 +1,1081 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{rangeSeparator}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
new file mode 100644
index 0000000..c6a3636
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
@@ -0,0 +1,1082 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{rangeSeparator}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
new file mode 100644
index 0000000..1afdaa9
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
@@ -0,0 +1,420 @@
+class Calendar {
+ constructor({
+ date,
+ selected,
+ startDate,
+ endDate,
+ range,
+ // multipleStatus
+ } = {}) {
+ // 当前日期
+ this.date = this.getDate(new Date()) // 当前初入日期
+ // 打点信息
+ this.selected = selected || [];
+ // 范围开始
+ this.startDate = startDate
+ // 范围结束
+ this.endDate = endDate
+ this.range = range
+ // 多选状态
+ this.cleanMultipleStatus()
+ // 每周日期
+ this.weeks = {}
+ // this._getWeek(this.date.fullDate)
+ // this.multipleStatus = multipleStatus
+ this.lastHover = false
+ }
+ /**
+ * 设置日期
+ * @param {Object} date
+ */
+ setDate(date) {
+ this.selectDate = this.getDate(date)
+ this._getWeek(this.selectDate.fullDate)
+ }
+
+ /**
+ * 清理多选状态
+ */
+ cleanMultipleStatus() {
+ this.multipleStatus = {
+ before: '',
+ after: '',
+ data: []
+ }
+ }
+
+ /**
+ * 重置开始日期
+ */
+ resetSatrtDate(startDate) {
+ // 范围开始
+ this.startDate = startDate
+
+ }
+
+ /**
+ * 重置结束日期
+ */
+ resetEndDate(endDate) {
+ // 范围结束
+ this.endDate = endDate
+ }
+
+ /**
+ * 获取任意时间
+ */
+ getDate(date, AddDayCount = 0, str = 'day') {
+ if (!date) {
+ date = new Date()
+ }
+ if (typeof date !== 'object') {
+ date = date.replace(/-/g, '/')
+ }
+ const dd = new Date(date)
+ switch (str) {
+ case 'day':
+ dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
+ break
+ case 'month':
+ if (dd.getDate() === 31 && AddDayCount>0) {
+ dd.setDate(dd.getDate() + AddDayCount)
+ } else {
+ const preMonth = dd.getMonth()
+ dd.setMonth(preMonth + AddDayCount) // 获取AddDayCount天后的日期
+ const nextMonth = dd.getMonth()
+ // 处理 pre 切换月份目标月份为2月没有当前日(30 31) 切换错误问题
+ if(AddDayCount<0 && preMonth!==0 && nextMonth-preMonth>AddDayCount){
+ dd.setMonth(nextMonth+(nextMonth-preMonth+AddDayCount))
+ }
+ // 处理 next 切换月份目标月份为2月没有当前日(30 31) 切换错误问题
+ if(AddDayCount>0 && nextMonth-preMonth>AddDayCount){
+ dd.setMonth(nextMonth-(nextMonth-preMonth-AddDayCount))
+ }
+ }
+ break
+ case 'year':
+ dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期
+ break
+ }
+ const y = dd.getFullYear()
+ const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
+ const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
+ return {
+ fullDate: y + '-' + m + '-' + d,
+ year: y,
+ month: m,
+ date: d,
+ day: dd.getDay()
+ }
+ }
+
+
+ /**
+ * 获取上月剩余天数
+ */
+ _getLastMonthDays(firstDay, full) {
+ let dateArr = []
+ for (let i = firstDay; i > 0; i--) {
+ const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate()
+ dateArr.push({
+ date: beforeDate,
+ month: full.month - 1,
+ disable: true
+ })
+ }
+ return dateArr
+ }
+ /**
+ * 获取本月天数
+ */
+ _currentMonthDys(dateData, full) {
+ let dateArr = []
+ let fullDate = this.date.fullDate
+ for (let i = 1; i <= dateData; i++) {
+ let isinfo = false
+ let nowDate = full.year + '-' + (full.month < 10 ?
+ full.month : full.month) + '-' + (i < 10 ?
+ '0' + i : i)
+ // 是否今天
+ let isDay = fullDate === nowDate
+ // 获取打点信息
+ let info = this.selected && this.selected.find((item) => {
+ if (this.dateEqual(nowDate, item.date)) {
+ return item
+ }
+ })
+
+ // 日期禁用
+ let disableBefore = true
+ let disableAfter = true
+ if (this.startDate) {
+ // let dateCompBefore = this.dateCompare(this.startDate, fullDate)
+ // disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate)
+ disableBefore = this.dateCompare(this.startDate, nowDate)
+ }
+
+ if (this.endDate) {
+ // let dateCompAfter = this.dateCompare(fullDate, this.endDate)
+ // disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate)
+ disableAfter = this.dateCompare(nowDate, this.endDate)
+ }
+ let multiples = this.multipleStatus.data
+ let checked = false
+ let multiplesStatus = -1
+ if (this.range) {
+ if (multiples) {
+ multiplesStatus = multiples.findIndex((item) => {
+ return this.dateEqual(item, nowDate)
+ })
+ }
+ if (multiplesStatus !== -1) {
+ checked = true
+ }
+ }
+ let data = {
+ fullDate: nowDate,
+ year: full.year,
+ date: i,
+ multiple: this.range ? checked : false,
+ beforeMultiple: this.isLogicBefore(nowDate, this.multipleStatus.before, this.multipleStatus.after),
+ afterMultiple: this.isLogicAfter(nowDate, this.multipleStatus.before, this.multipleStatus.after),
+ month: full.month,
+ disable: !(disableBefore && disableAfter),
+ isDay,
+ userChecked: false
+ }
+ if (info) {
+ data.extraInfo = info
+ }
+
+ dateArr.push(data)
+ }
+ return dateArr
+ }
+ /**
+ * 获取下月天数
+ */
+ _getNextMonthDays(surplus, full) {
+ let dateArr = []
+ for (let i = 1; i < surplus + 1; i++) {
+ dateArr.push({
+ date: i,
+ month: Number(full.month) + 1,
+ disable: true
+ })
+ }
+ return dateArr
+ }
+
+ /**
+ * 获取当前日期详情
+ * @param {Object} date
+ */
+ getInfo(date) {
+ if (!date) {
+ date = new Date()
+ }
+ const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate)
+ return dateInfo
+ }
+
+ /**
+ * 比较时间大小
+ */
+ dateCompare(startDate, endDate) {
+ // 计算截止时间
+ startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
+ // 计算详细项的截止时间
+ endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
+ if (startDate <= endDate) {
+ return true
+ } else {
+ return false
+ }
+ }
+
+ /**
+ * 比较时间是否相等
+ */
+ dateEqual(before, after) {
+ // 计算截止时间
+ before = new Date(before.replace('-', '/').replace('-', '/'))
+ // 计算详细项的截止时间
+ after = new Date(after.replace('-', '/').replace('-', '/'))
+ if (before.getTime() - after.getTime() === 0) {
+ return true
+ } else {
+ return false
+ }
+ }
+
+ /**
+ * 比较真实起始日期
+ */
+
+ isLogicBefore(currentDay, before, after) {
+ let logicBefore = before
+ if (before && after) {
+ logicBefore = this.dateCompare(before, after) ? before : after
+ }
+ return this.dateEqual(logicBefore, currentDay)
+ }
+
+ isLogicAfter(currentDay, before, after) {
+ let logicAfter = after
+ if (before && after) {
+ logicAfter = this.dateCompare(before, after) ? after : before
+ }
+ return this.dateEqual(logicAfter, currentDay)
+ }
+
+ /**
+ * 获取日期范围内所有日期
+ * @param {Object} begin
+ * @param {Object} end
+ */
+ geDateAll(begin, end) {
+ var arr = []
+ var ab = begin.split('-')
+ var ae = end.split('-')
+ var db = new Date()
+ db.setFullYear(ab[0], ab[1] - 1, ab[2])
+ var de = new Date()
+ de.setFullYear(ae[0], ae[1] - 1, ae[2])
+ var unixDb = db.getTime() - 24 * 60 * 60 * 1000
+ var unixDe = de.getTime() - 24 * 60 * 60 * 1000
+ for (var k = unixDb; k <= unixDe;) {
+ k = k + 24 * 60 * 60 * 1000
+ arr.push(this.getDate(new Date(parseInt(k))).fullDate)
+ }
+ return arr
+ }
+
+ /**
+ * 获取多选状态
+ */
+ setMultiple(fullDate) {
+ let {
+ before,
+ after
+ } = this.multipleStatus
+ if (!this.range) return
+ if (before && after) {
+ if (!this.lastHover) {
+ this.lastHover = true
+ return
+ }
+ this.multipleStatus.before = fullDate
+ this.multipleStatus.after = ''
+ this.multipleStatus.data = []
+ this.multipleStatus.fulldate = ''
+ this.lastHover = false
+ } else {
+ if (!before) {
+ this.multipleStatus.before = fullDate
+ this.lastHover = false
+ } else {
+ this.multipleStatus.after = fullDate
+ if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+ this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus
+ .after);
+ } else {
+ this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus
+ .before);
+ }
+ this.lastHover = true
+ }
+ }
+ this._getWeek(fullDate)
+ }
+
+ /**
+ * 鼠标 hover 更新多选状态
+ */
+ setHoverMultiple(fullDate) {
+ let {
+ before,
+ after
+ } = this.multipleStatus
+
+ if (!this.range) return
+ if (this.lastHover) return
+
+ if (!before) {
+ this.multipleStatus.before = fullDate
+ } else {
+ this.multipleStatus.after = fullDate
+ if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+ this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after);
+ } else {
+ this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before);
+ }
+ }
+ this._getWeek(fullDate)
+ }
+
+ /**
+ * 更新默认值多选状态
+ */
+ setDefaultMultiple(before, after) {
+ this.multipleStatus.before = before
+ this.multipleStatus.after = after
+ if (before && after) {
+ if (this.dateCompare(before, after)) {
+ this.multipleStatus.data = this.geDateAll(before, after);
+ this._getWeek(after)
+ } else {
+ this.multipleStatus.data = this.geDateAll(after, before);
+ this._getWeek(before)
+ }
+ }
+ }
+
+ /**
+ * 获取每周数据
+ * @param {Object} dateData
+ */
+ _getWeek(dateData) {
+ const {
+ fullDate,
+ year,
+ month,
+ date,
+ day
+ } = this.getDate(dateData)
+ let firstDay = new Date(year, month - 1, 1).getDay()
+ let currentDay = new Date(year, month, 0).getDate()
+ let dates = {
+ lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天
+ currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数
+ nextMonthDays: [], // 下个月开始几天
+ weeks: []
+ }
+ let canlender = []
+ const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length)
+ dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData))
+ canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays)
+ let weeks = {}
+ // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天
+ for (let i = 0; i < canlender.length; i++) {
+ if (i % 7 === 0) {
+ weeks[parseInt(i / 7)] = new Array(7)
+ }
+ weeks[parseInt(i / 7)][i % 7] = canlender[i]
+ }
+ this.canlender = canlender
+ this.weeks = weeks
+ }
+
+ //静态方法
+ // static init(date) {
+ // if (!this.instance) {
+ // this.instance = new Calendar(date);
+ // }
+ // return this.instance;
+ // }
+}
+
+
+export default Calendar
diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json
new file mode 100644
index 0000000..2ec840e
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uni-datetime-picker",
+ "displayName": "uni-datetime-picker 日期选择器",
+ "version": "2.2.19",
+ "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择",
+ "keywords": [
+ "uni-datetime-picker",
+ "uni-ui",
+ "uniui",
+ "日期时间选择器",
+ "日期时间"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-icons"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "n"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-datetime-picker/readme.md b/uni_modules/uni-datetime-picker/readme.md
new file mode 100644
index 0000000..162fbef
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/readme.md
@@ -0,0 +1,21 @@
+
+
+> `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护`
+
+## DatetimePicker 时间选择器
+
+> **组件名:uni-datetime-picker**
+> 代码块: `uDatetimePicker`
+
+
+该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。
+
+若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。
+
+**_点击 picker 默认值规则:_**
+
+- 若设置初始值 value, 会显示在 picker 显示框中
+- 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-drawer/changelog.md b/uni_modules/uni-drawer/changelog.md
new file mode 100644
index 0000000..6d2488c
--- /dev/null
+++ b/uni_modules/uni-drawer/changelog.md
@@ -0,0 +1,13 @@
+## 1.2.1(2021-11-22)
+- 修复 vue3中个别scss变量无法找到的问题
+## 1.2.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-drawer](https://uniapp.dcloud.io/component/uniui/uni-drawer)
+## 1.1.1(2021-07-30)
+- 优化 vue3下事件警告的问题
+## 1.1.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.0.7(2021-05-12)
+- 新增 组件示例地址
+## 1.0.6(2021-02-04)
+- 调整为uni_modules目录规范
diff --git a/uni_modules/uni-drawer/components/uni-drawer/keypress.js b/uni_modules/uni-drawer/components/uni-drawer/keypress.js
new file mode 100644
index 0000000..62dda46
--- /dev/null
+++ b/uni_modules/uni-drawer/components/uni-drawer/keypress.js
@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+ name: 'Keypress',
+ props: {
+ disable: {
+ type: Boolean,
+ default: false
+ }
+ },
+ mounted () {
+ const keyNames = {
+ esc: ['Esc', 'Escape'],
+ tab: 'Tab',
+ enter: 'Enter',
+ space: [' ', 'Spacebar'],
+ up: ['Up', 'ArrowUp'],
+ left: ['Left', 'ArrowLeft'],
+ right: ['Right', 'ArrowRight'],
+ down: ['Down', 'ArrowDown'],
+ delete: ['Backspace', 'Delete', 'Del']
+ }
+ const listener = ($event) => {
+ if (this.disable) {
+ return
+ }
+ const keyName = Object.keys(keyNames).find(key => {
+ const keyName = $event.key
+ const value = keyNames[key]
+ return value === keyName || (Array.isArray(value) && value.includes(keyName))
+ })
+ if (keyName) {
+ // 避免和其他按键事件冲突
+ setTimeout(() => {
+ this.$emit(keyName, {})
+ }, 0)
+ }
+ }
+ document.addEventListener('keyup', listener)
+ // this.$once('hook:beforeDestroy', () => {
+ // document.removeEventListener('keyup', listener)
+ // })
+ },
+ render: () => {}
+}
+// #endif
diff --git a/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue b/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue
new file mode 100644
index 0000000..2471521
--- /dev/null
+++ b/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-drawer/package.json b/uni_modules/uni-drawer/package.json
new file mode 100644
index 0000000..dd056e4
--- /dev/null
+++ b/uni_modules/uni-drawer/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uni-drawer",
+ "displayName": "uni-drawer 抽屉",
+ "version": "1.2.1",
+ "description": "抽屉式导航,用于展示侧滑菜单,侧滑导航。",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "drawer",
+ "抽屉",
+ "侧滑导航"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-drawer/readme.md b/uni_modules/uni-drawer/readme.md
new file mode 100644
index 0000000..dcf6e6b
--- /dev/null
+++ b/uni_modules/uni-drawer/readme.md
@@ -0,0 +1,10 @@
+
+
+## Drawer 抽屉
+> **组件名:uni-drawer**
+> 代码块: `uDrawer`
+
+抽屉侧滑菜单。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-drawer)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-easyinput/changelog.md b/uni_modules/uni-easyinput/changelog.md
new file mode 100644
index 0000000..33130c6
--- /dev/null
+++ b/uni_modules/uni-easyinput/changelog.md
@@ -0,0 +1,53 @@
+## 1.1.3(2022-09-22)
+- 修复,引入 uni.scss 引入默认主题色报错的问题
+## 1.1.2(2022-09-22)
+- 增加主题色 primaryColor 配置选项
+## 1.1.1(2022-09-19)
+- 修复,输入后回车,change 事件触发两次,[详情](https://ask.dcloud.net.cn/question/152149)
+## 1.1.0(2022-06-30)
+- 新增 在 uni-forms 1.4.0 中使用可以在 blur 时校验内容
+- 新增 clear 事件,点击右侧叉号图标触发
+- 新增 change 事件 ,仅在输入框失去焦点或用户按下回车时触发
+- 优化 组件样式,组件获取焦点时高亮显示,图标颜色调整等
+-
+## 1.0.5(2022-06-07)
+- 优化 clearable 显示策略
+## 1.0.4(2022-06-07)
+- 优化 clearable 显示策略
+## 1.0.3(2022-05-20)
+- 修复 关闭图标某些情况下无法取消的bug
+## 1.0.2(2022-04-12)
+- 修复 默认值不生效的bug
+## 1.0.1(2022-04-02)
+- 修复 value不能为0的bug
+## 1.0.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-easyinput](https://uniapp.dcloud.io/component/uniui/uni-easyinput)
+## 0.1.4(2021-08-20)
+- 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug
+## 0.1.3(2021-08-11)
+- 修复 在 uni-forms 中重置表单,错误信息无法清除的问题
+## 0.1.2(2021-07-30)
+- 优化 vue3下事件警告的问题
+## 0.1.1
+- 优化 errorMessage 属性支持 Boolean 类型
+## 0.1.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 0.0.16(2021-06-29)
+- 修复 confirmType 属性(仅 type="text" 生效)导致多行文本框无法换行的 bug
+## 0.0.15(2021-06-21)
+- 修复 passwordIcon 属性拼写错误的 bug
+## 0.0.14(2021-06-18)
+- 新增 passwordIcon 属性,当type=password时是否显示小眼睛图标
+- 修复 confirmType 属性不生效的问题
+## 0.0.13(2021-06-04)
+- 修复 disabled 状态可清出内容的 bug
+## 0.0.12(2021-05-12)
+- 新增 组件示例地址
+## 0.0.11(2021-05-07)
+- 修复 input-border 属性不生效的问题
+## 0.0.10(2021-04-30)
+- 修复 ios 遮挡文字、显示一半的问题
+## 0.0.9(2021-02-05)
+- 调整为uni_modules目录规范
+- 优化 兼容 nvue 页面
diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/common.js b/uni_modules/uni-easyinput/components/uni-easyinput/common.js
new file mode 100644
index 0000000..df9abe1
--- /dev/null
+++ b/uni_modules/uni-easyinput/components/uni-easyinput/common.js
@@ -0,0 +1,56 @@
+/**
+ * @desc 函数防抖
+ * @param func 目标函数
+ * @param wait 延迟执行毫秒数
+ * @param immediate true - 立即执行, false - 延迟执行
+ */
+export const debounce = function(func, wait = 1000, immediate = true) {
+ let timer;
+ console.log(1);
+ return function() {
+ console.log(123);
+ let context = this,
+ args = arguments;
+ if (timer) clearTimeout(timer);
+ if (immediate) {
+ let callNow = !timer;
+ timer = setTimeout(() => {
+ timer = null;
+ }, wait);
+ if (callNow) func.apply(context, args);
+ } else {
+ timer = setTimeout(() => {
+ func.apply(context, args);
+ }, wait)
+ }
+ }
+}
+/**
+ * @desc 函数节流
+ * @param func 函数
+ * @param wait 延迟执行毫秒数
+ * @param type 1 使用表时间戳,在时间段开始的时候触发 2 使用表定时器,在时间段结束的时候触发
+ */
+export const throttle = (func, wait = 1000, type = 1) => {
+ let previous = 0;
+ let timeout;
+ return function() {
+ let context = this;
+ let args = arguments;
+ if (type === 1) {
+ let now = Date.now();
+
+ if (now - previous > wait) {
+ func.apply(context, args);
+ previous = now;
+ }
+ } else if (type === 2) {
+ if (!timeout) {
+ timeout = setTimeout(() => {
+ timeout = null;
+ func.apply(context, args)
+ }, wait)
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue
new file mode 100644
index 0000000..d4c15ba
--- /dev/null
+++ b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue
@@ -0,0 +1,605 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-easyinput/package.json b/uni_modules/uni-easyinput/package.json
new file mode 100644
index 0000000..4ca4200
--- /dev/null
+++ b/uni_modules/uni-easyinput/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uni-easyinput",
+ "displayName": "uni-easyinput 增强输入框",
+ "version": "1.1.3",
+ "description": "Easyinput 组件是对原生input组件的增强",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "input",
+ "uni-easyinput",
+ "输入框"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-icons"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-easyinput/readme.md b/uni_modules/uni-easyinput/readme.md
new file mode 100644
index 0000000..f1faf8f
--- /dev/null
+++ b/uni_modules/uni-easyinput/readme.md
@@ -0,0 +1,11 @@
+
+
+### Easyinput 增强输入框
+> **组件名:uni-easyinput**
+> 代码块: `uEasyinput`
+
+
+easyinput 组件是对原生input组件的增强 ,是专门为配合表单组件[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)而设计的,easyinput 内置了边框,图标等,同时包含 input 所有功能
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-easyinput)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-fab/changelog.md b/uni_modules/uni-fab/changelog.md
new file mode 100644
index 0000000..0048ff9
--- /dev/null
+++ b/uni_modules/uni-fab/changelog.md
@@ -0,0 +1,21 @@
+## 1.2.4(2022-09-07)
+小程序端由于 style 使用了对象导致报错,[详情](https://ask.dcloud.net.cn/question/152790?item_id=211778&rf=false)
+## 1.2.3(2022-09-05)
+- 修复 nvue 环境下,具有 tabBar 时,fab 组件下部位置无法正常获取 --window-bottom 的bug,详见:[https://ask.dcloud.net.cn/question/110638?notification_id=826310](https://ask.dcloud.net.cn/question/110638?notification_id=826310)
+## 1.2.2(2021-12-29)
+- 更新 组件依赖
+## 1.2.1(2021-11-19)
+- 修复 阴影颜色不正确的bug
+## 1.2.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-fab](https://uniapp.dcloud.io/component/uniui/uni-fab)
+## 1.1.1(2021-11-09)
+- 新增 提供组件设计资源,组件样式调整
+## 1.1.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.0.7(2021-05-12)
+- 新增 组件示例地址
+## 1.0.6(2021-02-05)
+- 调整为uni_modules目录规范
+- 优化 按钮背景色调整
+- 优化 兼容pc端
diff --git a/uni_modules/uni-fab/components/uni-fab/uni-fab.vue b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue
new file mode 100644
index 0000000..96c4739
--- /dev/null
+++ b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue
@@ -0,0 +1,487 @@
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-fab/components/uni-fab/uni-fab.vue.bak b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue.bak
new file mode 100644
index 0000000..5adc72a
--- /dev/null
+++ b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue.bak
@@ -0,0 +1,379 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-fab/package.json b/uni_modules/uni-fab/package.json
new file mode 100644
index 0000000..6636170
--- /dev/null
+++ b/uni_modules/uni-fab/package.json
@@ -0,0 +1,84 @@
+{
+ "id": "uni-fab",
+ "displayName": "uni-fab 悬浮按钮",
+ "version": "1.2.4",
+ "description": "悬浮按钮 fab button ,点击可展开一个图标按钮菜单。",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "按钮",
+ "悬浮按钮",
+ "fab"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss","uni-icons"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-fab/readme.md b/uni_modules/uni-fab/readme.md
new file mode 100644
index 0000000..9a444e8
--- /dev/null
+++ b/uni_modules/uni-fab/readme.md
@@ -0,0 +1,9 @@
+## Fab 悬浮按钮
+> **组件名:uni-fab**
+> 代码块: `uFab`
+
+
+点击可展开一个图形按钮菜单
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-fab)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-fav/changelog.md b/uni_modules/uni-fav/changelog.md
new file mode 100644
index 0000000..d8a08d4
--- /dev/null
+++ b/uni_modules/uni-fav/changelog.md
@@ -0,0 +1,19 @@
+## 1.2.1(2022-05-30)
+- 新增 stat 属性 ,是否开启uni统计功能
+## 1.2.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-fav](https://uniapp.dcloud.io/component/uniui/uni-fav)
+## 1.1.1(2021-08-24)
+- 新增 支持国际化
+## 1.1.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.0.6(2021-05-12)
+- 新增 组件示例地址
+## 1.0.5(2021-04-21)
+- 优化 添加依赖 uni-icons, 导入后自动下载依赖
+## 1.0.4(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+## 1.0.3(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+## 1.0.2(2021-02-05)
+- 调整为uni_modules目录规范
diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/en.json b/uni_modules/uni-fav/components/uni-fav/i18n/en.json
new file mode 100644
index 0000000..9a0759e
--- /dev/null
+++ b/uni_modules/uni-fav/components/uni-fav/i18n/en.json
@@ -0,0 +1,4 @@
+{
+ "uni-fav.collect": "collect",
+ "uni-fav.collected": "collected"
+}
diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/index.js b/uni_modules/uni-fav/components/uni-fav/i18n/index.js
new file mode 100644
index 0000000..de7509c
--- /dev/null
+++ b/uni_modules/uni-fav/components/uni-fav/i18n/index.js
@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+ en,
+ 'zh-Hans': zhHans,
+ 'zh-Hant': zhHant
+}
diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json
new file mode 100644
index 0000000..67c89bf
--- /dev/null
+++ b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json
@@ -0,0 +1,4 @@
+{
+ "uni-fav.collect": "收藏",
+ "uni-fav.collected": "已收藏"
+}
diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json
new file mode 100644
index 0000000..67c89bf
--- /dev/null
+++ b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json
@@ -0,0 +1,4 @@
+{
+ "uni-fav.collect": "收藏",
+ "uni-fav.collected": "已收藏"
+}
diff --git a/uni_modules/uni-fav/components/uni-fav/uni-fav.vue b/uni_modules/uni-fav/components/uni-fav/uni-fav.vue
new file mode 100644
index 0000000..d2c58df
--- /dev/null
+++ b/uni_modules/uni-fav/components/uni-fav/uni-fav.vue
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
+
+
+ {{ checked ? contentFav : contentDefault }}
+
+
+
+
+
+
diff --git a/uni_modules/uni-fav/package.json b/uni_modules/uni-fav/package.json
new file mode 100644
index 0000000..cc14697
--- /dev/null
+++ b/uni_modules/uni-fav/package.json
@@ -0,0 +1,89 @@
+{
+ "id": "uni-fav",
+ "displayName": "uni-fav 收藏按钮",
+ "version": "1.2.1",
+ "description": " Fav 收藏组件,可自定义颜色、大小。",
+ "keywords": [
+ "fav",
+ "uni-ui",
+ "uniui",
+ "收藏"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-icons"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-fav/readme.md b/uni_modules/uni-fav/readme.md
new file mode 100644
index 0000000..4de125d
--- /dev/null
+++ b/uni_modules/uni-fav/readme.md
@@ -0,0 +1,10 @@
+
+
+## Fav 收藏按钮
+> **组件名:uni-fav**
+> 代码块: `uFav`
+
+用于收藏功能,可点击切换选中、不选中的状态。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-fav)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-file-picker/changelog.md b/uni_modules/uni-file-picker/changelog.md
new file mode 100644
index 0000000..e1621c3
--- /dev/null
+++ b/uni_modules/uni-file-picker/changelog.md
@@ -0,0 +1,65 @@
+## 1.0.3(2022-12-21)
+- 新增 sourceType 属性, 可以自定义图片和视频选择的来源
+## 1.0.2(2022-07-04)
+- 修复 在uni-forms下样式不生效的bug
+## 1.0.1(2021-11-23)
+- 修复 参数为对象的情况下,url在某些情况显示错误的bug
+## 1.0.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-file-picker](https://uniapp.dcloud.io/component/uniui/uni-file-picker)
+## 0.2.16(2021-11-08)
+- 修复 传入空对象 ,显示错误的Bug
+## 0.2.15(2021-08-30)
+- 修复 return-type="object" 时且存在v-model时,无法删除文件的Bug
+## 0.2.14(2021-08-23)
+- 新增 参数中返回 fileID 字段
+## 0.2.13(2021-08-23)
+- 修复 腾讯云传入fileID 不能回显的bug
+- 修复 选择图片后,不能放大的问题
+## 0.2.12(2021-08-17)
+- 修复 由于 0.2.11 版本引起的不能回显图片的Bug
+## 0.2.11(2021-08-16)
+- 新增 clearFiles(index) 方法,可以手动删除指定文件
+- 修复 v-model 值设为 null 报错的Bug
+## 0.2.10(2021-08-13)
+- 修复 return-type="object" 时,无法删除文件的Bug
+## 0.2.9(2021-08-03)
+- 修复 auto-upload 属性失效的Bug
+## 0.2.8(2021-07-31)
+- 修复 fileExtname属性不指定值报错的Bug
+## 0.2.7(2021-07-31)
+- 修复 在某种场景下图片不回显的Bug
+## 0.2.6(2021-07-30)
+- 修复 return-type为object下,返回值不正确的Bug
+## 0.2.5(2021-07-30)
+- 修复(重要) H5 平台下如果和uni-forms组件一同使用导致页面卡死的问题
+## 0.2.3(2021-07-28)
+- 优化 调整示例代码
+## 0.2.2(2021-07-27)
+- 修复 vue3 下赋值错误的Bug
+- 优化 h5平台下上传文件导致页面卡死的问题
+## 0.2.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 0.1.1(2021-07-02)
+- 修复 sourceType 缺少默认值导致 ios 无法选择文件
+## 0.1.0(2021-06-30)
+- 优化 解耦与uniCloud的强绑定关系 ,如不绑定服务空间,默认autoUpload为false且不可更改
+## 0.0.11(2021-06-30)
+- 修复 由 0.0.10 版本引发的 returnType 属性失效的问题
+## 0.0.10(2021-06-29)
+- 优化 文件上传后进度条消失时机
+## 0.0.9(2021-06-29)
+- 修复 在uni-forms 中,删除文件 ,获取的值不对的Bug
+## 0.0.8(2021-06-15)
+- 修复 删除文件时无法触发 v-model 的Bug
+## 0.0.7(2021-05-12)
+- 新增 组件示例地址
+## 0.0.6(2021-04-09)
+- 修复 选择的文件非 file-extname 字段指定的扩展名报错的Bug
+## 0.0.5(2021-04-09)
+- 优化 更新组件示例
+## 0.0.4(2021-04-09)
+- 优化 file-extname 字段支持字符串写法,多个扩展名需要用逗号分隔
+## 0.0.3(2021-02-05)
+- 调整为uni_modules目录规范
+- 修复 微信小程序不指定 fileExtname 属性选择失败的Bug
diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js b/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js
new file mode 100644
index 0000000..aff0864
--- /dev/null
+++ b/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js
@@ -0,0 +1,224 @@
+'use strict';
+
+const ERR_MSG_OK = 'chooseAndUploadFile:ok';
+const ERR_MSG_FAIL = 'chooseAndUploadFile:fail';
+
+function chooseImage(opts) {
+ const {
+ count,
+ sizeType = ['original', 'compressed'],
+ sourceType,
+ extension
+ } = opts
+ return new Promise((resolve, reject) => {
+ uni.chooseImage({
+ count,
+ sizeType,
+ sourceType,
+ extension,
+ success(res) {
+ resolve(normalizeChooseAndUploadFileRes(res, 'image'));
+ },
+ fail(res) {
+ reject({
+ errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL),
+ });
+ },
+ });
+ });
+}
+
+function chooseVideo(opts) {
+ const {
+ camera,
+ compressed,
+ maxDuration,
+ sourceType,
+ extension
+ } = opts;
+ return new Promise((resolve, reject) => {
+ uni.chooseVideo({
+ camera,
+ compressed,
+ maxDuration,
+ sourceType,
+ extension,
+ success(res) {
+ const {
+ tempFilePath,
+ duration,
+ size,
+ height,
+ width
+ } = res;
+ resolve(normalizeChooseAndUploadFileRes({
+ errMsg: 'chooseVideo:ok',
+ tempFilePaths: [tempFilePath],
+ tempFiles: [
+ {
+ name: (res.tempFile && res.tempFile.name) || '',
+ path: tempFilePath,
+ size,
+ type: (res.tempFile && res.tempFile.type) || '',
+ width,
+ height,
+ duration,
+ fileType: 'video',
+ cloudPath: '',
+ }, ],
+ }, 'video'));
+ },
+ fail(res) {
+ reject({
+ errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL),
+ });
+ },
+ });
+ });
+}
+
+function chooseAll(opts) {
+ const {
+ count,
+ extension
+ } = opts;
+ return new Promise((resolve, reject) => {
+ let chooseFile = uni.chooseFile;
+ if (typeof wx !== 'undefined' &&
+ typeof wx.chooseMessageFile === 'function') {
+ chooseFile = wx.chooseMessageFile;
+ }
+ if (typeof chooseFile !== 'function') {
+ return reject({
+ errMsg: ERR_MSG_FAIL + ' 请指定 type 类型,该平台仅支持选择 image 或 video。',
+ });
+ }
+ chooseFile({
+ type: 'all',
+ count,
+ extension,
+ success(res) {
+ resolve(normalizeChooseAndUploadFileRes(res));
+ },
+ fail(res) {
+ reject({
+ errMsg: res.errMsg.replace('chooseFile:fail', ERR_MSG_FAIL),
+ });
+ },
+ });
+ });
+}
+
+function normalizeChooseAndUploadFileRes(res, fileType) {
+ res.tempFiles.forEach((item, index) => {
+ if (!item.name) {
+ item.name = item.path.substring(item.path.lastIndexOf('/') + 1);
+ }
+ if (fileType) {
+ item.fileType = fileType;
+ }
+ item.cloudPath =
+ Date.now() + '_' + index + item.name.substring(item.name.lastIndexOf('.'));
+ });
+ if (!res.tempFilePaths) {
+ res.tempFilePaths = res.tempFiles.map((file) => file.path);
+ }
+ return res;
+}
+
+function uploadCloudFiles(files, max = 5, onUploadProgress) {
+ files = JSON.parse(JSON.stringify(files))
+ const len = files.length
+ let count = 0
+ let self = this
+ return new Promise(resolve => {
+ while (count < max) {
+ next()
+ }
+
+ function next() {
+ let cur = count++
+ if (cur >= len) {
+ !files.find(item => !item.url && !item.errMsg) && resolve(files)
+ return
+ }
+ const fileItem = files[cur]
+ const index = self.files.findIndex(v => v.uuid === fileItem.uuid)
+ fileItem.url = ''
+ delete fileItem.errMsg
+
+ uniCloud
+ .uploadFile({
+ filePath: fileItem.path,
+ cloudPath: fileItem.cloudPath,
+ fileType: fileItem.fileType,
+ onUploadProgress: res => {
+ res.index = index
+ onUploadProgress && onUploadProgress(res)
+ }
+ })
+ .then(res => {
+ fileItem.url = res.fileID
+ fileItem.index = index
+ if (cur < len) {
+ next()
+ }
+ })
+ .catch(res => {
+ fileItem.errMsg = res.errMsg || res.message
+ fileItem.index = index
+ if (cur < len) {
+ next()
+ }
+ })
+ }
+ })
+}
+
+
+
+
+
+function uploadFiles(choosePromise, {
+ onChooseFile,
+ onUploadProgress
+}) {
+ return choosePromise
+ .then((res) => {
+ if (onChooseFile) {
+ const customChooseRes = onChooseFile(res);
+ if (typeof customChooseRes !== 'undefined') {
+ return Promise.resolve(customChooseRes).then((chooseRes) => typeof chooseRes === 'undefined' ?
+ res : chooseRes);
+ }
+ }
+ return res;
+ })
+ .then((res) => {
+ if (res === false) {
+ return {
+ errMsg: ERR_MSG_OK,
+ tempFilePaths: [],
+ tempFiles: [],
+ };
+ }
+ return res
+ })
+}
+
+function chooseAndUploadFile(opts = {
+ type: 'all'
+}) {
+ if (opts.type === 'image') {
+ return uploadFiles(chooseImage(opts), opts);
+ }
+ else if (opts.type === 'video') {
+ return uploadFiles(chooseVideo(opts), opts);
+ }
+ return uploadFiles(chooseAll(opts), opts);
+}
+
+export {
+ chooseAndUploadFile,
+ uploadCloudFiles
+};
diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue
new file mode 100644
index 0000000..9bb9829
--- /dev/null
+++ b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue b/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue
new file mode 100644
index 0000000..625d92e
--- /dev/null
+++ b/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue
@@ -0,0 +1,325 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+ 点击重试
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue
new file mode 100644
index 0000000..2a29bc2
--- /dev/null
+++ b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue
@@ -0,0 +1,292 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击重试
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/utils.js b/uni_modules/uni-file-picker/components/uni-file-picker/utils.js
new file mode 100644
index 0000000..60aaa3e
--- /dev/null
+++ b/uni_modules/uni-file-picker/components/uni-file-picker/utils.js
@@ -0,0 +1,109 @@
+/**
+ * 获取文件名和后缀
+ * @param {String} name
+ */
+export const get_file_ext = (name) => {
+ const last_len = name.lastIndexOf('.')
+ const len = name.length
+ return {
+ name: name.substring(0, last_len),
+ ext: name.substring(last_len + 1, len)
+ }
+}
+
+/**
+ * 获取扩展名
+ * @param {Array} fileExtname
+ */
+export const get_extname = (fileExtname) => {
+ if (!Array.isArray(fileExtname)) {
+ let extname = fileExtname.replace(/(\[|\])/g, '')
+ return extname.split(',')
+ } else {
+ return fileExtname
+ }
+ return []
+}
+
+/**
+ * 获取文件和检测是否可选
+ */
+export const get_files_and_is_max = (res, _extname) => {
+ let filePaths = []
+ let files = []
+ if(!_extname || _extname.length === 0){
+ return {
+ filePaths,
+ files
+ }
+ }
+ res.tempFiles.forEach(v => {
+ let fileFullName = get_file_ext(v.name)
+ const extname = fileFullName.ext.toLowerCase()
+ if (_extname.indexOf(extname) !== -1) {
+ files.push(v)
+ filePaths.push(v.path)
+ }
+ })
+ if (files.length !== res.tempFiles.length) {
+ uni.showToast({
+ title: `当前选择了${res.tempFiles.length}个文件 ,${res.tempFiles.length - files.length} 个文件格式不正确`,
+ icon: 'none',
+ duration: 5000
+ })
+ }
+
+ return {
+ filePaths,
+ files
+ }
+}
+
+
+/**
+ * 获取图片信息
+ * @param {Object} filepath
+ */
+export const get_file_info = (filepath) => {
+ return new Promise((resolve, reject) => {
+ uni.getImageInfo({
+ src: filepath,
+ success(res) {
+ resolve(res)
+ },
+ fail(err) {
+ reject(err)
+ }
+ })
+ })
+}
+/**
+ * 获取封装数据
+ */
+export const get_file_data = async (files, type = 'image') => {
+ // 最终需要上传数据库的数据
+ let fileFullName = get_file_ext(files.name)
+ const extname = fileFullName.ext.toLowerCase()
+ let filedata = {
+ name: files.name,
+ uuid: files.uuid,
+ extname: extname || '',
+ cloudPath: files.cloudPath,
+ fileType: files.fileType,
+ url: files.path || files.path,
+ size: files.size, //单位是字节
+ image: {},
+ path: files.path,
+ video: {}
+ }
+ if (type === 'image') {
+ const imageinfo = await get_file_info(files.path)
+ delete filedata.video
+ filedata.image.width = imageinfo.width
+ filedata.image.height = imageinfo.height
+ filedata.image.location = imageinfo.path
+ } else {
+ delete filedata.image
+ }
+ return filedata
+}
diff --git a/uni_modules/uni-file-picker/package.json b/uni_modules/uni-file-picker/package.json
new file mode 100644
index 0000000..c93b634
--- /dev/null
+++ b/uni_modules/uni-file-picker/package.json
@@ -0,0 +1,86 @@
+{
+ "id": "uni-file-picker",
+ "displayName": "uni-file-picker 文件选择上传",
+ "version": "1.0.3",
+ "description": "文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "图片上传",
+ "文件上传"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "n"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-file-picker/readme.md b/uni_modules/uni-file-picker/readme.md
new file mode 100644
index 0000000..c8399a5
--- /dev/null
+++ b/uni_modules/uni-file-picker/readme.md
@@ -0,0 +1,11 @@
+
+## FilePicker 文件选择上传
+
+> **组件名:uni-file-picker**
+> 代码块: `uFilePicker`
+
+
+文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-file-picker)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-forms/changelog.md b/uni_modules/uni-forms/changelog.md
new file mode 100644
index 0000000..c358a21
--- /dev/null
+++ b/uni_modules/uni-forms/changelog.md
@@ -0,0 +1,90 @@
+## 1.4.8(2022-08-23)
+- 优化 根据 rules 自动添加 required 的问题
+## 1.4.7(2022-08-22)
+- 修复 item 未设置 require 属性,rules 设置 require 后,星号也显示的 bug,详见:[https://ask.dcloud.net.cn/question/151540](https://ask.dcloud.net.cn/question/151540)
+## 1.4.6(2022-07-13)
+- 修复 model 需要校验的值没有声明对应字段时,导致第一次不触发校验的bug
+## 1.4.5(2022-07-05)
+- 新增 更多表单示例
+- 优化 子表单组件过期提示的问题
+- 优化 子表单组件uni-datetime-picker、uni-data-select、uni-data-picker的显示样式
+## 1.4.4(2022-07-04)
+- 更新 删除组件日志
+## 1.4.3(2022-07-04)
+- 修复 由 1.4.0 引发的 label 插槽不生效的bug
+## 1.4.2(2022-07-04)
+- 修复 子组件找不到 setValue 报错的bug
+## 1.4.1(2022-07-04)
+- 修复 uni-data-picker 在 uni-forms-item 中报错的bug
+- 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug
+## 1.4.0(2022-06-30)
+- 【重要】组件逻辑重构,部分用法用旧版本不兼容,请注意兼容问题
+- 【重要】组件使用 Provide/Inject 方式注入依赖,提供了自定义表单组件调用 uni-forms 校验表单的能力
+- 新增 model 属性,等同于原 value/modelValue 属性,旧属性即将废弃
+- 新增 validateTrigger 属性的 blur 值,仅 uni-easyinput 生效
+- 新增 onFieldChange 方法,可以对子表单进行校验,可替代binddata方法
+- 新增 子表单的 setRules 方法,配合自定义校验函数使用
+- 新增 uni-forms-item 的 setRules 方法,配置动态表单使用可动态更新校验规则
+- 优化 动态表单校验方式,废弃拼接name的方式
+## 1.3.3(2022-06-22)
+- 修复 表单校验顺序无序问题
+## 1.3.2(2021-12-09)
+-
+## 1.3.1(2021-11-19)
+- 修复 label 插槽不生效的bug
+## 1.3.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-forms](https://uniapp.dcloud.io/component/uniui/uni-forms)
+## 1.2.7(2021-08-13)
+- 修复 没有添加校验规则的字段依然报错的Bug
+## 1.2.6(2021-08-11)
+- 修复 重置表单错误信息无法清除的问题
+## 1.2.5(2021-08-11)
+- 优化 组件文档
+## 1.2.4(2021-08-11)
+- 修复 表单验证只生效一次的问题
+## 1.2.3(2021-07-30)
+- 优化 vue3下事件警告的问题
+## 1.2.2(2021-07-26)
+- 修复 vue2 下条件编译导致destroyed生命周期失效的Bug
+- 修复 1.2.1 引起的示例在小程序平台报错的Bug
+## 1.2.1(2021-07-22)
+- 修复 动态校验表单,默认值为空的情况下校验失效的Bug
+- 修复 不指定name属性时,运行报错的Bug
+- 优化 label默认宽度从65调整至70,使required为true且四字时不换行
+- 优化 组件示例,新增动态校验示例代码
+- 优化 组件文档,使用方式更清晰
+## 1.2.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.2(2021-06-25)
+- 修复 pattern 属性在微信小程序平台无效的问题
+## 1.1.1(2021-06-22)
+- 修复 validate-trigger属性为submit且err-show-type属性为toast时不能弹出的Bug
+## 1.1.0(2021-06-22)
+- 修复 只写setRules方法而导致校验不生效的Bug
+- 修复 由上个办法引发的错误提示文字错位的Bug
+## 1.0.48(2021-06-21)
+- 修复 不设置 label 属性 ,无法设置label插槽的问题
+## 1.0.47(2021-06-21)
+- 修复 不设置label属性,label-width属性不生效的bug
+- 修复 setRules 方法与rules属性冲突的问题
+## 1.0.46(2021-06-04)
+- 修复 动态删减数据导致报错的问题
+## 1.0.45(2021-06-04)
+- 新增 modelValue 属性 ,value 即将废弃
+## 1.0.44(2021-06-02)
+- 新增 uni-forms-item 可以设置单独的 rules
+- 新增 validate 事件增加 keepitem 参数,可以选择那些字段不过滤
+- 优化 submit 事件重命名为 validate
+## 1.0.43(2021-05-12)
+- 新增 组件示例地址
+## 1.0.42(2021-04-30)
+- 修复 自定义检验器失效的问题
+## 1.0.41(2021-03-05)
+- 更新 校验器
+- 修复 表单规则设置类型为 number 的情况下,值为0校验失败的Bug
+## 1.0.40(2021-03-04)
+- 修复 动态显示uni-forms-item的情况下,submit 方法获取值错误的Bug
+## 1.0.39(2021-02-05)
+- 调整为uni_modules目录规范
+- 修复 校验器传入 int 等类型 ,返回String类型的Bug
diff --git a/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue b/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue
new file mode 100644
index 0000000..ce7c460
--- /dev/null
+++ b/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue
@@ -0,0 +1,631 @@
+
+
+
+
+ *
+ {{label}}
+
+
+
+
+
+
+ {{msg}}
+
+
+
+
+
+
+
+
+
+ {{msg}}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-forms/components/uni-forms/uni-forms.vue b/uni_modules/uni-forms/components/uni-forms/uni-forms.vue
new file mode 100644
index 0000000..ed2f6d9
--- /dev/null
+++ b/uni_modules/uni-forms/components/uni-forms/uni-forms.vue
@@ -0,0 +1,397 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-forms/components/uni-forms/utils.js b/uni_modules/uni-forms/components/uni-forms/utils.js
new file mode 100644
index 0000000..6da2421
--- /dev/null
+++ b/uni_modules/uni-forms/components/uni-forms/utils.js
@@ -0,0 +1,293 @@
+/**
+ * 简单处理对象拷贝
+ * @param {Obejct} 被拷贝对象
+ * @@return {Object} 拷贝对象
+ */
+export const deepCopy = (val) => {
+ return JSON.parse(JSON.stringify(val))
+}
+/**
+ * 过滤数字类型
+ * @param {String} format 数字类型
+ * @@return {Boolean} 返回是否为数字类型
+ */
+export const typeFilter = (format) => {
+ return format === 'int' || format === 'double' || format === 'number' || format === 'timestamp';
+}
+
+/**
+ * 把 value 转换成指定的类型,用于处理初始值,原因是初始值需要入库不能为 undefined
+ * @param {String} key 字段名
+ * @param {any} value 字段值
+ * @param {Object} rules 表单校验规则
+ */
+export const getValue = (key, value, rules) => {
+ const isRuleNumType = rules.find(val => val.format && typeFilter(val.format));
+ const isRuleBoolType = rules.find(val => (val.format && val.format === 'boolean') || val.format === 'bool');
+ // 输入类型为 number
+ if (!!isRuleNumType) {
+ if (!value && value !== 0) {
+ value = null
+ } else {
+ value = isNumber(Number(value)) ? Number(value) : value
+ }
+ }
+
+ // 输入类型为 boolean
+ if (!!isRuleBoolType) {
+ value = isBoolean(value) ? value : false
+ }
+
+ return value;
+}
+
+/**
+ * 获取表单数据
+ * @param {String|Array} name 真实名称,需要使用 realName 获取
+ * @param {Object} data 原始数据
+ * @param {any} value 需要设置的值
+ */
+export const setDataValue = (field, formdata, value) => {
+ formdata[field] = value
+ return value || ''
+}
+
+/**
+ * 获取表单数据
+ * @param {String|Array} field 真实名称,需要使用 realName 获取
+ * @param {Object} data 原始数据
+ */
+export const getDataValue = (field, data) => {
+ return objGet(data, field)
+}
+
+/**
+ * 获取表单类型
+ * @param {String|Array} field 真实名称,需要使用 realName 获取
+ */
+export const getDataValueType = (field, data) => {
+ const value = getDataValue(field, data)
+ return {
+ type: type(value),
+ value
+ }
+}
+
+/**
+ * 获取表单可用的真实name
+ * @param {String|Array} name 表单name
+ * @@return {String} 表单可用的真实name
+ */
+export const realName = (name, data = {}) => {
+ const base_name = _basePath(name)
+ if (typeof base_name === 'object' && Array.isArray(base_name) && base_name.length > 1) {
+ const realname = base_name.reduce((a, b) => a += `#${b}`, '_formdata_')
+ return realname
+ }
+ return base_name[0] || name
+}
+
+/**
+ * 判断是否表单可用的真实name
+ * @param {String|Array} name 表单name
+ * @@return {String} 表单可用的真实name
+ */
+export const isRealName = (name) => {
+ const reg = /^_formdata_#*/
+ return reg.test(name)
+}
+
+/**
+ * 获取表单数据的原始格式
+ * @@return {Object|Array} object 需要解析的数据
+ */
+export const rawData = (object = {}, name) => {
+ let newData = JSON.parse(JSON.stringify(object))
+ let formData = {}
+ for(let i in newData){
+ let path = name2arr(i)
+ objSet(formData,path,newData[i])
+ }
+ return formData
+}
+
+/**
+ * 真实name还原为 array
+ * @param {*} name
+ */
+export const name2arr = (name) => {
+ let field = name.replace('_formdata_#', '')
+ field = field.split('#').map(v => (isNumber(v) ? Number(v) : v))
+ return field
+}
+
+/**
+ * 对象中设置值
+ * @param {Object|Array} object 源数据
+ * @param {String| Array} path 'a.b.c' 或 ['a',0,'b','c']
+ * @param {String} value 需要设置的值
+ */
+export const objSet = (object, path, value) => {
+ if (typeof object !== 'object') return object;
+ _basePath(path).reduce((o, k, i, _) => {
+ if (i === _.length - 1) {
+ // 若遍历结束直接赋值
+ o[k] = value
+ return null
+ } else if (k in o) {
+ // 若存在对应路径,则返回找到的对象,进行下一次遍历
+ return o[k]
+ } else {
+ // 若不存在对应路径,则创建对应对象,若下一路径是数字,新对象赋值为空数组,否则赋值为空对象
+ o[k] = /^[0-9]{1,}$/.test(_[i + 1]) ? [] : {}
+ return o[k]
+ }
+ }, object)
+ // 返回object
+ return object;
+}
+
+// 处理 path, path有三种形式:'a[0].b.c'、'a.0.b.c' 和 ['a','0','b','c'],需要统一处理成数组,便于后续使用
+function _basePath(path) {
+ // 若是数组,则直接返回
+ if (Array.isArray(path)) return path
+ // 若有 '[',']',则替换成将 '[' 替换成 '.',去掉 ']'
+ return path.replace(/\[/g, '.').replace(/\]/g, '').split('.')
+}
+
+/**
+ * 从对象中获取值
+ * @param {Object|Array} object 源数据
+ * @param {String| Array} path 'a.b.c' 或 ['a',0,'b','c']
+ * @param {String} defaultVal 如果无法从调用链中获取值的默认值
+ */
+export const objGet = (object, path, defaultVal = 'undefined') => {
+ // 先将path处理成统一格式
+ let newPath = _basePath(path)
+ // 递归处理,返回最后结果
+ let val = newPath.reduce((o, k) => {
+ return (o || {})[k]
+ }, object);
+ return !val || val !== undefined ? val : defaultVal
+}
+
+
+/**
+ * 是否为 number 类型
+ * @param {any} num 需要判断的值
+ * @return {Boolean} 是否为 number
+ */
+export const isNumber = (num) => {
+ return !isNaN(Number(num))
+}
+
+/**
+ * 是否为 boolean 类型
+ * @param {any} bool 需要判断的值
+ * @return {Boolean} 是否为 boolean
+ */
+export const isBoolean = (bool) => {
+ return (typeof bool === 'boolean')
+}
+/**
+ * 是否有必填字段
+ * @param {Object} rules 规则
+ * @return {Boolean} 是否有必填字段
+ */
+export const isRequiredField = (rules) => {
+ let isNoField = false;
+ for (let i = 0; i < rules.length; i++) {
+ const ruleData = rules[i];
+ if (ruleData.required) {
+ isNoField = true;
+ break;
+ }
+ }
+ return isNoField;
+}
+
+
+/**
+ * 获取数据类型
+ * @param {Any} obj 需要获取数据类型的值
+ */
+export const type = (obj) => {
+ var class2type = {};
+
+ // 生成class2type映射
+ "Boolean Number String Function Array Date RegExp Object Error".split(" ").map(function(item, index) {
+ class2type["[object " + item + "]"] = item.toLowerCase();
+ })
+ if (obj == null) {
+ return obj + "";
+ }
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[Object.prototype.toString.call(obj)] || "object" :
+ typeof obj;
+}
+
+/**
+ * 判断两个值是否相等
+ * @param {any} a 值
+ * @param {any} b 值
+ * @return {Boolean} 是否相等
+ */
+export const isEqual = (a, b) => {
+ //如果a和b本来就全等
+ if (a === b) {
+ //判断是否为0和-0
+ return a !== 0 || 1 / a === 1 / b;
+ }
+ //判断是否为null和undefined
+ if (a == null || b == null) {
+ return a === b;
+ }
+ //接下来判断a和b的数据类型
+ var classNameA = toString.call(a),
+ classNameB = toString.call(b);
+ //如果数据类型不相等,则返回false
+ if (classNameA !== classNameB) {
+ return false;
+ }
+ //如果数据类型相等,再根据不同数据类型分别判断
+ switch (classNameA) {
+ case '[object RegExp]':
+ case '[object String]':
+ //进行字符串转换比较
+ return '' + a === '' + b;
+ case '[object Number]':
+ //进行数字转换比较,判断是否为NaN
+ if (+a !== +a) {
+ return +b !== +b;
+ }
+ //判断是否为0或-0
+ return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+ case '[object Date]':
+ case '[object Boolean]':
+ return +a === +b;
+ }
+ //如果是对象类型
+ if (classNameA == '[object Object]') {
+ //获取a和b的属性长度
+ var propsA = Object.getOwnPropertyNames(a),
+ propsB = Object.getOwnPropertyNames(b);
+ if (propsA.length != propsB.length) {
+ return false;
+ }
+ for (var i = 0; i < propsA.length; i++) {
+ var propName = propsA[i];
+ //如果对应属性对应值不相等,则返回false
+ if (a[propName] !== b[propName]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ //如果是数组类型
+ if (classNameA == '[object Array]') {
+ if (a.toString() == b.toString()) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/uni_modules/uni-forms/components/uni-forms/validate.js b/uni_modules/uni-forms/components/uni-forms/validate.js
new file mode 100644
index 0000000..1834c6c
--- /dev/null
+++ b/uni_modules/uni-forms/components/uni-forms/validate.js
@@ -0,0 +1,486 @@
+var pattern = {
+ email: /^\S+?@\S+?\.\S+?$/,
+ idcard: /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/,
+ url: new RegExp(
+ "^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$",
+ 'i')
+};
+
+const FORMAT_MAPPING = {
+ "int": 'integer',
+ "bool": 'boolean',
+ "double": 'number',
+ "long": 'number',
+ "password": 'string'
+ // "fileurls": 'array'
+}
+
+function formatMessage(args, resources = '') {
+ var defaultMessage = ['label']
+ defaultMessage.forEach((item) => {
+ if (args[item] === undefined) {
+ args[item] = ''
+ }
+ })
+
+ let str = resources
+ for (let key in args) {
+ let reg = new RegExp('{' + key + '}')
+ str = str.replace(reg, args[key])
+ }
+ return str
+}
+
+function isEmptyValue(value, type) {
+ if (value === undefined || value === null) {
+ return true;
+ }
+
+ if (typeof value === 'string' && !value) {
+ return true;
+ }
+
+ if (Array.isArray(value) && !value.length) {
+ return true;
+ }
+
+ if (type === 'object' && !Object.keys(value).length) {
+ return true;
+ }
+
+ return false;
+}
+
+const types = {
+ integer(value) {
+ return types.number(value) && parseInt(value, 10) === value;
+ },
+ string(value) {
+ return typeof value === 'string';
+ },
+ number(value) {
+ if (isNaN(value)) {
+ return false;
+ }
+ return typeof value === 'number';
+ },
+ "boolean": function(value) {
+ return typeof value === 'boolean';
+ },
+ "float": function(value) {
+ return types.number(value) && !types.integer(value);
+ },
+ array(value) {
+ return Array.isArray(value);
+ },
+ object(value) {
+ return typeof value === 'object' && !types.array(value);
+ },
+ date(value) {
+ return value instanceof Date;
+ },
+ timestamp(value) {
+ if (!this.integer(value) || Math.abs(value).toString().length > 16) {
+ return false
+ }
+ return true;
+ },
+ file(value) {
+ return typeof value.url === 'string';
+ },
+ email(value) {
+ return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255;
+ },
+ url(value) {
+ return typeof value === 'string' && !!value.match(pattern.url);
+ },
+ pattern(reg, value) {
+ try {
+ return new RegExp(reg).test(value);
+ } catch (e) {
+ return false;
+ }
+ },
+ method(value) {
+ return typeof value === 'function';
+ },
+ idcard(value) {
+ return typeof value === 'string' && !!value.match(pattern.idcard);
+ },
+ 'url-https'(value) {
+ return this.url(value) && value.startsWith('https://');
+ },
+ 'url-scheme'(value) {
+ return value.startsWith('://');
+ },
+ 'url-web'(value) {
+ return false;
+ }
+}
+
+class RuleValidator {
+
+ constructor(message) {
+ this._message = message
+ }
+
+ async validateRule(fieldKey, fieldValue, value, data, allData) {
+ var result = null
+
+ let rules = fieldValue.rules
+
+ let hasRequired = rules.findIndex((item) => {
+ return item.required
+ })
+ if (hasRequired < 0) {
+ if (value === null || value === undefined) {
+ return result
+ }
+ if (typeof value === 'string' && !value.length) {
+ return result
+ }
+ }
+
+ var message = this._message
+
+ if (rules === undefined) {
+ return message['default']
+ }
+
+ for (var i = 0; i < rules.length; i++) {
+ let rule = rules[i]
+ let vt = this._getValidateType(rule)
+
+ Object.assign(rule, {
+ label: fieldValue.label || `["${fieldKey}"]`
+ })
+
+ if (RuleValidatorHelper[vt]) {
+ result = RuleValidatorHelper[vt](rule, value, message)
+ if (result != null) {
+ break
+ }
+ }
+
+ if (rule.validateExpr) {
+ let now = Date.now()
+ let resultExpr = rule.validateExpr(value, allData, now)
+ if (resultExpr === false) {
+ result = this._getMessage(rule, rule.errorMessage || this._message['default'])
+ break
+ }
+ }
+
+ if (rule.validateFunction) {
+ result = await this.validateFunction(rule, value, data, allData, vt)
+ if (result !== null) {
+ break
+ }
+ }
+ }
+
+ if (result !== null) {
+ result = message.TAG + result
+ }
+
+ return result
+ }
+
+ async validateFunction(rule, value, data, allData, vt) {
+ let result = null
+ try {
+ let callbackMessage = null
+ const res = await rule.validateFunction(rule, value, allData || data, (message) => {
+ callbackMessage = message
+ })
+ if (callbackMessage || (typeof res === 'string' && res) || res === false) {
+ result = this._getMessage(rule, callbackMessage || res, vt)
+ }
+ } catch (e) {
+ result = this._getMessage(rule, e.message, vt)
+ }
+ return result
+ }
+
+ _getMessage(rule, message, vt) {
+ return formatMessage(rule, message || rule.errorMessage || this._message[vt] || message['default'])
+ }
+
+ _getValidateType(rule) {
+ var result = ''
+ if (rule.required) {
+ result = 'required'
+ } else if (rule.format) {
+ result = 'format'
+ } else if (rule.arrayType) {
+ result = 'arrayTypeFormat'
+ } else if (rule.range) {
+ result = 'range'
+ } else if (rule.maximum !== undefined || rule.minimum !== undefined) {
+ result = 'rangeNumber'
+ } else if (rule.maxLength !== undefined || rule.minLength !== undefined) {
+ result = 'rangeLength'
+ } else if (rule.pattern) {
+ result = 'pattern'
+ } else if (rule.validateFunction) {
+ result = 'validateFunction'
+ }
+ return result
+ }
+}
+
+const RuleValidatorHelper = {
+ required(rule, value, message) {
+ if (rule.required && isEmptyValue(value, rule.format || typeof value)) {
+ return formatMessage(rule, rule.errorMessage || message.required);
+ }
+
+ return null
+ },
+
+ range(rule, value, message) {
+ const {
+ range,
+ errorMessage
+ } = rule;
+
+ let list = new Array(range.length);
+ for (let i = 0; i < range.length; i++) {
+ const item = range[i];
+ if (types.object(item) && item.value !== undefined) {
+ list[i] = item.value;
+ } else {
+ list[i] = item;
+ }
+ }
+
+ let result = false
+ if (Array.isArray(value)) {
+ result = (new Set(value.concat(list)).size === list.length);
+ } else {
+ if (list.indexOf(value) > -1) {
+ result = true;
+ }
+ }
+
+ if (!result) {
+ return formatMessage(rule, errorMessage || message['enum']);
+ }
+
+ return null
+ },
+
+ rangeNumber(rule, value, message) {
+ if (!types.number(value)) {
+ return formatMessage(rule, rule.errorMessage || message.pattern.mismatch);
+ }
+
+ let {
+ minimum,
+ maximum,
+ exclusiveMinimum,
+ exclusiveMaximum
+ } = rule;
+ let min = exclusiveMinimum ? value <= minimum : value < minimum;
+ let max = exclusiveMaximum ? value >= maximum : value > maximum;
+
+ if (minimum !== undefined && min) {
+ return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMinimum ?
+ 'exclusiveMinimum' : 'minimum'
+ ])
+ } else if (maximum !== undefined && max) {
+ return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMaximum ?
+ 'exclusiveMaximum' : 'maximum'
+ ])
+ } else if (minimum !== undefined && maximum !== undefined && (min || max)) {
+ return formatMessage(rule, rule.errorMessage || message['number'].range)
+ }
+
+ return null
+ },
+
+ rangeLength(rule, value, message) {
+ if (!types.string(value) && !types.array(value)) {
+ return formatMessage(rule, rule.errorMessage || message.pattern.mismatch);
+ }
+
+ let min = rule.minLength;
+ let max = rule.maxLength;
+ let val = value.length;
+
+ if (min !== undefined && val < min) {
+ return formatMessage(rule, rule.errorMessage || message['length'].minLength)
+ } else if (max !== undefined && val > max) {
+ return formatMessage(rule, rule.errorMessage || message['length'].maxLength)
+ } else if (min !== undefined && max !== undefined && (val < min || val > max)) {
+ return formatMessage(rule, rule.errorMessage || message['length'].range)
+ }
+
+ return null
+ },
+
+ pattern(rule, value, message) {
+ if (!types['pattern'](rule.pattern, value)) {
+ return formatMessage(rule, rule.errorMessage || message.pattern.mismatch);
+ }
+
+ return null
+ },
+
+ format(rule, value, message) {
+ var customTypes = Object.keys(types);
+ var format = FORMAT_MAPPING[rule.format] ? FORMAT_MAPPING[rule.format] : (rule.format || rule.arrayType);
+
+ if (customTypes.indexOf(format) > -1) {
+ if (!types[format](value)) {
+ return formatMessage(rule, rule.errorMessage || message.typeError);
+ }
+ }
+
+ return null
+ },
+
+ arrayTypeFormat(rule, value, message) {
+ if (!Array.isArray(value)) {
+ return formatMessage(rule, rule.errorMessage || message.typeError);
+ }
+
+ for (let i = 0; i < value.length; i++) {
+ const element = value[i];
+ let formatResult = this.format(rule, element, message)
+ if (formatResult !== null) {
+ return formatResult
+ }
+ }
+
+ return null
+ }
+}
+
+class SchemaValidator extends RuleValidator {
+
+ constructor(schema, options) {
+ super(SchemaValidator.message);
+
+ this._schema = schema
+ this._options = options || null
+ }
+
+ updateSchema(schema) {
+ this._schema = schema
+ }
+
+ async validate(data, allData) {
+ let result = this._checkFieldInSchema(data)
+ if (!result) {
+ result = await this.invokeValidate(data, false, allData)
+ }
+ return result.length ? result[0] : null
+ }
+
+ async validateAll(data, allData) {
+ let result = this._checkFieldInSchema(data)
+ if (!result) {
+ result = await this.invokeValidate(data, true, allData)
+ }
+ return result
+ }
+
+ async validateUpdate(data, allData) {
+ let result = this._checkFieldInSchema(data)
+ if (!result) {
+ result = await this.invokeValidateUpdate(data, false, allData)
+ }
+ return result.length ? result[0] : null
+ }
+
+ async invokeValidate(data, all, allData) {
+ let result = []
+ let schema = this._schema
+ for (let key in schema) {
+ let value = schema[key]
+ let errorMessage = await this.validateRule(key, value, data[key], data, allData)
+ if (errorMessage != null) {
+ result.push({
+ key,
+ errorMessage
+ })
+ if (!all) break
+ }
+ }
+ return result
+ }
+
+ async invokeValidateUpdate(data, all, allData) {
+ let result = []
+ for (let key in data) {
+ let errorMessage = await this.validateRule(key, this._schema[key], data[key], data, allData)
+ if (errorMessage != null) {
+ result.push({
+ key,
+ errorMessage
+ })
+ if (!all) break
+ }
+ }
+ return result
+ }
+
+ _checkFieldInSchema(data) {
+ var keys = Object.keys(data)
+ var keys2 = Object.keys(this._schema)
+ if (new Set(keys.concat(keys2)).size === keys2.length) {
+ return ''
+ }
+
+ var noExistFields = keys.filter((key) => {
+ return keys2.indexOf(key) < 0;
+ })
+ var errorMessage = formatMessage({
+ field: JSON.stringify(noExistFields)
+ }, SchemaValidator.message.TAG + SchemaValidator.message['defaultInvalid'])
+ return [{
+ key: 'invalid',
+ errorMessage
+ }]
+ }
+}
+
+function Message() {
+ return {
+ TAG: "",
+ default: '验证错误',
+ defaultInvalid: '提交的字段{field}在数据库中并不存在',
+ validateFunction: '验证无效',
+ required: '{label}必填',
+ 'enum': '{label}超出范围',
+ timestamp: '{label}格式无效',
+ whitespace: '{label}不能为空',
+ typeError: '{label}类型无效',
+ date: {
+ format: '{label}日期{value}格式无效',
+ parse: '{label}日期无法解析,{value}无效',
+ invalid: '{label}日期{value}无效'
+ },
+ length: {
+ minLength: '{label}长度不能少于{minLength}',
+ maxLength: '{label}长度不能超过{maxLength}',
+ range: '{label}必须介于{minLength}和{maxLength}之间'
+ },
+ number: {
+ minimum: '{label}不能小于{minimum}',
+ maximum: '{label}不能大于{maximum}',
+ exclusiveMinimum: '{label}不能小于等于{minimum}',
+ exclusiveMaximum: '{label}不能大于等于{maximum}',
+ range: '{label}必须介于{minimum}and{maximum}之间'
+ },
+ pattern: {
+ mismatch: '{label}格式不匹配'
+ }
+ };
+}
+
+
+SchemaValidator.message = new Message();
+
+export default SchemaValidator
diff --git a/uni_modules/uni-forms/package.json b/uni_modules/uni-forms/package.json
new file mode 100644
index 0000000..e3736c4
--- /dev/null
+++ b/uni_modules/uni-forms/package.json
@@ -0,0 +1,88 @@
+{
+ "id": "uni-forms",
+ "displayName": "uni-forms 表单",
+ "version": "1.4.8",
+ "description": "由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据",
+ "keywords": [
+ "uni-ui",
+ "表单",
+ "校验",
+ "表单校验",
+ "表单验证"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-icons"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-forms/readme.md b/uni_modules/uni-forms/readme.md
new file mode 100644
index 0000000..63d5a04
--- /dev/null
+++ b/uni_modules/uni-forms/readme.md
@@ -0,0 +1,23 @@
+
+
+## Forms 表单
+
+> **组件名:uni-forms**
+> 代码块: `uForms`、`uni-forms-item`
+> 关联组件:`uni-forms-item`、`uni-easyinput`、`uni-data-checkbox`、`uni-group`。
+
+
+uni-app的内置组件已经有了 `