d1448cb0ef10f358bb7bddb4e1ec268515e0b787..92230c9a97dc9ce9df3313d11d26999c04bb6b26
3 天以前 gaoluyang
项目初始化
dev
92230c 对比 | 目录
3 天以前 gaoluyang
项目初始化
a45d6b 对比 | 目录
已重命名16个文件
已删除436个文件
已修改6个文件
已添加575个文件
153687 ■■■■■ 文件已修改
.gitignore 91 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vscode/launch.json 288 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
App.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LICENSE 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md 346 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/captcha.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/center/log.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/login.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/user.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/work/notice.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/work/userManage.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
components/button/FloatButton.vue 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
components/gap/Gap.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
components/navbar/Navbar.vue 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
components/navbar/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
components/qian-tree/qian-tree.vue 425 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
components/qian-tree/style.css 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
components/tabs/Tabs.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/environment.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/http.interceptor.js 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/request.js 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/image/index.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/image/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/image/mallMenu.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/image/template1.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/image/template2.png 补丁 | 查看 | 原始文档 | blame | 历史
index.html 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manifest.json 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json 13028 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 114 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages.json 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/center/index.vue 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/center/log.vue 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/center/password.vue 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/center/profile.vue 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/index/index.vue 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/login/index.scss 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/login/index.vue 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/work/index.vue 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/work/notice/detail.vue 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/work/notice/edit.vue 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/work/notice/list.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/work/notice/manage.vue 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/work/notice/record.vue 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/work/user/edit.vue 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/work/user/list.vue 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pnpm-lock.yaml 9075 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/login.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/oauth.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/system/dict/data.js 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/system/dict/type.js 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/system/user.js 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/geek-xd/components/geek-certificate/geek-certificate.vue 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/geek-xd/components/geek-color-picker/geek-color-picker.vue 747 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/geek-xd/components/geek-commodity/geek-commodity.vue 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/geek-xd/components/geek-menu/geek-menu.vue 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/geek-xd/components/geek-order/geek-order.vue 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/geek-xd/components/geek-qrcode/README.md 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/geek-xd/components/geek-qrcode/geek-qrcode.vue 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/geek-xd/components/geek-qrcode/qrcode.js 1206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/geek-xd/components/geek-statistic/geek-statistic.vue 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/geek-xd/types/index.ts 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/changelog.md 320 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue 1614 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/components/qiun-error/qiun-error.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/components/qiun-loading/loading1.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/components/qiun-loading/loading2.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/components/qiun-loading/loading3.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/components/qiun-loading/loading4.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/components/qiun-loading/loading5.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/components/qiun-loading/qiun-loading.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/js_sdk/u-charts/config-echarts.js 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/js_sdk/u-charts/config-ucharts.js 606 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/js_sdk/u-charts/readme.md 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/js_sdk/u-charts/u-charts.js 7706 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/js_sdk/u-charts/u-charts.min.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/license.md 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/package.json 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/readme.md 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/static/app-plus/echarts.min.js 补丁 | 查看 | 原始文档 | blame | 历史
src/components/qiun-data-charts/static/h5/echarts.min.js 补丁 | 查看 | 原始文档 | blame | 历史
src/components/ruoyi/DictTag/index.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/u-city-select/area.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/u-city-select/city.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/u-city-select/province.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/u-city-select/u-city-select.vue 265 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/uni-section/uni-section.vue 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/config.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/directive/common/copyText.ts 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/directive/common/focus.ts 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/directive/common/full.ts 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/directive/index.ts 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/directive/permission/hasPermi.ts 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/directive/permission/hasRole.ts 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/env.d.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/manifest.json 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages.json 280 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/common/textview/index.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/common/webview/index.vue 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/index.vue 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/login.vue 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mine.vue 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/template.config.js 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/template.vue 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/work.vue 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_geek/pages/code/index.vue 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_geek/pages/index/index.vue 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_mine/pages/about/index.vue 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_mine/pages/avatar/index.vue 642 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_mine/pages/help/index.vue 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_mine/pages/info/edit.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_mine/pages/info/index.vue 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_mine/pages/pwd/index.vue 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_mine/pages/setting/index.vue 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/card-swiper/card-swiper.vue 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/data-center/user-healthy.vue 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/data-center/user-operate.vue 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/data-center/user-server.vue 385 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/data-center/wechat.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/data-progress/data-progress.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/data-table/senior-table.vue 1117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/drop-down/drop-down.vue 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/progress-bar/progress-bar.vue 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/ranking-list/ranking-list.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/text-block/text-block.vue 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/uni-calendar/calendar.js 600 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/uni-calendar/uni-calendar-item.vue 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/uni-calendar/uni-calendar.vue 512 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/uni-calendar/util.js 357 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/components/wuc-tab/wuc-tab.vue 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/pages/finance/index.vue 585 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/pages/main/index.vue 348 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/pages/school/index.vue 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/pages/sport/index.vue 762 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/js/common.js 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/js/config.js 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/finance/1.json 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/finance/2.json 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/school/1.json 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/school/2.json 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/school/3.json 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/school/4.json 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/sport/1.json 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/sport/2.json 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/sport/3.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/sport/4.json 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-healthy/1.json 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-healthy/2.json 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-healthy/3.json 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-healthy/4.json 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-healthy/5.json 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-healthy/6.json 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-healthy/7.json 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-operate/1.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-operate/2.json 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-operate/3.json 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-operate/4.json 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-operate/6.json 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-operate/7.json 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-operate/8.json 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-operate/9.json 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-server/1.json 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-server/2.json 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-server/3.json 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-server/4.json 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/user-server/5.json 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/wechat/1.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/wechat/2.json 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/wechat/3.json 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/wechat/4.json 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/wechat/5.json 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/json/wechat/6.json 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/table/characterToPinyin.js 901 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/table/iconfont.wxss 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/table/loader.wxss 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_qiun/static/table/objEqual.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/common/api.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/common/classify.data.js 1087 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/common/config.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/common/demo.scss 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/common/locales/en.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/common/locales/zh.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/common/mixin.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/common/props.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/address/addSite.vue 444 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/address/index.ts 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/address/index.vue 262 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/citySelect/index.vue 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/comment/index.vue 265 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/comment/reply.vue 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/coupon/index.vue 413 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/keyboardPay/index.vue 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/login/code.vue 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/login/index1.vue 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/login/index2.vue 662 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/mallMenu/index1.vue 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/mallMenu/index2.vue 313 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/order/OrderItem.vue 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/order/index.vue 250 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/submitBar/index.vue 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_template/pages/wxCenter/index.vue 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/plugins/auth.ts 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/plugins/bus.ts 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/plugins/index.ts 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/plugins/modal.ts 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/plugins/mqttclient.ts 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/plugins/socketclient.ts 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/plugins/tab.ts 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/shime-uni.d.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/static/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
src/static/font/iconfont.css 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/static/font/iconfont.ttf 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/banner/banner01.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/banner/banner02.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/banner/banner03.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/icon/dialogue.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/icon/knowledge.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/icon/message.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/icon/phone.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/icon/rocket.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/profile.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/tabbar/home.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/tabbar/home_.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/tabbar/mine.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/tabbar/mine_.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/tabbar/work.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/images/tabbar/work_.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/index.html 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/static/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/scss/colorui.css 3912 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/static/scss/global.scss 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/static/scss/index.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/common/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/common/gray-logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/common/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/actionSheet.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/address.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/album.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/alert.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/avatar.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/backTop.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/badge.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/button.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/calendar.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/cell.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/checkbox.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/citySelect.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/code.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/collapse.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/color.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/comment.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/countDown.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/countTo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/coupon.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/datetimePicker.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/divider.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/empty.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/field.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/form.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/gap.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/grid.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/icon.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/image.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/indexList (1).png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/indexList.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/keyboard.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/keyboardPay.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/layout.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/line.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/link.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/list.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/loading-page.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/loading.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/loadmore.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/login.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/mall_menu_1.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/mall_menu_2.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/mask.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/messageInput.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/modal.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/navbar.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/noNetwork.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/noticeBar.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/notify.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/numberBox.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/order.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/parse.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/picker.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/popup.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/progress.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/radio.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/rate.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/readMore.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/scrollList.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/search.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/skeleton.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/slider.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/steps.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/sticky.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/submitBar.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/subsection.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/swipeAction.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/swiper.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/switch.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/tabbar.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/tabs.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/tag.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/text.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/textarea.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/toast.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/tooltip.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/transition.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/upload.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/demo/wxCenter.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/example/component.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/example/component_select.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/example/js.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/example/js_bak.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/example/js_select.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/example/template.png 补丁 | 查看 | 原始文档 | blame | 历史
src/static/uview/example/template_select.png 补丁 | 查看 | 原始文档 | blame | 历史
src/store/index.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/dict.ts 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.ts 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/types/request.ts 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni.scss 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-badge/changelog.md 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-badge/components/uni-badge/uni-badge.vue 268 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-badge/package.json 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-badge/readme.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-breadcrumb/changelog.md 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-breadcrumb/package.json 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-breadcrumb/readme.md 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-calendar/changelog.md 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-calendar/components/uni-calendar/calendar.js 546 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue 562 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-calendar/components/uni-calendar/util.js 350 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-calendar/package.json 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-calendar/readme.md 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-card/changelog.md 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-card/components/uni-card/uni-card.vue 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-card/package.json 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-card/readme.md 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-collapse/changelog.md 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue 402 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-collapse/package.json 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-collapse/readme.md 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-combox/changelog.md 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-combox/components/uni-combox/uni-combox.vue 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-combox/package.json 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-combox/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-countdown/changelog.md 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-countdown/components/uni-countdown/i18n/en.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-countdown/components/uni-countdown/i18n/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue 271 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-countdown/package.json 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-countdown/readme.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-checkbox/changelog.md 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue 821 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-checkbox/package.json 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-checkbox/readme.md 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-picker/changelog.md 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue 547 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js 622 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue 321 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-picker/package.json 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-picker/readme.md 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-select/changelog.md 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue 440 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-select/package.json 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-data-select/readme.md 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-dateformat/changelog.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-dateformat/package.json 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-dateformat/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/changelog.md 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue 924 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue 946 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue 1015 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js 410 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-datetime-picker/readme.md 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-drawer/changelog.md 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-drawer/components/uni-drawer/keypress.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-drawer/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-drawer/readme.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-easyinput/changelog.md 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-easyinput/components/uni-easyinput/common.js 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue 679 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-easyinput/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-easyinput/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fab/changelog.md 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fab/components/uni-fab/uni-fab.vue 490 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fab/package.json 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fab/readme.md 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fav/changelog.md 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fav/components/uni-fav/i18n/en.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fav/components/uni-fav/i18n/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fav/components/uni-fav/uni-fav.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fav/package.json 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-fav/readme.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-file-picker/changelog.md 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue 656 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue 325 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue 292 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-file-picker/components/uni-file-picker/utils.js 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-file-picker/package.json 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-file-picker/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-forms/changelog.md 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue 631 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-forms/components/uni-forms/uni-forms.vue 397 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-forms/components/uni-forms/utils.js 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-forms/components/uni-forms/validate.js 486 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-forms/package.json 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-forms/readme.md 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-goods-nav/changelog.md 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-goods-nav/package.json 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-goods-nav/readme.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-grid/changelog.md 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-grid/components/uni-grid/uni-grid.vue 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-grid/package.json 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-grid/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-group/changelog.md 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-group/components/uni-group/uni-group.vue 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-group/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-group/readme.md 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-icons/changelog.md 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-icons/components/uni-icons/icons.js 1169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-icons/components/uni-icons/uni-icons.vue 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-icons/components/uni-icons/uniicons.css 663 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-icons/components/uni-icons/uniicons.ttf 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-icons/package.json 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-icons/readme.md 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-indexed-list/changelog.md 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue 367 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-indexed-list/package.json 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-indexed-list/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-link/changelog.md 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-link/components/uni-link/uni-link.vue 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-link/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-link/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-list/changelog.md 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue 538 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue 454 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-list/components/uni-list/uni-list.vue 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-list/components/uni-list/uni-refresh.vue 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-list/components/uni-list/uni-refresh.wxs 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-list/package.json 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-list/readme.md 346 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-load-more/changelog.md 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue 399 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-load-more/package.json 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-load-more/readme.md 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-nav-bar/changelog.md 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue 357 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-nav-bar/package.json 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-nav-bar/readme.md 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-notice-bar/changelog.md 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue 426 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-notice-bar/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-notice-bar/readme.md 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-number-box/changelog.md 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-number-box/package.json 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-number-box/readme.md 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-pagination/changelog.md 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-pagination/components/uni-pagination/i18n/en.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-pagination/components/uni-pagination/i18n/es.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-pagination/components/uni-pagination/i18n/index.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue 465 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-pagination/package.json 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-pagination/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/changelog.md 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/components/uni-popup/i18n/en.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/components/uni-popup/i18n/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/components/uni-popup/keypress.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/components/uni-popup/popup.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/components/uni-popup/uni-popup.vue 474 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-popup/readme.md 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-rate/changelog.md 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-rate/components/uni-rate/uni-rate.vue 361 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-rate/package.json 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-rate/readme.md 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-row/changelog.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-row/components/uni-col/uni-col.vue 317 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-row/components/uni-row/uni-row.vue 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-row/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-row/readme.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/changelog.md 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/index.scss 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/package.json 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/readme.md 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/styles/index.scss 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/styles/setting/_border.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/styles/setting/_color.scss 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/styles/setting/_radius.scss 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/styles/setting/_space.scss 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/styles/setting/_styles.scss 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/styles/setting/_text.scss 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/styles/setting/_variables.scss 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/styles/tools/functions.scss 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/theme.scss 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-scss/variables.scss 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-search-bar/changelog.md 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-search-bar/package.json 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-search-bar/readme.md 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-segmented-control/changelog.md 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-segmented-control/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-segmented-control/readme.md 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-steps/changelog.md 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-steps/components/uni-steps/uni-steps.vue 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-steps/package.json 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-steps/readme.md 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/changelog.md 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js 302 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue 347 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs 341 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swipe-action/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swiper-dot/changelog.md 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swiper-dot/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-swiper-dot/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/changelog.md 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/components/uni-table/uni-table.vue 455 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/components/uni-td/uni-td.vue 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/components/uni-th/filter-dropdown.vue 503 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/components/uni-th/uni-th.vue 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/components/uni-thead/uni-thead.vue 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/components/uni-tr/table-checkbox.vue 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/components/uni-tr/uni-tr.vue 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/i18n/en.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/i18n/es.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/i18n/fr.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/i18n/index.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/i18n/zh-Hans.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/i18n/zh-Hant.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/package.json 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-table/readme.md 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-tag/changelog.md 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-tag/components/uni-tag/uni-tag.vue 252 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-tag/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-tag/readme.md 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-title/changelog.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-title/components/uni-title/uni-title.vue 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-title/package.json 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-title/readme.md 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-tooltip/changelog.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-tooltip/package.json 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-tooltip/readme.md 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-transition/changelog.md 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-transition/components/uni-transition/createAnimation.js 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-transition/components/uni-transition/uni-transition.vue 277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-transition/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uni_modules/uni-transition/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/auth.ts 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/common.ts 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/constant.ts 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/dict.ts 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/errorCode.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/geek.ts 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/permission.ts 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.ts 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/ruoyi.js 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/storage.ts 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/upload.ts 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/img/avatar.png 补丁 | 查看 | 原始文档 | blame | 历史
static/img/b-1.png 补丁 | 查看 | 原始文档 | blame | 历史
static/img/b-2.png 补丁 | 查看 | 原始文档 | blame | 历史
static/img/tabbar/center.png 补丁 | 查看 | 原始文档 | blame | 历史
static/img/tabbar/center_art.png 补丁 | 查看 | 原始文档 | blame | 历史
static/preview/ali_pay.jpg 补丁 | 查看 | 原始文档 | blame | 历史
static/preview/index.jpg 补丁 | 查看 | 原始文档 | blame | 历史
static/preview/login.jpg 补丁 | 查看 | 原始文档 | blame | 历史
static/preview/logs.jpg 补丁 | 查看 | 原始文档 | blame | 历史
static/preview/my.jpg 补丁 | 查看 | 原始文档 | blame | 历史
static/preview/notice-e.jpg 补丁 | 查看 | 原始文档 | blame | 历史
static/preview/notice-m.jpg 补丁 | 查看 | 原始文档 | blame | 历史
static/preview/prefile.jpg 补丁 | 查看 | 原始文档 | blame | 历史
static/preview/pwd-reset.jpg 补丁 | 查看 | 原始文档 | blame | 历史
static/preview/wechat_pay.jpg 补丁 | 查看 | 原始文档 | blame | 历史
static/preview/work.jpg 补丁 | 查看 | 原始文档 | blame | 历史
static/style.scss 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
store/index.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
store/modules/system.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
store/modules/user.js 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
store/mutation-types.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
template.h5.html 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tsconfig.json 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni.scss 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/qiun-data-charts/changelog.md 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue 1607 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/qiun-data-charts/js_sdk/u-charts/config-ucharts.js 601 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js 7297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.min.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/qiun-data-charts/package.json 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/qiun-data-charts/readme.md 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/LICENSE 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/README.md 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/changelog.md 326 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u--form/u--form.vue 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u--image/u--image.vue 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u--input/u--input.vue 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u--text/u--text.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u--textarea/u--textarea.vue 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-action-sheet/props.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-action-sheet/u-action-sheet.vue 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-album/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-album/u-album.vue 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-alert/props.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-alert/u-alert.vue 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-avatar-group/props.js 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-avatar-group/u-avatar-group.vue 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-avatar/props.js 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-avatar/u-avatar.vue 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-back-top/props.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-back-top/u-back-top.vue 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-badge/props.js 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-badge/u-badge.vue 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-button/nvue.scss 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-button/props.js 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-button/u-button.vue 490 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-button/vue.scss 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-calendar/header.vue 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-calendar/month.vue 579 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-calendar/props.js 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-calendar/u-calendar.vue 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-calendar/util.js 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-car-keyboard/props.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-car-keyboard/u-car-keyboard.vue 311 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-cell-group/props.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-cell-group/u-cell-group.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-cell/props.js 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-cell/u-cell.vue 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-checkbox-group/props.js 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-checkbox-group/u-checkbox-group.vue 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-checkbox/props.js 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-checkbox/u-checkbox.vue 344 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-circle-progress/props.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-circle-progress/u-circle-progress.vue 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-code-input/props.js 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-code-input/u-code-input.vue 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-code/props.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-code/u-code.vue 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-col/props.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-col/u-col.vue 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-collapse-item/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-collapse-item/u-collapse-item.vue 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-collapse/props.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-collapse/u-collapse.vue 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-column-notice/props.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-column-notice/u-column-notice.vue 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-count-down/props.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-count-down/u-count-down.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-count-down/utils.js 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-count-to/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-count-to/u-count-to.vue 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-datetime-picker/props.js 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-datetime-picker/u-datetime-picker.vue 360 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-divider/props.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-divider/u-divider.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-dropdown-item/props.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-dropdown-item/u-dropdown-item.vue 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-dropdown/props.js 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-dropdown/u-dropdown.vue 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-empty/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-empty/u-empty.vue 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-form-item/props.js 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-form-item/u-form-item.vue 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-form/props.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-form/u-form.vue 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-gap/props.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-gap/u-gap.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-grid-item/props.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-grid-item/u-grid-item.vue 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-grid/props.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-grid/u-grid.vue 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-icon/icons.js 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-icon/props.js 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-icon/u-icon.vue 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-image/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-image/u-image.vue 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-index-anchor/props.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-index-anchor/u-index-anchor.vue 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-index-item/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-index-item/u-index-item.vue 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-index-list/props.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-index-list/u-index-list.vue 440 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-input/props.js 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-input/u-input.vue 353 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-keyboard/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-keyboard/u-keyboard.vue 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-line-progress/props.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-line-progress/u-line-progress.vue 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-line/props.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-line/u-line.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-link/props.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-link/u-link.vue 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-list-item/props.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-list-item/u-list-item.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-list/props.js 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-list/u-list.vue 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-loading-icon/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-loading-icon/u-loading-icon.vue 343 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-loading-page/props.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-loading-page/u-loading-page.vue 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-loadmore/props.js 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-loadmore/u-loadmore.vue 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-modal/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-modal/u-modal.vue 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-navbar/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-navbar/u-navbar.vue 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-no-network/props.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-no-network/u-no-network.vue 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-notice-bar/props.js 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.vue 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-notify/props.js 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-notify/u-notify.vue 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-number-box/props.js 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-number-box/u-number-box.vue 416 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-number-keyboard/props.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-number-keyboard/u-number-keyboard.vue 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-overlay/props.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-overlay/u-overlay.vue 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-parse/node/node.vue 499 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-parse/parser.js 1075 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-parse/props.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-parse/u-parse.vue 366 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-picker-column/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-picker-column/u-picker-column.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-picker/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-picker/u-picker.vue 284 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-popup/props.js 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-popup/u-popup.vue 304 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-radio-group/props.js 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-radio-group/u-radio-group.vue 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-radio/props.js 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-radio/u-radio.vue 337 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-rate/props.js 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-rate/u-rate.vue 304 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-read-more/props.js 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-read-more/u-read-more.vue 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-row-notice/props.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-row-notice/u-row-notice.vue 306 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-row/props.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-row/u-row.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-safe-bottom/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-safe-bottom/u-safe-bottom.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-scroll-list/nvue.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-scroll-list/other.js 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-scroll-list/props.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-scroll-list/scrollWxs.wxs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-scroll-list/u-scroll-list.vue 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-search/props.js 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-search/u-search.vue 303 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-skeleton/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-skeleton/u-skeleton.vue 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-slider/mpother.js 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-slider/mpwxs.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-slider/mpwxs.wxs 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-slider/nvue - 副本.js 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-slider/nvue.js 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-slider/props.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-slider/u-slider.vue 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-status-bar/props.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-status-bar/u-status-bar.vue 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-steps-item/props.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-steps-item/u-steps-item.vue 316 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-steps/props.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-steps/u-steps.vue 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-sticky/props.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-sticky/u-sticky.vue 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-subsection/props.js 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-subsection/u-subsection.vue 299 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swipe-action-item/index - backup.wxs 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swipe-action-item/index.wxs 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swipe-action-item/nvue - backup.js 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swipe-action-item/nvue.js 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swipe-action-item/props.js 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swipe-action-item/u-swipe-action-item.vue 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swipe-action-item/wxs.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swipe-action/props.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swipe-action/u-swipe-action.vue 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swiper-indicator/props.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swiper-indicator/u-swiper-indicator.vue 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swiper/props.js 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-swiper/u-swiper.vue 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-switch/props.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-switch/u-switch.vue 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tabbar-item/props.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tabbar-item/u-tabbar-item.vue 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tabbar/props.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tabbar/u-tabbar.vue 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-table/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-table/u-table.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tabs-item/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tabs-item/u-tabs-item.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tabs/props.js 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tabs/u-tabs.vue 354 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tag/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tag/u-tag.vue 358 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-td/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-td/u-td.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-text/props.js 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-text/u-text.vue 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-text/value.js 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-textarea/props.js 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-textarea/u-textarea.vue 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-toast/u-toast.vue 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-toolbar/props.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-toolbar/u-toolbar.vue 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tooltip/clipboard.min.js 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tooltip/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tooltip/u-tooltip.vue 365 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tr/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-tr/u-tr.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-transition/nvue.ani-map.js 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-transition/props.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-transition/transition.js 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-transition/u-transition.vue 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-transition/vue.ani-style.scss 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-upload/mixin.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-upload/props.js 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-upload/u-upload.vue 558 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/u-upload/utils.js 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/components/uview-ui/uview-ui.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/index.js 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/index.scss 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/color.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/config.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props.js 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/actionSheet.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/album.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/alert.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/avatar.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/avatarGroup.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/backtop.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/badge.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/button.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/calendar.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/carKeyboard.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/cell.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/cellGroup.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/checkbox.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/checkboxGroup.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/circleProgress.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/code.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/codeInput.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/col.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/collapse.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/collapseItem.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/columnNotice.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/countDown.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/countTo.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/datetimePicker.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/divider.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/empty.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/form.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/formItem.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/gap.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/grid.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/gridItem.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/icon.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/image.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/indexAnchor.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/indexList.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/input.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/keyboard.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/line.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/lineProgress.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/link.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/list.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/listItem.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/loadingIcon.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/loadingPage.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/loadmore.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/modal.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/navbar.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/noNetwork.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/noticeBar.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/notify.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/numberBox.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/numberKeyboard.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/overlay.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/parse.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/picker.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/popup.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/radio.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/radioGroup.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/rate.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/readMore.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/row.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/rowNotice.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/scrollList.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/search.js 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/section.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/skeleton.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/slider.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/statusBar.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/steps.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/stepsItem.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/sticky.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/subsection.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/swipeAction.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/swipeActionItem.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/swiper.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/swipterIndicator.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/switch.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/tabbar.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/tabbarItem.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/tabs.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/tag.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/text.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/textarea.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/toast.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/toolbar.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/tooltip.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/transition.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/props/upload.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/config/zIndex.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/css/color.scss 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/css/common.scss 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/css/components.scss 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/css/flex.scss 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/css/h5.scss 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/css/mixin.scss 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/css/mp.scss 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/css/nvue.scss 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/css/vue.scss 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/function/colorGradient.js 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/function/debounce.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/function/digit.js 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/function/index.js 705 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/function/platform.js 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/function/test.js 288 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/function/throttle.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/adapters/index.js 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/core/InterceptorManager.js 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/core/Request.js 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/core/buildFullPath.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/core/defaults.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/core/dispatchRequest.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/core/mergeConfig.js 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/core/settle.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/helpers/buildURL.js 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/helpers/combineURLs.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/helpers/isAbsoluteURL.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/index.d.ts 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/index.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/utils.js 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/luch-request/utils/clone.js 264 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/mixin/button.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/mixin/mixin.js 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/mixin/mpMixin.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/mixin/mpShare.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/mixin/openType.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/mixin/style.js 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/mixin/touch.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/util/async-validator.js 1343 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/util/calendar.js 546 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/util/dayjs.js 308 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/util/emitter.js 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/libs/util/route.js 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/package.json 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uview-ui/theme.scss 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/storage.js 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/verify.js 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vite.config.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yarn.lock 5080 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -1,51 +1,48 @@
######################################################################
# Build Tools
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
target/
!.mvn/wrapper/maven-wrapper.jar
######################################################################
# IDE
### hbuilder ###
unpackage
.hbuilderx
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### JRebel ###
rebel.xml
### NetBeans ###
nbproject/private/
build/*
nbbuild/
# å¿½ç•¥ç”Ÿæˆçš„æ–‡ä»¶
build/
dist/
nbdist/
.nb-gradle/
unpackage/
*.class
*.jar
*.war
*.ear
######################################################################
# Others
*.log
*.xml.versionsBackup
# å¿½ç•¥ç¼–辑器/IDE生成的文件和目录
.idea/
.hbuilderx
*.swp
*.swo
*~
!*/build/*.java
!*/build/*.html
!*/build/*.xml
# å¿½ç•¥ä¾èµ–管理工具生成的目录
node_modules/
bower_components/
vendor/
# å¿½ç•¥æ“ä½œç³»ç»Ÿæ–‡ä»¶
.DS_Store
Thumbs.db
# å¿½ç•¥æ—¥å¿—文件
*.log
# å¿½ç•¥æ•æ„Ÿæˆ–包含个人信息的文件(根据需要添加更多)
credentials.json
config.ini
secrets.txt
# å¿½ç•¥å…¶ä»–自定义的文件或目录
/custom_directory/
# æŽ’除特定扩展名的文件(根据需要添加更多)
*.bak
*.tmp
# æŽ’除特定文件名(根据需要添加更多)
debug.log
# ä¸æŽ’除下列扩展名的文件
!*.allowed_extension
# ä¸æŽ’除下列文件名
!important_file.txt
.vscode/launch.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,288 @@
{
  // ä½¿ç”¨ IntelliSense äº†è§£ç›¸å…³å±žæ€§ã€‚
  // æ‚¬åœä»¥æŸ¥çœ‹çŽ°æœ‰å±žæ€§çš„æè¿°ã€‚
  // æ¬²äº†è§£æ›´å¤šä¿¡æ¯ï¼Œè¯·è®¿é—®: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Edge",
      "request": "launch",
      "type": "msedge",
      "url": "http://localhost:80",
      "webRoot": "${workspaceFolder}",
    },
    {
      "name": "dev:h5",
      "request": "launch",
      "runtimeArgs": ["run", "dev:h5"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:app",
      "request": "launch",
      "runtimeArgs": ["run", "dev:app"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:app-android",
      "request": "launch",
      "runtimeArgs": ["run", "dev:app-android"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:app-ios",
      "request": "launch",
      "runtimeArgs": ["run", "dev:app-ios"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:custom",
      "request": "launch",
      "runtimeArgs": ["run", "dev:custom"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:h5:ssr",
      "request": "launch",
      "runtimeArgs": ["run", "dev:h5:ssr"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:mp-alipay",
      "request": "launch",
      "runtimeArgs": ["run", "dev:mp-alipay"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:mp-baidu",
      "request": "launch",
      "runtimeArgs": ["run", "dev:mp-baidu"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:mp-jd",
      "request": "launch",
      "runtimeArgs": ["run", "dev:mp-jd"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:mp-kuaishou",
      "request": "launch",
      "runtimeArgs": ["run", "dev:mp-kuaishou"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:mp-lark",
      "request": "launch",
      "runtimeArgs": ["run", "dev:mp-lark"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:mp-qq",
      "request": "launch",
      "runtimeArgs": ["run", "dev:mp-qq"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:mp-toutiao",
      "request": "launch",
      "runtimeArgs": ["run", "dev:mp-toutiao"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:mp-weixin",
      "request": "launch",
      "runtimeArgs": ["run", "dev:mp-weixin"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:quickapp-webview",
      "request": "launch",
      "runtimeArgs": ["run", "dev:quickapp-webview"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:quickapp-webview-huawei",
      "request": "launch",
      "runtimeArgs": ["run", "dev:quickapp-webview-huawei"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "dev:quickapp-webview-union",
      "request": "launch",
      "runtimeArgs": ["run", "dev:quickapp-webview-union"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:app",
      "request": "launch",
      "runtimeArgs": ["run", "build:app"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:app-android",
      "request": "launch",
      "runtimeArgs": ["run", "build:app-android"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:app-ios",
      "request": "launch",
      "runtimeArgs": ["run", "build:app-ios"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:custom",
      "request": "launch",
      "runtimeArgs": ["run", "build:custom"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:h5",
      "request": "launch",
      "runtimeArgs": ["run", "build:h5"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:h5:ssr",
      "request": "launch",
      "runtimeArgs": ["run", "build:h5:ssr"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:mp-alipay",
      "request": "launch",
      "runtimeArgs": ["run", "build:mp-alipay"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:mp-baidu",
      "request": "launch",
      "runtimeArgs": ["run", "build:mp-baidu"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:mp-jd",
      "request": "launch",
      "runtimeArgs": ["run", "build:mp-jd"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:mp-kuaishou",
      "request": "launch",
      "runtimeArgs": ["run", "build:mp-kuaishou"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:mp-lark",
      "request": "launch",
      "runtimeArgs": ["run", "build:mp-lark"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:mp-qq",
      "request": "launch",
      "runtimeArgs": ["run", "build:mp-qq"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:mp-toutiao",
      "request": "launch",
      "runtimeArgs": ["run", "build:mp-toutiao"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:mp-weixin",
      "request": "launch",
      "runtimeArgs": ["run", "build:mp-weixin"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:quickapp-webview",
      "request": "launch",
      "runtimeArgs": ["run", "build:quickapp-webview"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:quickapp-webview-huawei",
      "request": "launch",
      "runtimeArgs": ["run", "build:quickapp-webview-huawei"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    },
    {
      "name": "build:quickapp-webview-union",
      "request": "launch",
      "runtimeArgs": ["run", "build:quickapp-webview-union"],
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    }
  ]
}
App.vue
ÎļþÒÑɾ³ý
LICENSE
@@ -1,201 +1,21 @@
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/
MIT License
   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Copyright (c) 2023 å“¦NO
   1. Definitions.
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:
      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.
      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.
      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.
      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.
      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.
      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).
      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.
      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."
      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.
   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.
   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.
   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:
      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and
      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and
      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and
      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.
      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.
   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.
   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.
   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.
   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.
   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.
   END OF TERMS AND CONDITIONS
   APPENDIX: How to apply the Apache License to your work.
      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.
   Copyright [yyyy] [name of copyright owner]
   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
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
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.
README.md
@@ -1,121 +1,269 @@
# ç§»åŠ¨ç«¯åŽå°ç®¡ç†ç³»ç»Ÿ RuoYi-Mobile
主页:<a href="http://fastbuild.run" target="_blank">http://fastbuild.run</a>
# RuoYi-App-Geek
[![gitee star](https://gitee.com/yinm/RuoYi-Mobile/badge/star.svg?theme=dark)]('https://gitee.com/yinm/RuoYi-Mobile/stargazers')
[![gitee fork](https://gitee.com/yinm/RuoYi-Mobile/badge/fork.svg?theme=dark)]('https://gitee.com/yinm/RuoYi-Mobile/members')
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
<p align="center">
    <span>
        <img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
    </span>
    <span>+</span>
    <span>
        <img alt="logo" src="./doc/image/logo.png">
    </span>
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi-Geek v3.8.7.3.2</h1>
<h4 align="center">基于SpringBoot3+Vue3前后端分离的Java快速开发框架</h4>
<p align="center">
    <img src="https://img.shields.io/github/license/mashape/apistatus.svg">
</p>
### :peach: é¡¹ç›®ç®€ä»‹
企事业单位信息化加速,移动端办工逐渐成为趋势,H5或小程序比起APP来说更简单方便。因此一款好的移动端基础平台十分有必要。<br>
项目采用当下流行的UniApp + uView2 æ¡†æž¶å¼€å‘,完成常见的日常工作功能与移动端特有功能组件。
<br><br>
# å¼•言
### :pear: åŽç«¯ä¸‹è½½
下载地址:<a href="http://fastbuild.run" target="_blank">传送门</a><br>
***注:目前移动端支持若依管理平台全系列(单应用、微服务、MySQL版、Oracle版、SqlServer版、Antd版等),需要适配其他版本的请到上面地址下载移动端源码。***
<br><br>
RuoYi-Vue ä¸Ž RuoYi-App æ˜¯åŸºäºŽ SpringBoot2+Vue2 æ‰“造的企业级开发框架,得到了广大开发者的喜爱和积极反馈。随着技术的迭代进步,SpringBoot3 ä¸Ž Vue3 é€æ¸è¿›å…¥å¼€å‘者的视野。为了满足开发者对于新技术的追求,RuoYi å®˜æ–¹æ–‡æ¡£æä¾›äº† SpringBoot2 è‡³ SpringBoot3 çš„升级方法。与此同时,社区也涌现出了 RuoYi-Vue3、RuoYi-App-Vue3 çš„版本,展现了开发者社区对于技术升级的热情与努力。
然而,在升级的过程中,官方的方法为了兼顾 Java1.8 çš„特性与一些老旧的方法,未完全拥抱**SpringBoot3 ä¸Ž Java17**的全部特性。而社区的 RuoYi-Vue3、RuoYi-App-Vue3 ç‰ˆæœ¬ç”±äºŽå‡ºè‡ªä¸åŒçš„团队之手,**兼容性及整合性**上存在些许**不足**。更为关键的是,尽管这些版本**支持 TypeScript**,但**缺乏与之相匹配的 tsconfig.json é…ç½®æ–‡ä»¶**,这使得在主流编辑器如 VSCode ä¸­ï¼ŒTypeScript çš„语法提示环境并未达到最佳状态。
鉴于此,**RuoYi-Geek ç”Ÿæ€**应运而生。它旨在为广大开发者提供一个既保留原版本核心特性,又整合社区版优点的全新解决方案。在**RuoYi-Geek**中,我们深入调研了企业开发中常用的 RuoYi æ‰©å±•,并直接在框架中集成,确保开发者能够快速上手,高效开发。同时,我们采用了最新的**SpringBoot3+Vue3**技术栈,彻底移除了为了兼容 Java1.8 è€Œä¿ç•™çš„老旧方法。更为重要的是,我们为 TypeScript å¼€å‘环境加入了常用的 tsconfig.json é…ç½®ï¼Œä½¿å¾—开发者在 VSCode ç­‰ç¼–辑器中能够获得更为舒适、便捷的语法提示体验。
**RuoYi-Geek**不仅仅是一个简单的升级版本,更是对于 RuoYi ç”Ÿæ€çš„一次全面优化与整合。我们相信,通过**RuoYi-Geek ç”Ÿæ€**,开发者将能够更为高效、愉悦地开发出优秀的企业级应用。
本项目为**RuoYi-Geek ç”Ÿæ€**的 RuoYi-App éƒ¨åˆ†ã€‚
**注意:**
本人的其他两个推荐搭配的项目
1. [Ruoyi-SpringBoot3-Geek: è¿™æ˜¯è‹¥ä¾æžå®¢ç”Ÿæ€çš„后端 Springboot3 ç‰ˆæœ¬ (gitee.com)](https://gitee.com/geek-xd/ruoyi-spring-boot3-geek)
2. [RuoYi-Vue3-Geek: è¿™æ˜¯è‹¥ä¾æžå®¢ç”Ÿæ€çš„ Vue3 ç‰ˆæœ¬ (gitee.com)](https://gitee.com/geek-xd/ruo-yi-vue3-geek)
**与 Ruoyi-App ç›¸æ¯”较**
1. ä½¿ç”¨ UniApp+Vue3 çš„æœ€æ–°æ¡†æž¶
2. æ”¯æŒ TS、SCSS、LESS ç­‰å¯¹ js å’Œ css çš„æ‰©å……语言
3. ä½¿ç”¨ Pinia ä»£æ›¿ Vuex,更加轻巧简单
4. ä½¿ç”¨ uView-Plus(好看的 ui) ä»£æ›¿ uView-ui çš„ ui ç»„件库
5. ä½¿ç”¨ uCharts(方便的图表)画图工具
6. å·²ç»å®Œæˆäº†åˆ†åŒ…操作
7. æä¾›äº†é¢œè‰²é€‰æ‹©å™¨ã€äºŒç»´ç ç­‰å¸¸ç”¨ç»„ä»¶
8. å°†åŽŸæœ‰å†…ç½®å·¥å…·è¿›è¡Œç±»åž‹æ ‡å®š
9. åˆ†åˆ«æä¾›äº† uview-plus å’Œ ucharts çš„æ¨¡æ¿ï¼ˆå¯ä»¥ç›´æŽ¥ä½¿ç”¨æˆ–者用于学习)
# å¿«é€Ÿå¼€å§‹
**注意:** node ç‰ˆæœ¬éœ€è¦ 16+
## è¿ç§»åˆ°Hbuilder(不依赖Hbuilder的项目不需要迁移)
1. src路径作为项目根路径
2. å°†index.html、package.json、vite.config.js、tsconfig.json、.gitignore粘贴到src目录下
3. åœ¨src目录下运行npm install
4. ä¿®æ”¹index.html中的./src/main.js为./main.js
5. åœ¨HBuilderX中运行时注意观察是否使用的是Vue3的编译器(若不是请自行查找方法解决,本人对HbuilderX使用不多)
###  :watermelon:  æŠ€æœ¯æ ˆ
| ç»„ä»¶       | ç‰ˆæœ¬     |
|----------|--------|
| uview-ui | 2.0.31 |
| qiun-data-charts | 2.4.3-20220505 |
## å®‰è£…
<br><br>
一下三种方式均可,感觉速度 pnpm > yarn > cnpm > npm
###   :tw-1f348:   ç³»ç»Ÿé…ç½®
1. åŽç«¯è¯·æ±‚地址配置:
**_Vue3/Vite ç‰ˆè¦æ±‚ node ç‰ˆæœ¬^14.18.0 || >=16.0.0_**
```
# é…ç½®æ–‡ä»¶è·¯å¾„:/config/environment.js
# ä¿®æ”¹baseURL属性
const environment = {
    // å¼€å‘环境配置
    development: {
        // æœ¬åœ°éƒ¨ç½²çš„后端
        baseURL: 'http://localhost:8080',
        // ç›´æŽ¥ä½¿ç”¨çº¿ä¸ŠåŽç«¯
        // baseURL: 'http://vue.ruoyi.vip/prod-api'
    },
    // ç”Ÿäº§çŽ¯å¢ƒé…ç½®
    production: {
        baseURL: 'http://vue.ruoyi.vip/prod-api' // å‘布时需要修改为后端实际地址
    }
}
module.exports = {
  environment: environment[process.env.NODE_ENV]
}
```
2. H5启动端口配置:
***注意:不要在manifest.json中配置h5启动信息,可能会引发后端接口访问异常***
```
# é…ç½®æ–‡ä»¶è·¯å¾„:/vue.config.js
# ä¿®æ”¹port属性
const { environment } = require('./config/environment.js')
module.exports = {
  devServer: {
    port: 9001,
    proxy: {
      '/': {
        target: environment.baseURL,
        ws: true,
        changeOrigin: true,
        pathRewrite: {
          '^/': ''
        }
      }
    },
  }
}
```shell
npm install
cnpm install
yarn
pnpm install
```
# å¯åЍ
1. å°†é¡¹ç›®ä¸‹è½½åˆ°æœ¬åœ°
2. åˆå§‹åŒ–项目---进入项目根路径运行指令初始化项目
   `npm install`
3. è¿è¡Œé¡¹ç›®---进入项目根路径运行指令(在 package.json èƒ½æ‰¾åˆ°æ‰€æœ‰æŒ‡ä»¤ï¼‰ï¼š
   ä»¥å¾®ä¿¡å°ç¨‹åºä¸ºä¾‹ï¼š`npm run dev:mp-weixin`
   ä»¥ H5 ä¸ºä¾‹ ` npm run dev:h5`
4. æŸ¥çœ‹é¡¹ç›® ä»¥å¾®ä¿¡å°ç¨‹åºä¸ºä¾‹ï¼š
   æ‰“开微信开发者工具,导入项目路径 dist\dev\mp-weixin
   ä»¥ H5 ä¸ºä¾‹ï¼šæ‰“开浏览器,输入控制台输出的地址
   æ³¨ï¼šå…¬ä¼—号属于 H5,以微信公众号为例,打开微信开发者工具,输入控制台输出的地址
5. æ‰“包项目---进入项目根路径运行指令(在 package.json èƒ½æ‰¾åˆ°æ‰€æœ‰æŒ‡ä»¤ï¼‰ï¼š
   ä»¥å¾®ä¿¡å°ç¨‹åºä¸ºä¾‹ï¼š`npm run build:mp-weixin`
   ä»¥ H5 ä¸ºä¾‹ï¼š `npm run build:h5`
### ä»£ç åŽ‹ç¼©
###    :lemon:   ç³»ç»Ÿæˆªå›¾
默认是启动代码压缩的,
如果需要关闭代码压缩,可以将 vite.config.js ä¸­çš„ build.minify èµ‹å€¼ä¸º false。
如果需要打开代码压缩,可以将 vite.config.js ä¸­çš„ build.minify èµ‹å€¼ä¸º true。
# å†…置组件(geek-xd)
1. é¢œè‰²é€‰æ‹©å™¨ç»„ä»¶
2. äºŒç»´ç ç»„ä»¶
3. åœ†å½¢èœå•组件
4. å¸¸ç”¨çš„订单组件
5. ä¿¡æ¯å±•示组件
# æ’件的使用
#### tab - é¡µé¢æ’ä»¶
可以通过设置参数中的 config.data æ¥å®žçŽ°é¡µé¢ä¼ å‚
| æ–¹æ³•         | ä½œç”¨                                             | å‚æ•°        |
| ------------ | ------------------------------------------------ | ----------- |
| getData      | å¯ä»¥æ‹¿åˆ°ä¸Šä¸ªé¡µé¢é€šè¿‡ tab ä¼ é€’的参数              | æ—           |
| reLaunch     | å…³é—­æ‰€æœ‰é¡µé¢ï¼Œæ‰“开到应用内的某个页面             | url、config |
| switchTab    | è·³è½¬åˆ° tabBar é¡µé¢ï¼Œå¹¶å…³é—­å…¶ä»–所有非 tabBar é¡µé¢ | url、config |
| redirectTo   | å…³é—­å½“前页面,跳转到应用内的某个页面             | url、config |
| navigateTo   | ä¿ç•™å½“前页面,跳转到应用内的某个页面             | url、config |
| navigateBack | å…³é—­å½“前页面,返回上一页面或多级页面             | config      |
#### auth - é‰´æƒæ’ä»¶
下面所有方法返回值都是布尔值,permission ä»£è¡¨æƒé™å­—符串,role ä»£è¡¨è§’色字符串,复数形式代表数组。
| æ–¹æ³•        | ä½œç”¨                                       | å‚æ•°        |
| ----------- | ------------------------------------------ | ----------- |
| hasPermi    | éªŒè¯ç”¨æˆ·æ˜¯å¦å…·å¤‡æŸæƒé™                     | permission  |
| hasPermiOr  | éªŒè¯ç”¨æˆ·æ˜¯å¦å«æœ‰æŒ‡å®šæƒé™ï¼Œåªéœ€åŒ…含其中一个 | permissions |
| hasPermiAnd | éªŒè¯ç”¨æˆ·æ˜¯å¦å«æœ‰æŒ‡å®šæƒé™ï¼Œå¿…须全部拥有     | permissions |
| hasRole     | éªŒè¯ç”¨æˆ·æ˜¯å¦å…·å¤‡æŸè§’色                     | role        |
| hasRoleOr   | éªŒè¯ç”¨æˆ·æ˜¯å¦å«æœ‰æŒ‡å®šè§’色,只需包含其中一个 | roles       |
| hasRoleAnd  | roles                                      | roles       |
#### modal - å¼¹çª—插件
content æ˜¯æ¶ˆæ¯å†…容,option æ˜¯è¯¦ç»†é…ç½®ã€‚
| æ–¹æ³•         | ä½œç”¨                           | å‚æ•°    |
| ------------ | ------------------------------ | ------- |
| msg          | æ¶ˆæ¯æç¤º                       | content |
| msgError     | é”™è¯¯æ¶ˆæ¯                       | content |
| msgSuccess   | æˆåŠŸæ¶ˆæ¯                       | content |
| hideMsg      | éšè—æ¶ˆæ¯                       | æ—       |
| alert        | å¼¹å‡ºæç¤º                       | content |
| confirm      | ç¡®è®¤çª—体                       | content |
| showToast    | æç¤ºä¿¡æ¯                       | option  |
| loading      | æ‰“开遮罩层,需要手动关闭遮罩层 | content |
| closeLoading | å…³é—­é®ç½©å±‚                     | æ—       |
#### bus - äº‹ä»¶æ’ä»¶
eventName æ˜¯äº‹ä»¶åç§°ï¼ŒeventFun æ˜¯äº‹ä»¶å¤„理函数,请尽量避免事件插件的使用,请在组件销毁是解绑素有该组件有关的事件,避免产生 bug。
| æ–¹æ³•  | ä½œç”¨         | å‚æ•°                |
| ----- | ------------ | ------------------- |
| $on   | ç»‘定一个事件 | eventName、eventFun |
| $off  | è§£ç»‘一个事件 | eventName           |
| $emit | è§¦å‘一个事件 | eventName、...args  |
#### socket
设置项 enableUUID,是否启用基于 uuid çš„æ¶ˆæ¯å¤„理机制,要求当发送的消息携带 uuid å­—段时,返回的消息也要携带 uuid å­—段。
设置项 enableEvent,是否启用基于事件的消息处理机制,要求当希望被事件处理函数处理的消息需要携带 event å­—段。
| æ–¹æ³•      | ä½œç”¨                                                                                                                    | å‚æ•°                                                                                                                                    |
| --------- | ----------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| connect   | è¿žæŽ¥ websocke,当连接成功后触发回调函数                                                                                 | æœ€ç®€å•的用法就是传入{url:"ws://demo"}                                                                                                   |
| send      | å‘送信息,当 uuid ä¸ä¸ºç©ºä¸”不为 false æ—¶ï¼Œå½“收到携带相同 uuid çš„æ¶ˆæ¯æ—¶è§¦å‘回调函数,只触发一次。否则由默认处理函数处理。 | msg æ¶ˆæ¯å†…容,会被处理成 json å­—符串 uuid å”¯ä¸€æ ‡è¯†ç¬¦ï¼Œå¯ä»¥æ‰‹åŠ¨ä¼ å…¥ï¼Œä¹Ÿå¯ä»¥è®¾ç½®ä¸º true å½“为 true æ—¶ä¼šè‡ªåŠ¨ç”Ÿæˆä¸€ä¸ª uuid å¹¶æ·»åŠ åˆ° msg ä¸­ã€‚ |
| close     | å…³é—­è¿žæŽ¥ï¼Œä¼šè§¦å‘回调函数的内容,不会触发默认关闭事件的处理函数,也不会修改默认关闭事件的处理函数。                      | æ—                                                                                                                                       |
| on        | ç›‘听事件,当收到携带 event çš„æ¶ˆæ¯æ—¶ä¼šè°ƒç”¨å›žè°ƒå‡½æ•°ã€‚                                                                     | event äº‹ä»¶çš„名称                                                                                                                        |
| off       | å–消监听事件                                                                                                            |                                                                                                                                         |
| onMessage | å®šä¹‰é»˜è®¤ç›‘听事件                                                                                                        | callback é»˜è®¤ç›‘听事件的处理函数                                                                                                         |
| onError   | å®šä¹‰å¼‚常事件                                                                                                            | callback é»˜è®¤å¼‚常事件的处理函数                                                                                                         |
| onClose   | å®šä¹‰å…³é—­äº‹ä»¶                                                                                                            | callback é»˜è®¤å…³é—­äº‹ä»¶çš„处理函数                                                                                                         |
# ä½œè€…建议
### å¯¹äºŽé€‰é¡¹å¼
```js
this.$tab; // å»ºè®®ä½¿ç”¨this.$tab进行页面跳转,理由:便于在跳转前处理其他事务
this.$auth; // å»ºè®®ä½¿ç”¨this.$auth进行鉴权操作
this.$modal; // å»ºè®®ä½¿ç”¨this.$modal打开弹窗,理由:便于以后想要使用自定义弹窗
```
### å¯¹äºŽç»„合式
```js
import tab from "@/plugins/tab"; // å»ºè®®ä½¿ç”¨tab进行页面跳转,理由:便于在跳转前处理其他事务
import auth from "@/plugins/auth"; // å»ºè®®ä½¿ç”¨auth进行鉴权操作
import modal from "@/plugins/modal"; // å»ºè®®ä½¿ç”¨modal打开弹窗,理由:便于以后想要使用自定义弹窗
// ä¹Ÿå¯ä»¥ä½¿ç”¨ä¸‹é¢çš„æ–¹å¼
import { tab, auth, modal } from "@/plugins";
```
### å¯¹äºŽ ucharts
建议即便暂时不使用图表也不要删除它,以后可能会用到。
# åŽ‹ç¼©å†…å­˜
(主包最低 809kb å·¦å³)
### åˆ é™¤ geek ç»„ä»¶
1. åˆ é™¤ pages_geek å’Œ components/geek-xd æ–‡ä»¶å¤¹
2. åˆ é™¤ pages.json ä¸­ subPackages çš„ root å€¼ä¸ºâ€œpages_geek/pages”的配置
3. åˆ é™¤ pages/template.config.js ä¸­ geek ç»„ä»¶
### åŽ»é™¤æ¨¡æ¿
(占用主包 582kb å·¦å³ï¼‰
1. åˆ é™¤ pages_template、pages_qiun ä¸¤ä¸ªæ–‡ä»¶å¤¹
2. åˆ é™¤ pages.json ä¸­ subPackages çš„ root å€¼ä¸ºâ€œpages_qiun/pages”、“pages_template/pages”的两个配置
3. åˆ é™¤ pages/template.config.js å’Œ pages/template.vue
4. åˆ é™¤ pages.json ä¸­ subPackages çš„“tabBar”中的模板一项和“pages”中模板的一项
5. åˆ é™¤ static ä¸­çš„ uview,里面都是示例图片。
6. åˆ é™¤ plugins ä¸­çš„ config.js å’Œ common.js,并在 plugins/index.js ä¸­åˆ é™¤ç›¸å…³é…ç½®
### åˆ é™¤ uchart
(占用主包 175kb å·¦å³ï¼Œä¸å»ºè®®åˆ é™¤ï¼Œä»¥é˜²ä»¥åŽä¼šç”¨ï¼‰
1. åˆ é™¤ components/qiun-data-charts æ–‡ä»¶å¤¹
2. åˆ é™¤ pages.json ä¸­çš„ easycom ä¸‹çš„ custom ä¸­çš„"qiun-(.\*)"的那一行
3. åˆ é™¤ pages/index ä¸­ä½¿ç”¨ â€œqiun-data-charts” çš„部分
### åˆ é™¤ uview
(按需引入,没必要删除)
1. main.js æˆ–者 main.ts ä¸­åˆ é™¤
```js
import uviewPlus from "uview-plus";
// ......
app.use(uviewPlus);
```
2. uni.scss ä¸­åˆ é™¤ @import 'uview-plus/theme.scss';
3. App.vue ä¸­åˆ é™¤ @import '@/static/scss/index.scss';
4. package.json ä¸­åˆ é™¤ "clipboard": "^2.0.11","dayjs": "^1.11.9","uview-plus": "^3.1.36",
# åŠŸèƒ½æ¼”ç¤º
<table>
    <tr>
        <td valign="top"><img src="https://gitee.com/yinm/RuoYi-Mobile/raw/master/static/preview/login.jpg"/></td>
        <td valign="top"><img src="https://gitee.com/yinm/RuoYi-Mobile/raw/master/static/preview/index.jpg"/></td>
        <td valign="top"><img src="https://gitee.com/yinm/RuoYi-Mobile/raw/master/static/preview/work.jpg"/></td>
        <td valign="top"><img src="https://gitee.com/yinm/RuoYi-Mobile/raw/master/static/preview/my.jpg"/></td>
        <td><img src="./doc/image/template1.png" /></td>
        <td><img src="./doc/image/template2.png"  /></td>
    </tr>
    <tr>
        <td valign="top"><img src="https://gitee.com/yinm/RuoYi-Mobile/raw/master/static/preview/notice-m.jpg"/></td>
        <td valign="top"><img src="https://gitee.com/yinm/RuoYi-Mobile/raw/master/static/preview/notice-e.jpg"/></td>
        <td valign="top"><img src="https://gitee.com/yinm/RuoYi-Mobile/raw/master/static/preview/prefile.jpg"/></td>
        <td valign="top"><img src="https://gitee.com/yinm/RuoYi-Mobile/raw/master/static/preview/pwd-reset.jpg"/></td>
        <td><img src="./doc/image/index.png"  /></td>
        <td><img src="./doc/image/mallMenu.png"/></td>
    </tr>
</table>
<br><br>
###  :lollipop: æŠ€æœ¯äº¤æµ
QQ群:860974500
# é™„录
<br><br>
#### å¦‚果觉得项目还不错,一定记得 :star: ä¸€ä¸‹
#### å¦‚果觉得项目还不错,一定记得 :star: ä¸€ä¸‹
#### å¦‚果觉得项目还不错,一定记得 :star: ä¸€ä¸‹
<br><br>
[Vue3 å®˜ç½‘](https://cn.vuejs.org/);
[uniapp å®˜ç½‘](https://uniapp.dcloud.net.cn/);
[uView-plus å®˜ç½‘](https://uiadmin.net/uview-plus/);
[uCharts å®˜ç½‘](https://www.ucharts.cn/v2/#/);
[RuoYi å®˜ç½‘](http://ruoyi.vip/);
###  :poultry_leg:  ç»™ä½œè€…加个鸡腿
如果对您的工作或学习产生些许帮助,可以给作者的午餐加一个鸡腿 :poultry_leg:  :poultry_leg:  :poultry_leg: ï¼~~
<table>
    <tr>
        <td valign="top" width="180"><img src="https://gitee.com/yinm/RuoYi-Mobile/raw/master/static/preview/wechat_pay.jpg"/></td>
        <td valign="top" width="180"><img src="https://gitee.com/yinm/RuoYi-Mobile/raw/master/static/preview/ali_pay.jpg"/></td>
    </tr>
    <tr>
        <td valign="top" align="center">微信捐助</td>
        <td valign="top" align="center">支付宝捐助</td>
    </tr>
</table>
# è”系我们:
QQ äº¤æµç¾¤ï¼š744785891
api/captcha.js
ÎļþÒÑɾ³ý
api/center/log.js
ÎļþÒÑɾ³ý
api/login.js
ÎļþÒÑɾ³ý
api/user.js
ÎļþÒÑɾ³ý
api/work/notice.js
ÎļþÒÑɾ³ý
api/work/userManage.js
ÎļþÒÑɾ³ý
components/button/FloatButton.vue
ÎļþÒÑɾ³ý
components/gap/Gap.vue
ÎļþÒÑɾ³ý
components/navbar/Navbar.vue
ÎļþÒÑɾ³ý
components/navbar/props.js
ÎļþÒÑɾ³ý
components/qian-tree/qian-tree.vue
ÎļþÒÑɾ³ý
components/qian-tree/style.css
ÎļþÒÑɾ³ý
components/tabs/Tabs.vue
ÎļþÒÑɾ³ý
config/environment.js
ÎļþÒÑɾ³ý
config/http.interceptor.js
ÎļþÒÑɾ³ý
config/request.js
ÎļþÒÑɾ³ý
doc/image/index.png
doc/image/logo.png
doc/image/mallMenu.png
doc/image/template1.png
doc/image/template2.png
index.html
@@ -1,7 +1,8 @@
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Ruoyi-App-Geek</title>
    <meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1">
    <script>
      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
        CSS.supports('top: constant(a)'))
@@ -15,6 +16,6 @@
  </head>
  <body>
    <div id="app"><!--app-html--></div>
    <script type="module" src="/main.js"></script>
    <script type="module" src="./src/main.js"></script>
  </body>
</html>
main.js
ÎļþÒÑɾ³ý
manifest.json
ÎļþÒÑɾ³ý
package-lock.json
ÎļþÌ«´ó
package.json
@@ -1,17 +1,99 @@
{
    "id": "qian-tree",
    "name": "树形选择器增强版,支持多选、单选、父级选中子级自动选中、懒加载",
    "version": "1.0.1",
    "description": "树形选择器增强版,支持多选、单选、父级选择、父子级选中/取消联动、懒加载.",
    "keywords": [
        "tree",
        "树",
        "多选"
    ],
    "dcloudext": {
        "category": [
            "前端组件",
            "通用组件"
        ]
    }
}
  "name": "ruoyi-geek-app",
  "version": "1.0.0",
  "description": "若依Geek管理系统",
  "author": "Geek-XD",
  "license": "MIT",
  "homepage": "https://gitee.com/geek-xd",
  "repository": {
    "type": "git",
    "url": "https://gitee.com/geek-xd/ruoyi-geek-app.git"
  },
  "engines": {
    "node": "^18.0.0 || >=20.0.0"
  },
  "scripts": {
    "dev:app": "uni -p app",
    "dev:app-android": "uni -p app-android",
    "dev:app-ios": "uni -p app-ios",
    "dev:custom": "uni -p",
    "dev:h5": "uni",
    "dev:h5:ssr": "uni --ssr",
    "dev:mp-alipay": "uni -p mp-alipay",
    "dev:mp-baidu": "uni -p mp-baidu",
    "dev:mp-jd": "uni -p mp-jd",
    "dev:mp-kuaishou": "uni -p mp-kuaishou",
    "dev:mp-lark": "uni -p mp-lark",
    "dev:mp-qq": "uni -p mp-qq",
    "dev:mp-toutiao": "uni -p mp-toutiao",
    "dev:mp-weixin": "uni -p mp-weixin",
    "dev:quickapp-webview": "uni -p quickapp-webview",
    "dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei",
    "dev:quickapp-webview-union": "uni -p quickapp-webview-union",
    "build:app": "uni build -p app",
    "build:app-android": "uni build -p app-android",
    "build:app-ios": "uni build -p app-ios",
    "build:custom": "uni build -p",
    "build:h5": "uni build",
    "build:h5:ssr": "uni build --ssr",
    "build:mp-alipay": "uni build -p mp-alipay",
    "build:mp-baidu": "uni build -p mp-baidu",
    "build:mp-jd": "uni build -p mp-jd",
    "build:mp-kuaishou": "uni build -p mp-kuaishou",
    "build:mp-lark": "uni build -p mp-lark",
    "build:mp-qq": "uni build -p mp-qq",
    "build:mp-toutiao": "uni build -p mp-toutiao",
    "build:mp-weixin": "uni build -p mp-weixin",
    "build:quickapp-webview": "uni build -p quickapp-webview",
    "build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
    "build:quickapp-webview-union": "uni build -p quickapp-webview-union",
    "type-check": "vue-tsc --noEmit",
    "clean:linux": "rm -rf dist || rm -rf node_modules",
    "clean:windows": "rd /s /q dist || rd /s /q node_modules"
  },
  "dependencies": {
    "@dcloudio/uni-app": "3.0.0-4060420250429001",
    "@dcloudio/uni-app-harmony": "3.0.0-4060420250429001",
    "@dcloudio/uni-app-plus": "3.0.0-4060420250429001",
    "@dcloudio/uni-components": "3.0.0-4060420250429001",
    "@dcloudio/uni-h5": "3.0.0-4060420250429001",
    "@dcloudio/uni-mp-alipay": "3.0.0-4060420250429001",
    "@dcloudio/uni-mp-baidu": "3.0.0-4060420250429001",
    "@dcloudio/uni-mp-harmony": "3.0.0-4060420250429001",
    "@dcloudio/uni-mp-jd": "3.0.0-4060420250429001",
    "@dcloudio/uni-mp-kuaishou": "3.0.0-4060420250429001",
    "@dcloudio/uni-mp-lark": "3.0.0-4060420250429001",
    "@dcloudio/uni-mp-qq": "3.0.0-4060420250429001",
    "@dcloudio/uni-mp-toutiao": "3.0.0-4060420250429001",
    "@dcloudio/uni-mp-weixin": "3.0.0-4060420250429001",
    "@dcloudio/uni-mp-xhs": "3.0.0-4060420250429001",
    "@dcloudio/uni-quickapp-webview": "3.0.0-4060420250429001",
    "@dcloudio/uvm": "^0.3.1",
    "@jridgewell/sourcemap-codec": "^1.5.0",
    "@qiun/wx-ucharts": "2.5.0-20230101",
    "@uview-plus/types": "^3.2.5",
    "clipboard": "^2.0.11",
    "dayjs": "^1.11.13",
    "mqtt": "4.1.0",
    "pinia": "2.2.2",
    "tslib": "^2.7.0",
    "uview-plus": "^3.3.32",
    "vue": "3.4.21",
    "vue-i18n": "^9.14.2"
  },
  "devDependencies": {
    "@dcloudio/types": "^3.4.14",
    "@dcloudio/uni-automator": "3.0.0-4060420250429001",
    "@dcloudio/uni-cli-shared": "3.0.0-4060420250429001",
    "@dcloudio/uni-stacktracey": "3.0.0-4060420250429001",
    "@dcloudio/vite-plugin-uni": "3.0.0-4060420250429001",
    "@vue/runtime-core": "^3.5.12",
    "@vue/tsconfig": "^0.5.1",
    "less": "^4.2.0",
    "sass": "^1.78.0",
    "sass-loader": "^16.0.1",
    "typescript": "^5.6.2",
    "vite": "5.2.8",
    "vue-tsc": "2.1.6"
  }
}
pages.json
ÎļþÒÑɾ³ý
pages/center/index.vue
ÎļþÒÑɾ³ý
pages/center/log.vue
ÎļþÒÑɾ³ý
pages/center/password.vue
ÎļþÒÑɾ³ý
pages/center/profile.vue
ÎļþÒÑɾ³ý
pages/index/index.vue
ÎļþÒÑɾ³ý
pages/login/index.scss
ÎļþÒÑɾ³ý
pages/login/index.vue
ÎļþÒÑɾ³ý
pages/work/index.vue
ÎļþÒÑɾ³ý
pages/work/notice/detail.vue
ÎļþÒÑɾ³ý
pages/work/notice/edit.vue
ÎļþÒÑɾ³ý
pages/work/notice/list.vue
ÎļþÒÑɾ³ý
pages/work/notice/manage.vue
ÎļþÒÑɾ³ý
pages/work/notice/record.vue
ÎļþÒÑɾ³ý
pages/work/user/edit.vue
ÎļþÒÑɾ³ý
pages/work/user/list.vue
ÎļþÒÑɾ³ý
pnpm-lock.yaml
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
src/App.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<script>
export default {
    onLaunch: function () {
        console.log('App Launch')
    },
    onShow: function () {
        console.log('App Show')
    },
    onHide: function () {
        console.log('App Hide')
    }
}
</script>
<style lang="scss">
@import "uview-plus/index.scss";
@import '@/static/scss/index.scss';
</style>
src/api/login.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
import request from '@/utils/request'
// ç™»å½•方法
export function login(username, password, code, uuid) {
  const data = {
    username,
    password,
    code,
    uuid
  }
  return request({
    url: '/login',
    headers: {
      isToken: false
    },
    method: 'post',
    data: data
  })
}
// æ³¨å†Œæ–¹æ³•
export function register(data) {
  return request({
    url: '/register',
    headers: {
      isToken: false
    },
    method: 'post',
    data: data
  })
}
// èŽ·å–ç”¨æˆ·è¯¦ç»†ä¿¡æ¯
export function getInfo() {
  return request({
    url: '/getInfo',
    method: 'get'
  })
}
// é€€å‡ºæ–¹æ³•
export function logout() {
  return request({
    url: '/logout',
    method: 'post'
  })
}
// èŽ·å–éªŒè¯ç 
export function getCodeImg() {
  return request({
    url: '/captchaImage',
    headers: {
      isToken: false
    },
    method: 'get',
    timeout: 20000
  })
}
src/api/oauth.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
import request from '@/utils/request'
/**
 * å¾®ä¿¡ç™»å½•
 * @param {*} source pub miniapp
 * @param {*} code
 * @returns
 */
export function wxLogin(source,code) {
    return request({
        url: `/oauth/wx/login/${source}/${code}`,
        headers: {
            isToken: false
        },
        method: 'post',
    })
}
/**
 * å¾®ä¿¡ç»‘定
 * @param {*} source å¾®ä¿¡ç»‘定
 * @param {*} code
 * @returns
 */
export function wxRegister(source,code) {
    return request({
        url: `/oauth/wx/register/${source}/${code}`,
        headers: {
            isToken: true
        },
        method: 'post',
    })
}
src/api/system/dict/data.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
import request from '@/utils/request'
// æŸ¥è¯¢å­—典数据列表
export function listData(query) {
  return request({
    url: '/system/dict/data/list',
    method: 'get',
    params: query
  })
}
// æŸ¥è¯¢å­—典数据详细
export function getData(dictCode) {
  return request({
    url: '/system/dict/data/' + dictCode,
    method: 'get'
  })
}
// æ ¹æ®å­—典类型查询字典数据信息
export function getDicts(dictType) {
  return request({
    url: '/system/dict/data/type/' + dictType,
    method: 'get'
  })
}
// æ–°å¢žå­—典数据
export function addData(data) {
  return request({
    url: '/system/dict/data',
    method: 'post',
    data: data
  })
}
// ä¿®æ”¹å­—典数据
export function updateData(data) {
  return request({
    url: '/system/dict/data',
    method: 'put',
    data: data
  })
}
// åˆ é™¤å­—典数据
export function delData(dictCode) {
  return request({
    url: '/system/dict/data/' + dictCode,
    method: 'delete'
  })
}
src/api/system/dict/type.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
import request from '@/utils/request'
// æŸ¥è¯¢å­—典类型列表
export function listType(query) {
  return request({
    url: '/system/dict/type/list',
    method: 'get',
    params: query
  })
}
// æŸ¥è¯¢å­—典类型详细
export function getType(dictId) {
  return request({
    url: '/system/dict/type/' + dictId,
    method: 'get'
  })
}
// æ–°å¢žå­—典类型
export function addType(data) {
  return request({
    url: '/system/dict/type',
    method: 'post',
    data: data
  })
}
// ä¿®æ”¹å­—典类型
export function updateType(data) {
  return request({
    url: '/system/dict/type',
    method: 'put',
    data: data
  })
}
// åˆ é™¤å­—典类型
export function delType(dictId) {
  return request({
    url: '/system/dict/type/' + dictId,
    method: 'delete'
  })
}
// åˆ·æ–°å­—典缓存
export function refreshCache() {
  return request({
    url: '/system/dict/type/refreshCache',
    method: 'delete'
  })
}
// èŽ·å–å­—å…¸é€‰æ‹©æ¡†åˆ—è¡¨
export function optionselect() {
  return request({
    url: '/system/dict/type/optionselect',
    method: 'get'
  })
}
src/api/system/user.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
import upload from '@/utils/upload'
import request from '@/utils/request'
// ç”¨æˆ·å¯†ç é‡ç½®
export function updateUserPwd(oldPassword, newPassword) {
  const data = {
    oldPassword,
    newPassword
  }
  return request({
    url: '/system/user/profile/updatePwd',
    method: 'put',
    params: data
  })
}
// æŸ¥è¯¢ç”¨æˆ·ä¸ªäººä¿¡æ¯
export function getUserProfile() {
  return request({
    url: '/system/user/profile',
    method: 'get'
  })
}
// ä¿®æ”¹ç”¨æˆ·ä¸ªäººä¿¡æ¯
export function updateUserProfile(data) {
  return request({
    url: '/system/user/profile',
    method: 'put',
    data: data
  })
}
// ç”¨æˆ·å¤´åƒä¸Šä¼ 
export function uploadAvatar(data) {
  return upload({
    url: '/system/user/profile/avatar',
    name: data.name,
    filePath: data.filePath
  })
}
src/components/geek-xd/components/geek-certificate/geek-certificate.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
<template>
  <view class="upload">
    <view class="imagebox">
      <view class="imageborder">
        <view class="main">
          <slot></slot>
        </view>
      </view>
    </view>
    <view class="text">
      <text>{{ text }}</text>
    </view>
  </view>
</template>
<script setup>
import { ref } from 'vue';
const text = ref("")
</script>
<style scoped lang="scss">
.upload {
  height: 400rpx;
  width: 90%;
  border-radius: 20rpx;
  overflow: hidden;
  .imagebox {
    height: 80%;
    background-color: #eff8ff;
    align-items: center;
    justify-content: center;
    display: flex;
    .imageborder {
      border: 5px #319fea solid;
      position: relative;
      width: 70%;
      height: 80%;
      border-radius: 30rpx;
      &::after {
        position: absolute;
        content: ' ';
        background-color: #eff8ff;
        height: 80%;
        width: 120%;
        top: 10%;
        left: -10%;
      }
      &::before {
        position: absolute;
        content: ' ';
        background-color: #eff8ff;
        top: -10%;
        left: 10%;
        height: 120%;
        width: 80%;
      }
      .main {
        position: absolute;
        background-color: #eff8ff;
        top: 5%;
        left: 5%;
        height: 90%;
        width: 90%;
        display: flex;
        align-items: center;
        justify-content: center;
        z-index: 2;
      }
    }
  }
  .text {
    height: 20%;
    background-color: #319fea;
    display: flex;
    justify-content: center;
    align-items: center;
    text {
      color: #ffffff;
    }
  }
}
</style>
src/components/geek-xd/components/geek-color-picker/geek-color-picker.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,747 @@
<script setup lang="ts">
import { ref, reactive, watch, nextTick, getCurrentInstance } from 'vue';
// ç±»åž‹å®šä¹‰
interface RGBAColor {
    r: number;
    g: number;
    b: number;
    a: number;
}
interface HSBColor {
    h: number;
    s: number;
    b: number;
}
interface SitePosition {
    top: number;
    left: number;
}
interface ElementPosition {
    top: number;
    left: number;
    width: number;
    height: number;
}
const emit = defineEmits<{
    (e: 'confirm', data: { rgba: RGBAColor; hex: string }): void;
}>();
const instance = getCurrentInstance();
const props = defineProps({
    color: {
        type: Object as () => RGBAColor,
        default() {
            return { r: 0, g: 0, b: 0, a: 0 }
        }
    },
    spareColor: {
        type: Array as () => RGBAColor[],
        default() {
            return []
        }
    }
});
// å“åº”式数据
const show = ref<boolean>(false);
const active = ref<boolean>(false);
const rgba = reactive<RGBAColor>({ r: 0, g: 0, b: 0, a: 1 });
const hsb = reactive<HSBColor>({ h: 0, s: 0, b: 0 });
const site = reactive<SitePosition[]>([{ top: 0, left: 0 }, { left: 0, top: 0 }, { left: 0, top: 0 }]);
const index = ref<number>(0);
const bgcolor = reactive<RGBAColor>({ r: 255, g: 0, b: 0, a: 1 });
const hex = ref<string>('#000000');
const mode = ref<boolean>(true);
const position = ref<ElementPosition[] | null>(null);
const colorList = ref<RGBAColor[]>([
    { r: 244, g: 67, b: 54, a: 1 },
    { r: 233, g: 30, b: 99, a: 1 },
    { r: 156, g: 39, b: 176, a: 1 },
    { r: 103, g: 58, b: 183, a: 1 },
    { r: 63, g: 81, b: 181, a: 1 },
    { r: 33, g: 150, b: 243, a: 1 },
    { r: 3, g: 169, b: 244, a: 1 },
    { r: 0, g: 188, b: 212, a: 1 },
    { r: 0, g: 150, b: 136, a: 1 },
    { r: 76, g: 175, b: 80, a: 1 },
    { r: 139, g: 195, b: 74, a: 1 },
    { r: 205, g: 220, b: 57, a: 1 },
    { r: 255, g: 235, b: 59, a: 1 },
    { r: 255, g: 193, b: 7, a: 1 },
    { r: 255, g: 152, b: 0, a: 1 },
    { r: 255, g: 87, b: 34, a: 1 },
    { r: 121, g: 85, b: 72, a: 1 },
    { r: 158, g: 158, b: 158, a: 1 },
    { r: 0, g: 0, b: 0, a: 0.5 },
    { r: 0, g: 0, b: 0, a: 0 },
]);
// åˆå§‹åŒ–(替代 created é’©å­ï¼‰
Object.assign(rgba, props.color);
if (props.spareColor.length !== 0) {
    colorList.value = props.spareColor;
}
/**
 * åˆå§‹åŒ–
 */
const init = (): void => {
    // hsb é¢œè‰²
    Object.assign(hsb, rgbToHsb(rgba));
    setValue(rgba);
};
const moveHandle = (): void => { };
const open = (): void => {
    show.value = true;
    nextTick(() => {
        init();
        setTimeout(() => {
            active.value = true;
            setTimeout(() => {
                getSelectorQuery();
            }, 350)
        }, 50)
    })
};
const close = (): void => {
    active.value = false;
    nextTick(() => {
        setTimeout(() => {
            show.value = false;
        }, 500)
    })
};
const confirm = (): void => {
    close();
    emit('confirm', {
        rgba: rgba,
        hex: hex.value
    })
};
// é€‰æ‹©æ¨¡å¼
const select = (): void => {
    mode.value = !mode.value
};
// å¸¸ç”¨é¢œè‰²é€‰æ‹©
const selectColor = (item: RGBAColor): void => {
    setColorBySelect(item)
};
const touchstart = (e: TouchEvent, idx: number): void => {
    const { pageX, pageY, clientX, clientY } = e.touches[0];
    setPosition(clientX, clientY, idx);
};
const touchmove = (e: TouchEvent, idx: number): void => {
    const { pageX, pageY, clientX, clientY } = e.touches[0];
    setPosition(clientX, clientY, idx);
};
const touchend = (e: TouchEvent, idx: number): void => {
    // åŽŸä»£ç ä¸ºç©ºå®žçŽ°
};
/**
 * è®¾ç½®ä½ç½®
 */
const setPosition = (x: number, y: number, idx: number): void => {
    index.value = idx;
    if (!position.value || !position.value[idx]) return;
    const {
        top,
        left,
        width,
        height
    } = position.value[idx];
    // è®¾ç½®æœ€å¤§æœ€å°å€¼
    site[idx].left = Math.max(0, Math.min(parseInt(String(x - left)), width));
    if (idx === 0) {
        site[idx].top = Math.max(0, Math.min(parseInt(String(y - top)), height));
        // è®¾ç½®é¢œè‰²
        hsb.s = parseInt(String((100 * site[idx].left) / width));
        hsb.b = parseInt(String(100 - (100 * (site[idx].top as number)) / height));
        setColor();
        setValue(rgba);
    } else {
        setControl(idx, site[idx].left);
    }
};
/**
 * è®¾ç½® rgb é¢œè‰²
 */
const setColor = (): void => {
    const rgb = HSBToRGB(hsb);
    rgba.r = rgb.r;
    rgba.g = rgb.g;
    rgba.b = rgb.b;
};
/**
 * è®¾ç½®äºŒè¿›åˆ¶é¢œè‰²
 * @param {RGBAColor} rgb
 */
const setValue = (rgb: RGBAColor): void => {
    hex.value = '#' + rgbToHex(rgb);
};
const setControl = (idx: number, x: number): void => {
    if (!position.value || !position.value[idx]) return;
    const {
        width
    } = position.value[idx];
    if (idx === 1) {
        hsb.h = parseInt(String((360 * x) / width));
        const newRgb = HSBToRGB({
            h: hsb.h,
            s: 100,
            b: 100
        });
        bgcolor.r = newRgb.r;
        bgcolor.g = newRgb.g;
        bgcolor.b = newRgb.b;
        setColor();
    } else {
        rgba.a = parseFloat((x / width).toFixed(1));
    }
    setValue(rgba);
};
/**
 * rgb è½¬ äºŒè¿›åˆ¶ hex
 * @param {RGBAColor} rgb
 * @returns {string} åå…­è¿›åˆ¶é¢œè‰²å­—符串(不含#)
 */
const rgbToHex = (rgb: RGBAColor): string => {
    let hex = [rgb.r.toString(16), rgb.g.toString(16), rgb.b.toString(16)];
    hex.map(function (str, i) {
        if (str.length == 1) {
            hex[i] = '0' + str;
        }
    });
    return hex.join('');
};
const setColorBySelect = (getrgb: RGBAColor): void => {
    const {
        r,
        g,
        b,
        a
    } = getrgb;
    rgba.r = r ? parseInt(String(r)) : 0;
    rgba.g = g ? parseInt(String(g)) : 0;
    rgba.b = b ? parseInt(String(b)) : 0;
    rgba.a = a ? a : 0;
    Object.assign(hsb, rgbToHsb(rgba));
    changeViewByHsb();
};
const changeViewByHsb = (): void => {
    if (!position.value || position.value.length < 3) return;
    const [a, b, c] = position.value;
    site[0].left = parseInt(String(hsb.s * a.width / 100));
    site[0].top = parseInt(String((100 - hsb.b) * a.height / 100));
    setColor();
    setValue(rgba);
    const newRgb = HSBToRGB({
        h: hsb.h,
        s: 100,
        b: 100
    });
    bgcolor.r = newRgb.r;
    bgcolor.g = newRgb.g;
    bgcolor.b = newRgb.b;
    site[1].left = hsb.h / 360 * b.width;
    site[2].left = rgba.a * c.width;
};
/**
 * hsb è½¬ rgb
 * @param {HSBColor} hsb é¢œè‰²æ¨¡å¼  H(hues)表示色相,S(saturation)表示饱和度,B(brightness)表示亮度
 * @returns {RGBAColor} RGB颜色对象
 */
const HSBToRGB = (hsb: HSBColor): RGBAColor => {
    let rgb: { r: number; g: number; b: number } = { r: 0, g: 0, b: 0 };
    let h = Math.round(hsb.h);
    let s = Math.round((hsb.s * 255) / 100);
    let v = Math.round((hsb.b * 255) / 100);
    if (s == 0) {
        rgb.r = rgb.g = rgb.b = v;
    } else {
        let t1 = v;
        let t2 = ((255 - s) * v) / 255;
        let t3 = ((t1 - t2) * (h % 60)) / 60;
        if (h == 360) h = 0;
        if (h < 60) {
            rgb.r = t1;
            rgb.b = t2;
            rgb.g = t2 + t3;
        } else if (h < 120) {
            rgb.g = t1;
            rgb.b = t2;
            rgb.r = t1 - t3;
        } else if (h < 180) {
            rgb.g = t1;
            rgb.r = t2;
            rgb.b = t2 + t3;
        } else if (h < 240) {
            rgb.b = t1;
            rgb.r = t2;
            rgb.g = t1 - t3;
        } else if (h < 300) {
            rgb.b = t1;
            rgb.g = t2;
            rgb.r = t2 + t3;
        } else if (h < 360) {
            rgb.r = t1;
            rgb.g = t2;
            rgb.b = t1 - t3;
        } else {
            rgb.r = 0;
            rgb.g = 0;
            rgb.b = 0;
        }
    }
    return {
        r: Math.round(rgb.r),
        g: Math.round(rgb.g),
        b: Math.round(rgb.b),
        a: 1
    };
};
/**
 * rgb转hsb
 * @param {RGBAColor} rgb RGB颜色对象
 * @returns {HSBColor} HSB颜色对象
 */
const rgbToHsb = (rgb: RGBAColor): HSBColor => {
    let hsb = {
        h: 0,
        s: 0,
        b: 0
    };
    let min = Math.min(rgb.r, rgb.g, rgb.b);
    let max = Math.max(rgb.r, rgb.g, rgb.b);
    let delta = max - min;
    hsb.b = max;
    hsb.s = max != 0 ? 255 * delta / max : 0;
    if (hsb.s != 0) {
        if (rgb.r == max) hsb.h = (rgb.g - rgb.b) / delta;
        else if (rgb.g == max) hsb.h = 2 + (rgb.b - rgb.r) / delta;
        else hsb.h = 4 + (rgb.r - rgb.g) / delta;
    } else hsb.h = -1;
    hsb.h *= 60;
    if (hsb.h < 0) hsb.h = 0;
    hsb.s *= 100 / 255;
    hsb.b *= 100 / 255;
    return hsb;
};
const getSelectorQuery = (): void => {
    const views = uni.createSelectorQuery().in(instance!.proxy);
    views.selectAll('.boxs')
        .boundingClientRect(data => {
            if (Array.isArray(data) ? data.length === 0 : !data) {
                setTimeout(() => getSelectorQuery(), 20)
                return
            }
            position.value = data as unknown as ElementPosition[];
            setColorBySelect(rgba);
        })
        .exec();
};
// ç›‘听 props
watch(() => props.spareColor, (newVal) => {
    colorList.value = newVal;
});
// æš´éœ²ç»„件方法供父组件调用
defineExpose({
    open,
    close,
    confirm
});
</script>
<template>
    <view v-show="show" class="t-wrapper" @touchmove.stop.prevent="moveHandle">
        <view class="t-mask" :class="{ active: active }" @click.stop="close"></view>
        <view class="t-box" :class="{ active: active }">
            <view class="t-header">
                <view class="t-header-button" @click="close">取消</view>
                <view class="t-header-button confrim" @click="confirm">确认</view>
            </view>
            <view class="t-color__box"
                :style="{ background: 'rgb(' + bgcolor.r + ',' + bgcolor.g + ',' + bgcolor.b + ')' }">
                <view class="t-background boxs" @touchstart="touchstart($event, 0)" @touchmove="touchmove($event, 0)"
                    @touchend="touchend($event, 0)">
                    <view class="t-color-mask"></view>
                    <view class="t-pointer" :style="{
                        top: site[0].top - 8 + 'px',
                        left: site[0].left - 8 + 'px'
                    }">
                    </view>
                </view>
            </view>
            <view class="t-control__box">
                <view class="t-control__color">
                    <view class="t-control__color-content"
                        :style="{ background: 'rgba(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ',' + rgba.a + ')' }">
                    </view>
                </view>
                <view class="t-control-box__item">
                    <view class="t-controller boxs" @touchstart="touchstart($event, 1)"
                        @touchmove="touchmove($event, 1)" @touchend="touchend($event, 1)">
                        <view class="t-hue">
                            <view class="t-circle" :style="{ left: site[1].left - 12 + 'px' }"></view>
                        </view>
                    </view>
                    <view class="t-controller boxs" @touchstart="touchstart($event, 2)"
                        @touchmove="touchmove($event, 2)" @touchend="touchend($event, 2)">
                        <view class="t-transparency">
                            <view class="t-circle" :style="{ left: site[2].left - 12 + 'px' }"></view>
                        </view>
                    </view>
                </view>
            </view>
            <view class="t-result__box">
                <view v-if="mode" class="t-result__item">
                    <view class="t-result__box-input">{{ hex }}</view>
                    <view class="t-result__box-text">HEX</view>
                </view>
                <template v-else>
                    <view class="t-result__item">
                        <view class="t-result__box-input">{{ rgba.r }}</view>
                        <view class="t-result__box-text">R</view>
                    </view>
                    <view class="t-result__item">
                        <view class="t-result__box-input">{{ rgba.g }}</view>
                        <view class="t-result__box-text">G</view>
                    </view>
                    <view class="t-result__item">
                        <view class="t-result__box-input">{{ rgba.b }}</view>
                        <view class="t-result__box-text">B</view>
                    </view>
                    <view class="t-result__item">
                        <view class="t-result__box-input">{{ rgba.a }}</view>
                        <view class="t-result__box-text">A</view>
                    </view>
                </template>
                <view class="t-result__item t-select" @click="select">
                    <view class="t-result__box-input">
                        <view>切换</view>
                        <view>模式</view>
                    </view>
                </view>
            </view>
            <view class="t-alternative">
                <view class="t-alternative__item" v-for="(item, index) in colorList" :key="index">
                    <view class="t-alternative__item-content"
                        :style="{ background: 'rgba(' + item.r + ',' + item.g + ',' + item.b + ',' + item.a + ')' }"
                        @click="selectColor(item)">
                    </view>
                </view>
            </view>
        </view>
    </view>
</template>
<style lang="scss" scoped>
.t-wrapper {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    width: 100%;
    box-sizing: border-box;
    z-index: 9999;
}
.t-box {
    width: 100%;
    position: absolute;
    bottom: 0;
    padding: 30upx 0;
    padding-top: 0;
    background: #fff;
    transition: all 0.3s;
    transform: translateY(100%);
    &.active {
        transform: translateY(0%);
    }
}
.t-header {
    display: flex;
    justify-content: space-between;
    width: 100%;
    height: 100upx;
    border-bottom: 1px #eee solid;
    box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);
    background: #fff;
}
.t-header-button {
    display: flex;
    align-items: center;
    width: 150upx;
    height: 100upx;
    font-size: 30upx;
    color: #666;
    padding-left: 20upx;
    &:last-child {
        justify-content: flex-end;
        padding-right: 20upx;
    }
    &.confrim {
        color: #007AFF;
    }
}
.t-mask {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: rgba(0, 0, 0, 0.6);
    z-index: -1;
    transition: all 0.3s;
    opacity: 0;
    &.active {
        opacity: 1;
    }
}
// é¿å…ä½¿ç”¨ &__box å†™æ³•,改为完整类名
.t-color__box {
    position: relative;
    height: 400upx;
    background: rgb(255, 0, 0);
    overflow: hidden;
    box-sizing: border-box;
    margin: 0 20upx;
    margin-top: 20upx;
    box-sizing: border-box;
}
.t-color-mask {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 400upx;
    background: linear-gradient(to top, #000, rgba(0, 0, 0, 0));
}
.t-background {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0));
}
.t-pointer {
    position: absolute;
    bottom: -8px;
    left: -8px;
    z-index: 2;
    width: 15px;
    height: 15px;
    border: 1px #fff solid;
    border-radius: 50%;
}
.t-show-color {
    width: 100upx;
    height: 50upx;
}
// é¿å…ä½¿ç”¨åµŒå¥—方式,使用完整类名
.t-control__box {
    margin-top: 50upx;
    width: 100%;
    display: flex;
    padding-left: 20upx;
    box-sizing: border-box;
}
.t-control__color {
    flex-shrink: 0;
    width: 100upx;
    height: 100upx;
    border-radius: 50%;
    background-color: #fff;
    background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
        linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
    background-size: 36upx 36upx;
    background-position: 0 0, 18upx 18upx;
    border: 1px #eee solid;
    overflow: hidden;
}
.t-control__color-content {
    width: 100%;
    height: 100%;
}
.t-control-box__item {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    width: 100%;
    padding: 0 30upx;
}
.t-controller {
    position: relative;
    width: 100%;
    height: 16px;
    background-color: #fff;
    background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
        linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
    background-size: 32upx 32upx;
    background-position: 0 0, 16upx 16upx;
}
.t-hue {
    width: 100%;
    height: 100%;
    background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);
}
.t-transparency {
    width: 100%;
    height: 100%;
    background: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgb(0, 0, 0));
}
.t-circle {
    position: absolute;
    top: -2px;
    width: 20px;
    height: 20px;
    box-sizing: border-box;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1);
}
// ä½¿ç”¨å®Œæ•´çš„类名而不是嵌套
.t-result__box {
    margin-top: 20upx;
    padding: 10upx;
    width: 100%;
    display: flex;
    box-sizing: border-box;
}
.t-result__item {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 10upx;
    width: 100%;
    box-sizing: border-box;
}
.t-result__box-input {
    padding: 10upx 0;
    width: 100%;
    font-size: 28upx;
    box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1);
    color: #999;
    text-align: center;
    background: #fff;
}
.t-result__box-text {
    margin-top: 10upx;
    font-size: 28upx;
    line-height: 2;
}
.t-select {
    flex-shrink: 0;
    width: 150upx;
    padding: 0 30upx;
    .t-result__box-input {
        border-radius: 10upx;
        border: none;
        color: #999;
        box-shadow: 1px 1px 2px 1px rgba(0, 0, 0, 0.1);
        background: #fff;
        &:active {
            box-shadow: 0px 0px 1px 0px rgba(0, 0, 0, 0.1);
        }
    }
}
.t-alternative {
    display: flex;
    flex-wrap: wrap;
    width: 100%;
    padding-right: 10upx;
    box-sizing: border-box;
}
.t-alternative__item {
    margin-left: 12upx;
    margin-top: 10upx;
    width: 50upx;
    height: 50upx;
    border-radius: 10upx;
    background-color: #fff;
    background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
        linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
    background-size: 36upx 36upx;
    background-position: 0 0, 18upx 18upx;
    border: 1px #eee solid;
    overflow: hidden;
    &:active {
        transition: all 0.3s;
        transform: scale(1.1);
    }
}
.t-alternative__item-content {
    width: 50upx;
    height: 50upx;
    background: rgba(255, 0, 0, 0.5);
}
</style>
src/components/geek-xd/components/geek-commodity/geek-commodity.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
<script setup>
const props = defineProps({
    img: {
        type: String,
        default: ''
    },
    title: {
        type: String,
        default: ''
    },
    subTitle: {
        type: String,
        default: ''
    },
    price: {
        type: Number,
        default: 0
    },
    type: {
        type: String,
        default: 'line' // line, rect
    }
})
</script>
<template>
    <view class="card" :class="type" @click="$emit('click')">
        <image class="img" :src="img" />
        <view class="content">
            <view class="title">{{ title }}</view>
            <view class="subTitle">{{ subTitle }}</view>
            <view class="price">ï¿¥{{ price }}</view>
        </view>
    </view>
</template>
<style lang="scss" scoped>
.card {
    padding: 0;
    border-radius: 10px;
    background-color: #ffffff;
    width: 700rpx;
    padding: 20rpx;
    margin: 10rpx;
    position: relative;
    .img {
        height: 200rpx;
        width: 200rpx;
    }
}
.line {
    display: flex;
    .content {
        height: 200rpx;
        padding-left: 20rpx;
        .title {
            width: 400rpx;
            font-size: 35rpx;
        }
        .subTitle {
            width: 400rpx;
            height: 90rpx;
            margin-top: 10rpx;
            font-size: 20rpx;
            color: rgb(87, 87, 87);
            line-height: 30rpx;
            display: -webkit-box;
            -webkit-box-orient: vertical;
            -webkit-line-clamp: 3;
            overflow: hidden;
            text-overflow: ellipsis;
        }
        .price {
            font-size: 40rpx;
            color: red;
            width: 400rpx;
        }
    }
}
.rect {
    border-radius: 10px;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    width: 350rpx;
    padding: 0;
    margin: 10rpx;
    display: inline-block;
    .img {
        border-radius: 10px 10px 0 0;
        height: 350rpx;
        width: 350rpx;
    }
    .content {
        padding: 0 20rpx;
        margin: 0;
        width: 100%;
        display: flex;
        flex-direction: column;
        justify-content: space-between;
        .title {
            width: 330rpx;
            font-size: 25rpx;
        }
        .subTitle {
            width: 330rpx;
            font-size: 20rpx;
            color: rgb(87, 87, 87);
        }
        .price {
            font-size: 30rpx;
            color: red;
            width: 100%;
        }
    }
}
</style>
src/components/geek-xd/components/geek-menu/geek-menu.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
<script setup>
import { computed } from 'vue';
const props = defineProps({
    icon: {
        type: String,
        default: ''
    },
    size: {
        type: Number,
        default: 80
    },
    label: {
        type: String,
        default: "菜单"
    },
    labelColor: {
        type: String,
        default: '#515151'
    },
    type: {
        type: String,
        default: 'circle'
    }
})
const menuStyle = computed(() => {
    return {
        width: `${props.size + 40}rpx`,
        height: `${props.size + 40}rpx`
    }
})
const titleStype = computed(() => {
    return {
        width: `${props.size + 40}rpx`,
        color: props.labelColor
    }
})
</script>
<template>
    <view>
        <view class="menu" :class="type" :style="menuStyle" @click="$emit('click')">
            <image :src="icon" style="width: 100%;height: 100%"></image>
        </view>
        <view class="title" :style="titleStype">{{ label }}</view>
    </view>
</template>
<style lang="scss" scoped>
.menu {
    padding: 20rpx;
}
.circle {
    padding: 20rpx;
    border-radius: 100%;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    &:active {
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.8);
    }
}
.rect {
    padding: 15rpx;
    margin-bottom: -15rpx;
    &:active {
        opacity: 0.5;
    }
}
.title {
    text-align: center;
}
</style>
src/components/geek-xd/components/geek-order/geek-order.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,220 @@
<template>
    <view class="geek-card" @click="$emit('click')">
        <view class="geek-header">
            <view class="geek-shop">{{ shop }} > </view>
            <view class="geek-status">{{ status }}</view>
        </view>
        <view class="geek-content">
            <image class="geek-img" :src="img"></image>
            <view class="geek-label">{{ label }}</view>
            <view class="geek-sum">
                <view class="geek-price">
                    <view class="geek-sum-1">ï¿¥{{ number.integerPart }}</view>
                    <view class="geek-sum-2">. {{ number.decimalPart }}</view>
                </view>
                <view class="geek-sum-3">共 {{ num }} ä»¶</view>
            </view>
        </view>
        <view class="geek-footer">
            <view class="geek-more" @click="$emit('more')">更多</view>
            <view class="geek-buttonGroup">
                <view class="geek-btn" @click="$emit('sell')">卖了换钱</view>
                <view class="geek-btn" @click="$emit('return')">退换/售后</view>
                <view class="geek-buy" @click="$emit('again')">再次购买</view>
            </view>
        </view>
    </view>
</template>
<script setup>
import { computed } from 'vue';
const props = defineProps({
    shop: {
        type: String,
        default: ''
    },
    status: {
        type: String,
        default: ''
    },
    img: {
        type: String,
        default: ''
    },
    label: {
        type: String,
        default: ''
    },
    price: {
        type: Number,
        default: 0
    },
    num: {
        type: Number,
        default: 0
    },
    type: {
        type: String,
        default: 'line'
    }
})
const number = computed(() => {
    return formatNumber(props.price, 2)
})
function formatNumber(num, place) {
    let fixedNum = Number(num).toFixed(place); // å°†æ•°å­—保留两位小数
    let parts = fixedNum.split('.'); // æ‹†åˆ†æ•´æ•°éƒ¨åˆ†å’Œå°æ•°éƒ¨åˆ†
    let integerPart = parts[0]; // æ•´æ•°éƒ¨åˆ†
    let decimalPart = parts[1]; // å°æ•°éƒ¨åˆ†
    // ä½¿ç”¨padStart方法补0到小数部分
    decimalPart = decimalPart.padStart(place, '0');
    return {
        integerPart, decimalPart
    }
}
</script>
<style lang="scss" scoped>
.geek-card {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    position: relative;
    padding: 20rpx;
    background-color: white;
    border-radius: 20rpx;
    height: 360rpx;
    width: 700rpx;
    margin: 25rpx;
    .geek-header {
        display: flex;
        justify-content: space-between;
        height: 60rpx;
        width: 100%;
        margin-bottom: 6rpx;
        .geek-shop {
            font-size: 28rpx;
            font-weight: 600;
        }
        .geek-status {
            width: 100rpx;
            text-align: center;
            opacity: 0.5;
            font-size: 25rpx;
            text-align: end;
        }
    }
    .geek-content {
        position: relative;
        height: auto;
        width: 664rpx;
        .geek-img {
            border-radius: 30rpx;
            height: 170rpx;
            width: 170rpx;
            display: inline-block;
        }
        .geek-label {
            position: absolute;
            top: 40rpx;
            left: 178rpx;
            width: 350rpx;
            display: -webkit-box;
            -webkit-line-clamp: 2;
            -webkit-box-orient: vertical;
            overflow: hidden;
            text-overflow: ellipsis;
        }
        .geek-sum {
            position: absolute;
            top: 44rpx;
            right: 20rpx;
            width: 150rpx;
            height: 84rpx;
            .geek-price {
                display: flex;
                justify-content: flex-end;
                font-weight: bold;
                .geek-sum-1 {
                    font-size: 32rpx;
                }
                .geek-sum-2 {
                    padding-top: 20rpx;
                    font-size: 20rpx;
                }
            }
            .geek-sum-3 {
                font-size: 20rpx;
                text-align: end;
            }
        }
    }
    .geek-footer {
        display: flex;
        justify-content: space-between;
        height: 60rpx;
        width: 100%;
        font-size: 25rpx;
        .geek-more {
            height: 60rpx;
            margin-right: 110rpx;
            text-align: center;
            line-height: 60rpx;
            display: inline-block;
        }
        .geek-buttonGroup {
            height: 60rpx;
            display: inline-block;
            .geek-btn {
                border: 1rpx solid #E9E9E9;
                width: 140rpx;
                height: 60rpx;
                border-radius: 80rpx;
                opacity: 0.8;
                padding: 10rpx;
                margin-right: 10rpx;
                text-align: center;
                display: inline-block;
            }
            .geek-buy {
                width: 140rpx;
                height: 60rpx;
                border-radius: 80rpx;
                opacity: 0.8;
                padding: 10rpx;
                text-align: center;
                display: inline-block;
                color: #F25E53;
                border: 1rpx solid #F4DADA;
            }
        }
    }
}
</style>
src/components/geek-xd/components/geek-qrcode/README.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
# uni-app äºŒç»´ç ç”Ÿæˆå™¨
改自作者诗小柒的tki-qrcode二维码生成器
### ä½œè€…:董玉可
1. H5、微信小程序、支付宝小程序、APP,其它平台的小程序没有测试
2. ä½¿ç”¨canvas生成
3. å¯è®¾ç½®äºŒç»´ç èƒŒæ™¯è‰²ï¼Œå‰æ™¯è‰²ï¼Œè§’标色
4. å¯è®¾ç½®äºŒç»´ç logo
## é‡è¦çš„事情说3遍 é‡è¦çš„事情说3遍 é‡è¦çš„事情说3遍
1. IOS、Android真机都可以正常生成二维码
2. ä½¿ç”¨çš„æ—¶å€™å‡ºçŽ°æ— æ³•ç”ŸæˆäºŒç»´ç æˆ–ç©ºç™½çš„è¯·å…ˆgithub直接打包下载,问题依旧,请github上直接提出问题并配图
3. æœ‰é—®é¢˜è¯·è¯´æ˜Žé—®é¢˜åŽŸå› ï¼Œè¿™æ ·æˆ‘æ‰å¥½å®šä½ï¼Œå¦åˆ™æˆ‘ä¹Ÿæ— æ³•è§£å†³
4. å¦‚果此插件有帮助到你请打5分或赞赏我,你的支持是我更新的动力
+ å›¾ç‰‡1 æ˜¯å¾®ä¿¡å°ç¨‹åºçœŸæœºå®žæµ‹
+ å›¾ç‰‡2 æ˜¯å¾®ä¿¡å°ç¨‹åºæ¨¡æ‹Ÿå®žæµ‹
+ å›¾ç‰‡3 æ˜¯æ”¯ä»˜å®å°ç¨‹åºæ¨¡æ‹Ÿå™¨å®žæµ‹
+ å›¾ç‰‡4 æ˜¯å®‰å“真机实测
+ å›¾ç‰‡5 H5
### ä½¿ç”¨æ–¹æ³•
在 `template` ä¸­ä½¿ç”¨
```javascript
<view class="qrimg">
    <geek-qrcode
    ref="qrcode"
    :cid="cid"
    :val="val"
    :size="size"
    :unit="unit"
    :background="background"
    :foreground="foreground"
    :pdground="pdground"
    :icon="icon"
    :iconSize="iconsize"
    :lv="lv"
    :onval="onval"
    :loadMake="loadMake"
    :usingComponents="usingComponents"
    :showLoading="showLoading"
    :loadingText="loadingText"
    @result="qrR" />
</view>
```
### å±žæ€§
| å±žæ€§å          |  ç±»åž‹  |      é»˜è®¤å€¼      | å¯é€‰å€¼ | è¯´æ˜Ž                                                                                                |
| :-------------- | :-----: | :---------------: | :----: | :-------------------------------------------------------------------------------------------------- |
| cid             | String | tki-qrcode-canvas |        | canvasId,页面存在多个二维码组件时需设置不同的ID                                                    |
| size            | Number |        200        |        | ç”Ÿæˆçš„二维码大小                                                                                    |
| unit            | String |        upx        |   px   | å¤§å°å•位尺寸                                                                                        |
| show            | Boolean |       true       |        | é»˜è®¤ä½¿ç”¨ç»„件中的image标签显示二维码                                                                 |
| val             | String |      äºŒç»´ç       |        | è¦ç”Ÿæˆçš„内容                                                                                        |
| background      | String |      #000000      |        | äºŒç»´ç èƒŒæ™¯è‰²                                                                                        |
| foreground      | String |      #ffffff      |        | äºŒç»´ç å‰æ™¯è‰²                                                                                        |
| pdground        | String |      #ffffff      |        | äºŒç»´ç è§’标色                                                                                        |
| icon            | String |                  |        | äºŒç»´ç å›¾æ ‡URL(必须是本地图片,网络图需要先下载至本地)                                             |
| iconSize        | Number |        40        |        | äºŒç»´ç å›¾æ ‡å¤§å°ï¼ˆæ³¨æ„æ­¤å¤§å°ä¸ä¼šè·ŸéšäºŒç»´ç size åŠ¨æ€å˜åŒ–ï¼Œè®¾ç½®æ—¶éœ€è¦æ³¨æ„å¤§å°ï¼Œä¸è¦å¤ªå¤§ï¼Œä»¥å…æ— æ³•è¯†åˆ«ï¼‰ |
| lv              | Number |         3         |        | å®¹é”™çº§åˆ«ï¼ˆä¸€èˆ¬ä¸ç”¨è®¾ç½®ï¼‰                                                                            |
| onval           | Boolean |       false       |        | ç›‘听val值变化自动重新生成二维码                                                                     |
| loadMake        | Boolean |       false       |        | ç»„件初始化完成后自动生成二维码,val需要有值                                                         |
| usingComponents | Boolean |       true       | false | æ˜¯å¦ä½¿ç”¨äº†è‡ªå®šä¹‰ç»„件模式(主要是为了修复非自定义组件模式时 v-if æ— æ³•生成二维码的问题)              |
| showLoading     | Boolean |       true       | false | æ˜¯å¦æ˜¾ç¤ºloading                                                                                     |
| loadingText     | String |   äºŒç»´ç ç”Ÿæˆä¸­   |        | loading文字                                                                                         |
### æ–¹æ³•
| æ–¹æ³•名       | å‚æ•° | é»˜è®¤å€¼ | è¯´æ˜Ž                                                |
| :----------- | :--: | :----: | :-------------------------------------------------- |
| _makeCode()  |      |        | ç”ŸæˆäºŒç»´ç                                           |
| _clearCode() |      |        | æ¸…空二维码(清空二维码会触发result回调 è¿”回值为空) |
| _saveCode()  |      |        | ä¿å­˜äºŒç»´ç åˆ°å›¾åº“                                    |
### äº‹ä»¶
| äº‹ä»¶å |             è¿”回值             |                                    è¯´æ˜Ž |
| :----- | :----------------------------: | --------------------------------------: |
| result | ç”Ÿæˆçš„图片base64或图片临时地址 | è¿”回二维码路径 æ³¨ï¼š_clearCode()后返回空 |
### æ„Ÿè°¢
[uni-app](https://uniapp.dcloud.io/ "uni-app")
[qrcode](https://github.com/aralejs/qrcode "qrcode")
src/components/geek-xd/components/geek-qrcode/geek-qrcode.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,205 @@
<template xlang="wxml" minapp="mpvue">
    <view class="geek-qrcode">
        <canvas class="geek-qrcode-canvas" :canvas-id="cid" :style="{width:cpSize+'px',height:cpSize+'px'}" />
        <image v-show="show" :src="result" :style="{width:cpSize+'px',height:cpSize+'px'}" />
    </view>
</template>
<script>
import QRCode from "./qrcode.js"
let qrcode
export default {
    name: "geek-qrcode",
    props: {
        cid: {
            type: String,
            default: 'geek-qrcode-canvas'
        },
        size: {
            type: Number,
            default: 200
        },
        unit: {
            type: String,
            default: 'upx'
        },
        show: {
            type: Boolean,
            default: true
        },
        val: {
            type: String,
            default: ''
        },
        background: {
            type: String,
            default: '#ffffff'
        },
        foreground: {
            type: String,
            default: '#000000'
        },
        pdground: {
            type: String,
            default: '#000000'
        },
        icon: {
            type: String,
            default: ''
        },
        iconSize: {
            type: Number,
            default: 40
        },
        lv: {
            type: Number,
            default: 3
        },
        onval: {
            type: Boolean,
            default: false
        },
        loadMake: {
            type: Boolean,
            default: false
        },
        usingComponents: {
            type: Boolean,
            default: true
        },
        showLoading: {
            type: Boolean,
            default: true
        },
        loadingText: {
            type: String,
            default: '二维码生成中'
        },
    },
    data() {
        return {
            result: '',
        }
    },
    methods: {
        _makeCode() {
            let that = this
            if (!this._empty(this.val)) {
                qrcode = new QRCode({
                    context: that, // ä¸Šä¸‹æ–‡çŽ¯å¢ƒ
                    canvasId:that.cid, // canvas-id
                    usingComponents: that.usingComponents, // æ˜¯å¦æ˜¯è‡ªå®šä¹‰ç»„ä»¶
                    showLoading: that.showLoading, // æ˜¯å¦æ˜¾ç¤ºloading
                    loadingText: that.loadingText, // loading文字
                    text: that.val, // ç”Ÿæˆå†…容
                    size: that.cpSize, // äºŒç»´ç å¤§å°
                    background: that.background, // èƒŒæ™¯è‰²
                    foreground: that.foreground, // å‰æ™¯è‰²
                    pdground: that.pdground, // å®šä½è§’点颜色
                    correctLevel: that.lv, // å®¹é”™çº§åˆ«
                    image: that.icon, // äºŒç»´ç å›¾æ ‡
                    imageSize: that.iconSize,// äºŒç»´ç å›¾æ ‡å¤§å°
                    cbResult: function (res) { // ç”ŸæˆäºŒç»´ç çš„回调
                        that._result(res)
                    },
                });
            } else {
                uni.showToast({
                    title: '二维码内容不能为空',
                    icon: 'none',
                    duration: 2000
                });
            }
        },
        _clearCode() {
            this._result('')
            qrcode.clear()
        },
        _saveCode() {
            let that = this;
            if (this.result != "") {
                uni.saveImageToPhotosAlbum({
                    filePath: that.result,
                    success: function () {
                        uni.showToast({
                            title: '二维码保存成功',
                            icon: 'success',
                            duration: 2000
                        });
                    }
                });
            }
        },
        _result(res) {
            this.result = res;
            this.$emit('result', res)
        },
        _empty(v) {
            let tp = typeof v,
                rt = false;
            if (tp == "number" && String(v) == "") {
                rt = true
            } else if (tp == "undefined") {
                rt = true
            } else if (tp == "object") {
                if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
            } else if (tp == "string") {
                if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
            } else if (tp == "function") {
                rt = false
            }
            return rt
        }
    },
    watch: {
        size: function (n, o) {
            if (n != o && !this._empty(n)) {
                this.cSize = n
                if (!this._empty(this.val)) {
                    setTimeout(() => {
                        this._makeCode()
                    }, 100);
                }
            }
        },
        val: function (n, o) {
            if (this.onval) {
                if (n != o && !this._empty(n)) {
                    setTimeout(() => {
                        this._makeCode()
                    }, 0);
                }
            }
        }
    },
    computed: {
        cpSize() {
            if(this.unit == "upx"){
                return uni.upx2px(this.size)
            }else{
                return this.size
            }
        }
    },
    mounted: function () {
        if (this.loadMake) {
            if (!this._empty(this.val)) {
                setTimeout(() => {
                    this._makeCode()
                }, 0);
            }
        }
    },
}
</script>
<style>
.geek-qrcode {
  position: relative;
}
.geek-qrcode-canvas {
  position: fixed;
  top: -99999upx;
  left: -99999upx;
  z-index: -99999;
}
</style>
src/components/geek-xd/components/geek-qrcode/qrcode.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1206 @@
let QRCode = {};
(function () {
    /**
     * èŽ·å–å•ä¸ªå­—ç¬¦çš„utf8编码
     * unicode BMP平面约65535个字符
     * @param {num} code
     * return {array}
     */
    function unicodeFormat8(code) {
        // 1 byte
        var c0, c1, c2;
        if (code < 128) {
            return [code];
            // 2 bytes
        } else if (code < 2048) {
            c0 = 192 + (code >> 6);
            c1 = 128 + (code & 63);
            return [c0, c1];
            // 3 bytes
        } else {
            c0 = 224 + (code >> 12);
            c1 = 128 + (code >> 6 & 63);
            c2 = 128 + (code & 63);
            return [c0, c1, c2];
        }
    }
    /**
     * èŽ·å–å­—ç¬¦ä¸²çš„utf8编码字节串
     * @param {string} string
     * @return {array}
     */
    function getUTF8Bytes(string) {
        var utf8codes = [];
        for (var i = 0; i < string.length; i++) {
            var code = string.charCodeAt(i);
            var utf8 = unicodeFormat8(code);
            for (var j = 0; j < utf8.length; j++) {
                utf8codes.push(utf8[j]);
            }
        }
        return utf8codes;
    }
    /**
     * äºŒç»´ç ç®—法实现
     * @param {string} data              è¦ç¼–码的信息字符串
     * @param {num} errorCorrectLevel çº é”™ç­‰çº§
     */
    function QRCodeAlg(data, errorCorrectLevel) {
        this.typeNumber = -1; //版本
        this.errorCorrectLevel = errorCorrectLevel;
        this.modules = null; //二维矩阵,存放最终结果
        this.moduleCount = 0; //矩阵大小
        this.dataCache = null; //数据缓存
        this.rsBlocks = null; //版本数据信息
        this.totalDataCount = -1; //可使用的数据量
        this.data = data;
        this.utf8bytes = getUTF8Bytes(data);
        this.make();
    }
    QRCodeAlg.prototype = {
        constructor: QRCodeAlg,
        /**
         * èŽ·å–äºŒç»´ç çŸ©é˜µå¤§å°
         * @return {num} çŸ©é˜µå¤§å°
         */
        getModuleCount: function () {
            return this.moduleCount;
        },
        /**
         * ç¼–码
         */
        make: function () {
            this.getRightType();
            this.dataCache = this.createData();
            this.createQrcode();
        },
        /**
         * è®¾ç½®äºŒä½çŸ©é˜µåŠŸèƒ½å›¾å½¢
         * @param  {bool} test è¡¨ç¤ºæ˜¯å¦åœ¨å¯»æ‰¾æœ€å¥½æŽ©è†œé˜¶æ®µ
         * @param  {num} maskPattern æŽ©è†œçš„版本
         */
        makeImpl: function (maskPattern) {
            this.moduleCount = this.typeNumber * 4 + 17;
            this.modules = new Array(this.moduleCount);
            for (var row = 0; row < this.moduleCount; row++) {
                this.modules[row] = new Array(this.moduleCount);
            }
            this.setupPositionProbePattern(0, 0);
            this.setupPositionProbePattern(this.moduleCount - 7, 0);
            this.setupPositionProbePattern(0, this.moduleCount - 7);
            this.setupPositionAdjustPattern();
            this.setupTimingPattern();
            this.setupTypeInfo(true, maskPattern);
            if (this.typeNumber >= 7) {
                this.setupTypeNumber(true);
            }
            this.mapData(this.dataCache, maskPattern);
        },
        /**
         * è®¾ç½®äºŒç»´ç çš„位置探测图形
         * @param  {num} row æŽ¢æµ‹å›¾å½¢çš„中心横坐标
         * @param  {num} col æŽ¢æµ‹å›¾å½¢çš„中心纵坐标
         */
        setupPositionProbePattern: function (row, col) {
            for (var r = -1; r <= 7; r++) {
                if (row + r <= -1 || this.moduleCount <= row + r) continue;
                for (var c = -1; c <= 7; c++) {
                    if (col + c <= -1 || this.moduleCount <= col + c) continue;
                    if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || (0 <= c && c <= 6 && (r == 0 || r == 6)) || (2 <= r && r <= 4 && 2 <= c && c <= 4)) {
                        this.modules[row + r][col + c] = true;
                    } else {
                        this.modules[row + r][col + c] = false;
                    }
                }
            }
        },
        /**
         * åˆ›å»ºäºŒç»´ç 
         * @return {[type]} [description]
         */
        createQrcode: function () {
            var minLostPoint = 0;
            var pattern = 0;
            var bestModules = null;
            for (var i = 0; i < 8; i++) {
                this.makeImpl(i);
                var lostPoint = QRUtil.getLostPoint(this);
                if (i == 0 || minLostPoint > lostPoint) {
                    minLostPoint = lostPoint;
                    pattern = i;
                    bestModules = this.modules;
                }
            }
            this.modules = bestModules;
            this.setupTypeInfo(false, pattern);
            if (this.typeNumber >= 7) {
                this.setupTypeNumber(false);
            }
        },
        /**
         * è®¾ç½®å®šä½å›¾å½¢
         * @return {[type]} [description]
         */
        setupTimingPattern: function () {
            for (var r = 8; r < this.moduleCount - 8; r++) {
                if (this.modules[r][6] != null) {
                    continue;
                }
                this.modules[r][6] = (r % 2 == 0);
                if (this.modules[6][r] != null) {
                    continue;
                }
                this.modules[6][r] = (r % 2 == 0);
            }
        },
        /**
         * è®¾ç½®çŸ«æ­£å›¾å½¢
         * @return {[type]} [description]
         */
        setupPositionAdjustPattern: function () {
            var pos = QRUtil.getPatternPosition(this.typeNumber);
            for (var i = 0; i < pos.length; i++) {
                for (var j = 0; j < pos.length; j++) {
                    var row = pos[i];
                    var col = pos[j];
                    if (this.modules[row][col] != null) {
                        continue;
                    }
                    for (var r = -2; r <= 2; r++) {
                        for (var c = -2; c <= 2; c++) {
                            if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) {
                                this.modules[row + r][col + c] = true;
                            } else {
                                this.modules[row + r][col + c] = false;
                            }
                        }
                    }
                }
            }
        },
        /**
         * è®¾ç½®ç‰ˆæœ¬ä¿¡æ¯ï¼ˆ7以上版本才有)
         * @param  {bool} test æ˜¯å¦å¤„于判断最佳掩膜阶段
         * @return {[type]}      [description]
         */
        setupTypeNumber: function (test) {
            var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
            for (var i = 0; i < 18; i++) {
                var mod = (!test && ((bits >> i) & 1) == 1);
                this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
                this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
            }
        },
        /**
         * è®¾ç½®æ ¼å¼ä¿¡æ¯ï¼ˆçº é”™ç­‰çº§å’ŒæŽ©è†œç‰ˆæœ¬ï¼‰
         * @param  {bool} test
         * @param  {num} maskPattern æŽ©è†œç‰ˆæœ¬
         * @return {}
         */
        setupTypeInfo: function (test, maskPattern) {
            var data = (QRErrorCorrectLevel[this.errorCorrectLevel] << 3) | maskPattern;
            var bits = QRUtil.getBCHTypeInfo(data);
            // vertical
            for (var i = 0; i < 15; i++) {
                var mod = (!test && ((bits >> i) & 1) == 1);
                if (i < 6) {
                    this.modules[i][8] = mod;
                } else if (i < 8) {
                    this.modules[i + 1][8] = mod;
                } else {
                    this.modules[this.moduleCount - 15 + i][8] = mod;
                }
                // horizontal
                var mod = (!test && ((bits >> i) & 1) == 1);
                if (i < 8) {
                    this.modules[8][this.moduleCount - i - 1] = mod;
                } else if (i < 9) {
                    this.modules[8][15 - i - 1 + 1] = mod;
                } else {
                    this.modules[8][15 - i - 1] = mod;
                }
            }
            // fixed module
            this.modules[this.moduleCount - 8][8] = (!test);
        },
        /**
         * æ•°æ®ç¼–码
         * @return {[type]} [description]
         */
        createData: function () {
            var buffer = new QRBitBuffer();
            var lengthBits = this.typeNumber > 9 ? 16 : 8;
            buffer.put(4, 4); //添加模式
            buffer.put(this.utf8bytes.length, lengthBits);
            for (var i = 0, l = this.utf8bytes.length; i < l; i++) {
                buffer.put(this.utf8bytes[i], 8);
            }
            if (buffer.length + 4 <= this.totalDataCount * 8) {
                buffer.put(0, 4);
            }
            // padding
            while (buffer.length % 8 != 0) {
                buffer.putBit(false);
            }
            // padding
            while (true) {
                if (buffer.length >= this.totalDataCount * 8) {
                    break;
                }
                buffer.put(QRCodeAlg.PAD0, 8);
                if (buffer.length >= this.totalDataCount * 8) {
                    break;
                }
                buffer.put(QRCodeAlg.PAD1, 8);
            }
            return this.createBytes(buffer);
        },
        /**
         * çº é”™ç ç¼–码
         * @param  {buffer} buffer æ•°æ®ç¼–码
         * @return {[type]}
         */
        createBytes: function (buffer) {
            var offset = 0;
            var maxDcCount = 0;
            var maxEcCount = 0;
            var length = this.rsBlock.length / 3;
            var rsBlocks = new Array();
            for (var i = 0; i < length; i++) {
                var count = this.rsBlock[i * 3 + 0];
                var totalCount = this.rsBlock[i * 3 + 1];
                var dataCount = this.rsBlock[i * 3 + 2];
                for (var j = 0; j < count; j++) {
                    rsBlocks.push([dataCount, totalCount]);
                }
            }
            var dcdata = new Array(rsBlocks.length);
            var ecdata = new Array(rsBlocks.length);
            for (var r = 0; r < rsBlocks.length; r++) {
                var dcCount = rsBlocks[r][0];
                var ecCount = rsBlocks[r][1] - dcCount;
                maxDcCount = Math.max(maxDcCount, dcCount);
                maxEcCount = Math.max(maxEcCount, ecCount);
                dcdata[r] = new Array(dcCount);
                for (var i = 0; i < dcdata[r].length; i++) {
                    dcdata[r][i] = 0xff & buffer.buffer[i + offset];
                }
                offset += dcCount;
                var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
                var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);
                var modPoly = rawPoly.mod(rsPoly);
                ecdata[r] = new Array(rsPoly.getLength() - 1);
                for (var i = 0; i < ecdata[r].length; i++) {
                    var modIndex = i + modPoly.getLength() - ecdata[r].length;
                    ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;
                }
            }
            var data = new Array(this.totalDataCount);
            var index = 0;
            for (var i = 0; i < maxDcCount; i++) {
                for (var r = 0; r < rsBlocks.length; r++) {
                    if (i < dcdata[r].length) {
                        data[index++] = dcdata[r][i];
                    }
                }
            }
            for (var i = 0; i < maxEcCount; i++) {
                for (var r = 0; r < rsBlocks.length; r++) {
                    if (i < ecdata[r].length) {
                        data[index++] = ecdata[r][i];
                    }
                }
            }
            return data;
        },
        /**
         * å¸ƒç½®æ¨¡å—,构建最终信息
         * @param  {} data
         * @param  {} maskPattern
         * @return {}
         */
        mapData: function (data, maskPattern) {
            var inc = -1;
            var row = this.moduleCount - 1;
            var bitIndex = 7;
            var byteIndex = 0;
            for (var col = this.moduleCount - 1; col > 0; col -= 2) {
                if (col == 6) col--;
                while (true) {
                    for (var c = 0; c < 2; c++) {
                        if (this.modules[row][col - c] == null) {
                            var dark = false;
                            if (byteIndex < data.length) {
                                dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
                            }
                            var mask = QRUtil.getMask(maskPattern, row, col - c);
                            if (mask) {
                                dark = !dark;
                            }
                            this.modules[row][col - c] = dark;
                            bitIndex--;
                            if (bitIndex == -1) {
                                byteIndex++;
                                bitIndex = 7;
                            }
                        }
                    }
                    row += inc;
                    if (row < 0 || this.moduleCount <= row) {
                        row -= inc;
                        inc = -inc;
                        break;
                    }
                }
            }
        }
    };
    /**
     * å¡«å……字段
     */
    QRCodeAlg.PAD0 = 0xEC;
    QRCodeAlg.PAD1 = 0x11;
    //---------------------------------------------------------------------
    // çº é”™ç­‰çº§å¯¹åº”的编码
    //---------------------------------------------------------------------
    var QRErrorCorrectLevel = [1, 0, 3, 2];
    //---------------------------------------------------------------------
    // æŽ©è†œç‰ˆæœ¬
    //---------------------------------------------------------------------
    var QRMaskPattern = {
        PATTERN000: 0,
        PATTERN001: 1,
        PATTERN010: 2,
        PATTERN011: 3,
        PATTERN100: 4,
        PATTERN101: 5,
        PATTERN110: 6,
        PATTERN111: 7
    };
    //---------------------------------------------------------------------
    // å·¥å…·ç±»
    //---------------------------------------------------------------------
    var QRUtil = {
        /*
        æ¯ä¸ªç‰ˆæœ¬çŸ«æ­£å›¾å½¢çš„位置
         */
        PATTERN_POSITION_TABLE: [
            [],
            [6, 18],
            [6, 22],
            [6, 26],
            [6, 30],
            [6, 34],
            [6, 22, 38],
            [6, 24, 42],
            [6, 26, 46],
            [6, 28, 50],
            [6, 30, 54],
            [6, 32, 58],
            [6, 34, 62],
            [6, 26, 46, 66],
            [6, 26, 48, 70],
            [6, 26, 50, 74],
            [6, 30, 54, 78],
            [6, 30, 56, 82],
            [6, 30, 58, 86],
            [6, 34, 62, 90],
            [6, 28, 50, 72, 94],
            [6, 26, 50, 74, 98],
            [6, 30, 54, 78, 102],
            [6, 28, 54, 80, 106],
            [6, 32, 58, 84, 110],
            [6, 30, 58, 86, 114],
            [6, 34, 62, 90, 118],
            [6, 26, 50, 74, 98, 122],
            [6, 30, 54, 78, 102, 126],
            [6, 26, 52, 78, 104, 130],
            [6, 30, 56, 82, 108, 134],
            [6, 34, 60, 86, 112, 138],
            [6, 30, 58, 86, 114, 142],
            [6, 34, 62, 90, 118, 146],
            [6, 30, 54, 78, 102, 126, 150],
            [6, 24, 50, 76, 102, 128, 154],
            [6, 28, 54, 80, 106, 132, 158],
            [6, 32, 58, 84, 110, 136, 162],
            [6, 26, 54, 82, 110, 138, 166],
            [6, 30, 58, 86, 114, 142, 170]
        ],
        G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
        G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
        G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
        /*
        BCH编码格式信息
         */
        getBCHTypeInfo: function (data) {
            var d = data << 10;
            while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
                d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)));
            }
            return ((data << 10) | d) ^ QRUtil.G15_MASK;
        },
        /*
        BCH编码版本信息
         */
        getBCHTypeNumber: function (data) {
            var d = data << 12;
            while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
                d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)));
            }
            return (data << 12) | d;
        },
        /*
        èŽ·å–BCH位信息
         */
        getBCHDigit: function (data) {
            var digit = 0;
            while (data != 0) {
                digit++;
                data >>>= 1;
            }
            return digit;
        },
        /*
        èŽ·å–ç‰ˆæœ¬å¯¹åº”çš„çŸ«æ­£å›¾å½¢ä½ç½®
         */
        getPatternPosition: function (typeNumber) {
            return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
        },
        /*
        æŽ©è†œç®—法
         */
        getMask: function (maskPattern, i, j) {
            switch (maskPattern) {
                case QRMaskPattern.PATTERN000:
                    return (i + j) % 2 == 0;
                case QRMaskPattern.PATTERN001:
                    return i % 2 == 0;
                case QRMaskPattern.PATTERN010:
                    return j % 3 == 0;
                case QRMaskPattern.PATTERN011:
                    return (i + j) % 3 == 0;
                case QRMaskPattern.PATTERN100:
                    return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
                case QRMaskPattern.PATTERN101:
                    return (i * j) % 2 + (i * j) % 3 == 0;
                case QRMaskPattern.PATTERN110:
                    return ((i * j) % 2 + (i * j) % 3) % 2 == 0;
                case QRMaskPattern.PATTERN111:
                    return ((i * j) % 3 + (i + j) % 2) % 2 == 0;
                default:
                    throw new Error("bad maskPattern:" + maskPattern);
            }
        },
        /*
        èŽ·å–RS的纠错多项式
         */
        getErrorCorrectPolynomial: function (errorCorrectLength) {
            var a = new QRPolynomial([1], 0);
            for (var i = 0; i < errorCorrectLength; i++) {
                a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));
            }
            return a;
        },
        /*
        èŽ·å–è¯„ä»·
         */
        getLostPoint: function (qrCode) {
            var moduleCount = qrCode.getModuleCount(),
                lostPoint = 0,
                darkCount = 0;
            for (var row = 0; row < moduleCount; row++) {
                var sameCount = 0;
                var head = qrCode.modules[row][0];
                for (var col = 0; col < moduleCount; col++) {
                    var current = qrCode.modules[row][col];
                    //level 3 è¯„ä»·
                    if (col < moduleCount - 6) {
                        if (current && !qrCode.modules[row][col + 1] && qrCode.modules[row][col + 2] && qrCode.modules[row][col + 3] && qrCode.modules[row][col + 4] && !qrCode.modules[row][col + 5] && qrCode.modules[row][col + 6]) {
                            if (col < moduleCount - 10) {
                                if (qrCode.modules[row][col + 7] && qrCode.modules[row][col + 8] && qrCode.modules[row][col + 9] && qrCode.modules[row][col + 10]) {
                                    lostPoint += 40;
                                }
                            } else if (col > 3) {
                                if (qrCode.modules[row][col - 1] && qrCode.modules[row][col - 2] && qrCode.modules[row][col - 3] && qrCode.modules[row][col - 4]) {
                                    lostPoint += 40;
                                }
                            }
                        }
                    }
                    //level 2 è¯„ä»·
                    if ((row < moduleCount - 1) && (col < moduleCount - 1)) {
                        var count = 0;
                        if (current) count++;
                        if (qrCode.modules[row + 1][col]) count++;
                        if (qrCode.modules[row][col + 1]) count++;
                        if (qrCode.modules[row + 1][col + 1]) count++;
                        if (count == 0 || count == 4) {
                            lostPoint += 3;
                        }
                    }
                    //level 1 è¯„ä»·
                    if (head ^ current) {
                        sameCount++;
                    } else {
                        head = current;
                        if (sameCount >= 5) {
                            lostPoint += (3 + sameCount - 5);
                        }
                        sameCount = 1;
                    }
                    //level 4 è¯„ä»·
                    if (current) {
                        darkCount++;
                    }
                }
            }
            for (var col = 0; col < moduleCount; col++) {
                var sameCount = 0;
                var head = qrCode.modules[0][col];
                for (var row = 0; row < moduleCount; row++) {
                    var current = qrCode.modules[row][col];
                    //level 3 è¯„ä»·
                    if (row < moduleCount - 6) {
                        if (current && !qrCode.modules[row + 1][col] && qrCode.modules[row + 2][col] && qrCode.modules[row + 3][col] && qrCode.modules[row + 4][col] && !qrCode.modules[row + 5][col] && qrCode.modules[row + 6][col]) {
                            if (row < moduleCount - 10) {
                                if (qrCode.modules[row + 7][col] && qrCode.modules[row + 8][col] && qrCode.modules[row + 9][col] && qrCode.modules[row + 10][col]) {
                                    lostPoint += 40;
                                }
                            } else if (row > 3) {
                                if (qrCode.modules[row - 1][col] && qrCode.modules[row - 2][col] && qrCode.modules[row - 3][col] && qrCode.modules[row - 4][col]) {
                                    lostPoint += 40;
                                }
                            }
                        }
                    }
                    //level 1 è¯„ä»·
                    if (head ^ current) {
                        sameCount++;
                    } else {
                        head = current;
                        if (sameCount >= 5) {
                            lostPoint += (3 + sameCount - 5);
                        }
                        sameCount = 1;
                    }
                }
            }
            // LEVEL4
            var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
            lostPoint += ratio * 10;
            return lostPoint;
        }
    };
    //---------------------------------------------------------------------
    // QRMath使用的数学工具
    //---------------------------------------------------------------------
    var QRMath = {
        /*
        å°†n转化为a^m
         */
        glog: function (n) {
            if (n < 1) {
                throw new Error("glog(" + n + ")");
            }
            return QRMath.LOG_TABLE[n];
        },
        /*
        å°†a^m转化为n
         */
        gexp: function (n) {
            while (n < 0) {
                n += 255;
            }
            while (n >= 256) {
                n -= 255;
            }
            return QRMath.EXP_TABLE[n];
        },
        EXP_TABLE: new Array(256),
        LOG_TABLE: new Array(256)
    };
    for (var i = 0; i < 8; i++) {
        QRMath.EXP_TABLE[i] = 1 << i;
    }
    for (var i = 8; i < 256; i++) {
        QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
    }
    for (var i = 0; i < 255; i++) {
        QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
    }
    //---------------------------------------------------------------------
    // QRPolynomial å¤šé¡¹å¼
    //---------------------------------------------------------------------
    /**
     * å¤šé¡¹å¼ç±»
     * @param {Array} num   ç³»æ•°
     * @param {num} shift a^shift
     */
    function QRPolynomial(num, shift) {
        if (num.length == undefined) {
            throw new Error(num.length + "/" + shift);
        }
        var offset = 0;
        while (offset < num.length && num[offset] == 0) {
            offset++;
        }
        this.num = new Array(num.length - offset + shift);
        for (var i = 0; i < num.length - offset; i++) {
            this.num[i] = num[i + offset];
        }
    }
    QRPolynomial.prototype = {
        get: function (index) {
            return this.num[index];
        },
        getLength: function () {
            return this.num.length;
        },
        /**
         * å¤šé¡¹å¼ä¹˜æ³•
         * @param  {QRPolynomial} e è¢«ä¹˜å¤šé¡¹å¼
         * @return {[type]}   [description]
         */
        multiply: function (e) {
            var num = new Array(this.getLength() + e.getLength() - 1);
            for (var i = 0; i < this.getLength(); i++) {
                for (var j = 0; j < e.getLength(); j++) {
                    num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
                }
            }
            return new QRPolynomial(num, 0);
        },
        /**
         * å¤šé¡¹å¼æ¨¡è¿ç®—
         * @param  {QRPolynomial} e æ¨¡å¤šé¡¹å¼
         * @return {}
         */
        mod: function (e) {
            var tl = this.getLength(),
                el = e.getLength();
            if (tl - el < 0) {
                return this;
            }
            var num = new Array(tl);
            for (var i = 0; i < tl; i++) {
                num[i] = this.get(i);
            }
            while (num.length >= el) {
                var ratio = QRMath.glog(num[0]) - QRMath.glog(e.get(0));
                for (var i = 0; i < e.getLength(); i++) {
                    num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
                }
                while (num[0] == 0) {
                    num.shift();
                }
            }
            return new QRPolynomial(num, 0);
        }
    };
    //---------------------------------------------------------------------
    // RS_BLOCK_TABLE
    //---------------------------------------------------------------------
    /*
    äºŒç»´ç å„个版本信息[块数, æ¯å—中的数据块数, æ¯å—中的信息块数]
     */
    var RS_BLOCK_TABLE = [
        // L
        // M
        // Q
        // H
        // 1
        [1, 26, 19],
        [1, 26, 16],
        [1, 26, 13],
        [1, 26, 9],
        // 2
        [1, 44, 34],
        [1, 44, 28],
        [1, 44, 22],
        [1, 44, 16],
        // 3
        [1, 70, 55],
        [1, 70, 44],
        [2, 35, 17],
        [2, 35, 13],
        // 4
        [1, 100, 80],
        [2, 50, 32],
        [2, 50, 24],
        [4, 25, 9],
        // 5
        [1, 134, 108],
        [2, 67, 43],
        [2, 33, 15, 2, 34, 16],
        [2, 33, 11, 2, 34, 12],
        // 6
        [2, 86, 68],
        [4, 43, 27],
        [4, 43, 19],
        [4, 43, 15],
        // 7
        [2, 98, 78],
        [4, 49, 31],
        [2, 32, 14, 4, 33, 15],
        [4, 39, 13, 1, 40, 14],
        // 8
        [2, 121, 97],
        [2, 60, 38, 2, 61, 39],
        [4, 40, 18, 2, 41, 19],
        [4, 40, 14, 2, 41, 15],
        // 9
        [2, 146, 116],
        [3, 58, 36, 2, 59, 37],
        [4, 36, 16, 4, 37, 17],
        [4, 36, 12, 4, 37, 13],
        // 10
        [2, 86, 68, 2, 87, 69],
        [4, 69, 43, 1, 70, 44],
        [6, 43, 19, 2, 44, 20],
        [6, 43, 15, 2, 44, 16],
        // 11
        [4, 101, 81],
        [1, 80, 50, 4, 81, 51],
        [4, 50, 22, 4, 51, 23],
        [3, 36, 12, 8, 37, 13],
        // 12
        [2, 116, 92, 2, 117, 93],
        [6, 58, 36, 2, 59, 37],
        [4, 46, 20, 6, 47, 21],
        [7, 42, 14, 4, 43, 15],
        // 13
        [4, 133, 107],
        [8, 59, 37, 1, 60, 38],
        [8, 44, 20, 4, 45, 21],
        [12, 33, 11, 4, 34, 12],
        // 14
        [3, 145, 115, 1, 146, 116],
        [4, 64, 40, 5, 65, 41],
        [11, 36, 16, 5, 37, 17],
        [11, 36, 12, 5, 37, 13],
        // 15
        [5, 109, 87, 1, 110, 88],
        [5, 65, 41, 5, 66, 42],
        [5, 54, 24, 7, 55, 25],
        [11, 36, 12],
        // 16
        [5, 122, 98, 1, 123, 99],
        [7, 73, 45, 3, 74, 46],
        [15, 43, 19, 2, 44, 20],
        [3, 45, 15, 13, 46, 16],
        // 17
        [1, 135, 107, 5, 136, 108],
        [10, 74, 46, 1, 75, 47],
        [1, 50, 22, 15, 51, 23],
        [2, 42, 14, 17, 43, 15],
        // 18
        [5, 150, 120, 1, 151, 121],
        [9, 69, 43, 4, 70, 44],
        [17, 50, 22, 1, 51, 23],
        [2, 42, 14, 19, 43, 15],
        // 19
        [3, 141, 113, 4, 142, 114],
        [3, 70, 44, 11, 71, 45],
        [17, 47, 21, 4, 48, 22],
        [9, 39, 13, 16, 40, 14],
        // 20
        [3, 135, 107, 5, 136, 108],
        [3, 67, 41, 13, 68, 42],
        [15, 54, 24, 5, 55, 25],
        [15, 43, 15, 10, 44, 16],
        // 21
        [4, 144, 116, 4, 145, 117],
        [17, 68, 42],
        [17, 50, 22, 6, 51, 23],
        [19, 46, 16, 6, 47, 17],
        // 22
        [2, 139, 111, 7, 140, 112],
        [17, 74, 46],
        [7, 54, 24, 16, 55, 25],
        [34, 37, 13],
        // 23
        [4, 151, 121, 5, 152, 122],
        [4, 75, 47, 14, 76, 48],
        [11, 54, 24, 14, 55, 25],
        [16, 45, 15, 14, 46, 16],
        // 24
        [6, 147, 117, 4, 148, 118],
        [6, 73, 45, 14, 74, 46],
        [11, 54, 24, 16, 55, 25],
        [30, 46, 16, 2, 47, 17],
        // 25
        [8, 132, 106, 4, 133, 107],
        [8, 75, 47, 13, 76, 48],
        [7, 54, 24, 22, 55, 25],
        [22, 45, 15, 13, 46, 16],
        // 26
        [10, 142, 114, 2, 143, 115],
        [19, 74, 46, 4, 75, 47],
        [28, 50, 22, 6, 51, 23],
        [33, 46, 16, 4, 47, 17],
        // 27
        [8, 152, 122, 4, 153, 123],
        [22, 73, 45, 3, 74, 46],
        [8, 53, 23, 26, 54, 24],
        [12, 45, 15, 28, 46, 16],
        // 28
        [3, 147, 117, 10, 148, 118],
        [3, 73, 45, 23, 74, 46],
        [4, 54, 24, 31, 55, 25],
        [11, 45, 15, 31, 46, 16],
        // 29
        [7, 146, 116, 7, 147, 117],
        [21, 73, 45, 7, 74, 46],
        [1, 53, 23, 37, 54, 24],
        [19, 45, 15, 26, 46, 16],
        // 30
        [5, 145, 115, 10, 146, 116],
        [19, 75, 47, 10, 76, 48],
        [15, 54, 24, 25, 55, 25],
        [23, 45, 15, 25, 46, 16],
        // 31
        [13, 145, 115, 3, 146, 116],
        [2, 74, 46, 29, 75, 47],
        [42, 54, 24, 1, 55, 25],
        [23, 45, 15, 28, 46, 16],
        // 32
        [17, 145, 115],
        [10, 74, 46, 23, 75, 47],
        [10, 54, 24, 35, 55, 25],
        [19, 45, 15, 35, 46, 16],
        // 33
        [17, 145, 115, 1, 146, 116],
        [14, 74, 46, 21, 75, 47],
        [29, 54, 24, 19, 55, 25],
        [11, 45, 15, 46, 46, 16],
        // 34
        [13, 145, 115, 6, 146, 116],
        [14, 74, 46, 23, 75, 47],
        [44, 54, 24, 7, 55, 25],
        [59, 46, 16, 1, 47, 17],
        // 35
        [12, 151, 121, 7, 152, 122],
        [12, 75, 47, 26, 76, 48],
        [39, 54, 24, 14, 55, 25],
        [22, 45, 15, 41, 46, 16],
        // 36
        [6, 151, 121, 14, 152, 122],
        [6, 75, 47, 34, 76, 48],
        [46, 54, 24, 10, 55, 25],
        [2, 45, 15, 64, 46, 16],
        // 37
        [17, 152, 122, 4, 153, 123],
        [29, 74, 46, 14, 75, 47],
        [49, 54, 24, 10, 55, 25],
        [24, 45, 15, 46, 46, 16],
        // 38
        [4, 152, 122, 18, 153, 123],
        [13, 74, 46, 32, 75, 47],
        [48, 54, 24, 14, 55, 25],
        [42, 45, 15, 32, 46, 16],
        // 39
        [20, 147, 117, 4, 148, 118],
        [40, 75, 47, 7, 76, 48],
        [43, 54, 24, 22, 55, 25],
        [10, 45, 15, 67, 46, 16],
        // 40
        [19, 148, 118, 6, 149, 119],
        [18, 75, 47, 31, 76, 48],
        [34, 54, 24, 34, 55, 25],
        [20, 45, 15, 61, 46, 16]
    ];
    /**
     * æ ¹æ®æ•°æ®èŽ·å–å¯¹åº”ç‰ˆæœ¬
     * @return {[type]} [description]
     */
    QRCodeAlg.prototype.getRightType = function () {
        for (var typeNumber = 1; typeNumber < 41; typeNumber++) {
            var rsBlock = RS_BLOCK_TABLE[(typeNumber - 1) * 4 + this.errorCorrectLevel];
            if (rsBlock == undefined) {
                throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + this.errorCorrectLevel);
            }
            var length = rsBlock.length / 3;
            var totalDataCount = 0;
            for (var i = 0; i < length; i++) {
                var count = rsBlock[i * 3 + 0];
                var dataCount = rsBlock[i * 3 + 2];
                totalDataCount += dataCount * count;
            }
            var lengthBytes = typeNumber > 9 ? 2 : 1;
            if (this.utf8bytes.length + lengthBytes < totalDataCount || typeNumber == 40) {
                this.typeNumber = typeNumber;
                this.rsBlock = rsBlock;
                this.totalDataCount = totalDataCount;
                break;
            }
        }
    };
    //---------------------------------------------------------------------
    // QRBitBuffer
    //---------------------------------------------------------------------
    function QRBitBuffer() {
        this.buffer = new Array();
        this.length = 0;
    }
    QRBitBuffer.prototype = {
        get: function (index) {
            var bufIndex = Math.floor(index / 8);
            return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1);
        },
        put: function (num, length) {
            for (var i = 0; i < length; i++) {
                this.putBit(((num >>> (length - i - 1)) & 1));
            }
        },
        putBit: function (bit) {
            var bufIndex = Math.floor(this.length / 8);
            if (this.buffer.length <= bufIndex) {
                this.buffer.push(0);
            }
            if (bit) {
                this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));
            }
            this.length++;
        }
    };
    // xzedit
    let qrcodeAlgObjCache = [];
    /**
     * äºŒç»´ç æž„造函数,主要用于绘制
     * @param  {参数列表} opt ä¼ é€’参数
     * @return {}
     */
    QRCode = function (opt) {
        //设置默认参数
        this.options = {
            text: '',
            size: 256,
            correctLevel: 3,
            background: '#ffffff',
            foreground: '#000000',
            pdground: '#000000',
            image: '',
            imageSize: 30,
            canvasId: opt.canvasId,
            context: opt.context,
            usingComponents: opt.usingComponents,
            showLoading: opt.showLoading,
            loadingText: opt.loadingText,
        };
        if (typeof opt === 'string') { // åªç¼–码ASCII字符串
            opt = {
                text: opt
            };
        }
        if (opt) {
            for (var i in opt) {
                this.options[i] = opt[i];
            }
        }
        //使用QRCodeAlg创建二维码结构
        var qrCodeAlg = null;
        for (var i = 0, l = qrcodeAlgObjCache.length; i < l; i++) {
            if (qrcodeAlgObjCache[i].text == this.options.text && qrcodeAlgObjCache[i].text.correctLevel == this.options.correctLevel) {
                qrCodeAlg = qrcodeAlgObjCache[i].obj;
                break;
            }
        }
        if (i == l) {
            qrCodeAlg = new QRCodeAlg(this.options.text, this.options.correctLevel);
            qrcodeAlgObjCache.push({
                text: this.options.text,
                correctLevel: this.options.correctLevel,
                obj: qrCodeAlg
            });
        }
        /**
         * è®¡ç®—矩阵点的前景色
         * @param {Obj} config
         * @param {Number} config.row ç‚¹x坐标
         * @param {Number} config.col ç‚¹y坐标
         * @param {Number} config.count çŸ©é˜µå¤§å°
         * @param {Number} config.options ç»„ä»¶çš„options
         * @return {String}
         */
        let getForeGround = function (config) {
            var options = config.options;
            if (options.pdground && (
                (config.row > 1 && config.row < 5 && config.col > 1 && config.col < 5) ||
                (config.row > (config.count - 6) && config.row < (config.count - 2) && config.col > 1 && config.col < 5) ||
                (config.row > 1 && config.row < 5 && config.col > (config.count - 6) && config.col < (config.count - 2))
            )) {
                return options.pdground;
            }
            return options.foreground;
        }
        // åˆ›å»ºcanvas
        let createCanvas = function (options) {
            if(options.showLoading){
                uni.showLoading({
                    title: options.loadingText,
                    mask: true
                });
            }
            var ctx = uni.createCanvasContext(options.canvasId, options.context);
            var count = qrCodeAlg.getModuleCount();
            var ratioSize = options.size;
            var ratioImgSize = options.imageSize;
            //计算每个点的长宽
            var tileW = (ratioSize / count).toPrecision(4);
            var tileH = (ratioSize / count).toPrecision(4);
            //绘制
            for (var row = 0; row < count; row++) {
                for (var col = 0; col < count; col++) {
                    var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW));
                    var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW));
                    var foreground = getForeGround({
                        row: row,
                        col: col,
                        count: count,
                        options: options
                    });
                    ctx.setFillStyle(qrCodeAlg.modules[row][col] ? foreground : options.background);
                    ctx.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
                }
            }
            if (options.image) {
                var x = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
                var y = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
                drawRoundedRect(ctx, x, y, ratioImgSize, ratioImgSize, 2, 6, true, true)
                ctx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
                // ç”»åœ†è§’矩形
                function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, stroke) {
                    ctxi.setLineWidth(lineWidth);
                    ctxi.setFillStyle(options.background);
                    ctxi.setStrokeStyle(options.background);
                    ctxi.beginPath(); // draw top and top right corner
                    ctxi.moveTo(x + r, y);
                    ctxi.arcTo(x + width, y, x + width, y + r, r); // draw right side and bottom right corner
                    ctxi.arcTo(x + width, y + height, x + width - r, y + height, r); // draw bottom and bottom left corner
                    ctxi.arcTo(x, y + height, x, y + height - r, r); // draw left and top left corner
                    ctxi.arcTo(x, y, x + r, y, r);
                    ctxi.closePath();
                    if (fill) {
                        ctxi.fill();
                    }
                    if (stroke) {
                        ctxi.stroke();
                    }
                }
            }
            setTimeout(() => {
                ctx.draw(true, () => {
                    // ä¿å­˜åˆ°ä¸´æ—¶åŒºåŸŸ
                    setTimeout(() => {
                        uni.canvasToTempFilePath({
                            width: options.width,
                            height: options.height,
                            destWidth: options.width,
                            destHeight: options.height,
                            canvasId: options.canvasId,
                            quality: Number(1),
                            success: function (res) {
                                if (options.cbResult) {
                                    // ç”±äºŽå®˜æ–¹è¿˜æ²¡æœ‰ç»Ÿä¸€æ­¤æŽ¥å£çš„输出字段,所以先判定下  æ”¯ä»˜å®ä¸º res.apFilePath
                                    if (!empty(res.tempFilePath)) {
                                        options.cbResult(res.tempFilePath)
                                    } else if (!empty(res.apFilePath)) {
                                        options.cbResult(res.apFilePath)
                                    } else {
                                        options.cbResult(res.tempFilePath)
                                    }
                                }
                            },
                            fail: function (res) {
                                if (options.cbResult) {
                                    options.cbResult(res)
                                }
                            },
                            complete: function () {
                                uni.hideLoading();
                            },
                        }, options.context);
                    }, options.text.length + 100);
                });
            }, options.usingComponents ? 0 : 150);
        }
        createCanvas(this.options);
        // ç©ºåˆ¤å®š
        let empty = function (v) {
            let tp = typeof v,
                rt = false;
            if (tp == "number" && String(v) == "") {
                rt = true
            } else if (tp == "undefined") {
                rt = true
            } else if (tp == "object") {
                if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
            } else if (tp == "string") {
                if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
            } else if (tp == "function") {
                rt = false
            }
            return rt
        }
    };
    QRCode.prototype.clear = function (fn) {
        var ctx = uni.createCanvasContext(this.options.canvasId, this.options.context)
        ctx.clearRect(0, 0, this.options.size, this.options.size)
        ctx.draw(false, () => {
            if (fn) {
                fn()
            }
        })
    };
})()
export default QRCode
src/components/geek-xd/components/geek-statistic/geek-statistic.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
<template>
    <view :style="labelStyle" class="title">{{ label }}</view>
    <view :style="numberStyle" class="number">{{ formatNumber(number,props.place) }}</view>
</template>
<script setup>
import { computed } from 'vue';
const props = defineProps({
    label: {
        type: String,
        default: "订单数量"
    },
    width: {
        type: Number,
        default: 300
    },
    labelColor: {
        type: String,
        default: '#white'
    },
    labelSize: {
        type: Number,
        default: 16
    },
    number: {
        type: Number,
        default: 80
    },
    numberColor: {
        type: String,
        default: 'red'
    },
    numberSize: {
        type: Number,
        default: 20
    },
    place: {
        type: Number,
        default: 2
    }
})
const labelStyle = computed(() => {
    return {
        width: `${props.width}rpx`,
        color: props.labelColor,
        fontSize: `${props.labelSize}px`
    }
})
const numberStyle = computed(() => {
    return {
        width: `${props.width}rpx`,
        color: props.numberColor,
        fontSize: `${props.numberSize}px`
    }
})
function formatNumber(num,place) {
    let fixedNum = Number(num).toFixed(place); // å°†æ•°å­—保留两位小数
    let parts = fixedNum.split('.'); // æ‹†åˆ†æ•´æ•°éƒ¨åˆ†å’Œå°æ•°éƒ¨åˆ†
    let integerPart = parts[0]; // æ•´æ•°éƒ¨åˆ†
    let decimalPart = parts[1]; // å°æ•°éƒ¨åˆ†
    // ä½¿ç”¨padStart方法补0到小数部分
    decimalPart = decimalPart.padStart(place, '0');
    return integerPart + '.' + decimalPart;
}
</script>
<style lang="scss" scoped>
.title {
    text-align: center;
}
.number {
    text-align: center;
}
</style>
src/components/geek-xd/types/index.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
export interface Menu {
    icon: string,
    label: string
}
export interface Commodity {
    img: string,
    title: string,
    subTitle?: string,
    price: number
}
export interface CommodityOrder extends Commodity {
    shop: string,
    status: string,
    num: number,
    label?:string
}
src/components/qiun-data-charts/changelog.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,320 @@
## 2.5.0-20230101(2023-01-01)
- ç§‹äº‘图表组件 ä¿®æ”¹æ¡ä»¶ç¼–译顺序,确保uniapp的cli方式的项目依赖不完整时可以正常显示
- ç§‹äº‘图表组件 æ¢å¤props属性directory的使用,以修复vue3项目中,开启echarts后,echarts目录识别错误的bug
- uCharts.js ä¿®å¤åŒºåŸŸå›¾ã€æ··åˆå›¾åªæœ‰ä¸€ä¸ªæ•°æ®æ—¶å›¾è¡¨æ˜¾ç¤ºä¸æ­£ç¡®çš„bug
- uCharts.js ä¿®å¤æŠ˜çº¿å›¾ã€åŒºåŸŸå›¾ä¸­æ—¶é—´è½´ç±»åˆ«å›¾è¡¨tooltip指示点显示不正确的bug
- uCharts.js ä¿®å¤x轴使用labelCount时,并且boundaryGap = 'justify' å¹¶ä¸”关闭Y轴显示的时候,最后一个坐标值不显示的bug
- uCharts.js ä¿®å¤æŠ˜çº¿å›¾åªæœ‰ä¸€ç»„数据时 ios16 æ¸²æŸ“颜色不正确的bug
- uCharts.js ä¿®å¤çŽ«ç‘°å›¾åŠå¾„æ˜¾ç¤ºä¸æ­£ç¡®çš„bug
- uCharts.js æŸ±çŠ¶å›¾ã€å±±å³°å›¾å¢žåŠ æ­£è´Ÿå›¾åŠŸèƒ½ï¼Œy轴网格如果需要显示0轴则由 min max åŠ splitNumber ç¡®å®šï¼ŒåŽç»­ç‰ˆæœ¬ä¼˜åŒ–自动显示0è½´
- uCharts.js æŸ±çж图column增加 opts.extra.column.labelPosition,数据标签位置,有效值为 outside外部, insideTop内顶部, center内中间, bottom内底部
- uCharts.js é›·è¾¾å›¾radar增加 opts.extra.radar.labelShow,否显示各项标识文案是,默认true
- uCharts.js æç¤ºçª—tooltip增加 opts.extra.tooltip.boxPadding,提示窗边框填充距离,默认3px
- uCharts.js æç¤ºçª—tooltip增加 opts.extra.tooltip.fontSize,提示窗字体大小配置,默认13px
- uCharts.js æç¤ºçª—tooltip增加 opts.extra.tooltip.lineHeight,提示窗文字行高,默认20px
- uCharts.js æç¤ºçª—tooltip增加 opts.extra.tooltip.legendShow,是否显示左侧图例,默认true
- uCharts.js æç¤ºçª—tooltip增加 opts.extra.tooltip.legendShape,图例形状,图例标识样式,有效值为 auto自动跟随图例, diamond◆, circle●, triangle▲, square■, rect▬, line-
- uCharts.js æ ‡è®°çº¿markLine增加 opts.extra.markLine.labelFontSize,字体大小配置,默认13px
- uCharts.js æ ‡è®°çº¿markLine增加 opts.extra.markLine.labelPadding,标签边框内填充距离,默认6px
- uCharts.js æŠ˜çº¿å›¾line增加 opts.extra.line.linearType,渐变色类型,可选值 none关闭渐变色,custom è‡ªå®šä¹‰æ¸å˜è‰²ã€‚使用自定义渐变色时请赋值serie.linearColor作为颜色值
- uCharts.js æŠ˜çº¿å›¾line增加 serie.linearColor,渐变色数组,格式为2维数组[起始位置,颜色值],例如[[0,'#0EE2F8'],[0.3,'#2BDCA8'],[0.6,'#1890FF'],[1,'#9A60B4']]
- uCharts.js æŠ˜çº¿å›¾line增加 opts.extra.line.onShadow,是否开启折线阴影,开启后请赋值serie.setShadow阴影设置
- uCharts.js æŠ˜çº¿å›¾line增加 serie.setShadow,阴影配置,格式为4位数组:[offsetX,offsetY,blur,color]
- uCharts.js æŠ˜çº¿å›¾line增加 opts.extra.line.animation,动画效果方向,可选值为vertical åž‚直动画效果,horizontal æ°´å¹³åŠ¨ç”»æ•ˆæžœ
- uCharts.js Xè½´xAxis增加 opts.xAxis.lineHeight,X轴字体行高,默认20px
- uCharts.js Xè½´xAxis增加 opts.xAxis.marginTop,X轴文字距离轴线的距离,默认0px
- uCharts.js Xè½´xAxis增加 opts.xAxis.title,当前X轴标题
- uCharts.js Xè½´xAxis增加 opts.xAxis.titleFontSize,标题字体大小,默认13px
- uCharts.js Xè½´xAxis增加 opts.xAxis.titleOffsetY,标题纵向偏移距离,负数为向上偏移,正数向下偏移
- uCharts.js Xè½´xAxis增加 opts.xAxis.titleOffsetX,标题横向偏移距离,负数为向左偏移,正数向右偏移
- uCharts.js Xè½´xAxis增加 opts.xAxis.titleFontColor,标题字体颜色,默认#666666
## æŠ¥é”™TypeError: Cannot read properties of undefined (reading 'length')
- å¦‚果是uni-modules版本组件,请先登录HBuilderX账号;
- åœ¨HBuilderX中的manifest.json,点击重新获取uniapp的appid,或者删除appid重新粘贴,重新运行;
- å¦‚果是cli项目请使用码云上的非uniCloud版本组件;
- æˆ–者添加uniCloud的依赖;
- æˆ–者使用原生uCharts;
## 2.4.5-20221130(2022-11-30)
- uCharts.js ä¼˜åŒ–tooltip当文字很多变为左侧显示时,如果画布仍显显示不下,提示框错位置变为以左侧0位置起画
- uCharts.js æŠ˜çº¿å›¾ä¿®å¤ç‰¹æ®Šæƒ…况下只有单点数据,并改变线宽后点变为圆形的bug
- uCharts.js ä¿®å¤Yè½´disabled启用后无效并报错的bug
- uCharts.js ä¿®å¤ä»ªè¡¨ç›˜èµ·å§‹ç»“束角度特殊情况下显示不正确的bug
- uCharts.js é›·è¾¾å›¾æ–°å¢žå‚æ•° opts.extra.radar.radius , è‡ªå®šä¹‰é›·è¾¾å›¾åŠå¾„
- uCharts.js æŠ˜çº¿å›¾ã€åŒºåŸŸå›¾å¢žåŠ tooltip指示点,opts.extra.line.activeType/opts.extra.area.activeType,可选值"none"不启用激活指示点,"hollow"空心点模式,"solid"实心点模式
## 2.4.4-20221102(2022-11-02)
- ç§‹äº‘图表组件 ä¿®å¤ä½¿ç”¨echarts时reload、reshow无法调用重新渲染的bug,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/40)
- ç§‹äº‘图表组件 ä¿®å¤ä½¿ç”¨echarts时,初始化时宽高不正确的bug,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/42)
- ç§‹äº‘图表组件 ä¿®å¤uniapp的h5使用history模式时,无法加载echarts的bug
- ç§‹äº‘图表组件 å°ç¨‹åºç«¯@complete、@scrollLeft、@scrollRight、@getTouchStart、@getTouchMove、@getTouchEnd事件增加opts参数传出,方便一些特殊需求的交互获取数据。
- uCharts.js ä¿®å¤calTooltipYAxisData方法内formatter格式化方法未与y轴方法同步的问题,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/43)
- uCharts.js åœ°å›¾æ–°å¢žå‚æ•°opts.series[i].fillOpacity,以透明度方式来设置颜色过度效果,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/38)
- uCharts.js åœ°å›¾æ–°å¢žå‚æ•°opts.extra.map.active,是否启用点击激活变色
- uCharts.js åœ°å›¾æ–°å¢žå‚æ•°opts.extra.map.activeTextColor,是否启用点击激活变色
- uCharts.js åœ°å›¾æ–°å¢žæ¸²æŸ“完成事件renderComplete
- uCharts.js æ¼æ–—图修复当部分数据相同时tooltip提示窗点击错误的bug
- uCharts.js æ¼æ–—图新增参数series.data[i].centerText å±…中标签文案
- uCharts.js æ¼æ–—图新增参数series.data[i].centerTextSize å±…中标签文案字体大小,默认opts.fontSize
- uCharts.js æ¼æ–—图新增参数series.data[i].centerTextColor å±…中标签文案字体颜色,默认#FFFFFF
- uCharts.js æ¼æ–—图新增参数opts.extra.funnel.minSize æœ€å°å€¼çš„æœ€å°å®½åº¦ï¼Œé»˜è®¤0
- uCharts.js è¿›åº¦æ¡æ–°å¢žå‚æ•°opts.extra.arcbar.direction,动画方向,可选值为cw顺时针、ccw逆时针
- uCharts.js æ··åˆå›¾æ–°å¢žå‚æ•°opts.extra.mix.line.width,折线的宽度,默认2
- uCharts.js ä¿®å¤tooltip开启horizentalLine水平横线标注时,图表显示错位的bug
- uCharts.js ä¼˜åŒ–tooltip当文字很多变为左侧显示时,如果画布仍显显示不下,提示框错位置变为以左侧0位置起画
- uCharts.js ä¿®å¤å¼€å¯æ»šåŠ¨æ¡åŽX轴文字超出绘图区域后的隐藏逻辑
- uCharts.js æŸ±çŠ¶å›¾ã€æ¡çŠ¶å›¾ä¿®å¤å †å æ¨¡å¼ä¸èƒ½é€šè¿‡{value,color}赋值单个柱子颜色的问题
- uCharts.js æ°”泡图修复不识别series.textSize和series.textColor的bug
## æŠ¥é”™TypeError: Cannot read properties of undefined (reading 'length')
1. å¦‚果是uni-modules版本组件,请先登录HBuilderX账号;
2. åœ¨HBuilderX中的manifest.json,点击重新获取uniapp的appid,或者删除appid重新粘贴,重新运行;
3. å¦‚果是cli项目请使用码云上的非uniCloud版本组件;
4. æˆ–者添加uniCloud的依赖;
5. æˆ–者使用原生uCharts;
## 2.4.3-20220505(2022-05-05)
- ç§‹äº‘图表组件 ä¿®å¤å¼€å¯canvas2d后将series赋值为空数组显示加载图标时,再次赋值后画布闪动的bug
- ç§‹äº‘图表组件 ä¿®å¤å‡çº§hbx最新版后ECharts的highlight方法报错的bug
- uCharts.js é›·è¾¾å›¾æ–°å¢žå‚æ•°opts.extra.radar.gridEval,数据点位网格抽希,默认1
- uCharts.js é›·è¾¾å›¾æ–°å¢žå‚æ•°opts.extra.radar.axisLabel,    æ˜¯å¦æ˜¾ç¤ºåˆ»åº¦ç‚¹å€¼ï¼Œé»˜è®¤false
- uCharts.js é›·è¾¾å›¾æ–°å¢žå‚æ•°opts.extra.radar.axisLabelTofix,刻度点值小数位数,默认0
- uCharts.js é›·è¾¾å›¾æ–°å¢žå‚æ•°opts.extra.radar.labelPointShow,是否显示末端刻度圆点,默认false
- uCharts.js é›·è¾¾å›¾æ–°å¢žå‚æ•°opts.extra.radar.labelPointRadius,刻度圆点的半径,默认3
- uCharts.js é›·è¾¾å›¾æ–°å¢žå‚æ•°opts.extra.radar.labelPointColor,刻度圆点的颜色,默认#cccccc
- uCharts.js é›·è¾¾å›¾æ–°å¢žå‚æ•°opts.extra.radar.linearType,渐变色类型,可选值"none"关闭渐变,"custom"开启渐变
- uCharts.js é›·è¾¾å›¾æ–°å¢žå‚æ•°opts.extra.radar.customColor,自定义渐变颜色,数组类型对应series的数组长度以匹配不同series颜色的不同配色方案,例如["#FA7D8D", "#EB88E2"]
- uCharts.js é›·è¾¾å›¾ä¼˜åŒ–支持series.textColor、series.textSize属性
- uCharts.js æŸ±çŠ¶å›¾ä¸­æ¸©åº¦è®¡å¼å›¾æ ‡ï¼Œä¼˜åŒ–æ”¯æŒå…¨åœ†è§’ç±»åž‹ï¼Œä¿®å¤è¾¹æ¡†æœ‰ç¼éš™çš„bug,详见官网【演示】中的温度计图表
- uCharts.js æŸ±çŠ¶å›¾æ–°å¢žå‚æ•°opts.extra.column.activeWidth,当前点击柱状图的背景宽度,默认一个单元格单位
- uCharts.js æ··åˆå›¾å¢žåŠ opts.extra.mix.area.gradient åŒºåŸŸå›¾æ˜¯å¦å¼€å¯æ¸å˜è‰²
- uCharts.js æ··åˆå›¾å¢žåŠ opts.extra.mix.area.opacity åŒºåŸŸå›¾é€æ˜Žåº¦ï¼Œé»˜è®¤0.2
- uCharts.js é¥¼å›¾ã€åœ†çŽ¯å›¾ã€çŽ«ç‘°å›¾ã€æ¼æ–—å›¾ï¼Œå¢žåŠ opts.series[0].data[i].labelText,自定义标签文字,避免formatter格式化的繁琐,详见官网【演示】中的饼图
- uCharts.js é¥¼å›¾ã€åœ†çŽ¯å›¾ã€çŽ«ç‘°å›¾ã€æ¼æ–—å›¾ï¼Œå¢žåŠ opts.series[0].data[i].labelShow,自定义是否显示某一个指示标签,避免因饼图类别太多导致标签重复或者居多导致图形变形的问题,详见官网【演示】中的饼图
- uCharts.js å¢žåŠ opts.series[i].legendText/opts.series[0].data[i].legendText(与series.name同级)自定义图例显示文字的方法
- uCharts.js ä¼˜åŒ–X轴、Yè½´formatter格式化方法增加形参,统一为fromatter:function(value,index,opts){}
- uCharts.js ä¿®å¤æ¨ªå±æ¨¡å¼ä¸‹æ— æ³•使用双指缩放方法的bug
- uCharts.js ä¿®å¤å½“只有一条数据或者多条数据值相等的时候Y轴自动计算的最大值错误的bug
- ã€å®˜ç½‘模板】增加外部自定义图例与图表交互的例子,[点击跳转](https://www.ucharts.cn/v2/#/layout/info?id=2)
## æ³¨æ„ï¼šéžunimodules ç‰ˆæœ¬å¦‚å› æ›´æ–° hbx è‡³ 3.4.7 å¯¼è‡´æŠ¥é”™å¦‚下,请到码云更新非 unimodules ç‰ˆæœ¬ç»„件,[点击跳转](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6)
> Error in callback for immediate watcher "uchartsOpts": "SyntaxError: Unexpected token u in JSON at position 0"
## 2.4.2-20220421(2022-04-21)
- ç§‹äº‘图表组件 ä¿®å¤HBX升级3.4.6.20220420版本后echarts报错的问题
## 2.4.2-20220420(2022-04-20)
## é‡è¦ï¼æ­¤ç‰ˆæœ¬uCharts新增了很多功能,修复了诸多已知问题
- ç§‹äº‘图表组件 æ–°å¢žonzoom开启双指缩放功能(仅uCharts),前提需要直角坐标系类图表类型,并且ontouch为true、opts.enableScroll为true,详见实例项目K线图
- ç§‹äº‘图表组件 æ–°å¢žoptsWatch是否监听opts变化,关闭optsWatch后,动态修改opts不会触发图表重绘
- ç§‹äº‘图表组件 ä¿®å¤å¼€å¯canvas2d功能后,动态更新数据后画布闪动的bug
- ç§‹äº‘图表组件 å޻除directory属性,改为自动获取echarts.min.js路径(升级不受影响)
- ç§‹äº‘图表组件 å¢žåŠ getImage()方法及@getImage事件,通过ref调用getImage()方法获,触发@getImage事件获取当前画布的base64图片文件流。
- ç§‹äº‘图表组件 æ”¯ä»˜å®ã€å­—节跳动、飞书、快手小程序支持开启canvas2d同层渲染设置。
- ç§‹äº‘图表组件 æ–°å¢žåŠ ã€éžuniCloud】版本组件,避免有些不需要uniCloud的使用组件发布至小程序需要提交隐私声明问题,请到码云[【非uniCloud版本】](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6),或npm[【非uniCloud版本】](https://www.npmjs.com/package/@qiun/uni-ucharts)下载使用。
- uCharts.js æ–°å¢ždobuleZoom双指缩放功能
- uCharts.js æ–°å¢žå±±å³°å›¾type="mount",数据格式为饼图类格式,不需要传入categories,具体详见新版官网在线演示
- uCharts.js ä¿®å¤æŠ˜çº¿å›¾å½“数据中存在null时tooltip报错的bug
- uCharts.js ä¿®å¤é¥¼å›¾ç±»å½“画布比较小时自动计算的半径是负数报错的bug
- uCharts.js ç»Ÿä¸€å„图表类型的series.formatter格式化方法的形参为(val, index, series, opts),方便格式化时有更多参数可用
- uCharts.js æ ‡è®°çº¿åŠŸèƒ½å¢žåŠ labelText自定义显示文字,增加labelAlign标签显示位置(左侧或右侧),增加标签显示位置微调labelOffsetX、labelOffsetY
- uCharts.js ä¿®å¤æ¡çŠ¶å›¾å½“æ•°å€¼å¾ˆå°æ—¶å¼€å¯åœ†è§’åŽæ ·å¼é”™è¯¯çš„bug
- uCharts.js ä¿®å¤X轴开启disabled后,X轴仍占用空间的bug
- uCharts.js ä¿®å¤X轴开启滚动条并且开启rotateLabel后,X轴文字与滚动条重叠的bug
- uCharts.js å¢žåŠ Xè½´rotateAngle文字旋转自定义角度,取值范围(-90至90)
- uCharts.js ä¿®å¤åœ°å›¾æ–‡å­—标签层级显示不正确的bug
- uCharts.js ä¿®å¤é¥¼å›¾ã€åœ†çŽ¯å›¾ã€çŽ«ç‘°å›¾å½“æ•°æ®å…¨éƒ¨ä¸º0的时候不显示数据标签的bug
- uCharts.js ä¿®å¤å½“opts.padding上边距为0时,Y轴顶部刻度标签位置不正确的bug
## å¦å¤–我们还开发了各大原生小程序组件,已发布至码云和npm
[https://gitee.com/uCharts/uCharts](https://gitee.com/uCharts/uCharts)
[https://www.npmjs.com/~qiun](https://www.npmjs.com/~qiun)
## å¯¹äºŽåŽŸç”ŸuCharts文档我们已上线新版官方网站,详情点击下面链接进入官网
[https://www.uCharts.cn/v2/](https://www.ucharts.cn/v2/)
## 2.3.7-20220122(2022-01-22)
## é‡è¦ï¼ä½¿ç”¨vue3编译,请使用cli模式并升级至最新依赖,HbuilderX编译需要使用3.3.8以上版本
- uCharts.js ä¿®å¤uni-app平台组件模式使用vue3编译到小程序报错的bug。
## 2.3.7-20220118(2022-01-18)
## æ³¨æ„ï¼Œä½¿ç”¨vue3的前提是需要3.3.8.20220114-alpha版本的HBuilder!
## 2.3.67-20220118(2022-01-18)
- ç§‹äº‘图表组件 ç»„件初步支持vue3,全端编译会有些问题,具体详见下面修改:
1. å°ç¨‹åºç«¯è¿è¡Œæ—¶ï¼Œåœ¨uni_modules文件夹的qiun-data-charts.js中搜索 new uni_modules_qiunDataCharts_js_sdk_uCharts_uCharts.uCharts,将.uCharts去掉。
2. å°ç¨‹åºç«¯å‘行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new e.uCharts,将.uCharts去掉,变为 new e。
3. å¦‚果觉得上述步骤比较麻烦,如果您的项目只编译到小程序端,可以修改u-charts.js最后一行导出方式,将 export default uCharts;变更为 export default { uCharts: uCharts }; è¿™æ ·å˜æ›´åŽï¼ŒH5和App端的renderjs会有问题,请开发者自行选择。(此问题非组件问题,请等待DC官方修复Vue3的小程序端)
## 2.3.6-20220111(2022-01-11)
- ç§‹äº‘图表组件 ä¿®æ”¹ç»„ä»¶ props å±žæ€§ä¸­çš„ background é»˜è®¤å€¼ä¸º rgba(0,0,0,0)
## 2.3.6-20211201(2021-12-01)
- uCharts.js ä¿®å¤bar条状图开启圆角模式时,值很小时圆角渲染错误的bug
## 2.3.5-20211014(2021-10-15)
- uCharts.js å¢žåŠ vue3的编译支持(仅原生uCharts,qiun-data-charts组件后续会支持,请关注更新)
## 2.3.4-20211012(2021-10-12)
- ç§‹äº‘图表组件 ä¿®å¤ mac os x ç³»ç»Ÿ mouseover äº‹ä»¶ä¸¢å¤±çš„ bug
## 2.3.3-20210706(2021-07-06)
- uCharts.js å¢žåŠ é›·è¾¾å›¾å¼€å¯æ•°æ®ç‚¹å€¼ï¼ˆopts.dataLabel)的显示
## 2.3.2-20210627(2021-06-27)
- ç§‹äº‘图表组件 ä¿®å¤tooltipCustom个别情况下传值不正确报错TypeError: Cannot read property 'name' of undefined的bug
## 2.3.1-20210616(2021-06-16)
- uCharts.js ä¿®å¤åœ†è§’柱状图使用4角圆角时,当数值过大时不正确的bug
## 2.3.0-20210612(2021-06-12)
- uCharts.js ã€é‡è¦ã€‘uCharts增加nvue兼容,可在nvue项目中使用gcanvas组件渲染uCharts,[详见码云uCharts-demo-nvue](https://gitee.com/uCharts/uCharts)
- ç§‹äº‘图表组件 å¢žåŠ tapLegend属性,是否开启图例点击交互事件
- ç§‹äº‘图表组件 getIndex事件中增加返回uCharts实例中的opts参数,以便在页面中调用参数
- ç¤ºä¾‹é¡¹ç›® pages/other/other.vue增加app端自定义tooltip的方法,详见showOptsTooltip方法
## 2.2.1-20210603(2021-06-03)
- uCharts.js ä¿®å¤é¥¼å›¾ã€åœ†çŽ¯å›¾ã€çŽ«ç‘°å›¾ï¼Œå½“èµ·å§‹è§’åº¦ä¸ä¸º0时,tooltip位置不准确的bug
- uCharts.js å¢žåŠ æ¸©åº¦è®¡å¼æŸ±çŠ¶å›¾å¼€å¯é¡¶éƒ¨åŠåœ†å½¢çš„é…ç½®
## 2.2.0-20210529(2021-05-29)
- uCharts.js å¢žåŠ æ¡çŠ¶å›¾type="bar"
- ç¤ºä¾‹é¡¹ç›® pages/ucharts/ucharts.vue增加条状图的demo
## 2.1.7-20210524(2021-05-24)
- uCharts.js ä¿®å¤å¤§æ•°æ®é‡æ¨¡å¼ä¸‹æ›²çº¿å›¾ä¸å¹³æ»‘çš„bug
## 2.1.6-20210523(2021-05-23)
- ç§‹äº‘图表组件 ä¿®å¤å°ç¨‹åºç«¯å¼€å¯æ»šåŠ¨æ¡æ›´æ–°æ•°æ®åŽæ»šåŠ¨æ¡ä½ç½®ä¸ç¬¦åˆé¢„æœŸçš„bug
## 2.1.5-2021051702(2021-05-17)
- uCharts.js ä¿®å¤è‡ªå®šä¹‰Yè½´min和max值为0时不能正确显示的bug
## 2.1.5-20210517(2021-05-17)
- uCharts.js ä¿®å¤Y轴自定义min和max时,未按指定的最大值最小值显示坐标轴刻度的bug
## 2.1.4-20210516(2021-05-16)
- ç§‹äº‘图表组件 ä¼˜åŒ–onWindowResize防抖方法
- ç§‹äº‘图表组件 ä¿®å¤APP端uCharts更新数据时,清空series显示loading图标后再显示图表,图表抖动的bug
- uCharts.js ä¿®å¤å¼€å¯canvas2d后,x轴、y轴、series自定义字体大小未按比例缩放的bug
- ç¤ºä¾‹é¡¹ç›® ä¿®å¤format-e.vue拼写错误导致app端使用uCharts渲染图表
## 2.1.3-20210513(2021-05-13)
- ç§‹äº‘图表组件 ä¿®æ”¹uCharts变更chartData数据为updateData方法,支持带滚动条的数据动态打点
- ç§‹äº‘图表组件 å¢žåŠ onWindowResize防抖方法 fix by ã©èª“言,如尘般染指流年づ
- ç§‹äº‘图表组件 H5或者APP变更chartData数据显示loading图表时,原数据闪现的bug
- ç§‹äº‘图表组件 props增加errorReload禁用错误点击重新加载的方法
- uCharts.js å¢žåŠ tooltip显示category(x轴对应点位)标题的功能,opts.extra.tooltip.showCategory,默认为false
- uCharts.js ä¿®å¤mix混合图只有柱状图时,tooltip的分割线显示位置不正确的bug
- uCharts.js ä¿®å¤å¼€å¯æ»šåŠ¨æ¡ï¼Œå›¾è¡¨åœ¨æ‹–åŠ¨ä¸­åŠ¨æ€æ‰“ç‚¹ï¼Œæ»šåŠ¨æ¡ä½ç½®ä¸æ­£ç¡®çš„bug
- uCharts.js ä¿®å¤é¥¼å›¾ç±»æ•°æ®æ ¼å¼ä¸ºecharts数据格式,series为空数组报错的bug
- ç¤ºä¾‹é¡¹ç›® ä¿®æ”¹uCharts.js更新到v2.1.2版本后,@getIndex方法获取索引值变更为e.currentIndex.index
- ç¤ºä¾‹é¡¹ç›® pages/updata/updata.vue增加滚动条拖动更新(数据动态打点)的demo
- ç¤ºä¾‹é¡¹ç›® pages/other/other.vue增加errorReload禁用错误点击重新加载的demo
## 2.1.2-20210509(2021-05-09)
秋云图表组件 ä¿®å¤APP端初始化时就传入chartData或lacaldata不显示图表的bug
## 2.1.1-20210509(2021-05-09)
- ç§‹äº‘图表组件 å˜æ›´ECharts的eopts配置在renderjs内执行,支持在config-echarts.js配置文件内写function配置。
- ç§‹äº‘图表组件 ä¿®å¤APP端报错Prop being mutated: "onmouse"错误的bug。
- ç§‹äº‘图表组件 ä¿®å¤APP端报错Error: Not Found:Page[6][-1,27] at view.umd.min.js:1的bug。
## 2.1.0-20210507(2021-05-07)
- ç§‹äº‘图表组件 ä¿®å¤åˆå§‹åŒ–时就有数据或者数据更新的时候loading加载动画闪动的bug
- uCharts.js ä¿®å¤xè½´format方法categories为字符串类型时返回NaN的bug
- uCharts.js ä¿®å¤series.textColor、legend.fontColor未执行全局默认颜色的bug
## 2.1.0-20210506(2021-05-06)
- ç§‹äº‘图表组件 ä¿®å¤æžä¸ªåˆ«æƒ…况下报错item.properties undefined的bug
- ç§‹äº‘图表组件 ä¿®å¤æžä¸ªåˆ«æƒ…况下关闭加载动画reshow不起作用,无法显示图表的bug
- ç¤ºä¾‹é¡¹ç›® pages/ucharts/ucharts.vue å¢žåŠ æ—¶é—´è½´æŠ˜çº¿å›¾ï¼ˆtype="tline")、时间轴区域图(type="tarea")、散点图(type="scatter")、气泡图demo(type="bubble")、倒三角形漏斗图(opts.extra.funnel.type="triangle")、金字塔形漏斗图(opts.extra.funnel.type="pyramid")
- ç¤ºä¾‹é¡¹ç›® pages/format-u/format-u.vue å¢žåŠ Xè½´format格式化示例
- uCharts.js å‡çº§è‡³v2.1.0版本
- uCharts.js ä¿®å¤ çŽ«ç‘°å›¾é¢ç§¯æ¨¡å¼ç‚¹å‡»tooltip位置不正确的bug
- uCharts.js ä¿®å¤ çŽ«ç‘°å›¾ç‚¹å‡»å›¾ä¾‹ï¼Œåªå‰©ä¸€ä¸ªç±»åˆ«æ˜¾ç¤ºç©ºç™½çš„bug
- uCharts.js ä¿®å¤ é¥¼å›¾ç±»å›¾ç‚¹å‡»å›¾ä¾‹ï¼Œå…¶ä»–图表tooltip位置某些情况下不准的bug
- uCharts.js ä¿®å¤ x轴为矢量轴(时间轴)情况下,点击tooltip位置不正确的bug
- uCharts.js ä¿®å¤ è¯äº‘图获取点击索引偶尔不准的bug
- uCharts.js å¢žåŠ  ç›´è§’坐标系图表Xè½´format格式化方法(原生uCharts.js用法请使用formatter)
- uCharts.js å¢žåŠ  æ¼æ–—图扩展配置,倒三角形(opts.extra.funnel.type="triangle"),金字塔形(opts.extra.funnel.type="pyramid")
- uCharts.js å¢žåŠ  æ•£ç‚¹å›¾ï¼ˆopts.type="scatter")、气泡图(opts.type="bubble")
- åŽæœŸè®¡åˆ’ å®Œå–„散点图、气泡图,增加markPoints标记点,增加横向条状图。
## 2.0.0-20210502(2021-05-02)
- uCharts.js ä¿®å¤è¯äº‘图获取点击索引不正确的bug
## 2.0.0-20210501(2021-05-01)
- ç§‹äº‘图表组件 ä¿®å¤QQ小程序、百度小程序在关闭动画效果情况下,v-for循环使用图表,显示不正确的bug
## 2.0.0-20210426(2021-04-26)
- ç§‹äº‘图表组件 ä¿®å¤QQ小程序不支持canvas2d的bug
- ç§‹äº‘图表组件 ä¿®å¤é’‰é’‰å°ç¨‹åºæŸäº›æƒ…况点击坐标计算错误的bug
- uCharts.js å¢žåŠ  extra.column.categoryGap å‚数,柱状图类每个category点位(X轴点)柱子组之间的间距
- uCharts.js å¢žåŠ  yAxis.data[i].titleOffsetY å‚数,标题纵向偏移距离,负数为向上偏移,正数向下偏移
- uCharts.js å¢žåŠ  yAxis.data[i].titleOffsetX å‚数,标题横向偏移距离,负数为向左偏移,正数向右偏移
- uCharts.js å¢žåŠ  extra.gauge.labelOffset å‚数,仪表盘标签文字径向便宜距离,默认13px
## 2.0.0-20210422-2(2021-04-22)
秋云图表组件 ä¿®å¤ formatterAssign æœªåˆ¤æ–­ args[key] == null çš„æƒ…况导致栈溢出的 bug
## 2.0.0-20210422(2021-04-22)
- ç§‹äº‘图表组件 ä¿®å¤H5、APP、支付宝小程序、微信小程序canvas2d模式下横屏模式的bug
## 2.0.0-20210421(2021-04-21)
- uCharts.js ä¿®å¤å¤šè¡Œå›¾ä¾‹çš„æƒ…况下,图例在上方或者下方时,图例float为左侧或者右侧时,第二行及以后的图例对齐方式不正确的bug
## 2.0.0-20210420(2021-04-20)
- ç§‹äº‘图表组件 ä¿®å¤å¾®ä¿¡å°ç¨‹åºå¼€å¯canvas2d模式后,windows版微信小程序不支持canvas2d模式的bug
- ç§‹äº‘图表组件 ä¿®æ”¹éžuni_modules版本为v2.0版本qiun-data-charts组件
## 2.0.0-20210419(2021-04-19)
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
## åˆæ¬¡ä½¿ç”¨å¦‚果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
## å¦‚果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
## æ­¤é—®é¢˜å·²äºŽDCloud官方确认,HBuilderX下个版本会修复。
## å…¶ä»–图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
## <font color=#FF0000> æ–°æ‰‹è¯·å…ˆå®Œæ•´é˜…读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font>
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
- uCharts.js ä¿®å¤æ··åˆå›¾ä¸­æŸ±çŠ¶å›¾å•ç‹¬è®¾ç½®é¢œè‰²ä¸ç”Ÿæ•ˆçš„bug
- uCharts.js ä¿®å¤å¤šY轴单独设置fontSize时,开启canvas2d后,未对应放大字体的bug
## 2.0.0-20210418(2021-04-18)
- ç§‹äº‘图表组件 å¢žåŠ directory配置,修复H5端history模式下如果发布到二级目录无法正确加载echarts.min.js的bug
## 2.0.0-20210416(2021-04-16)
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
## åˆæ¬¡ä½¿ç”¨å¦‚果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
## å¦‚果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
## æ­¤é—®é¢˜å·²äºŽDCloud官方确认,HBuilderX下个版本会修复。
## å…¶ä»–图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
## <font color=#FF0000> æ–°æ‰‹è¯·å…ˆå®Œæ•´é˜…读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font>
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
- ç§‹äº‘图表组件 ä¿®å¤APP端某些情况下报错`Not Found Page`的bug,fix by é«˜çº§bug开发技术员
- ç¤ºä¾‹é¡¹ç›® ä¿®å¤APP端v-for循环某些情况下报错`Not Found Page`的bug,fix by é«˜çº§bug开发技术员
- uCharts.js ä¿®å¤éžç›´è§’坐标系tooltip提示窗右侧超出未变换方向显示的bug
## 2.0.0-20210415(2021-04-15)
- ç§‹äº‘图表组件 ä¿®å¤H5端发布到二级目录下echarts无法加载的bug
- ç§‹äº‘图表组件 ä¿®å¤æŸäº›æƒ…况下echarts.off('finished')移除监听事件报错的bug
## 2.0.0-20210414(2021-04-14)
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
## åˆæ¬¡ä½¿ç”¨å¦‚果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
## å¦‚果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
## æ­¤é—®é¢˜å·²äºŽDCloud官方确认,HBuilderX下个版本会修复。
## å…¶ä»–图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
## <font color=#FF0000> æ–°æ‰‹è¯·å…ˆå®Œæ•´é˜…读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font>
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
- ç§‹äº‘图表组件 ä¿®å¤H5端在cli项目下ECharts引用地址错误的bug
- ç¤ºä¾‹é¡¹ç›® å¢žåŠ ECharts的formatter用法的示例(详见示例项目format-e.vue)
- uCharts.js å¢žåŠ åœ†çŽ¯å›¾ä¸­å¿ƒèƒŒæ™¯è‰²çš„é…ç½®extra.ring.centerColor
- uCharts.js ä¿®å¤å¾®ä¿¡å°ç¨‹åºå®‰å“端柱状图开启透明色后显示不正确的bug
## 2.0.0-20210413(2021-04-13)
- ç§‹äº‘图表组件 ä¿®å¤ç™¾åº¦å°ç¨‹åºå¤šä¸ªå›¾è¡¨çœŸæœºæœªèƒ½æ­£ç¡®èŽ·å–æ ¹å…ƒç´ dom尺寸的bug
- ç§‹äº‘图表组件 ä¿®å¤ç™¾åº¦å°ç¨‹åºæ¨ªå±æ¨¡å¼æ–¹å‘不正确的bug
- ç§‹äº‘图表组件 ä¿®æ”¹ontouch时,@getTouchStart@getTouchMove@getTouchEnd的触发条件
- uCharts.js ä¿®å¤é¥¼å›¾ç±»æ•°æ®æ ¼å¼series属性不生效的bug
- uCharts.js å¢žåŠ æ—¶åºåŒºåŸŸå›¾ è¯¦è§ç¤ºä¾‹é¡¹ç›®ä¸­ucharts.vue
## 2.0.0-20210412-2(2021-04-12)
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
## åˆæ¬¡ä½¿ç”¨å¦‚果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX。如仍不好用,请重启电脑,此问题已于DCloud官方确认,HBuilderX下个版本会修复。
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
- ç§‹äº‘图表组件 ä¿®å¤uCharts在APP端横屏模式下不能正确渲染的bug
- ç¤ºä¾‹é¡¹ç›® å¢žåŠ ECharts柱状图渐变色、圆角柱状图、横向柱状图(条状图)的示例
## 2.0.0-20210412(2021-04-12)
- ç§‹äº‘图表组件 ä¿®å¤created中判断echarts导致APP端无法识别,改回mounted中判断echarts初始化
- uCharts.js ä¿®å¤2d模式下series.textOffset未乘像素比的bug
## 2.0.0-20210411(2021-04-11)
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
## åˆæ¬¡ä½¿ç”¨å¦‚果提示未注册<qiun-data-charts>组件,请重启HBuilderX,并清空小程序开发者工具缓存。
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
- uCharts.js æŠ˜çº¿å›¾åŒºåŸŸå›¾å¢žåŠ connectNulls断点续连的功能,详见示例项目中ucharts.vue
- ç§‹äº‘图表组件 å˜æ›´åˆå§‹åŒ–方法为created,变更type2d默认值为true,优化2d模式下组件初始化后dom获取不到的bug
- ç§‹äº‘图表组件 ä¿®å¤å·¦å³å¸ƒå±€æ—¶ï¼Œå³ä¾§å›¾è¡¨ç‚¹å‡»åæ ‡é”™è¯¯çš„bug,修复tooltip柱状图自定义颜色显示object的bug
## 2.0.0-20210410(2021-04-10)
- ä¿®å¤å·¦å³å¸ƒå±€æ—¶ï¼Œå³ä¾§å›¾è¡¨ç‚¹å‡»åæ ‡é”™è¯¯çš„bug,修复柱状图自定义颜色tooltip显示object的bug
- å¢žåŠ æ ‡è®°çº¿åŠæŸ±çŠ¶å›¾è‡ªå®šä¹‰é¢œè‰²çš„demo
## 2.0.0-20210409(2021-04-08)
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn)
## å›¾è¡¨ç»„件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
- uCharts.js ä¿®å¤é’‰é’‰å°ç¨‹åºç™¾åº¦å°ç¨‹åºmeasureText不准确的bug,修复2d模式下饼图类activeRadius为按比例放大的bug
- ä¿®å¤ç»„件在支付宝小程序端点击位置不准确的bug
## 2.0.0-20210408(2021-04-07)
- ä¿®å¤ç»„件在支付宝小程序端不能显示的bug(目前支付宝小程不能点击交互,后续修复)
- uCharts.js ä¿®å¤é«˜åˆ†å±ä¸‹æŸ±çŠ¶å›¾ç±»ï¼Œåœ†å¼§è¿›åº¦æ¡ è‡ªå®šä¹‰å®½åº¦ä¸èƒ½æŒ‰æ¯”例放大的bug
## 2.0.0-20210407(2021-04-06)
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn)
## å¢žåŠ  é€šè¿‡tofix和unit快速格式化y轴的demo add by `howcode`
## å¢žåŠ  å›¾è¡¨ç»„件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
## 2.0.0-20210406(2021-04-05)
# ç§‹äº‘图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页
## 2.0.0(2021-04-05)
# ç§‹äº‘图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页
src/components/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1614 @@
<!--
 * qiun-data-charts ç§‹äº‘高性能跨全端图表组件
 * Copyright (c) 2021 QIUN® ç§‹äº‘ https://www.ucharts.cn All rights reserved.
 * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
 * å¤åˆ¶ä½¿ç”¨è¯·ä¿ç•™æœ¬æ®µæ³¨é‡Šï¼Œæ„Ÿè°¢æ”¯æŒå¼€æºï¼
 * ä¸ºæ–¹ä¾¿æ›´å¤šå¼€å‘者使用,如有更好的建议请提交码云 Pull Requests ï¼
 *
 * uCharts®官方网站
 * https://www.uCharts.cn
 *
 * å¼€æºåœ°å€:
 * https://gitee.com/uCharts/uCharts
 *
 * uni-app插件市场地址:
 * http://ext.dcloud.net.cn/plugin?id=271
 *
 -->
 <template>
  <view class="chartsview" :id="'ChartBoxId'+cid">
    <view v-if="mixinDatacomLoading">
      <!-- è‡ªå®šä¹‰åŠ è½½çŠ¶æ€ï¼Œè¯·æ”¹è¿™é‡Œ -->
      <qiun-loading :loadingType="loadingType" />
    </view>
    <view v-if="mixinDatacomErrorMessage && errorShow" @tap="reloading">
      <!-- è‡ªå®šä¹‰é”™è¯¯æç¤ºï¼Œè¯·æ”¹è¿™é‡Œ -->
      <qiun-error :errorMessage="errorMessage" />
    </view>
    <!-- APP和H5采用renderjs渲染图表 -->
    <!-- #ifdef APP-VUE || H5 -->
    <block v-if="echarts">
      <view
        :style="{ background: background }"
        style="width: 100%;height: 100%;"
        :data-directory="directory"
        :id="'EC'+cid"
        :prop="echartsOpts"
        :change:prop="rdcharts.ecinit"
        :resize="echartsResize"
        :change:resize="rdcharts.ecresize"
        v-show="showchart"
      />
    </block>
    <block v-else>
      <view
        v-on:tap="rdcharts.tap"
        v-on:mousemove="rdcharts.mouseMove"
        v-on:mousedown="rdcharts.mouseDown"
        v-on:mouseup="rdcharts.mouseUp"
        v-on:touchstart="rdcharts.touchStart"
        v-on:touchmove="rdcharts.touchMove"
        v-on:touchend="rdcharts.touchEnd"
        :id="'UC'+cid"
        :prop="uchartsOpts"
        :change:prop="rdcharts.ucinit"
      >
        <canvas
          :id="cid"
          :canvasId="cid"
          :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
          :disable-scroll="disableScroll"
          @error="_error"
          v-show="showchart"
        />
      </view>
    </block>
    <!-- #endif -->
    <!-- æ”¯ä»˜å®å°ç¨‹åº -->
    <!-- #ifdef MP-ALIPAY -->
    <block v-if="ontouch">
      <canvas
        :id="cid"
        :canvasId="cid"
        :width="cWidth * pixel"
        :height="cHeight * pixel"
        :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
        :disable-scroll="disScroll"
        @tap="_tap"
        @touchstart="_touchStart"
        @touchmove="_touchMove"
        @touchend="_touchEnd"
        @error="_error"
        v-show="showchart"
      />
    </block>
    <block v-if="!ontouch">
      <canvas
        :id="cid"
        :canvasId="cid"
        :width="cWidth * pixel"
        :height="cHeight * pixel"
        :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
        :disable-scroll="disScroll"
        @tap="_tap"
        @error="_error"
        v-show="showchart"
      />
    </block>
    <!-- #endif -->
    <!-- å…¶ä»–小程序通过vue渲染图表 -->
    <!-- #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-TOUTIAO || MP-KUAISHOU || MP-LARK || MP-JD || MP-360 -->
    <block v-if="type2d">
      <view v-if="ontouch" @tap="_tap">
        <canvas
          :id="cid"
          :canvasId="cid"
          :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
          type="2d"
          :disable-scroll="disScroll"
          @touchstart="_touchStart"
          @touchmove="_touchMove"
          @touchend="_touchEnd"
          @error="_error"
          v-show="showchart"
        />
      </view>
      <view v-if="!ontouch" @tap="_tap">
        <canvas
          :id="cid"
          :canvasId="cid"
          :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
          type="2d"
          :disable-scroll="disScroll"
          @error="_error"
          v-show="showchart"
        />
      </view>
    </block>
    <block v-if="!type2d">
      <view v-if="ontouch" @tap="_tap">
        <canvas
          :id="cid"
          :canvasId="cid"
          :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
          @touchstart="_touchStart"
          @touchmove="_touchMove"
          @touchend="_touchEnd"
          :disable-scroll="disScroll"
          @error="_error"
          v-if="showchart"
        />
      </view>
      <view v-if="!ontouch" >
        <canvas
          :id="cid"
          :canvasId="cid"
          :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
          :disable-scroll="disScroll"
          @tap="_tap"
          @error="_error"
          v-if="showchart"
        />
      </view>
    </block>
    <!-- #endif -->
  </view>
</template>
<script>
import uCharts from '../../js_sdk/u-charts/u-charts.js';
import cfu from '../../js_sdk/u-charts/config-ucharts.js';
// #ifdef APP-VUE || H5
import cfe from '../../js_sdk/u-charts/config-echarts.js';
// #endif
function deepCloneAssign(origin = {}, ...args) {
  for (let i in args) {
    for (let key in args[i]) {
      if (args[i].hasOwnProperty(key)) {
        origin[key] = args[i][key] && typeof args[i][key] === 'object' ? deepCloneAssign(Array.isArray(args[i][key]) ? [] : {}, origin[key], args[i][key]) : args[i][key];
      }
    }
  }
  return origin;
}
function formatterAssign(args,formatter) {
  for (let key in args) {
    if(args.hasOwnProperty(key) && args[key] !== null && typeof args[key] === 'object'){
      formatterAssign(args[key],formatter)
    }else if(key === 'format' && typeof args[key] === 'string'){
      args['formatter'] = formatter[args[key]] ? formatter[args[key]] : undefined;
    }
  }
  return args;
}
// æ—¶é—´è½¬æ¢å‡½æ•°ï¼Œä¸ºäº†åŒ¹é…uniClinetDB读取出的时间与categories不同
function getFormatDate(date) {
    var seperator = "-";
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    var strDate = date.getDate();
    if (month >= 1 && month <= 9) {
            month = "0" + month;
    }
    if (strDate >= 0 && strDate <= 9) {
            strDate = "0" + strDate;
    }
    var currentdate = year + seperator + month + seperator + strDate;
    return currentdate;
}
var lastMoveTime = null;
/**
 * é˜²æŠ–
 *
 * @param { Function } fn è¦æ‰§è¡Œçš„æ–¹æ³•
 * @param { Number } wait  é˜²æŠ–多少毫秒
 *
 * åœ¨ vue ä¸­ä½¿ç”¨ï¼ˆæ³¨æ„ï¼šä¸èƒ½ä½¿ç”¨ç®­å¤´å‡½æ•°ï¼Œå¦åˆ™this指向不对,并且不能再次封装如:
 * move(){  // é”™è¯¯è°ƒç”¨æ–¹å¼
 *   debounce(function () {
 *   console.log(this.title);
 * }, 1000)});
 * åº”该直接使用:// æ­£ç¡®è°ƒç”¨æ–¹å¼
 * move: debounce(function () {
 *   console.log(this.title);
 * }, 1000)
 */
function debounce(fn, wait) {
  let timer = false;
  return function() {
    clearTimeout(timer);
    timer && clearTimeout(timer);
    timer = setTimeout(() => {
      timer = false;
      fn.apply(this, arguments); // æŠŠå‚数传进去
    }, wait);
  };
}
export default {
  name: 'qiun-data-charts',
  mixins: [uniCloud.mixinDatacom],
  props: {
    type: {
      type: String,
      default: null
    },
    canvasId: {
      type: String,
      default: 'uchartsid'
    },
    canvas2d: {
      type: Boolean,
      default: false
    },
    background: {
      type: String,
      default: 'rgba(0,0,0,0)'
    },
    animation: {
      type: Boolean,
      default: true
    },
    chartData: {
      type: Object,
      default() {
        return {
          categories: [],
          series: []
        };
      }
    },
    opts: {
      type: Object,
      default() {
        return {};
      }
    },
    eopts: {
      type: Object,
      default() {
        return {};
      }
    },
    loadingType: {
      type: Number,
      default: 2
    },
    errorShow: {
      type: Boolean,
      default: true
    },
    errorReload: {
      type: Boolean,
      default: true
    },
    errorMessage: {
      type: String,
      default: null
    },
    inScrollView: {
      type: Boolean,
      default: false
    },
    reshow: {
      type: Boolean,
      default: false
    },
    reload: {
      type: Boolean,
      default: false
    },
    disableScroll: {
      type: Boolean,
      default: false
    },
    optsWatch: {
      type: Boolean,
      default: true
    },
    onzoom: {
      type: Boolean,
      default: false
    },
    ontap: {
      type: Boolean,
      default: true
    },
    ontouch: {
      type: Boolean,
      default: false
    },
    onmouse: {
      type: Boolean,
      default: true
    },
    onmovetip: {
      type: Boolean,
      default: false
    },
    echartsH5: {
      type: Boolean,
      default: false
    },
    echartsApp: {
      type: Boolean,
      default: false
    },
    tooltipShow: {
      type: Boolean,
      default: true
    },
    tooltipFormat: {
      type: String,
      default: undefined
    },
    tooltipCustom: {
      type: Object,
      default: undefined
    },
    startDate: {
      type: String,
      default: undefined
    },
    endDate: {
      type: String,
      default: undefined
    },
    textEnum: {
      type: Array,
      default () {
        return []
      }
    },
    groupEnum: {
      type: Array,
      default () {
        return []
      }
    },
    pageScrollTop: {
      type: Number,
      default: 0
    },
    directory: {
      type: String,
      default: '/'
    },
    tapLegend: {
      type: Boolean,
      default: true
    },
    menus: {
      type: Array,
      default () {
        return []
      }
    }
  },
  data() {
    return {
      cid: 'uchartsid',
      inWx: false,
      inAli: false,
      inTt: false,
      inBd: false,
      inH5: false,
      inApp: false,
      inWin: false,
      type2d: true,
      disScroll: false,
      openmouse: false,
      pixel: 1,
      cWidth: 375,
      cHeight: 250,
      showchart: false,
      echarts: false,
      echartsResize:{
        state:false
      },
      uchartsOpts: {},
      echartsOpts: {},
      drawData:{},
      lastDrawTime:null,
    };
  },
  created(){
    this.cid = this.canvasId
    if (this.canvasId == 'uchartsid' || this.canvasId == '') {
      let t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
      let len = t.length
      let id = ''
      for (let i = 0; i < 32; i++) {
        id += t.charAt(Math.floor(Math.random() * len))
      }
      this.cid = id
    }
    const systemInfo = uni.getSystemInfoSync()
    if(systemInfo.platform === 'windows' || systemInfo.platform === 'mac'){
      this.inWin = true;
    }
    // #ifdef MP-WEIXIN
    this.inWx = true;
    if (this.canvas2d === false || systemInfo.platform === 'windows' || systemInfo.platform === 'mac') {
      this.type2d = false;
    }else{
      this.type2d = true;
      this.pixel = systemInfo.pixelRatio;
    }
    // #endif
    //非微信小程序端强制关闭canvas2d模式
    // #ifndef MP-WEIXIN
    this.type2d = false;
    // #endif
    // #ifdef  MP-TOUTIAO || MP-LARK || MP-ALIPAY
    this.type2d = this.canvas2d;
    // #endif
    // #ifdef MP-ALIPAY
    this.inAli = true;
    this.pixel = systemInfo.pixelRatio;
    // #endif
    // #ifdef MP-BAIDU
    this.inBd = true;
    // #endif
    // #ifdef MP-TOUTIAO
    this.inTt = true;
    // #endif
    this.disScroll = this.disableScroll;
  },
  mounted() {
    // #ifdef APP-VUE
    this.inApp = true;
    if (this.echartsApp === true) {
      this.echarts = true;
      this.openmouse = false;
    }
    // #endif
    // #ifdef APP-NVUE
    this.inApp = true;
    this.mixinDatacomLoading = false
    this.mixinDatacomErrorMessage = "暂不支持NVUE"
    // #endif
    // #ifdef H5
    this.inH5 = true;
    if(this.inWin === true){
      this.openmouse = this.onmouse;
    }
    if (this.echartsH5 === true) {
      this.echarts = true;
    }
    // #endif
    this.$nextTick(()=>{
      this.beforeInit();
    })
    // #ifndef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || APP-VUE
    const time = this.inH5 ? 500 : 200;
    const _this = this;
    uni.onWindowResize(
      debounce(function(res) {
        if (_this.mixinDatacomLoading == true) {
          return;
        }
        let errmsg = _this.mixinDatacomErrorMessage;
        if (errmsg !== null && errmsg !== 'null' && errmsg !== '') {
          return;
        }
        if (_this.echarts) {
          _this.echartsResize.state = !_this.echartsResize.state;
        } else {
          _this.resizeHandler();
        }
      }, time)
    );
    // #endif
  },
  destroyed(){
    if(this.echarts === true){
      delete cfe.option[this.cid]
      delete cfe.instance[this.cid]
    }else{
      delete cfu.option[this.cid]
      delete cfu.instance[this.cid]
    }
    // #ifndef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO
    uni.offWindowResize(()=>{})
    // #endif
  },
  watch: {
    chartDataProps: {
      handler(val, oldval) {
        if (typeof val === 'object') {
          if (JSON.stringify(val) !== JSON.stringify(oldval)) {
            this._clearChart();
            if (val.series && val.series.length > 0) {
              this.beforeInit();
            }else{
              this.mixinDatacomLoading = true;
              this.showchart = false;
              this.mixinDatacomErrorMessage = null;
            }
          }
        } else {
          this.mixinDatacomLoading = false;
          this._clearChart();
          this.showchart = false;
          this.mixinDatacomErrorMessage = '参数错误:chartData数据类型错误';
        }
      },
      immediate: false,
      deep: true
    },
    localdata:{
      handler(val, oldval) {
        if (JSON.stringify(val) !== JSON.stringify(oldval)) {
          if (val.length > 0) {
            this.beforeInit();
          }else{
            this.mixinDatacomLoading = true;
            this._clearChart();
            this.showchart = false;
            this.mixinDatacomErrorMessage = null;
          }
        }
      },
      immediate: false,
      deep: true
    },
    optsProps: {
      handler(val, oldval) {
        if (typeof val === 'object') {
          if (JSON.stringify(val) !== JSON.stringify(oldval) && this.echarts === false && this.optsWatch == true) {
            this.checkData(this.drawData);
          }
        } else {
          this.mixinDatacomLoading = false;
          this._clearChart();
          this.showchart = false;
          this.mixinDatacomErrorMessage = '参数错误:opts数据类型错误';
        }
      },
      immediate: false,
      deep: true
    },
    eoptsProps: {
      handler(val, oldval) {
        if (typeof val === 'object') {
          if (JSON.stringify(val) !== JSON.stringify(oldval) && this.echarts === true) {
            this.checkData(this.drawData);
          }
        } else {
          this.mixinDatacomLoading = false;
          this.showchart = false;
          this.mixinDatacomErrorMessage = '参数错误:eopts数据类型错误';
        }
      },
      immediate: false,
      deep: true
    },
    reshow(val, oldval) {
      if (val === true && this.mixinDatacomLoading === false) {
        setTimeout(() => {
          this.mixinDatacomErrorMessage = null;
          this.echartsResize.state = !this.echartsResize.state;
          this.checkData(this.drawData);
        }, 200);
      }
    },
    reload(val, oldval) {
      if (val === true) {
        this.showchart = false;
        this.mixinDatacomErrorMessage = null;
        this.reloading();
      }
    },
    mixinDatacomErrorMessage(val, oldval) {
      if (val) {
        this.emitMsg({name: 'error', params: {type:"error", errorShow: this.errorShow, msg: val, id: this.cid}});
        if(this.errorShow){
          console.log('[秋云图表组件]' + val);
        }
      }
    },
    errorMessage(val, oldval) {
      if (val && this.errorShow && val !== null && val !== 'null' && val !== '') {
        this.showchart = false;
        this.mixinDatacomLoading = false;
        this.mixinDatacomErrorMessage = val;
      } else {
        this.showchart = false;
        this.mixinDatacomErrorMessage = null;
        this.reloading();
      }
    }
  },
  computed: {
    optsProps() {
      return JSON.parse(JSON.stringify(this.opts));
    },
    eoptsProps() {
      return JSON.parse(JSON.stringify(this.eopts));
    },
    chartDataProps() {
      return JSON.parse(JSON.stringify(this.chartData));
    },
  },
  methods: {
    beforeInit(){
      this.mixinDatacomErrorMessage = null;
      if (typeof this.chartData === 'object' && this.chartData != null && this.chartData.series !== undefined && this.chartData.series.length > 0) {
        //拷贝一下chartData,为了opts变更后统一数据来源
        this.drawData = deepCloneAssign({}, this.chartData);
        this.mixinDatacomLoading = false;
        this.showchart = true;
        this.checkData(this.chartData);
      }else if(this.localdata.length>0){
        this.mixinDatacomLoading = false;
        this.showchart = true;
        this.localdataInit(this.localdata);
      }else if(this.collection !== ''){
        this.mixinDatacomLoading = false;
        this.getCloudData();
      }else{
        this.mixinDatacomLoading = true;
      }
    },
    localdataInit(resdata){
      //替换enum类型为正确的描述
      if(this.groupEnum.length>0){
        for (let i = 0; i < resdata.length; i++) {
          for (let j = 0; j < this.groupEnum.length; j++) {
            if(resdata[i].group === this.groupEnum[j].value){
              resdata[i].group = this.groupEnum[j].text
            }
          }
        }
      }
      if(this.textEnum.length>0){
        for (let i = 0; i < resdata.length; i++) {
          for (let j = 0; j < this.textEnum.length; j++) {
            if(resdata[i].text === this.textEnum[j].value){
              resdata[i].text = this.textEnum[j].text
            }
          }
        }
      }
      let needCategories = false;
      let tmpData = {categories:[], series:[]}
      let tmpcategories = []
      let tmpseries = [];
      //拼接categories
      if(this.echarts === true){
        needCategories = cfe.categories.includes(this.type)
      }else{
        needCategories = cfu.categories.includes(this.type)
      }
      if(needCategories === true){
        //如果props中的chartData带有categories,则优先使用chartData的categories
        if(this.chartData && this.chartData.categories && this.chartData.categories.length>0){
          tmpcategories = this.chartData.categories
        }else{
          //如果是日期类型的数据,不管是本地数据还是云数据,都按起止日期自动拼接categories
          if(this.startDate && this.endDate){
            let idate = new Date(this.startDate)
            let edate = new Date(this.endDate)
            while (idate <= edate) {
                tmpcategories.push(getFormatDate(idate))
                idate = idate.setDate(idate.getDate() + 1)
                idate = new Date(idate)
            }
          //否则从结果中去重并拼接categories
          }else{
            let tempckey = {};
            resdata.map(function(item, index) {
              if (item.text != undefined && !tempckey[item.text]) {
                tmpcategories.push(item.text)
                tempckey[item.text] = true
              }
            });
          }
        }
        tmpData.categories = tmpcategories
      }
      //拼接series
      let tempskey = {};
      resdata.map(function(item, index) {
        if (item.group != undefined && !tempskey[item.group]) {
          tmpseries.push({ name: item.group, data: [] });
          tempskey[item.group] = true;
        }
      });
      //如果没有获取到分组名称(可能是带categories的数据,也可能是不带的饼图类)
      if (tmpseries.length == 0) {
        tmpseries = [{ name: '默认分组', data: [] }];
        //如果是需要categories的图表类型
        if(needCategories === true){
          for (let j = 0; j < tmpcategories.length; j++) {
            let seriesdata = 0;
            for (let i = 0; i < resdata.length; i++) {
              if (resdata[i].text == tmpcategories[j]) {
                seriesdata = resdata[i].value;
              }
            }
            tmpseries[0].data.push(seriesdata);
          }
        //如果是饼图类的图表类型
        }else{
          for (let i = 0; i < resdata.length; i++) {
            tmpseries[0].data.push({"name": resdata[i].text,"value": resdata[i].value});
          }
        }
      //如果有分组名
      } else {
        for (let k = 0; k < tmpseries.length; k++) {
          //如果有categories
          if (tmpcategories.length > 0) {
            for (let j = 0; j < tmpcategories.length; j++) {
              let seriesdata = 0;
              for (let i = 0; i < resdata.length; i++) {
                if (tmpseries[k].name == resdata[i].group && resdata[i].text == tmpcategories[j]) {
                  seriesdata = resdata[i].value;
                }
              }
              tmpseries[k].data.push(seriesdata);
            }
          //如果传了group而没有传text,即没有categories(正常情况下这种数据是不符合数据要求规范的)
          } else {
            for (let i = 0; i < resdata.length; i++) {
              if (tmpseries[k].name == resdata[i].group) {
                tmpseries[k].data.push(resdata[i].value);
              }
            }
          }
        }
      }
      tmpData.series = tmpseries
      //拷贝一下chartData,为了opts变更后统一数据来源
      this.drawData = deepCloneAssign({}, tmpData);
      this.checkData(tmpData)
    },
    reloading() {
      if(this.errorReload === false){
        return;
      }
      this.showchart = false;
      this.mixinDatacomErrorMessage = null;
      if (this.collection !== '') {
        this.mixinDatacomLoading = false;
        this.onMixinDatacomPropsChange(true);
      } else {
        this.beforeInit();
      }
    },
    checkData(anyData) {
      let cid = this.cid
      //复位opts或eopts
      if(this.echarts === true){
        cfe.option[cid] = deepCloneAssign({}, this.eopts);
        cfe.option[cid].id = cid;
        cfe.option[cid].type = this.type;
      }else{
        if (this.type && cfu.type.includes(this.type)) {
          cfu.option[cid] = deepCloneAssign({}, cfu[this.type], this.opts);
          cfu.option[cid].canvasId = cid;
        } else {
          this.mixinDatacomLoading = false;
          this.showchart = false;
          this.mixinDatacomErrorMessage = '参数错误:props参数中type类型不正确';
        }
      }
      //挂载categories和series
      let newData = deepCloneAssign({}, anyData);
      if (newData.series !== undefined && newData.series.length > 0) {
        this.mixinDatacomErrorMessage = null;
        if (this.echarts === true) {
          cfe.option[cid].chartData = newData;
          this.$nextTick(()=>{
            this.init()
          })
        }else{
          cfu.option[cid].categories = newData.categories;
          cfu.option[cid].series = newData.series;
          this.$nextTick(()=>{
            this.init()
          })
        }
      }
    },
    resizeHandler() {
      //渲染防抖
      let currTime = Date.now();
      let lastDrawTime = this.lastDrawTime?this.lastDrawTime:currTime-3000;
      let duration = currTime - lastDrawTime;
      if (duration < 1000) return;
      let chartdom = uni
        .createSelectorQuery()
        // #ifndef MP-ALIPAY
        .in(this)
        // #endif
        .select('#ChartBoxId'+this.cid)
        .boundingClientRect(data => {
          this.showchart = true;
          if (data.width > 0 && data.height > 0) {
            if (data.width !== this.cWidth || data.height !== this.cHeight) {
              this.checkData(this.drawData)
            }
          }
        })
        .exec();
    },
    getCloudData() {
      if (this.mixinDatacomLoading == true) {
        return;
      }
      this.mixinDatacomLoading = true;
      this.mixinDatacomGet()
        .then(res => {
          this.mixinDatacomResData = res.result.data;
          this.localdataInit(this.mixinDatacomResData);
        })
        .catch(err => {
          this.mixinDatacomLoading = false;
          this.showchart = false;
          this.mixinDatacomErrorMessage = '请求错误:' + err;
        });
    },
    onMixinDatacomPropsChange(needReset, changed) {
      if (needReset == true && this.collection !== '') {
        this.showchart = false;
        this.mixinDatacomErrorMessage = null;
        this._clearChart();
        this.getCloudData();
      }
    },
    _clearChart() {
      let cid = this.cid
      if (this.echarts !== true && cfu.option[cid] && cfu.option[cid].context) {
        const ctx = cfu.option[cid].context;
        if(typeof ctx === "object" && !!!cfu.option[cid].update){
          ctx.clearRect(0, 0, this.cWidth*this.pixel, this.cHeight*this.pixel);
          ctx.draw();
        }
      }
    },
    init() {
      let cid = this.cid
      let chartdom = uni
        .createSelectorQuery()
        // #ifndef MP-ALIPAY
        .in(this)
        // #endif
        .select('#ChartBoxId'+cid)
        .boundingClientRect(data => {
          if (data.width > 0 && data.height > 0) {
            this.mixinDatacomLoading = false;
            this.showchart = true;
            this.lastDrawTime = Date.now();
            this.cWidth = data.width;
            this.cHeight = data.height;
            if(this.echarts !== true){
              cfu.option[cid].background = this.background == 'rgba(0,0,0,0)' ? '#FFFFFF' : this.background;
              cfu.option[cid].canvas2d = this.type2d;
              cfu.option[cid].pixelRatio = this.pixel;
              cfu.option[cid].animation = this.animation;
              cfu.option[cid].width = data.width * this.pixel;
              cfu.option[cid].height = data.height * this.pixel;
              cfu.option[cid].onzoom = this.onzoom;
              cfu.option[cid].ontap = this.ontap;
              cfu.option[cid].ontouch = this.ontouch;
              cfu.option[cid].onmouse = this.openmouse;
              cfu.option[cid].onmovetip = this.onmovetip;
              cfu.option[cid].tooltipShow = this.tooltipShow;
              cfu.option[cid].tooltipFormat = this.tooltipFormat;
              cfu.option[cid].tooltipCustom = this.tooltipCustom;
              cfu.option[cid].inScrollView = this.inScrollView;
              cfu.option[cid].lastDrawTime = this.lastDrawTime;
              cfu.option[cid].tapLegend = this.tapLegend;
            }
            //如果是H5或者App端,采用renderjs渲染图表
            if (this.inH5 || this.inApp) {
              if (this.echarts == true) {
                cfe.option[cid].ontap = this.ontap;
                cfe.option[cid].onmouse = this.openmouse;
                cfe.option[cid].tooltipShow = this.tooltipShow;
                cfe.option[cid].tooltipFormat = this.tooltipFormat;
                cfe.option[cid].tooltipCustom = this.tooltipCustom;
                cfe.option[cid].lastDrawTime = this.lastDrawTime;
                this.echartsOpts = deepCloneAssign({}, cfe.option[cid]);
              } else {
                cfu.option[cid].rotateLock = cfu.option[cid].rotate;
                this.uchartsOpts = deepCloneAssign({}, cfu.option[cid]);
              }
            //如果是小程序端,采用uCharts渲染
            } else {
              cfu.option[cid] = formatterAssign(cfu.option[cid],cfu.formatter)
              this.mixinDatacomErrorMessage = null;
              this.mixinDatacomLoading = false;
              this.showchart = true;
              this.$nextTick(()=>{
                if (this.type2d === true) {
                  const query = uni.createSelectorQuery().in(this)
                  query
                    .select('#' + cid)
                    .fields({ node: true, size: true })
                    .exec(res => {
                      if (res[0]) {
                        const canvas = res[0].node;
                        const ctx = canvas.getContext('2d');
                        cfu.option[cid].context = ctx;
                        cfu.option[cid].rotateLock = cfu.option[cid].rotate;
                        if(cfu.instance[cid] && cfu.option[cid] && cfu.option[cid].update === true){
                          this._updataUChart(cid)
                        }else{
                          canvas.width = data.width * this.pixel;
                          canvas.height = data.height * this.pixel;
                          canvas._width = data.width * this.pixel;
                          canvas._height = data.height * this.pixel;
                          setTimeout(()=>{
                            cfu.option[cid].context.restore();
                            cfu.option[cid].context.save();
                            this._newChart(cid)
                          },100)
                        }
                      } else {
                        this.showchart = false;
                        this.mixinDatacomErrorMessage = '参数错误:开启2d模式后,未获取到dom节点,canvas-id:' + cid;
                      }
                    });
                } else {
                  if(this.inAli){
                    cfu.option[cid].rotateLock = cfu.option[cid].rotate;
                  }
                  cfu.option[cid].context = uni.createCanvasContext(cid, this);
                  if(cfu.instance[cid] && cfu.option[cid] && cfu.option[cid].update === true){
                    this._updataUChart(cid)
                  }else{
                    setTimeout(()=>{
                      cfu.option[cid].context.restore();
                      cfu.option[cid].context.save();
                      this._newChart(cid)
                    },100)
                  }
                }
              })
            }
          } else {
            this.mixinDatacomLoading = false;
            this.showchart = false;
            if (this.reshow == true) {
              this.mixinDatacomErrorMessage = '布局错误:未获取到父元素宽高尺寸!canvas-id:' + cid;
            }
          }
        })
        .exec();
    },
    saveImage(){
        uni.canvasToTempFilePath({
          canvasId: this.cid,
          success: res=>{
            //#ifdef H5
                var a = document.createElement("a");
                a.href = res.tempFilePath;
                a.download = this.cid;
                a.target = '_blank'
                a.click();
            //#endif
            //#ifndef H5
              uni.saveImageToPhotosAlbum({
              filePath: res.tempFilePath,
              success: function () {
                uni.showToast({
                  title: '保存成功',
                  duration: 2000
                });
              }
              });
            //#endif
          }
        },this);
    },
    getImage(){
      if(this.type2d == false){
        uni.canvasToTempFilePath({
          canvasId: this.cid,
          success: res=>{
            this.emitMsg({name: 'getImage', params: {type:"getImage", base64: res.tempFilePath}});
          }
        },this);
      }else{
        const query = uni.createSelectorQuery().in(this)
        query
          .select('#' + this.cid)
          .fields({ node: true, size: true })
          .exec(res => {
            if (res[0]) {
              const canvas = res[0].node;
              this.emitMsg({name: 'getImage', params: {type:"getImage", base64: canvas.toDataURL('image/png')}});
            }
          });
      }
    },
    // #ifndef APP-VUE || H5
    _newChart(cid) {
      if (this.mixinDatacomLoading == true) {
        return;
      }
      this.showchart = true;
      cfu.instance[cid] = new uCharts(cfu.option[cid]);
      cfu.instance[cid].addEventListener('renderComplete', () => {
        this.emitMsg({name: 'complete', params: {type:"complete", complete: true, id: cid, opts: cfu.instance[cid].opts}});
        cfu.instance[cid].delEventListener('renderComplete')
      });
      cfu.instance[cid].addEventListener('scrollLeft', () => {
        this.emitMsg({name: 'scrollLeft', params: {type:"scrollLeft", scrollLeft: true, id: cid, opts: cfu.instance[cid].opts}});
      });
      cfu.instance[cid].addEventListener('scrollRight', () => {
        this.emitMsg({name: 'scrollRight', params: {type:"scrollRight", scrollRight: true, id: cid, opts: cfu.instance[cid].opts}});
      });
    },
    _updataUChart(cid) {
      cfu.instance[cid].updateData(cfu.option[cid])
    },
    _tooltipDefault(item, category, index, opts) {
      if (category) {
        let data = item.data
        if(typeof item.data === "object"){
          data = item.data.value
        }
        return category + ' ' + item.name + ':' + data;
      } else {
        if (item.properties && item.properties.name) {
          return item.properties.name;
        } else {
          return item.name + ':' + item.data;
        }
      }
    },
    _showTooltip(e) {
      let cid = this.cid
      let tc = cfu.option[cid].tooltipCustom
      if (tc && tc !== undefined && tc !== null) {
        let offset = undefined;
        if (tc.x >= 0 && tc.y >= 0) {
          offset = { x: tc.x, y: tc.y + 10 };
        }
        cfu.instance[cid].showToolTip(e, {
          index: tc.index,
          offset: offset,
          textList: tc.textList,
          formatter: (item, category, index, opts) => {
            if (typeof cfu.option[cid].tooltipFormat === 'string' && cfu.formatter[cfu.option[cid].tooltipFormat]) {
              return cfu.formatter[cfu.option[cid].tooltipFormat](item, category, index, opts);
            } else {
              return this._tooltipDefault(item, category, index, opts);
            }
          }
        });
      } else {
        cfu.instance[cid].showToolTip(e, {
          formatter: (item, category, index, opts) => {
            if (typeof cfu.option[cid].tooltipFormat === 'string' && cfu.formatter[cfu.option[cid].tooltipFormat]) {
              return cfu.formatter[cfu.option[cid].tooltipFormat](item, category, index, opts);
            } else {
              return this._tooltipDefault(item, category, index, opts);
            }
          }
        });
      }
    },
    _tap(e,move) {
      let cid = this.cid
      let currentIndex = null;
      let legendIndex = null;
      if (this.inScrollView === true || this.inAli) {
        let chartdom = uni
          .createSelectorQuery()
          // #ifndef MP-ALIPAY
          .in(this)
          .select('#ChartBoxId'+cid)
          // #endif
          // #ifdef MP-ALIPAY
          .select('#'+this.cid)
          // #endif
          .boundingClientRect(data => {
            e.changedTouches=[];
            if (this.inAli) {
              e.changedTouches.unshift({ x: e.detail.clientX - data.left, y: e.detail.clientY - data.top});
            }else{
              e.changedTouches.unshift({ x: e.detail.x - data.left, y: e.detail.y - data.top - this.pageScrollTop});
            }
            if(move){
              if (this.tooltipShow === true) {
                this._showTooltip(e);
              }
            }else{
              currentIndex = cfu.instance[cid].getCurrentDataIndex(e);
              legendIndex = cfu.instance[cid].getLegendDataIndex(e);
              if(this.tapLegend === true){
                cfu.instance[cid].touchLegend(e);
              }
              if (this.tooltipShow === true) {
                this._showTooltip(e);
              }
              this.emitMsg({name: 'getIndex', params: { type:"getIndex", event:{ x: e.detail.x - data.left, y: e.detail.y - data.top }, currentIndex: currentIndex, legendIndex: legendIndex, id: cid, opts: cfu.instance[cid].opts}});
            }
          })
          .exec();
      } else {
        if(move){
          if (this.tooltipShow === true) {
            this._showTooltip(e);
          }
        }else{
          e.changedTouches=[];
          e.changedTouches.unshift({ x: e.detail.x - e.currentTarget.offsetLeft, y: e.detail.y - e.currentTarget.offsetTop });
          currentIndex = cfu.instance[cid].getCurrentDataIndex(e);
          legendIndex = cfu.instance[cid].getLegendDataIndex(e);
          if(this.tapLegend === true){
            cfu.instance[cid].touchLegend(e);
          }
          if (this.tooltipShow === true) {
            this._showTooltip(e);
          }
          this.emitMsg({name: 'getIndex', params: {type:"getIndex", event:{ x: e.detail.x, y: e.detail.y - e.currentTarget.offsetTop }, currentIndex: currentIndex, legendIndex: legendIndex, id: cid, opts: cfu.instance[cid].opts}});
        }
      }
    },
    _touchStart(e) {
      let cid = this.cid
      lastMoveTime=Date.now();
      if(cfu.option[cid].enableScroll === true && e.touches.length == 1){
        cfu.instance[cid].scrollStart(e);
      }
      this.emitMsg({name:'getTouchStart', params:{type:"touchStart", event:e.changedTouches[0], id:cid, opts: cfu.instance[cid].opts}});
    },
    _touchMove(e) {
      let cid = this.cid
      let currMoveTime = Date.now();
      let duration = currMoveTime - lastMoveTime;
      let touchMoveLimit = cfu.option[cid].touchMoveLimit || 24;
      if (duration < Math.floor(1000 / touchMoveLimit)) return;//每秒60帧
      lastMoveTime = currMoveTime;
      if(cfu.option[cid].enableScroll === true && e.changedTouches.length == 1){
        cfu.instance[cid].scroll(e);
      }
      if(this.ontap === true && cfu.option[cid].enableScroll === false && this.onmovetip === true){
        this._tap(e,true)
      }
      if(this.ontouch === true && cfu.option[cid].enableScroll === true && this.onzoom === true && e.changedTouches.length == 2){
        cfu.instance[cid].dobuleZoom(e);
      }
      this.emitMsg({name: 'getTouchMove', params: {type:"touchMove", event:e.changedTouches[0], id: cid, opts: cfu.instance[cid].opts}});
    },
    _touchEnd(e) {
      let cid = this.cid
      if(cfu.option[cid].enableScroll === true && e.touches.length == 0){
        cfu.instance[cid].scrollEnd(e);
      }
      this.emitMsg({name:'getTouchEnd', params:{type:"touchEnd", event:e.changedTouches[0], id:cid, opts: cfu.instance[cid].opts}});
      if(this.ontap === true && cfu.option[cid].enableScroll === false && this.onmovetip === true){
        this._tap(e,true)
      }
    },
    // #endif
    _error(e) {
      this.mixinDatacomErrorMessage = e.detail.errMsg;
    },
    emitMsg(msg) {
      this.$emit(msg.name, msg.params);
    },
    getRenderType() {
      //防止如果开启echarts且父元素为v-if的情况renderjs监听不到prop变化的问题
      if(this.echarts===true && this.mixinDatacomLoading===false){
        this.beforeInit()
      }
    },
    toJSON(){
      return this
    }
  }
};
</script>
<!-- #ifdef APP-VUE || H5 -->
<script module="rdcharts" lang="renderjs">
import uChartsRD from '../../js_sdk/u-charts/u-charts.js';
import cfu from '../../js_sdk/u-charts/config-ucharts.js';
import cfe from '../../js_sdk/u-charts/config-echarts.js';
var that = {};
var rootdom = null;
function rddeepCloneAssign(origin = {}, ...args) {
  for (let i in args) {
    for (let key in args[i]) {
      if (args[i].hasOwnProperty(key)) {
        origin[key] = args[i][key] && typeof args[i][key] === 'object' ? rddeepCloneAssign(Array.isArray(args[i][key]) ? [] : {}, origin[key], args[i][key]) : args[i][key];
      }
    }
  }
  return origin;
}
function rdformatterAssign(args,formatter) {
  for (let key in args) {
    if(args.hasOwnProperty(key) && args[key] !== null && typeof args[key] === 'object'){
      rdformatterAssign(args[key],formatter)
    }else if(key === 'format' && typeof args[key] === 'string'){
      args['formatter'] = formatter[args[key]] ? formatter[args[key]] : undefined;
    }
  }
  return args;
}
export default {
  data() {
    return {
      rid:null
    }
  },
  mounted() {
    rootdom = {top:0,left:0}
    let dm = document.querySelectorAll('uni-main')[0]
    if(dm === undefined){
      dm = document.querySelectorAll('uni-page-wrapper')[0]
    }
    if(dm !== undefined){
      rootdom = {top:dm.offsetTop,left:dm.offsetLeft}
    }
    setTimeout(()=>{
      if(this.rid === null){
        this.$ownerInstance && this.$ownerInstance.callMethod('getRenderType')
      }
    },200)
  },
  destroyed(){
    delete cfu.option[this.rid]
    delete cfu.instance[this.rid]
    delete cfe.option[this.rid]
    delete cfe.instance[this.rid]
  },
  methods: {
    //==============以下是ECharts的方法====================
    ecinit(newVal, oldVal, owner, instance){
      let cid = JSON.stringify(newVal.id)
      this.rid = cid
      that[cid] = this.$ownerInstance || instance
      let eopts = JSON.parse(JSON.stringify(newVal))
      let type = eopts.type;
      //载入并覆盖默认配置
      if (type && cfe.type.includes(type)) {
        cfe.option[cid] = rddeepCloneAssign({}, cfe[type], eopts);
      }else{
        cfe.option[cid] = rddeepCloneAssign({}, eopts);
      }
      let newData = eopts.chartData;
      if(newData){
        //挂载categories和series
        if(cfe.option[cid].xAxis && cfe.option[cid].xAxis.type && cfe.option[cid].xAxis.type === 'category'){
          cfe.option[cid].xAxis.data = newData.categories
        }
        if(cfe.option[cid].yAxis && cfe.option[cid].yAxis.type && cfe.option[cid].yAxis.type === 'category'){
          cfe.option[cid].yAxis.data = newData.categories
        }
        cfe.option[cid].series = []
        for (var i = 0; i < newData.series.length; i++) {
          cfe.option[cid].seriesTemplate = cfe.option[cid].seriesTemplate ? cfe.option[cid].seriesTemplate : {}
          let Template = rddeepCloneAssign({},cfe.option[cid].seriesTemplate,newData.series[i])
          cfe.option[cid].series.push(Template)
        }
      }
      if (typeof window.echarts === 'object') {
          this.newEChart()
      }else{
        const script = document.createElement('script')
        script.src = './uni_modules/qiun-data-charts/static/app-plus/echarts.min.js'
        const rooturl = window.location.origin
        const directory = instance.getDataset().directory
        script.src = rooturl + directory + 'uni_modules/qiun-data-charts/static/h5/echarts.min.js'
        script.onload = this.newEChart
        document.head.appendChild(script)
      }
    },
    ecresize(newVal, oldVal, owner, instance){
      if(cfe.instance[this.rid]){
        cfe.instance[this.rid].resize()
      }
    },
    newEChart(){
      let cid = this.rid
      if(cfe.instance[cid] === undefined){
        cfe.instance[cid] = echarts.init(that[cid].$el.children[0])
        //ontap开启后才触发click事件
        if(cfe.option[cid].ontap === true){
          cfe.instance[cid].on('click', resdata => {
            let event = JSON.parse(JSON.stringify({
              x:resdata.event.offsetX,y:resdata.event.offsetY
            }))
            that[cid].callMethod('emitMsg',{name:"getIndex", params:{type:"getIndex", event:event, currentIndex:resdata.dataIndex, value:resdata.data, seriesName: resdata.seriesName,id:cid}})
          })
          // å¢žåŠ ECharts的highlight消息,实现按下移动返回索引功能。add by onefish åˆ›å»ºäºŽ 2021-12-11 09:50
          cfe.instance[cid].on('highlight', resdata => {
            that[cid].callMethod('emitMsg',{name:"getHighlight", params:{type:"highlight", res:resdata, id:cid}})
          })
        }
        this.updataEChart(cid,cfe.option[cid])
      }else{
        this.updataEChart(cid,cfe.option[cid])
      }
    },
    updataEChart(cid,option){
      //替换option内format属性为formatter的预定义方法
      option = rdformatterAssign(option,cfe.formatter)
      if(option.tooltip){
        option.tooltip.show = option.tooltipShow?true:false;
        option.tooltip.position = this.tooltipPosition()
        //tooltipFormat方法,替换组件的tooltipFormat为config-echarts.js内对应的方法
        if (typeof option.tooltipFormat === 'string' && cfe.formatter[option.tooltipFormat]) {
          option.tooltip.formatter = option.tooltip.formatter ? option.tooltip.formatter : cfe.formatter[option.tooltipFormat]
        }
      }
      // é¢œè‰²æ¸å˜æ·»åŠ çš„æ–¹æ³•
      if (option.series) {
          for (let i in option.series) {
              let linearGradient = option.series[i].linearGradient
              if (linearGradient) {
                  option.series[i].color = new echarts.graphic.LinearGradient(linearGradient[0],linearGradient[1],linearGradient[2],linearGradient[3],linearGradient[4])
              }
          }
      }
      cfe.instance[cid].setOption(option, option.notMerge)
      cfe.instance[cid].on('finished', function(){
        that[cid].callMethod('emitMsg',{name:"complete",params:{type:"complete",complete:true,id:cid}})
        if(cfe.instance[cid]){
          cfe.instance[cid].off('finished')
        }
      });
      //修复init初始化实例获取宽高不正确问题
      if(
        typeof that[cid].$el.children[0].clientWidth != 'undefined' &&
          (
            Math.abs( that[cid].$el.children[0].clientWidth - cfe.instance[cid].getWidth() )>3 ||
            Math.abs( that[cid].$el.children[0].clientHeight - cfe.instance[cid].getHeight() )>3
          )
      ){this.ecresize();}
    },
    tooltipPosition(){
      return (point, params, dom, rect, size) => {
          let x = point[0]
          let y = point[1]
          let viewWidth = size.viewSize[0]
          let viewHeight = size.viewSize[1]
          let boxWidth = size.contentSize[0]
          let boxHeight = size.contentSize[1]
          let posX = x + 30
          let posY = y + 30
          if (posX + boxWidth > viewWidth) {
              posX = x - boxWidth - 30
          }
          if (posY + boxHeight > viewHeight) {
              posY = y - boxHeight - 30
          }
          return [posX, posY]
      }
    },
    //==============以下是uCharts的方法====================
    ucinit(newVal, oldVal, owner, instance){
      if(JSON.stringify(newVal) == JSON.stringify(oldVal)){
        return;
      }
      if(!newVal.canvasId){
        return;
      }
      let cid = JSON.parse(JSON.stringify(newVal.canvasId))
      this.rid = cid
      that[cid] = this.$ownerInstance || instance
      cfu.option[cid] = JSON.parse(JSON.stringify(newVal))
      cfu.option[cid] = rdformatterAssign(cfu.option[cid],cfu.formatter)
      let canvasdom = document.getElementById(cid)
      if(canvasdom && canvasdom.children[0]){
        cfu.option[cid].context = canvasdom.children[0].getContext("2d")
        if(cfu.instance[cid] && cfu.option[cid] && cfu.option[cid].update === true){
          this.updataUChart()
        }else{
          setTimeout(()=>{
            cfu.option[cid].context.restore();
            cfu.option[cid].context.save();
            this.newUChart()
          },100)
        }
      }
    },
    newUChart() {
      let cid = this.rid
      cfu.instance[cid] = new uChartsRD(cfu.option[cid])
      cfu.instance[cid].addEventListener('renderComplete', () => {
        that[cid].callMethod('emitMsg',{name:"complete",params:{type:"complete",complete:true,id:cid, opts: cfu.instance[cid].opts}})
        cfu.instance[cid].delEventListener('renderComplete')
      });
      cfu.instance[cid].addEventListener('scrollLeft', () => {
        that[cid].callMethod('emitMsg',{name:"scrollLeft",params:{type:"scrollLeft",scrollLeft:true,id:cid, opts: cfu.instance[cid].opts}})
      });
      cfu.instance[cid].addEventListener('scrollRight', () => {
        that[cid].callMethod('emitMsg',{name:"scrollRight",params:{type:"scrollRight",scrollRight:true,id:cid, opts: cfu.instance[cid].opts}})
      });
    },
    updataUChart() {
      let cid = this.rid
      cfu.instance[cid].updateData(cfu.option[cid])
    },
    tooltipDefault(item, category, index, opts) {
      if (category) {
        let data = item.data
        if(typeof item.data === "object"){
          data = item.data.value
        }
        return category + ' ' + item.name + ':' + data;
      } else {
        if (item.properties && item.properties.name) {
          return item.properties.name ;
        } else {
          return item.name + ':' + item.data;
        }
      }
    },
    showTooltip(e,cid) {
      let tc = cfu.option[cid].tooltipCustom
      if (tc && tc !== undefined && tc !== null) {
        let offset = undefined;
        if (tc.x >= 0 && tc.y >= 0) {
          offset = { x: tc.x, y: tc.y + 10 };
        }
        cfu.instance[cid].showToolTip(e, {
          index: tc.index,
          offset: offset,
          textList: tc.textList,
          formatter: (item, category, index, opts) => {
            if (typeof cfu.option[cid].tooltipFormat === 'string' && cfu.formatter[cfu.option[cid].tooltipFormat]) {
              return cfu.formatter[cfu.option[cid].tooltipFormat](item, category, index, opts);
            } else {
              return this.tooltipDefault(item, category, index, opts);
            }
          }
        });
      } else {
        cfu.instance[cid].showToolTip(e, {
          formatter: (item, category, index, opts) => {
            if (typeof cfu.option[cid].tooltipFormat === 'string' && cfu.formatter[cfu.option[cid].tooltipFormat]) {
              return cfu.formatter[cfu.option[cid].tooltipFormat](item, category, index, opts);
            } else {
              return this.tooltipDefault(item, category, index, opts);
            }
          }
        });
      }
    },
    tap(e) {
      let cid = this.rid
      let ontap = cfu.option[cid].ontap
      let tooltipShow = cfu.option[cid].tooltipShow
      let tapLegend = cfu.option[cid].tapLegend
      if(ontap == false) return;
      let currentIndex=null
      let legendIndex=null
      let rchartdom = document.getElementById('UC'+cid).getBoundingClientRect()
      let tmpe = {}
      if(e.detail.x){//tap或者click的事件
        tmpe = { x: e.detail.x - rchartdom.left, y:e.detail.y - rchartdom.top + rootdom.top}
      }else{//mouse的事件
        tmpe = { x: e.clientX - rchartdom.left, y:e.clientY - rchartdom.top + rootdom.top}
      }
      e.changedTouches = [];
      e.changedTouches.unshift(tmpe)
      currentIndex=cfu.instance[cid].getCurrentDataIndex(e)
      legendIndex=cfu.instance[cid].getLegendDataIndex(e)
      if(tapLegend === true){
        cfu.instance[cid].touchLegend(e);
      }
      if(tooltipShow==true){
        this.showTooltip(e,cid)
      }
      that[cid].callMethod('emitMsg',{name:"getIndex",params:{type:"getIndex",event:tmpe,currentIndex:currentIndex,legendIndex:legendIndex,id:cid, opts: cfu.instance[cid].opts}})
    },
    touchStart(e) {
      let cid = this.rid
      let ontouch = cfu.option[cid].ontouch
      if(ontouch == false) return;
      if(cfu.option[cid].enableScroll === true && e.touches.length == 1){
        cfu.instance[cid].scrollStart(e);
      }
      that[cid].callMethod('emitMsg',{name:"getTouchStart",params:{type:"touchStart",event:e.changedTouches[0],id:cid, opts: cfu.instance[cid].opts}})
    },
    touchMove(e) {
      let cid = this.rid
      let ontouch = cfu.option[cid].ontouch
      if(ontouch == false) return;
      if(cfu.option[cid].enableScroll === true && e.changedTouches.length == 1){
        cfu.instance[cid].scroll(e);
      }
      if(cfu.option[cid].ontap === true && cfu.option[cid].enableScroll === false && cfu.option[cid].onmovetip === true){
        let rchartdom = document.getElementById('UC'+cid).getBoundingClientRect()
        let tmpe = { x: e.changedTouches[0].clientX - rchartdom.left, y:e.changedTouches[0].clientY - rchartdom.top + rootdom.top}
        e.changedTouches.unshift(tmpe)
        if(cfu.option[cid].tooltipShow === true){
          this.showTooltip(e,cid)
        }
      }
      if(ontouch === true && cfu.option[cid].enableScroll === true && cfu.option[cid].onzoom === true && e.changedTouches.length == 2){
        cfu.instance[cid].dobuleZoom(e);
      }
      that[cid].callMethod('emitMsg',{name:"getTouchMove",params:{type:"touchMove",event:e.changedTouches[0],id:cid, opts: cfu.instance[cid].opts}})
    },
    touchEnd(e) {
      let cid = this.rid
      let ontouch = cfu.option[cid].ontouch
      if(ontouch == false) return;
      if(cfu.option[cid].enableScroll === true && e.touches.length == 0){
        cfu.instance[cid].scrollEnd(e);
      }
      that[cid].callMethod('emitMsg',{name:"getTouchEnd",params:{type:"touchEnd",event:e.changedTouches[0],id:cid, opts: cfu.instance[cid].opts}})
    },
    mouseDown(e) {
      let cid = this.rid
      let onmouse = cfu.option[cid].onmouse
      if(onmouse == false) return;
      let rchartdom = document.getElementById('UC'+cid).getBoundingClientRect()
      let tmpe = {}
      tmpe = { x: e.clientX - rchartdom.left, y:e.clientY - rchartdom.top + rootdom.top}
      e.changedTouches = [];
      e.changedTouches.unshift(tmpe)
      cfu.instance[cid].scrollStart(e)
      cfu.option[cid].mousedown=true;
      that[cid].callMethod('emitMsg',{name:"getTouchStart",params:{type:"mouseDown",event:tmpe,id:cid, opts: cfu.instance[cid].opts}})
    },
    mouseMove(e) {
      let cid = this.rid
      let onmouse = cfu.option[cid].onmouse
      let tooltipShow = cfu.option[cid].tooltipShow
      if(onmouse == false) return;
      let rchartdom = document.getElementById('UC'+cid).getBoundingClientRect()
      let tmpe = {}
      tmpe = { x: e.clientX - rchartdom.left, y:e.clientY - rchartdom.top + rootdom.top}
      e.changedTouches = [];
      e.changedTouches.unshift(tmpe)
      if(cfu.option[cid].mousedown){
        cfu.instance[cid].scroll(e)
        that[cid].callMethod('emitMsg',{name:"getTouchMove",params:{type:"mouseMove",event:tmpe,id:cid, opts: cfu.instance[cid].opts}})
      }else if(cfu.instance[cid]){
        if(tooltipShow==true){
          this.showTooltip(e,cid)
        }
      }
    },
    mouseUp(e) {
      let cid = this.rid
      let onmouse = cfu.option[cid].onmouse
      if(onmouse == false) return;
      let rchartdom = document.getElementById('UC'+cid).getBoundingClientRect()
      let tmpe = {}
      tmpe = { x: e.clientX - rchartdom.left, y:e.clientY - rchartdom.top + rootdom.top}
      e.changedTouches = [];
      e.changedTouches.unshift(tmpe)
      cfu.instance[cid].scrollEnd(e)
      cfu.option[cid].mousedown=false;
      that[cid].callMethod('emitMsg',{name:"getTouchEnd",params:{type:"mouseUp",event:tmpe,id:cid, opts: cfu.instance[cid].opts}})
    },
  }
}
</script>
<!-- #endif -->
<style scoped>
.chartsview {
  width: 100%;
  height: 100%;
  display: flex;
  flex: 1;
  justify-content: center;
  align-items: center;
}
</style>
src/components/qiun-data-charts/components/qiun-error/qiun-error.vue
src/components/qiun-data-charts/components/qiun-loading/loading1.vue
src/components/qiun-data-charts/components/qiun-loading/loading2.vue
src/components/qiun-data-charts/components/qiun-loading/loading3.vue
src/components/qiun-data-charts/components/qiun-loading/loading4.vue
src/components/qiun-data-charts/components/qiun-loading/loading5.vue
src/components/qiun-data-charts/components/qiun-loading/qiun-loading.vue
src/components/qiun-data-charts/js_sdk/u-charts/config-echarts.js
src/components/qiun-data-charts/js_sdk/u-charts/config-ucharts.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,606 @@
/*
 * uCharts®
 * é«˜æ€§èƒ½è·¨å¹³å°å›¾è¡¨åº“,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台
 * Copyright (c) 2021 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
 *
 */
// ä¸»é¢˜é¢œè‰²é…ç½®ï¼šå¦‚每个图表类型需要不同主题,请在对应图表类型上更改color属性
const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc'];
//事件转换函数,主要用作格式化x轴为时间轴,根据需求自行修改
const formatDateTime = (timeStamp, returnType)=>{
  var date = new Date();
  date.setTime(timeStamp * 1000);
  var y = date.getFullYear();
  var m = date.getMonth() + 1;
  m = m < 10 ? ('0' + m) : m;
  var d = date.getDate();
  d = d < 10 ? ('0' + d) : d;
  var h = date.getHours();
  h = h < 10 ? ('0' + h) : h;
  var minute = date.getMinutes();
  var second = date.getSeconds();
  minute = minute < 10 ? ('0' + minute) : minute;
  second = second < 10 ? ('0' + second) : second;
  if(returnType == 'full'){return y + '-' + m + '-' + d + ' '+ h +':' + minute + ':' + second;}
  if(returnType == 'y-m-d'){return y + '-' + m + '-' + d;}
  if(returnType == 'h:m'){return  h +':' + minute;}
  if(returnType == 'h:m:s'){return  h +':' + minute +':' + second;}
  return [y, m, d, h, minute, second];
}
const cfu = {
  //demotype为自定义图表类型,一般不需要自定义图表类型,只需要改根节点上对应的类型即可
    "type":["pie","ring","rose","word","funnel","map","arcbar","line","column","mount","bar","area","radar","gauge","candle","mix","tline","tarea","scatter","bubble","demotype"],
    "range":["饼状图","圆环图","玫瑰图","词云图","漏斗图","地图","圆弧进度条","折线图","柱状图","山峰图","条状图","区域图","雷达图","仪表盘","K线图","混合图","时间轴折线","时间轴区域","散点图","气泡图","自定义类型"],
  //增加自定义图表类型,如果需要categories,请在这里加入您的图表类型,例如最后的"demotype"
  //自定义类型时需要注意"tline","tarea","scatter","bubble"等时间轴(矢量x轴)类图表,没有categories,不需要加入categories
    "categories":["line","column","mount","bar","area","radar","gauge","candle","mix","demotype"],
  //instance为实例变量承载属性,不要删除
  "instance":{},
  //option为opts及eopts承载属性,不要删除
  "option":{},
  //下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
  "formatter":{
    "yAxisDemo1":function(val, index, opts){return val+'元'},
    "yAxisDemo2":function(val, index, opts){return val.toFixed(2)},
    "xAxisDemo1":function(val, index, opts){return val+'å¹´';},
    "xAxisDemo2":function(val, index, opts){return formatDateTime(val,'h:m')},
    "seriesDemo1":function(val, index, series, opts){return val+'元'},
    "tooltipDemo1":function(item, category, index, opts){
      if(index==0){
          return '随便用'+item.data+'å¹´'
      }else{
          return '其他我没改'+item.data+'天'
      }
    },
    "pieDemo":function(val, index, series, opts){
      if(index !== undefined){
        return series[index].name+':'+series[index].data+'元'
      }
    },
  },
  //这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" åŽï¼Œç»„件会调用这个花括号里的option,如果组件上还存在opts参数,会将demotype与opts中option合并后渲染图表。
  "demotype":{
    //我这里把曲线图当做了自定义图表类型,您可以根据需要随意指定类型或配置
    "type": "line",
    "color": color,
    "padding": [15,10,0,15],
    "xAxis": {
      "disableGrid": true,
    },
    "yAxis": {
      "gridType": "dash",
      "dashLength": 2,
    },
    "legend": {
    },
    "extra": {
        "line": {
            "type": "curve",
            "width": 2
        },
    }
  },
  //下面是自定义配置,请添加项目所需的通用配置
    "pie":{
        "type": "pie",
    "color": color,
        "padding": [5,5,5,5],
        "extra": {
            "pie": {
                "activeOpacity": 0.5,
                "activeRadius": 10,
                "offsetAngle": 0,
                "labelWidth": 15,
                "border": true,
                "borderWidth": 3,
                "borderColor": "#FFFFFF"
            },
        }
    },
    "ring":{
        "type": "ring",
    "color": color,
        "padding": [5,5,5,5],
        "rotate": false,
        "dataLabel": true,
        "legend": {
            "show": true,
            "position": "right",
      "lineHeight": 25,
        },
        "title": {
            "name": "收益率",
            "fontSize": 15,
            "color": "#666666"
        },
        "subtitle": {
            "name": "70%",
            "fontSize": 25,
            "color": "#7cb5ec"
        },
        "extra": {
            "ring": {
                "ringWidth":30,
                "activeOpacity": 0.5,
                "activeRadius": 10,
                "offsetAngle": 0,
                "labelWidth": 15,
                "border": true,
                "borderWidth": 3,
                "borderColor": "#FFFFFF"
            },
        },
    },
    "rose":{
        "type": "rose",
    "color": color,
        "padding": [5,5,5,5],
        "legend": {
            "show": true,
            "position": "left",
      "lineHeight": 25,
        },
        "extra": {
            "rose": {
                "type": "area",
                "minRadius": 50,
                "activeOpacity": 0.5,
                "activeRadius": 10,
                "offsetAngle": 0,
                "labelWidth": 15,
                "border": false,
                "borderWidth": 2,
                "borderColor": "#FFFFFF"
            },
        }
    },
    "word":{
        "type": "word",
    "color": color,
        "extra": {
            "word": {
                "type": "normal",
                "autoColors": false
            }
        }
    },
    "funnel":{
        "type": "funnel",
    "color": color,
        "padding": [15,15,0,15],
        "extra": {
            "funnel": {
                "activeOpacity": 0.3,
                "activeWidth": 10,
                "border": true,
                "borderWidth": 2,
                "borderColor": "#FFFFFF",
                "fillOpacity": 1,
                "labelAlign": "right"
            },
        }
    },
    "map":{
        "type": "map",
    "color": color,
        "padding": [0,0,0,0],
    "dataLabel": true,
        "extra": {
            "map": {
                "border": true,
                "borderWidth": 1,
                "borderColor": "#666666",
                "fillOpacity": 0.6,
                "activeBorderColor": "#F04864",
                "activeFillColor": "#FACC14",
                "activeFillOpacity": 1
            },
        }
    },
    "arcbar":{
        "type": "arcbar",
    "color": color,
        "title": {
            "name": "百分比",
            "fontSize": 25,
            "color": "#00FF00"
        },
        "subtitle": {
            "name": "默认标题",
            "fontSize": 15,
            "color": "#666666"
        },
        "extra": {
            "arcbar": {
                "type": "default",
                "width": 12,
                "backgroundColor": "#E9E9E9",
                "startAngle": 0.75,
                "endAngle": 0.25,
                "gap": 2
            }
        }
    },
    "line":{
        "type": "line",
    "color": color,
        "padding": [15,10,0,15],
        "xAxis": {
      "disableGrid": true,
        },
        "yAxis": {
      "gridType": "dash",
      "dashLength": 2,
        },
        "legend": {
        },
        "extra": {
            "line": {
                "type": "straight",
                "width": 2,
        "activeType": "hollow"
            },
        }
    },
  "tline":{
      "type": "line",
    "color": color,
      "padding": [15,10,0,15],
      "xAxis": {
      "disableGrid": false,
      "boundaryGap":"justify",
      },
      "yAxis": {
      "gridType": "dash",
      "dashLength": 2,
      "data":[
        {
          "min":0,
          "max":80
        }
      ]
      },
      "legend": {
      },
      "extra": {
          "line": {
              "type": "curve",
              "width": 2,
        "activeType": "hollow"
          },
      }
  },
  "tarea":{
      "type": "area",
    "color": color,
      "padding": [15,10,0,15],
      "xAxis": {
      "disableGrid": true,
      "boundaryGap":"justify",
      },
      "yAxis": {
      "gridType": "dash",
      "dashLength": 2,
      "data":[
        {
          "min":0,
          "max":80
        }
      ]
      },
      "legend": {
      },
      "extra": {
          "area": {
              "type": "curve",
              "opacity": 0.2,
              "addLine": true,
              "width": 2,
              "gradient": true,
        "activeType": "hollow"
          },
      }
  },
    "column":{
        "type": "column",
    "color": color,
        "padding": [15,15,0,5],
        "xAxis": {
      "disableGrid": true,
        },
        "yAxis": {
      "data":[{"min":0}]
        },
        "legend": {
        },
        "extra": {
            "column": {
                "type": "group",
                "width": 30,
                "activeBgColor": "#000000",
                "activeBgOpacity": 0.08
            },
        }
    },
  "mount":{
      "type": "mount",
    "color": color,
      "padding": [15,15,0,5],
      "xAxis": {
      "disableGrid": true,
      },
      "yAxis": {
      "data":[{"min":0}]
      },
      "legend": {
      },
      "extra": {
          "mount": {
              "type": "mount",
              "widthRatio": 1.5,
          },
      }
  },
  "bar":{
      "type": "bar",
    "color": color,
      "padding": [15,30,0,5],
      "xAxis": {
      "boundaryGap":"justify",
      "disableGrid":false,
      "min":0,
      "axisLine":false
      },
      "yAxis": {
      },
      "legend": {
      },
      "extra": {
          "bar": {
              "type": "group",
              "width": 30,
              "meterBorde": 1,
              "meterFillColor": "#FFFFFF",
              "activeBgColor": "#000000",
              "activeBgOpacity": 0.08
          },
      }
  },
    "area":{
        "type": "area",
        "color": color,
        "padding": [15,15,0,15],
        "xAxis": {
      "disableGrid": true,
        },
        "yAxis": {
      "gridType": "dash",
      "dashLength": 2,
        },
        "legend": {
        },
        "extra": {
            "area": {
                "type": "straight",
                "opacity": 0.2,
                "addLine": true,
                "width": 2,
                "gradient": false,
        "activeType": "hollow"
            },
        }
    },
    "radar":{
        "type": "radar",
        "color": color,
        "padding": [5,5,5,5],
    "dataLabel": false,
        "legend": {
            "show": true,
            "position": "right",
      "lineHeight": 25,
        },
        "extra": {
            "radar": {
                "gridType": "radar",
                "gridColor": "#CCCCCC",
                "gridCount": 3,
                "opacity": 0.2,
                "max": 200,
                "labelShow": true
            },
        }
    },
    "gauge":{
        "type": "gauge",
        "color": color,
        "title": {
            "name": "66Km/H",
            "fontSize": 25,
            "color": "#2fc25b",
            "offsetY": 50
        },
        "subtitle": {
            "name": "实时速度",
            "fontSize": 15,
            "color": "#1890ff",
            "offsetY": -50
        },
        "extra": {
            "gauge": {
                "type": "default",
                "width": 30,
                "labelColor": "#666666",
                "startAngle": 0.75,
                "endAngle": 0.25,
                "startNumber": 0,
                "endNumber": 100,
                "labelFormat": "",
                "splitLine": {
                    "fixRadius": 0,
                    "splitNumber": 10,
                    "width": 30,
                    "color": "#FFFFFF",
                    "childNumber": 5,
                    "childWidth": 12
                },
                "pointer": {
                    "width": 24,
                    "color": "auto"
                }
            }
        }
    },
    "candle":{
        "type": "candle",
        "color": color,
        "padding": [15,15,0,15],
        "enableScroll": true,
        "enableMarkLine": true,
        "dataLabel": false,
        "xAxis": {
            "labelCount": 4,
            "itemCount": 40,
            "disableGrid": true,
            "gridColor": "#CCCCCC",
            "gridType": "solid",
            "dashLength": 4,
            "scrollShow": true,
            "scrollAlign": "left",
            "scrollColor": "#A6A6A6",
            "scrollBackgroundColor": "#EFEBEF"
        },
        "yAxis": {
        },
        "legend": {
        },
        "extra": {
            "candle": {
                "color": {
                    "upLine": "#f04864",
                    "upFill": "#f04864",
                    "downLine": "#2fc25b",
                    "downFill": "#2fc25b"
                },
                "average": {
                    "show": true,
                    "name": ["MA5","MA10","MA30"],
                    "day": [5,10,20],
                    "color": ["#1890ff","#2fc25b","#facc14"]
                }
            },
            "markLine": {
                "type": "dash",
                "dashLength": 5,
                "data": [
                    {
                        "value": 2150,
                        "lineColor": "#f04864",
                        "showLabel": true
                    },
                    {
                        "value": 2350,
                        "lineColor": "#f04864",
                        "showLabel": true
                    }
                ]
            }
        }
    },
    "mix":{
        "type": "mix",
        "color": color,
        "padding": [15,15,0,15],
        "xAxis": {
      "disableGrid": true,
        },
        "yAxis": {
            "disabled": false,
            "disableGrid": false,
            "splitNumber": 5,
            "gridType": "dash",
            "dashLength": 4,
            "gridColor": "#CCCCCC",
            "padding": 10,
            "showTitle": true,
            "data": []
        },
        "legend": {
        },
        "extra": {
            "mix": {
                "column": {
                    "width": 20
                }
            },
        }
    },
    "scatter":{
        "type": "scatter",
        "color":color,
        "padding":[15,15,0,15],
    "dataLabel":false,
    "xAxis": {
      "disableGrid": false,
      "gridType":"dash",
      "splitNumber":5,
      "boundaryGap":"justify",
      "min":0
    },
    "yAxis": {
      "disableGrid": false,
      "gridType":"dash",
    },
    "legend": {
    },
    "extra": {
        "scatter": {
        },
    }
    },
    "bubble":{
        "type": "bubble",
        "color":color,
        "padding":[15,15,0,15],
    "xAxis": {
      "disableGrid": false,
      "gridType":"dash",
      "splitNumber":5,
      "boundaryGap":"justify",
      "min":0,
      "max":250
    },
    "yAxis": {
      "disableGrid": false,
      "gridType":"dash",
      "data":[{
        "min":0,
        "max":150
      }]
    },
    "legend": {
    },
    "extra": {
        "bubble": {
        "border":2,
        "opacity": 0.5,
        },
    }
    }
}
export default cfu;
src/components/qiun-data-charts/js_sdk/u-charts/readme.md
src/components/qiun-data-charts/js_sdk/u-charts/u-charts.js
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
src/components/qiun-data-charts/js_sdk/u-charts/u-charts.min.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
/*
 * uCharts (R)
 * é«˜æ€§èƒ½è·¨å¹³å°å›¾è¡¨åº“,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360/快手)、Vue、Taro等支持canvas的框架平台
 * Copyright (C) 2021 QIUN (R) ç§‹äº‘ https://www.ucharts.cn All rights reserved.
 * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
 * å¤åˆ¶ä½¿ç”¨è¯·ä¿ç•™æœ¬æ®µæ³¨é‡Šï¼Œæ„Ÿè°¢æ”¯æŒå¼€æºï¼
 *
 * uCharts (R) å®˜æ–¹ç½‘ç«™
 * https://www.uCharts.cn
 *
 * å¼€æºåœ°å€:
 * https://gitee.com/uCharts/uCharts
 *
 * uni-app插件市场地址:
 * http://ext.dcloud.net.cn/plugin?id=271
 *
 */
"use strict";var config={version:"v2.5.0-20230101",yAxisWidth:15,xAxisHeight:22,padding:[10,10,10,10],rotate:false,fontSize:13,fontColor:"#666666",dataPointShape:["circle","circle","circle","circle"],color:["#1890FF","#91CB74","#FAC858","#EE6666","#73C0DE","#3CA272","#FC8452","#9A60B4","#ea7ccc"],linearColor:["#0EE2F8","#2BDCA8","#FA7D8D","#EB88E2","#2AE3A0","#0EE2F8","#EB88E2","#6773E3","#F78A85"],pieChartLinePadding:15,pieChartTextPadding:5,titleFontSize:20,subtitleFontSize:15,radarLabelTextMargin:13};var assign=function(e,...t){if(e==null){throw new TypeError("[uCharts] Cannot convert undefined or null to object")}if(!t||t.length<=0){return e}function i(e,a){for(let t in a){e[t]=e[t]&&e[t].toString()==="[object Object]"?i(e[t],a[t]):e[t]=a[t]}return e}t.forEach(t=>{e=i(e,t)});return e};var util={toFixed:function t(e,a){a=a||2;if(this.isFloat(e)){e=e.toFixed(a)}return e},isFloat:function t(e){return e%1!==0},approximatelyEqual:function t(e,a){return Math.abs(e-a)<1e-10},isSameSign:function t(e,a){return Math.abs(e)===e&&Math.abs(a)===a||Math.abs(e)!==e&&Math.abs(a)!==a},isSameXCoordinateArea:function t(e,a){return this.isSameSign(e.x,a.x)},isCollision:function t(e,a){e.end={};e.end.x=e.start.x+e.width;e.end.y=e.start.y-e.height;a.end={};a.end.x=a.start.x+a.width;a.end.y=a.start.y-a.height;var i=a.start.x>e.end.x||a.end.x<e.start.x||a.end.y>e.start.y||a.start.y<e.end.y;return!i}};function getH5Offset(t){t.mp={changedTouches:[]};t.mp.changedTouches.push({x:t.offsetX,y:t.offsetY});return t}function hexToRgb(t,e){var a=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;var i=t.replace(a,function(t,e,a,i){return e+e+a+a+i+i});var r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(i);var o=parseInt(r[1],16);var n=parseInt(r[2],16);var l=parseInt(r[3],16);return"rgba("+o+","+n+","+l+","+e+")"}function findRange(t,e,a){if(isNaN(t)){throw new Error("[uCharts] series数据需为Number格式")}a=a||10;e=e?e:"upper";var i=1;while(a<1){a*=10;i*=10}if(e==="upper"){t=Math.ceil(t*i)}else{t=Math.floor(t*i)}while(t%a!==0){if(e==="upper"){if(t==t+1){break}t++}else{t--}}return t/i}function calCandleMA(o,t,e,n){let a=[];for(let r=0;r<o.length;r++){let i={data:[],name:t[r],color:e[r]};for(let a=0,t=n.length;a<t;a++){if(a<o[r]){i.data.push(null);continue}let e=0;for(let t=0;t<o[r];t++){e+=n[a-t][1]}i.data.push(+(e/o[r]).toFixed(3))}a.push(i)}return a}function calValidDistance(t,e,a,i,r){var o=r.width-r.area[1]-r.area[3];var n=a.eachSpacing*(r.chartData.xAxisData.xAxisPoints.length-1);if(r.type=="mount"&&r.extra&&r.extra.mount&&r.extra.mount.widthRatio&&r.extra.mount.widthRatio>1){if(r.extra.mount.widthRatio>2)r.extra.mount.widthRatio=2;n+=(r.extra.mount.widthRatio-1)*a.eachSpacing}var l=e;if(e>=0){l=0;t.uevent.trigger("scrollLeft");t.scrollOption.position="left";r.xAxis.scrollPosition="left"}else if(Math.abs(e)>=n-o){l=o-n;t.uevent.trigger("scrollRight");t.scrollOption.position="right";r.xAxis.scrollPosition="right"}else{t.scrollOption.position=e;r.xAxis.scrollPosition=e}return l}function isInAngleRange(t,e,a){function i(t){while(t<0){t+=2*Math.PI}while(t>2*Math.PI){t-=2*Math.PI}return t}t=i(t);e=i(e);a=i(a);if(e>a){a+=2*Math.PI;if(t<e){t+=2*Math.PI}}return t>=e&&t<=a}function createCurveControlPoints(t,e){function a(t,e){if(t[e-1]&&t[e+1]){return t[e].y>=Math.max(t[e-1].y,t[e+1].y)||t[e].y<=Math.min(t[e-1].y,t[e+1].y)}else{return false}}function c(t,e){if(t[e-1]&&t[e+1]){return t[e].x>=Math.max(t[e-1].x,t[e+1].x)||t[e].x<=Math.min(t[e-1].x,t[e+1].x)}else{return false}}var i=.2;var r=.2;var o=null;var n=null;var l=null;var s=null;if(e<1){o=t[0].x+(t[1].x-t[0].x)*i;n=t[0].y+(t[1].y-t[0].y)*i}else{o=t[e].x+(t[e+1].x-t[e-1].x)*i;n=t[e].y+(t[e+1].y-t[e-1].y)*i}if(e>t.length-3){var h=t.length-1;l=t[h].x-(t[h].x-t[h-1].x)*r;s=t[h].y-(t[h].y-t[h-1].y)*r}else{l=t[e+1].x-(t[e+2].x-t[e].x)*r;s=t[e+1].y-(t[e+2].y-t[e].y)*r}if(a(t,e+1)){s=t[e+1].y}if(a(t,e)){n=t[e].y}if(c(t,e+1)){l=t[e+1].x}if(c(t,e)){o=t[e].x}if(n>=Math.max(t[e].y,t[e+1].y)||n<=Math.min(t[e].y,t[e+1].y)){n=t[e].y}if(s>=Math.max(t[e].y,t[e+1].y)||s<=Math.min(t[e].y,t[e+1].y)){s=t[e+1].y}if(o>=Math.max(t[e].x,t[e+1].x)||o<=Math.min(t[e].x,t[e+1].x)){o=t[e].x}if(l>=Math.max(t[e].x,t[e+1].x)||l<=Math.min(t[e].x,t[e+1].x)){l=t[e+1].x}return{ctrA:{x:o,y:n},ctrB:{x:l,y:s}}}function convertCoordinateOrigin(t,e,a){return{x:a.x+t,y:a.y-e}}function avoidCollision(t,e){if(e){while(util.isCollision(t,e)){if(t.start.x>0){t.start.y--}else if(t.start.x<0){t.start.y++}else{if(t.start.y>0){t.start.y++}else{t.start.y--}}}}return t}function fixPieSeries(e,a,t){let i=[];if(e.length>0&&e[0].data.constructor.toString().indexOf("Array")>-1){a._pieSeries_=e;let t=e[0].data;for(var r=0;r<t.length;r++){t[r].formatter=e[0].formatter;t[r].data=t[r].value;i.push(t[r])}a.series=i}else{i=e}return i}function fillSeries(e,a,i){var r=0;for(var o=0;o<e.length;o++){let t=e[o];if(!t.color){t.color=i.color[r];r=(r+1)%i.color.length}if(!t.linearIndex){t.linearIndex=o}if(!t.index){t.index=0}if(!t.type){t.type=a.type}if(typeof t.show=="undefined"){t.show=true}if(!t.type){t.type=a.type}if(!t.pointShape){t.pointShape="circle"}if(!t.legendShape){switch(t.type){case"line":t.legendShape="line";break;case"column":case"bar":t.legendShape="rect";break;case"area":case"mount":t.legendShape="triangle";break;default:t.legendShape="circle"}}}return e}function fillCustomColor(t,e,a,i){var r=e||[];if(t=="custom"&&r.length==0){r=i.linearColor}if(t=="custom"&&r.length<a.length){let t=a.length-r.length;for(var o=0;o<t;o++){r.push(i.linearColor[(o+1)%i.linearColor.length])}}return r}function getDataRange(t,e){var a=0;var i=e-t;if(i>=1e4){a=1e3}else if(i>=1e3){a=100}else if(i>=100){a=10}else if(i>=10){a=5}else if(i>=1){a=1}else if(i>=.1){a=.1}else if(i>=.01){a=.01}else if(i>=.001){a=.001}else if(i>=1e-4){a=1e-4}else if(i>=1e-5){a=1e-5}else{a=1e-6}return{minRange:findRange(t,"lower",a),maxRange:findRange(e,"upper",a)}}function measureText(a,t,e){var i=0;a=String(a);e=false;if(e!==false&&e!==undefined&&e.setFontSize&&e.measureText){e.setFontSize(t);return e.measureText(a).width}else{var a=a.split("");for(let e=0;e<a.length;e++){let t=a[e];if(/[a-zA-Z]/.test(t)){i+=7}else if(/[0-9]/.test(t)){i+=5.5}else if(/\./.test(t)){i+=2.7}else if(/-/.test(t)){i+=3.25}else if(/:/.test(t)){i+=2.5}else if(/[\u4e00-\u9fa5]/.test(t)){i+=10}else if(/\(|\)/.test(t)){i+=3.73}else if(/\s/.test(t)){i+=2.5}else if(/%/.test(t)){i+=8}else{i+=10}}return i*t/10}}function dataCombine(t){return t.reduce(function(t,e){return(t.data?t.data:t).concat(e.data)},[])}function dataCombineStack(t,e){var a=new Array(e);for(var i=0;i<a.length;i++){a[i]=0}for(var r=0;r<t.length;r++){for(var i=0;i<a.length;i++){a[i]+=t[r].data[i]}}return t.reduce(function(t,e){return(t.data?t.data:t).concat(e.data).concat(a)},[])}function getTouches(t,e,a){let i,r;if(t.clientX){if(e.rotate){r=e.height-t.clientX*e.pix;i=(t.pageY-a.currentTarget.offsetTop-e.height/e.pix/2*(e.pix-1))*e.pix}else{i=t.clientX*e.pix;r=(t.pageY-a.currentTarget.offsetTop-e.height/e.pix/2*(e.pix-1))*e.pix}}else{if(e.rotate){r=e.height-t.x*e.pix;i=t.y*e.pix}else{i=t.x*e.pix;r=t.y*e.pix}}return{x:i,y:r}}function getSeriesDataItem(e,i,a){var r=[];var o=[];var n=i.constructor.toString().indexOf("Array")>-1;if(n){let t=filterSeries(e);for(var l=0;l<a.length;l++){o.push(t[a[l]])}}else{o=e}for(let t=0;t<o.length;t++){let e=o[t];let a=-1;if(n){a=i[t]}else{a=i}if(e.data[a]!==null&&typeof e.data[a]!=="undefined"&&e.show){let t={};t.color=e.color;t.type=e.type;t.style=e.style;t.pointShape=e.pointShape;t.disableLegend=e.disableLegend;t.legendShape=e.legendShape;t.name=e.name;t.show=e.show;t.data=e.formatter?e.formatter(e.data[a]):e.data[a];r.push(t)}}return r}function getMaxTextListLength(t,e,a){var i=t.map(function(t){return measureText(t,e,a)});return Math.max.apply(null,i)}function getRadarCoordinateSeries(t){var e=2*Math.PI/t;var a=[];for(var i=0;i<t;i++){a.push(e*i)}return a.map(function(t){return-1*t+Math.PI/2})}function getToolTipData(t,a,i,r,o){var n=arguments.length>5&&arguments[5]!==undefined?arguments[5]:{};var l=a.chartData.calPoints?a.chartData.calPoints:[];let s={};if(r.length>0){let e=[];for(let t=0;t<r.length;t++){e.push(l[r[t]])}s=e[0][i[0]]}else{for(let t=0;t<l.length;t++){if(l[t][i]){s=l[t][i];break}}}var e=t.map(function(t){let e=null;if(a.categories&&a.categories.length>0){e=o[i]}return{text:n.formatter?n.formatter(t,e,i,a):t.name+": "+t.data,color:t.color,legendShape:a.extra.tooltip.legendShape=="auto"?t.legendShape:a.extra.tooltip.legendShape}});var h={x:Math.round(s.x),y:Math.round(s.y)};return{textList:e,offset:h}}function getMixToolTipData(t,e,a,i){var r=arguments.length>4&&arguments[4]!==undefined?arguments[4]:{};var o=e.chartData.xAxisPoints[a]+e.chartData.eachSpacing/2;var n=t.map(function(t){return{text:r.formatter?r.formatter(t,i[a],a,e):t.name+": "+t.data,color:t.color,disableLegend:t.disableLegend?true:false,legendShape:e.extra.tooltip.legendShape=="auto"?t.legendShape:e.extra.tooltip.legendShape}});n=n.filter(function(t){if(t.disableLegend!==true){return t}});var l={x:Math.round(o),y:0};return{textList:n,offset:l}}function getCandleToolTipData(o,e,n,l,i,t){var r=arguments.length>6&&arguments[6]!==undefined?arguments[6]:{};var a=n.chartData.calPoints;let s=t.color.upFill;let h=t.color.downFill;let c=[s,s,h,s];var d=[];e.map(function(t){if(l==0){if(t.data[1]-t.data[0]<0){c[1]=h}else{c[1]=s}}else{if(t.data[0]<o[l-1][1]){c[0]=h}if(t.data[1]<t.data[0]){c[1]=h}if(t.data[2]>o[l-1][1]){c[2]=s}if(t.data[3]<o[l-1][1]){c[3]=h}}let e={text:"开盘:"+t.data[0],color:c[0],legendShape:n.extra.tooltip.legendShape=="auto"?t.legendShape:n.extra.tooltip.legendShape};let a={text:"收盘:"+t.data[1],color:c[1],legendShape:n.extra.tooltip.legendShape=="auto"?t.legendShape:n.extra.tooltip.legendShape};let i={text:"最低:"+t.data[2],color:c[2],legendShape:n.extra.tooltip.legendShape=="auto"?t.legendShape:n.extra.tooltip.legendShape};let r={text:"最高:"+t.data[3],color:c[3],legendShape:n.extra.tooltip.legendShape=="auto"?t.legendShape:n.extra.tooltip.legendShape};d.push(e,a,i,r)});var x=[];var f={x:0,y:0};for(let e=0;e<a.length;e++){let t=a[e];if(typeof t[l]!=="undefined"&&t[l]!==null){x.push(t[l])}}f.x=Math.round(x[0][0].x);return{textList:d,offset:f}}function filterSeries(e){let a=[];for(let t=0;t<e.length;t++){if(e[t].show==true){a.push(e[t])}}return a}function findCurrentIndex(o,n,e,t){var a=arguments.length>4&&arguments[4]!==undefined?arguments[4]:0;var l={index:-1,group:[]};var i=e.chartData.eachSpacing/2;let r=[];if(n&&n.length>0){if(!e.categories){i=0}else{for(let t=1;t<e.chartData.xAxisPoints.length;t++){r.push(e.chartData.xAxisPoints[t]-i)}if((e.type=="line"||e.type=="area")&&e.xAxis.boundaryGap=="justify"){r=e.chartData.xAxisPoints}}if(isInExactChartArea(o,e,t)){if(!e.categories){let a=Array(n.length);for(let e=0;e<n.length;e++){a[e]=Array(n[e].length);for(let t=0;t<n[e].length;t++){a[e][t]=Math.abs(n[e][t].x-o.x)}}let e=Array(a.length);let i=Array(a.length);for(let t=0;t<a.length;t++){e[t]=Math.min.apply(null,a[t]);i[t]=a[t].indexOf(e[t])}let r=Math.min.apply(null,e);l.index=[];for(let t=0;t<e.length;t++){if(e[t]==r){l.group.push(t);l.index.push(i[t])}}}else{r.forEach(function(t,e){if(o.x+a+i>t){l.index=e}})}}}return l}function findBarChartCurrentIndex(a,t,e,i){var r=arguments.length>4&&arguments[4]!==undefined?arguments[4]:0;var o={index:-1,group:[]};var n=e.chartData.eachSpacing/2;let l=e.chartData.yAxisPoints;if(t&&t.length>0){if(isInExactChartArea(a,e,i)){l.forEach(function(t,e){if(a.y+r+n>t){o.index=e}})}}return o}function findLegendIndex(o,t,e){let n=-1;let l=0;if(isInExactLegendArea(o,t.area)){let i=t.points;let r=-1;for(let t=0,e=i.length;t<e;t++){let a=i[t];for(let e=0;e<a.length;e++){r+=1;let t=a[e]["area"];if(t&&o.x>t[0]-l&&o.x<t[2]+l&&o.y>t[1]-l&&o.y<t[3]+l){n=r;break}}}return n}return n}function isInExactLegendArea(t,e){return t.x>e.start.x&&t.x<e.end.x&&t.y>e.start.y&&t.y<e.end.y}function isInExactChartArea(t,e,a){return t.x<=e.width-e.area[1]+10&&t.x>=e.area[3]-10&&t.y>=e.area[0]&&t.y<=e.height-e.area[2]}function findRadarChartCurrentIndex(t,e,a){var r=2*Math.PI/a;var o=-1;if(isInExactPieChartArea(t,e.center,e.radius)){var n=function t(e){if(e<0){e+=2*Math.PI}if(e>2*Math.PI){e-=2*Math.PI}return e};var l=Math.atan2(e.center.y-t.y,t.x-e.center.x);l=-1*l;if(l<0){l+=2*Math.PI}var i=e.angleList.map(function(t){t=n(-1*t);return t});i.forEach(function(t,e){var a=n(t-r/2);var i=n(t+r/2);if(i<a){i+=2*Math.PI}if(l>=a&&l<=i||l+2*Math.PI>=a&&l+2*Math.PI<=i){o=e}})}return o}function findFunnelChartCurrentIndex(t,e){var a=-1;for(var i=0,r=e.series.length;i<r;i++){var o=e.series[i];if(t.x>o.funnelArea[0]&&t.x<o.funnelArea[2]&&t.y>o.funnelArea[1]&&t.y<o.funnelArea[3]){a=i;break}}return a}function findWordChartCurrentIndex(t,e){var a=-1;for(var i=0,r=e.length;i<r;i++){var o=e[i];if(t.x>o.area[0]&&t.x<o.area[2]&&t.y>o.area[1]&&t.y<o.area[3]){a=i;break}}return a}function findMapChartCurrentIndex(t,e){var a=-1;var i=e.chartData.mapData;var r=e.series;var o=pointToCoordinate(t.y,t.x,i.bounds,i.scale,i.xoffset,i.yoffset);var n=[o.x,o.y];for(var l=0,s=r.length;l<s;l++){var h=r[l].geometry.coordinates;if(isPoiWithinPoly(n,h,e.chartData.mapData.mercator)){a=l;break}}return a}function findRoseChartCurrentIndex(t,e,a){var i=-1;var r=getRoseDataPoints(a._series_,a.extra.rose.type,e.radius,e.radius);if(e&&e.center&&isInExactPieChartArea(t,e.center,e.radius)){var o=Math.atan2(e.center.y-t.y,t.x-e.center.x);o=-o;if(a.extra.rose&&a.extra.rose.offsetAngle){o=o-a.extra.rose.offsetAngle*Math.PI/180}for(var n=0,l=r.length;n<l;n++){if(isInAngleRange(o,r[n]._start_,r[n]._start_+r[n]._rose_proportion_*2*Math.PI)){i=n;break}}}return i}function findPieChartCurrentIndex(t,e,a){var i=-1;var r=getPieDataPoints(e.series);if(e&&e.center&&isInExactPieChartArea(t,e.center,e.radius)){var o=Math.atan2(e.center.y-t.y,t.x-e.center.x);o=-o;if(a.extra.pie&&a.extra.pie.offsetAngle){o=o-a.extra.pie.offsetAngle*Math.PI/180}if(a.extra.ring&&a.extra.ring.offsetAngle){o=o-a.extra.ring.offsetAngle*Math.PI/180}for(var n=0,l=r.length;n<l;n++){if(isInAngleRange(o,r[n]._start_,r[n]._start_+r[n]._proportion_*2*Math.PI)){i=n;break}}}return i}function isInExactPieChartArea(t,e,a){return Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)<=Math.pow(a,2)}function splitPoints(t,a){var i=[];var r=[];t.forEach(function(t,e){if(a.connectNulls){if(t!==null){r.push(t)}}else{if(t!==null){r.push(t)}else{if(r.length){i.push(r)}r=[]}}});if(r.length){i.push(r)}return i}function calLegendData(l,s,e,t,h){let c={area:{start:{x:0,y:0},end:{x:0,y:0},width:0,height:0,wholeWidth:0,wholeHeight:0},points:[],widthArr:[],heightArr:[]};if(s.legend.show===false){t.legendData=c;return c}let d=s.legend.padding*s.pix;let x=s.legend.margin*s.pix;let f=s.legend.fontSize?s.legend.fontSize*s.pix:e.fontSize;let p=15*s.pix;let g=5*s.pix;let u=Math.max(s.legend.lineHeight*s.pix,f);if(s.legend.position=="top"||s.legend.position=="bottom"){let i=[];let r=0;let o=[];let n=[];for(let a=0;a<l.length;a++){let t=l[a];const y=t.legendText?t.legendText:t.name;let e=p+g+measureText(y||"undefined",f,h)+s.legend.itemGap*s.pix;if(r+e>s.width-s.area[1]-s.area[3]){i.push(n);o.push(r-s.legend.itemGap*s.pix);r=e;n=[t]}else{r+=e;n.push(t)}}if(n.length){i.push(n);o.push(r-s.legend.itemGap*s.pix);c.widthArr=o;let t=Math.max.apply(null,o);switch(s.legend.float){case"left":c.area.start.x=s.area[3];c.area.end.x=s.area[3]+t+2*d;break;case"right":c.area.start.x=s.width-s.area[1]-t-2*d;c.area.end.x=s.width-s.area[1];break;default:c.area.start.x=(s.width-t)/2-d;c.area.end.x=(s.width+t)/2+d}c.area.width=t+2*d;c.area.wholeWidth=t+2*d;c.area.height=i.length*u+2*d;c.area.wholeHeight=i.length*u+2*d+2*x;c.points=i}}else{let t=l.length;let e=s.height-s.area[0]-s.area[2]-2*x-2*d;let a=Math.min(Math.floor(e/u),t);c.area.height=a*u+d*2;c.area.wholeHeight=a*u+d*2;switch(s.legend.float){case"top":c.area.start.y=s.area[0]+x;c.area.end.y=s.area[0]+x+c.area.height;break;case"bottom":c.area.start.y=s.height-s.area[2]-x-c.area.height;c.area.end.y=s.height-s.area[2]-x;break;default:c.area.start.y=(s.height-c.area.height)/2;c.area.end.y=(s.height+c.area.height)/2}let i=t%a===0?t/a:Math.floor(t/a+1);let r=[];for(let e=0;e<i;e++){let t=l.slice(e*a,e*a+a);r.push(t)}c.points=r;if(r.length){for(let t=0;t<r.length;t++){let a=r[t];let i=0;for(let e=0;e<a.length;e++){let t=p+g+measureText(a[e].name||"undefined",f,h)+s.legend.itemGap*s.pix;if(t>i){i=t}}c.widthArr.push(i);c.heightArr.push(a.length*u+d*2)}let e=0;for(let t=0;t<c.widthArr.length;t++){e+=c.widthArr[t]}c.area.width=e-s.legend.itemGap*s.pix+2*d;c.area.wholeWidth=c.area.width+d}}switch(s.legend.position){case"top":c.area.start.y=s.area[0]+x;c.area.end.y=s.area[0]+x+c.area.height;break;case"bottom":c.area.start.y=s.height-s.area[2]-c.area.height-x;c.area.end.y=s.height-s.area[2]-x;break;case"left":c.area.start.x=s.area[3];c.area.end.x=s.area[3]+c.area.width;break;case"right":c.area.start.x=s.width-s.area[1]-c.area.width;c.area.end.x=s.width-s.area[1];break}t.legendData=c;return c}function calCategoriesData(t,i,e,a,r){var o={angle:0,xAxisHeight:i.xAxis.lineHeight*i.pix+i.xAxis.marginTop*i.pix};var n=i.xAxis.fontSize*i.pix;var l=t.map(function(t,e){var a=i.xAxis.formatter?i.xAxis.formatter(t,e,i):t;return measureText(String(a),n,r)});var s=Math.max.apply(this,l);if(i.xAxis.rotateLabel==true){o.angle=i.xAxis.rotateAngle*Math.PI/180;let t=i.xAxis.marginTop*i.pix*2+Math.abs(s*Math.sin(o.angle));t=t<n+i.xAxis.marginTop*i.pix*2?t+i.xAxis.marginTop*i.pix*2:t;o.xAxisHeight=t}if(i.enableScroll&&i.xAxis.scrollShow){o.xAxisHeight+=6*i.pix}if(i.xAxis.disabled){o.xAxisHeight=0}return o}function getXAxisTextList(t,e,h,c){var a=arguments.length>4&&arguments[4]!==undefined?arguments[4]:-1;var i;if(c=="stack"){i=dataCombineStack(t,e.categories.length)}else{i=dataCombine(t)}var r=[];i=i.filter(function(t){if(typeof t==="object"&&t!==null){if(t.constructor.toString().indexOf("Array")>-1){return t!==null}else{return t.value!==null}}else{return t!==null}});i.map(function(t){if(typeof t==="object"){if(t.constructor.toString().indexOf("Array")>-1){if(e.type=="candle"){t.map(function(t){r.push(t)})}else{r.push(t[0])}}else{r.push(t.value)}}else{r.push(t)}});var o=0;var n=0;if(r.length>0){o=Math.min.apply(this,r);n=Math.max.apply(this,r)}if(a>-1){if(typeof e.xAxis.data[a].min==="number"){o=Math.min(e.xAxis.data[a].min,o)}if(typeof e.xAxis.data[a].max==="number"){n=Math.max(e.xAxis.data[a].max,n)}}else{if(typeof e.xAxis.min==="number"){o=Math.min(e.xAxis.min,o)}if(typeof e.xAxis.max==="number"){n=Math.max(e.xAxis.max,n)}}if(o===n){var d=n||10;n+=d}var l=o;var x=n;var f=[];var p=(x-l)/e.xAxis.splitNumber;for(var s=0;s<=e.xAxis.splitNumber;s++){f.push(l+p*s)}return f}function calXAxisData(t,e,a,i){var r=assign({},{type:""},e.extra.bar);var o={angle:0,xAxisHeight:e.xAxis.lineHeight*e.pix+e.xAxis.marginTop*e.pix};o.ranges=getXAxisTextList(t,e,a,r.type);o.rangesFormat=o.ranges.map(function(t){t=util.toFixed(t,2);return t});var n=o.ranges.map(function(t){t=util.toFixed(t,2);return t});o=Object.assign(o,getXAxisPoints(n,e,a));var l=o.eachSpacing;var s=n.map(function(t){return measureText(t,e.xAxis.fontSize*e.pix,i)});if(e.xAxis.disabled===true){o.xAxisHeight=0}return o}function getRadarDataPoints(r,o,n,a,t){var l=arguments.length>5&&arguments[5]!==undefined?arguments[5]:1;var e=t.extra.radar||{};e.max=e.max||0;var s=Math.max(e.max,Math.max.apply(null,dataCombine(a)));var h=[];for(let e=0;e<a.length;e++){let t=a[e];let i={};i.color=t.color;i.legendShape=t.legendShape;i.pointShape=t.pointShape;i.data=[];t.data.forEach(function(t,e){let a={};a.angle=r[e];a.proportion=t/s;a.value=t;a.position=convertCoordinateOrigin(n*a.proportion*l*Math.cos(a.angle),n*a.proportion*l*Math.sin(a.angle),o);i.data.push(a)});h.push(i)}return h}function getPieDataPoints(a,i){var r=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;var o=0;var n=0;for(let e=0;e<a.length;e++){let t=a[e];t.data=t.data===null?0:t.data;o+=t.data}for(let e=0;e<a.length;e++){let t=a[e];t.data=t.data===null?0:t.data;if(o===0){t._proportion_=1/a.length*r}else{t._proportion_=t.data/o*r}t._radius_=i}for(let e=0;e<a.length;e++){let t=a[e];t._start_=n;n+=2*t._proportion_*Math.PI}return a}function getFunnelDataPoints(e,a,i,r){var o=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;for(let t=0;t<e.length;t++){if(i.type=="funnel"){e[t].radius=e[t].data/e[0].data*a*o}else{e[t].radius=r*(e.length-t)/(r*e.length)*a*o}e[t]._proportion_=e[t].data/e[0].data}return e}function getRoseDataPoints(a,i,r,o){var n=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var l=0;var s=0;var h=[];for(let e=0;e<a.length;e++){let t=a[e];t.data=t.data===null?0:t.data;l+=t.data;h.push(t.data)}var c=Math.min.apply(null,h);var d=Math.max.apply(null,h);var x=o-r;for(let e=0;e<a.length;e++){let t=a[e];t.data=t.data===null?0:t.data;if(l===0){t._proportion_=1/a.length*n;t._rose_proportion_=1/a.length*n}else{t._proportion_=t.data/l*n;if(i=="area"){t._rose_proportion_=1/a.length*n}else{t._rose_proportion_=t.data/l*n}}t._radius_=r+x*((t.data-c)/(d-c))||o}for(let e=0;e<a.length;e++){let t=a[e];t._start_=s;s+=2*t._rose_proportion_*Math.PI}return a}function getArcbarDataPoints(i,r){var o=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;if(o==1){o=.999999}for(let a=0;a<i.length;a++){let t=i[a];t.data=t.data===null?0:t.data;let e;if(r.type=="circle"){e=2}else{if(r.direction=="ccw"){if(r.startAngle<r.endAngle){e=2+r.startAngle-r.endAngle}else{e=r.startAngle-r.endAngle}}else{if(r.endAngle<r.startAngle){e=2+r.endAngle-r.startAngle}else{e=r.startAngle-r.endAngle}}}t._proportion_=e*t.data*o+r.startAngle;if(r.direction=="ccw"){t._proportion_=r.startAngle-e*t.data*o}if(t._proportion_>=2){t._proportion_=t._proportion_%2}}return i}function getGaugeArcbarDataPoints(i,r){var o=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;if(o==1){o=.999999}for(let a=0;a<i.length;a++){let t=i[a];t.data=t.data===null?0:t.data;let e;if(r.type=="circle"){e=2}else{if(r.endAngle<r.startAngle){e=2+r.endAngle-r.startAngle}else{e=r.startAngle-r.endAngle}}t._proportion_=e*t.data*o+r.startAngle;if(t._proportion_>=2){t._proportion_=t._proportion_%2}}return i}function getGaugeAxisPoints(e,a,t){let i;if(t<a){i=2+t-a}else{i=a-t}let r=a;for(let t=0;t<e.length;t++){e[t].value=e[t].value===null?0:e[t].value;e[t]._startAngle_=r;e[t]._endAngle_=i*e[t].value+a;if(e[t]._endAngle_>=2){e[t]._endAngle_=e[t]._endAngle_%2}r=e[t]._endAngle_}return e}function getGaugeDataPoints(i,r,o){let n=arguments.length>3&&arguments[3]!==undefined?arguments[3]:1;for(let a=0;a<i.length;a++){let e=i[a];e.data=e.data===null?0:e.data;if(o.pointer.color=="auto"){for(let t=0;t<r.length;t++){if(e.data<=r[t].value){e.color=r[t].color;break}}}else{e.color=o.pointer.color}let t;if(o.endAngle<o.startAngle){t=2+o.endAngle-o.startAngle}else{t=o.startAngle-o.endAngle}e._endAngle_=t*e.data+o.startAngle;e._oldAngle_=o.oldAngle;if(o.oldAngle<o.endAngle){e._oldAngle_+=2}if(e.data>=o.oldData){e._proportion_=(e._endAngle_-e._oldAngle_)*n+o.oldAngle}else{e._proportion_=e._oldAngle_-(e._oldAngle_-e._endAngle_)*n}if(e._proportion_>=2){e._proportion_=e._proportion_%2}}return i}function getPieTextMaxLength(i,r,o,n){i=getPieDataPoints(i);let l=0;for(let a=0;a<i.length;a++){let t=i[a];let e=t.formatter?t.formatter(+t._proportion_.toFixed(2)):util.toFixed(t._proportion_*100)+"%";l=Math.max(l,measureText(e,t.textSize*n.pix||r.fontSize,o))}return l}function fixColumeData(t,i,r,o,e,n){return t.map(function(t){if(t===null){return null}var e=0;var a=0;if(n.type=="mix"){e=n.extra.mix.column.seriesGap*n.pix||0;a=n.extra.mix.column.categoryGap*n.pix||0}else{e=n.extra.column.seriesGap*n.pix||0;a=n.extra.column.categoryGap*n.pix||0}e=Math.min(e,i/r);a=Math.min(a,i/r);t.width=Math.ceil((i-2*a-e*(r-1))/r);if(n.extra.mix&&n.extra.mix.column.width&&+n.extra.mix.column.width>0){t.width=Math.min(t.width,+n.extra.mix.column.width*n.pix)}if(n.extra.column&&n.extra.column.width&&+n.extra.column.width>0){t.width=Math.min(t.width,+n.extra.column.width*n.pix)}if(t.width<=0){t.width=1}t.x+=(o+.5-r/2)*(t.width+e);return t})}function fixBarData(t,i,r,o,e,n){return t.map(function(t){if(t===null){return null}var e=0;var a=0;e=n.extra.bar.seriesGap*n.pix||0;a=n.extra.bar.categoryGap*n.pix||0;e=Math.min(e,i/r);a=Math.min(a,i/r);t.width=Math.ceil((i-2*a-e*(r-1))/r);if(n.extra.bar&&n.extra.bar.width&&+n.extra.bar.width>0){t.width=Math.min(t.width,+n.extra.bar.width*n.pix)}if(t.width<=0){t.width=1}t.y+=(o+.5-r/2)*(t.width+e);return t})}function fixColumeMeterData(t,e,a,i,r,o,n){var l=o.extra.column.categoryGap*o.pix||0;return t.map(function(t){if(t===null){return null}t.width=e-2*l;if(o.extra.column&&o.extra.column.width&&+o.extra.column.width>0){t.width=Math.min(t.width,+o.extra.column.width*o.pix)}if(i>0){t.width-=n}return t})}function fixColumeStackData(t,a,e,i,r,o,n){var l=o.extra.column.categoryGap*o.pix||0;return t.map(function(t,e){if(t===null){return null}t.width=Math.ceil(a-2*l);if(o.extra.column&&o.extra.column.width&&+o.extra.column.width>0){t.width=Math.min(t.width,+o.extra.column.width*o.pix)}if(t.width<=0){t.width=1}return t})}function fixBarStackData(t,a,e,i,r,o,n){var l=o.extra.bar.categoryGap*o.pix||0;return t.map(function(t,e){if(t===null){return null}t.width=Math.ceil(a-2*l);if(o.extra.bar&&o.extra.bar.width&&+o.extra.bar.width>0){t.width=Math.min(t.width,+o.extra.bar.width*o.pix)}if(t.width<=0){t.width=1}return t})}function getXAxisPoints(t,e,h){var a=e.width-e.area[1]-e.area[3];var i=e.enableScroll?Math.min(e.xAxis.itemCount,t.length):t.length;if((e.type=="line"||e.type=="area"||e.type=="scatter"||e.type=="bubble"||e.type=="bar")&&i>1&&e.xAxis.boundaryGap=="justify"){i-=1}var r=0;if(e.type=="mount"&&e.extra&&e.extra.mount&&e.extra.mount.widthRatio&&e.extra.mount.widthRatio>1){if(e.extra.mount.widthRatio>2)e.extra.mount.widthRatio=2;r=e.extra.mount.widthRatio-1;i+=r}var o=a/i;var n=[];var l=e.area[3];var s=e.width-e.area[1];t.forEach(function(t,e){n.push(l+r/2*o+e*o)});if(e.xAxis.boundaryGap!=="justify"){if(e.enableScroll===true){n.push(l+r*o+t.length*o)}else{n.push(s)}}return{xAxisPoints:n,startX:l,endX:s,eachSpacing:o}}function getCandleDataPoints(t,l,s,h,c,d,a){var x=arguments.length>7&&arguments[7]!==undefined?arguments[7]:1;var e=[];var f=d.height-d.area[0]-d.area[2];t.forEach(function(t,o){if(t===null){e.push(null)}else{var n=[];t.forEach(function(t,e){var a={};a.x=h[o]+Math.round(c/2);var i=t.value||t;var r=f*(i-l)/(s-l);r*=x;a.y=d.height-Math.round(r)-d.area[2];n.push(a)});e.push(n)}});return e}function getDataPoints(t,a,n,l,s,h,e){var c=arguments.length>7&&arguments[7]!==undefined?arguments[7]:1;var d="center";if(h.type=="line"||h.type=="area"||h.type=="scatter"||h.type=="bubble"){d=h.xAxis.boundaryGap}var x=[];var f=h.height-h.area[0]-h.area[2];var p=h.width-h.area[1]-h.area[3];t.forEach(function(i,t){if(i===null){x.push(null)}else{var r={};r.color=i.color;r.x=l[t];var o=i;if(typeof i==="object"&&i!==null){if(i.constructor.toString().indexOf("Array")>-1){let t,e,a;t=[].concat(h.chartData.xAxisData.ranges);e=t.shift();a=t.pop();o=i[1];r.x=h.area[3]+p*(i[0]-e)/(a-e);if(h.type=="bubble"){r.r=i[2];r.t=i[3]}}else{o=i.value}}if(d=="center"){r.x+=s/2}var e=f*(o-a)/(n-a);e*=c;r.y=h.height-e-h.area[2];x.push(r)}});return x}function getLineDataPoints(t,a,n,l,s,h,e,p,c){var c=arguments.length>8&&arguments[8]!==undefined?arguments[8]:1;var d=h.xAxis.boundaryGap;var x=[];var f=h.height-h.area[0]-h.area[2];var u=h.width-h.area[1]-h.area[3];t.forEach(function(i,t){if(i===null){x.push(null)}else{var r={};r.color=i.color;if(p.animation=="vertical"){r.x=l[t];var o=i;if(typeof i==="object"&&i!==null){if(i.constructor.toString().indexOf("Array")>-1){let t,e,a;t=[].concat(h.chartData.xAxisData.ranges);e=t.shift();a=t.pop();o=i[1];r.x=h.area[3]+u*(i[0]-e)/(a-e)}else{o=i.value}}if(d=="center"){r.x+=s/2}var e=f*(o-a)/(n-a);e*=c;r.y=h.height-e-h.area[2];x.push(r)}else{r.x=l[0]+s*t*c;var o=i;if(d=="center"){r.x+=s/2}var e=f*(o-a)/(n-a);r.y=h.height-e-h.area[2];x.push(r)}}});return x}function getColumnDataPoints(t,a,n,l,s,h,e,i,c){var c=arguments.length>8&&arguments[8]!==undefined?arguments[8]:1;var d=[];var x=h.height-h.area[0]-h.area[2];var f=h.width-h.area[1]-h.area[3];t.forEach(function(i,t){if(i===null){d.push(null)}else{var r={};r.color=i.color;r.x=l[t];var o=i;if(typeof i==="object"&&i!==null){if(i.constructor.toString().indexOf("Array")>-1){let t,e,a;t=[].concat(h.chartData.xAxisData.ranges);e=t.shift();a=t.pop();o=i[1];r.x=h.area[3]+f*(i[0]-e)/(a-e)}else{o=i.value}}r.x+=s/2;var e=x*(o*c-a)/(n-a);r.y=h.height-e-h.area[2];d.push(r)}});return d}function getMountDataPoints(t,o,n,l,s,h,e,a){var c=arguments.length>8&&arguments[8]!==undefined?arguments[8]:1;var d=[];var x=h.height-h.area[0]-h.area[2];var i=h.width-h.area[1]-h.area[3];var f=s*e.widthRatio;t.forEach(function(t,e){if(t===null){d.push(null)}else{var a={};a.color=t.color;a.x=l[e];a.x+=s/2;var i=t.data;var r=x*(i*c-o)/(n-o);a.y=h.height-r-h.area[2];a.value=i;a.width=f;d.push(a)}});return d}function getBarDataPoints(t,o,n,l,e,s,a){var h=arguments.length>7&&arguments[7]!==undefined?arguments[7]:1;var c=[];var i=s.height-s.area[0]-s.area[2];var d=s.width-s.area[1]-s.area[3];t.forEach(function(t,e){if(t===null){c.push(null)}else{var a={};a.color=t.color;a.y=l[e];var i=t;if(typeof t==="object"&&t!==null){i=t.value}var r=d*(i-o)/(n-o);r*=h;a.height=r;a.value=i;a.x=r+s.area[3];c.push(a)}});return c}function getStackDataPoints(t,s,h,c,g,d,e,x,y){var f=arguments.length>9&&arguments[9]!==undefined?arguments[9]:1;var p=[];var u=d.height-d.area[0]-d.area[2];t.forEach(function(t,e){if(t===null){p.push(null)}else{var a={};a.color=t.color;a.x=c[e]+Math.round(g/2);if(x>0){var i=0;for(let t=0;t<=x;t++){i+=y[t].data[e]}var r=i-t;var o=u*(i-s)/(h-s);var n=u*(r-s)/(h-s)}else{var i=t;if(typeof t==="object"&&t!==null){i=t.value}var o=u*(i-s)/(h-s);var n=0}var l=n;o*=f;l*=f;a.y=d.height-Math.round(o)-d.area[2];a.y0=d.height-Math.round(l)-d.area[2];p.push(a)}});return p}function getBarStackDataPoints(t,s,h,c,e,d,a,x,g){var f=arguments.length>9&&arguments[9]!==undefined?arguments[9]:1;var p=[];var u=d.width-d.area[1]-d.area[3];t.forEach(function(t,e){if(t===null){p.push(null)}else{var a={};a.color=t.color;a.y=c[e];if(x>0){var i=0;for(let t=0;t<=x;t++){i+=g[t].data[e]}var r=i-t;var o=u*(i-s)/(h-s);var n=u*(r-s)/(h-s)}else{var i=t;if(typeof t==="object"&&t!==null){i=t.value}var o=u*(i-s)/(h-s);var n=0}var l=n;o*=f;l*=f;a.height=o-l;a.x=d.area[3]+o;a.x0=d.area[3]+l;p.push(a)}});return p}function getYAxisTextList(t,e,h,c,a){var d=arguments.length>5&&arguments[5]!==undefined?arguments[5]:-1;var i;if(c=="stack"){i=dataCombineStack(t,e.categories.length)}else{i=dataCombine(t)}var r=[];i=i.filter(function(t){if(typeof t==="object"&&t!==null){if(t.constructor.toString().indexOf("Array")>-1){return t!==null}else{return t.value!==null}}else{return t!==null}});i.map(function(t){if(typeof t==="object"){if(t.constructor.toString().indexOf("Array")>-1){if(e.type=="candle"){t.map(function(t){r.push(t)})}else{r.push(t[1])}}else{r.push(t.value)}}else{r.push(t)}});var o=a.min||0;var n=a.max||0;if(r.length>0){o=Math.min.apply(this,r);n=Math.max.apply(this,r)}if(o===n){if(n==0){n=10}else{o=0}}var l=getDataRange(o,n);var x=a.min===undefined||a.min===null?l.minRange:a.min;var f=a.max===undefined||a.max===null?l.maxRange:a.max;var p=(f-x)/e.yAxis.splitNumber;var u=[];for(var s=0;s<=e.yAxis.splitNumber;s++){u.push(x+p*s)}return u.reverse()}function calYAxisData(a,o,e,n){var l=assign({},{type:""},o.extra.column);var t=o.yAxis.data.length;var s=new Array(t);if(t>0){for(let e=0;e<t;e++){s[e]=[];for(let t=0;t<a.length;t++){if(a[t].index==e){s[e].push(a[t])}}}var h=new Array(t);var c=new Array(t);var d=new Array(t);for(let r=0;r<t;r++){let i=o.yAxis.data[r];if(o.yAxis.disabled==true){i.disabled=true}if(i.type==="categories"){if(!i.formatter){i.formatter=(t,e,a)=>{return t+(i.unit||"")}}i.categories=i.categories||o.categories;h[r]=i.categories}else{if(!i.formatter){i.formatter=(t,e,a)=>{return util.toFixed(t,i.tofix||0)+(i.unit||"")}}h[r]=getYAxisTextList(s[r],o,e,l.type,i,r)}let a=i.fontSize*o.pix||e.fontSize;d[r]={position:i.position?i.position:"left",width:0};c[r]=h[r].map(function(t,e){t=i.formatter(t,e,o);d[r].width=Math.max(d[r].width,measureText(t,a,n)+5);return t});let t=i.calibration?4*o.pix:0;d[r].width+=t+3*o.pix;if(i.disabled===true){d[r].width=0}}}else{var h=new Array(1);var c=new Array(1);var d=new Array(1);if(o.type==="bar"){h[0]=o.categories;if(!o.yAxis.formatter){o.yAxis.formatter=(t,e,a)=>{return t+(a.yAxis.unit||"")}}}else{if(!o.yAxis.formatter){o.yAxis.formatter=(t,e,a)=>{return t.toFixed(a.yAxis.tofix)+(a.yAxis.unit||"")}}h[0]=getYAxisTextList(a,o,e,l.type,{})}d[0]={position:"left",width:0};var i=o.yAxis.fontSize*o.pix||e.fontSize;c[0]=h[0].map(function(t,e){t=o.yAxis.formatter(t,e,o);d[0].width=Math.max(d[0].width,measureText(t,i,n)+5);return t});d[0].width+=3*o.pix;if(o.yAxis.disabled===true){d[0]={position:"left",width:0};o.yAxis.data[0]={disabled:true}}else{o.yAxis.data[0]={disabled:false,position:"left",max:o.yAxis.max,min:o.yAxis.min,formatter:o.yAxis.formatter};if(o.type==="bar"){o.yAxis.data[0].categories=o.categories;o.yAxis.data[0].type="categories"}}}return{rangesFormat:c,ranges:h,yAxisWidth:d}}function calTooltipYAxisData(r,t,o,e,a){let n=[].concat(o.chartData.yAxisData.ranges);let l=o.height-o.area[0]-o.area[2];let s=o.area[0];let h=[];for(let i=0;i<n.length;i++){let t=Math.max.apply(this,n[i]);let e=Math.min.apply(this,n[i]);let a=t-(t-e)*(r-s)/l;a=o.yAxis.data&&o.yAxis.data[i].formatter?o.yAxis.data[i].formatter(a,i,o):a.toFixed(0);h.push(String(a))}return h}function calMarkLineData(i,r){let o,n;let l=r.height-r.area[0]-r.area[2];for(let a=0;a<i.length;a++){i[a].yAxisIndex=i[a].yAxisIndex?i[a].yAxisIndex:0;let t=[].concat(r.chartData.yAxisData.ranges[i[a].yAxisIndex]);o=t.pop();n=t.shift();let e=l*(i[a].value-o)/(n-o);i[a].y=r.height-Math.round(e)-r.area[2]}return i}function contextRotate(t,e){if(e.rotateLock!==true){t.translate(e.height,0);t.rotate(90*Math.PI/180)}else if(e._rotate_!==true){t.translate(e.height,0);t.rotate(90*Math.PI/180);e._rotate_=true}}function drawPointShape(t,e,a,i,r){i.beginPath();if(r.dataPointShapeType=="hollow"){i.setStrokeStyle(e);i.setFillStyle(r.background);i.setLineWidth(2*r.pix)}else{i.setStrokeStyle("#ffffff");i.setFillStyle(e);i.setLineWidth(1*r.pix)}if(a==="diamond"){t.forEach(function(t,e){if(t!==null){i.moveTo(t.x,t.y-4.5);i.lineTo(t.x-4.5,t.y);i.lineTo(t.x,t.y+4.5);i.lineTo(t.x+4.5,t.y);i.lineTo(t.x,t.y-4.5)}})}else if(a==="circle"){t.forEach(function(t,e){if(t!==null){i.moveTo(t.x+2.5*r.pix,t.y);i.arc(t.x,t.y,3*r.pix,0,2*Math.PI,false)}})}else if(a==="square"){t.forEach(function(t,e){if(t!==null){i.moveTo(t.x-3.5,t.y-3.5);i.rect(t.x-3.5,t.y-3.5,7,7)}})}else if(a==="triangle"){t.forEach(function(t,e){if(t!==null){i.moveTo(t.x,t.y-4.5);i.lineTo(t.x-4.5,t.y+4.5);i.lineTo(t.x+4.5,t.y+4.5);i.lineTo(t.x,t.y-4.5)}})}else if(a==="none"){return}i.closePath();i.fill();i.stroke()}function drawActivePoint(t,e,a,i,r,o,n){if(!r.tooltip){return}if(r.tooltip.group.length>0&&r.tooltip.group.includes(n)==false){return}var l=typeof r.tooltip.index==="number"?r.tooltip.index:r.tooltip.index[r.tooltip.group.indexOf(n)];i.beginPath();if(o.activeType=="hollow"){i.setStrokeStyle(e);i.setFillStyle(r.background);i.setLineWidth(2*r.pix)}else{i.setStrokeStyle("#ffffff");i.setFillStyle(e);i.setLineWidth(1*r.pix)}if(a==="diamond"){t.forEach(function(t,e){if(t!==null&&l==e){i.moveTo(t.x,t.y-4.5);i.lineTo(t.x-4.5,t.y);i.lineTo(t.x,t.y+4.5);i.lineTo(t.x+4.5,t.y);i.lineTo(t.x,t.y-4.5)}})}else if(a==="circle"){t.forEach(function(t,e){if(t!==null&&l==e){i.moveTo(t.x+2.5*r.pix,t.y);i.arc(t.x,t.y,3*r.pix,0,2*Math.PI,false)}})}else if(a==="square"){t.forEach(function(t,e){if(t!==null&&l==e){i.moveTo(t.x-3.5,t.y-3.5);i.rect(t.x-3.5,t.y-3.5,7,7)}})}else if(a==="triangle"){t.forEach(function(t,e){if(t!==null&&l==e){i.moveTo(t.x,t.y-4.5);i.lineTo(t.x-4.5,t.y+4.5);i.lineTo(t.x+4.5,t.y+4.5);i.lineTo(t.x,t.y-4.5)}})}else if(a==="none"){return}i.closePath();i.fill();i.stroke()}function drawRingTitle(t,e,a,i){var r=t.title.fontSize||e.titleFontSize;var o=t.subtitle.fontSize||e.subtitleFontSize;var n=t.title.name||"";var l=t.subtitle.name||"";var c=t.title.color||t.fontColor;var d=t.subtitle.color||t.fontColor;var x=n?r:0;var f=l?o:0;var s=5;if(l){var p=measureText(l,o*t.pix,a);var u=i.x-p/2+(t.subtitle.offsetX||0)*t.pix;var h=i.y+o*t.pix/2+(t.subtitle.offsetY||0)*t.pix;if(n){h+=(x*t.pix+s)/2}a.beginPath();a.setFontSize(o*t.pix);a.setFillStyle(d);a.fillText(l,u,h);a.closePath();a.stroke()}if(n){var g=measureText(n,r*t.pix,a);var y=i.x-g/2+(t.title.offsetX||0);var v=i.y+r*t.pix/2+(t.title.offsetY||0)*t.pix;if(l){v-=(f*t.pix+s)/2}a.beginPath();a.setFontSize(r*t.pix);a.setFillStyle(c);a.fillText(n,y,v);a.closePath();a.stroke()}}function drawPointText(t,o,n,l,s){var h=o.data;var c=o.textOffset?o.textOffset:0;t.forEach(function(t,e){if(t!==null){l.beginPath();var a=o.textSize?o.textSize*s.pix:n.fontSize;l.setFontSize(a);l.setFillStyle(o.textColor||s.fontColor);var i=h[e];if(typeof h[e]==="object"&&h[e]!==null){if(h[e].constructor.toString().indexOf("Array")>-1){i=h[e][1]}else{i=h[e].value}}var r=o.formatter?o.formatter(i,e,o,s):i;l.setTextAlign("center");l.fillText(String(r),t.x,t.y-4+c*s.pix);l.closePath();l.stroke();l.setTextAlign("left")}})}function drawColumePointText(t,n,l,s,h){var c=n.data;var d=n.textOffset?n.textOffset:0;var x=h.extra.column.labelPosition;t.forEach(function(t,e){if(t!==null){s.beginPath();var a=n.textSize?n.textSize*h.pix:l.fontSize;s.setFontSize(a);s.setFillStyle(n.textColor||h.fontColor);var i=c[e];if(typeof c[e]==="object"&&c[e]!==null){if(c[e].constructor.toString().indexOf("Array")>-1){i=c[e][1]}else{i=c[e].value}}var r=n.formatter?n.formatter(i,e,n,h):i;s.setTextAlign("center");var o=t.y-4*h.pix+d*h.pix;if(t.y>n.zeroPoints){o=t.y+d*h.pix+a}if(x=="insideTop"){o=t.y+a+d*h.pix;if(t.y>n.zeroPoints){o=t.y-d*h.pix-4*h.pix}}if(x=="center"){o=t.y+d*h.pix+(h.height-h.area[2]-t.y+a)/2;if(n.zeroPoints<h.height-h.area[2]){o=t.y+d*h.pix+(n.zeroPoints-t.y+a)/2}if(t.y>n.zeroPoints){o=t.y-d*h.pix-(t.y-n.zeroPoints-a)/2}if(h.extra.column.type=="stack"){o=t.y+d*h.pix+(t.y0-t.y+a)/2}}if(x=="bottom"){o=h.height-h.area[2]+d*h.pix-4*h.pix;if(n.zeroPoints<h.height-h.area[2]){o=n.zeroPoints+d*h.pix-4*h.pix}if(t.y>n.zeroPoints){o=n.zeroPoints-d*h.pix+a+2*h.pix}if(h.extra.column.type=="stack"){o=t.y0+d*h.pix-4*h.pix}}s.fillText(String(r),t.x,o);s.closePath();s.stroke();s.setTextAlign("left")}})}function drawMountPointText(t,n,l,s,h,c){var e=n.data;var d=n.textOffset?n.textOffset:0;var a=h.extra.mount.labelPosition;t.forEach(function(t,e){if(t!==null){s.beginPath();var a=n[e].textSize?n[e].textSize*h.pix:l.fontSize;s.setFontSize(a);s.setFillStyle(n[e].textColor||h.fontColor);var i=t.value;var r=n[e].formatter?n[e].formatter(i,e,n,h):i;s.setTextAlign("center");var o=t.y-4*h.pix+d*h.pix;if(t.y>c){o=t.y+d*h.pix+a}s.fillText(String(r),t.x,o);s.closePath();s.stroke();s.setTextAlign("left")}})}function drawBarPointText(t,o,n,l,s){var h=o.data;var e=o.textOffset?o.textOffset:0;t.forEach(function(t,e){if(t!==null){l.beginPath();var a=o.textSize?o.textSize*s.pix:n.fontSize;l.setFontSize(a);l.setFillStyle(o.textColor||s.fontColor);var i=h[e];if(typeof h[e]==="object"&&h[e]!==null){i=h[e].value}var r=o.formatter?o.formatter(i,e,o,s):i;l.setTextAlign("left");l.fillText(String(r),t.x+4*s.pix,t.y+a/2-3);l.closePath();l.stroke()}})}function drawGaugeLabel(e,a,i,r,o,n){a-=e.width/2+e.labelOffset*r.pix;a=a<10?10:a;let t;if(e.endAngle<e.startAngle){t=2+e.endAngle-e.startAngle}else{t=e.startAngle-e.endAngle}let c=t/e.splitLine.splitNumber;let d=e.endNumber-e.startNumber;let x=d/e.splitLine.splitNumber;let l=e.startAngle;let s=e.startNumber;for(let t=0;t<e.splitLine.splitNumber+1;t++){var h={x:a*Math.cos(l*Math.PI),y:a*Math.sin(l*Math.PI)};var f=e.formatter?e.formatter(s,t,r):s;h.x+=i.x-measureText(f,o.fontSize,n)/2;h.y+=i.y;var p=h.x;var u=h.y;n.beginPath();n.setFontSize(o.fontSize);n.setFillStyle(e.labelColor||r.fontColor);n.fillText(f,p,u+o.fontSize/2);n.closePath();n.stroke();l+=c;if(l>=2){l=l%2}s+=x}}function drawRadarLabel(t,s,h,c,d,x){var f=c.extra.radar||{};t.forEach(function(t,e){if(f.labelPointShow===true&&c.categories[e]!==""){var a={x:s*Math.cos(t),y:s*Math.sin(t)};var i=convertCoordinateOrigin(a.x,a.y,h);x.setFillStyle(f.labelPointColor);x.beginPath();x.arc(i.x,i.y,f.labelPointRadius*c.pix,0,2*Math.PI,false);x.closePath();x.fill()}if(f.labelShow===true){var r={x:(s+d.radarLabelTextMargin*c.pix)*Math.cos(t),y:(s+d.radarLabelTextMargin*c.pix)*Math.sin(t)};var o=convertCoordinateOrigin(r.x,r.y,h);var n=o.x;var l=o.y;if(util.approximatelyEqual(r.x,0)){n-=measureText(c.categories[e]||"",d.fontSize,x)/2}else if(r.x<0){n-=measureText(c.categories[e]||"",d.fontSize,x)}x.beginPath();x.setFontSize(d.fontSize);x.setFillStyle(f.labelColor||c.fontColor);x.fillText(c.categories[e]||"",n,l+d.fontSize/2);x.closePath();x.stroke()}})}function drawPieText(n,d,x,f,t,l){var p=x.pieChartLinePadding;var u=[];var g=null;var y=n.map(function(t,e){var a=t.formatter?t.formatter(t,e,n,d):util.toFixed(t._proportion_.toFixed(4)*100)+"%";a=t.labelText?t.labelText:a;var i=2*Math.PI-(t._start_+2*Math.PI*t._proportion_/2);if(t._rose_proportion_){i=2*Math.PI-(t._start_+2*Math.PI*t._rose_proportion_/2)}var r=t.color;var o=t._radius_;return{arc:i,text:a,color:r,radius:o,textColor:t.textColor,textSize:t.textSize,labelShow:t.labelShow}});for(let c=0;c<y.length;c++){let t=y[c];let e=Math.cos(t.arc)*(t.radius+p);let a=Math.sin(t.arc)*(t.radius+p);let i=Math.cos(t.arc)*t.radius;let r=Math.sin(t.arc)*t.radius;let o=e>=0?e+x.pieChartTextPadding:e-x.pieChartTextPadding;let n=a;let l=measureText(t.text,t.textSize*d.pix||x.fontSize,f);let s=n;if(g&&util.isSameXCoordinateArea(g.start,{x:o})){if(o>0){s=Math.min(n,g.start.y)}else if(e<0){s=Math.max(n,g.start.y)}else{if(n>0){s=Math.max(n,g.start.y)}else{s=Math.min(n,g.start.y)}}}if(o<0){o-=l}let h={lineStart:{x:i,y:r},lineEnd:{x:e,y:a},start:{x:o,y:s},width:l,height:x.fontSize,text:t.text,color:t.color,textColor:t.textColor,textSize:t.textSize};g=avoidCollision(h,g);u.push(g)}for(let n=0;n<u.length;n++){if(y[n].labelShow===false){continue}let t=u[n];let e=convertCoordinateOrigin(t.lineStart.x,t.lineStart.y,l);let a=convertCoordinateOrigin(t.lineEnd.x,t.lineEnd.y,l);let i=convertCoordinateOrigin(t.start.x,t.start.y,l);f.setLineWidth(1*d.pix);f.setFontSize(t.textSize*d.pix||x.fontSize);f.beginPath();f.setStrokeStyle(t.color);f.setFillStyle(t.color);f.moveTo(e.x,e.y);let r=t.start.x<0?i.x+t.width:i.x;let o=t.start.x<0?i.x-5:i.x+5;f.quadraticCurveTo(a.x,a.y,r,i.y);f.moveTo(e.x,e.y);f.stroke();f.closePath();f.beginPath();f.moveTo(i.x+t.width,i.y);f.arc(r,i.y,2*d.pix,0,2*Math.PI);f.closePath();f.fill();f.beginPath();f.setFontSize(t.textSize*d.pix||x.fontSize);f.setFillStyle(t.textColor||d.fontColor);f.fillText(t.text,o,i.y+3);f.closePath();f.stroke();f.closePath()}}function drawToolTipSplitLine(r,o,n,l){var s=o.extra.tooltip||{};s.gridType=s.gridType==undefined?"solid":s.gridType;s.dashLength=s.dashLength==undefined?4:s.dashLength;var t=o.area[0];var h=o.height-o.area[2];if(s.gridType=="dash"){l.setLineDash([s.dashLength,s.dashLength])}l.setStrokeStyle(s.gridColor||"#cccccc");l.setLineWidth(1*o.pix);l.beginPath();l.moveTo(r,t);l.lineTo(r,h);l.stroke();l.setLineDash([]);if(s.xAxisLabel){let t=o.categories[o.tooltip.index];l.setFontSize(n.fontSize);let e=measureText(t,n.fontSize,l);let a=r-.5*e;let i=h+2*o.pix;l.beginPath();l.setFillStyle(hexToRgb(s.labelBgColor||n.toolTipBackground,s.labelBgOpacity||n.toolTipOpacity));l.setStrokeStyle(s.labelBgColor||n.toolTipBackground);l.setLineWidth(1*o.pix);l.rect(a-s.boxPadding*o.pix,i,e+2*s.boxPadding*o.pix,n.fontSize+2*s.boxPadding*o.pix);l.closePath();l.stroke();l.fill();l.beginPath();l.setFontSize(n.fontSize);l.setFillStyle(s.labelFontColor||o.fontColor);l.fillText(String(t),a,i+s.boxPadding*o.pix+n.fontSize);l.closePath();l.stroke()}}function drawMarkLine(h,t,c){let e=assign({},{type:"solid",dashLength:4,data:[]},h.extra.markLine);let a=h.area[3];let i=h.width-h.area[1];let r=calMarkLineData(e.data,h);for(let t=0;t<r.length;t++){let s=assign({},{lineColor:"#DE4A42",showLabel:false,labelFontSize:13,labelPadding:6,labelFontColor:"#666666",labelBgColor:"#DFE8FF",labelBgOpacity:.8,labelAlign:"left",labelOffsetX:0,labelOffsetY:0},r[t]);if(e.type=="dash"){c.setLineDash([e.dashLength,e.dashLength])}c.setStrokeStyle(s.lineColor);c.setLineWidth(1*h.pix);c.beginPath();c.moveTo(a,s.y);c.lineTo(i,s.y);c.stroke();c.setLineDash([]);if(s.showLabel){let t=s.labelFontSize*h.pix;let e=s.labelText?s.labelText:s.value;c.setFontSize(t);let a=measureText(e,t,c);let i=a+s.labelPadding*h.pix*2;let r=s.labelAlign=="left"?h.area[3]-i:h.width-h.area[1];r+=s.labelOffsetX;let o=s.y-.5*t-s.labelPadding*h.pix;o+=s.labelOffsetY;let n=r+s.labelPadding*h.pix;let l=s.y;c.setFillStyle(hexToRgb(s.labelBgColor,s.labelBgOpacity));c.setStrokeStyle(s.labelBgColor);c.setLineWidth(1*h.pix);c.beginPath();c.rect(r,o,i,t+2*s.labelPadding*h.pix);c.closePath();c.stroke();c.fill();c.setFontSize(t);c.setTextAlign("left");c.setFillStyle(s.labelFontColor);c.fillText(String(e),n,o+t+s.labelPadding*h.pix/2);c.stroke();c.setTextAlign("left")}}}function drawToolTipHorizentalLine(x,f,p,t,e){var u=assign({},{gridType:"solid",dashLength:4},x.extra.tooltip);var a=x.area[3];var i=x.width-x.area[1];if(u.gridType=="dash"){p.setLineDash([u.dashLength,u.dashLength])}p.setStrokeStyle(u.gridColor||"#cccccc");p.setLineWidth(1*x.pix);p.beginPath();p.moveTo(a,x.tooltip.offset.y);p.lineTo(i,x.tooltip.offset.y);p.stroke();p.setLineDash([]);if(u.yAxisLabel){let l=u.boxPadding*x.pix;let s=calTooltipYAxisData(x.tooltip.offset.y,x.series,x,f,t);let h=x.chartData.yAxisData.yAxisWidth;let c=x.area[3];let d=x.width-x.area[1];for(let n=0;n<s.length;n++){p.setFontSize(u.fontSize*x.pix);let t=measureText(s[n],u.fontSize*x.pix,p);let e,a,i;if(h[n].position=="left"){e=c-(t+l*2)-2*x.pix;a=Math.max(e,e+t+l*2)}else{e=d+2*x.pix;a=Math.max(e+h[n].width,e+t+l*2)}i=a-e;let r=e+(i-t)/2;let o=x.tooltip.offset.y;p.beginPath();p.setFillStyle(hexToRgb(u.labelBgColor||f.toolTipBackground,u.labelBgOpacity||f.toolTipOpacity));p.setStrokeStyle(u.labelBgColor||f.toolTipBackground);p.setLineWidth(1*x.pix);p.rect(e,o-.5*f.fontSize-l,i,f.fontSize+2*l);p.closePath();p.stroke();p.fill();p.beginPath();p.setFontSize(f.fontSize);p.setFillStyle(u.labelFontColor||x.fontColor);p.fillText(s[n],r,o+.5*f.fontSize);p.closePath();p.stroke();if(h[n].position=="left"){c-=h[n].width+x.yAxis.padding*x.pix}else{d+=h[n].width+x.yAxis.padding*x.pix}}}}function drawToolTipSplitArea(t,e,a,i,r){var o=assign({},{activeBgColor:"#000000",activeBgOpacity:.08,activeWidth:r},e.extra.column);o.activeWidth=o.activeWidth>r?r:o.activeWidth;var n=e.area[0];var l=e.height-e.area[2];i.beginPath();i.setFillStyle(hexToRgb(o.activeBgColor,o.activeBgOpacity));i.rect(t-o.activeWidth/2,n,o.activeWidth,l-n);i.closePath();i.fill();i.setFillStyle("#FFFFFF")}function drawBarToolTipSplitArea(t,e,a,i,r){var o=assign({},{activeBgColor:"#000000",activeBgOpacity:.08},e.extra.bar);var n=e.area[3];var l=e.width-e.area[1];i.beginPath();i.setFillStyle(hexToRgb(o.activeBgColor,o.activeBgOpacity));i.rect(n,t-r/2,l-n,r);i.closePath();i.fill();i.setFillStyle("#FFFFFF")}function drawToolTip(e,r,o,a,n,i,f){var l=assign({},{showBox:true,showArrow:true,showCategory:false,bgColor:"#000000",bgOpacity:.7,borderColor:"#000000",borderWidth:0,borderRadius:0,borderOpacity:.7,boxPadding:3,fontColor:"#FFFFFF",fontSize:13,lineHeight:20,legendShow:true,legendShape:"auto",splitLine:true},o.extra.tooltip);if(l.showCategory==true&&o.categories){e.unshift({text:o.categories[o.tooltip.index],color:null})}var s=l.fontSize*o.pix;var p=l.lineHeight*o.pix;var h=l.boxPadding*o.pix;var c=s;var u=5*o.pix;if(l.legendShow==false){c=0;u=0}var d=l.showArrow?8*o.pix:0;var g=false;if(o.type=="line"||o.type=="mount"||o.type=="area"||o.type=="candle"||o.type=="mix"){if(l.splitLine==true){drawToolTipSplitLine(o.tooltip.offset.x,o,a,n)}}r=assign({x:0,y:0},r);r.y-=8*o.pix;var y=e.map(function(t){return measureText(t.text,s,n)});var x=c+u+4*h+Math.max.apply(null,y);var v=2*h+e.length*p;if(l.showBox==false){return}if(r.x-Math.abs(o._scrollDistance_||0)+d+x>o.width){g=true}if(v+r.y>o.height){r.y=o.height-v}n.beginPath();n.setFillStyle(hexToRgb(l.bgColor,l.bgOpacity));n.setLineWidth(l.borderWidth*o.pix);n.setStrokeStyle(hexToRgb(l.borderColor,l.borderOpacity));var t=l.borderRadius;if(g){if(x+d>o.width){r.x=o.width+Math.abs(o._scrollDistance_||0)+d+(x-o.width)}if(x>r.x){r.x=o.width+Math.abs(o._scrollDistance_||0)+d+(x-o.width)}if(l.showArrow){n.moveTo(r.x,r.y+10*o.pix);n.lineTo(r.x-d,r.y+10*o.pix+5*o.pix)}n.arc(r.x-d-t,r.y+v-t,t,0,Math.PI/2,false);n.arc(r.x-d-Math.round(x)+t,r.y+v-t,t,Math.PI/2,Math.PI,false);n.arc(r.x-d-Math.round(x)+t,r.y+t,t,-Math.PI,-Math.PI/2,false);n.arc(r.x-d-t,r.y+t,t,-Math.PI/2,0,false);if(l.showArrow){n.lineTo(r.x-d,r.y+10*o.pix-5*o.pix);n.lineTo(r.x,r.y+10*o.pix)}}else{if(l.showArrow){n.moveTo(r.x,r.y+10*o.pix);n.lineTo(r.x+d,r.y+10*o.pix-5*o.pix)}n.arc(r.x+d+t,r.y+t,t,-Math.PI,-Math.PI/2,false);n.arc(r.x+d+Math.round(x)-t,r.y+t,t,-Math.PI/2,0,false);n.arc(r.x+d+Math.round(x)-t,r.y+v-t,t,0,Math.PI/2,false);n.arc(r.x+d+t,r.y+v-t,t,Math.PI/2,Math.PI,false);if(l.showArrow){n.lineTo(r.x+d,r.y+10*o.pix+5*o.pix);n.lineTo(r.x,r.y+10*o.pix)}}n.closePath();n.fill();if(l.borderWidth>0){n.stroke()}if(l.legendShow){e.forEach(function(t,e){if(t.color!==null){n.beginPath();n.setFillStyle(t.color);var a=r.x+d+2*h;var i=r.y+(p-s)/2+p*e+h+1;if(g){a=r.x-x-d+2*h}switch(t.legendShape){case"line":n.moveTo(a,i+.5*c-2*o.pix);n.fillRect(a,i+.5*c-2*o.pix,c,4*o.pix);break;case"triangle":n.moveTo(a+7.5*o.pix,i+.5*c-5*o.pix);n.lineTo(a+2.5*o.pix,i+.5*c+5*o.pix);n.lineTo(a+12.5*o.pix,i+.5*c+5*o.pix);n.lineTo(a+7.5*o.pix,i+.5*c-5*o.pix);break;case"diamond":n.moveTo(a+7.5*o.pix,i+.5*c-5*o.pix);n.lineTo(a+2.5*o.pix,i+.5*c);n.lineTo(a+7.5*o.pix,i+.5*c+5*o.pix);n.lineTo(a+12.5*o.pix,i+.5*c);n.lineTo(a+7.5*o.pix,i+.5*c-5*o.pix);break;case"circle":n.moveTo(a+7.5*o.pix,i+.5*c);n.arc(a+7.5*o.pix,i+.5*c,5*o.pix,0,2*Math.PI);break;case"rect":n.moveTo(a,i+.5*c-5*o.pix);n.fillRect(a,i+.5*c-5*o.pix,15*o.pix,10*o.pix);break;case"square":n.moveTo(a+2*o.pix,i+.5*c-5*o.pix);n.fillRect(a+2*o.pix,i+.5*c-5*o.pix,10*o.pix,10*o.pix);break;default:n.moveTo(a,i+.5*c-5*o.pix);n.fillRect(a,i+.5*c-5*o.pix,15*o.pix,10*o.pix)}n.closePath();n.fill()}})}e.forEach(function(t,e){var a=r.x+d+2*h+c+u;if(g){a=r.x-x-d+2*h+c+u}var i=r.y+p*e+(p-s)/2-1+h+s;n.beginPath();n.setFontSize(s);n.setTextBaseline("normal");n.setFillStyle(l.fontColor);n.fillText(t.text,a,i);n.closePath();n.stroke()})}function drawColumnDataPoints(T,b,S,w){let A=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let t=b.chartData.xAxisData,P=t.xAxisPoints,C=t.eachSpacing;let D=assign({},{type:"group",width:C/2,meterBorder:4,meterFillColor:"#FFFFFF",barBorderCircle:false,barBorderRadius:[],seriesGap:2,linearType:"none",linearOpacity:1,customColor:[],colorStop:0,labelPosition:"outside"},b.extra.column);let M=[];w.save();let L=-2;let F=P.length+2;if(b._scrollDistance_&&b._scrollDistance_!==0&&b.enableScroll===true){w.translate(b._scrollDistance_,0);L=Math.floor(-b._scrollDistance_/C)-2;F=L+b.xAxis.itemCount+4}if(b.tooltip&&b.tooltip.textList&&b.tooltip.textList.length&&A===1){drawToolTipSplitArea(b.tooltip.offset.x,b,S,w,C)}D.customColor=fillCustomColor(D.linearType,D.customColor,T,S);T.forEach(function(a,i){let e,t,o;e=[].concat(b.chartData.yAxisData.ranges[a.index]);t=e.pop();o=e.shift();let x=b.height-b.area[0]-b.area[2];let f=x*(0-t)/(o-t);let n=b.height-Math.round(f)-b.area[2];a.zeroPoints=n;var p=a.data;switch(D.type){case"group":var r=getColumnDataPoints(p,t,o,P,C,b,S,n,A);var u=getStackDataPoints(p,t,o,P,C,b,S,i,T,A);M.push(u);r=fixColumeData(r,C,T.length,i,S,b);for(let t=0;t<r.length;t++){let o=r[t];if(o!==null&&t>L&&t<F){var l=o.x-o.width/2;var s=b.height-o.y-b.area[2];w.beginPath();var g=o.color||a.color;var y=o.color||a.color;if(D.linearType!=="none"){var v=w.createLinearGradient(l,o.y,l,n);if(D.linearType=="opacity"){v.addColorStop(0,hexToRgb(g,D.linearOpacity));v.addColorStop(1,hexToRgb(g,1))}else{v.addColorStop(0,hexToRgb(D.customColor[a.linearIndex],D.linearOpacity));v.addColorStop(D.colorStop,hexToRgb(D.customColor[a.linearIndex],D.linearOpacity));v.addColorStop(1,hexToRgb(g,1))}g=v}if(D.barBorderRadius&&D.barBorderRadius.length===4||D.barBorderCircle===true){const h=l;const c=o.y>n?n:o.y;const d=o.width;const s=Math.abs(n-o.y);if(D.barBorderCircle){D.barBorderRadius=[d/2,d/2,0,0]}if(o.y>n){D.barBorderRadius=[0,0,d/2,d/2]}let[t,e,a,i]=D.barBorderRadius;let r=Math.min(d/2,s/2);t=t>r?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;w.arc(h+t,c+t,t,-Math.PI,-Math.PI/2);w.arc(h+d-e,c+e,e,-Math.PI/2,0);w.arc(h+d-a,c+s-a,a,0,Math.PI/2);w.arc(h+i,c+s-i,i,Math.PI/2,Math.PI)}else{w.moveTo(l,o.y);w.lineTo(l+o.width,o.y);w.lineTo(l+o.width,n);w.lineTo(l,n);w.lineTo(l,o.y);w.setLineWidth(1);w.setStrokeStyle(y)}w.setFillStyle(g);w.closePath();w.fill()}};break;case"stack":var r=getStackDataPoints(p,t,o,P,C,b,S,i,T,A);M.push(r);r=fixColumeStackData(r,C,T.length,i,S,b,T);for(let e=0;e<r.length;e++){let t=r[e];if(t!==null&&e>L&&e<F){w.beginPath();var g=t.color||a.color;var l=t.x-t.width/2+1;var s=b.height-t.y-b.area[2];var m=b.height-t.y0-b.area[2];if(i>0){s-=m}w.setFillStyle(g);w.moveTo(l,t.y);w.fillRect(l,t.y,t.width,s);w.closePath();w.fill()}};break;case"meter":var r=getDataPoints(p,t,o,P,C,b,S,A);M.push(r);r=fixColumeMeterData(r,C,T.length,i,S,b,D.meterBorder);for(let t=0;t<r.length;t++){let o=r[t];if(o!==null&&t>L&&t<F){w.beginPath();if(i==0&&D.meterBorder>0){w.setStrokeStyle(a.color);w.setLineWidth(D.meterBorder*b.pix)}if(i==0){w.setFillStyle(D.meterFillColor)}else{w.setFillStyle(o.color||a.color)}var l=o.x-o.width/2;var s=b.height-o.y-b.area[2];if(D.barBorderRadius&&D.barBorderRadius.length===4||D.barBorderCircle===true){const h=l;const c=o.y;const d=o.width;const s=n-o.y;if(D.barBorderCircle){D.barBorderRadius=[d/2,d/2,0,0]}let[t,e,a,i]=D.barBorderRadius;let r=Math.min(d/2,s/2);t=t>r?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;w.arc(h+t,c+t,t,-Math.PI,-Math.PI/2);w.arc(h+d-e,c+e,e,-Math.PI/2,0);w.arc(h+d-a,c+s-a,a,0,Math.PI/2);w.arc(h+i,c+s-i,i,Math.PI/2,Math.PI);w.fill()}else{w.moveTo(l,o.y);w.lineTo(l+o.width,o.y);w.lineTo(l+o.width,n);w.lineTo(l,n);w.lineTo(l,o.y);w.fill()}if(i==0&&D.meterBorder>0){w.closePath();w.stroke()}}}break}});if(b.dataLabel!==false&&A===1){T.forEach(function(t,e){let a,i,r;a=[].concat(b.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;switch(D.type){case"group":var n=getColumnDataPoints(o,i,r,P,C,b,S,A);n=fixColumeData(n,C,T.length,e,S,b);drawColumePointText(n,t,S,w,b);break;case"stack":var n=getStackDataPoints(o,i,r,P,C,b,S,e,T,A);drawColumePointText(n,t,S,w,b);break;case"meter":var n=getDataPoints(o,i,r,P,C,b,S,A);drawColumePointText(n,t,S,w,b);break}})}w.restore();return{xAxisPoints:P,calPoints:M,eachSpacing:C}}function drawMountDataPoints(i,r,o,n){let f=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let t=r.chartData.xAxisData,p=t.xAxisPoints,l=t.eachSpacing;let s=assign({},{type:"mount",widthRatio:1,borderWidth:1,barBorderCircle:false,barBorderRadius:[],linearType:"none",linearOpacity:1,customColor:[],colorStop:0},r.extra.mount);s.widthRatio=s.widthRatio<=0?0:s.widthRatio;s.widthRatio=s.widthRatio>=2?2:s.widthRatio;let e=[];n.save();let u=-2;let g=p.length+2;if(r._scrollDistance_&&r._scrollDistance_!==0&&r.enableScroll===true){n.translate(r._scrollDistance_,0);u=Math.floor(-r._scrollDistance_/l)-2;g=u+r.xAxis.itemCount+4}s.customColor=fillCustomColor(s.linearType,s.customColor,i,o);let y,v,m;y=[].concat(r.chartData.yAxisData.ranges[0]);v=y.pop();m=y.shift();let T=r.height-r.area[0]-r.area[2];let b=T*(0-v)/(m-v);let h=r.height-Math.round(b)-r.area[2];var c=getMountDataPoints(i,v,m,p,l,r,s,h,f);switch(s.type){case"bar":for(let t=0;t<c.length;t++){let o=c[t];if(o!==null&&t>u&&t<g){var d=o.x-l*s.widthRatio/2;var S=r.height-o.y-r.area[2];n.beginPath();var a=o.color||i[t].color;var w=o.color||i[t].color;if(s.linearType!=="none"){var x=n.createLinearGradient(d,o.y,d,h);if(s.linearType=="opacity"){x.addColorStop(0,hexToRgb(a,s.linearOpacity));x.addColorStop(1,hexToRgb(a,1))}else{x.addColorStop(0,hexToRgb(s.customColor[i[t].linearIndex],s.linearOpacity));x.addColorStop(s.colorStop,hexToRgb(s.customColor[i[t].linearIndex],s.linearOpacity));x.addColorStop(1,hexToRgb(a,1))}a=x}if(s.barBorderRadius&&s.barBorderRadius.length===4||s.barBorderCircle===true){const A=d;const P=o.y>h?h:o.y;const C=o.width;const S=Math.abs(h-o.y);if(s.barBorderCircle){s.barBorderRadius=[C/2,C/2,0,0]}if(o.y>h){s.barBorderRadius=[0,0,C/2,C/2]}let[t,e,a,i]=s.barBorderRadius;let r=Math.min(C/2,S/2);t=t>r?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;n.arc(A+t,P+t,t,-Math.PI,-Math.PI/2);n.arc(A+C-e,P+e,e,-Math.PI/2,0);n.arc(A+C-a,P+S-a,a,0,Math.PI/2);n.arc(A+i,P+S-i,i,Math.PI/2,Math.PI)}else{n.moveTo(d,o.y);n.lineTo(d+o.width,o.y);n.lineTo(d+o.width,h);n.lineTo(d,h);n.lineTo(d,o.y)}n.setStrokeStyle(w);n.setFillStyle(a);if(s.borderWidth>0){n.setLineWidth(s.borderWidth*r.pix);n.closePath();n.stroke()}n.fill()}};break;case"triangle":for(let e=0;e<c.length;e++){let t=c[e];if(t!==null&&e>u&&e<g){var d=t.x-l*s.widthRatio/2;var S=r.height-t.y-r.area[2];n.beginPath();var a=t.color||i[e].color;var w=t.color||i[e].color;if(s.linearType!=="none"){var x=n.createLinearGradient(d,t.y,d,h);if(s.linearType=="opacity"){x.addColorStop(0,hexToRgb(a,s.linearOpacity));x.addColorStop(1,hexToRgb(a,1))}else{x.addColorStop(0,hexToRgb(s.customColor[i[e].linearIndex],s.linearOpacity));x.addColorStop(s.colorStop,hexToRgb(s.customColor[i[e].linearIndex],s.linearOpacity));x.addColorStop(1,hexToRgb(a,1))}a=x}n.moveTo(d,h);n.lineTo(t.x,t.y);n.lineTo(d+t.width,h);n.setStrokeStyle(w);n.setFillStyle(a);if(s.borderWidth>0){n.setLineWidth(s.borderWidth*r.pix);n.stroke()}n.fill()}};break;case"mount":for(let e=0;e<c.length;e++){let t=c[e];if(t!==null&&e>u&&e<g){var d=t.x-l*s.widthRatio/2;var S=r.height-t.y-r.area[2];n.beginPath();var a=t.color||i[e].color;var w=t.color||i[e].color;if(s.linearType!=="none"){var x=n.createLinearGradient(d,t.y,d,h);if(s.linearType=="opacity"){x.addColorStop(0,hexToRgb(a,s.linearOpacity));x.addColorStop(1,hexToRgb(a,1))}else{x.addColorStop(0,hexToRgb(s.customColor[i[e].linearIndex],s.linearOpacity));x.addColorStop(s.colorStop,hexToRgb(s.customColor[i[e].linearIndex],s.linearOpacity));x.addColorStop(1,hexToRgb(a,1))}a=x}n.moveTo(d,h);n.bezierCurveTo(t.x-t.width/4,h,t.x-t.width/4,t.y,t.x,t.y);n.bezierCurveTo(t.x+t.width/4,t.y,t.x+t.width/4,h,d+t.width,h);n.setStrokeStyle(w);n.setFillStyle(a);if(s.borderWidth>0){n.setLineWidth(s.borderWidth*r.pix);n.stroke()}n.fill()}};break;case"sharp":for(let e=0;e<c.length;e++){let t=c[e];if(t!==null&&e>u&&e<g){var d=t.x-l*s.widthRatio/2;var S=r.height-t.y-r.area[2];n.beginPath();var a=t.color||i[e].color;var w=t.color||i[e].color;if(s.linearType!=="none"){var x=n.createLinearGradient(d,t.y,d,h);if(s.linearType=="opacity"){x.addColorStop(0,hexToRgb(a,s.linearOpacity));x.addColorStop(1,hexToRgb(a,1))}else{x.addColorStop(0,hexToRgb(s.customColor[i[e].linearIndex],s.linearOpacity));x.addColorStop(s.colorStop,hexToRgb(s.customColor[i[e].linearIndex],s.linearOpacity));x.addColorStop(1,hexToRgb(a,1))}a=x}n.moveTo(d,h);n.quadraticCurveTo(t.x-0,h-S/4,t.x,t.y);n.quadraticCurveTo(t.x+0,h-S/4,d+t.width,h);n.setStrokeStyle(w);n.setFillStyle(a);if(s.borderWidth>0){n.setLineWidth(s.borderWidth*r.pix);n.stroke()}n.fill()}};break}if(r.dataLabel!==false&&f===1){let t,e,a;t=[].concat(r.chartData.yAxisData.ranges[0]);e=t.pop();a=t.shift();var c=getMountDataPoints(i,e,a,p,l,r,s,h,f);drawMountPointText(c,i,o,n,r,h)}n.restore();return{xAxisPoints:p,calPoints:c,eachSpacing:l}}function drawBarDataPoints(y,v,m,T){let b=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let S=[];let w=(v.height-v.area[0]-v.area[2])/v.categories.length;for(let t=0;t<v.categories.length;t++){S.push(v.area[0]+w/2+w*t)}let A=assign({},{type:"group",width:w/2,meterBorder:4,meterFillColor:"#FFFFFF",barBorderCircle:false,barBorderRadius:[],seriesGap:2,linearType:"none",linearOpacity:1,customColor:[],colorStop:0},v.extra.bar);let P=[];T.save();let C=-2;let D=S.length+2;if(v.tooltip&&v.tooltip.textList&&v.tooltip.textList.length&&b===1){drawBarToolTipSplitArea(v.tooltip.offset.y,v,m,T,w)}A.customColor=fillCustomColor(A.linearType,A.customColor,y,m);y.forEach(function(a,t){let o,e,d;o=[].concat(v.chartData.xAxisData.ranges);d=o.pop();e=o.shift();var x=a.data;switch(A.type){case"group":var i=getBarDataPoints(x,e,d,S,w,v,m,b);var f=getBarStackDataPoints(x,e,d,S,w,v,m,t,y,b);P.push(f);i=fixBarData(i,w,y.length,t,m,v);for(let t=0;t<i.length;t++){let o=i[t];if(o!==null&&t>C&&t<D){var n=v.area[3];var r=o.y-o.width/2;var p=o.height;T.beginPath();var l=o.color||a.color;var u=o.color||a.color;if(A.linearType!=="none"){var s=T.createLinearGradient(n,o.y,o.x,o.y);if(A.linearType=="opacity"){s.addColorStop(0,hexToRgb(l,A.linearOpacity));s.addColorStop(1,hexToRgb(l,1))}else{s.addColorStop(0,hexToRgb(A.customColor[a.linearIndex],A.linearOpacity));s.addColorStop(A.colorStop,hexToRgb(A.customColor[a.linearIndex],A.linearOpacity));s.addColorStop(1,hexToRgb(l,1))}l=s}if(A.barBorderRadius&&A.barBorderRadius.length===4||A.barBorderCircle===true){const g=n;const h=o.width;const c=o.y-o.width/2;const p=o.height;if(A.barBorderCircle){A.barBorderRadius=[h/2,h/2,0,0]}let[t,e,a,i]=A.barBorderRadius;let r=Math.min(h/2,p/2);t=t>r?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;T.arc(g+i,c+i,i,-Math.PI,-Math.PI/2);T.arc(o.x-t,c+t,t,-Math.PI/2,0);T.arc(o.x-e,c+h-e,e,0,Math.PI/2);T.arc(g+a,c+h-a,a,Math.PI/2,Math.PI)}else{T.moveTo(n,r);T.lineTo(o.x,r);T.lineTo(o.x,r+o.width);T.lineTo(n,r+o.width);T.lineTo(n,r);T.setLineWidth(1);T.setStrokeStyle(u)}T.setFillStyle(l);T.closePath();T.fill()}};break;case"stack":var i=getBarStackDataPoints(x,e,d,S,w,v,m,t,y,b);P.push(i);i=fixBarStackData(i,w,y.length,t,m,v,y);for(let e=0;e<i.length;e++){let t=i[e];if(t!==null&&e>C&&e<D){T.beginPath();var l=t.color||a.color;var n=t.x0;T.setFillStyle(l);T.moveTo(n,t.y-t.width/2);T.fillRect(n,t.y-t.width/2,t.height,t.width);T.closePath();T.fill()}};break}});if(v.dataLabel!==false&&b===1){y.forEach(function(t,e){let a,i,r;a=[].concat(v.chartData.xAxisData.ranges);r=a.pop();i=a.shift();var o=t.data;switch(A.type){case"group":var n=getBarDataPoints(o,i,r,S,w,v,m,b);n=fixBarData(n,w,y.length,e,m,v);drawBarPointText(n,t,m,T,v);break;case"stack":var n=getBarStackDataPoints(o,i,r,S,w,v,m,e,y,b);drawBarPointText(n,t,m,T,v);break}})}return{yAxisPoints:S,calPoints:P,eachSpacing:w}}function drawCandleDataPoints(e,t,h,c,d){var g=arguments.length>5&&arguments[5]!==undefined?arguments[5]:1;var s=assign({},{color:{},average:{}},h.extra.candle);s.color=assign({},{upLine:"#f04864",upFill:"#f04864",downLine:"#2fc25b",downFill:"#2fc25b"},s.color);s.average=assign({},{show:false,name:[],day:[],color:c.color},s.average);h.extra.candle=s;let a=h.chartData.xAxisData,x=a.xAxisPoints,f=a.eachSpacing;let y=[];d.save();let p=-2;let v=x.length+2;let u=0;let m=h.width+f;if(h._scrollDistance_&&h._scrollDistance_!==0&&h.enableScroll===true){d.translate(h._scrollDistance_,0);p=Math.floor(-h._scrollDistance_/f)-2;v=p+h.xAxis.itemCount+4;u=-h._scrollDistance_-f*2+h.area[3];m=u+(h.xAxis.itemCount+4)*f}if(s.average.show||t){t.forEach(function(e,t){let a,i,r;a=[].concat(h.chartData.yAxisData.ranges[e.index]);i=a.pop();r=a.shift();var o=e.data;var n=getDataPoints(o,i,r,x,f,h,c,g);var l=splitPoints(n,e);for(let t=0;t<l.length;t++){let i=l[t];d.beginPath();d.setStrokeStyle(e.color);d.setLineWidth(1);if(i.length===1){d.moveTo(i[0].x,i[0].y);d.arc(i[0].x,i[0].y,1,0,2*Math.PI)}else{d.moveTo(i[0].x,i[0].y);let a=0;for(let e=0;e<i.length;e++){let t=i[e];if(a==0&&t.x>u){d.moveTo(t.x,t.y);a=1}if(e>0&&t.x>u&&t.x<m){var s=createCurveControlPoints(i,e-1);d.bezierCurveTo(s.ctrA.x,s.ctrA.y,s.ctrB.x,s.ctrB.y,t.x,t.y)}}d.moveTo(i[0].x,i[0].y)}d.closePath();d.stroke()}})}e.forEach(function(t,e){let a,i,r;a=[].concat(h.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;var n=getCandleDataPoints(o,i,r,x,f,h,c,g);y.push(n);var l=splitPoints(n,t);for(let e=0;e<l[0].length;e++){if(e>p&&e<v){let t=l[0][e];d.beginPath();if(o[e][1]-o[e][0]>0){d.setStrokeStyle(s.color.upLine);d.setFillStyle(s.color.upFill);d.setLineWidth(1*h.pix);d.moveTo(t[3].x,t[3].y);d.lineTo(t[1].x,t[1].y);d.lineTo(t[1].x-f/4,t[1].y);d.lineTo(t[0].x-f/4,t[0].y);d.lineTo(t[0].x,t[0].y);d.lineTo(t[2].x,t[2].y);d.lineTo(t[0].x,t[0].y);d.lineTo(t[0].x+f/4,t[0].y);d.lineTo(t[1].x+f/4,t[1].y);d.lineTo(t[1].x,t[1].y);d.moveTo(t[3].x,t[3].y)}else{d.setStrokeStyle(s.color.downLine);d.setFillStyle(s.color.downFill);d.setLineWidth(1*h.pix);d.moveTo(t[3].x,t[3].y);d.lineTo(t[0].x,t[0].y);d.lineTo(t[0].x-f/4,t[0].y);d.lineTo(t[1].x-f/4,t[1].y);d.lineTo(t[1].x,t[1].y);d.lineTo(t[2].x,t[2].y);d.lineTo(t[1].x,t[1].y);d.lineTo(t[1].x+f/4,t[1].y);d.lineTo(t[0].x+f/4,t[0].y);d.lineTo(t[0].x,t[0].y);d.moveTo(t[3].x,t[3].y)}d.closePath();d.fill();d.stroke()}}});d.restore();return{xAxisPoints:x,calPoints:y,eachSpacing:f}}function drawAreaDataPoints(t,s,h,c){var d=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var x=assign({},{type:"straight",opacity:.2,addLine:false,width:2,gradient:false,activeType:"none"},s.extra.area);let e=s.chartData.xAxisData,f=e.xAxisPoints,p=e.eachSpacing;let y=s.height-s.area[2];let v=[];c.save();let u=0;let g=s.width+p;if(s._scrollDistance_&&s._scrollDistance_!==0&&s.enableScroll===true){c.translate(s._scrollDistance_,0);u=-s._scrollDistance_-p*2+s.area[3];g=u+(s.xAxis.itemCount+4)*p}t.forEach(function(e,t){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[e.index]);i=a.pop();r=a.shift();let o=e.data;let n=getDataPoints(o,i,r,f,p,s,h,d);v.push(n);let l=splitPoints(n,e);for(let t=0;t<l.length;t++){let r=l[t];c.beginPath();c.setStrokeStyle(hexToRgb(e.color,x.opacity));if(x.gradient){let t=c.createLinearGradient(0,s.area[0],0,s.height-s.area[2]);t.addColorStop("0",hexToRgb(e.color,x.opacity));t.addColorStop("1.0",hexToRgb("#FFFFFF",.1));c.setFillStyle(t)}else{c.setFillStyle(hexToRgb(e.color,x.opacity))}c.setLineWidth(x.width*s.pix);if(r.length>1){let t=r[0];let e=r[r.length-1];c.moveTo(t.x,t.y);let i=0;if(x.type==="curve"){for(let a=0;a<r.length;a++){let e=r[a];if(i==0&&e.x>u){c.moveTo(e.x,e.y);i=1}if(a>0&&e.x>u&&e.x<g){let t=createCurveControlPoints(r,a-1);c.bezierCurveTo(t.ctrA.x,t.ctrA.y,t.ctrB.x,t.ctrB.y,e.x,e.y)}}}if(x.type==="straight"){for(let e=0;e<r.length;e++){let t=r[e];if(i==0&&t.x>u){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>u&&t.x<g){c.lineTo(t.x,t.y)}}}if(x.type==="step"){for(let e=0;e<r.length;e++){let t=r[e];if(i==0&&t.x>u){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>u&&t.x<g){c.lineTo(t.x,r[e-1].y);c.lineTo(t.x,t.y)}}}c.lineTo(e.x,y);c.lineTo(t.x,y);c.lineTo(t.x,t.y)}else{let t=r[0];c.moveTo(t.x-p/2,t.y)}c.closePath();c.fill();if(x.addLine){if(e.lineType=="dash"){let t=e.dashLength?e.dashLength:8;t*=s.pix;c.setLineDash([t,t])}c.beginPath();c.setStrokeStyle(e.color);c.setLineWidth(x.width*s.pix);if(r.length===1){c.moveTo(r[0].x,r[0].y)}else{c.moveTo(r[0].x,r[0].y);let i=0;if(x.type==="curve"){for(let a=0;a<r.length;a++){let e=r[a];if(i==0&&e.x>u){c.moveTo(e.x,e.y);i=1}if(a>0&&e.x>u&&e.x<g){let t=createCurveControlPoints(r,a-1);c.bezierCurveTo(t.ctrA.x,t.ctrA.y,t.ctrB.x,t.ctrB.y,e.x,e.y)}}}if(x.type==="straight"){for(let e=0;e<r.length;e++){let t=r[e];if(i==0&&t.x>u){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>u&&t.x<g){c.lineTo(t.x,t.y)}}}if(x.type==="step"){for(let e=0;e<r.length;e++){let t=r[e];if(i==0&&t.x>u){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>u&&t.x<g){c.lineTo(t.x,r[e-1].y);c.lineTo(t.x,t.y)}}}c.moveTo(r[0].x,r[0].y)}c.stroke();c.setLineDash([])}}if(s.dataPointShape!==false){drawPointShape(n,e.color,e.pointShape,c,s)}drawActivePoint(n,e.color,e.pointShape,c,s,x,t)});if(s.dataLabel!==false&&d===1){t.forEach(function(t,e){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;var n=getDataPoints(o,i,r,f,p,s,h,d);drawPointText(n,t,h,c,s)})}c.restore();return{xAxisPoints:f,calPoints:v,eachSpacing:p}}function drawScatterDataPoints(t,s,h,c){var d=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var i=assign({},{type:"circle"},s.extra.scatter);let e=s.chartData.xAxisData,x=e.xAxisPoints,f=e.eachSpacing;var r=[];c.save();let a=0;let o=s.width+f;if(s._scrollDistance_&&s._scrollDistance_!==0&&s.enableScroll===true){c.translate(s._scrollDistance_,0);a=-s._scrollDistance_-f*2+s.area[3];o=a+(s.xAxis.itemCount+4)*f}t.forEach(function(t,e){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;var n=getDataPoints(o,i,r,x,f,s,h,d);c.beginPath();c.setStrokeStyle(t.color);c.setFillStyle(t.color);c.setLineWidth(1*s.pix);var l=t.pointShape;if(l==="diamond"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x,t.y-4.5);c.lineTo(t.x-4.5,t.y);c.lineTo(t.x,t.y+4.5);c.lineTo(t.x+4.5,t.y);c.lineTo(t.x,t.y-4.5)}})}else if(l==="circle"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x+2.5*s.pix,t.y);c.arc(t.x,t.y,3*s.pix,0,2*Math.PI,false)}})}else if(l==="square"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x-3.5,t.y-3.5);c.rect(t.x-3.5,t.y-3.5,7,7)}})}else if(l==="triangle"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x,t.y-4.5);c.lineTo(t.x-4.5,t.y+4.5);c.lineTo(t.x+4.5,t.y+4.5);c.lineTo(t.x,t.y-4.5)}})}else if(l==="triangle"){return}c.closePath();c.fill();c.stroke()});if(s.dataLabel!==false&&d===1){t.forEach(function(t,e){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;var n=getDataPoints(o,i,r,x,f,s,h,d);drawPointText(n,t,h,c,s)})}c.restore();return{xAxisPoints:x,calPoints:r,eachSpacing:f}}function drawBubbleDataPoints(a,l,s,h){var c=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var d=assign({},{opacity:1,border:2},l.extra.bubble);let t=l.chartData.xAxisData,x=t.xAxisPoints,f=t.eachSpacing;var i=[];h.save();let e=0;let r=l.width+f;if(l._scrollDistance_&&l._scrollDistance_!==0&&l.enableScroll===true){h.translate(l._scrollDistance_,0);e=-l._scrollDistance_-f*2+l.area[3];r=e+(l.xAxis.itemCount+4)*f}a.forEach(function(i,t){let e,a,r;e=[].concat(l.chartData.yAxisData.ranges[i.index]);a=e.pop();r=e.shift();var o=i.data;var n=getDataPoints(o,a,r,x,f,l,s,c);h.beginPath();h.setStrokeStyle(i.color);h.setLineWidth(d.border*l.pix);h.setFillStyle(hexToRgb(i.color,d.opacity));n.forEach(function(t,e){h.moveTo(t.x+t.r,t.y);h.arc(t.x,t.y,t.r*l.pix,0,2*Math.PI,false)});h.closePath();h.fill();h.stroke();if(l.dataLabel!==false&&c===1){n.forEach(function(t,e){h.beginPath();var a=i.textSize*l.pix||s.fontSize;h.setFontSize(a);h.setFillStyle(i.textColor||"#FFFFFF");h.setTextAlign("center");h.fillText(String(t.t),t.x,t.y+a/2);h.closePath();h.stroke();h.setTextAlign("left")})}});h.restore();return{xAxisPoints:x,calPoints:i,eachSpacing:f}}function drawLineDataPoints(t,d,x,f){var p=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var u=assign({},{type:"straight",width:2,activeType:"none",linearType:"none",onShadow:false,animation:"vertical"},d.extra.line);u.width*=d.pix;let e=d.chartData.xAxisData,g=e.xAxisPoints,y=e.eachSpacing;var T=[];f.save();let v=0;let m=d.width+y;if(d._scrollDistance_&&d._scrollDistance_!==0&&d.enableScroll===true){f.translate(d._scrollDistance_,0);v=-d._scrollDistance_-y*2+d.area[3];m=v+(d.xAxis.itemCount+4)*y}t.forEach(function(e,c){f.beginPath();f.setStrokeStyle(e.color);f.moveTo(-1e4,-1e4);f.lineTo(-10001,-10001);f.stroke();let t,a,i;t=[].concat(d.chartData.yAxisData.ranges[e.index]);a=t.pop();i=t.shift();var r=e.data;var o=getLineDataPoints(r,a,i,g,y,d,x,u,p);T.push(o);var n=splitPoints(o,e);if(e.lineType=="dash"){let t=e.dashLength?e.dashLength:8;t*=d.pix;f.setLineDash([t,t])}f.beginPath();var l=e.color;if(u.linearType!=="none"&&e.linearColor&&e.linearColor.length>0){var s=f.createLinearGradient(d.chartData.xAxisData.startX,d.height/2,d.chartData.xAxisData.endX,d.height/2);for(var h=0;h<e.linearColor.length;h++){s.addColorStop(e.linearColor[h][0],hexToRgb(e.linearColor[h][1],1))}l=s}f.setStrokeStyle(l);if(u.onShadow==true&&e.setShadow&&e.setShadow.length>0){f.setShadow(e.setShadow[0],e.setShadow[1],e.setShadow[2],e.setShadow[3])}else{f.setShadow(0,0,0,"rgba(0,0,0,0)")}f.setLineWidth(u.width);n.forEach(function(i,t){if(i.length===1){f.moveTo(i[0].x,i[0].y)}else{f.moveTo(i[0].x,i[0].y);let a=0;if(u.type==="curve"){for(let e=0;e<i.length;e++){let t=i[e];if(a==0&&t.x>v){f.moveTo(t.x,t.y);a=1}if(e>0&&t.x>v&&t.x<m){var r=createCurveControlPoints(i,e-1);f.bezierCurveTo(r.ctrA.x,r.ctrA.y,r.ctrB.x,r.ctrB.y,t.x,t.y)}}}if(u.type==="straight"){for(let e=0;e<i.length;e++){let t=i[e];if(a==0&&t.x>v){f.moveTo(t.x,t.y);a=1}if(e>0&&t.x>v&&t.x<m){f.lineTo(t.x,t.y)}}}if(u.type==="step"){for(let e=0;e<i.length;e++){let t=i[e];if(a==0&&t.x>v){f.moveTo(t.x,t.y);a=1}if(e>0&&t.x>v&&t.x<m){f.lineTo(t.x,i[e-1].y);f.lineTo(t.x,t.y)}}}f.moveTo(i[0].x,i[0].y)}});f.stroke();f.setLineDash([]);if(d.dataPointShape!==false){drawPointShape(o,e.color,e.pointShape,f,d)}drawActivePoint(o,e.color,e.pointShape,f,d,u)});if(d.dataLabel!==false&&p===1){t.forEach(function(t,e){let a,i,r;a=[].concat(d.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;var n=getDataPoints(o,i,r,g,y,d,x,p);drawPointText(n,t,x,f,d)})}f.restore();return{xAxisPoints:g,calPoints:T,eachSpacing:y}}function drawMixDataPoints(t,v,m,T){let D=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let e=v.chartData.xAxisData,b=e.xAxisPoints,S=e.eachSpacing;let w=assign({},{width:S/2,barBorderCircle:false,barBorderRadius:[],seriesGap:2,linearType:"none",linearOpacity:1,customColor:[],colorStop:0},v.extra.mix.column);let A=assign({},{opacity:.2,gradient:false},v.extra.mix.area);let M=assign({},{width:2},v.extra.mix.line);let L=v.height-v.area[2];let F=[];var _=0;var k=0;t.forEach(function(t,e){if(t.type=="column"){k+=1}});T.save();let R=-2;let I=b.length+2;let P=0;let C=v.width+S;if(v._scrollDistance_&&v._scrollDistance_!==0&&v.enableScroll===true){T.translate(v._scrollDistance_,0);R=Math.floor(-v._scrollDistance_/S)-2;I=R+v.xAxis.itemCount+4;P=-v._scrollDistance_-S*2+v.area[3];C=P+(v.xAxis.itemCount+4)*S}w.customColor=fillCustomColor(w.linearType,w.customColor,t,m);t.forEach(function(n,t){let o,x,f;o=[].concat(v.chartData.yAxisData.ranges[n.index]);x=o.pop();f=o.shift();var p=n.data;var a=getDataPoints(p,x,f,b,S,v,m,D);F.push(a);if(n.type=="column"){a=fixColumeData(a,S,k,_,m,v);for(let t=0;t<a.length;t++){let o=a[t];if(o!==null&&t>R&&t<I){var l=o.x-o.width/2;var s=v.height-o.y-v.area[2];T.beginPath();var e=o.color||n.color;var u=o.color||n.color;if(w.linearType!=="none"){var i=T.createLinearGradient(l,o.y,l,v.height-v.area[2]);if(w.linearType=="opacity"){i.addColorStop(0,hexToRgb(e,w.linearOpacity));i.addColorStop(1,hexToRgb(e,1))}else{i.addColorStop(0,hexToRgb(w.customColor[n.linearIndex],w.linearOpacity));i.addColorStop(w.colorStop,hexToRgb(w.customColor[n.linearIndex],w.linearOpacity));i.addColorStop(1,hexToRgb(e,1))}e=i}if(w.barBorderRadius&&w.barBorderRadius.length===4||w.barBorderCircle){const h=l;const c=o.y;const d=o.width;const s=v.height-v.area[2]-o.y;if(w.barBorderCircle){w.barBorderRadius=[d/2,d/2,0,0]}let[t,e,a,i]=w.barBorderRadius;let r=Math.min(d/2,s/2);t=t>r?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;T.arc(h+t,c+t,t,-Math.PI,-Math.PI/2);T.arc(h+d-e,c+e,e,-Math.PI/2,0);T.arc(h+d-a,c+s-a,a,0,Math.PI/2);T.arc(h+i,c+s-i,i,Math.PI/2,Math.PI)}else{T.moveTo(l,o.y);T.lineTo(l+o.width,o.y);T.lineTo(l+o.width,v.height-v.area[2]);T.lineTo(l,v.height-v.area[2]);T.lineTo(l,o.y);T.setLineWidth(1);T.setStrokeStyle(u)}T.setFillStyle(e);T.closePath();T.fill()}}_+=1}if(n.type=="area"){let e=splitPoints(a,n);for(let t=0;t<e.length;t++){let i=e[t];T.beginPath();T.setStrokeStyle(n.color);T.setStrokeStyle(hexToRgb(n.color,A.opacity));if(A.gradient){let t=T.createLinearGradient(0,v.area[0],0,v.height-v.area[2]);t.addColorStop("0",hexToRgb(n.color,A.opacity));t.addColorStop("1.0",hexToRgb("#FFFFFF",.1));T.setFillStyle(t)}else{T.setFillStyle(hexToRgb(n.color,A.opacity))}T.setLineWidth(2*v.pix);if(i.length>1){var r=i[0];let t=i[i.length-1];T.moveTo(r.x,r.y);let a=0;if(n.style==="curve"){for(let e=0;e<i.length;e++){let t=i[e];if(a==0&&t.x>P){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>P&&t.x<C){var g=createCurveControlPoints(i,e-1);T.bezierCurveTo(g.ctrA.x,g.ctrA.y,g.ctrB.x,g.ctrB.y,t.x,t.y)}}}else{for(let e=0;e<i.length;e++){let t=i[e];if(a==0&&t.x>P){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>P&&t.x<C){T.lineTo(t.x,t.y)}}}T.lineTo(t.x,L);T.lineTo(r.x,L);T.lineTo(r.x,r.y)}else{let t=i[0];T.moveTo(t.x-S/2,t.y)}T.closePath();T.fill()}}if(n.type=="line"){var y=splitPoints(a,n);y.forEach(function(i,t){if(n.lineType=="dash"){let t=n.dashLength?n.dashLength:8;t*=v.pix;T.setLineDash([t,t])}T.beginPath();T.setStrokeStyle(n.color);T.setLineWidth(M.width*v.pix);if(i.length===1){T.moveTo(i[0].x,i[0].y)}else{T.moveTo(i[0].x,i[0].y);let a=0;if(n.style=="curve"){for(let e=0;e<i.length;e++){let t=i[e];if(a==0&&t.x>P){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>P&&t.x<C){var r=createCurveControlPoints(i,e-1);T.bezierCurveTo(r.ctrA.x,r.ctrA.y,r.ctrB.x,r.ctrB.y,t.x,t.y)}}}else{for(let e=0;e<i.length;e++){let t=i[e];if(a==0&&t.x>P){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>P&&t.x<C){T.lineTo(t.x,t.y)}}}T.moveTo(i[0].x,i[0].y)}T.stroke();T.setLineDash([])})}if(n.type=="point"){n.addPoint=true}if(n.addPoint==true&&n.type!=="column"){drawPointShape(a,n.color,n.pointShape,T,v)}});if(v.dataLabel!==false&&D===1){var _=0;t.forEach(function(t,e){let a,i,r;a=[].concat(v.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;var n=getDataPoints(o,i,r,b,S,v,m,D);if(t.type!=="column"){drawPointText(n,t,m,T,v)}else{n=fixColumeData(n,S,k,_,m,v);drawPointText(n,t,m,T,v);_+=1}})}T.restore();return{xAxisPoints:b,calPoints:F,eachSpacing:S}}function drawToolTipBridge(t,e,a,i,r,o){var n=t.extra.tooltip||{};if(n.horizentalLine&&t.tooltip&&i===1&&(t.type=="line"||t.type=="area"||t.type=="column"||t.type=="mount"||t.type=="candle"||t.type=="mix")){drawToolTipHorizentalLine(t,e,a,r,o)}a.save();if(t._scrollDistance_&&t._scrollDistance_!==0&&t.enableScroll===true){a.translate(t._scrollDistance_,0)}if(t.tooltip&&t.tooltip.textList&&t.tooltip.textList.length&&i===1){drawToolTip(t.tooltip.textList,t.tooltip.offset,t,e,a,r,o)}a.restore()}function drawXAxis(r,h,c,d){let e=h.chartData.xAxisData,x=e.xAxisPoints,t=e.startX,a=e.endX,f=e.eachSpacing;var p="center";if(h.type=="bar"||h.type=="line"||h.type=="area"||h.type=="scatter"||h.type=="bubble"){p=h.xAxis.boundaryGap}var u=h.height-h.area[2];var i=h.area[0];if(h.enableScroll&&h.xAxis.scrollShow){var o=h.height-h.area[2]+c.xAxisHeight;var n=a-t;var l=f*(x.length-1);if(h.type=="mount"&&h.extra&&h.extra.mount&&h.extra.mount.widthRatio&&h.extra.mount.widthRatio>1){if(h.extra.mount.widthRatio>2)h.extra.mount.widthRatio=2;l+=(h.extra.mount.widthRatio-1)*f}var s=n*n/l;var y=0;if(h._scrollDistance_){y=-h._scrollDistance_*n/l}d.beginPath();d.setLineCap("round");d.setLineWidth(6*h.pix);d.setStrokeStyle(h.xAxis.scrollBackgroundColor||"#EFEBEF");d.moveTo(t,o);d.lineTo(a,o);d.stroke();d.closePath();d.beginPath();d.setLineCap("round");d.setLineWidth(6*h.pix);d.setStrokeStyle(h.xAxis.scrollColor||"#A6A6A6");d.moveTo(t+y,o);d.lineTo(t+y+s,o);d.stroke();d.closePath();d.setLineCap("butt")}d.save();if(h._scrollDistance_&&h._scrollDistance_!==0){d.translate(h._scrollDistance_,0)}if(h.xAxis.calibration===true){d.setStrokeStyle(h.xAxis.gridColor||"#cccccc");d.setLineCap("butt");d.setLineWidth(1*h.pix);x.forEach(function(t,e){if(e>0){d.beginPath();d.moveTo(t-f/2,u);d.lineTo(t-f/2,u+3*h.pix);d.closePath();d.stroke()}})}if(h.xAxis.disableGrid!==true){d.setStrokeStyle(h.xAxis.gridColor||"#cccccc");d.setLineCap("butt");d.setLineWidth(1*h.pix);if(h.xAxis.gridType=="dash"){d.setLineDash([h.xAxis.dashLength*h.pix,h.xAxis.dashLength*h.pix])}h.xAxis.gridEval=h.xAxis.gridEval||1;x.forEach(function(t,e){if(e%h.xAxis.gridEval==0){d.beginPath();d.moveTo(t,u);d.lineTo(t,i);d.stroke()}});d.setLineDash([])}if(h.xAxis.disabled!==true){let t=r.length;if(h.xAxis.labelCount){if(h.xAxis.itemCount){t=Math.ceil(r.length/h.xAxis.itemCount*h.xAxis.labelCount)}else{t=h.xAxis.labelCount}t-=1}let e=Math.ceil(r.length/t);let a=[];let i=r.length;for(let t=0;t<i;t++){if(t%e!==0){a.push("")}else{a.push(r[t])}}a[i-1]=r[i-1];var g=h.xAxis.fontSize*h.pix||c.fontSize;if(c._xAxisTextAngle_===0){a.forEach(function(t,e){var a=h.xAxis.formatter?h.xAxis.formatter(t,e,h):t;var i=-measureText(String(a),g,d)/2;if(p=="center"){i+=f/2}var r=0;if(h.xAxis.scrollShow){r=6*h.pix}var o=h._scrollDistance_||0;var n=p=="center"?x[e]+f/2:x[e];if(n-Math.abs(o)>=h.area[3]-1&&n-Math.abs(o)<=h.width-h.area[1]+1){d.beginPath();d.setFontSize(g);d.setFillStyle(h.xAxis.fontColor||h.fontColor);d.fillText(String(a),x[e]+i,u+h.xAxis.marginTop*h.pix+(h.xAxis.lineHeight-h.xAxis.fontSize)*h.pix/2+h.xAxis.fontSize*h.pix);d.closePath();d.stroke()}})}else{a.forEach(function(t,e){var a=h.xAxis.formatter?h.xAxis.formatter(t):t;var i=h._scrollDistance_||0;var r=p=="center"?x[e]+f/2:x[e];if(r-Math.abs(i)>=h.area[3]-1&&r-Math.abs(i)<=h.width-h.area[1]+1){d.save();d.beginPath();d.setFontSize(g);d.setFillStyle(h.xAxis.fontColor||h.fontColor);var o=measureText(String(a),g,d);var n=x[e];if(p=="center"){n=x[e]+f/2}var l=0;if(h.xAxis.scrollShow){l=6*h.pix}var s=u+h.xAxis.marginTop*h.pix+g-g*Math.abs(Math.sin(c._xAxisTextAngle_));if(h.xAxis.rotateAngle<0){n-=g/2;o=0}else{n+=g/2;o=-o}d.translate(n,s);d.rotate(-1*c._xAxisTextAngle_);d.fillText(String(a),o,0);d.closePath();d.stroke();d.restore()}})}}d.restore();if(h.xAxis.title){d.beginPath();d.setFontSize(h.xAxis.titleFontSize*h.pix);d.setFillStyle(h.xAxis.titleFontColor);d.fillText(String(h.xAxis.title),h.width-h.area[1]+h.xAxis.titleOffsetX*h.pix,h.height-h.area[2]+h.xAxis.marginTop*h.pix+(h.xAxis.lineHeight-h.xAxis.titleFontSize)*h.pix/2+(h.xAxis.titleFontSize+h.xAxis.titleOffsetY)*h.pix);d.closePath();d.stroke()}if(h.xAxis.axisLine){d.beginPath();d.setStrokeStyle(h.xAxis.axisLineColor);d.setLineWidth(1*h.pix);d.moveTo(t,h.height-h.area[2]);d.lineTo(a,h.height-h.area[2]);d.stroke()}}function drawYAxisGrid(c,e,d,a){if(e.yAxis.disableGrid===true){return}let t=e.height-e.area[0]-e.area[2];let i=t/e.yAxis.splitNumber;let r=e.area[3];let o=e.chartData.xAxisData.xAxisPoints,n=e.chartData.xAxisData.eachSpacing;let l=n*(o.length-1);if(e.type=="mount"&&e.extra&&e.extra.mount&&e.extra.mount.widthRatio&&e.extra.mount.widthRatio>1){if(e.extra.mount.widthRatio>2)e.extra.mount.widthRatio=2;l+=(e.extra.mount.widthRatio-1)*n}let x=r+l;let s=[];let h=1;if(e.xAxis.axisLine===false){h=0}for(let t=h;t<e.yAxis.splitNumber+1;t++){s.push(e.height-e.area[2]-i*t)}a.save();if(e._scrollDistance_&&e._scrollDistance_!==0){a.translate(e._scrollDistance_,0)}if(e.yAxis.gridType=="dash"){a.setLineDash([e.yAxis.dashLength*e.pix,e.yAxis.dashLength*e.pix])}a.setStrokeStyle(e.yAxis.gridColor);a.setLineWidth(1*e.pix);s.forEach(function(t,e){a.beginPath();a.moveTo(r,t);a.lineTo(x,t);a.stroke()});a.setLineDash([]);a.restore()}function drawYAxis(e,h,a,c){if(h.yAxis.disabled===true){return}var i=h.height-h.area[0]-h.area[2];var r=i/h.yAxis.splitNumber;var o=h.area[3];var n=h.width-h.area[1];var t=h.height-h.area[2];c.beginPath();c.setFillStyle(h.background);if(h.enableScroll==true&&h.xAxis.scrollPosition&&h.xAxis.scrollPosition!=="left"){c.fillRect(0,0,o,t+2*h.pix)}if(h.enableScroll==true&&h.xAxis.scrollPosition&&h.xAxis.scrollPosition!=="right"){c.fillRect(n,0,h.width,t+2*h.pix)}c.closePath();c.stroke();let d=h.area[3];let x=h.width-h.area[1];let f=h.area[3]+(h.width-h.area[1]-h.area[3])/2;if(h.yAxis.data){for(let e=0;e<h.yAxis.data.length;e++){let s=h.yAxis.data[e];var p=[];if(s.type==="categories"){for(let t=0;t<=s.categories.length;t++){p.push(h.area[0]+i/s.categories.length/2+i/s.categories.length*t)}}else{for(let t=0;t<=h.yAxis.splitNumber;t++){p.push(h.area[0]+r*t)}}if(s.disabled!==true){let t=h.chartData.yAxisData.rangesFormat[e];let o=s.fontSize?s.fontSize*h.pix:a.fontSize;let n=h.chartData.yAxisData.yAxisWidth[e];let l=s.textAlign||"right";t.forEach(function(t,e){var a=p[e];c.beginPath();c.setFontSize(o);c.setLineWidth(1*h.pix);c.setStrokeStyle(s.axisLineColor||"#cccccc");c.setFillStyle(s.fontColor||h.fontColor);let i=0;let r=4*h.pix;if(n.position=="left"){if(s.calibration==true){c.moveTo(d,a);c.lineTo(d-3*h.pix,a);r+=3*h.pix}switch(l){case"left":c.setTextAlign("left");i=d-n.width;break;case"right":c.setTextAlign("right");i=d-r;break;default:c.setTextAlign("center");i=d-n.width/2}c.fillText(String(t),i,a+o/2-3*h.pix)}else if(n.position=="right"){if(s.calibration==true){c.moveTo(x,a);c.lineTo(x+3*h.pix,a);r+=3*h.pix}switch(l){case"left":c.setTextAlign("left");i=x+r;break;case"right":c.setTextAlign("right");i=x+n.width;break;default:c.setTextAlign("center");i=x+n.width/2}c.fillText(String(t),i,a+o/2-3*h.pix)}else if(n.position=="center"){if(s.calibration==true){c.moveTo(f,a);c.lineTo(f-3*h.pix,a);r+=3*h.pix}switch(l){case"left":c.setTextAlign("left");i=f-n.width;break;case"right":c.setTextAlign("right");i=f-r;break;default:c.setTextAlign("center");i=f-n.width/2}c.fillText(String(t),i,a+o/2-3*h.pix)}c.closePath();c.stroke();c.setTextAlign("left")});if(s.axisLine!==false){c.beginPath();c.setStrokeStyle(s.axisLineColor||"#cccccc");c.setLineWidth(1*h.pix);if(n.position=="left"){c.moveTo(d,h.height-h.area[2]);c.lineTo(d,h.area[0])}else if(n.position=="right"){c.moveTo(x,h.height-h.area[2]);c.lineTo(x,h.area[0])}else if(n.position=="center"){c.moveTo(f,h.height-h.area[2]);c.lineTo(f,h.area[0])}c.stroke()}if(h.yAxis.showTitle){let t=s.titleFontSize*h.pix||a.fontSize;let e=s.title;c.beginPath();c.setFontSize(t);c.setFillStyle(s.titleFontColor||h.fontColor);if(n.position=="left"){c.fillText(e,d-measureText(e,t,c)/2+(s.titleOffsetX||0),h.area[0]-(10-(s.titleOffsetY||0))*h.pix)}else if(n.position=="right"){c.fillText(e,x-measureText(e,t,c)/2+(s.titleOffsetX||0),h.area[0]-(10-(s.titleOffsetY||0))*h.pix)}else if(n.position=="center"){c.fillText(e,f-measureText(e,t,c)/2+(s.titleOffsetX||0),h.area[0]-(10-(s.titleOffsetY||0))*h.pix)}c.closePath();c.stroke()}if(n.position=="left"){d-=n.width+h.yAxis.padding*h.pix}else{x+=n.width+h.yAxis.padding*h.pix}}}}}function drawLegend(t,l,y,s,e){if(l.legend.show===false){return}let h=e.legendData;let a=h.points;let c=h.area;let d=l.legend.padding*l.pix;let x=l.legend.fontSize*l.pix;let f=15*l.pix;let p=5*l.pix;let u=l.legend.itemGap*l.pix;let g=Math.max(l.legend.lineHeight*l.pix,x);s.beginPath();s.setLineWidth(l.legend.borderWidth*l.pix);s.setStrokeStyle(l.legend.borderColor);s.setFillStyle(l.legend.backgroundColor);s.moveTo(c.start.x,c.start.y);s.rect(c.start.x,c.start.y,c.width,c.height);s.closePath();s.fill();s.stroke();a.forEach(function(i,t){let e=0;let a=0;e=h.widthArr[t];a=h.heightArr[t];let r=0;let o=0;if(l.legend.position=="top"||l.legend.position=="bottom"){switch(l.legend.float){case"left":r=c.start.x+d;break;case"right":r=c.start.x+c.width-e;break;default:r=c.start.x+(c.width-e)/2}o=c.start.y+d+t*g}else{if(t==0){e=0}else{e=h.widthArr[t-1]}r=c.start.x+d+e;o=c.start.y+d+(c.height-a)/2}s.setFontSize(y.fontSize);for(let a=0;a<i.length;a++){let t=i[a];t.area=[0,0,0,0];t.area[0]=r;t.area[1]=o;t.area[3]=o+g;s.beginPath();s.setLineWidth(1*l.pix);s.setStrokeStyle(t.show?t.color:l.legend.hiddenColor);s.setFillStyle(t.show?t.color:l.legend.hiddenColor);switch(t.legendShape){case"line":s.moveTo(r,o+.5*g-2*l.pix);s.fillRect(r,o+.5*g-2*l.pix,15*l.pix,4*l.pix);break;case"triangle":s.moveTo(r+7.5*l.pix,o+.5*g-5*l.pix);s.lineTo(r+2.5*l.pix,o+.5*g+5*l.pix);s.lineTo(r+12.5*l.pix,o+.5*g+5*l.pix);s.lineTo(r+7.5*l.pix,o+.5*g-5*l.pix);break;case"diamond":s.moveTo(r+7.5*l.pix,o+.5*g-5*l.pix);s.lineTo(r+2.5*l.pix,o+.5*g);s.lineTo(r+7.5*l.pix,o+.5*g+5*l.pix);s.lineTo(r+12.5*l.pix,o+.5*g);s.lineTo(r+7.5*l.pix,o+.5*g-5*l.pix);break;case"circle":s.moveTo(r+7.5*l.pix,o+.5*g);s.arc(r+7.5*l.pix,o+.5*g,5*l.pix,0,2*Math.PI);break;case"rect":s.moveTo(r,o+.5*g-5*l.pix);s.fillRect(r,o+.5*g-5*l.pix,15*l.pix,10*l.pix);break;case"square":s.moveTo(r+5*l.pix,o+.5*g-5*l.pix);s.fillRect(r+5*l.pix,o+.5*g-5*l.pix,10*l.pix,10*l.pix);break;case"none":break;default:s.moveTo(r,o+.5*g-5*l.pix);s.fillRect(r,o+.5*g-5*l.pix,15*l.pix,10*l.pix)}s.closePath();s.fill();s.stroke();r+=f+p;let e=.5*g+.5*x-2;const n=t.legendText?t.legendText:t.name;s.beginPath();s.setFontSize(x);s.setFillStyle(t.show?l.legend.fontColor:l.legend.hiddenColor);s.fillText(n,r,o+e);s.closePath();s.stroke();if(l.legend.position=="top"||l.legend.position=="bottom"){r+=measureText(n,x,s)+u;t.area[2]=r}else{t.area[2]=r+measureText(n,x,s)+u;r-=f+p;o+=g}}})}function drawPieDataPoints(t,r,e,o){var a=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var n=assign({},{activeOpacity:.5,activeRadius:10,offsetAngle:0,labelWidth:15,ringWidth:30,customRadius:0,border:false,borderWidth:2,borderColor:"#FFFFFF",centerColor:"#FFFFFF",linearType:"none",customColor:[]},r.type=="pie"?r.extra.pie:r.extra.ring);var l={x:r.area[3]+(r.width-r.area[1]-r.area[3])/2,y:r.area[0]+(r.height-r.area[0]-r.area[2])/2};if(e.pieChartLinePadding==0){e.pieChartLinePadding=n.activeRadius*r.pix}var i=Math.min((r.width-r.area[1]-r.area[3])/2-e.pieChartLinePadding-e.pieChartTextPadding-e._pieTextMaxLength_,(r.height-r.area[0]-r.area[2])/2-e.pieChartLinePadding-e.pieChartTextPadding);i=i<10?10:i;if(n.customRadius>0){i=n.customRadius*r.pix}t=getPieDataPoints(t,i,a);var h=n.activeRadius*r.pix;n.customColor=fillCustomColor(n.linearType,n.customColor,t,e);t=t.map(function(t){t._start_+=n.offsetAngle*Math.PI/180;return t});t.forEach(function(t,e){if(r.tooltip){if(r.tooltip.index==e){o.beginPath();o.setFillStyle(hexToRgb(t.color,n.activeOpacity||.5));o.moveTo(l.x,l.y);o.arc(l.x,l.y,t._radius_+h,t._start_,t._start_+2*t._proportion_*Math.PI);o.closePath();o.fill()}}o.beginPath();o.setLineWidth(n.borderWidth*r.pix);o.lineJoin="round";o.setStrokeStyle(n.borderColor);var a=t.color;if(n.linearType=="custom"){var i;if(o.createCircularGradient){i=o.createCircularGradient(l.x,l.y,t._radius_)}else{i=o.createRadialGradient(l.x,l.y,0,l.x,l.y,t._radius_)}i.addColorStop(0,hexToRgb(n.customColor[t.linearIndex],1));i.addColorStop(1,hexToRgb(t.color,1));a=i}o.setFillStyle(a);o.moveTo(l.x,l.y);o.arc(l.x,l.y,t._radius_,t._start_,t._start_+2*t._proportion_*Math.PI);o.closePath();o.fill();if(n.border==true){o.stroke()}});if(r.type==="ring"){var s=i*.6;if(typeof n.ringWidth==="number"&&n.ringWidth>0){s=Math.max(0,i-n.ringWidth*r.pix)}o.beginPath();o.setFillStyle(n.centerColor);o.moveTo(l.x,l.y);o.arc(l.x,l.y,s,0,2*Math.PI);o.closePath();o.fill()}if(r.dataLabel!==false&&a===1){drawPieText(t,r,e,o,i,l)}if(a===1&&r.type==="ring"){drawRingTitle(r,e,o,l)}return{center:l,radius:i,series:t}}function drawRoseDataPoints(t,r,e,o){var a=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var n=assign({},{type:"area",activeOpacity:.5,activeRadius:10,offsetAngle:0,labelWidth:15,border:false,borderWidth:2,borderColor:"#FFFFFF",linearType:"none",customColor:[]},r.extra.rose);if(e.pieChartLinePadding==0){e.pieChartLinePadding=n.activeRadius*r.pix}var l={x:r.area[3]+(r.width-r.area[1]-r.area[3])/2,y:r.area[0]+(r.height-r.area[0]-r.area[2])/2};var i=Math.min((r.width-r.area[1]-r.area[3])/2-e.pieChartLinePadding-e.pieChartTextPadding-e._pieTextMaxLength_,(r.height-r.area[0]-r.area[2])/2-e.pieChartLinePadding-e.pieChartTextPadding);i=i<10?10:i;var s=n.minRadius||i*.5;if(i<s){i=s+10}t=getRoseDataPoints(t,n.type,s,i,a);var h=n.activeRadius*r.pix;n.customColor=fillCustomColor(n.linearType,n.customColor,t,e);t=t.map(function(t){t._start_+=(n.offsetAngle||0)*Math.PI/180;return t});t.forEach(function(t,e){if(r.tooltip){if(r.tooltip.index==e){o.beginPath();o.setFillStyle(hexToRgb(t.color,n.activeOpacity||.5));o.moveTo(l.x,l.y);o.arc(l.x,l.y,h+t._radius_,t._start_,t._start_+2*t._rose_proportion_*Math.PI);o.closePath();o.fill()}}o.beginPath();o.setLineWidth(n.borderWidth*r.pix);o.lineJoin="round";o.setStrokeStyle(n.borderColor);var a=t.color;if(n.linearType=="custom"){var i;if(o.createCircularGradient){i=o.createCircularGradient(l.x,l.y,t._radius_)}else{i=o.createRadialGradient(l.x,l.y,0,l.x,l.y,t._radius_)}i.addColorStop(0,hexToRgb(n.customColor[t.linearIndex],1));i.addColorStop(1,hexToRgb(t.color,1));a=i}o.setFillStyle(a);o.moveTo(l.x,l.y);o.arc(l.x,l.y,t._radius_,t._start_,t._start_+2*t._rose_proportion_*Math.PI);o.closePath();o.fill();if(n.border==true){o.stroke()}});if(r.dataLabel!==false&&a===1){drawPieText(t,r,e,o,i,l)}return{center:l,radius:i,series:t}}function drawArcbarDataPoints(a,i,t,r){var e=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var o=assign({},{startAngle:.75,endAngle:.25,type:"default",direction:"cw",lineCap:"round",width:12,gap:2,linearType:"none",customColor:[]},i.extra.arcbar);a=getArcbarDataPoints(a,o,e);var n;if(o.centerX||o.centerY){n={x:o.centerX?o.centerX:i.width/2,y:o.centerY?o.centerY:i.height/2}}else{n={x:i.width/2,y:i.height/2}}var l;if(o.radius){l=o.radius}else{l=Math.min(n.x,n.y);l-=5*i.pix;l-=o.width/2}l=l<10?10:l;o.customColor=fillCustomColor(o.linearType,o.customColor,a,t);for(let e=0;e<a.length;e++){let t=a[e];r.setLineWidth(o.width*i.pix);r.setStrokeStyle(o.backgroundColor||"#E9E9E9");r.setLineCap(o.lineCap);r.beginPath();if(o.type=="default"){r.arc(n.x,n.y,l-(o.width*i.pix+o.gap*i.pix)*e,o.startAngle*Math.PI,o.endAngle*Math.PI,o.direction=="ccw")}else{r.arc(n.x,n.y,l-(o.width*i.pix+o.gap*i.pix)*e,0,2*Math.PI,o.direction=="ccw")}r.stroke();var s=t.color;if(o.linearType=="custom"){var h=r.createLinearGradient(n.x-l,n.y,n.x+l,n.y);h.addColorStop(1,hexToRgb(o.customColor[t.linearIndex],1));h.addColorStop(0,hexToRgb(t.color,1));s=h}r.setLineWidth(o.width*i.pix);r.setStrokeStyle(s);r.setLineCap(o.lineCap);r.beginPath();r.arc(n.x,n.y,l-(o.width*i.pix+o.gap*i.pix)*e,o.startAngle*Math.PI,t._proportion_*Math.PI,o.direction=="ccw");r.stroke()}drawRingTitle(i,t,r,n);return{center:n,radius:l,series:a}}function drawGaugeDataPoints(n,h,c,t,d){var x=arguments.length>5&&arguments[5]!==undefined?arguments[5]:1;var f=assign({},{type:"default",startAngle:.75,endAngle:.25,width:15,labelOffset:13,splitLine:{fixRadius:0,splitNumber:10,width:15,color:"#FFFFFF",childNumber:5,childWidth:5},pointer:{width:15,color:"auto"}},c.extra.gauge);if(f.oldAngle==undefined){f.oldAngle=f.startAngle}if(f.oldData==undefined){f.oldData=0}n=getGaugeAxisPoints(n,f.startAngle,f.endAngle);var p={x:c.width/2,y:c.height/2};var u=Math.min(p.x,p.y);u-=5*c.pix;u-=f.width/2;u=u<10?10:u;var g=u-f.width;var y=0;if(f.type=="progress"){var v=u-f.width*3;d.beginPath();let t=d.createLinearGradient(p.x,p.y-v,p.x,p.y+v);t.addColorStop("0",hexToRgb(h[0].color,.3));t.addColorStop("1.0",hexToRgb("#FFFFFF",.1));d.setFillStyle(t);d.arc(p.x,p.y,v,0,2*Math.PI,false);d.fill();d.setLineWidth(f.width);d.setStrokeStyle(hexToRgb(h[0].color,.3));d.setLineCap("round");d.beginPath();d.arc(p.x,p.y,g,f.startAngle*Math.PI,f.endAngle*Math.PI,false);d.stroke();if(f.endAngle<f.startAngle){y=2+f.endAngle-f.startAngle}else{y=f.startAngle-f.endAngle}let e=y/f.splitLine.splitNumber;let a=y/f.splitLine.splitNumber/f.splitLine.childNumber;let i=-u-f.width*.5-f.splitLine.fixRadius;let r=-u-f.width-f.splitLine.fixRadius+f.splitLine.width;d.save();d.translate(p.x,p.y);d.rotate((f.startAngle-1)*Math.PI);let o=f.splitLine.splitNumber*f.splitLine.childNumber+1;let n=h[0].data*x;for(let t=0;t<o;t++){d.beginPath();if(n>t/o){d.setStrokeStyle(hexToRgb(h[0].color,1))}else{d.setStrokeStyle(hexToRgb(h[0].color,.3))}d.setLineWidth(3*c.pix);d.moveTo(i,0);d.lineTo(r,0);d.stroke();d.rotate(a*Math.PI)}d.restore();h=getGaugeArcbarDataPoints(h,f,x);d.setLineWidth(f.width);d.setStrokeStyle(h[0].color);d.setLineCap("round");d.beginPath();d.arc(p.x,p.y,g,f.startAngle*Math.PI,h[0]._proportion_*Math.PI,false);d.stroke();let l=u-f.width*2.5;d.save();d.translate(p.x,p.y);d.rotate((h[0]._proportion_-1)*Math.PI);d.beginPath();d.setLineWidth(f.width/3);let s=d.createLinearGradient(0,-l*.6,0,l*.6);s.addColorStop("0",hexToRgb("#FFFFFF",0));s.addColorStop("0.5",hexToRgb(h[0].color,1));s.addColorStop("1.0",hexToRgb("#FFFFFF",0));d.setStrokeStyle(s);d.arc(0,0,l,.85*Math.PI,1.15*Math.PI,false);d.stroke();d.beginPath();d.setLineWidth(1);d.setStrokeStyle(h[0].color);d.setFillStyle(h[0].color);d.moveTo(-l-f.width/3/2,-4);d.lineTo(-l-f.width/3/2-4,0);d.lineTo(-l-f.width/3/2,4);d.lineTo(-l-f.width/3/2,-4);d.stroke();d.fill();d.restore()}else{d.setLineWidth(f.width);d.setLineCap("butt");for(let e=0;e<n.length;e++){let t=n[e];d.beginPath();d.setStrokeStyle(t.color);d.arc(p.x,p.y,u,t._startAngle_*Math.PI,t._endAngle_*Math.PI,false);d.stroke()}d.save();if(f.endAngle<f.startAngle){y=2+f.endAngle-f.startAngle}else{y=f.startAngle-f.endAngle}let e=y/f.splitLine.splitNumber;let a=y/f.splitLine.splitNumber/f.splitLine.childNumber;let i=-u-f.width*.5-f.splitLine.fixRadius;let r=-u-f.width*.5-f.splitLine.fixRadius+f.splitLine.width;let o=-u-f.width*.5-f.splitLine.fixRadius+f.splitLine.childWidth;d.translate(p.x,p.y);d.rotate((f.startAngle-1)*Math.PI);for(let t=0;t<f.splitLine.splitNumber+1;t++){d.beginPath();d.setStrokeStyle(f.splitLine.color);d.setLineWidth(2*c.pix);d.moveTo(i,0);d.lineTo(r,0);d.stroke();d.rotate(e*Math.PI)}d.restore();d.save();d.translate(p.x,p.y);d.rotate((f.startAngle-1)*Math.PI);for(let t=0;t<f.splitLine.splitNumber*f.splitLine.childNumber+1;t++){d.beginPath();d.setStrokeStyle(f.splitLine.color);d.setLineWidth(1*c.pix);d.moveTo(i,0);d.lineTo(o,0);d.stroke();d.rotate(a*Math.PI)}d.restore();h=getGaugeDataPoints(h,n,f,x);for(let e=0;e<h.length;e++){let t=h[e];d.save();d.translate(p.x,p.y);d.rotate((t._proportion_-1)*Math.PI);d.beginPath();d.setFillStyle(t.color);d.moveTo(f.pointer.width,0);d.lineTo(0,-f.pointer.width/2);d.lineTo(-g,0);d.lineTo(0,f.pointer.width/2);d.lineTo(f.pointer.width,0);d.closePath();d.fill();d.beginPath();d.setFillStyle("#FFFFFF");d.arc(0,0,f.pointer.width/6,0,2*Math.PI,false);d.fill();d.restore()}if(c.dataLabel!==false){drawGaugeLabel(f,u,p,c,t,d)}}drawRingTitle(c,t,d,p);if(x===1&&c.type==="gauge"){c.extra.gauge.oldAngle=h[0]._proportion_;c.extra.gauge.oldData=h[0].data}return{center:p,radius:u,innerRadius:g,categories:n,totalAngle:y}}function drawRadarDataPoints(o,n,i,l){var t=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var s=assign({},{gridColor:"#cccccc",gridType:"radar",gridEval:1,axisLabel:false,axisLabelTofix:0,labelShow:true,labelColor:"#666666",labelPointShow:false,labelPointRadius:3,labelPointColor:"#cccccc",opacity:.2,gridCount:3,border:false,borderWidth:2,linearType:"none",customColor:[]},n.extra.radar);var a=getRadarCoordinateSeries(n.categories.length);var h={x:n.area[3]+(n.width-n.area[1]-n.area[3])/2,y:n.area[0]+(n.height-n.area[0]-n.area[2])/2};var r=(n.width-n.area[1]-n.area[3])/2;var d=(n.height-n.area[0]-n.area[2])/2;var c=Math.min(r-(getMaxTextListLength(n.categories,i.fontSize,l)+i.radarLabelTextMargin),d-i.radarLabelTextMargin);c-=i.radarLabelTextMargin*n.pix;c=c<10?10:c;c=s.radius?s.radius:c;l.beginPath();l.setLineWidth(1*n.pix);l.setStrokeStyle(s.gridColor);a.forEach(function(t,e){var a=convertCoordinateOrigin(c*Math.cos(t),c*Math.sin(t),h);l.moveTo(h.x,h.y);if(e%s.gridEval==0){l.lineTo(a.x,a.y)}});l.stroke();l.closePath();var x=function t(i){var r={};l.beginPath();l.setLineWidth(1*n.pix);l.setStrokeStyle(s.gridColor);if(s.gridType=="radar"){a.forEach(function(t,e){var a=convertCoordinateOrigin(c/s.gridCount*i*Math.cos(t),c/s.gridCount*i*Math.sin(t),h);if(e===0){r=a;l.moveTo(a.x,a.y)}else{l.lineTo(a.x,a.y)}});l.lineTo(r.x,r.y)}else{var e=convertCoordinateOrigin(c/s.gridCount*i*Math.cos(1.5),c/s.gridCount*i*Math.sin(1.5),h);l.arc(h.x,h.y,h.y-e.y,0,2*Math.PI,false)}l.stroke();l.closePath()};for(var e=1;e<=s.gridCount;e++){x(e)}s.customColor=fillCustomColor(s.linearType,s.customColor,o,i);var f=getRadarDataPoints(a,h,c,o,n,t);f.forEach(function(t,e){l.beginPath();l.setLineWidth(s.borderWidth*n.pix);l.setStrokeStyle(t.color);var a=hexToRgb(t.color,s.opacity);if(s.linearType=="custom"){var i;if(l.createCircularGradient){i=l.createCircularGradient(h.x,h.y,c)}else{i=l.createRadialGradient(h.x,h.y,0,h.x,h.y,c)}i.addColorStop(0,hexToRgb(s.customColor[o[e].linearIndex],s.opacity));i.addColorStop(1,hexToRgb(t.color,s.opacity));a=i}l.setFillStyle(a);t.data.forEach(function(t,e){if(e===0){l.moveTo(t.position.x,t.position.y)}else{l.lineTo(t.position.x,t.position.y)}});l.closePath();l.fill();if(s.border===true){l.stroke()}l.closePath();if(n.dataPointShape!==false){var r=t.data.map(function(t){return t.position});drawPointShape(r,t.color,t.pointShape,l,n)}});if(s.axisLabel===true){const p=Math.max(s.max,Math.max.apply(null,dataCombine(o)));const u=c/s.gridCount;const g=n.fontSize*n.pix;l.setFontSize(g);l.setFillStyle(n.fontColor);l.setTextAlign("left");for(var e=0;e<s.gridCount+1;e++){let t=e*p/s.gridCount;t=t.toFixed(s.axisLabelTofix);l.fillText(String(t),h.x+3*n.pix,h.y-e*u+g/2)}}drawRadarLabel(a,c,h,n,i,l);if(n.dataLabel!==false&&t===1){f.forEach(function(t,e){l.beginPath();var a=t.textSize*n.pix||i.fontSize;l.setFontSize(a);l.setFillStyle(t.textColor||n.fontColor);t.data.forEach(function(t,e){if(Math.abs(t.position.x-h.x)<2){if(t.position.y<h.y){l.setTextAlign("center");l.fillText(t.value,t.position.x,t.position.y-4)}else{l.setTextAlign("center");l.fillText(t.value,t.position.x,t.position.y+a+2)}}else{if(t.position.x<h.x){l.setTextAlign("right");l.fillText(t.value,t.position.x-4,t.position.y+a/2-2)}else{l.setTextAlign("left");l.fillText(t.value,t.position.x+4,t.position.y+a/2-2)}}});l.closePath();l.stroke()});l.setTextAlign("left")}return{center:h,radius:c,angleList:a}}function lonlat2mercator(t,e){var a=Array(2);var i=t*20037508.34/180;var r=Math.log(Math.tan((90+e)*Math.PI/360))/(Math.PI/180);r=r*20037508.34/180;a[0]=i;a[1]=r;return a}function mercator2lonlat(t,e){var a=Array(2);var i=t/20037508.34*180;var r=e/20037508.34*180;r=180/Math.PI*(2*Math.atan(Math.exp(r*Math.PI/180))-Math.PI/2);a[0]=i;a[1]=r;return a}function getBoundingBox(t){var e={},a;e.xMin=180;e.xMax=0;e.yMin=90;e.yMax=0;for(var i=0;i<t.length;i++){var r=t[i].geometry.coordinates;for(var o=0;o<r.length;o++){a=r[o];if(a.length==1){a=a[0]}for(var n=0;n<a.length;n++){var l=a[n][0];var s=a[n][1];var h={x:l,y:s};e.xMin=e.xMin<h.x?e.xMin:h.x;e.xMax=e.xMax>h.x?e.xMax:h.x;e.yMin=e.yMin<h.y?e.yMin:h.y;e.yMax=e.yMax>h.y?e.yMax:h.y}}}return e}function coordinateToPoint(t,e,a,i,r,o){return{x:(e-a.xMin)*i+r,y:(a.yMax-t)*i+o}}function pointToCoordinate(t,e,a,i,r,o){return{x:(e-r)/i+a.xMin,y:a.yMax-(t-o)/i}}function isRayIntersectsSegment(t,e,a){if(e[1]==a[1]){return false}if(e[1]>t[1]&&a[1]>t[1]){return false}if(e[1]<t[1]&&a[1]<t[1]){return false}if(e[1]==t[1]&&a[1]>t[1]){return false}if(a[1]==t[1]&&e[1]>t[1]){return false}if(e[0]<t[0]&&a[1]<t[1]){return false}let i=a[0]-(a[0]-e[0])*(a[1]-t[1])/(a[1]-e[1]);if(i<t[0]){return false}else{return true}}function isPoiWithinPoly(r,e,o){let n=0;for(let t=0;t<e.length;t++){let i=e[t][0];if(e.length==1){i=e[t][0]}for(let a=0;a<i.length-1;a++){let t=i[a];let e=i[a+1];if(o){t=lonlat2mercator(i[a][0],i[a][1]);e=lonlat2mercator(i[a+1][0],i[a+1][1])}if(isRayIntersectsSegment(r,t,e)){n+=1}}}if(n%2==1){return true}else{return false}}function drawMapDataPoints(a,i,d,r){var o=assign({},{border:true,mercator:false,borderWidth:1,active:true,borderColor:"#666666",fillOpacity:.6,activeBorderColor:"#f04864",activeFillColor:"#facc14",activeFillOpacity:1},i.extra.map);var t,n;var l=a;var s=getBoundingBox(l);if(o.mercator){var x=lonlat2mercator(s.xMax,s.yMax);var f=lonlat2mercator(s.xMin,s.yMin);s.xMax=x[0];s.yMax=x[1];s.xMin=f[0];s.yMin=f[1]}var p=i.width/Math.abs(s.xMax-s.xMin);var u=i.height/Math.abs(s.yMax-s.yMin);var h=p<u?p:u;var g=i.width/2-Math.abs(s.xMax-s.xMin)/2*h;var y=i.height/2-Math.abs(s.yMax-s.yMin)/2*h;for(var c=0;c<l.length;c++){r.beginPath();r.setLineWidth(o.borderWidth*i.pix);r.setStrokeStyle(o.borderColor);r.setFillStyle(hexToRgb(a[c].color,a[c].fillOpacity||o.fillOpacity));if(o.active==true&&i.tooltip){if(i.tooltip.index==c){r.setStrokeStyle(o.activeBorderColor);r.setFillStyle(hexToRgb(o.activeFillColor,o.activeFillOpacity))}}var v=l[c].geometry.coordinates;for(var m=0;m<v.length;m++){t=v[m];if(t.length==1){t=t[0]}for(var e=0;e<t.length;e++){var T=Array(2);if(o.mercator){T=lonlat2mercator(t[e][0],t[e][1])}else{T=t[e]}n=coordinateToPoint(T[1],T[0],s,h,g,y);if(e===0){r.beginPath();r.moveTo(n.x,n.y)}else{r.lineTo(n.x,n.y)}}r.fill();if(o.border==true){r.stroke()}}}if(i.dataLabel==true){for(var c=0;c<l.length;c++){var b=l[c].properties.centroid;if(b){if(o.mercator){b=lonlat2mercator(l[c].properties.centroid[0],l[c].properties.centroid[1])}n=coordinateToPoint(b[1],b[0],s,h,g,y);let t=l[c].textSize*i.pix||d.fontSize;let e=l[c].textColor||i.fontColor;if(o.active&&o.activeTextColor&&i.tooltip&&i.tooltip.index==c){e=o.activeTextColor}let a=l[c].properties.name;r.beginPath();r.setFontSize(t);r.setFillStyle(e);r.fillText(a,n.x-measureText(a,t,r)/2,n.y+t/2);r.closePath();r.stroke()}}}i.chartData.mapData={bounds:s,scale:h,xoffset:g,yoffset:y,mercator:o.mercator};drawToolTipBridge(i,d,r,1);r.draw()}function normalInt(t,e,a){a=a==0?1:a;var i=[];for(var r=0;r<a;r++){i[r]=Math.random()}return Math.floor(i.reduce(function(t,e){return t+e})/a*(e-t))+t}function collisionNew(e,a,i,r){var o=false;for(let t=0;t<a.length;t++){if(a[t].area){if(e[3]<a[t].area[1]||e[0]>a[t].area[2]||e[1]>a[t].area[3]||e[2]<a[t].area[0]){if(e[0]<0||e[1]<0||e[2]>i||e[3]>r){o=true;break}else{o=false}}else{o=true;break}}}return o}function getWordCloudPoint(c,t,d){let x=c.series;switch(t){case"normal":for(let l=0;l<x.length;l++){let t=x[l].name;let e=x[l].textSize*c.pix;let a=measureText(t,e,d);let i,r;let o;let n=0;while(true){n++;i=normalInt(-c.width/2,c.width/2,5)-a/2;r=normalInt(-c.height/2,c.height/2,5)+e/2;o=[i-5+c.width/2,r-5-e+c.height/2,i+a+5+c.width/2,r+5+c.height/2];let t=collisionNew(o,x,c.width,c.height);if(!t)break;if(n==1e3){o=[-100,-100,-100,-100];break}}x[l].area=o}break;case"vertical":function f(){if(Math.random()>.7){return true}else{return false}};for(let h=0;h<x.length;h++){let t=x[h].name;let e=x[h].textSize*c.pix;let a=measureText(t,e,d);let i=f();let r,o,n,l;let s=0;while(true){s++;let t;if(i){r=normalInt(-c.width/2,c.width/2,5)-a/2;o=normalInt(-c.height/2,c.height/2,5)+e/2;n=[o-5-a+c.width/2,-r-5+c.height/2,o+5+c.width/2,-r+e+5+c.height/2];l=[c.width-(c.width/2-c.height/2)-(-r+e+5+c.height/2)-5,c.height/2-c.width/2+(o-5-a+c.width/2)-5,c.width-(c.width/2-c.height/2)-(-r+e+5+c.height/2)+e,c.height/2-c.width/2+(o-5-a+c.width/2)+a+5];t=collisionNew(l,x,c.height,c.width)}else{r=normalInt(-c.width/2,c.width/2,5)-a/2;o=normalInt(-c.height/2,c.height/2,5)+e/2;n=[r-5+c.width/2,o-5-e+c.height/2,r+a+5+c.width/2,o+5+c.height/2];t=collisionNew(n,x,c.width,c.height)}if(!t)break;if(s==1e3){n=[-1e3,-1e3,-1e3,-1e3];break}}if(i){x[h].area=l;x[h].areav=n}else{x[h].area=n}x[h].rotate=i};break}return x}function drawWordCloudDataPoints(t,r,e,o){let n=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let a=assign({},{type:"normal",autoColors:true},r.extra.word);if(!r.chartData.wordCloudData){r.chartData.wordCloudData=getWordCloudPoint(r,a.type,o)}o.beginPath();o.setFillStyle(r.background);o.rect(0,0,r.width,r.height);o.fill();o.save();let l=r.chartData.wordCloudData;o.translate(r.width/2,r.height/2);for(let i=0;i<l.length;i++){o.save();if(l[i].rotate){o.rotate(90*Math.PI/180)}let t=l[i].name;let e=l[i].textSize*r.pix;let a=measureText(t,e,o);o.beginPath();o.setStrokeStyle(l[i].color);o.setFillStyle(l[i].color);o.setFontSize(e);if(l[i].rotate){if(l[i].areav[0]>0){if(r.tooltip){if(r.tooltip.index==i){o.strokeText(t,(l[i].areav[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].areav[1]+5+e-r.height/2)*n)}else{o.fillText(t,(l[i].areav[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].areav[1]+5+e-r.height/2)*n)}}else{o.fillText(t,(l[i].areav[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].areav[1]+5+e-r.height/2)*n)}}}else{if(l[i].area[0]>0){if(r.tooltip){if(r.tooltip.index==i){o.strokeText(t,(l[i].area[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].area[1]+5+e-r.height/2)*n)}else{o.fillText(t,(l[i].area[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].area[1]+5+e-r.height/2)*n)}}else{o.fillText(t,(l[i].area[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].area[1]+5+e-r.height/2)*n)}}}o.stroke();o.restore()}o.restore()}function drawFunnelDataPoints(t,e,c,a){let d=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let i=assign({},{type:"funnel",activeWidth:10,activeOpacity:.3,border:false,borderWidth:2,borderColor:"#FFFFFF",fillOpacity:1,minSize:0,labelAlign:"right",linearType:"none",customColor:[]},e.extra.funnel);let r=(e.height-e.area[0]-e.area[2])/t.length;let o={x:e.area[3]+(e.width-e.area[1]-e.area[3])/2,y:e.height-e.area[2]};let n=i.activeWidth*e.pix;let x=Math.min((e.width-e.area[1]-e.area[3])/2-n,(e.height-e.area[0]-e.area[2])/2-n);let l=getFunnelDataPoints(t,x,i,r,d);a.save();a.translate(o.x,o.y);i.customColor=fillCustomColor(i.linearType,i.customColor,t,c);if(i.type=="pyramid"){for(let t=0;t<l.length;t++){if(t==l.length-1){if(e.tooltip){if(e.tooltip.index==t){a.beginPath();a.setFillStyle(hexToRgb(l[t].color,i.activeOpacity));a.moveTo(-n,-r);a.lineTo(-l[t].radius-n,0);a.lineTo(l[t].radius+n,0);a.lineTo(n,-r);a.lineTo(-n,-r);a.closePath();a.fill()}}l[t].funnelArea=[o.x-l[t].radius,o.y-r*(t+1),o.x+l[t].radius,o.y-r*t];a.beginPath();a.setLineWidth(i.borderWidth*e.pix);a.setStrokeStyle(i.borderColor);var s=hexToRgb(l[t].color,i.fillOpacity);if(i.linearType=="custom"){var h=a.createLinearGradient(l[t].radius,-r,-l[t].radius,-r);h.addColorStop(0,hexToRgb(l[t].color,i.fillOpacity));h.addColorStop(.5,hexToRgb(i.customColor[l[t].linearIndex],i.fillOpacity));h.addColorStop(1,hexToRgb(l[t].color,i.fillOpacity));s=h}a.setFillStyle(s);a.moveTo(0,-r);a.lineTo(-l[t].radius,0);a.lineTo(l[t].radius,0);a.lineTo(0,-r);a.closePath();a.fill();if(i.border==true){a.stroke()}}else{if(e.tooltip){if(e.tooltip.index==t){a.beginPath();a.setFillStyle(hexToRgb(l[t].color,i.activeOpacity));a.moveTo(0,0);a.lineTo(-l[t].radius-n,0);a.lineTo(-l[t+1].radius-n,-r);a.lineTo(l[t+1].radius+n,-r);a.lineTo(l[t].radius+n,0);a.lineTo(0,0);a.closePath();a.fill()}}l[t].funnelArea=[o.x-l[t].radius,o.y-r*(t+1),o.x+l[t].radius,o.y-r*t];a.beginPath();a.setLineWidth(i.borderWidth*e.pix);a.setStrokeStyle(i.borderColor);var s=hexToRgb(l[t].color,i.fillOpacity);if(i.linearType=="custom"){var h=a.createLinearGradient(l[t].radius,-r,-l[t].radius,-r);h.addColorStop(0,hexToRgb(l[t].color,i.fillOpacity));h.addColorStop(.5,hexToRgb(i.customColor[l[t].linearIndex],i.fillOpacity));h.addColorStop(1,hexToRgb(l[t].color,i.fillOpacity));s=h}a.setFillStyle(s);a.moveTo(0,0);a.lineTo(-l[t].radius,0);a.lineTo(-l[t+1].radius,-r);a.lineTo(l[t+1].radius,-r);a.lineTo(l[t].radius,0);a.lineTo(0,0);a.closePath();a.fill();if(i.border==true){a.stroke()}}a.translate(0,-r)}}else{a.translate(0,-(l.length-1)*r);for(let t=0;t<l.length;t++){if(t==l.length-1){if(e.tooltip){if(e.tooltip.index==t){a.beginPath();a.setFillStyle(hexToRgb(l[t].color,i.activeOpacity));a.moveTo(-n-i.minSize/2,0);a.lineTo(-l[t].radius-n,-r);a.lineTo(l[t].radius+n,-r);a.lineTo(n+i.minSize/2,0);a.lineTo(-n-i.minSize/2,0);a.closePath();a.fill()}}l[t].funnelArea=[o.x-l[t].radius,o.y-r,o.x+l[t].radius,o.y];a.beginPath();a.setLineWidth(i.borderWidth*e.pix);a.setStrokeStyle(i.borderColor);var s=hexToRgb(l[t].color,i.fillOpacity);if(i.linearType=="custom"){var h=a.createLinearGradient(l[t].radius,-r,-l[t].radius,-r);h.addColorStop(0,hexToRgb(l[t].color,i.fillOpacity));h.addColorStop(.5,hexToRgb(i.customColor[l[t].linearIndex],i.fillOpacity));h.addColorStop(1,hexToRgb(l[t].color,i.fillOpacity));s=h}a.setFillStyle(s);a.moveTo(0,0);a.lineTo(-i.minSize/2,0);a.lineTo(-l[t].radius,-r);a.lineTo(l[t].radius,-r);a.lineTo(i.minSize/2,0);a.lineTo(0,0);a.closePath();a.fill();if(i.border==true){a.stroke()}}else{if(e.tooltip){if(e.tooltip.index==t){a.beginPath();a.setFillStyle(hexToRgb(l[t].color,i.activeOpacity));a.moveTo(0,0);a.lineTo(-l[t+1].radius-n,0);a.lineTo(-l[t].radius-n,-r);a.lineTo(l[t].radius+n,-r);a.lineTo(l[t+1].radius+n,0);a.lineTo(0,0);a.closePath();a.fill()}}l[t].funnelArea=[o.x-l[t].radius,o.y-r*(l.length-t),o.x+l[t].radius,o.y-r*(l.length-t-1)];a.beginPath();a.setLineWidth(i.borderWidth*e.pix);a.setStrokeStyle(i.borderColor);var s=hexToRgb(l[t].color,i.fillOpacity);if(i.linearType=="custom"){var h=a.createLinearGradient(l[t].radius,-r,-l[t].radius,-r);h.addColorStop(0,hexToRgb(l[t].color,i.fillOpacity));h.addColorStop(.5,hexToRgb(i.customColor[l[t].linearIndex],i.fillOpacity));h.addColorStop(1,hexToRgb(l[t].color,i.fillOpacity));s=h}a.setFillStyle(s);a.moveTo(0,0);a.lineTo(-l[t+1].radius,0);a.lineTo(-l[t].radius,-r);a.lineTo(l[t].radius,-r);a.lineTo(l[t+1].radius,0);a.lineTo(0,0);a.closePath();a.fill();if(i.border==true){a.stroke()}}a.translate(0,r)}}a.restore();if(e.dataLabel!==false&&d===1){drawFunnelText(l,e,a,r,i.labelAlign,n,o)}if(d===1){drawFunnelCenterText(l,e,a,r,i.labelAlign,n,o)}return{center:o,radius:x,series:l}}function drawFunnelText(l,s,h,c,d,x,f){for(let n=0;n<l.length;n++){let t=l[n];if(t.labelShow===false){continue}let e,a,i,r;let o=t.formatter?t.formatter(t,n,l,s):util.toFixed(t._proportion_*100)+"%";o=t.labelText?t.labelText:o;if(d=="right"){if(n==l.length-1){e=(t.funnelArea[2]+f.x)/2}else{e=(t.funnelArea[2]+l[n+1].funnelArea[2])/2}a=e+x*2;i=t.funnelArea[1]+c/2;r=t.textSize*s.pix||s.fontSize*s.pix;h.setLineWidth(1*s.pix);h.setStrokeStyle(t.color);h.setFillStyle(t.color);h.beginPath();h.moveTo(e,i);h.lineTo(a,i);h.stroke();h.closePath();h.beginPath();h.moveTo(a,i);h.arc(a,i,2*s.pix,0,2*Math.PI);h.closePath();h.fill();h.beginPath();h.setFontSize(r);h.setFillStyle(t.textColor||s.fontColor);h.fillText(o,a+5,i+r/2-2);h.closePath();h.stroke();h.closePath()}if(d=="left"){if(n==l.length-1){e=(t.funnelArea[0]+f.x)/2}else{e=(t.funnelArea[0]+l[n+1].funnelArea[0])/2}a=e-x*2;i=t.funnelArea[1]+c/2;r=t.textSize*s.pix||s.fontSize*s.pix;h.setLineWidth(1*s.pix);h.setStrokeStyle(t.color);h.setFillStyle(t.color);h.beginPath();h.moveTo(e,i);h.lineTo(a,i);h.stroke();h.closePath();h.beginPath();h.moveTo(a,i);h.arc(a,i,2,0,2*Math.PI);h.closePath();h.fill();h.beginPath();h.setFontSize(r);h.setFillStyle(t.textColor||s.fontColor);h.fillText(o,a-5-measureText(o,r,h),i+r/2-2);h.closePath();h.stroke();h.closePath()}}}function drawFunnelCenterText(r,o,n,l,t,e,s){for(let i=0;i<r.length;i++){let t=r[i];let e,a;if(t.centerText){e=t.funnelArea[1]+l/2;a=t.centerTextSize*o.pix||o.fontSize*o.pix;n.beginPath();n.setFontSize(a);n.setFillStyle(t.centerTextColor||"#FFFFFF");n.fillText(t.centerText,s.x-measureText(t.centerText,a,n)/2,e+a/2-2);n.closePath();n.stroke();n.closePath()}}}function drawCanvas(t,e){e.save();e.translate(0,.5);e.restore();e.draw()}var Timing={easeIn:function t(e){return Math.pow(e,3)},easeOut:function t(e){return Math.pow(e-1,3)+1},easeInOut:function t(e){if((e/=.5)<1){return.5*Math.pow(e,3)}else{return.5*(Math.pow(e-2,3)+2)}},linear:function t(e){return e}};function Animation(r){this.isStop=false;r.duration=typeof r.duration==="undefined"?1e3:r.duration;r.timing=r.timing||"easeInOut";var o=17;function t(){if(typeof setTimeout!=="undefined"){return function(e,t){setTimeout(function(){var t=+new Date;e(t)},t)}}else if(typeof requestAnimationFrame!=="undefined"){return requestAnimationFrame}else{return function(t){t(null)}}}var n=t();var l=null;var s=function t(e){if(e===null||this.isStop===true){r.onProcess&&r.onProcess(1);r.onAnimationFinish&&r.onAnimationFinish();return}if(l===null){l=e}if(e-l<r.duration){var a=(e-l)/r.duration;var i=Timing[r.timing];a=i(a);r.onProcess&&r.onProcess(a);n(s,o)}else{r.onProcess&&r.onProcess(1);r.onAnimationFinish&&r.onAnimationFinish()}};s=s.bind(this);n(s,o)}Animation.prototype.stop=function(){this.isStop=true};function drawCharts(t,l,n,s){var h=this;var c=l.series;if(t==="pie"||t==="ring"||t==="mount"||t==="rose"||t==="funnel"){c=fixPieSeries(c,l,n)}var d=l.categories;if(t==="mount"){d=[];for(let t=0;t<c.length;t++){if(c[t].show!==false)d.push(c[t].name)}l.categories=d}c=fillSeries(c,l,n);var e=l.animation?l.duration:0;h.animationInstance&&h.animationInstance.stop();var x=null;if(t=="candle"){let t=assign({},l.extra.candle.average);if(t.show){x=calCandleMA(t.day,t.name,t.color,c[0].data);x=fillSeries(x,l,n);l.seriesMA=x}else if(l.seriesMA){x=l.seriesMA=fillSeries(l.seriesMA,l,n)}else{x=c}}else{x=c}l._series_=c=filterSeries(c);l.area=new Array(4);for(let t=0;t<4;t++){l.area[t]=l.padding[t]*l.pix}var a=calLegendData(x,l,n,l.chartData,s),r=a.area.wholeHeight,o=a.area.wholeWidth;switch(l.legend.position){case"top":l.area[0]+=r;break;case"bottom":l.area[2]+=r;break;case"left":l.area[3]+=o;break;case"right":l.area[1]+=o;break}let f={},i=0;if(l.type==="line"||l.type==="column"||l.type==="mount"||l.type==="area"||l.type==="mix"||l.type==="candle"||l.type==="scatter"||l.type==="bubble"||l.type==="bar"){f=calYAxisData(c,l,n,s);i=f.yAxisWidth;if(l.yAxis.showTitle){let e=0;for(let t=0;t<l.yAxis.data.length;t++){e=Math.max(e,l.yAxis.data[t].titleFontSize?l.yAxis.data[t].titleFontSize*l.pix:n.fontSize)}l.area[0]+=e}let e=0,a=0;for(let t=0;t<i.length;t++){if(i[t].position=="left"){if(a>0){l.area[3]+=i[t].width+l.yAxis.padding*l.pix}else{l.area[3]+=i[t].width}a+=1}else if(i[t].position=="right"){if(e>0){l.area[1]+=i[t].width+l.yAxis.padding*l.pix}else{l.area[1]+=i[t].width}e+=1}}}else{n.yAxisWidth=i}l.chartData.yAxisData=f;if(l.categories&&l.categories.length&&l.type!=="radar"&&l.type!=="gauge"&&l.type!=="bar"){l.chartData.xAxisData=getXAxisPoints(l.categories,l,n);let t=calCategoriesData(l.categories,l,n,l.chartData.xAxisData.eachSpacing,s),e=t.xAxisHeight,a=t.angle;n.xAxisHeight=e;n._xAxisTextAngle_=a;l.area[2]+=e;l.chartData.categoriesData=t}else{if(l.type==="line"||l.type==="area"||l.type==="scatter"||l.type==="bubble"||l.type==="bar"){l.chartData.xAxisData=calXAxisData(c,l,n,s);d=l.chartData.xAxisData.rangesFormat;let t=calCategoriesData(d,l,n,l.chartData.xAxisData.eachSpacing,s),e=t.xAxisHeight,a=t.angle;n.xAxisHeight=e;n._xAxisTextAngle_=a;l.area[2]+=e;l.chartData.categoriesData=t}else{l.chartData.xAxisData={xAxisPoints:[]}}}if(l.enableScroll&&l.xAxis.scrollAlign=="right"&&l._scrollDistance_===undefined){let t=0,e=l.chartData.xAxisData.xAxisPoints,a=l.chartData.xAxisData.startX,i=l.chartData.xAxisData.endX,r=l.chartData.xAxisData.eachSpacing;let o=r*(e.length-1);let n=i-a;t=n-o;h.scrollOption.currentOffset=t;h.scrollOption.startTouchX=t;h.scrollOption.distance=0;h.scrollOption.lastMoveTime=0;l._scrollDistance_=t}if(t==="pie"||t==="ring"||t==="rose"){n._pieTextMaxLength_=l.dataLabel===false?0:getPieTextMaxLength(x,n,s,l)}switch(t){case"word":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function(t){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawWordCloudDataPoints(c,l,n,s,t);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"map":s.clearRect(0,0,l.width,l.height);drawMapDataPoints(c,l,n,s);setTimeout(()=>{this.uevent.trigger("renderComplete")},50);break;case"funnel":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function(t){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.funnelData=drawFunnelDataPoints(c,l,n,s,t);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,t);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"line":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawLineDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"scatter":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawScatterDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"bubble":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawBubbleDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"mix":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawMixDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"column":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawColumnDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"mount":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawMountDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"bar":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawXAxis(d,l,n,s);var a=drawBarDataPoints(c,l,n,s,e),i=a.yAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.yAxisPoints=i;l.chartData.xAxisPoints=l.chartData.xAxisData.xAxisPoints;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"area":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawAreaDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"ring":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.pieData=drawPieDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"pie":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.pieData=drawPieDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"rose":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.pieData=drawRoseDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"radar":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.radarData=drawRadarDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"arcbar":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.arcbarData=drawArcbarDataPoints(c,l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"gauge":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.gaugeData=drawGaugeDataPoints(d,c,l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"candle":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawCandleDataPoints(c,x,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}if(x){drawLegend(x,l,n,s,l.chartData)}else{drawLegend(l.series,l,n,s,l.chartData)}drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break}}function uChartsEvent(){this.events={}}uChartsEvent.prototype.addEventListener=function(t,e){this.events[t]=this.events[t]||[];this.events[t].push(e)};uChartsEvent.prototype.delEventListener=function(t){this.events[t]=[]};uChartsEvent.prototype.trigger=function(){for(var t=arguments.length,e=Array(t),a=0;a<t;a++){e[a]=arguments[a]}var i=e[0];var r=e.slice(1);if(!!this.events[i]){this.events[i].forEach(function(t){try{t.apply(null,r)}catch(t){}})}};var uCharts=function t(a){a.pix=a.pixelRatio?a.pixelRatio:1;a.fontSize=a.fontSize?a.fontSize:13;a.fontColor=a.fontColor?a.fontColor:config.fontColor;if(a.background==""||a.background=="none"){a.background="#FFFFFF"}a.title=assign({},a.title);a.subtitle=assign({},a.subtitle);a.duration=a.duration?a.duration:1e3;a.yAxis=assign({},{data:[],showTitle:false,disabled:false,disableGrid:false,gridSet:"number",splitNumber:5,gridType:"solid",dashLength:4*a.pix,gridColor:"#cccccc",padding:10,fontColor:"#666666"},a.yAxis);a.xAxis=assign({},{rotateLabel:false,rotateAngle:45,disabled:false,disableGrid:false,splitNumber:5,calibration:false,fontColor:"#666666",fontSize:13,lineHeight:20,marginTop:0,gridType:"solid",dashLength:4,scrollAlign:"left",boundaryGap:"center",axisLine:true,axisLineColor:"#cccccc",titleFontSize:13,titleOffsetY:0,titleOffsetX:0,titleFontColor:"#666666"},a.xAxis);a.xAxis.scrollPosition=a.xAxis.scrollAlign;a.legend=assign({},{show:true,position:"bottom",float:"center",backgroundColor:"rgba(0,0,0,0)",borderColor:"rgba(0,0,0,0)",borderWidth:0,padding:5,margin:5,itemGap:10,fontSize:a.fontSize,lineHeight:a.fontSize,fontColor:a.fontColor,formatter:{},hiddenColor:"#CECECE"},a.legend);a.extra=assign({tooltip:{legendShape:"auto"}},a.extra);a.rotate=a.rotate?true:false;a.animation=a.animation?true:false;a.rotate=a.rotate?true:false;a.canvas2d=a.canvas2d?true:false;let e=assign({},config);e.color=a.color?a.color:e.color;if(a.type=="pie"){e.pieChartLinePadding=a.dataLabel===false?0:a.extra.pie.labelWidth*a.pix||e.pieChartLinePadding*a.pix}if(a.type=="ring"){e.pieChartLinePadding=a.dataLabel===false?0:a.extra.ring.labelWidth*a.pix||e.pieChartLinePadding*a.pix}if(a.type=="rose"){e.pieChartLinePadding=a.dataLabel===false?0:a.extra.rose.labelWidth*a.pix||e.pieChartLinePadding*a.pix}e.pieChartTextPadding=a.dataLabel===false?0:e.pieChartTextPadding*a.pix;e.rotate=a.rotate;if(a.rotate){let t=a.width;let e=a.height;a.width=e;a.height=t}a.padding=a.padding?a.padding:e.padding;e.yAxisWidth=config.yAxisWidth*a.pix;e.fontSize=a.fontSize*a.pix;e.titleFontSize=config.titleFontSize*a.pix;e.subtitleFontSize=config.subtitleFontSize*a.pix;if(!a.context){throw new Error("[uCharts] æœªèŽ·å–åˆ°context!注意:v2.0版本后,需要自行获取canvas的绘图上下文并传入opts.context!")}this.context=a.context;if(!this.context.setTextAlign){this.context.setStrokeStyle=function(t){return this.strokeStyle=t};this.context.setLineWidth=function(t){return this.lineWidth=t};this.context.setLineCap=function(t){return this.lineCap=t};this.context.setFontSize=function(t){return this.font=t+"px sans-serif"};this.context.setFillStyle=function(t){return this.fillStyle=t};this.context.setTextAlign=function(t){return this.textAlign=t};this.context.setTextBaseline=function(t){return this.textBaseline=t};this.context.setShadow=function(t,e,a,i){this.shadowColor=i;this.shadowOffsetX=t;this.shadowOffsetY=e;this.shadowBlur=a};this.context.draw=function(){}}if(!this.context.setLineDash){this.context.setLineDash=function(t){}}a.chartData={};this.uevent=new uChartsEvent;this.scrollOption={currentOffset:0,startTouchX:0,distance:0,lastMoveTime:0};this.opts=a;this.config=e;drawCharts.call(this,a.type,a,e,this.context)};uCharts.prototype.updateData=function(){let t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};this.opts=assign({},this.opts,t);this.opts.updateData=true;let c=t.scrollPosition||"current";switch(c){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 t=calYAxisData(this.opts.series,this.opts,this.config,this.context),e=t.yAxisWidth;this.config.yAxisWidth=e;let a=0;let i=getXAxisPoints(this.opts.categories,this.opts,this.config),r=i.xAxisPoints,o=i.startX,n=i.endX,l=i.eachSpacing;let s=l*(r.length-1);let h=n-o;a=h-s;this.scrollOption={currentOffset:a,startTouchX:a,distance:0,lastMoveTime:0};this.opts._scrollDistance_=a;break}drawCharts.call(this,this.opts.type,this.opts,this.config,this.context)};uCharts.prototype.zoom=function(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.opts.xAxis.itemCount;if(this.opts.enableScroll!==true){console.log("[uCharts] è¯·å¯ç”¨æ»šåŠ¨æ¡åŽä½¿ç”¨");return}let e=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=t.itemCount;let a=calYAxisData(this.opts.series,this.opts,this.config,this.context),i=a.yAxisWidth;this.config.yAxisWidth=i;let r=0;let o=getXAxisPoints(this.opts.categories,this.opts,this.config),h=o.xAxisPoints,c=o.startX,d=o.endX,n=o.eachSpacing;let x=n*e;let l=d-c;let s=l-n*(h.length-1);r=l/2-x;if(r>0){r=0}if(r<s){r=s}this.scrollOption={currentOffset:r,startTouchX:0,distance:0,lastMoveTime:0};calValidDistance(this,r,this.opts.chartData,this.config,this.opts);this.opts._scrollDistance_=r;drawCharts.call(this,this.opts.type,this.opts,this.config,this.context)};uCharts.prototype.dobuleZoom=function(t){if(this.opts.enableScroll!==true){console.log("[uCharts] è¯·å¯ç”¨æ»šåŠ¨æ¡åŽä½¿ç”¨");return}const a=t.changedTouches;if(a.length<2){return}for(var e=0;e<a.length;e++){a[e].x=a[e].x?a[e].x:a[e].clientX;a[e].y=a[e].y?a[e].y:a[e].clientY}const i=[getTouches(a[0],this.opts,t),getTouches(a[1],this.opts,t)];const c=Math.abs(i[0].x-i[1].x);if(!this.scrollOption.moveCount){let t={changedTouches:[{x:a[0].x,y:this.opts.area[0]/this.opts.pix+2}]};let e={changedTouches:[{x:a[1].x,y:this.opts.area[0]/this.opts.pix+2}]};if(this.opts.rotate){t={changedTouches:[{x:this.opts.height/this.opts.pix-this.opts.area[0]/this.opts.pix-2,y:a[0].y}]};e={changedTouches:[{x:this.opts.height/this.opts.pix-this.opts.area[0]/this.opts.pix-2,y:a[1].y}]}}const s=this.getCurrentDataIndex(t).index;const h=this.getCurrentDataIndex(e).index;const v=Math.abs(s-h);this.scrollOption.moveCount=v;this.scrollOption.moveCurrent1=Math.min(s,h);this.scrollOption.moveCurrent2=Math.max(s,h);return}let d=c/this.scrollOption.moveCount;let r=(this.opts.width-this.opts.area[1]-this.opts.area[3])/d;r=r<=2?2:r;r=r>=this.opts.categories.length?this.opts.categories.length:r;this.opts.animation=false;this.opts.xAxis.itemCount=r;let o=0;let n=getXAxisPoints(this.opts.categories,this.opts,this.config),x=n.xAxisPoints,f=n.startX,p=n.endX,l=n.eachSpacing;let u=l*this.scrollOption.moveCurrent1;let g=p-f;let y=g-l*(x.length-1);o=-u+Math.min(i[0].x,i[1].x)-this.opts.area[3]-l;if(o>0){o=0}if(o<y){o=y}this.scrollOption.currentOffset=o;this.scrollOption.startTouchX=0;this.scrollOption.distance=0;calValidDistance(this,o,this.opts.chartData,this.config,this.opts);this.opts._scrollDistance_=o;drawCharts.call(this,this.opts.type,this.opts,this.config,this.context)};uCharts.prototype.stopAnimation=function(){this.animationInstance&&this.animationInstance.stop()};uCharts.prototype.addEventListener=function(t,e){this.uevent.addEventListener(t,e)};uCharts.prototype.delEventListener=function(t){this.uevent.delEventListener(t)};uCharts.prototype.getCurrentDataIndex=function(e){var a=null;if(e.changedTouches){a=e.changedTouches[0]}else{a=e.mp.changedTouches[0]}if(a){let t=getTouches(a,this.opts,e);if(this.opts.type==="pie"||this.opts.type==="ring"){return findPieChartCurrentIndex({x:t.x,y:t.y},this.opts.chartData.pieData,this.opts)}else if(this.opts.type==="rose"){return findRoseChartCurrentIndex({x:t.x,y:t.y},this.opts.chartData.pieData,this.opts)}else if(this.opts.type==="radar"){return findRadarChartCurrentIndex({x:t.x,y:t.y},this.opts.chartData.radarData,this.opts.categories.length)}else if(this.opts.type==="funnel"){return findFunnelChartCurrentIndex({x:t.x,y:t.y},this.opts.chartData.funnelData)}else if(this.opts.type==="map"){return findMapChartCurrentIndex({x:t.x,y:t.y},this.opts)}else if(this.opts.type==="word"){return findWordChartCurrentIndex({x:t.x,y:t.y},this.opts.chartData.wordCloudData)}else if(this.opts.type==="bar"){return findBarChartCurrentIndex({x:t.x,y:t.y},this.opts.chartData.calPoints,this.opts,this.config,Math.abs(this.scrollOption.currentOffset))}else{return findCurrentIndex({x:t.x,y:t.y},this.opts.chartData.calPoints,this.opts,this.config,Math.abs(this.scrollOption.currentOffset))}}return-1};uCharts.prototype.getLegendDataIndex=function(e){var a=null;if(e.changedTouches){a=e.changedTouches[0]}else{a=e.mp.changedTouches[0]}if(a){let t=getTouches(a,this.opts,e);return findLegendIndex({x:t.x,y:t.y},this.opts.chartData.legendData)}return-1};uCharts.prototype.touchLegend=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var a=null;if(t.changedTouches){a=t.changedTouches[0]}else{a=t.mp.changedTouches[0]}if(a){var i=getTouches(a,this.opts,t);var r=this.getLegendDataIndex(t);if(r>=0){if(this.opts.type=="candle"){this.opts.seriesMA[r].show=!this.opts.seriesMA[r].show}else{this.opts.series[r].show=!this.opts.series[r].show}this.opts.animation=e.animation?true:false;this.opts._scrollDistance_=this.scrollOption.currentOffset;drawCharts.call(this,this.opts.type,this.opts,this.config,this.context)}}};uCharts.prototype.showToolTip=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var c=null;if(t.changedTouches){c=t.changedTouches[0]}else{c=t.mp.changedTouches[0]}if(!c){console.log("[uCharts] æœªèŽ·å–åˆ°event坐标信息")}var a=getTouches(c,this.opts,t);var d=this.scrollOption.currentOffset;var i=assign({},this.opts,{_scrollDistance_:d,animation:false});if(this.opts.type==="line"||this.opts.type==="area"||this.opts.type==="column"||this.opts.type==="scatter"||this.opts.type==="bubble"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1||o.length>0){var n=getSeriesDataItem(this.opts.series,o,r.group);if(n.length!==0){var l=getToolTipData(n,this.opts,o,r.group,this.opts.categories,e),s=l.textList,h=l.offset;h.y=a.y;i.tooltip={textList:e.textList!==undefined?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o,group:r.group}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="mount"){var o=e.index==undefined?this.getCurrentDataIndex(t).index:e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},i._series_[o]);var s=[{text:e.formatter?e.formatter(n,undefined,o,i):n.name+": "+n.data,color:n.color,legendShape:this.opts.extra.tooltip.legendShape=="auto"?n.legendShape:this.opts.extra.tooltip.legendShape}];var h={x:i.chartData.calPoints[o].x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="bar"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1||o.length>0){var n=getSeriesDataItem(this.opts.series,o,r.group);if(n.length!==0){var l=getToolTipData(n,this.opts,o,r.group,this.opts.categories,e),s=l.textList,h=l.offset;h.x=a.x;i.tooltip={textList:e.textList!==undefined?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="mix"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1){var d=this.scrollOption.currentOffset;var i=assign({},this.opts,{_scrollDistance_:d,animation:false});var n=getSeriesDataItem(this.opts.series,o);if(n.length!==0){var x=getMixToolTipData(n,this.opts,o,this.opts.categories,e),s=x.textList,h=x.offset;h.y=a.y;i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="candle"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1){var d=this.scrollOption.currentOffset;var i=assign({},this.opts,{_scrollDistance_:d,animation:false});var n=getSeriesDataItem(this.opts.series,o);if(n.length!==0){var l=getCandleToolTipData(this.opts.series[0].data,n,this.opts,o,this.opts.categories,this.opts.extra.candle,e),s=l.textList,h=l.offset;h.y=a.y;i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="pie"||this.opts.type==="ring"||this.opts.type==="rose"||this.opts.type==="funnel"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},i._series_[o]);var s=[{text:e.formatter?e.formatter(n,undefined,o,i):n.name+": "+n.data,color:n.color,legendShape:this.opts.extra.tooltip.legendShape=="auto"?n.legendShape:this.opts.extra.tooltip.legendShape}];var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="map"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},this.opts.series[o]);n.name=n.properties.name;var s=[{text:e.formatter?e.formatter(n,undefined,o,this.opts):n.name,color:n.color,legendShape:this.opts.extra.tooltip.legendShape=="auto"?n.legendShape:this.opts.extra.tooltip.legendShape}];var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}i.updateData=false;drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="word"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},this.opts.series[o]);var s=[{text:e.formatter?e.formatter(n,undefined,o,this.opts):n.name,color:n.color,legendShape:this.opts.extra.tooltip.legendShape=="auto"?n.legendShape:this.opts.extra.tooltip.legendShape}];var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}i.updateData=false;drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="radar"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=getSeriesDataItem(this.opts.series,o);if(n.length!==0){var s=n.map(t=>{return{text:e.formatter?e.formatter(t,this.opts.categories[o],o,this.opts):t.name+": "+t.data,color:t.color,legendShape:this.opts.extra.tooltip.legendShape=="auto"?t.legendShape:this.opts.extra.tooltip.legendShape}});var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}};uCharts.prototype.translate=function(t){this.scrollOption={currentOffset:t,startTouchX:t,distance:0,lastMoveTime:0};let e=assign({},this.opts,{_scrollDistance_:t,animation:false});drawCharts.call(this,this.opts.type,e,this.config,this.context)};uCharts.prototype.scrollStart=function(t){var e=null;if(t.changedTouches){e=t.changedTouches[0]}else{e=t.mp.changedTouches[0]}var a=getTouches(e,this.opts,t);if(e&&this.opts.enableScroll===true){this.scrollOption.startTouchX=a.x}};uCharts.prototype.scroll=function(t){if(this.scrollOption.lastMoveTime===0){this.scrollOption.lastMoveTime=Date.now()}let e=this.opts.touchMoveLimit||60;let a=Date.now();let i=a-this.scrollOption.lastMoveTime;if(i<Math.floor(1e3/e))return;if(this.scrollOption.startTouchX==0)return;this.scrollOption.lastMoveTime=a;var r=null;if(t.changedTouches){r=t.changedTouches[0]}else{r=t.mp.changedTouches[0]}if(r&&this.opts.enableScroll===true){var o=getTouches(r,this.opts,t);var n;n=o.x-this.scrollOption.startTouchX;var l=this.scrollOption.currentOffset;var s=calValidDistance(this,l+n,this.opts.chartData,this.config,this.opts);this.scrollOption.distance=n=s-l;var h=assign({},this.opts,{_scrollDistance_:l+n,animation:false});this.opts=h;drawCharts.call(this,h.type,h,this.config,this.context);return l+n}};uCharts.prototype.scrollEnd=function(t){if(this.opts.enableScroll===true){var e=this.scrollOption,a=e.currentOffset,i=e.distance;this.scrollOption.currentOffset=a+i;this.scrollOption.distance=0;this.scrollOption.moveCount=0}};export default uCharts;
src/components/qiun-data-charts/license.md
src/components/qiun-data-charts/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
{
  "id": "qiun-data-charts",
  "displayName": "秋云 ucharts echarts é«˜æ€§èƒ½è·¨å…¨ç«¯å›¾è¡¨ç»„ä»¶",
  "version": "2.5.0-20230101",
  "description": "uCharts æ–°å¢žæ­£è´ŸæŸ±çŠ¶å›¾ï¼æ”¯æŒH5及APP用 ucharts echarts æ¸²æŸ“图表,uniapp可视化首选组件",
  "keywords": [
    "ucharts",
    "echarts",
    "f2",
    "图表",
    "可视化"
],
  "repository": "https://gitee.com/uCharts/uCharts",
"engines": {
  },
"dcloudext": {
    "sale": {
      "regular": {
        "price": "0.00"
      },
      "sourcecode": {
        "price": "0.00"
      }
    },
    "contact": {
      "qq": "474119"
    },
    "declaration": {
      "ads": "无",
      "data": "插件不采集任何数据",
      "permissions": "无"
    },
    "npmurl": "https://www.npmjs.com/~qiun",
    "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"
        },
        "快应用": {
          "华为": "y",
          "联盟": "y"
        },
        "Vue": {
            "vue2": "y",
            "vue3": "y"
        }
      }
    }
  }
}
src/components/qiun-data-charts/readme.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
![logo](https://img-blog.csdnimg.cn/4a276226973841468c1be356f8d9438b.png)
[![star](https://gitee.com/uCharts/uCharts/badge/star.svg?theme=gvp)](https://gitee.com/uCharts/uCharts/stargazers)
[![fork](https://gitee.com/uCharts/uCharts/badge/fork.svg?theme=gvp)](https://gitee.com/uCharts/uCharts/members)
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
[![npm package](https://img.shields.io/npm/v/@qiun/ucharts.svg?style=flat-square)](https://www.npmjs.com/~qiun)
## uCharts简介
`uCharts`是一款基于`canvas API`开发的适用于所有前端应用的图表库,开发者编写一套代码,可运行到 Web、iOS、Android(基于 uni-app / taro ï¼‰ã€ä»¥åŠå„种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等更多支持 canvas API çš„平台。
## å®˜æ–¹ç½‘ç«™
## [https://www.ucharts.cn](https://www.ucharts.cn)
## å¿«é€Ÿä½“验
一套代码编到多个平台,依次扫描二维码,亲自体验uCharts图表跨平台效果!其他平台请自行编译。
![](https://www.ucharts.cn/images/web/guide/qrcode20220224.png)
![](https://img-blog.csdnimg.cn/7d0115593ff24ac39a224fb7c6ed72a4.png)
## è‡´å¼€å‘者
感谢各位开发者`五年`来对秋云及uCharts的支持,uCharts的进步离不开各位开发者的鼓励与贡献。为更好的帮助各位开发者使用图表工具,我们推出了新版官网,增加了在线定制、问答社区、在线配置等一些增值服务,为确保您能更好的应用图表组件,建议您先`仔细阅读官网指南`以及`常见问题`,而不是下载下来`直接使用`。如仍然不能解决,请到`官网社区`或开通会员后加入`专属VIP会员群`提问将会很快得到回答。
## è§†é¢‘教程
## [uCharts新手入门教程](https://www.bilibili.com/video/BV1qA411Q7se/?share_source=copy_web&vd_source=42a1242f9aaade6427736af69eb2e1d9)
## ç¤¾ç¾¤æ”¯æŒ
uCharts官方拥有5个2000人的QQ群及专属VIP会员群支持,庞大的用户量证明我们一直在努力,请各位放心使用!uCharts的开源图表组件的开发,团队付出了大量的时间与精力,经过四来的考验,不会有比较明显的bug,请各位放心使用。如果您有更好的想法,可以在`码云提交Pull Requests`以帮助更多开发者完成需求,再次感谢各位对uCharts的鼓励与支持!
#### å®˜æ–¹äº¤æµç¾¤
- äº¤æµç¾¤1:371774600(已满)
- äº¤æµç¾¤2:619841586(已满)
- äº¤æµç¾¤3:955340127(已满)
- äº¤æµç¾¤4:641669795(已满)
- äº¤æµç¾¤5:236294809(只能扫码加入)
![](https://www.ucharts.cn/images/web/qq5.jpg)
- å£ä»¤`uniapp`
#### ä¸“属VIP会员群
- å¼€é€šä¼šå‘˜åŽè¯¦è§ã€è´¦å·è¯¦æƒ…】页面中顶部的滚动通知
- å£ä»¤`您的用户ID`
## ç‰ˆæƒä¿¡æ¯
uCharts始终坚持开源,遵循 [Apache Licence 2.0](https://www.apache.org/licenses/LICENSE-2.0.html) å¼€æºåè®®ï¼Œæ„å‘³ç€æ‚¨æ— éœ€æ”¯ä»˜ä»»ä½•费用,即可将uCharts应用到您的产品中。
注意:这并不意味着您可以将uCharts应用到非法的领域,比如涉及赌博,暴力等方面。如因此产生纠纷或法律问题,uCharts相关方及秋云科技不承担任何责任。
## åˆä½œä¼™ä¼´
[![DIY官网](https://www.ucharts.cn/images/web/guide/links/diy-gw.png)](https://www.diygw.com/)
[![HasChat](https://www.ucharts.cn/images/web/guide/links/haschat.png)](https://gitee.com/howcode/has-chat)
[![uViewUI](https://www.ucharts.cn/images/web/guide/links/uView.png)](https://www.uviewui.com/)
[![图鸟UI](https://www.ucharts.cn/images/web/guide/links/tuniao.png)](https://ext.dcloud.net.cn/plugin?id=7088)
[![thorui](https://www.ucharts.cn/images/web/guide/links/thorui.png)](https://ext.dcloud.net.cn/publisher?id=202)
[![FirstUI](https://www.ucharts.cn/images/web/guide/links/first.png)](https://www.firstui.cn/)
[![nProUI](https://www.ucharts.cn/images/web/guide/links/nPro.png)](https://ext.dcloud.net.cn/plugin?id=5169)
[![GraceUI](https://www.ucharts.cn/images/web/guide/links/grace.png)](https://www.graceui.com/)
## æ›´æ–°è®°å½•
详见官网指南中说明,[点击此处查看](https://www.ucharts.cn/v2/#/guide/index?id=100)
## ç›¸å…³é“¾æŽ¥
- [uCharts官网](https://www.ucharts.cn)
- [DCloud插件市场地址](https://ext.dcloud.net.cn/plugin?id=271)
- [uCharts码云开源托管地址](https://gitee.com/uCharts/uCharts) [![star](https://gitee.com/uCharts/uCharts/badge/star.svg?theme=gvp)](https://gitee.com/uCharts/uCharts/stargazers)
- [uCharts npm开源地址](https://www.ucharts.cn)
- [ECharts官网](https://echarts.apache.org/zh/index.html)
- [ECharts配置手册](https://echarts.apache.org/zh/option.html)
- [图表组件在项目中的应用 ReportPlus数据报表](https://www.ucharts.cn/v2/#/layout/info?id=1)
src/components/qiun-data-charts/static/app-plus/echarts.min.js
src/components/qiun-data-charts/static/h5/echarts.min.js
src/components/ruoyi/DictTag/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
<template>
  <div>
    <template v-for="(item, index) in options">
      <template v-if="values.includes(item.value)">
        <span
          v-if="item.elTagType == 'default' || item.elTagType == ''"
          :key="item.value"
          :index="index"
          :class="item.elTagClass"
        >{{ item.label }}</span>
        <uni-tag
          v-else
          :key="item.value + ''"
          :index="index"
          :type="elTagType(item.elTagType)"
          :class="item.elTagClass"
          :text="item.label"
        />
      </template>
    </template>
  </div>
</template>
<script setup>
const props = defineProps({
  // æ•°æ®
  options: {
    type: Array,
    default: null,
  },
  // å½“前的值
  value: [Number, String, Array],
})
const values = computed(() => {
  if (props.value !== null && typeof props.value !== 'undefined') {
    return Array.isArray(props.value) ? props.value : [String(props.value)];
  } else {
    return [];
  }
})
const elTagType = (tagType) =>{
  tagType === 'danger' ? 'error' : tagType
  tagType === 'info' ? 'default' : tagType
}
</script>
<style scoped>
.uni-tag + .uni-tag {
  margin-left: 10px;
}
</style>
src/components/u-city-select/area.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
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;
src/components/u-city-select/city.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
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;
src/components/u-city-select/province.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
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;
src/components/u-city-select/u-city-select.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,265 @@
<template>
    <u-popup :show="modelValue" mode="bottom" :popup="false" :mask="true" :closeable="true"
        :safe-area-inset-bottom="true" close-icon-color="#ffffff" :z-index="uZIndex" :maskCloseAble="maskCloseAble"
        @close="close">
        <u-tabs v-if="modelValue" :list="genTabsList" :scrollable="true" :current="tabsIndex" @change="tabsChange"
            ref="tabs" />
        <view class="area-box">
            <view class="u-flex" :class="{ 'change': isChange }">
                <view class="area-item">
                    <view class="u-padding-10 u-bg-gray" style="height: 100%;">
                        <scroll-view :scroll-y="true" style="height: 100%">
                            <u-cell-group>
                                <u-cell v-for="(item, index) in provinces" :title="item.label" :arrow="false"
                                    :index="index" :key="index" @click="provinceChange(index)">
                                    <template v-slot:right-icon>
                                        <u-icon v-if="isChooseP && province === index" size="17"
                                            name="checkbox-mark"></u-icon>
                                    </template>
                                </u-cell>
                            </u-cell-group>
                        </scroll-view>
                    </view>
                </view>
                <view class="area-item">
                    <view class="u-padding-10 u-bg-gray" style="height: 100%;">
                        <scroll-view :scroll-y="true" style="height: 100%">
                            <u-cell-group v-if="isChooseP">
                                <u-cell v-for="(item, index) in citys" :title="item.label" :arrow="false" :index="index"
                                    :key="index" @click="cityChange(index)">
                                    <template v-slot:right-icon>
                                        <u-icon v-if="isChooseC && city === index" size="17"
                                            name="checkbox-mark"></u-icon>
                                    </template>
                                </u-cell>
                            </u-cell-group>
                        </scroll-view>
                    </view>
                </view>
                <view class="area-item">
                    <view class="u-padding-10 u-bg-gray" style="height: 100%;">
                        <scroll-view :scroll-y="true" style="height: 100%">
                            <u-cell-group v-if="isChooseC">
                                <u-cell v-for="(item, index) in areas" :title="item.label" :arrow="false" :index="index"
                                    :key="index" @click="areaChange(index)">
                                    <template v-slot:right-icon>
                                        <u-icon v-if="isChooseA && area === index" size="17"
                                            name="checkbox-mark"></u-icon>
                                    </template>
                                </u-cell>
                            </u-cell-group>
                        </scroll-view>
                    </view>
                </view>
            </view>
        </view>
    </u-popup>
</template>
<script setup lang="ts">
import { ref, computed, onMounted, PropType } from 'vue';
import provincesSource from "./province.js";
import citysSource from "./city.js";
import areasSource from "./area.js";
// å®šä¹‰æŽ¥å£
interface Region {
    label: string;
    value: string;
}
interface CitySelectResult {
    province: Region;
    city: Region;
    area: Region;
}
interface TabItem {
    name: string;
}
// Props å®šä¹‰
const props = defineProps({
    // é€šè¿‡åŒå‘绑定控制组件的弹出与收起
    modelValue: {
        type: Boolean,
        default: false
    },
    // é»˜è®¤æ˜¾ç¤ºçš„地区,可传类似["河北省", "秦皇岛市", "北戴河区"]
    defaultRegion: {
        type: Array as PropType<string[]>,
        default: () => []
    },
    // é»˜è®¤æ˜¾ç¤ºåœ°åŒºçš„编码,defaultRegion和areaCode同时存在,areaCode优先,可传类似["13", "1303", "130304"]
    areaCode: {
        type: Array as PropType<string[]>,
        default: () => []
    },
    // æ˜¯å¦å…è®¸é€šè¿‡ç‚¹å‡»é®ç½©å…³é—­Picker
    maskCloseAble: {
        type: Boolean,
        default: true
    },
    // å¼¹å‡ºçš„z-index值
    zIndex: {
        type: [String, Number],
        default: 0
    }
});
// äº‹ä»¶å®šä¹‰
const emit = defineEmits<{
    (e: 'update:modelValue', value: boolean): void;
    (e: 'close'): void;
    (e: 'city-change', result: CitySelectResult): void;
}>();
const cityValue = ref("");
const isChooseP = ref(false); // æ˜¯å¦å·²ç»é€‰æ‹©äº†çœ
const province = ref(0); // çœçº§ä¸‹æ ‡
const provinces = ref<Region[]>(provincesSource);
const isChooseC = ref(false); // æ˜¯å¦å·²ç»é€‰æ‹©äº†å¸‚
const city = ref(0); // å¸‚级下标
const citys = ref<Region[]>(citysSource[0]);
const isChooseA = ref(false); // æ˜¯å¦å·²ç»é€‰æ‹©äº†åŒº
const area = ref(0); // åŒºçº§ä¸‹æ ‡
const areas = ref<Region[]>(areasSource[0][0]);
const tabsIndex = ref(0);
const tabs = ref();
// è®¡ç®—属性
const isChange = computed(() => {
    return tabsIndex.value > 1;
});
const genTabsList = computed((): TabItem[] => {
    let tabsList: TabItem[] = [{
        name: "请选择"
    }];
    if (isChooseP.value) {
        tabsList[0].name = provinces.value[province.value].label;
        tabsList[1] = {
            name: "请选择"
        };
    }
    if (isChooseC.value) {
        tabsList[1].name = citys.value[city.value].label;
        tabsList[2] = {
            name: "请选择"
        };
    }
    if (isChooseA.value) {
        tabsList[2].name = areas.value[area.value].label;
    }
    return tabsList;
});
const uZIndex = computed(() => {
    // å¦‚果用户有传递z-index值,优先使用
    return props.zIndex ? props.zIndex : 1075; // å‡è®¾$u.zIndex.popup为1075
});
// æ–¹æ³•
const setProvince = (label = "", value = "") => {
    provinces.value.map((v, k) => {
        if (value ? v.value == value : v.label == label) {
            provinceChange(k);
        }
    });
};
const setCity = (label = "", value = "") => {
    citys.value.map((v, k) => {
        if (value ? v.value == value : v.label == label) {
            cityChange(k);
        }
    });
};
const setArea = (label = "", value = "") => {
    areas.value.map((v, k) => {
        if (value ? v.value == value : v.label == label) {
            isChooseA.value = true;
            area.value = k;
        }
    });
};
const close = () => {
    emit('update:modelValue', false);
    emit('close');
};
const tabsChange = (value: { index: number }) => {
    tabsIndex.value = value.index;
};
const provinceChange = (index: number) => {
    isChooseP.value = true;
    isChooseC.value = false;
    isChooseA.value = false;
    province.value = index;
    citys.value = citysSource[index];
    tabsIndex.value = 1;
};
const cityChange = (index: number) => {
    isChooseC.value = true;
    isChooseA.value = false;
    city.value = index;
    areas.value = areasSource[province.value][index];
    tabsIndex.value = 2;
};
const areaChange = (index: number) => {
    isChooseA.value = true;
    area.value = index;
    const result: CitySelectResult = {
        province: provinces.value[province.value],
        city: citys.value[city.value],
        area: areas.value[area.value]
    };
    emit('city-change', result);
    close();
};
// ç”Ÿå‘½å‘¨æœŸé’©å­
onMounted(() => {
    if (props.areaCode.length == 3) {
        setProvince("", props.areaCode[0]);
        setCity("", props.areaCode[1]);
        setArea("", props.areaCode[2]);
    } else if (props.defaultRegion.length == 3) {
        setProvince(props.defaultRegion[0], "");
        setCity(props.defaultRegion[1], "");
        setArea(props.defaultRegion[2], "");
    }
});
</script>
<style lang="scss">
.area-box {
    width: 100%;
    overflow: hidden;
    height: 800rpx;
    >view {
        width: 150%;
        transition: transform 0.3s ease-in-out 0s;
        transform: translateX(0);
        &.change {
            transform: translateX(-33.3333333%);
        }
    }
    .area-item {
        width: 33.3333333%;
        height: 800rpx;
    }
}
</style>
src/components/uni-section/uni-section.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,167 @@
<template>
    <view class="uni-section">
        <view class="uni-section-header" @click="onClick">
                <view class="uni-section-header__decoration" v-if="type" :class="type" />
        <slot v-else name="decoration"></slot>
        <view class="uni-section-header__content">
          <text :style="{'font-size':titleFontSize,'color':titleColor}" class="uni-section__content-title" :class="{'distraction':!subTitle}">{{ title }}</text>
          <text v-if="subTitle" :style="{'font-size':subTitleFontSize,'color':subTitleColor}" class="uni-section-header__content-sub">{{ subTitle }}</text>
        </view>
        <view class="uni-section-header__slot-right">
          <slot name="right"></slot>
        </view>
        </view>
        <view class="uni-section-content" :style="{padding: _padding}">
            <slot />
        </view>
    </view>
</template>
<script>
    /**
     * Section æ ‡é¢˜æ 
     * @description æ ‡é¢˜æ 
     * @property {String} type = [line|circle|square] æ ‡é¢˜è£…饰类型
     *     @value line ç«–线
     *     @value circle åœ†å½¢
     *     @value square æ­£æ–¹å½¢
     * @property {String} title ä¸»æ ‡é¢˜
     * @property {String} titleFontSize ä¸»æ ‡é¢˜å­—体大小
     * @property {String} titleColor ä¸»æ ‡é¢˜å­—体颜色
     * @property {String} subTitle å‰¯æ ‡é¢˜
     * @property {String} subTitleFontSize å‰¯æ ‡é¢˜å­—体大小
     * @property {String} subTitleColor å‰¯æ ‡é¢˜å­—体颜色
     * @property {String} padding é»˜è®¤æ’æ§½ padding
     */
    export default {
        name: 'UniSection',
    emits:['click'],
        props: {
            type: {
                type: String,
                default: ''
            },
            title: {
                type: String,
                required: true,
                default: ''
            },
      titleFontSize: {
        type: String,
        default: '14px'
      },
            titleColor:{
                type: String,
                default: '#333'
            },
            subTitle: {
                type: String,
                default: ''
            },
      subTitleFontSize: {
        type: String,
        default: '12px'
      },
      subTitleColor: {
        type: String,
        default: '#999'
      },
            padding: {
                type: [Boolean, String],
                default: false
            }
        },
    computed:{
      _padding(){
        if(typeof this.padding === 'string'){
          return this.padding
        }
        return this.padding?'10px':''
      }
    },
        watch: {
            title(newVal) {
                if (uni.report && newVal !== '') {
                    uni.report('title', newVal)
                }
            }
        },
    methods: {
            onClick() {
                this.$emit('click')
            }
        }
    }
</script>
<style lang="scss" >
    $uni-primary: #2979ff !default;
    .uni-section {
        background-color: #fff;
    .uni-section-header {
      position: relative;
      /* #ifndef APP-NVUE */
      display: flex;
      /* #endif */
      flex-direction: row;
      align-items: center;
      padding: 12px 10px;
      font-weight: normal;
      &__decoration{
        margin-right: 6px;
        background-color: $uni-primary;
        &.line {
          width: 4px;
          height: 12px;
          border-radius: 10px;
        }
        &.circle {
          width: 8px;
          height: 8px;
          border-top-right-radius: 50px;
          border-top-left-radius: 50px;
          border-bottom-left-radius: 50px;
          border-bottom-right-radius: 50px;
        }
        &.square {
          width: 8px;
          height: 8px;
        }
      }
      &__content {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: column;
        flex: 1;
        color: #333;
        .distraction {
          flex-direction: row;
          align-items: center;
        }
        &-sub {
          margin-top: 2px;
        }
      }
      &__slot-right{
        font-size: 14px;
      }
    }
    .uni-section-content{
      font-size: 14px;
    }
    }
</style>
src/config.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
// åº”用全局配置
const config = {
  //  baseUrl: 'https://vue.ruoyi.vip/prod-api',
  // baseUrl: 'http://localhost/prod-api',
  baseUrl: 'http://localhost:8080',
   //cloud后台网关地址
  //  baseUrl: 'http://192.168.10.3:8080',
   // åº”用信息
   appInfo: {
     // åº”用名称
     name: "ruoyi-app-vue3",
     // åº”用版本
     version: "1.1.0",
     // åº”用logo
     logo: "/static/logo.png",
     // å®˜æ–¹ç½‘ç«™
     site_url: "http://ruoyi.vip",
     // æ”¿ç­–协议
     agreements: [{
         title: "隐私政策",
         url: "https://ruoyi.vip/protocol.html"
       },
       {
         title: "用户服务协议",
         url: "https://ruoyi.vip/protocol.html"
       }
     ]
   }
 }
 export default config
src/directive/common/copyText.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
// #ifdef APP-VUE || H5
/**
* v-copyText å¤åˆ¶æ–‡æœ¬å†…容
* Copyright (c) 2022 ruoyi
* v-copyText="要复制的文本内容"
* v-copyText:callback="复制成功后的回调函数"
* ç‚¹å‡»è¢«æ ‡æ³¨çš„元素即可复制文本内容
*/
import type { Directive, DirectiveBinding } from "vue";
interface ElType extends HTMLElement {
  $copyValue: string;
  $copyCallback: Function;
  $destroyCopy:Function;
}
const vCopyText:Directive = {
  beforeMount(el:ElType , binding:DirectiveBinding) {
    if (binding.arg === "callback") {
      el.$copyCallback = binding.value;
    } else {
      el.$copyValue = binding.value;
      const handler = () => {
        copyTextToClipboard(el.$copyValue);
        if (el.$copyCallback) {
          el.$copyCallback(el.$copyValue);
        }
      };
      el.addEventListener("click", handler);
      el.$destroyCopy = () => el.removeEventListener("click", handler);
    }
  }
}
export default vCopyText;
function copyTextToClipboard(input:string, { target = document.body } = {}) {
  const element = document.createElement('textarea');
  const previouslyFocusedElement = document.activeElement  as HTMLElement;
  element.value = input;
  // Prevent keyboard from showing on mobile
  element.setAttribute('readonly', '');
  element.style.contain = 'strict';
  element.style.position = 'absolute';
  element.style.left = '-9999px';
  element.style.fontSize = '12pt'; // Prevent zooming on iOS
  const selection = document.getSelection();
  if(!selection)return
  const originalRange = selection.rangeCount > 0 && selection.getRangeAt(0);
  target.append(element);
  element.select();
  // Explicit selection workaround for iOS
  element.selectionStart = 0;
  element.selectionEnd = input.length;
  let isSuccess = false;
  try {
    isSuccess = document.execCommand('copy');
  } catch { }
  element.remove();
  if (originalRange) {
    selection.removeAllRanges();
    selection.addRange(originalRange);
  }
  // Get the focus back on the previously focused element, if any
  if (previouslyFocusedElement) {
    previouslyFocusedElement.focus();
  }
  return isSuccess;
}
// #endif
src/directive/common/focus.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
import type { Directive } from "vue";
const vFocus: Directive = {
    mounted: (el) => el.focus()
}
export default vFocus
src/directive/common/full.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
import type { Directive } from "vue";
interface ElType extends HTMLElement {
    $oldStyle: CSSStyleDeclaration;
    $fullStyle: CSSStyleDeclaration;
}
const vFull: Directive = {
    mounted: (el: ElType, binding) => {
        el.$oldStyle = { ...el.style }
        if (binding.arg === 'screen') {
            el.$fullStyle = {
                ...el.style,
                left: '0',
                top: '0',
                zIndex: '8',
                position: 'fixed',
                height: '100vh',
                width: '100vw',
            }
        } else {
            el.$fullStyle = {
                ...el.style,
                left: '0',
                top: '0',
                zIndex: '8',
                position: 'absolute',
                height: '100%',
                width: '100%',
            }
        }
    },
    updated: (el: ElType, binding) => {
        function setStyle(el: CSSStyleDeclaration, style: CSSStyleDeclaration) {
            el.position = style.position
            el.left = style.left
            el.top = style.top
            el.zIndex = style.zIndex
            el.height = style.height
            el.width = style.width
        }
        if (binding.value) {
            setStyle(el.style, el.$fullStyle)
        } else {
            setStyle(el.style, el.$oldStyle)
        }
    }
}
export default vFull
src/directive/index.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
// #ifdef APP-VUE || H5
import copyText from './common/copyText'
// #endif
import hasRole from './permission/hasRole'
import hasPermi from './permission/hasPermi'
import focus from './common/focus'
import full from './common/full'
import { App } from 'vue'
export default function directive(app: App) {
  // #ifdef APP-VUE || H5
  app.directive('copyText', copyText)
  // #endif
  app.directive('hasRole', hasRole)
  app.directive('hasPermi', hasPermi)
  app.directive('focus', focus)
  app.directive('full', full)
}
src/directive/permission/hasPermi.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
/**
* v-hasPermi æ“ä½œæƒé™å¤„理
* Copyright (c) 2019 ruoyi
*/
import useUserStore from '@/store/modules/user'
import type { Directive } from "vue";
const vHasPermi: Directive = {
  mounted(el, binding, vnode) {
    const { value } = binding
    const all_permission = "*:*:*";
    const permissions = useUserStore().permissions
    if (value && value instanceof Array && value.length > 0) {
      const permissionFlag = value
      const hasPermissions = permissions.some(permission => {
        return all_permission === permission || permissionFlag.includes(permission)
      })
      if (!hasPermissions) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error(`请设置操作权限标签值`)
    }
  }
}
export default vHasPermi
src/directive/permission/hasRole.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
/**
* v-hasRole è§’色权限处理
* Copyright (c) 2019 ruoyi
*/
import useUserStore from '@/store/modules/user'
import type { Directive } from "vue";
const vHasRole: Directive = {
  mounted(el, binding, vnode) {
    const { value } = binding
    const super_admin = "admin";
    const roles = useUserStore().roles
    if (value && value instanceof Array && value.length > 0) {
      const roleFlag = value
      const hasRole = roles.some(role => {
        return super_admin === role || roleFlag.includes(role)
      })
      if (!hasRole) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error(`请设置角色权限标签值`)
    }
  }
}
export default vHasRole;
src/env.d.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
/// <reference types="vite/client" />
/// <reference types="@dcloudio/types" />
declare module '*.vue' {
  import { DefineComponent } from 'vue'
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
  const component: DefineComponent<{}, {}, any>
  export default component
}
declare module "uview-plus";
declare module 'mqtt/dist/mqtt';
src/main.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
import App from './App.vue'
import plugins from './plugins'
import store from './store'
import uviewPlus from 'uview-plus'
import { createSSRApp } from 'vue'
import directive from './directive' // directive
import { useDict } from '@/utils/dict'
import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi'
export function createApp() {
  const app = createSSRApp(App)
  app.use(store)
  app.use(uviewPlus)
  app.use(plugins)
  // #ifndef MP-WEIXIN
  // å¾®ä¿¡å°ç¨‹åºä¸­ä¸æ”¯æŒè‡ªå®šä¹‰æŒ‡ä»¤
  directive(app)
  // #endif
  // å…¨å±€æ–¹æ³•挂载
  app.config.globalProperties.useDict = useDict
  app.config.globalProperties.parseTime = parseTime
  app.config.globalProperties.resetForm = resetForm
  app.config.globalProperties.handleTree = handleTree
  app.config.globalProperties.addDateRange = addDateRange
  app.config.globalProperties.selectDictLabel = selectDictLabel
  app.config.globalProperties.selectDictLabels = selectDictLabels
  return {
    app
  }
}
src/manifest.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
{
    "name" : "ruoyi-vue3",
    "appid" : "__UNI__3DD118D",
    "description" : "",
    "versionName" : "1.0.0",
    "versionCode" : "100",
    "transformPx" : false,
    /* 5+App特有相关 */
    "app-plus" : {
        "usingComponents" : true,
        "nvueStyleCompiler" : "uni-app",
        "compilerVersion" : 3,
        "splashscreen" : {
            "alwaysShowBeforeRender" : true,
            "waiting" : true,
            "autoclose" : true,
            "delay" : 0
        },
        /* æ¨¡å—配置 */
        "modules" : {},
        /* åº”用发布信息 */
        "distribute" : {
            /* android打包配置 */
            "android" : {
                "permissions" : [
                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                ]
            },
            /* ios打包配置 */
            "ios" : {},
            /* SDK配置 */
            "sdkConfigs" : {}
        }
    },
    /* å¿«åº”用特有相关 */
    "quickapp" : {},
    /* å°ç¨‹åºç‰¹æœ‰ç›¸å…³ */
    "mp-weixin" : {
        "appid" : "",
        "setting" : {
            "urlCheck" : false
        },
        "usingComponents" : true
    },
    "mp-alipay" : {
        "usingComponents" : true
    },
    "mp-baidu" : {
        "usingComponents" : true
    },
    "mp-toutiao" : {
        "usingComponents" : true
    },
    "uniStatistics" : {
        "enable" : false
    },
    "vueVersion" : "3"
}
src/pages.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,280 @@
{
  "easycom": {
    "custom": {
      "u-city-select": "@/components/u-city-select/u-city-select.vue",
      "geek-(.*)": "@/components/geek-xd/components/geek-$1/geek-$1.vue",
      "gx-(.*)": "@/components/geek-xd/components/geek-$1/geek-$1.vue",
      "^u--(.*)": "uview-plus/components/u-$1/u-$1.vue",
      "^up-(.*)": "uview-plus/components/u-$1/u-$1.vue",
      "^u-([^-].*)": "uview-plus/components/u-$1/u-$1.vue",
      "qiun-(.*)": "@/components/qiun-data-charts/components/qiun-$1/qiun-$1.vue"
    }
  },
  "pages": [
    {
      "path": "pages/index",
      "style": {
        "navigationBarTitleText": "若依移动端框架",
        "navigationStyle": "custom"
      }
    },
    {
      "path": "pages/login",
      "style": {
        "navigationBarTitleText": "登录"
      }
    },
    {
      "path": "pages/work",
      "style": {
        "navigationBarTitleText": "工作台"
      }
    },
    {
      "path": "pages/template",
      "style": {
        "navigationBarTitleText": "模板"
      }
    },
    {
      "path": "pages/mine",
      "style": {
        "navigationBarTitleText": "我的"
      }
    },
    {
      "path": "pages/common/webview/index",
      "style": {
        "navigationBarTitleText": "浏览网页"
      }
    },
    {
      "path": "pages/common/textview/index",
      "style": {
        "navigationBarTitleText": "浏览文本"
      }
    }
  ],
  "subPackages": [
    {
      "root": "pages_mine/pages",
      "pages": [
        {
          "path": "avatar/index",
          "style": {
            "navigationBarTitleText": "修改头像"
          }
        },
        {
          "path": "info/index",
          "style": {
            "navigationBarTitleText": "个人信息"
          }
        },
        {
          "path": "info/edit",
          "style": {
            "navigationBarTitleText": "编辑资料"
          }
        },
        {
          "path": "pwd/index",
          "style": {
            "navigationBarTitleText": "修改密码"
          }
        },
        {
          "path": "setting/index",
          "style": {
            "navigationBarTitleText": "应用设置"
          }
        },
        {
          "path": "help/index",
          "style": {
            "navigationBarTitleText": "常见问题"
          }
        },
        {
          "path": "about/index",
          "style": {
            "navigationBarTitleText": "关于我们"
          }
        }
      ]
    },
    {
      "root": "pages_template/pages",
      "pages": [
        {
          "path": "wxCenter/index",
          "style": {
            "navigationBarTitleText": "wxCenter ä»¿å¾®ä¿¡ä¸ªäººä¸­å¿ƒ",
            "navigationStyle": "custom"
          }
        },
        {
          "path": "keyboardPay/index",
          "style": {
            "navigationBarTitleText": "keyboardPay è‡ªå®šä¹‰é”®ç›˜æ”¯ä»˜"
          }
        },
        {
          "path": "mallMenu/index2",
          "style": {
            "navigationBarTitleText": "mallMenu-商城分类"
          }
        },
        {
          "path": "mallMenu/index1",
          "style": {
            "navigationBarTitleText": "mallMenu-商城分类"
          }
        },
        {
          "path": "coupon/index",
          "style": {
            "navigationBarTitleText": "coupon-优惠券"
          }
        },
        {
          "path": "login/index1",
          "style": {
            "navigationBarTitleText": "美团登录"
          }
        },
        {
          "path": "login/index2",
          "style": {
            "navigationBarTitleText": "水滴登录"
          }
        },
        {
          "path": "citySelect/index",
          "style": {
            "navigationBarTitleText": "城市选择"
          }
        },
        {
          "path": "submitBar/index",
          "style": {
            "navigationBarTitleText": "提交订单栏"
          }
        },
        {
          "path": "comment/index",
          "style": {
            "navigationBarTitleText": "评论"
          }
        },
        {
          "path": "comment/reply",
          "style": {
            "navigationBarTitleText": "评论详情"
          }
        },
        {
          "path": "order/index",
          "style": {
            "navigationBarTitleText": "订单"
          }
        },
        {
          "path": "login/code",
          "style": {
            "navigationBarTitleText": "登录获取验证码"
          }
        },
        {
          "path": "address/index",
          "style": {
            "navigationBarTitleText": "用户地址"
          }
        },
        {
          "path": "address/addSite",
          "style": {
            "navigationBarTitleText": "添加用户地址"
          }
        }
      ]
    },
    {
      "root": "pages_qiun/pages",
      "pages": [
        {
          "path": "sport/index",
          "style": {
            "pageOrientation": "auto"
          }
        },
        {
          "path": "school/index",
          "style": {
            "pageOrientation": "auto"
          }
        },
        {
          "path": "finance/index",
          "style": {
            "pageOrientation": "auto"
          }
        },
        {
          "path": "main/index",
          "style": {
            "pageOrientation": "auto"
          }
        }
      ]
    },
    {
      "root": "pages_geek/pages",
      "pages": [
        {
          "path": "index/index"
        },
        {
          "path": "code/index"
        }
      ]
    }
  ],
  "tabBar": {
    "color": "#000000",
    "selectedColor": "#000000",
    "borderStyle": "white",
    "backgroundColor": "#ffffff",
    "list": [
      {
        "pagePath": "pages/index",
        "iconPath": "static/images/tabbar/home.png",
        "selectedIconPath": "static/images/tabbar/home_.png",
        "text": "首页"
      },
      {
        "pagePath": "pages/work",
        "iconPath": "static/images/tabbar/work.png",
        "selectedIconPath": "static/images/tabbar/work_.png",
        "text": "工作台"
      },
      {
        "pagePath": "pages/template",
        "iconPath": "static/images/tabbar/work.png",
        "selectedIconPath": "static/images/tabbar/work_.png",
        "text": "模板"
      },
      {
        "pagePath": "pages/mine",
        "iconPath": "static/images/tabbar/mine.png",
        "selectedIconPath": "static/images/tabbar/mine_.png",
        "text": "我的"
      }
    ]
  },
  "globalStyle": {
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "RuoYi",
    "navigationBarBackgroundColor": "#FFFFFF"
  }
}
src/pages/common/textview/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
<template>
  <view>
    <uni-card class="view-title" :title="title">
      <text class="uni-body view-content">{{ content }}</text>
    </uni-card>
  </view>
</template>
<script>
  export default {
    data() {
      return {
        title: '',
        content: ''
      }
    },
    onLoad(options) {
      this.title = options.title
      this.content = options.content
      uni.setNavigationBarTitle({
        title: options.title
      })
    }
  }
</script>
<style scoped>
  page {
    background-color: #ffffff;
  }
  .view-title {
    font-weight: bold;
  }
  .view-content {
    font-size: 26rpx;
    padding: 12px 5px 0;
    color: #333;
    line-height: 24px;
    font-weight: normal;
  }
</style>
src/pages/common/webview/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
<template>
  <view v-if="params.url">
    <web-view :webview-styles="webviewStyles" :src="`${params.url}`"></web-view>
  </view>
</template>
<script>
  export default {
    data() {
      return {
        params: {},
        webviewStyles: {
          progress: {
            color: "#FF3333"
          }
        }
      }
    },
    props: {
      src: {
        type: [String],
        default: null
      }
    },
    onLoad(event) {
      this.params = event
      if (event.title) {
        uni.setNavigationBarTitle({
          title: event.title
        })
      }
    }
  }
</script>
src/pages/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
<template>
  <view class="content">
    <image class="logo" src="@/static/logo.png"></image>
    <view class="text-area">
      <text class="title"> RuoYi-Geek-App</text>
    </view>
    <view class="text-area">
      <up-text type="primary" text="uview-plus"></up-text>
    </view>
    <view class="charts-box">
      <qiun-data-charts type="column" :chartData="chartData" />
    </view>
  </view>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const chartData = ref({});
onMounted(() => { getServerData() });
function getServerData() {
  // æ¨¡æ‹Ÿä»ŽæœåŠ¡å™¨èŽ·å–æ•°æ®æ—¶çš„å»¶æ—¶
  setTimeout(() => {
    let res = {
      categories: ['2016', '2017', '2018', '2019', '2020', '2021'],
      series: [
        {
          name: '目标值',
          data: [35, 36, 31, 33, 13, 34],
        },
        {
          name: '完成量',
          data: [18, 27, 21, 24, 6, 28],
        },
      ],
    };
    chartData.value = JSON.parse(JSON.stringify(res));
  }, 500);
}
</script>
<style scoped>
.content {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.logo {
  height: 200rpx;
  width: 200rpx;
  margin-top: 200rpx;
  margin-left: auto;
  margin-right: auto;
  margin-bottom: 50rpx;
}
.text-area {
  display: flex;
  justify-content: center;
}
.title {
  font-size: 36rpx;
  color: #8f8f94;
}
.charts-box {
  width: 100%;
  height: 300px;
}
</style>
src/pages/login.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,208 @@
<template>
  <view class="normal-login-container">
    <view class="logo-content align-center justify-center flex">
      <image style="width: 100rpx;height: 100rpx;" :src="globalConfig.appInfo.logo" mode="widthFix">
      </image>
      <text class="title">若依移动端登录</text>
    </view>
    <view class="login-form-content">
      <view class="input-item flex align-center">
        <view class="iconfont icon-user icon"></view>
        <input v-model="loginForm.username" class="input" type="text" placeholder="请输入账号" maxlength="30" />
      </view>
      <view class="input-item flex align-center">
        <view class="iconfont icon-password icon"></view>
        <input v-model="loginForm.password" type="password" class="input" placeholder="请输入密码" maxlength="20" />
      </view>
      <view class="input-item flex align-center" style="width: 60%;margin: 0px;" v-if="captchaEnabled">
        <view class="iconfont icon-code icon"></view>
        <input v-model="loginForm.code" type="number" class="input" placeholder="请输入验证码" maxlength="4" />
        <view class="login-code">
          <image :src="codeUrl" @click="getCode" class="login-code-img"></image>
        </view>
      </view>
      <view class="action-btn">
        <button @click="handleLogin" class="login-btn cu-btn block bg-blue lg round">登录</button>
      </view>
    </view>
    <view class="xieyi text-center">
      <text class="text-grey1">登录即代表同意</text>
      <text @click="handleUserAgrement" class="text-blue">《用户协议》</text>
      <text @click="handlePrivacy" class="text-blue">《隐私协议》</text>
    </view>
  </view>
</template>
<script setup>
import modal from '@/plugins/modal'
import { getCodeImg } from '@/api/login'
import { ref } from "vue";
import config from '@/config.js'
import useUserStore from '@/store/modules/user'
import { getWxCode } from '@/utils/geek';
import { wxLogin } from '@/api/oauth';
import { setToken } from '@/utils/auth';
const userStore = useUserStore()
const codeUrl = ref("");
const captchaEnabled = ref(true); // æ˜¯å¦å¼€å¯éªŒè¯ç 
const useWxLogin = ref(false); // æ˜¯å¦ä½¿ç”¨å¾®ä¿¡ç™»å½•
const globalConfig = ref(config);
const loginForm = ref({
  username: "admin",
  password: "admin123",
  code: "",
  uuid: ''
});
if (useWxLogin.value) {
  getWxCode().then(res => {
    console.log(res);
    wxLogin('miniapp',res).then(res => {
      if(res.token != null){
        setToken(res.token);
        loginSuccess()
      }
    });
  })
}
// èŽ·å–å›¾å½¢éªŒè¯ç 
function getCode() {
  getCodeImg().then(res => {
    captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled
    if (captchaEnabled.value) {
      codeUrl.value = 'data:image/gif;base64,' + res.img
      loginForm.value.uuid = res.uuid
    }
  })
};
async function handleLogin() {
  if (loginForm.value.username === "") {
    modal.msgError("请输入您的账号")
  } else if (loginForm.value.password === "") {
    modal.msgError("请输入您的密码")
  } else if (loginForm.value.code === "" && captchaEnabled.value) {
    modal.msgError("请输入验证码")
  } else {
    modal.loading("登录中,请耐心等待...")
    pwdLogin()
  }
};
// å¯†ç ç™»å½•
async function pwdLogin() {
  userStore.login(loginForm.value).then(() => {
    modal.closeLoading()
    loginSuccess()
  }).catch(() => {
    if (captchaEnabled.value) {
      modal.closeLoading()
      getCode()
    }
  })
};
function loginSuccess(result) {
  // è®¾ç½®ç”¨æˆ·ä¿¡æ¯
  userStore.getInfo().then(res => {
    uni.switchTab({
      url: '/pages/index'
    });
  })
}
// éšç§åè®®
function handlePrivacy() {
  let site = globalConfig.value.appInfo.agreements[0];
  uni.navigateTo({
    url: `/pages/common/webview/index?title=${site.title}&url=${site.url}`
  });
};
// ç”¨æˆ·åè®®
function handleUserAgrement() {
  let site = globalConfig.value.appInfo.agreements[1]
  uni.navigateTo({
    url: `/pages/common/webview/index?title=${site.title}&url=${site.url}`
  });
};
getCode();
</script>
<style lang="scss">
page {
  background-color: #ffffff;
}
.normal-login-container {
  width: 100%;
  .logo-content {
    width: 100%;
    font-size: 21px;
    text-align: center;
    padding-top: 15%;
    image {
      border-radius: 4px;
    }
    .title {
      margin-left: 10px;
    }
  }
  .login-form-content {
    text-align: center;
    margin: 20px auto;
    margin-top: 15%;
    width: 80%;
    .input-item {
      margin: 20px auto;
      background-color: #f5f6f7;
      height: 45px;
      border-radius: 20px;
      .icon {
        font-size: 38rpx;
        margin-left: 10px;
        color: #999;
      }
      .input {
        width: 100%;
        font-size: 14px;
        line-height: 20px;
        text-align: left;
        padding-left: 15px;
      }
    }
    .login-btn {
      margin-top: 40px;
      height: 45px;
    }
    .xieyi {
      color: #333;
      margin-top: 20px;
    }
    .login-code {
      height: 38px;
      float: right;
      .login-code-img {
        height: 38px;
        position: absolute;
        margin-left: 10px;
        width: 200rpx;
      }
    }
  }
}
</style>
src/pages/mine.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,235 @@
<template>
  <view class="mine-container" :style="{ height: `${windowHeight}px` }">
    <!--顶部个人信息栏-->
    <view class="header-section">
      <view class="flex padding justify-between">
        <view class="flex align-center">
          <view v-if="!avatar" class="cu-avatar xl round bg-white">
            <view class="iconfont icon-people text-gray icon"></view>
          </view>
          <image v-if="avatar" @click="handleToAvatar" :src="avatar" class="cu-avatar xl round" mode="widthFix">
          </image>
          <view v-if="!name" @click="handleToLogin" class="login-tip">
            ç‚¹å‡»ç™»å½•
          </view>
          <view v-if="name" @click="handleToInfo" class="user-info">
            <view class="u_title">
              ç”¨æˆ·åï¼š{{ name }}
            </view>
          </view>
        </view>
        <view @click="handleToInfo" class="flex align-center">
          <text>个人信息</text>
          <view class="iconfont icon-right"></view>
        </view>
      </view>
    </view>
    <view class="content-section">
      <view class="mine-actions grid col-4 text-center">
        <view class="action-item" @click="handleJiaoLiuQun">
          <view class="iconfont icon-friendfill text-pink icon"></view>
          <text class="text">交流群</text>
        </view>
        <view class="action-item" @click="handleBuilding">
          <view class="iconfont icon-service text-blue icon"></view>
          <text class="text">在线客服</text>
        </view>
        <view class="action-item" @click="handleBuilding">
          <view class="iconfont icon-community text-mauve icon"></view>
          <text class="text">反馈社区</text>
        </view>
        <view class="action-item" @click="handleBuilding">
          <view class="iconfont icon-dianzan text-green icon"></view>
          <text class="text">点赞我们</text>
        </view>
      </view>
      <view class="menu-list">
        <view class="list-cell list-cell-arrow" @click="handleToEditInfo">
          <view class="menu-item-box">
            <view class="iconfont icon-user menu-icon"></view>
            <view>编辑资料</view>
          </view>
        </view>
        <view class="list-cell list-cell-arrow" @click="handleHelp">
          <view class="menu-item-box">
            <view class="iconfont icon-help menu-icon"></view>
            <view>常见问题</view>
          </view>
        </view>
        <view class="list-cell list-cell-arrow" @click="handleAbout">
          <view class="menu-item-box">
            <view class="iconfont icon-aixin menu-icon"></view>
            <view>关于我们</view>
          </view>
        </view>
        <view class="list-cell list-cell-arrow" @click="handleToSetting">
          <view class="menu-item-box">
            <view class="iconfont icon-setting menu-icon"></view>
            <view>应用设置</view>
          </view>
        </view>
      </view>
    </view>
  </view>
  <!-- <view>
      <uni-popup ref="popup" type="dialog">
        <uni-popup-dialog type="info" cancelText="关闭" confirmText="退出"
                          title="通知" content="确定注销并退出系统吗"
                          @confirm="dialogConfirm"
                          @close="dialogClose">
        </uni-popup-dialog>
      </uni-popup>
  </view> -->
</template>
<script setup>
import { ref } from "vue";
import config from '@/config.js'
import useUserStore from '@/store/modules/user'
const userStore = useUserStore()
const name = userStore.name;
const version = config.appInfo.version;
const avatar = ref(userStore.avatar);
const windowHeight = ref(uni.getSystemInfoSync().windowHeight - 50);
const popup = ref(null);
uni.$on('refresh', () => {
  avatar.value = userStore.avatar;
})
function handleToInfo() {
  uni.navigateTo({
    url: '/pages_mine/pages/info/index'
  });
};
function handleToEditInfo() {
  uni.navigateTo({
    url: '/pages_mine/pages/info/edit'
  });
};
function handleToSetting() {
  uni.navigateTo({
    url: '/pages_mine/pages/setting/index'
  });
};
function handleToLogin() {
  uni.reLaunch({
    url: '/pages/login'
  });
};
function handleToAvatar() {
  uni.navigateTo({
    url: '/pages_mine/pages/avatar/index'
  });
};
function handleLogout() {
  popup.value.open();
};
function dialogConfirm() {
  //console.log('----------------点击确认------------')
  userStore.logOut().then(() => {
    uni.reLaunch({
      url: '/pages/login'
    });
  })
};
function dialogClose() {
  //console.log('点击关闭')
};
function handleHelp() {
  uni.navigateTo({
    url: '/pages_mine/pages/help/index'
  });
};
function handleAbout() {
  uni.navigateTo({
    url: '/pages_mine/pages/about/index'
  });
};
function handleJiaoLiuQun() {
  uni.showToast({
    title: 'QQ群:133713780',
    mask: false,
    icon: "none",
    duration: 1000
  });
};
function handleBuilding() {
  uni.showToast({
    title: '模块建设中~',
    mask: false,
    icon: "none",
    duration: 1000
  });
}
</script>
<style lang="scss">
page {
  background-color: #f5f6f7;
}
.mine-container {
  width: 100%;
  height: 100%;
  .header-section {
    padding: 15px 15px 45px 15px;
    background-color: #3c96f3;
    color: white;
    .login-tip {
      font-size: 18px;
      margin-left: 10px;
    }
    .cu-avatar {
      border: 2px solid #eaeaea;
      .icon {
        font-size: 40px;
      }
    }
    .user-info {
      margin-left: 15px;
      .u_title {
        font-size: 18px;
        line-height: 30px;
      }
    }
  }
  .content-section {
    position: relative;
    top: -50px;
    .mine-actions {
      margin: 15px 15px;
      padding: 20px 0px;
      border-radius: 8px;
      background-color: white;
      .action-item {
        .icon {
          font-size: 28px;
        }
        .text {
          display: block;
          font-size: 13px;
          margin: 8px 0px;
        }
      }
    }
  }
}
</style>
src/pages/template.config.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
export default [
    {
        groupName: 'geek组件',
        groupName_en: 'Page',
        list: [
            {
                path: '/pages_geek/pages/index/index',
                icon: 'wxCenter',
                title: '组件展示',
                title_en: 'index',
            },
            {
                path: '/pages_geek/pages/code/index',
                icon: 'wxCenter',
                title: '二维码',
                title_en: 'index',
            }
        ]
    },
    {
        groupName: '部件',
        groupName_en: 'Parts',
        list: [
            {
                path: '/pages_template/pages/coupon/index',
                icon: 'coupon',
                title: 'Coupon ä¼˜æƒ åˆ¸',
                title_en: 'Coupon',
            },
            {
                path: '/pages_template/pages/citySelect/index',
                icon: 'citySelect',
                title: 'CitySelect åŸŽå¸‚选择',
                title_en: 'CitySelect',
            },
            {
                path: '/pages_template/pages/submitBar/index',
                icon: 'submitBar',
                title: 'SubmitBar æäº¤è®¢å•栏',
                title_en: 'SubmitBar',
            },
            {
                path: '/pages_template/pages/keyboardPay/index',
                icon: 'keyboardPay',
                title: 'KeyboardPay è‡ªå®šä¹‰é”®ç›˜æ”¯ä»˜æ¨¡æ¿',
                title_en: 'KeyboardPay',
            },
        ]
    },
    {
        groupName: '报表',
        groupName_en: 'Parts',
        list: [
            {
                path: '/pages_qiun/pages/finance/index',
                icon: 'coupon',
                title: '财务报告',
                title_en: 'finace',
            },
            {
                path: '/pages_qiun/pages/main/index',
                icon: 'coupon',
                title: '数据报表中心',
                title_en: 'main',
            },
            {
                path: '/pages_qiun/pages/school/index',
                icon: 'coupon',
                title: '智慧教育报表中心',
                title_en: 'school',
            },
            {
                path: '/pages_qiun/pages/sport/index',
                icon: 'coupon',
                title: '运动报告',
                title_en: 'sport',
            },
        ]
    },
    {
        groupName: '页面',
        groupName_en: 'Page',
        list: [
            {
                path: '/pages_template/pages/wxCenter/index',
                icon: 'wxCenter',
                title: 'WxCenter ä»¿å¾®ä¿¡ä¸ªäººä¸­å¿ƒ',
                title_en: 'WxCenter',
            },
            {
                path: '/pages_template/pages/mallMenu/index1',
                icon: 'mall_menu_1',
                title: 'MallMenu åž‚直分类(左右独立)',
                title_en: 'MallMenu 1',
            }, {
                path: '/pages_template/pages/mallMenu/index2',
                icon: 'mall_menu_2',
                title: 'MallMenu åž‚直分类(左右联动)',
                title_en: 'MallMenu 2',
            }, {
                path: '/pages_template/pages/comment/index',
                icon: 'comment',
                title: 'Comment è¯„论列表',
                title_en: 'Comment',
            }, {
                path: '/pages_template/pages/order/index',
                icon: 'order',
                title: 'Order è®¢å•列表',
                title_en: 'Order',
            },
            {
                path: '/pages_template/pages/login/index1',
                icon: 'login',
                title: 'Login ç™»å½•界面',
                title_en: 'Login',
            },
            {
                path: '/pages_template/pages/login/index2',
                icon: 'login',
                title: 'Login æ°´æ»´ç™»å½•',
                title_en: 'Login',
            },
            {
                path: '/pages_template/pages/address/index',
                icon: 'address',
                title: 'Address æ”¶è´§åœ°å€',
                title_en: 'Address',
            },
        ]
    },
]
src/pages/template.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
<template>
    <view class="wrap">
      <view class="list-wrap">
        <u-cell-group title-bg-color="rgb(243, 244, 246)" :title="getGroupTitle(item)" v-for="(item, index) in list"
          :key="index">
          <u-cell :titleStyle="{ fontWeight: 500 }" @click="openPage(item1.path)" :title="getFieldTitle(item1)"
            v-for="(item1, index1) in item.list" :key="index1">
            <template v-slot:icon>
              <image class="u-cell-icon" :src="getIcon(item1.icon)" mode="widthFix"></image>
            </template>
          </u-cell>
        </u-cell-group>
      </view>
      <u-gap height="70"></u-gap>
      <!-- <u-tabbar :list="vuex_tabbar" :mid-button="true"></u-tabbar> -->
    </view>
  </template>
  <script>
  import list from "./template.config.js";
  export default {
    data() {
      return {
        list: list,
        // desc: '收集众多的常用页面和布局,减少开发者的重复工作,让你专注逻辑,事半功倍'
      }
    },
    computed: {
      getIcon() {
        return path => {
          return '../static/uview/demo/' + path + '.png';
          return 'https://cdn.uviewui.com/uview/example/' + path + '.png';
        }
      },
    },
    methods: {
      openPage(path) {
        this.$u.route({
          url: path
        })
      },
      getGroupTitle(item) {
        return item.groupName
      },
      getFieldTitle(item) {
        return item.title
      }
    }
  }
  </script>
  <style>
  /* page {
          background-color: rgb(240, 242, 244);
      } */
  </style>
  <style lang="scss" scoped>
  .u-cell-icon {
    width: 36rpx;
    height: 36rpx;
    margin-right: 8rpx;
  }
  </style>
src/pages/work.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,184 @@
<template>
  <view class="work-container">
    <!-- è½®æ’­å›¾ -->
    <uni-swiper-dot class="uni-swiper-dot-box" :info="data" :current="current" field="content">
      <swiper class="swiper-box" :current="swiperDotIndex" @change="changeSwiper">
        <swiper-item v-for="(item, index) in data" :key="index">
          <view class="swiper-item" @click="clickBannerItem(item)">
            <image :src="item.image" mode="aspectFill" :draggable="false" />
          </view>
        </swiper-item>
      </swiper>
    </uni-swiper-dot>
    <!-- å®«æ ¼ç»„ä»¶ -->
    <uni-section title="系统管理" type="line"></uni-section>
    <view class="grid-body">
      <uni-grid :column="4" :showBorder="false" @change="changeGrid">
        <uni-grid-item>
          <view class="grid-item-box">
            <uni-icons type="person-filled" size="30"></uni-icons>
            <text class="text">用户管理</text>
          </view>
        </uni-grid-item>
        <uni-grid-item>
          <view class="grid-item-box">
            <uni-icons type="staff-filled" size="30"></uni-icons>
            <text class="text">角色管理</text>
          </view>
        </uni-grid-item>
        <uni-grid-item>
          <view class="grid-item-box">
            <uni-icons type="color" size="30"></uni-icons>
            <text class="text">菜单管理</text>
          </view>
        </uni-grid-item>
        <uni-grid-item>
          <view class="grid-item-box">
            <uni-icons type="settings-filled" size="30"></uni-icons>
            <text class="text">部门管理</text>
          </view>
        </uni-grid-item>
        <uni-grid-item>
          <view class="grid-item-box">
            <uni-icons type="heart-filled" size="30"></uni-icons>
            <text class="text">岗位管理</text>
          </view>
        </uni-grid-item>
        <uni-grid-item>
          <view class="grid-item-box">
            <uni-icons type="bars" size="30"></uni-icons>
            <text class="text">字典管理</text>
          </view>
        </uni-grid-item>
        <uni-grid-item>
          <view class="grid-item-box">
            <uni-icons type="gear-filled" size="30"></uni-icons>
            <text class="text">参数设置</text>
          </view>
        </uni-grid-item>
        <uni-grid-item>
          <view class="grid-item-box">
            <uni-icons type="chat-filled" size="30"></uni-icons>
            <text class="text">通知公告</text>
          </view>
        </uni-grid-item>
        <uni-grid-item>
          <view class="grid-item-box">
            <uni-icons type="wallet-filled" size="30"></uni-icons>
            <text class="text">日志管理</text>
          </view>
        </uni-grid-item>
      </uni-grid>
    </view>
  </view>
</template>
<script setup>
    import { ref } from "vue";
  import modal from "@/plugins/modal"
    const current=ref(0);
    const swiperDotIndex=ref(0);
    const data=ref([{
            image: '/static/images/banner/banner01.jpg'
          },
          {
            image: '/static/images/banner/banner02.jpg'
          },
          {
            image: '/static/images/banner/banner03.jpg'
          }
        ]);
    function clickBannerItem(item) {
      console.info(item)
    };
    function changeSwiper(e) {
      current.value = e.detail.current
    }
    function changeGrid(e) {
      modal.showToast({
        title: '模块建设中',
        mask: false,
          icon:'loading',
        duration: 1000
      });
    }
</script>
<style lang="scss">
  /* #ifndef APP-NVUE */
  page {
    display: flex;
    flex-direction: column;
    box-sizing: border-box;
    background-color: #fff;
    min-height: 100%;
    height: auto;
  }
  view {
    font-size: 14px;
    line-height: inherit;
  }
  /* #endif */
  .text {
    text-align: center;
    font-size: 26rpx;
    margin-top: 10rpx;
  }
  .grid-item-box {
    flex: 1;
    /* #ifndef APP-NVUE */
    display: flex;
    /* #endif */
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 15px 0;
  }
  .uni-margin-wrap {
    width: 690rpx;
    width: 100%;
    ;
  }
  .swiper {
    height: 300rpx;
  }
  .swiper-box {
    height: 150px;
  }
  .swiper-item {
    /* #ifndef APP-NVUE */
    display: flex;
    /* #endif */
    flex-direction: column;
    justify-content: center;
    align-items: center;
    color: #fff;
    height: 300rpx;
    line-height: 300rpx;
  }
  @media screen and (min-width: 500px) {
    .uni-swiper-dot-box {
      width: 400px;
      /* #ifndef APP-NVUE */
      margin: 0 auto;
      /* #endif */
      margin-top: 8px;
    }
    .image {
      width: 100%;
    }
  }
</style>
src/pages_geek/pages/code/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,130 @@
<template xlang="wxml">
    <view class="container">
        <view class="qrimg">
            <view class="qrimg-i">
                <geek-qrcode v-if="ifShow" cid="qrcode1" ref="qrcode" :val="val" :size="size" :unit="unit"
                    :background="background" :foreground="foreground" :pdground="pdground" :icon="icon" :iconSize="iconsize"
                    :lv="lv" :onval="onval" :loadMake="loadMake" :usingComponents="true" @result="qrR" />
            </view>
            <view class="qrimg-i">
                <geek-qrcode v-if="ifShow" cid="qrcode2" ref="qrcode2" val="第二个二维码" :size="size" :onval="onval"
                    :loadMake="loadMake" :usingComponents="true" @result="qrR" />
            </view>
        </view>
        <view class="uni-padding-wrap">
            <view class="uni-title">请输入要生成的二维码内容</view>
        </view>
        <view class="uni-list">
            <input class="uni-input" placeholder="请输入要生成的二维码内容" v-model="val" />
        </view>
        <view class="uni-padding-wrap uni-common-mt">
            <view class="uni-title">设置二维码大小</view>
        </view>
        <view class="body-view">
            <slider :value="size" @change="sliderchange" min="50" max="500" show-value />
        </view>
        <view class="uni-padding-wrap">
            <view class="btns">
                <button type="primary" @tap="selectIcon">选择二维码图标</button>
                <button type="primary" @tap="creatQrcode">生成二维码</button>
                <button type="primary" @tap="saveQrcode">保存到图库</button>
                <button type="warn" @tap="clearQrcode">清除二维码</button>
                <button type="warn" @tap="ifQrcode">显示隐藏二维码</button>
            </view>
        </view>
    </view>
</template>
<script>
export default {
    data() {
        return {
            ifShow: true,
            val: '二维码', // è¦ç”Ÿæˆçš„二维码值
            size: 200, // äºŒç»´ç å¤§å°
            unit: 'upx', // å•位
            background: '#b4e9e2', // èƒŒæ™¯è‰²
            foreground: '#309286', // å‰æ™¯è‰²
            pdground: '#32dbc6', // è§’标色
            icon: '', // äºŒç»´ç å›¾æ ‡
            iconsize: 40, // äºŒç»´ç å›¾æ ‡å¤§å°
            lv: 3, // äºŒç»´ç å®¹é”™çº§åˆ« ï¼Œ ä¸€èˆ¬ä¸ç”¨è®¾ç½®ï¼Œé»˜è®¤å°±è¡Œ
            onval: false, // val值变化时自动重新生成二维码
            loadMake: true, // ç»„件加载完成后自动生成二维码
            src: '' // äºŒç»´ç ç”ŸæˆåŽçš„图片地址或base64
        }
    },
    methods: {
        sliderchange(e) {
            this.size = e.detail.value
        },
        creatQrcode() {
            this.$refs.qrcode._makeCode()
        },
        saveQrcode() {
            this.$refs.qrcode._saveCode()
        },
        qrR(res) {
            this.src = res
        },
        clearQrcode() {
            this.$refs.qrcode._clearCode()
            this.val = ''
        },
        ifQrcode() {
            this.ifShow = !this.ifShow
        },
        selectIcon() {
            let that = this
            uni.chooseImage({
                count: 1, //默认9
                sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
                sourceType: ['album'], //从相册选择
                success: function (res) {
                    that.icon = res.tempFilePaths[0]
                    setTimeout(() => {
                        that.creatQrcode()
                    }, 100);
                    // console.log(res.tempFilePaths);
                }
            });
        }
    }
}
</script>
<style>
/* @import "../../../common/icon.css"; */
.container {
    display: flex;
    flex-direction: column;
    width: 100%;
}
.qrimg {
    display: flex;
    justify-content: center;
}
.qrimg-i {
    margin-right: 10px;
}
slider {
    width: 100%;
}
input {
    width: 100%;
    margin-bottom: 20upx;
}
.btns {
    display: flex;
    flex-direction: column;
    width: 100%;
}
button {
    width: 100%;
    margin-top: 10upx;
}</style>
src/pages_geek/pages/index/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
<template>
  <view style="background-color: #f6f6f6;">
    <uni-section class="mb-10" title="数值板" sub-title="statistic" type="line"></uni-section>
    <u-row gutter="0">
      <u-col span="6">
        <geek-statistic label="订单数量(个)" labelColor="#1f1f1f" :number="0" numberColor="red" />
      </u-col>
      <u-col span="6">
        <geek-statistic label="交易金额(元)" labelColor="#1f1f1f" :number="0" numberColor="red" />
      </u-col>
    </u-row>
    <uni-section class="mb-10" title="菜单" sub-title="menu" type="line"></uni-section>
    <view style="width: 100%; display: flex;justify-content:space-evenly;align-items: center;">
      <geek-menu v-for="menu, index in menus" :key="index" v-bind=menu :size="60" @click="modal.msg(menu.label)"
        type="circle" />
    </view>
    <view style="width: 100%; display: flex;justify-content:space-evenly;align-items: center;">
      <geek-menu v-for="menu, index in menus" :key="index" :icon="menu.icon" :label="menu.label" :size="60"
        @click="modal.msg(menu.label)" type="rect" />
    </view>
    <uni-section class="mb-10" title="商品列表" sub-title="commodity" type="line"></uni-section>
    <view style="display: flex;flex-direction: column;justify-content: center;align-items: center;">
      <geek-commodity v-for="item, index in commodityList" :key="index" v-bind="item" type="line"
        @click="modal.msg(item.title)" />
    </view>
    <view style="display: flex;justify-content: center;">
      <view>
        <geek-commodity v-for="item, index in commodityList.slice(0, 2)" :key="index" v-bind="item" type="rect"
          @click="modal.msg(item.title)" />
      </view>
      <view>
        <geek-commodity v-for="item, index in commodityList.slice(1, 3)" :key="index" v-bind="item" type="rect"
          @click="modal.msg(item.title)" />
      </view>
    </view>
    <uni-section class="mb-10" title="订单列表" sub-title="order" type="line"></uni-section>
    <geek-order v-for="item, index in orderList" :key="index" v-bind="item" @more="modal.msg('更多')"
      @again="modal.msg('再次购买')" @return="modal.msg('退换')" @sell="modal.msg('卖了换钱')"></geek-order>
    <uni-section class="mb-10" title="颜色选择器" sub-title="order" type="line"></uni-section>
    <geek-color-picker ref="gk" @confirm="getcolor"></geek-color-picker>
    <button @click="open()">打开颜色选择器</button>
    <uni-section class="mb-10" title="二维码" sub-title="order" type="line"></uni-section>
    <view style="display: flex;align-items: center;justify-content: center;">
      <geek-qrcode cid="qrcode2" ref="qrcode2" val="二维码" :loadMake="true" />
    </view>
  </view>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue';
import modal from '@/plugins/modal'
import { Commodity, CommodityOrder, Menu } from "@/components/geek-xd/types"
const gk = ref(null)
function open() {
  //@ts-ignore
  gk.value.open()
}
function getcolor(color: { hex: string, rgba: { r: number, g: number, b: number, a: number } }) {
  console.log(color)
}
const menus: Array<Menu> = reactive([
  { icon: "/static/images/icon/rocket.png", label: '抢单' },
  { icon: "/static/images/icon/phone.png", label: '回访' },
  { icon: "/static/images/icon/message.png", label: '消息' },
  { icon: "/static/images/icon/dialogue.png", label: '公告' },
  { icon: "/static/images/icon/knowledge.png", label: '知识库' }
]);
const commodityList: Array<Commodity> = reactive([
  {
    img: '/static/images/banner/banner01.jpg',
    title: '商品1',
    subTitle: '商品1简介',
    price: 100,
  },
  {
    img: '/static/images/banner/banner02.jpg',
    title: '商品2',
    subTitle: '商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介商品2简介',
    price: 300,
  },
  {
    img: '/static/images/banner/banner03.jpg',
    title: '商品3',
    subTitle: '商品3简介',
    price: 200,
  }
])
const orderList: Array<CommodityOrder> = [
  {
    shop: 'geek自营旗舰店',
    status: '完成',
    img: '/static/images/banner/banner01.jpg',
    title: '商品1',
    label: '商品1简介',
    price: 100.32,
    num: 10
  },
  {
    shop: 'geek自营旗舰店',
    status: '已取消',
    img: '/static/images/banner/banner03.jpg',
    title: '商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商品3',
    label: '商品3简介',
    price: 2000.67,
    num: 10
  },
  {
    shop: 'geek自营旗舰店',
    status: '已取消',
    img: '/static/images/banner/banner03.jpg',
    title: '商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商品3',
    label: '商品3简介',
    price: 10.67,
    num: 10
  }
]
</script>
<style lang="scss" scoped></style>
src/pages_mine/pages/about/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
<template>
  <view class="about-container">
    <view class="header-section text-center">
      <image style="width: 150rpx;height: 150rpx;" src="/static/logo.png" mode="widthFix">
      </image>
      <uni-title type="h2" title="若依移动端"></uni-title>
    </view>
    <view class="content-section">
      <view class="menu-list">
        <view class="list-cell list-cell-arrow">
          <view class="menu-item-box">
            <view>版本信息</view>
            <view class="text-right">v{{version}}</view>
          </view>
        </view>
        <view class="list-cell list-cell-arrow">
          <view class="menu-item-box">
            <view>官方邮箱</view>
            <view class="text-right">ruoyi@xx.com</view>
          </view>
        </view>
        <view class="list-cell list-cell-arrow">
          <view class="menu-item-box">
            <view>服务热线</view>
            <view class="text-right">400-999-9999</view>
          </view>
        </view>
        <view class="list-cell list-cell-arrow">
          <view class="menu-item-box">
            <view>公司网站</view>
            <view class="text-right">
              <uni-link :href="url" :text="url" showUnderLine="false"></uni-link>
            </view>
          </view>
        </view>
      </view>
    </view>
    <view class="copyright">
      <view>Copyright &copy; 2022 ruoyi.vip All Rights Reserved.</view>
    </view>
  </view>
</template>
<script setup>
    import config from '@/config.js'
    const url=config.appInfo.site_url;
    const version=config.appInfo.version;
</script>
<style lang="scss">
  page {
    background-color: #f8f8f8;
  }
  .copyright {
    margin-top: 50rpx;
    text-align: center;
    line-height: 60rpx;
    color: #999;
  }
  .header-section {
    display: flex;
    padding: 30rpx 0 0;
    flex-direction: column;
    align-items: center;
  }
</style>
src/pages_mine/pages/avatar/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,642 @@
<template>
    <view class="container">
        <view class="page-body uni-content-info">
            <view class='cropper-content'>
                <view v-if="isShowImg" class="uni-corpper"
                    :style="'width:' + cropperInitW + 'px;height:' + cropperInitH + 'px;background:#000'">
                    <view class="uni-corpper-content"
                        :style="'width:' + cropperW + 'px;height:' + cropperH + 'px;left:' + cropperL + 'px;top:' + cropperT + 'px'">
                        <image :src="imageSrc" :style="'width:' + cropperW + 'px;height:' + cropperH + 'px'"></image>
                        <view class="uni-corpper-crop-box" @touchstart.stop="contentStartMove"
                            @touchmove.stop="contentMoveing" @touchend.stop="contentTouchEnd"
                            :style="'left:' + cutL + 'px;top:' + cutT + 'px;right:' + cutR + 'px;bottom:' + cutB + 'px'">
                            <view class="uni-cropper-view-box">
                                <view class="uni-cropper-dashed-h"></view>
                                <view class="uni-cropper-dashed-v"></view>
                                <view class="uni-cropper-line-t" data-drag="top" @touchstart.stop="dragStart"
                                    @touchmove.stop="dragMove"></view>
                                <view class="uni-cropper-line-r" data-drag="right" @touchstart.stop="dragStart"
                                    @touchmove.stop="dragMove"></view>
                                <view class="uni-cropper-line-b" data-drag="bottom" @touchstart.stop="dragStart"
                                    @touchmove.stop="dragMove"></view>
                                <view class="uni-cropper-line-l" data-drag="left" @touchstart.stop="dragStart"
                                    @touchmove.stop="dragMove"></view>
                                <view class="uni-cropper-point point-t" data-drag="top" @touchstart.stop="dragStart"
                                    @touchmove.stop="dragMove"></view>
                                <view class="uni-cropper-point point-tr" data-drag="topTight"></view>
                                <view class="uni-cropper-point point-r" data-drag="right" @touchstart.stop="dragStart"
                                    @touchmove.stop="dragMove"></view>
                                <view class="uni-cropper-point point-rb" data-drag="rightBottom"
                                    @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
                                <view class="uni-cropper-point point-b" data-drag="bottom" @touchstart.stop="dragStart"
                                    @touchmove.stop="dragMove" @touchend.stop="dragEnd"></view>
                                <view class="uni-cropper-point point-bl" data-drag="bottomLeft"></view>
                                <view class="uni-cropper-point point-l" data-drag="left" @touchstart.stop="dragStart"
                                    @touchmove.stop="dragMove"></view>
                                <view class="uni-cropper-point point-lt" data-drag="leftTop"></view>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
            <view class='cropper-config'>
                <button type="primary reverse" @click="getImage" style='margin-top: 30rpx;'> é€‰æ‹©å¤´åƒ </button>
                <button type="warn" @click="getImageInfo" style='margin-top: 30rpx;'> æäº¤ </button>
            </view>
            <canvas canvas-id="myCanvas"
                :style="'position:absolute;border: 1px solid red; width:' + imageW + 'px;height:' + imageH + 'px;top:-9999px;left:-9999px;'"></canvas>
        </view>
    </view>
</template>
<script>
import config from '@/config'
import { uploadAvatar } from "@/api/system/user"
import useUserStore from '@/store/modules/user'
const baseUrl = config.baseUrl
let sysInfo = uni.getSystemInfoSync()
let SCREEN_WIDTH = sysInfo.screenWidth
let PAGE_X, // æ‰‹æŒ‰ä¸‹çš„x位置
    PAGE_Y, // æ‰‹æŒ‰ä¸‹y的位置
    PR = sysInfo.pixelRatio, // dpi
    T_PAGE_X, // æ‰‹ç§»åŠ¨çš„æ—¶å€™x的位置
    T_PAGE_Y, // æ‰‹ç§»åŠ¨çš„æ—¶å€™Y的位置
    CUT_L, // åˆå§‹åŒ–拖拽元素的left值
    CUT_T, // åˆå§‹åŒ–拖拽元素的top值
    CUT_R, // åˆå§‹åŒ–拖拽元素的
    CUT_B, // åˆå§‹åŒ–拖拽元素的
    CUT_W, // åˆå§‹åŒ–拖拽元素的宽度
    CUT_H, //  åˆå§‹åŒ–拖拽元素的高度
    IMG_RATIO, // å›¾ç‰‡æ¯”例
    IMG_REAL_W, // å›¾ç‰‡å®žé™…的宽度
    IMG_REAL_H, // å›¾ç‰‡å®žé™…的高度
    DRAFG_MOVE_RATIO = 1, //移动时候的比例,
    INIT_DRAG_POSITION = 100, // åˆå§‹åŒ–屏幕宽度和裁剪区域的宽度之差,用于设置初始化裁剪的宽度
    DRAW_IMAGE_W = sysInfo.screenWidth // è®¾ç½®ç”Ÿæˆçš„图片宽度
export default {
    /**
     * é¡µé¢çš„初始数据
     */
    data() {
        return {
            imageSrc: useUserStore().avatar,
            isShowImg: false,
            // åˆå§‹åŒ–的宽高
            cropperInitW: SCREEN_WIDTH,
            cropperInitH: SCREEN_WIDTH,
            // åŠ¨æ€çš„å®½é«˜
            cropperW: SCREEN_WIDTH,
            cropperH: SCREEN_WIDTH,
            // åŠ¨æ€çš„left top值
            cropperL: 0,
            cropperT: 0,
            transL: 0,
            transT: 0,
            // å›¾ç‰‡ç¼©æ”¾å€¼
            scaleP: 0,
            imageW: 0,
            imageH: 0,
            // è£å‰ªæ¡† å®½é«˜
            cutL: 0,
            cutT: 0,
            cutB: SCREEN_WIDTH,
            cutR: '100%',
            qualityWidth: DRAW_IMAGE_W,
            innerAspectRadio: DRAFG_MOVE_RATIO
        }
    },
    /**
     * ç”Ÿå‘½å‘¨æœŸå‡½æ•°--监听页面初次渲染完成
     */
    onReady: function () {
        this.loadImage()
    },
    methods: {
        setData: function (obj) {
            let that = this
            Object.keys(obj).forEach(function (key) {
                that.$set(that.$data, key, obj[key])
            })
        },
        getImage: function () {
            var _this = this
            uni.chooseImage({
                success: function (res) {
                    _this.setData({
                        imageSrc: res.tempFilePaths[0],
                    })
                    _this.loadImage()
                },
            })
        },
        loadImage: function () {
            var _this = this
            uni.getImageInfo({
                src: _this.imageSrc,
                success: function success(res) {
                    IMG_RATIO = 1 / 1
                    if (IMG_RATIO >= 1) {
                        IMG_REAL_W = SCREEN_WIDTH
                        IMG_REAL_H = SCREEN_WIDTH / IMG_RATIO
                    } else {
                        IMG_REAL_W = SCREEN_WIDTH * IMG_RATIO
                        IMG_REAL_H = SCREEN_WIDTH
                    }
                    let minRange = IMG_REAL_W > IMG_REAL_H ? IMG_REAL_W : IMG_REAL_H
                    INIT_DRAG_POSITION = minRange > INIT_DRAG_POSITION ? INIT_DRAG_POSITION : minRange
                    // æ ¹æ®å›¾ç‰‡çš„宽高显示不同的效果   ä¿è¯å›¾ç‰‡å¯ä»¥æ­£å¸¸æ˜¾ç¤º
                    if (IMG_RATIO >= 1) {
                        let cutT = Math.ceil((SCREEN_WIDTH / IMG_RATIO - (SCREEN_WIDTH / IMG_RATIO - INIT_DRAG_POSITION)) / 2)
                        let cutB = cutT
                        let cutL = Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH + INIT_DRAG_POSITION) / 2)
                        let cutR = cutL
                        _this.setData({
                            cropperW: SCREEN_WIDTH,
                            cropperH: SCREEN_WIDTH / IMG_RATIO,
                            // åˆå§‹åŒ–left right
                            cropperL: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH) / 2),
                            cropperT: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH / IMG_RATIO) / 2),
                            cutL: cutL,
                            cutT: cutT,
                            cutR: cutR,
                            cutB: cutB,
                            // å›¾ç‰‡ç¼©æ”¾å€¼
                            imageW: IMG_REAL_W,
                            imageH: IMG_REAL_H,
                            scaleP: IMG_REAL_W / SCREEN_WIDTH,
                            qualityWidth: DRAW_IMAGE_W,
                            innerAspectRadio: IMG_RATIO
                        })
                    } else {
                        let cutL = Math.ceil((SCREEN_WIDTH * IMG_RATIO - (SCREEN_WIDTH * IMG_RATIO)) / 2)
                        let cutR = cutL
                        let cutT = Math.ceil((SCREEN_WIDTH - INIT_DRAG_POSITION) / 2)
                        let cutB = cutT
                        _this.setData({
                            cropperW: SCREEN_WIDTH * IMG_RATIO,
                            cropperH: SCREEN_WIDTH,
                            // åˆå§‹åŒ–left right
                            cropperL: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH * IMG_RATIO) / 2),
                            cropperT: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH) / 2),
                            cutL: cutL,
                            cutT: cutT,
                            cutR: cutR,
                            cutB: cutB,
                            // å›¾ç‰‡ç¼©æ”¾å€¼
                            imageW: IMG_REAL_W,
                            imageH: IMG_REAL_H,
                            scaleP: IMG_REAL_W / SCREEN_WIDTH,
                            qualityWidth: DRAW_IMAGE_W,
                            innerAspectRadio: IMG_RATIO
                        })
                    }
                    _this.setData({
                        isShowImg: true
                    })
                    uni.hideLoading()
                }
            })
        },
        // æ‹–动时候触发的touchStart事件
        contentStartMove(e) {
            PAGE_X = e.touches[0].pageX
            PAGE_Y = e.touches[0].pageY
        },
        // æ‹–动时候触发的touchMove事件
        contentMoveing(e) {
            var _this = this
            var dragLengthX = (PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
            var dragLengthY = (PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
            // å·¦ç§»
            if (dragLengthX > 0) {
                if (this.cutL - dragLengthX < 0) dragLengthX = this.cutL
            } else {
                if (this.cutR + dragLengthX < 0) dragLengthX = -this.cutR
            }
            if (dragLengthY > 0) {
                if (this.cutT - dragLengthY < 0) dragLengthY = this.cutT
            } else {
                if (this.cutB + dragLengthY < 0) dragLengthY = -this.cutB
            }
            this.setData({
                cutL: this.cutL - dragLengthX,
                cutT: this.cutT - dragLengthY,
                cutR: this.cutR + dragLengthX,
                cutB: this.cutB + dragLengthY
            })
            PAGE_X = e.touches[0].pageX
            PAGE_Y = e.touches[0].pageY
        },
        contentTouchEnd() {
        },
        // èŽ·å–å›¾ç‰‡
        getImageInfo() {
            var _this = this
            uni.showLoading({
                title: '图片生成中...',
            })
            // å°†å›¾ç‰‡å†™å…¥ç”»å¸ƒ
            const ctx = uni.createCanvasContext('myCanvas')
            ctx.drawImage(_this.imageSrc, 0, 0, IMG_REAL_W, IMG_REAL_H)
            ctx.draw(true, () => {
                // èŽ·å–ç”»å¸ƒè¦è£å‰ªçš„ä½ç½®å’Œå®½åº¦   å‡ä¸ºç™¾åˆ†æ¯” * ç”»å¸ƒä¸­å›¾ç‰‡çš„宽度    ä¿è¯äº†åœ¨å¾®ä¿¡å°ç¨‹åºä¸­è£å‰ªçš„图片模糊  ä½ç½®ä¸å¯¹çš„问题 canvasT = (_this.cutT / _this.cropperH) * (_this.imageH / pixelRatio)
                var canvasW = ((_this.cropperW - _this.cutL - _this.cutR) / _this.cropperW) * IMG_REAL_W
                var canvasH = ((_this.cropperH - _this.cutT - _this.cutB) / _this.cropperH) * IMG_REAL_H
                var canvasL = (_this.cutL / _this.cropperW) * IMG_REAL_W
                var canvasT = (_this.cutT / _this.cropperH) * IMG_REAL_H
                uni.canvasToTempFilePath({
                    x: canvasL,
                    y: canvasT,
                    width: canvasW,
                    height: canvasH,
                    destWidth: canvasW,
                    destHeight: canvasH,
                    quality: 0.5,
                    canvasId: 'myCanvas',
                    success: function (res) {
                        uni.hideLoading()
                        let data = { name: 'avatarfile', filePath: res.tempFilePath }
                        uploadAvatar(data).then(response => {
                            // userStore.avatar =  response.imgUrl
                            /*cloud*/
                            useUserStore().avatar = baseUrl + response.imgUrl
                            uni.showToast({ title: "修改成功", icon: 'success' })
                            uni.$emit('refresh');
                            uni.navigateBack();
                        })
                    }
                })
            })
        },
        // è®¾ç½®å¤§å°çš„æ—¶å€™è§¦å‘çš„touchStart事件
        dragStart(e) {
            T_PAGE_X = e.touches[0].pageX
            T_PAGE_Y = e.touches[0].pageY
            CUT_L = this.cutL
            CUT_R = this.cutR
            CUT_B = this.cutB
            CUT_T = this.cutT
        },
        // è®¾ç½®å¤§å°çš„æ—¶å€™è§¦å‘çš„touchMove事件
        dragMove(e) {
            var _this = this
            var dragType = e.target.dataset.drag
            switch (dragType) {
                case 'right':
                    var dragLength = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
                    if (CUT_R + dragLength < 0) dragLength = -CUT_R
                    this.setData({
                        cutR: CUT_R + dragLength
                    })
                    break
                case 'left':
                    var dragLength = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
                    if (CUT_L - dragLength < 0) dragLength = CUT_L
                    if ((CUT_L - dragLength) > (this.cropperW - this.cutR)) dragLength = CUT_L - (this.cropperW - this.cutR)
                    this.setData({
                        cutL: CUT_L - dragLength
                    })
                    break
                case 'top':
                    var dragLength = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
                    if (CUT_T - dragLength < 0) dragLength = CUT_T
                    if ((CUT_T - dragLength) > (this.cropperH - this.cutB)) dragLength = CUT_T - (this.cropperH - this.cutB)
                    this.setData({
                        cutT: CUT_T - dragLength
                    })
                    break
                case 'bottom':
                    var dragLength = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
                    if (CUT_B + dragLength < 0) dragLength = -CUT_B
                    this.setData({
                        cutB: CUT_B + dragLength
                    })
                    break
                case 'rightBottom':
                    var dragLengthX = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
                    var dragLengthY = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
                    if (CUT_B + dragLengthY < 0) dragLengthY = -CUT_B
                    if (CUT_R + dragLengthX < 0) dragLengthX = -CUT_R
                    let cutB = CUT_B + dragLengthY
                    let cutR = CUT_R + dragLengthX
                    this.setData({
                        cutB: cutB,
                        cutR: cutR
                    })
                    break
                default:
                    break
            }
        }
    }
}
</script>
<style>
/* pages/uni-cropper/index.wxss */
.cropper-config {
    padding: 20rpx 40rpx;
}
.cropper-content {
    min-height: 750rpx;
    width: 100%;
}
.uni-corpper {
    position: relative;
    overflow: hidden;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    -webkit-tap-highlight-color: transparent;
    -webkit-touch-callout: none;
    box-sizing: border-box;
}
.uni-corpper-content {
    position: relative;
}
.uni-corpper-content image {
    display: block;
    width: 100%;
    min-width: 0 !important;
    max-width: none !important;
    height: 100%;
    min-height: 0 !important;
    max-height: none !important;
    image-orientation: 0deg !important;
    margin: 0 auto;
}
/* ç§»åŠ¨å›¾ç‰‡æ•ˆæžœ */
.uni-cropper-drag-box {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    cursor: move;
    background: rgba(0, 0, 0, 0.6);
    z-index: 1;
}
/* å†…部的信息 */
.uni-corpper-crop-box {
    position: absolute;
    background: rgba(255, 255, 255, 0.3);
    z-index: 2;
}
.uni-corpper-crop-box .uni-cropper-view-box {
    position: relative;
    display: block;
    width: 100%;
    height: 100%;
    overflow: visible;
    outline: 1rpx solid #69f;
    outline-color: rgba(102, 153, 255, .75)
}
/* æ¨ªå‘虚线 */
.uni-cropper-dashed-h {
    position: absolute;
    top: 33.33333333%;
    left: 0;
    width: 100%;
    height: 33.33333333%;
    border-top: 1rpx dashed rgba(255, 255, 255, 0.5);
    border-bottom: 1rpx dashed rgba(255, 255, 255, 0.5);
}
/* çºµå‘虚线 */
.uni-cropper-dashed-v {
    position: absolute;
    left: 33.33333333%;
    top: 0;
    width: 33.33333333%;
    height: 100%;
    border-left: 1rpx dashed rgba(255, 255, 255, 0.5);
    border-right: 1rpx dashed rgba(255, 255, 255, 0.5);
}
/* å››ä¸ªæ–¹å‘的线  ä¸ºäº†ä¹‹åŽçš„æ‹–动事件*/
.uni-cropper-line-t {
    position: absolute;
    display: block;
    width: 100%;
    background-color: #69f;
    top: 0;
    left: 0;
    height: 1rpx;
    opacity: 0.1;
    cursor: n-resize;
}
.uni-cropper-line-t::before {
    content: '';
    position: absolute;
    top: 50%;
    right: 0rpx;
    width: 100%;
    -webkit-transform: translate3d(0, -50%, 0);
    transform: translate3d(0, -50%, 0);
    bottom: 0;
    height: 41rpx;
    background: transparent;
    z-index: 11;
}
.uni-cropper-line-r {
    position: absolute;
    display: block;
    background-color: #69f;
    top: 0;
    right: 0rpx;
    width: 1rpx;
    opacity: 0.1;
    height: 100%;
    cursor: e-resize;
}
.uni-cropper-line-r::before {
    content: '';
    position: absolute;
    top: 0;
    left: 50%;
    width: 41rpx;
    -webkit-transform: translate3d(-50%, 0, 0);
    transform: translate3d(-50%, 0, 0);
    bottom: 0;
    height: 100%;
    background: transparent;
    z-index: 11;
}
.uni-cropper-line-b {
    position: absolute;
    display: block;
    width: 100%;
    background-color: #69f;
    bottom: 0;
    left: 0;
    height: 1rpx;
    opacity: 0.1;
    cursor: s-resize;
}
.uni-cropper-line-b::before {
    content: '';
    position: absolute;
    top: 50%;
    right: 0rpx;
    width: 100%;
    -webkit-transform: translate3d(0, -50%, 0);
    transform: translate3d(0, -50%, 0);
    bottom: 0;
    height: 41rpx;
    background: transparent;
    z-index: 11;
}
.uni-cropper-line-l {
    position: absolute;
    display: block;
    background-color: #69f;
    top: 0;
    left: 0;
    width: 1rpx;
    opacity: 0.1;
    height: 100%;
    cursor: w-resize;
}
.uni-cropper-line-l::before {
    content: '';
    position: absolute;
    top: 0;
    left: 50%;
    width: 41rpx;
    -webkit-transform: translate3d(-50%, 0, 0);
    transform: translate3d(-50%, 0, 0);
    bottom: 0;
    height: 100%;
    background: transparent;
    z-index: 11;
}
.uni-cropper-point {
    width: 5rpx;
    height: 5rpx;
    background-color: #69f;
    opacity: .75;
    position: absolute;
    z-index: 3;
}
.point-t {
    top: -3rpx;
    left: 50%;
    margin-left: -3rpx;
    cursor: n-resize;
}
.point-tr {
    top: -3rpx;
    left: 100%;
    margin-left: -3rpx;
    cursor: n-resize;
}
.point-r {
    top: 50%;
    left: 100%;
    margin-left: -3rpx;
    margin-top: -3rpx;
    cursor: n-resize;
}
.point-rb {
    left: 100%;
    top: 100%;
    -webkit-transform: translate3d(-50%, -50%, 0);
    transform: translate3d(-50%, -50%, 0);
    cursor: n-resize;
    width: 36rpx;
    height: 36rpx;
    background-color: #69f;
    position: absolute;
    z-index: 1112;
    opacity: 1;
}
.point-b {
    left: 50%;
    top: 100%;
    margin-left: -3rpx;
    margin-top: -3rpx;
    cursor: n-resize;
}
.point-bl {
    left: 0%;
    top: 100%;
    margin-left: -3rpx;
    margin-top: -3rpx;
    cursor: n-resize;
}
.point-l {
    left: 0%;
    top: 50%;
    margin-left: -3rpx;
    margin-top: -3rpx;
    cursor: n-resize;
}
.point-lt {
    left: 0%;
    top: 0%;
    margin-left: -3rpx;
    margin-top: -3rpx;
    cursor: n-resize;
}
/* è£å‰ªæ¡†é¢„览内容 */
.uni-cropper-viewer {
    position: relative;
    width: 100%;
    height: 100%;
    overflow: hidden;
}
.uni-cropper-viewer image {
    position: absolute;
    z-index: 2;
}
</style>
src/pages_mine/pages/help/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,109 @@
<template>
  <view class="help-container">
    <view v-for="(item, findex) in list" :key="findex" :title="item.title" class="list-title">
      <view class="text-title">
        <view :class="item.icon"></view>{{ item.title }}
      </view>
      <view class="childList">
        <view v-for="(child, zindex) in item.childList" :key="zindex" class="question" hover-class="hover"
          @click="handleText(child)">
          <view class="text-item">{{ child.title }}</view>
          <view class="line" v-if="zindex !== item.childList.length - 1"></view>
        </view>
      </view>
    </view>
  </view>
</template>
<script setup>
    import { ref } from "vue";
    const list =ref([{
            icon: 'iconfont icon-github',
            title: '若依问题',
            childList: [{
              title: '若依开源吗?',
              content: '开源'
            }, {
              title: '若依可以商用吗?',
              content: '可以'
            }, {
              title: '若依官网地址多少?',
              content: 'http://ruoyi.vip'
            }, {
              title: '若依文档地址多少?',
              content: 'http://doc.ruoyi.vip'
            }]
          },
          {
            icon: 'iconfont icon-help',
            title: '其他问题',
            childList: [{
              title: '如何退出登录?',
              content: '请点击[我的] - [应用设置] - [退出登录]即可退出登录',
            }, {
              title: '如何修改用户头像?',
              content: '请点击[我的] - [选择头像] - [点击提交]即可更换用户头像',
            }, {
              title: '如何修改登录密码?',
              content: '请点击[我的] - [应用设置] - [修改密码]即可修改登录密码',
            }]
          }
        ])
    function handleText(item) {
        uni.navigateTo({
            url: `/pages/common/textview/index?title=${item.title}&content=${item.content}`
        });
    }
</script>
<style lang="scss" scoped>
  page {
    background-color: #f8f8f8;
  }
  .help-container {
    margin-bottom: 100rpx;
    padding: 30rpx;
  }
  .list-title {
    margin-bottom: 30rpx;
  }
  .childList {
    background: #ffffff;
    box-shadow: 0px 0px 10rpx rgba(193, 193, 193, 0.2);
    border-radius: 16rpx;
    margin-top: 10rpx;
  }
  .line {
    width: 100%;
    height: 1rpx;
    background-color: #F5F5F5;
  }
  .text-title {
    color: #303133;
    font-size: 32rpx;
    font-weight: bold;
    margin-left: 10rpx;
    .iconfont {
      font-size: 16px;
      margin-right: 10rpx;
    }
  }
  .text-item {
    font-size: 28rpx;
    padding: 24rpx;
  }
  .question {
    color: #606266;
    font-size: 28rpx;
  }
</style>
src/pages_mine/pages/info/edit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
<template>
  <view class="container">
    <view class="example">
      <uni-forms ref="form" :model="user" labelWidth="80px">
        <uni-forms-item label="用户昵称" name="nickName">
          <uni-easyinput v-model="user.nickName" placeholder="请输入昵称" />
        </uni-forms-item>
        <uni-forms-item label="手机号码" name="phonenumber">
          <uni-easyinput v-model="user.phonenumber" placeholder="请输入手机号码" />
        </uni-forms-item>
        <uni-forms-item label="邮箱" name="email">
          <uni-easyinput v-model="user.email" placeholder="请输入邮箱" />
        </uni-forms-item>
        <uni-forms-item label="性别" name="sex" required>
          <uni-data-checkbox v-model="user.sex" :localdata="sexs" />
        </uni-forms-item>
      </uni-forms>
      <button type="primary" @click="submit">提交</button>
    </view>
  </view>
</template>
<script>
import { getUserProfile } from "@/api/system/user"
import { updateUserProfile } from "@/api/system/user"
export default {
  data() {
    return {
      user: {
        nickName: "",
        phonenumber: "",
        email: "",
        sex: ""
      },
      sexs: [{
        text: '男',
        value: "0"
      }, {
        text: '女',
        value: "1"
      }],
      rules: {
        nickName: {
          rules: [{
            required: true,
            errorMessage: '用户昵称不能为空'
          }]
        },
        phonenumber: {
          rules: [{
            required: true,
            errorMessage: '手机号码不能为空'
          }, {
            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
            errorMessage: '请输入正确的手机号码'
          }]
        },
        email: {
          rules: [{
            required: true,
            errorMessage: '邮箱地址不能为空'
          }, {
            format: 'email',
            errorMessage: '请输入正确的邮箱地址'
          }]
        }
      }
    }
  },
  onLoad() {
    this.getUser()
  },
  onReady() {
    this.$refs.form.setRules(this.rules)
  },
  methods: {
    getUser() {
      getUserProfile().then(response => {
        this.user = response.data
      })
    },
    submit(ref) {
      this.$refs.form.validate().then(res => {
        updateUserProfile(this.user).then(response => {
          uni.showToast({
            title: '修改成功',
            mask: false,
            duration: 1000
          });
          uni.navigateBack();
        })
      })
    }
  }
}
</script>
<style lang="scss">
page {
  background-color: #ffffff;
}
.example {
  padding: 15px;
  background-color: #fff;
}
.segmented-control {
  margin-bottom: 15px;
}
.button-group {
  margin-top: 15px;
  display: flex;
  justify-content: space-around;
}
.form-item {
  display: flex;
  align-items: center;
  flex: 1;
}
.button {
  display: flex;
  align-items: center;
  height: 35px;
  line-height: 35px;
  margin-left: 10px;
}
</style>
src/pages_mine/pages/info/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
<template>
  <view class="container">
    <uni-list>
      <uni-list-item showExtraIcon="true" :extraIcon="{ type: 'person-filled' }" title="昵称" :rightText="user.nickName" />
      <uni-list-item showExtraIcon="true" :extraIcon="{ type: 'phone-filled' }" title="手机号码"
        :rightText="user.phonenumber" />
      <uni-list-item showExtraIcon="true" :extraIcon="{ type: 'email-filled' }" title="邮箱" :rightText="user.email" />
      <uni-list-item showExtraIcon="true" :extraIcon="{ type: 'auth-filled' }" title="岗位" :rightText="postGroup" />
      <uni-list-item showExtraIcon="true" :extraIcon="{ type: 'staff-filled' }" title="角色" :rightText="roleGroup" />
      <uni-list-item showExtraIcon="true" :extraIcon="{ type: 'calendar-filled' }" title="创建日期"
        :rightText="user.createTime" />
    </uni-list>
    <u-button @click="register()">绑定微信</u-button>
  </view>
</template>
<script setup>
import { getUserProfile } from "@/api/system/user"
import { ref } from "vue";
import modal from "@/plugins/modal"
const user = ref({})
const roleGroup = ref("")
const postGroup = ref("")
function getUser() {
  getUserProfile().then(response => {
    user.value = response.data
    roleGroup.value = response.roleGroup
    postGroup.value = response.postGroup
  })
}
getUser()
import { wxRegister } from "@/api/oauth"
import { getWxCode } from "@/utils/geek"
function register(){
  modal.loading('绑定微信中...')
  getWxCode().then(res=>{
    wxRegister('miniapp',res).then(res=>{
      modal.closeLoading()
    })
  })
}
</script>
<style lang="scss">
page {
  background-color: #ffffff;
}
</style>
src/pages_mine/pages/pwd/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
<template>
  <view class="pwd-retrieve-container">
    <uni-forms ref="form" :value="user" labelWidth="80px">
      <uni-forms-item name="oldPassword" label="旧密码">
        <uni-easyinput type="password" v-model="user.oldPassword" placeholder="请输入旧密码" />
      </uni-forms-item>
      <uni-forms-item name="newPassword" label="新密码">
        <uni-easyinput type="password" v-model="user.newPassword" placeholder="请输入新密码" />
      </uni-forms-item>
      <uni-forms-item name="confirmPassword" label="确认密码">
        <uni-easyinput type="password" v-model="user.confirmPassword" placeholder="请确认新密码" />
      </uni-forms-item>
      <button type="primary" @click="submit">提交</button>
    </uni-forms>
  </view>
</template>
<script>
  import { updateUserPwd } from "@/api/system/user"
  export default {
    data() {
      return {
        user: {
          oldPassword: undefined,
          newPassword: undefined,
          confirmPassword: undefined
        },
        rules: {
          oldPassword: {
            rules: [{
              required: true,
              errorMessage: '旧密码不能为空'
            }]
          },
          newPassword: {
            rules: [{
                required: true,
                errorMessage: '新密码不能为空',
              },
              {
                minLength: 6,
                maxLength: 20,
                errorMessage: '长度在 6 åˆ° 20 ä¸ªå­—符'
              }
            ]
          },
          confirmPassword: {
            rules: [{
                required: true,
                errorMessage: '确认密码不能为空'
              }, {
                validateFunction: (rule, value, data) => data.newPassword === value,
                errorMessage: '两次输入的密码不一致'
              }
            ]
          }
        }
      }
    },
    onReady() {
      this.$refs.form.setRules(this.rules)
    },
    methods: {
      submit() {
        this.$refs.form.validate().then(res => {
          updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
            uni.showToast({
              title: '修改成功',
              mask: false,
              duration: 1000
            });
            uni.navigateBack();
          })
        })
      }
    }
  }
</script>
<style lang="scss">
  page {
    background-color: #ffffff;
  }
  .pwd-retrieve-container {
    padding-top: 36rpx;
    padding: 15px;
  }
</style>
src/pages_mine/pages/setting/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
<template>
  <view class="setting-container" :style="{ height: `${windowHeight}px` }">
    <view class="menu-list">
      <view class="list-cell list-cell-arrow" @click="handleToPwd">
        <view class="menu-item-box">
          <view class="iconfont icon-password menu-icon"></view>
          <view>修改密码</view>
        </view>
      </view>
      <view class="list-cell list-cell-arrow" @click="handleToUpgrade">
        <view class="menu-item-box">
          <view class="iconfont icon-refresh menu-icon"></view>
          <view>检查更新</view>
        </view>
      </view>
      <view class="list-cell list-cell-arrow" @click="handleCleanTmp">
        <view class="menu-item-box">
          <view class="iconfont icon-clean menu-icon"></view>
          <view>清理缓存</view>
        </view>
      </view>
    </view>
    <view class="cu-list menu">
      <view class="cu-item item-box">
        <view class="content text-center" @click="handleLogout">
          <text class="text-black">退出登录</text>
        </view>
      </view>
    </view>
  </view>
  <view>
    <uni-popup ref="popup" type="dialog">
      <uni-popup-dialog type="info" cancelText="关闭" confirmText="退出" title="通知" content="确定注销并退出系统吗"
        @confirm="dialogConfirm" @close="dialogClose">
      </uni-popup-dialog>
    </uni-popup>
  </view>
</template>
<script setup>
import { ref } from "vue";
import useUserStore from '@/store/modules/user'
const userStore = useUserStore()
const windowHeight = ref(uni.getSystemInfoSync().windowHeight);
const popup = ref(null);
function handleToPwd() {
  uni.navigateTo({
    url: '/pages/mine/pwd/index'
  });
};
function handleToUpgrade() {
  uni.showToast({
    title: '模块建设中~',
    mask: false,
    icon: "none",
    duration: 1000
  });
};
function handleCleanTmp() {
  uni.showToast({
    title: '模块建设中~',
    mask: false,
    icon: "none",
    duration: 1000
  });
};
function handleLogout() {
  popup.value.open();
};
function dialogConfirm() {
  //console.log('----------------点击确认------------')
  userStore.logOut().then(() => {
    uni.reLaunch({
      url: '/pages/login'
    });
  })
};
function dialogClose() {
  //console.log('点击关闭')
};
</script>
<style lang="scss" scoped>
.page {
  background-color: #f8f8f8;
}
.item-box {
  background-color: #FFFFFF;
  margin: 30rpx;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
  padding: 10rpx;
  border-radius: 8rpx;
  color: #303133;
  font-size: 32rpx;
}
</style>
src/pages_qiun/components/card-swiper/card-swiper.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
<template>
    <view>
        <view class="top-swiper">
            <view class="box">
                <view style="height: 44px;"></view>
                <swiper class="swiper" :previous-margin="swiper.margin" :next-margin='swiper.margin' :circular="true"
                    @change="swiperChange">
                    <swiper-item v-for="(item,index) in card_menu" :key="index" @click="toUrl(item.url)">
                        <!-- <image class='le-img' :src='item' :class="{'le-active':swiper.index == index}"></image> -->
                        <view class="le-img" :class="{'le-active':swiper.index == index}">
                            <view class="img_box">
                                <image class="card_img" :src="item.img" mode="aspectFill"></image>
                            </view>
                            <view class="detail_box">
                                <view class="title_box">{{item.title}}</view>
                                <view class="author_box">By:{{item.author}}</view>
                            </view>
                        </view>
                    </swiper-item>
                </swiper>
            </view>
        </view>
    </view>
</template>
<script>
    import Common from '../../static/js/common'
    export default {
        props: {
            card_menu: {
                type: Array,
                default: []
            }
        },
        data() {
            return {
                swiper: {
                    margin: "150rpx",
                    index: 0,
                    list: [
                        "/static/images/douyin/0.jpg",
                        "/static/images/douyin/4.jpg",
                        "/static/images/douyin/7.jpg",
                    ]
                }
            }
        },
        components: {
        },
        mounted() {
        },
        methods: {
            //swiper滑动事件
            swiperChange: function(e) {
                this.swiper.index = e.detail.current;
            },
            toUrl(url){
                Common.navigateTo(url);
            }
        }
    }
</script>
<style lang="scss">
    .top-swiper {
        margin-bottom: 30rpx;
        .box {
            padding-top: var(--status-bar-height);
            box-sizing: content-box;
            position: absolute;
            z-index: 5;
            top: 0;
            left: 0;
            width: 100%;
            height: auto;
        }
        .swiper {
            height: 600rpx;
            margin: 0 20rpx;
            .le-img {
                width: 100%;
                height: 100%;
                display: block;
                transform: scale(0.9);
                transition: transform 0.3s ease-in-out 0s;
                border-radius: 10px;
                background-color: #fff;
                overflow: hidden;
                &.le-active {
                    transform: scale(1);
                }
                .img_box {
                    width: 100%;
                    height: 65%;
                    overflow: hidden;
                    .card_img {
                        height: 100%;
                        width: 100%;
                    }
                }
                .detail_box {
                    width: 100%;
                    height: 35%;
                    overflow: hidden;
                    .title_box {
                        width: 100%;
                        text-align: center;
                        font-size: 40rpx;
                        margin: 30rpx 0;
                    }
                    .author_box {
                        width: 100%;
                        text-align: center;
                        font-size: 30rpx;
                        position: relative;
                        height: 80rpx;
                        line-height: 80rpx;
                        &::before {
                            content: "";
                            height: 1px;
                            width: 150rpx;
                            position: absolute;
                            transform: translateX(-50%);
                            left: 50%;
                            top: 0;
                            background: #000;
                        }
                    }
                }
            }
        }
    }
</style>
src/pages_qiun/components/data-center/user-healthy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,141 @@
<template>
    <view class="content">
        <scroll-view v-if="true" scroll-y class="data_body" :style="{height:scrollHeight}">
            <!--数据进度条-->
            <view class="progress">
                <data-progress :progressList="userHealthyLineBar" :borderRadius="20" padMiddle="true"></data-progress>
            </view>
            <view class="split_line"></view>
            <!-- æ–°å¢žå°ç¨‹åºä¼šå‘˜è¶‹åŠ¿-->
            <view class="friend_operate">
                <text-block :content="baseData"></text-block>
                <view class="trend_title">新增小程序会员趋势</view>
                <view class="charts-box">
                  <qiun-data-charts
                  type="mix"
                  canvasId="three_a"
                  :canvas2d="isCanvas2d"
                  :reshow="delayload"
                  :opts="{yAxis:{data:[{position: 'left',title: '销售额/万',max:userTrand?userTrand.yAxis[0].max:0,min:userTrand?userTrand.yAxis[0].min:0},{position: 'right',title: '',max:userTrand?userTrand.yAxis[1].max:0,min:userTrand?userTrand.yAxis[1].min:0,unit:'%'}]}}"
                  :chartData="userTrand"/>
                </view>
            </view>
            <view class="split_line"></view>
            <!-- ä¼šå‘˜æ‰«ç çŽ‡è¶‹åŠ¿-->
            <view class="friend_operate">
                <text-block :content="scanTrand"></text-block>
                <view class="trend_title">会员扫码率趋势</view>
                <view class="charts-box">
                  <qiun-data-charts
                  type="mix"
                  canvasId="three_b"
                  :canvas2d="isCanvas2d"
                  :reshow="delayload"
                  :opts="{yAxis:{data:[{position: 'left',title: '',max:scanTrandPrecent?scanTrandPrecent.yAxis[0].max:0,min:scanTrandPrecent?scanTrandPrecent.yAxis[0].min:0,unit:'%'}]}}"
                  :chartData="scanTrandPrecent"/>
                </view>
            </view>
            <view class="split_line"></view>
            <!-- å°ç¨‹åºæ´»è·ƒä¼šå‘˜å æ¯”-->
            <view class="friend_operate">
                <text-block :content="miniActive"></text-block>
                <view class="charts-box">
                  <qiun-data-charts
                  type="mix"
                  canvasId="three_c"
                  :canvas2d="isCanvas2d"
                  :reshow="delayload"
                  :opts="{yAxis:{data:[{position: 'left',title: '销售额/万',max:miniActivePrecent?miniActivePrecent.yAxis[0].max:0,min:miniActivePrecent?miniActivePrecent.yAxis[0].min:0},{position: 'right',title: '',max:miniActivePrecent?miniActivePrecent.yAxis[1].max:0,min:miniActivePrecent?miniActivePrecent.yAxis[1].min:0,unit:'%'}]}}"
                  :chartData="miniActivePrecent"
                  />
                </view>
            </view>
        </scroll-view>
        <view  v-else class="container padding_stand-big normal_color">
            <li class="iconfont icon-cry cry"></li>暂无数据
        </view>
    </view>
</template>
<script>
    import DataProgress from "../data-progress/data-progress.vue"
    import userHealthyLineBar from '../../static/json/user-healthy/1.json';
    import baseData from '../../static/json/user-healthy/2.json';
    import userTrand from '../../static/json/user-healthy/3.json';
    import scanTrand from '../../static/json/user-healthy/4.json';
    import scanTrandPrecent from '../../static/json/user-healthy/5.json';
    import miniActive from '../../static/json/user-healthy/6.json';
    import miniActivePrecent from '../../static/json/user-healthy/7.json';
    import Config from '../../static/js/config'
    var _self;
    export default {
        name:'user-healthy',
        props: {
            scrollHeight:{
                type:String,
                default:"600px"
            }
        },
        components:{
            DataProgress
        },
        data() {
            return {
                userHealthyLineBar,
                baseData,
                userTrand,
                scanTrand,
                scanTrandPrecent,
                miniActive,
                miniActivePrecent,
                delayload:false,
                isCanvas2d:Config.ISCANVAS2D,
            }
        },
        mounted() {
            this.getData();
        },
        methods:{
            async getData(){
                uni.showLoading();
                await setTimeout(() => {
                    this.delayload = true;
                    uni.hideLoading();
                }, 1000)
            }
        }
    }
</script>
<style scoped lang="less">
    .content{
        padding-top: 10rpx;
        .progress,.firend_operate{
            padding: 0 10rpx;
        }
        .progress{
            margin-bottom: 20rpx;
        }
        .friend_operate{
            padding: 30rpx 10rpx;
            .title{
                text-align:left;
                margin-bottom: 20rpx;
            }
            .trend_title{
                text-align: right;
                font-size: 22rpx;
                color: #ff9900;
                margin-top: 20rpx;
            }
        }
    }
</style>
src/pages_qiun/components/data-center/user-operate.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,200 @@
<template>
    <view class="content">
        <scroll-view v-if="true" scroll-y class="data_body" :style="{height:scrollHeight}">
            <!--数据进度条-->
            <view class="progress">
                <data-progress :progressList="userOperateLineBar" :borderRadius="20" padMiddle="true"></data-progress>
            </view>
            <view class="split_line"></view>
            <!-- æ´»è·ƒä¼šå‘˜-->
            <view class="friend_operate">
                <view class="title">活跃会员</view>
                <text-block :content="userActive"></text-block>
            </view>
            <!-- ä¼šå‘˜æ¶ˆè´¹ -->
            <view class="friend_operate"  style="padding-bottom: 30rpx;">
                <view class="title">会员消费</view>
                <text-block :content="userConsume"></text-block>
            </view>
            <view class="split_line"></view>
            <!-- ä¼šå‘˜ARPU -->
            <view class="friend_operate">
                <view class="title">会员ARPU
                    <text class="font-small">(会员年度平均销售金额)</text>
                    <text class="trend_title">目标增量{{userARPU.targetAdd}}</text>
                </view>
                <view class="charts-box">
                    <qiun-data-charts type="mix"
                        :chartData="userARPU"
                        :reshow="delayload"
                        :canvas2d="isCanvas2d"
                        canvasId="two_a"
                        :opts="{yAxis:{data:[{title: '',max:userARPU?userARPU.yAxis[0].max:0,min:userARPU?userARPU.yAxis[0].min:0},{title: '',unit:'%',max:userARPU?userARPU.yAxis[1].max:0,min:userARPU?userARPU.yAxis[1].min:0,position:'right'}]},extra:{markLine:{data:[{value:userARPU?userARPU.target:'',LineColor:'#ff9900',showLabel:true}]}}}"/>
                </view>
            </view>
            <view class="split_line"></view>
            <!-- ä¼šå‘˜æ¶ˆè´¹é¢‘次 -->
            <view class="friend_operate">
                <view class="title">会员消费频次
                    <text class="font-middle">(å¹´)</text>
                    <text class="trend_title">目标增量{{userARPU.targetAdd}}</text>
                </view>
                <view class="charts-box">
                        <qiun-data-charts type="mix"
                            :chartData="userARPU"
                            :reshow="delayload"
                            :canvas2d="isCanvas2d"
                            canvasId="two_b"
                            :opts="{yAxis:{data:[{title: '',max:userARPU?userARPU.yAxis[0].max:0,min:userARPU?userARPU.yAxis[0].min:0},{title: '',unit:'%',max:userARPU?userARPU.yAxis[1].max:0,min:userARPU?userARPU.yAxis[1].min:0,position:'right'}]},extra:{markLine:{data:[{value:userARPU?userARPU.target:'',LineColor:'#ff9900',showLabel:true}]}}}"/>
                </view>
            </view>
            <view class="split_line"></view>
            <!-- å¾®å®¢ç¾¤è¿è¥-->
            <view class="friend_operate">
                <view class="title">活跃会员分布
                    <text class="font-middle">(最近活跃时间)</text>
                </view>
                <senior-table :headers="dataTable.headers" :contents="dataTable.contents" :urlCol="dataTable.urlCol" :firstLineFixed="true" :sortCol="dataTable.sortCol" :computedCol="dataTable.computedCol" :formatCol="dataTable.formatCol"></senior-table>
            </view>
            <view class="split_line"></view>
            <!-- X商品脱落率-->
            <view class="friend_operate">
                <view class="title">
                    X(慢病) å•†å“è„±è½çއ
                </view>
                <view style="display: flex;justify-content: space-between;">
                    <view v-for="(item,index) in xProductDropPrecent" class="charts-box" style="height: 130px;width: 45%;">
                        <qiun-data-charts
                            type="arcbar"
                            :chartData="item"
                            :canvasId="'two_c_'+ index"
                            :canvas2d="true"
                            :reshow="delayload"
                            :opts="{title:{name:item.series[0].data * 100 + '%',color:item.series[0].color,fontSize:25},subtitle:{name:item.series[0].name,color:'#666666',fontSize:12}}" />
                    </view>
                </view>
            </view>
            <!-- æ…¢ç—…病种脱落率-->
            <view class="friend_operate">
                <view class="title">慢病病种脱落率
                </view>
                <view class="charts-box">
                    <qiun-data-charts type="mix"
                        :chartData="illnessDropPrecent"
                        :reshow="delayload"
                        :canvas2d="true"
                        canvasId="two_d"
                        :opts="{yAxis:{data:[{title: ''}]}}"/>
                </view>
            </view>
            <!-- W商品脱落率-->
            <view class="friend_operate">
                <view class="title">
                    W(保健) å•†å“è„±è½çއ
                </view>
                <view style="display: flex;justify-content: space-between;">
                    <view v-for="(item,index) in wProductDropPrecent" class="charts-box" style="height: 130px;width: 45%;">
                        <qiun-data-charts
                            type="arcbar"
                            :chartData="item"
                            :canvasId="'two_e_'+index"
                            :canvas2d="true"
                            :reshow="delayload"
                            :opts="{title:{name:item.series[0].data * 100 + '%',color:item.series[0].color,fontSize:25},subtitle:{name:item.series[0].name,color:'#666666',fontSize:12}}" />
                    </view>
                </view>
            </view>
        </scroll-view>
        <view  v-else class="container padding_stand-big normal_color">
            <li class="iconfont icon-cry cry"></li>暂无数据
        </view>
    </view>
</template>
<script>
    import DataProgress from "../data-progress/data-progress.vue"
    import SeniorTable from "../data-table/senior-table.vue"
    import userOperateLineBar from '../../static/json/user-operate/1.json';
    import userActive from '../../static/json/user-operate/2.json';
    import userConsume from '../../static/json/user-operate/3.json';
    import userARPU from '../../static/json/user-operate/4.json';
    import dataTable from "../../static/json/user-operate/6.json"
    import xProductDropPrecent from '../../static/json/user-operate/7.json';
    import wProductDropPrecent from '../../static/json/user-operate/9.json';
    import illnessDropPrecent from '../../static/json/user-operate/8.json';
    export default {
        name:'user-operate',
        props: {
            scrollHeight:{
                type:String,
                default:"600px"
            }
        },
        components:{
            DataProgress,SeniorTable
        },
        data() {
            return {
                userOperateLineBar,
                userActive,
                userConsume,
                userARPU,
                xProductDropPrecent,
                wProductDropPrecent,
                illnessDropPrecent,
                dataTable,
                delayload:false,
                isCanvas2d:Config.ISCANVAS2D
            }
        },
        mounted() {
            this.getData();
        },
        methods:{
            async getData(){
                uni.showLoading();
                await setTimeout(() => {
                    this.delayload = true;
                    uni.hideLoading();
                }, 1000)
            }
        }
    }
</script>
<style scoped lang="less">
    .content{
        padding-top: 10rpx;
        .progress,.firend_operate{
            padding: 0 10rpx;
        }
        .progress{
            margin-bottom: 20rpx;
        }
        .friend_operate{
            padding: 30rpx 20rpx;
            .title{
                text-align:left;
                margin-bottom: 30rpx;
                font-size: 40rpx;
            }
            .trend_title{
                float: right;
                font-size: 22rpx;
                color: #ff9900;
                margin-top: 20rpx;
            }
        }
    }
</style>
src/pages_qiun/components/data-center/user-server.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,385 @@
<template>
    <view class="content">
        <scroll-view class="data_body" scroll-y :style="{height:scrollHeight}">
            <template v-if="true">
                <!-- ä¼šå‘˜æˆé•¿æ•°æ®-->
                <view class="view_item">
                    <view class="title">会员成长数据</view>
                    <view class="progress_circle">
                        <view v-for="(item,index) in CircleData" :key="index" :class="['progress_block','block_'+index]">
                            <view class="name">{{item.series[0].name}}</view>
                            <view class="value">{{item.series[0].value}}</view>
                            <view class="charts-box arcbar" style="height: 180rpx;width: 60%;">
                                <qiun-data-charts type="arcbar" :chartData="item" :canvasId="'four_a_'+index" :canvas2d="isCanvas2d"
                                    :resshow="delayload"
                                    :opts="{title:{name:item.series[0].precent,color:item.series[0].color,fontSize:15},subtitle:{name:'',color:'#666666',fontSize:12},extra:{arcbar:{backgroundColor:item.series[0].backgroundColor}}}" />
                            </view>
                            <view class="planet">
                                <view class="planet_shadow"></view>
                                <view class="crater1"></view>
                                <view class="crater2"></view>
                                <view class="crater3"></view>
                                <view class="crater4"></view>
                            </view>
                            <view class="star" :class="['star'+index]"></view>
                            <view class="star pink" :class="['star'+index]"></view>
                            <view class="star blue" :class="['star'+index]"></view>
                            <view class="star yellow" :class="['star'+index]"></view>
                        </view>
                    </view>
                </view>
                <view class="split_line"></view>
                <!-- ä¼šå‘˜æ•°æ®æ¥æº -->
                <view class="friend_operate">
                    <view class="title">会员数据来源
                        <text class="font-small" style="color: #ff9900;">(Top5访问来源)</text>
                    </view>
                    <view v-if="delayload" class="charts-box">
                        <qiun-data-charts
                        type="ring"
                        canvasId="four_b"
                        :canvas2d="isCanvas2d"
                        :resshow="delayload"
                        :opts="{legend:{position: 'bottom'},title:{name: '',},subtitle: {name: ''}}"
                        :chartData="ProductRateData"/>
                    </view>
                </view>
                <view class="split_line"></view>
                <!-- æœåŠ¡è¯„ä»·æ¦‚è§ˆ-->
                <view class="friend_operate">
                    <view class="title">服务评价概览</view>
                    <text-block :content="ServiceComment"></text-block>
                </view>
                <!-- æœ¬å‘¨ä¼šå‘˜è®¿é—®è¶‹åŠ¿å›¾ -->
                <view class="friend_operate">
                    <view class="title">本周会员访问趋势图</view>
                    <view v-if="delayload" class="charts-box" style="height: 300px;">
                        <qiun-data-charts
                            type="mix"
                            canvasId="four_c"
                            :canvas2d="isCanvas2d"
                            :resshow="delayload"
                            :opts="{yAxis:{data:[{position: 'left',title: '',min:0,unit:'万'}]}}"
                            :chartData="TrendData"
                        />
                    </view>
                </view>
                <view class="split_line"></view>
                <!-- æ–°å¢žä¼šå‘˜æŽ’行榜 -->
                <view class="friend_operate">
                    <view class="title">新增会员排行榜</view>
                    <progress-bar :isRank="isRank" :content="RankData" />
                </view>
            </template>
            <template v-else>
                <view class="container padding_stand-big normal_color">
                    <li class="iconfont icon-cry cry"></li>暂无数据
                </view>
            </template>
        </scroll-view>
    </view>
</template>
<script>
    import ProgressBar from "../progress-bar/progress-bar.vue"
    import CircleData from "../../static/json/user-server/1.json"
    import ProductRateData from '../../static/json/user-server/2.json';
    import TrendData from '../../static/json/user-server/3.json';
    import ServiceComment from '../../static/json/user-server/4.json';
    import RankData from '../../static/json/user-server/5.json';
    import Config from '../../static/js/config'
    export default {
        name:"user-server",
        props:{
            scrollHeight:{
                type:String,
                default:"600px"
            }
        },
        components:{
            ProgressBar
        },
        data(){
            return {
                CircleData,
                TrendData,
                ProductRateData,
                ServiceComment,
                RankData,
                isRank:true,
                isCanvas2d:Config.ISCANVAS2D,
                delayload: false, //延时加载图表,否则会出现图表加载完后定位错乱
            }
        },
        methods:{
            async getData(){
                uni.showLoading();
                await setTimeout(() => {
                    this.delayload = true;
                    uni.hideLoading();
                }, 1000)
            }
        },
        mounted() {
            this.getData();
        }
    }
</script>
<style scoped lang="scss">
    .content{
        padding-top: 10rpx;
    }
    .data_body{
        height: 100%;
        text-align: center;
        color: #333333;
        background-repeat: repeat;
        background-color: #ffffff;
        .friend_operate{
            padding: 30rpx 20rpx;
            .title{
                text-align:left;
                margin-bottom: 30rpx;
                font-size: 40rpx;
            }
        }
        .view_item{
            padding: 30rpx 20rpx;
            .title{
                text-align:left;
                margin-bottom: 30rpx;
                font-size: 40rpx;
            }
        }
        .progress_circle{
            display: flex;
            flex-wrap: wrap;
            justify-content: space-around;
            align-items: center;
            height: 450rpx;
            .progress_block{
                width: 45%;
                border-radius: 20rpx;
                height: 180rpx;
                position: relative;
                overflow: hidden;
                .name{
                    color: #fff;
                    font-size: 24rpx;
                    position: absolute;
                    top: 20rpx;
                    left: 10rpx;
                    max-width: 144rpx;
                }
                .value{
                    color: #fff;
                    font-size: 40rpx;
                    position: absolute;
                    top: 64rpx;
                    left: 10rpx;
                    max-width: 144rpx;
                }
                .circle{
                    position: absolute;
                    right: 8rpx;
                    top: 16rpx;
                }
                .arcbar{
                    position: absolute;
                    right: -4rpx;
                    top: 8rpx;
                }
            }
            .block_0{
                background-color: #0FC3FF;
            }
            .block_1{
                background-color: #FF6B8B;
            }
            .block_2{
                background-color: #FFCB1D;
            }
            .block_3{
                background-color: #3BDCAA;
            }
        }
    }
    .planet {
        width: 60px;
        height: 60px;
        border-radius: 50%;
        background: #333;
        position: absolute;
        left: -13px;
        bottom: -26px;
        overflow: hidden;
        opacity: 0.5;
        z-index: 0;
    }
    .planet_shadow {
        position: absolute;
        border-radius: 50%;
        height: 100%;
        width: 100%;
        top: -40%;
        right: -10%;
        border: 35px solid rgba(0, 0, 0, .15);
    }
    .crater1,
    .crater2,
    .crater3,
    .crater4 {
        position: absolute;
        border-radius: 50%;
        background: rgba(0, 0, 0, .3);
        box-shadow: inset 3px 3px 0 rgba(0, 0, 0, .2);
    }
    .crater1 {
        width: 20px;
        height: 20px;
        left: 25%;
        top: 20%;
    }
    .crater2 {
        width: 10px;
        height: 10px;
        left: 50%;
        top: 60%;
    }
    .crater3 {
        width: 15px;
        height: 15px;
        left: 30%;
        top: 65%;
    }
    .crater4 {
        width: 15px;
        height: 15px;
        left: 60%;
        top: 35%;
    }
    .star {
        display: block;
        width: 5px;
        height: 5px;
        border-radius: 50%;
        background: #FFF;
        top: 10px;
        left: 50px;
        position: relative;
        transform-origin: 100% 0;
        box-shadow: 0 0 5px 5px rgba(255, 255, 255, .3);
        opacity: 0;
        z-index: 2;
    }
    .star0{
        animation: star-ani 4s infinite ease-out;
    }
    .star1{
        animation: star-ani 5s infinite ease-out;
    }
    .star2{
        animation: star-ani 6s infinite ease-out;
    }
    .star3{
        animation: star-ani 7s infinite ease-out;
    }
    .star:after {
        content: '';
        display: block;
        top: 20px;
        left: 60px;
        border: 0px solid #fff;
        border-width: 0px 90px 2px 90px;
        border-color: transparent transparent transparent rgba(255, 255, 255, .3);
        transform: rotate(-45deg) translate3d(1px, 3px, 0);
        box-shadow: 0 0 1px 0 rgba(255, 255, 255, .1);
        transform-origin: 0% 100%;
        animation: shooting-ani 100s infinite ease-out;
    }
    .pink {
        top: 10px;
        left: 60px;
        background: #ff5a99;
        animation-delay: 5s;
        -webkit-animation-delay: 5s;
        -moz-animation-delay: 5s;
    }
    .pink:after {
        border-color: transparent transparent transparent #ff5a99;
        animation-delay: 5s;
        -webkit-animation-delay: 5s;
        -moz-animation-delay: 5s;
    }
    .blue {
        top: 15px;
        left: 70px;
        background: cyan;
        animation-delay: 7s;
        -webkit-animation-delay: 7s;
        -moz-animation-delay: 7s;
    }
    .blue:after {
        border-color: 'transpareanimation-delay: 12s';
        -webkit-animation-delay: 7s;
        -moz-animation-delay: 7s;
        animation-delay: 7s;
    }
    .yellow {
        top: 0px;
        left: 80px;
        background: #ffcd5c;
        animation-delay: 5.8s;
    }
    .yellow:after {
        border-color: transparent transparent transparent #ffcd5c;
        animation-delay: 5.8s;
    }
    @keyframes star-ani {
        0% {
            opacity: 0;
            transform: scale(0) rotate(0) translate3d(0, 0, 0);
            -webkit-transform: scale(0) rotate(0) translate3d(0, 0, 0);
            -moz-transform: scale(0) rotate(0) translate3d(0, 0, 0);
        }
        50% {
            opacity: 0.5;
            transform: scale(1) rotate(0) translate3d(-20px, 20px, 0);
            -webkit-transform: scale(1) rotate(0) translate3d(-20px, 20px, 0);
            -moz-transform: scale(1) rotate(0) translate3d(-20px, 20px, 0);
        }
        100% {
            opacity: 0;
            transform: scale(1) rotate(0) translate3d(-30px, 30px, 0);
            -webkit-transform: scale(1) rotate(0) translate3d(-30px, 30px, 0);
            -moz-transform: scale(1) rotate(0) translate3d(-30px, 30px, 0);
        }
    }
</style>
src/pages_qiun/components/data-center/wechat.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
<template>
    <view class="content">
        <scroll-view v-if="true" scroll-y class="data_body" :style="{height:scrollHeight}">
            <!--数据进度条-->
            <view class="progress">
                <data-progress :progressList="wechatLineBar" :borderRadius="20" padMiddle="true"></data-progress>
            </view>
            <view class="split_line"></view>
            <!-- å¾®å¥½å‹è¿è¥-->
            <view class="friend_operate">
                <view class="title">微好友运营</view>
                <text-block :content="friendTextBlock"></text-block>
                <view style="display: flex;justify-content: space-around;">
                    <view v-for="(item,index) in panelData" :key="index" class="charts-box"
                        style="width: 45%;height: 200px;">
                        <qiun-data-charts type="gauge"
                            :opts="{title:{name: item.series[0].data * 100 + '%',color: '#24ABFD',offsetY:30},subtitle: {name: item.series[0].name,color: '#666666',fontSize: 15,offsetY:70},extra:{gauge:{type:'progress',width:20,splitLine:{fixRadius:-10,width:15,},}}}"
                            :chartData="item" :reshow="delayload" :canvas2d="isCanvas2d" :canvasId="'one_a_' + index" />
                    </view>
                </view>
                <view class="trend_title">新增微好友&小程序会员趋势</view>
                <view class="charts-box">
                    <qiun-data-charts type="mix" :chartData="friendTrand" :reshow="delayload"
                        :canvas2d="isCanvas2d" canvasId="one_b" :opts="{yAxis:{data:[{title: ''}]}}" />
                </view>
            </view>
            <view class="split_line"></view>
            <!-- å¾®å®¢ç¾¤è¿è¥-->
            <view class="friend_operate">
                <view class="title">微客群运营</view>
                <text-block :content="friendTextBlock"></text-block>
                <view class="trend_title">新增人群&退群人数趋势</view>
                <view class="charts-box">
                    <qiun-data-charts type="mix" :chartData="teamTrand" :reshow="delayload" :canvas2d="isCanvas2d"
                        canvasId="one_c" :opts="{yAxis:{data:[{title: '',max:teamTrand?teamTrand.yAxis[0].max:0,min:teamTrand?teamTrand.yAxis[0].min:0}]}}" />
                </view>
            </view>
            <view class="split_line"></view>
            <!-- å®¢æˆ·è”ç³»-->
            <view class="friend_operate">
                <view class="title">【客户联系】1对1运营执行</view>
                <senior-table :headers="dataTable.headers" :contents="dataTable.contents" :urlCol="dataTable.urlCol" :firstLineFixed="true" :sortCol="dataTable.sortCol"></senior-table>
            </view>
        </scroll-view>
        <view  v-else class="container padding_stand-big normal_color">
            <li class="iconfont icon-cry cry"></li>暂无数据
        </view>
    </view>
</template>
<script>
    import DataProgress from "../data-progress/data-progress.vue"
    import SeniorTable from "../data-table/senior-table.vue"
    import wechatLineBar from '../../static/json/wechat/1.json';
    import friendTextBlock from '../../static/json/wechat/2.json';
    import panelData from '../../static/json/wechat/3.json';
    import friendTrand from '../../static/json/wechat/4.json';
    import teamTrand from '../../static/json/wechat/5.json';
    import dataTable from "../../static/json/wechat/6.json"
    import Config from '../../static/js/config'
    export default {
        name:'wechat',
        props: {
            scrollHeight:{
                type:String,
                default:"600px"
            }
        },
        components:{
            DataProgress,
            SeniorTable,
        },
        data() {
            return {
                wechatLineBar,
                friendTextBlock,
                friendTrand,
                panelData,
                teamTrand,
                dataTable,
                scrollTop: 0,
                delayload: false,
                isCanvas2d: Config.ISCANVAS2D,
            }
        },
        mounted() {
            this.getData();
        },
        methods:{
            async getData() {
                uni.showLoading();
                await setTimeout(() => {
                    this.delayload = true;
                    uni.hideLoading();
                }, 1000)
            }
        }
    }
</script>
<style scoped lang="less">
    .content{
        padding-top: 10rpx;
        .progress,.firend_operate{
            padding: 0 10rpx;
        }
        .progress{
            margin-bottom: 20rpx;
        }
        .friend_operate{
            padding: 30rpx 20rpx;
            .title{
                text-align:left;
                margin-bottom: 30rpx;
                font-size: 40rpx;
            }
            .trend_title{
                text-align: right;
                font-size: 22rpx;
                color: #ff9900;
                margin-top: 50rpx;
            }
        }
    }
</style>
src/pages_qiun/components/data-progress/data-progress.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
<template>
    <view class="column">
        <view v-for="(item,index) in progressList" :key="index" :class="['row','font-small','progress',padMiddle?'paddingMiddle':'']">
            <text class="title">{{item.name}}</text>
            <view class="body">
                <view class="number">{{item.now?item.now+"/":""}}{{item.expect}} [{{item.value}}%]</view>
                <progress :percent="item.value" backgroundColor="#C9C9C9"
                :border-radius="borderRadius?borderRadius+'rpx':'0px'"
                :color="time"
                stroke-width="16" />
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        name:'data-progress',
        props: {
            progressList: {
                type: Array,
                default: ()=> {
                    return []
                }
            },
            borderRadius:{
                type:Number,
                default:0
            },
            padMiddle:{
                type:String,
                default:"false"
            }
        },
        data() {
            return {
                time:0
            }
        },
        watch:{
            "progressList":{
                deep: true,
                handler: function(newVal, oldVal) {
                    this.time = newVal.filter(x=>x.name=="时间进度")[0].value;
                }
            }
        },
        created() {
            this.time = this.progressList.filter(x=>x.name=="时间进度")[0].value;
        }
    }
</script>
<style lang="scss">
    .paddingMiddle{
        padding: 18rpx 10rpx;
    }
    .progress{
        .title{
            font-size: 28rpx;
            width: 170rpx;
            display: flex;
            align-items: center;
        }
        .body{
            position: relative;
            flex: 1;
            .number{
                color: #fff;
                position: absolute;
                z-index: 2;
                left: 26rpx;
                height: 100%;
                display: flex;
                align-items: center;
                text-overflow: ellipsis;
                white-space: nowrap;
                overflow: hidden;
                height: 44rpx;
            }
            progress{
                padding: 6rpx 0;
            }
        }
    }
</style>
src/pages_qiun/components/data-table/senior-table.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1117 @@
<template>
    <view class="wyb-table-box">
        <view v-if="loading" class="wyb-table-loading-box" :style="{
            width: width === 'auto' ? screenWidth : width,
            height: height === 'auto' ? '300rpx' : height,
            backgroundColor: loaderBgColor,
            borderTop: '1px solid' + borderColor,
            borderBottom: '1px solid' + borderColor,
            borderLeft: showLeftAndRightBorder ? '1px solid' + borderColor : 'none',
            borderRight: showLeftAndRightBorder ? '1px solid' + borderColor : 'none'}">
            <view class="loader-one" :style="{
                 width: loaderSize + 'rpx',
                 height: loaderSize + 'rpx',
                 borderTop: '3px solid ' + loadingColor.top,
                 borderRight: '3px solid ' + loadingColor.right,
                 borderBottom: '3px solid ' + loadingColor.bottom,
                 borderLeft: '3px solid ' + loadingColor.left}" />
        </view>
        <view v-if="!loading" class="wyb-table-scroll-view" :style="{
            width: width,
            height: height,
            borderTop: '1px solid' + borderColor,
            borderLeft: showLeftAndRightBorder ? '1px solid' + borderColor : 'none',
            borderRight: showLeftAndRightBorder ? '1px solid' + borderColor : 'none'}">
            <view class="wyb-table-header" :style="{borderBottom: '1px solid' + borderColor}">
                <view class="wyb-table-header-item" v-if="enableCheck" :style="{
                     minWidth: checkColWidth + 'rpx',
                     maxWidth: checkColWidth + 'rpx',
                     minHeight: minHeight[0] + 'rpx',
                     textAlign: textAlign,
                     justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
                     fontSize: fontSize[0] + 'rpx',
                     color: headerFtColor,
                     padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
                     backgroundColor: headerBgColor,
                     borderRight: '1px solid' + borderColor,
                     zIndex: 30,
                     left: 0,
                     color: headerFtColor,
                     backgroundColor: headerBgColor,
                     position: 'sticky'}">
                        <view
                         class="wyb-table-checkbox"
                         v-if="enableCheck === 'multiple'"
                         @tap.stop="onCheckAllTap"
                         :style="{
                            width: checkColWidth * 0.5 + 'rpx',
                            height: checkColWidth * 0.5 + 'rpx',
                            backgroundColor: checkerBoxBgColor,
                            border: '1px solid ' + checkerBorderColor}">
                            <text
                             class="iconfont icon-check"
                             v-show="checkAll"
                             :style="{
                                color: checkerColor,
                                backgroundColor: checkerBgColor,
                                paddingTop: (fontSize[1] || fontSize[0]) * 0.15 + 'rpx',
                                fontSize: (fontSize[1] || fontSize[0]) + 'rpx'}" />
                        </view>
                     </view>
                <view ref="iosBug" class="wyb-table-header-item" v-for="(item, index) in headers" :key="item.key" @tap="onHeaderItemTap(index)"
                 :style="{
                     minWidth: (item.width || defaultColWidth) + 'rpx',
                     maxWidth: (item.width || defaultColWidth) + 'rpx',
                     minHeight: minHeight[0] + 'rpx',
                     textAlign: textAlign,
                     justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
                     fontSize: fontSize[0] + 'rpx',
                     fontWeight: headerWeight ? 'bold' : 'normal',
                     color: headerFtColor,
                     padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
                     backgroundColor: headerBgColor,
                     borderRight: index === headers.length - 1 || (!showVertBorder && index !== 0) ? 'none' : '1px solid' + borderColor,
                     zIndex: index === 0 ? 20 : 0,
                     left: index === 0 && firstLineFixed ? (enableCheck ? checkColWidth + 'rpx' : 0) : 'auto',
                     position: index === 0 ? 'sticky' : 'static'}">
                     <text :style="{marginLeft: autoSortShow(index) && textAlign !== 'left' ? fontSize[0] * 0.65 + 'rpx' : 0}">
                         {{item.label || emptyString}}
                     </text>
                     <view class="wyb-table-header-icon" v-if="autoSortShow(index)">
                         <text class="iconfont icon-arrow-up" :style="{
                            color: sortWays[sortWay] === 'asc' && sortActiveKey === item.key ?
                                headerFtColor : RGBChange(headerFtColor, 0.7, 'light'),
                            fontWeight: 'normal',
                            marginBottom: '-12px',
                            transform: 'scale(0.4)'}" />
                         <text class="iconfont icon-arrow-down" :style="{
                            color: sortWays[sortWay] === 'inv' && sortActiveKey === item.key ?
                                headerFtColor : RGBChange(headerFtColor, 0.7, 'light'),
                            fontWeight: 'normal',
                            transform: 'scale(0.4)'}" />
                     </view>
                </view>
            </view>
            <view class="wyb-table-content">
                <view class="wyb-table-content-line" v-for="(content, cIndex) in contentsSort" :key="contentLineKey(content, cIndex)"
                 :style="{borderTop: cIndex === 0 ? 'none' : '1px solid' + borderColor}">
                    <view class="wyb-table-content-item" v-if="enableCheck" :style="{
                         minWidth: checkColWidth + 'rpx',
                         maxWidth: checkColWidth + 'rpx',
                         textAlign: textAlign,
                         justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
                         fontSize: (fontSize[1] || fontSize[0]) + 'rpx',
                         minHeight: (minHeight[1] || minHeight[0]) + 'rpx',
                         padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
                         borderRight: '1px solid' + borderColor,
                         zIndex: 21,
                         color: contentFtColor,
                         backgroundColor: checkerCellBgColor,
                         left: 0,
                         position: 'sticky'}">
                            <view
                             class="wyb-table-checkbox"
                             @tap.stop="onCheckItemTap(cIndex)"
                             :style="{
                                width: checkColWidth * 0.5 + 'rpx',
                                height: checkColWidth * 0.5 + 'rpx',
                                backgroundColor: checkerBoxBgColor,
                                border: '1px solid ' + checkerBorderColor}">
                                <text
                                 class="iconfont icon-check"
                                 v-show="contentsSort[cIndex].checked"
                                 :style="{
                                    color: checkerColor,
                                    backgroundColor: checkerBgColor,
                                    paddingTop: (fontSize[1] || fontSize[0]) * 0.15 + 'rpx',
                                    fontSize: (fontSize[1] || fontSize[0]) + 'rpx'}" />
                            </view>
                         </view>
                    <view
                     class="wyb-table-content-item"
                     v-for="(header, hIndex) in headers"
                     @tap.stop="onContentItemTap(cIndex, hIndex)"
                     :key="contentItemKey(header, hIndex)"
                     :style="{
                         minWidth: (header.width || defaultColWidth) + 'rpx',
                         maxWidth: (header.width || defaultColWidth) + 'rpx',
                         textAlign: textAlign,
                         justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
                         fontSize: (fontSize[1] || fontSize[0]) + 'rpx',
                         textDecoration: autoTextDecoration(cIndex, hIndex),
                         color: autoContentColor(cIndex, hIndex),
                         backgroundColor: autoContentBgColor(cIndex, hIndex),
                         minHeight: (minHeight[1] || minHeight[0]) + 'rpx',
                         padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
                         borderBottom: cIndex === contents.length - 1 ? '1px solid' + borderColor : 'none',
                         borderRight: hIndex === headers.length - 1 || (!showVertBorder && hIndex !== 0) ? 'none' : '1px solid' + borderColor,
                         zIndex: hIndex === 0 ? 20 : 0,
                         left: enableCheck ? checkColWidth + 'rpx' : 0,
                         position: hIndex === 0 && firstLineFixed ? 'sticky' : 'static'}">{{autoContentItem(cIndex, hIndex)}}</view>
                </view>
                <view v-if="computedCol.length !== 0" class="wyb-table-content-line" :style="{
                    position: bottomComputedFixed ? 'sticky' : 'static',
                    bottom: 0,
                    zIndex: 25,
                    borderTop: '1px solid' + borderColor}">
                    <view class="wyb-table-content-item" v-if="enableCheck" :style="{
                         minWidth: checkColWidth + 'rpx',
                         maxWidth: checkColWidth + 'rpx',
                         textAlign: textAlign,
                         justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
                         fontSize: (fontSize[1] || fontSize[0]) + 'rpx',
                         minHeight: (minHeight[1] || minHeight[0]) + 'rpx',
                         padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
                         borderBottom: '1px solid' + borderColor,
                         borderRight: '1px solid' + borderColor,
                         zIndex: 25,
                         color: contentFtColor,
                         backgroundColor: checkerCellBgColor,
                         left: 0,
                         position: 'sticky'}"></view>
                    <view class="wyb-table-content-item" v-for="(header, index) in headers" :key="index"
                    :style="{
                         minWidth: (header.width || defaultColWidth) + 'rpx',
                         maxWidth: (header.width || defaultColWidth) + 'rpx',
                         textAlign: textAlign,
                         justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
                         fontSize: (fontSize[1] || fontSize[0]) + 'rpx',
                         color: contentFtColor,
                         minHeight: (minHeight[1] || minHeight[0]) + 'rpx',
                         padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
                         backgroundColor: index === 0 ? firstColBgColor : contentBgColor,
                         borderBottom: '1px solid' + borderColor,
                         borderRight: index === headers.length - 1 || (!showVertBorder && index !== 0) ? 'none' : '1px solid' + borderColor,
                         zIndex: index === 0 ? 20 : 0,
                         left: enableCheck ? checkColWidth + 'rpx' : 0,
                         position: index === 0 && firstLineFixed ? 'sticky' : 'static'}">
                        {{autoBottomComputedItem(index)}}
                    </view>
                </view>
            </view>
        </view>
    </view>
</template>
<script>
    import Pinyin from '../../static/table/characterToPinyin.js'
    import isEqual  from '../../static/table/objEqual.js'
    export default {
        data() {
            return {
                bottomComputed: [],
                colorList: [],
                bgColorList: [],
                contentsSort: this.contents.slice(),
                oContentsSort: [],
                sortWay: 0,
                sortKeys: [],
                sortActiveKey: '',
                sortIsNumbers: [],
                checkAll: false,
                checkList: [],
                onload: true,
                event: {
                    checkType: this.enableCheck,
                    data: []
                },
                chars: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
            }
        },
        computed: {
            loadingColor() {
                let color = this.loaderColor.slice()
                let rgbList = this.hexToRgb(color)
                let top = 'rgba(' + rgbList[0] + ',' + rgbList[1] + ',' + rgbList[2] + ', 0.3)'
                let bottom = 'rgba(' + rgbList[0] + ',' + rgbList[1] + ',' + rgbList[2] + ', 0.3)'
                let right = 'rgba(' + rgbList[0] + ',' + rgbList[1] + ',' + rgbList[2] + ', 0.3)'
                let left = 'rgb(' + rgbList[0] + ',' + rgbList[1] + ',' + rgbList[2] + ')'
                return {
                    top,
                    bottom,
                    right,
                    left
                }
            },
            contentLineKey() {
                return function(content, cIndex) {
                    return this.randomString(32, this.chars)
                }
            },
            contentItemKey() {
                return function(header, hIndex) {
                    return this.randomString(16, this.chars)
                }
            },
            autoContentItem() {
                return function(cIndex, hIndex) {
                    let content = this.contentsSort[cIndex]
                    let header = this.headers[hIndex]
                    let result = ''
                    if (content[header.key] || content[header.key] === 0) {
                        result = content[header.key]
                        if (this.urlCol.length !== 0) {
                            for (let i in this.urlCol) {
                                let item = this.urlCol[i]
                                if (header.key === item.key) {
                                    // è¯¥å•元格为链接
                                    result = content[header.key][0]
                                }
                            }
                        }
                        if (this.formatCol.length !== 0) {
                            this.formatCol.forEach(item => {
                                if (header.key === item.key) {
                                    let needRplace = new RegExp(`\#${item['key']}\#`, 'mg')
                                    result = item.template.replace(needRplace, result)
                                }
                            })
                        }
                    } else {
                        result = this.emptyString
                    }
                    return result
                }
            },
            autoBottomComputedItem() {
                return function(index) {
                    let bottomComputed = {}
                    let needComputed = []
                    this.computedCol.forEach(key => {
                        let computedColData = []
                        this.contentsSort.forEach(content => {
                            computedColData.push(content[key] || '0')
                        })
                        needComputed.push(computedColData)
                    })
                    needComputed.forEach((item, index) => {
                        let total = 0
                        item.forEach(num => {
                            total += parseFloat(num)
                        })
                        bottomComputed[this.computedCol[index]] = total
                    })
                    let header = this.headers[index]
                    let result = this.computedCol.includes(header.key) ?
                        bottomComputed[header.key] : (index === 0 ? '总计' : this.emptyString)
                    if (this.formatCol.length !== 0) {
                        this.formatCol.forEach(item => {
                            if (item.bottomComputedFormat) {
                                if (header.key === item.key) {
                                    let needRplace = new RegExp(`\#${item['key']}\#`, 'mg')
                                    result = item.template.replace(needRplace, bottomComputed[item.key])
                                }
                            }
                        })
                    }
                    return result
                }
            },
            autoTextDecoration() {
                return function(cIndex, hIndex) {
                    let result = 'auto'
                    let content = this.contentsSort[cIndex]
                    let header = this.headers[hIndex]
                    if (this.urlCol.length !== 0) {
                        for (let i in this.urlCol) {
                            let item = this.urlCol[i]
                            if (header.key === item.key) {
                                // è¯¥å•元格为链接
                                if (content[header.key]) {
                                    result = 'underline'
                                }
                            }
                        }
                    }
                    return result
                }
            },
            autoContentBgColor() {
                return function(cIndex, hIndex) {
                    let result = this.contentBgColor
                    let content = this.contentsSort[cIndex]
                    let header = this.headers[hIndex]
                    let keys = []
                    // å…ˆåˆ¤æ–­æ˜¯ä¸æ˜¯é¦–列,设置基础样式
                    if (hIndex === 0) {
                        result = this.firstColBgColor
                    }
                    // å†åˆ¤æ–­æ¡ä»¶æ ¼å¼ä¼ æ²¡ä¼ å€¼ï¼Œè®¾ç½®æ¡ä»¶æ ·å¼
                    if (this.valueFormat.length !== 0) {
                        this.valueFormat.forEach(item => {
                            keys.push(item.key)
                        })
                        if (keys.includes(header.key)) {
                            // è¯¥åˆ—开启了条件格式
                            let key = header.key
                            let type = this.valueFormat[keys.indexOf(key)].type
                            let style = this.valueFormat[keys.indexOf(key)].style
                            let range = this.valueFormat[keys.indexOf(key)].range || ''
                            switch(type) {
                                case 'bigger':
                                    if (parseFloat(content[key]) > range) {
                                        if (style.bgColor) result = style.bgColor
                                    }
                                    break
                                case 'smaller':
                                    if (parseFloat(content[key]) < range) {
                                        if (style.bgColor) result = style.bgColor
                                    }
                                    break
                                case 'equal':
                                    let val
                                    if (typeof range === 'number') val = parseFloat(content[key])
                                    else val = content[key]
                                    if (val === range) {
                                        if (style.bgColor) result = style.bgColor
                                    }
                                    break
                                case 'range':
                                    if (parseFloat(content[key]) > range[0] && parseFloat(content[key]) < range[1]){
                                        if (style.bgColor) result = style.bgColor
                                    }
                                    break
                                case 'average-bigger':
                                    let average = this.getAverage(key)
                                    if (parseFloat(content[key]) > average) {
                                        if (style.bgColor) result = style.bgColor
                                    }
                                    break
                                case 'average-smaller':
                                    average = this.getAverage(key)
                                    if (parseFloat(content[key]) < average) {
                                        if (style.bgColor) result = style.bgColor
                                    }
                                    break
                                case 'average-equal':
                                    average = this.getAverage(key)
                                    if (parseFloat(content[key]) === average) {
                                        if (style.bgColor) result = style.bgColor
                                    }
                                    break
                            }
                        }
                    }
                    return result
                }
            },
            autoContentColor() {
                return function(cIndex, hIndex) {
                    let result = this.contentFtColor
                    let content = this.contentsSort[cIndex]
                    let header = this.headers[hIndex]
                    let keys = []
                    // å…ˆåˆ¤æ–­æ˜¯ä¸æ˜¯é“¾æŽ¥ï¼Œè®¾ç½®åŸºç¡€æ ·å¼
                    if (this.urlCol.length !== 0) {
                        for (let i in this.urlCol) {
                            let item = this.urlCol[i]
                            if (header.key === item.key) {
                                // è¯¥å•元格为链接
                                if (content[header.key]) {
                                    result = this.linkColor
                                }
                            }
                        }
                    }
                    // å†åˆ¤æ–­æ¡ä»¶æ ¼å¼ä¼ æ²¡ä¼ å€¼ï¼Œè®¾ç½®æ¡ä»¶æ ·å¼
                    if (this.valueFormat.length !== 0) {
                        this.valueFormat.forEach(item => {
                            keys.push(item.key)
                        })
                        if (keys.includes(header.key)) {
                            // è¯¥åˆ—开启了条件格式
                            let key = header.key
                            let type = this.valueFormat[keys.indexOf(key)].type
                            let style = this.valueFormat[keys.indexOf(key)].style
                            let range = this.valueFormat[keys.indexOf(key)].range || ''
                            switch(type) {
                                case 'bigger':
                                    if (parseFloat(content[key]) > range) {
                                        if (style.color) result = style.color
                                    }
                                    break
                                case 'smaller':
                                    if (parseFloat(content[key]) < range) {
                                        if (style.color) result = style.color
                                    }
                                    break
                                case 'equal':
                                    let val
                                    if (typeof range === 'number') val = parseFloat(content[key])
                                    else val = content[key]
                                    if (val === range) {
                                        if (style.color) result = style.color
                                    }
                                    break
                                case 'range':
                                    if (parseFloat(content[key]) > range[0] && parseFloat(content[key]) < range[1]){
                                        if (style.color) result = style.color
                                    }
                                    break
                                case 'average-bigger':
                                    let average = this.getAverage(key)
                                    if (parseFloat(content[key]) > average) {
                                        if (style.color) result = style.color
                                    }
                                    break
                                case 'average-smaller':
                                    average = this.getAverage(key)
                                    if (parseFloat(content[key]) < average) {
                                        if (style.color) result = style.color
                                    }
                                    break
                                case 'average-equal':
                                    average = this.getAverage(key)
                                    if (parseFloat(content[key]) === average) {
                                        if (style.color) result = style.color
                                    }
                                    break
                            }
                        }
                    }
                    return result
                }
            },
            autoSortShow() {
                return function(hIndex) {
                    let result = false
                    let header = this.headers[hIndex]
                    let keys = []
                    // åˆ¤æ–­æŽ’序是否传值
                    if (this.sortCol.length !== 0 && this.sortKeys.length === 0) {
                        this.sortCol.forEach(item => {
                            keys.push(item.key)
                        })
                        this.sortKeys = keys
                        if (keys.includes(header.key)) {
                            result = true
                        }
                    } else if (this.sortCol.length !== 0) {
                        if (this.sortKeys.includes(header.key)) {
                            result = true
                        }
                    }
                    return result
                }
            },
            screenWidth() {
                return `${uni.getSystemInfoSync()['screenWidth']}px`
            }
        },
        props: {
            headers: {
                type: Array,
                default() {
                    return []
                }
            },
            contents: {
                type: Array,
                default() {
                    return []
                }
            },
            emptyString: {
                type: String,
                default: '-'
            },
            width: {
                type: String,
                default: "100%"
            },
            height: {
                type: String,
                default: 'auto'
            },
            fontSize: {
                type: Array,
                default() {
                    return [24]
                }
            },
            defaultColWidth: {
                type: Number,
                default: 176
            },
            headerWeight: {
                type: Boolean,
                default: true
            },
            minHeight: {
                type: Array,
                default() {
                    return [70]
                }
            },
            headerBgColor: {
                type: String,
                default: '#24ABFD'
            },
            contentBgColor: {
                type: String,
                default: '#DADADA'
            },
            headerFtColor: {
                type: String,
                default: '#fff'
            },
            contentFtColor: {
                type: String,
                default: '#3e3e3e'
            },
            linkColor: {
                type: String,
                default: '#0024c8'
            },
            firstColBgColor: {
                type: String,
                default: '#DADADA'
            },
            firstLineFixed: {
                type: Boolean,
                default: false
            },
            textAlign: {
                type: String,
                default: 'center'
            },
            padding: {
                type: Array,
                default() {
                    return [5, 10]
                }
            },
            borderColor: {
                type: String,
                default: '#fff'
            },
            urlCol: {
                type: Array,
                default() {
                    return []
                }
            },
            computedCol: {
                type: Array,
                default() {
                    return []
                }
            },
            bottomComputedFixed: {
                type: Boolean,
                default: true
            },
            valueFormat: {
                type: Array,
                default() {
                    return []
                }
            },
            formatCol: {
                type: Array,
                default() {
                    return []
                }
            },
            showLeftAndRightBorder: {
                type: Boolean,
                default: false
            },
            showVertBorder: {
                type: Boolean,
                default: true
            },
            sortCol: {
                type: Array,
                default() {
                    return []
                }
            },
            sortWays: {
                type: Array,
                default() {
                    return ['none', 'asc', 'inv']
                }
            },
            loading: {
                type: Boolean,
                default: false
            },
            loaderSize: {
                type: [String, Number],
                default: 50
            },
            loaderColor: {
                type: String,
                default: '#a3a3a3'
            },
            loaderBgColor: {
                type: String,
                default: '#f8f8f8'
            },
            enableCheck: {
                type: String,
                default: ''
            },
            checkColWidth: {
                type: [String, Number],
                default: '70'
            },
            checkerColor: {
                type: String,
                default: '#3e3e3e'
            },
            checkerBorderColor: {
                type: String,
                default: '#d3d3d3'
            },
            checkerBgColor: {
                type: String,
                default: 'rgba(0, 0, 0, 0)'
            },
            checkerBoxBgColor: {
                type: String,
                default: 'rgba(0, 0, 0, 0)'
            },
            checkerCellBgColor: {
                type: String,
                default: '#f1f1f1'
            }
        },
        watch: {
            headers(val) {
                this.$forceUpdate()
            },
            contents(val) {
                this.contentsSort = val.slice()
                if (this.onload) {
                    this.contentsSort.forEach(item => {
                        this.$set(item, 'checked', false)
                    })
                    this.oContentsSort = this.contentsSort.slice()
                    this.onload = false
                }
                this.$forceUpdate()
            }
        },
        mounted() {
            this.contentsSort.forEach(item => {
                this.$set(item, 'checked', false)
            })
            this.oContentsSort = this.contentsSort.slice()
            if (this.sortCol.length !== 0) {
                this.sortActiveKey = this.sortCol[0].key
                uni.setStorageSync('lastSortActiveKey', this.sortActiveKey)
                this.doSort(this.sortCol[0].key, this.sortWays[this.sortWay], this.sortCol[0].isNumber)
            }
        },
        methods: {
            doSort(key, type, isNumber) {
                let arr = this.contentsSort
                if (type === 'asc') {
                    // å‡åº
                    if (isNumber) {
                        arr.sort((a, b) => {
                            let a1 = (parseFloat(a[key].toString().replace(/[^0-9]/ig, "")) || 0);
                            let b1 = (parseFloat(b[key].toString().replace(/[^0-9]/ig, "")) || 0);
                            a1 =  a[key] < 0 ? - a1 : a1;
                            b1 =  b[key] < 0 ? - b1 : b1;
                            return a1 - b1
                        })
                    } else {
                        arr.sort((a, b) => {
                            let A = Pinyin.getSpell(a[key].charAt(0), function(charactor, spell) {
                                return spell[1]
                            }).charAt(0).charCodeAt()
                            let B = Pinyin.getSpell(b[key].charAt(0), function(charactor, spell) {
                                return spell[1]
                            }).charAt(0).charCodeAt()
                            return A - B
                        })
                    }
                } else if (type === 'inv') {
                    // å€’序
                    if (isNumber) {
                        arr.sort((a, b) => {
                            let a1 = (parseFloat(a[key].toString().replace(/[^0-9]/ig, "")) || 0);
                            let b1 = (parseFloat(b[key].toString().replace(/[^0-9]/ig, "")) || 0);
                            a1 =  a[key] < 0 ? - a1 : a1;
                            b1 =  b[key] < 0 ? - b1 : b1;
                            return b1 - a1
                        })
                    } else {
                        arr.sort((a, b) => {
                            let A = Pinyin.getSpell(a[key].charAt(0), function(charactor, spell) {
                                return spell[1]
                            }).charAt(0).charCodeAt()
                            let B = Pinyin.getSpell(b[key].charAt(0), function(charactor, spell) {
                                return spell[1]
                            }).charAt(0).charCodeAt()
                            return B - A
                        })
                    }
                } else {
                    this.contentsSort = this.oContentsSort.slice()
                }
                if (this.enableCheck) {
                    this.event.data.forEach(item => {
                        this.contentsSort.forEach((content, index) => {
                            if (isEqual(item.lineData, content)) {
                                item.index = index
                            }
                        })
                    })
                }
                this.$forceUpdate()
            },
            initBottomComputed() {
                let result = {}
                let needComputed = []
                this.computedCol.forEach(key => {
                    let computedColData = []
                    this.contentsSort.forEach(content => {
                        computedColData.push(content[key] || '0')
                    })
                    needComputed.push(computedColData)
                })
                needComputed.forEach((item, index) => {
                    let total = 0
                    item.forEach(num => {
                        total += parseFloat(num)
                    })
                    result[this.computedCol[index]] = total
                })
                this.bottomComputed = result
            },
            onHeaderItemTap(index) {
                let header = this.headers[index]
                const lastSortActiveKey = uni.getStorageSync('lastSortActiveKey') || ''
                if (this.sortCol.length !== 0) {
                    if (this.sortKeys.includes(header.key)) {
                        // å½“前列开启了排序
                        this.sortActiveKey = header.key
                        uni.setStorageSync('lastSortActiveKey', this.sortActiveKey)
                        if (this.sortWay < 2 && lastSortActiveKey === this.sortActiveKey) {
                            this.sortWay++
                        } else if (lastSortActiveKey !== this.sortActiveKey) {
                            this.sortWay = 1
                        } else if (this.sortWay >= 2) {
                            this.sortWay = 0
                        }
                        let isNumber = this.sortCol[this.sortKeys.indexOf(header.key)].isNumber
                        // console.log(header.key,this.sortWays[this.sortWay],isNumber)
                        this.doSort(header.key, this.sortWays[this.sortWay], isNumber)
                    }
                }
            },
            onContentItemTap(cIndex, hIndex) {
                let event = {}
                let content = this.contentsSort[cIndex]
                let header = this.headers[hIndex]
                let keys = []
                if (this.urlCol.length !== 0) {
                    for (let i in this.urlCol) {
                        let item = this.urlCol[i]
                        keys.push(item.key)
                    }
                }
                if (content[header.key]) {
                    if (keys.includes(header.key)) {
                        // è¯¥å•元格为链接
                        switch(this.urlCol[keys.indexOf(header.key)].type) {
                            case 'route':
                                let url = content[header.key][1]
                                if (content[header.key][2]) {
                                    url = `${url}?`
                                    Object.keys(content[header.key][2]).forEach(key => {
                                        url += `&${key}=${content[header['key']][2][key]}`
                                    })
                                }
                                uni.navigateTo({url})
                                break
                            case 'http':
                                this.openURL(content[header.key][1])
                                break
                        }
                    } else {
                        event = {
                            content: content[header.key],
                            contentIndex: cIndex,
                            header: header.label,
                            headerIndex: hIndex,
                            key: header.key,
                            lineData: content
                        }
                        this.$emit('onCellClick', event)
                    }
                } else {
                    event = {
                        content: '',
                        contentIndex: cIndex,
                        header: header.label,
                        headerIndex: hIndex,
                        key: header.key,
                        lineData: content
                    }
                    if (keys.includes(header.key)) {
                        // è¯¥å•元格为链接
                        event['isLink'] = true
                    }
                    this.$emit('onCellClick', event)
                }
            },
            onCheckAllTap() {
                if (this.enableCheck === 'multiple') {
                    let checkList = []
                    this.contentsSort.forEach(item => {
                        checkList.push(item.checked)
                    })
                    this.checkList = checkList
                    if (!this.checkAll) {
                        this.checkAll = true
                        this.contentsSort.forEach(item => {
                            item.checked = true
                        })
                        this.event.data = []
                        this.contentsSort.forEach((content, index) => {
                            this.event.data.push({
                                index,
                                lineData: content
                            })
                        })
                    } else {
                        this.checkAll = false
                        this.event.data = []
                        this.contentsSort.forEach(item => {
                            item.checked = false
                        })
                    }
                    this.$emit('onCheck', this.event)
                }
            },
            onCheckItemTap(cIndex) {
                let content = this.contentsSort[cIndex]
                if (this.enableCheck === 'single') {
                    this.contentsSort.forEach((item, index) => {
                        if (cIndex === index) {
                            item.checked = !item.checked
                        } else {
                            item.checked = false
                        }
                    })
                } else if (this.enableCheck === 'multiple') {
                    this.contentsSort[cIndex]['checked'] = !this.contentsSort[cIndex]['checked']
                }
                if (this.contentsSort[cIndex]['checked']) {
                    if (this.enableCheck === 'single') {
                        this.event.data = []
                    }
                    this.event.data.push({
                        index: cIndex,
                        lineData: this.contentsSort[cIndex]
                    })
                } else {
                    this.event.data.forEach(item => {
                        if (item.index === cIndex) this.event.data.splice(this.event.data.indexOf(item), 1)
                    })
                    if (this.event.data.length === 0) {
                        this.checkAll = false
                    }
                }
                this.$forceUpdate()
                this.$emit('onCheck', this.event)
            },
            openURL(href) {
                // #ifdef APP-PLUS
                plus.runtime.openURL(href)
                // #endif
                // #ifdef H5
                window.open(href)
                // #endif
                // #ifdef MP
                uni.setClipboardData({
                    data: href,
                    success() {
                        uni.showToast({
                            title: '网址已复制,请在手机浏览器里粘贴该网址',
                            icon: 'none'
                        })
                    }
                })
                // #endif
            },
            getAverage(key) {
                let numList = []
                this.contentsSort.forEach(content => {
                    numList.push(parseFloat(content[key]) || 0)
                })
                return numList.reduce((a, b) => a + b) / numList.length
            },
            getTotal(key) {
                let numList = []
                this.contentsSort.forEach(content => {
                    numList.push(parseFloat(content[key]) || 0)
                })
                return numList.reduce((a, b) => a + b)
            },
            RGBChange(color, level, type) {
                // åˆ¤æ–­é¢œè‰²ç±»åž‹
                let r = 0,
                    g = 0,
                    b = 0,
                    hasAlpha = false,
                    alpha = 1
                if (color.indexOf('#') !== -1) {
                    // hex转rgb
                    if (color.length === 4) {
                        let arr = color.split('')
                        color = '#' + arr[1] + arr[1] + arr[2] + arr[2] + arr[3] + arr[3]
                    }
                    let color16List = [color.substring(1, 3), color.substring(3, 5), color.substring(5, 7)]
                    r = parseInt(color16List[0], 16)
                    g = parseInt(color16List[1], 16)
                    b = parseInt(color16List[2], 16)
                } else {
                    hasAlpha = color.indexOf('a') !== -1
                    let root = color.slice()
                    let idx = root.indexOf('(') + 1
                    root = root.substring(idx)
                    let firstDotIdx = root.indexOf(',')
                    r = parseFloat(root.substring(0, firstDotIdx))
                    root = root.substring(firstDotIdx + 1)
                    let secondDotIdx = root.indexOf(',')
                    g = parseFloat(root.substring(0, secondDotIdx))
                    root = root.substring(secondDotIdx + 1)
                    if (hasAlpha) {
                        let thirdDotIdx = root.indexOf(',')
                        b = parseFloat(root.substring(0, thirdDotIdx))
                        alpha = parseFloat(root.substring(thirdDotIdx + 1))
                    } else {
                        b = parseFloat(root)
                    }
                }
                let rgbc = [r, g, b]
                // å‡æ·¡æˆ–加深
                for (var i = 0; i < 3; i++)
                    type === 'light' ? rgbc[i] = Math.floor((255 - rgbc[i]) * level + rgbc[i]) : rgbc[i] = Math.floor(rgbc[i] * (1 -
                        level))
                if (hasAlpha) {
                    return `rgba(${rgbc[0]}, ${rgbc[1]}, ${rgbc[2]}, ${alpha})`
                } else {
                    return `rgb(${rgbc[0]}, ${rgbc[1]}, ${rgbc[2]})`
                }
            },
            hexToRgb(color) {
                if (color.length === 4) {
                    let arr = color.split('')
                    color = '#' + arr[1] + arr[1] + arr[2] + arr[2] + arr[3] + arr[3]
                }
                let color16List = [color.substring(1, 3), color.substring(3, 5), color.substring(5, 7)]
                let r = parseInt(color16List[0], 16)
                let g = parseInt(color16List[1], 16)
                let b = parseInt(color16List[2], 16)
                return [r, g, b]
            },
            randomString(length, chars) {
                var result = ''
                for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]
                return result
            }
        }
    }
</script>
<style>
    @import '../../static/table/iconfont.wxss';
    @import '../../static/table/loader.wxss';
    .ios-header-bug {
        height: 0;
        width: 1px;
        opacity: 0;
    }
    .wyb-table-scroll-view {
        overflow: scroll;
        -webkit-overflow-scrolling: touch;
    }
    .wyb-table-scroll-view::-webkit-scrollbar {
        display: none;
        /* #ifdef MP-WEIXIN */
        width: 0;
        height: 0;
        /* #endif */
    }
    .wyb-table-loading-box {
        display: flex;
        align-items: center;
        justify-content: center;
        z-index: 500;
    }
    .wyb-table-header {
        position: sticky;
        top: 0;
        display: grid;
        grid-auto-flow: column;
        width: max-content;
        z-index: 25;
    }
    .wyb-table-header-item {
        flex: 1;
        display: flex;
        align-items: center;
        box-sizing: border-box;
        position: relative;
    }
    .wyb-table-header-icon {
        display: flex;
        flex-direction: column;
    }
    .wyb-table-content-line {
        display: grid;
        grid-auto-flow: column;
        width: max-content;
        position: relative;
    }
    .wyb-table-content-item {
        display: flex;
        flex-direction: row;
        align-items: center;
        box-sizing: border-box;
    }
    .wyb-table-checkbox {
        border-radius: 3px;
        display: flex;
        align-items: center;
        justify-content: center;
        position: relative;
    }
    .icon-check {
        width: 100%;
        height: 100%;
        position: absolute;
        border-radius: 0;
        border-radius: 3px;
        font-weight: bold;
        box-sizing: border-box;
        transform: scale(1.1);
    }
</style>
src/pages_qiun/components/drop-down/drop-down.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,218 @@
<template>
    <div class="dropdown-item">
        <!-- selected -->
        <view :class="['dropdown-item__selected',listWidth!='150rpx'?'dropdown-item__right':'dropdown-item__left']"
              @click="changePopup" :style="{maxWidth:selectWidth}">
            <view class="selected__name">{{selectItem.text}}</view>
            <view class="selected__icon"
                :class="showClass === 'show'? 'up' : 'down'"
            >
                <li class="iconfont icon-caretdown"></li>
            </view>
        </view>
        <view class="dropdown-item__content" :style="{top: contentTop + 'rpx'}" v-if="showList">
            <!-- dropdown -->
            <view :class="['list', showClass]" :style="{left: contentLeft>0?contentLeft + 'rpx':'auto',right: contentRight>0?contentRight + 'rpx':'auto',}">
                <view class="list__option"
                    v-for="(item, index) in list" :key="index"
                    @click="choose(item)">
                    <view>{{item.text}}</view>
                    <icon v-if="item.value === value" type="success_no_circle" size="20"/>
                </view>
            </view>
            <!-- dropdown-mask -->
            <view :class="['dropdown-mask', showClass]" v-if="showList" @click="closePopup"></view>
        </view>
    </div>
</template>
<script>
    export default {
        components: {
        },
        props: {
            value: [Number, String, Object],
            list: {
                type: Array,
                default: ()=> {
                    return []
                }
            },
            contentTop:{
                type:String,
                default:"185"
            },
            contentLeft:{
                type:String,
                default:"0"
            },
            contentRight:{
                type:String,
                default:"0"
            },
            listWidth:{
                type:String,
                default:'150rpx'
            },
            selectWidth:{
                type:String,
                default:'150rpx'
            }
        },
        data() {
            return {
                showList: "",
                showClass: '',
                selectItem: {},
            }
        },
        watch: {
            list(newVal,oldVal){
                this.selectItem = newVal[0];
            }
        },
        mounted() {
            this.showList = this.active;
            this.selectItem = this.list[0];
        },
        methods: {
            choose(item) {
                if(item.value != "auto"){
                    this.selectItem = item
                }
                this.$emit('changeItem', item);
                this.closePopup();
            },
            selectAuto(){
                this.selectItem = {text: '指定日期',value: 'auto'};
            },
            changePopup() {
                if(this.showList) {
                    this.closePopup()
                } else {
                    this.openPopup()
                }
            },
            openPopup() {
                setTimeout(() => {
                    this.showClass = 'show';
                    this.showList = true;
                }, 100);
            },
            closePopup() {
                this.showClass = ''
                setTimeout(() => {
                    this.showList = false
                }, 200);
            },
            close() {
                this.showClass = ''
                this.showList = false
            },
        }
    }
</script>
<style lang="scss">
    li{
         list-style-type:none;
    }
    .dropdown-item__content{
        z-index: 10!important;
    }
    .dropdown-item {
        width: 100%;
        flex:1;
        position: relative;
        &__selected {
            position: relative;
            padding: 10rpx 0;
            box-sizing: border-box;
            color: #fff;
            .selected__name {
                font-size: 28rpx;
                text-overflow: ellipsis;
                white-space: nowrap;
                overflow: hidden;
            }
            .selected__icon {
                margin-left: 20rpx;
                &.down {
                    transition: transform .3s;
                    transform: rotateZ(0);
                }
                &.up {
                    transition: transform .3s;
                    transform: rotateZ(-180deg);
                }
            }
        }
        &__left{
            display: flex;
            flex-direction: row;
            justify-content: flex-start;
            align-items: center;
        }
        &__right{
            display: flex;
            flex-direction: row;
            justify-content: flex-end;
            align-items: center;
        }
        &__content {
            position: fixed;
            left: 0;
            right: 0;
            overflow: hidden;
            top: 0;
            bottom: 0;
            z-index: 1;
            .list {
                max-height: 400px;
                text-align: center;
                overflow-y: auto;
                position: absolute;
                z-index: 1200;
                background: #fff;
                transform: translateY(-100%);
                transition: all .3s;
                &.show {
                    transform: translateY(0);
                }
                &__option {
                    font-size:30rpx;
                    padding: 18rpx;
                    display: flex;
                    justify-content: space-between;
                    color: #303133;
                    &:not(:last-child) {
                        border-bottom: 1rpx solid #DDDDDD;
                    }
                }
            }
            .dropdown-mask {
                position: absolute;
                left: 0;
                right: 0;
                top: 0;
                bottom: 0;
                transition: all .3s;
                z-index: 1100;
                &.show {
                    background:rgba(0,0,0,0.5);
                }
            }
        }
        &:not(:last-child):after {
            content: ' ';
            position: absolute;
            width: 2rpx;
            top: 36rpx;
            bottom: 36rpx;
            right: 0;
            background: $uni-border-color;
        }
    }
</style>
src/pages_qiun/components/progress-bar/progress-bar.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
<template>
    <view>
        <view v-if="copyContent.length > 0" class="ranking">
            <view class="ranking-item" v-for="(content,index) in copyContent" :key="index" :style="{padding:progressPadding+'rpx'}">
                <view class="name">{{content.name}}</view>
                <view class="progress" >
                    <text :style="{background:content.background,width:content.width + '%',height:progressWidth+'rpx'}"></text>
                </view>
                <view class="num">{{content.num}}</view>
            </view>
        </view>
    </view>
</template>
<script>
    export default{
        name:'ranking-list',
        props:{
            content:{
                type: Array,
                default() {
                    return []
                }
            },
            isPC:{
                type:Boolean,
                default:false
            },
            isRank:{
                type:Boolean,
                default:false
            }
        },
        data(){
            return{
                progressWidth:24,
                progressPadding:10,
                maxNumber:0,
                culCount:0,
                copyContent:[]
            }
        },
        watch:{
            content(newV){
                this.init()
            }
        },
        methods:{
            init(){
                this.copyContent = this.deepClone(this.content)
                if(this.copyContent && this.copyContent.length >0){
                    if(this.isRank){
                        this.copyContent = this.copyContent.sort((a,b) => b.num - a.num);
                        this.maxNumber = this.copyContent[0].num;
                    }else{
                        this.maxNumber = Math.max.apply(Math,this.copyContent.map(item => { return item.num }));
                    }
                    this.copyContent.map((item,index) =>{
                        item.width = this.computeWidth(this.maxNumber,item.num);
                    });
                }
            },
            computeWidth(max,current){
                let num = (current / max) * 100;
                return num.toFixed(2);
            },
            deepClone(obj) {
              var cloneObj = new obj.constructor()
              if(obj === null) return obj
              if(obj instanceof Date) return new Date(obj)
              if(obj instanceof RegExp) return new RegExp(obj)
              if (typeof obj !== 'object') return obj
              for (var i in obj) {
                if (obj.hasOwnProperty(i)) {
                  cloneObj[i] = this.deepClone(obj[i])
                }
              }
              return cloneObj
            }
        },
        mounted() {
            if(this.isPC){
                this.progressWidth = 40;
                this.progressPadding = 30;
            }
            this.init();
        }
    }
</script>
<style scoped lang="scss">
    .ranking-item{
        display: flex;
        margin-bottom: 13rpx;
        align-content: center;
        height: 50rpx;
        .name{
            padding-right: 10rpx;
            color: #868688;
            font-size: 20rpx;
            flex: 1;
            white-space: nowrap;
                overflow: hidden;
                text-overflow: ellipsis;
        }
        .progress{
            flex:5;
            text-align: left;
            padding-right: 10rpx;
            text{
                display: inline-block;
                border-radius: 30rpx;
                vertical-align:top;
            }
        }
        .num{
            font-size: 26rpx;
            color: #3EB2F5;
            flex: 1;
        }
    }
</style>
src/pages_qiun/components/ranking-list/ranking-list.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
<template>
    <view>
        <view class="ranking">
            <view class="ranking-item" v-for="(content,index) in content" :key="index">
                <view class="name">{{content.name}}</view>
                <view class="progress" >
                    <text :style="{backgroundImage:'linear-gradient(to top right,'+getColor(0,index)+','+getColor(1,index)+')',width:content.width + '%'}"></text>
                </view>
                <view class="num">{{content.num}}</view>
            </view>
        </view>
    </view>
</template>
<script>
    export default{
        name:'ranking-list',
        props:{
            content:{
                type: Array,
                default() {
                    return []
                }
            }
        },
        methods:{
            init(){
                if(this.content && this.content.length >0){
                    this.content = this.content.sort((a,b) => b.num - a.num);
                    let max = this.content[0].num;
                    this.content.map((item,index) =>{
                        item.width = this.computeWidth(max,item.num);
                    });
                    this.$emit("updateRanking",this.content)
                }
            },
            computeWidth(max,current){
                let num = (current / max) * 100;
                return num.toFixed(2);
            },
            getColor(id,index){
                let color = "";
                switch(index){
                    case 0:
                        color = id == 0 ? "#fff":"#A80BFC";
                        break;
                    case 1:
                        color = id == 0 ? "#fff":"#740CFF";
                        break;
                    case 2:
                        color = id == 0 ? "#fff":"#4A08DC";
                        break;
                    default :
                        color = id == 0 ? "#fff":"#1936DA";
                        break;
                }
                return color;
            },
        },
        mounted() {
            this.init();
        }
    }
</script>
<style scoped lang="scss">
    .ranking-item{
        display: flex;
        margin-bottom: 13rpx;
        padding: 10rpx;
        align-content: center;
        .name{
            padding-right: 10rpx;
            color: #868688;
        }
        .progress{
            flex:5;
            text-align: left;
            padding-right: 10rpx;
            text{
                display: inline-block;
                height: 100%;
            }
        }
        .num{
            font-size: 26rpx;
            color: #3EB2F5;
        }
    }
</style>
src/pages_qiun/components/text-block/text-block.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,186 @@
<template>
    <view class="text_block">
        <template v-for="(item,index) in content">
            <view v-if="item.kind == 1" :key="index" :style="{backgroundImage:'linear-gradient(to top right,'+item.background[0]+','+item.background[1]+')'}" :class="[(index+1)%3==0 ? '':'marginRight','kind','kind_one','breathe-blue']">
                <view class="view_100" :style="{fontSize:item.content[0].size,color:item.content[0].colorvalue}">{{item.content[0].value}}</view>
                <view class="view_100" :style="{fontSize:item.content[1].size,color:item.content[1].colortext}">{{item.content[1].text}}</view>
            </view>
            <view v-else-if="item.kind == 2" :class="[(index+1)%3==0 ? '':'marginRight','kind','kind_two','breathe-blue']" :style="{backgroundImage:'linear-gradient(to top right,'+item.background[0]+','+item.background+')' ,marginRight:(index+1)%3==0?'0rpx':'40rpx'}">
                <view v-for="(content,i) in item.content" :key="i" class="two_1">
                    <text :style="{fontSize:content.size,color:content.colortext}">{{content.text}}:</text>
                    <text :style="{fontSize:content.size,color:content.colorvalue}">{{content.value}}</text>
                </view>
            </view>
            <view v-else-if="item.kind == 3" class="kind kind_three breathe-blue" :style="{backgroundImage:'linear-gradient(to top right,'+item.background[0]+','+item.background+')'}">
                <view class="view_100" :style="{fontSize:item.content[0].size,color:item.content[0].colorvalue}">{{item.content[0].value}}</view>
                <view class="view_100" :style="{fontSize:item.content[1].size,color:item.content[1].colortext}">{{item.content[1].text}}</view>
                <view class="three_3 view_100">
                    <view v-for="(j,i) in 2" :key="i">
                        <text :style="{fontSize:item.content[i+2].size,color:item.content[i+2].colortext}">{{item.content[i+2].text}}:</text>
                        <text :style="{fontSize:item.content[i+2].size,color:item.content[i+2].colorvalue}">{{item.content[i+2].value}}</text>
                    </view>
                </view>
            </view>
            <view v-else-if="item.kind == 4" :class="[(index+1)%3==0 ? '':'marginRight','kind','kind_four','breathe-blue']" :style="{backgroundImage:'linear-gradient(to top right,'+item.background[0]+','+item.background[1]+')',marginRight:(index+1)%3==0?'0rpx':'40rpx'}">
                <view class="view_100" :style="{fontSize:item.content[0].size,color:item.content[0].colortext}">{{item.content[0].text}}</view>
                <view class="view_100" :style="{fontSize:item.content[1].size,color:item.content[1].colorvalue}">{{item.content[1].value}}</view>
                <view class="four_3" :style="{fontSize:item.content[2].size,color:item.content[2].colorvalue}">
                    <text :style="{fontSize:item.content[3].size,color:item.content[3].colorvalue}">{{item.content[2].text}}</text>
                    <li v-if="item.content[3].text == 'up'" class="iconfont icon-up icon li_1" :style="{color:item.content[3].colortext}"></li>
                    <li v-else class="iconfont icon-down icon li_1" :style="{color:item.content[3].colortext}"></li>
                    <text :style="{fontSize:item.content[3].size,color:item.content[3].colorvalue}">{{item.content[3].value}}</text>
                </view>
            </view>
            <view v-else-if="item.kind == 5" :class="[(index+1)%3==0 ? '':'marginRight','kind','kind_five','breathe-red']" :style="{backgroundImage:'linear-gradient(to top right,'+item.background[0]+','+item.background[1]+')',marginRight:(index+1)%3==0?'0rpx':'40rpx'}">
                <view class="view_100" :style="{fontSize:item.content[0].size,color:item.content[0].colortext}">{{item.content[0].text}}</view>
                <view class="view_100" :style="{fontSize:item.content[1].size,color:item.content[1].colorvalue}">{{item.content[1].value}}</view>
                <view class="five_3 view_100">
                    <view v-for="(j,i) in 2" :key="i">
                        <text :style="{fontSize:item.content[j+2].size,color:item.content[j+2].colortext}">{{item.content[j+2].text}}</text>
                        <text :style="{fontSize:item.content[j+2].size,color:item.content[j+2].colorvalue}">{{item.content[j+2].value}}</text>
                    </view>
                </view>
                <view class="five_4">
                    <text :style="{fontSize:item.content[4].size,color:item.content[4].colortext}">{{item.content[4].text}}</text>
                    <text :style="{fontSize:item.content[4].size,color:item.content[4].colorvalue}">{{item.content[4].value}}</text>
                </view>
            </view>
        </template>
    </view>
</template>
<script>
    export default {
        props:{
            content: {
                type: Array,
                default: []
            },
        },
        data() {
            return {
            }
        },
        methods: {
        },
        mounted() {
            uni.onWindowResize((res) => {
                console.log('变化后的窗口宽度=' + res.size.windowWidth)
                console.log('变化后的窗口高度=' + res.size.windowHeight)
            })
        }
    }
</script>
<style lang="scss">
    .text_block{
        display: flex;
        width: 100%;
        flex-wrap: wrap;
        .marginRight{
            margin-right: 36rpx!important;
        }
        .view_100{
            width: 100%;
        }
        .CPT_DYBG {
          overflow: hidden;
          position: relative;
        }
        .kind{
            width: 24%;
            padding: 10rpx;
            margin-bottom: 40rpx;
            display: flex;
            justify-content: center;
            flex-wrap: wrap;
            border-radius: 16rpx;
            margin-left: 16rpx;
            box-shadow: -4px 4px 4px #ccc;
            position: relative;
        }
        .kind_one{
            border-radius: 10rpx;
        }
        .kind_two{
            border-radius: 10rpx;
        }
        .kind_three{
            border-radius: 16rpx;
            width: 300rpx;
            margin: 0 auto;
            .three_3{
                display: flex;
                justify-content: space-around;
            }
        }
        .kind_four{
            border-radius: 10rpx;
            .four_3{
                display: flex;
                .li_1 {
                     list-style-type:none;
                }
                .icon{
                    margin-top: -8rpx;
                    transform: scale(0.8);
                }
            }
        }
        .kind_five{
            border-radius: 20rpx;
            .five_3{
                view{
                    width: 100%;
                }
            }
        }
    }
    // .breathe-blue {
    //     position:relative;
    //     color:#fff;
    //     text-align:center;
    //     cursor:pointer;
    //     box-shadow:0 1px 2px rgba(0,0,0,.3);
    //     overflow:hidden;
    //     -webkit-animation-timing-function:ease-in-out;
    //     -webkit-animation-name:breatheblue;
    //     -webkit-animation-duration:2000ms;
    //     -webkit-animation-iteration-count:infinite;
    //     -webkit-animation-direction:alternate;
    // }
    // @keyframes breatheblue {
    //     0% {
    //         opacity:.8;
    //         box-shadow:0 1px 2px rgba(62,178,245,0.5);
    //     }
    //     100% {
    //         opacity:1;
    //         box-shadow:0 1px 30px rgba(147,116,247,0.6);
    //     }
    // }
    // .breathe-red {
    //     position:relative;
    //     color:#fff;
    //     text-align:center;
    //     cursor:pointer;
    //     box-shadow:0 1px 2px rgba(0,0,0,.3);
    //     overflow:hidden;
    //     -webkit-animation-timing-function:ease-in-out;
    //     -webkit-animation-name:breathered;
    //     -webkit-animation-duration:2000ms;
    //     -webkit-animation-iteration-count:infinite;
    //     -webkit-animation-direction:alternate;
    // }
    // @keyframes breathered {
    //     0% {
    //         opacity:.8;
    //         box-shadow:0 1px 2px rgba(247,126,137,0.5);
    //     }
    //     100% {
    //         opacity:1;
    //         box-shadow:0 1px 30px rgba(247,149,59,0.9);
    //     }
    // }
</style>
src/pages_qiun/components/uni-calendar/calendar.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,600 @@
/**
 * @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
src/pages_qiun/components/uni-calendar/uni-calendar-item.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,170 @@
<template>
    <view class="uni-calendar-item__weeks-box" :class="{
        'uni-calendar-item--disable':weeks.disable,
        'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
        'uni-calendar-item--checked':(calendar.fullDate === weeks.fullDate && !weeks.isDay) ,
        'uni-calendar-item--before-checked':weeks.beforeMultiple,
        'uni-calendar-item--multiple': weeks.multiple,
        'uni-calendar-item--after-checked':weeks.afterMultiple,
        }"
     @click="choiceDate(weeks)">
        <view class="uni-calendar-item__weeks-box-item">
            <text v-if="selected&&weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text>
            <text class="uni-calendar-item__weeks-box-text" :class="{
                'uni-calendar-item--isDay-text': weeks.isDay,
                'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
                'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
                'uni-calendar-item--before-checked':weeks.beforeMultiple,
                'uni-calendar-item--multiple': weeks.multiple,
                'uni-calendar-item--after-checked':weeks.afterMultiple,
                'uni-calendar-item--disable':weeks.disable,
                }">{{weeks.date}}</text>
            <text v-if="!lunar&&!weeks.extraInfo && weeks.isDay" class="uni-calendar-item__weeks-lunar-text" :class="{
                'uni-calendar-item--isDay-text':weeks.isDay,
                'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
                'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
                'uni-calendar-item--before-checked':weeks.beforeMultiple,
                'uni-calendar-item--multiple': weeks.multiple,
                'uni-calendar-item--after-checked':weeks.afterMultiple,
                }">今天</text>
            <text v-if="lunar&&!weeks.extraInfo" class="uni-calendar-item__weeks-lunar-text" :class="{
                'uni-calendar-item--isDay-text':weeks.isDay,
                'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
                'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
                'uni-calendar-item--before-checked':weeks.beforeMultiple,
                'uni-calendar-item--multiple': weeks.multiple,
                'uni-calendar-item--after-checked':weeks.afterMultiple,
                'uni-calendar-item--disable':weeks.disable,
                }">{{weeks.isDay?'今天': (weeks.lunar.IDayCn === '初一'?weeks.lunar.IMonthCn:weeks.lunar.IDayCn)}}</text>
            <text v-if="weeks.extraInfo&&weeks.extraInfo.info" class="uni-calendar-item__weeks-lunar-text" :class="{
                'uni-calendar-item--extra':weeks.extraInfo.info,
                'uni-calendar-item--isDay-text':weeks.isDay,
                'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
                'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
                'uni-calendar-item--before-checked':weeks.beforeMultiple,
                'uni-calendar-item--multiple': weeks.multiple,
                'uni-calendar-item--after-checked':weeks.afterMultiple,
                'uni-calendar-item--disable':weeks.disable,
                }">{{weeks.extraInfo.info}}</text>
        </view>
    </view>
</template>
<script>
    export default {
        props: {
            weeks: {
                type: Object,
                default () {
                    return {}
                }
            },
            calendar: {
                type: Object,
                default: () => {
                    return {}
                }
            },
            selected: {
                type: Array,
                default: () => {
                    return []
                }
            },
            lunar: {
                type: Boolean,
                default: false
            }
        },
        methods: {
            choiceDate(weeks) {
                this.$emit('change', weeks)
            }
        }
    }
</script>
<style lang="scss" scoped>
    .uni-calendar-item__weeks-box {
        flex: 1;
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: column;
        justify-content: center;
        align-items: center;
    }
    .uni-calendar-item__weeks-box-text {
        font-size: $uni-font-size-base;
        color: $uni-text-color;
    }
    .uni-calendar-item__weeks-lunar-text {
        font-size: $uni-font-size-sm;
        color: $uni-text-color;
    }
    .uni-calendar-item__weeks-box-item {
        position: relative;
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: column;
        justify-content: center;
        align-items: center;
        width: 100rpx;
        height: 100rpx;
    }
    .uni-calendar-item__weeks-box-circle {
        position: absolute;
        top: 5px;
        right: 5px;
        width: 8px;
        height: 8px;
        border-radius: 8px;
        background-color: $uni-color-error;
    }
    .uni-calendar-item--disable {
        background-color: rgba(249, 249, 249, $uni-opacity-disabled);
        color: $uni-text-color-disable;
    }
    .uni-calendar-item--isDay-text {
        color: $uni-color-primary;
    }
    .uni-calendar-item--isDay {
        background-color: $uni-color-primary;
        opacity: 0.8;
        color: #fff;
    }
    .uni-calendar-item--extra {
        color: $uni-color-error;
        opacity: 0.8;
    }
    .uni-calendar-item--checked {
        background-color: $uni-color-primary;
        color: #fff;
        opacity: 0.8;
    }
    .uni-calendar-item--multiple {
        background-color: $uni-color-primary;
        color: #fff;
        opacity: 0.8;
    }
    .uni-calendar-item--before-checked {
        background-color: #ff5a5f;
        color: #fff;
    }
    .uni-calendar-item--after-checked {
        background-color: #ff5a5f;
        color: #fff;
    }
</style>
src/pages_qiun/components/uni-calendar/uni-calendar.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,512 @@
<template>
    <view class="uni-calendar">
        <view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}" @click="clean"></view>
        <view v-if="insert || show" class="uni-calendar__content" :class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow}">
            <view v-if="!insert" class="uni-calendar__header uni-calendar--fixed-top">
                <view class="uni-calendar__header-btn-box" @click="close">
                    <text class="uni-calendar__header-text uni-calendar--fixed-width">取消</text>
                </view>
                <view class="uni-calendar__header-btn-box" @click="confirm">
                    <text class="uni-calendar__header-text uni-calendar--fixed-width">确定</text>
                </view>
            </view>
            <view class="uni-calendar__header">
                <view class="uni-calendar__header-btn-box" @click.stop="pre">
                    <view class="uni-calendar__header-btn uni-calendar--left"></view>
                </view>
                <picker mode="date" :value="date" fields="month" @change="bindDateChange">
                    <text class="uni-calendar__header-text">{{ (nowDate.year||'') +'å¹´'+( nowDate.month||'') +'月'}}</text>
                </picker>
                <view class="uni-calendar__header-btn-box" @click.stop="next">
                    <view class="uni-calendar__header-btn uni-calendar--right"></view>
                </view>
                <text class="uni-calendar__backtoday" @click="backtoday">回到今天</text>
            </view>
            <view class="uni-calendar__box">
                <view v-if="showMonth" class="uni-calendar__box-bg">
                    <text class="uni-calendar__box-bg-text">{{nowDate.month}}</text>
                </view>
                <view class="uni-calendar__weeks">
                    <view class="uni-calendar__weeks-day">
                        <text class="uni-calendar__weeks-day-text">日</text>
                    </view>
                    <view class="uni-calendar__weeks-day">
                        <text class="uni-calendar__weeks-day-text">一</text>
                    </view>
                    <view class="uni-calendar__weeks-day">
                        <text class="uni-calendar__weeks-day-text">二</text>
                    </view>
                    <view class="uni-calendar__weeks-day">
                        <text class="uni-calendar__weeks-day-text">三</text>
                    </view>
                    <view class="uni-calendar__weeks-day">
                        <text class="uni-calendar__weeks-day-text">四</text>
                    </view>
                    <view class="uni-calendar__weeks-day">
                        <text class="uni-calendar__weeks-day-text">五</text>
                    </view>
                    <view class="uni-calendar__weeks-day">
                        <text class="uni-calendar__weeks-day-text">六</text>
                    </view>
                </view>
                <view class="uni-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex">
                    <view class="uni-calendar__weeks-item" v-for="(weeks,weeksIndex) in item" :key="weeksIndex">
                        <calendar-item :weeks="weeks" :calendar="calendar" :selected="selected" :lunar="lunar" @change="choiceDate"></calendar-item>
                    </view>
                </view>
            </view>
        </view>
    </view>
</template>
<script>
    import Calendar from './util.js';
    import calendarItem from './uni-calendar-item.vue'
    /**
     * Calendar æ—¥åކ
     * @description æ—¥åŽ†ç»„ä»¶å¯ä»¥æŸ¥çœ‹æ—¥æœŸï¼Œé€‰æ‹©ä»»æ„èŒƒå›´å†…çš„æ—¥æœŸï¼Œæ‰“ç‚¹æ“ä½œã€‚å¸¸ç”¨åœºæ™¯å¦‚ï¼šé…’åº—æ—¥æœŸé¢„è®¢ã€ç«è½¦æœºç¥¨é€‰æ‹©è´­ä¹°æ—¥æœŸã€ä¸Šä¸‹ç­æ‰“å¡ç­‰
     * @tutorial https://ext.dcloud.net.cn/plugin?id=56
     * @property {String} date è‡ªå®šä¹‰å½“前时间,默认为今天
     * @property {Boolean} lunar æ˜¾ç¤ºå†œåކ
     * @property {String} startDate æ—¥æœŸé€‰æ‹©èŒƒå›´-开始日期
     * @property {String} endDate æ—¥æœŸé€‰æ‹©èŒƒå›´-结束日期
     * @property {Boolean} range èŒƒå›´é€‰æ‹©
     * @property {Boolean} insert = [true|false] æ’入模式,默认为false
     *     @value true å¼¹çª—模式
     *     @value false æ’入模式
     * @property {Boolean} clearDate = [true|false] å¼¹çª—模式是否清空上次选择内容
     * @property {Array} selected æ‰“点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}]
     * @property {Boolean} showMonth æ˜¯å¦é€‰æ‹©æœˆä»½ä¸ºèƒŒæ™¯
     * @event {Function} change æ—¥æœŸæ”¹å˜ï¼Œ`insert :ture` æ—¶ç”Ÿæ•ˆ
     * @event {Function} confirm ç¡®è®¤é€‰æ‹©`insert :false` æ—¶ç”Ÿæ•ˆ
     * @event {Function} monthSwitch åˆ‡æ¢æœˆä»½æ—¶è§¦å‘
     * @example <uni-calendar :insert="true":lunar="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" />
     */
    export default {
        components: {
            calendarItem
        },
        props: {
            date: {
                type: String,
                default: ''
            },
            selected: {
                type: Array,
                default () {
                    return []
                }
            },
            lunar: {
                type: Boolean,
                default: false
            },
            startDate: {
                type: String,
                default: ''
            },
            endDate: {
                type: String,
                default: ''
            },
            range: {
                type: Boolean,
                default: false
            },
            insert: {
                type: Boolean,
                default: true
            },
            showMonth: {
                type: Boolean,
                default: true
            },
            clearDate: {
                type: Boolean,
                default: true
            }
        },
        data() {
            return {
                show: false,
                weeks: [],
                calendar: {},
                nowDate: '',
                aniMaskShow: false
            }
        },
        watch: {
            date(newVal) {
                this.cale.setDate(newVal)
                this.init(this.cale.selectDate.fullDate)
            },
            startDate(val){
                this.cale.resetSatrtDate(val)
            },
            endDate(val){
                this.cale.resetEndDate(val)
            },
            selected(newVal) {
                this.cale.setSelectInfo(this.nowDate.fullDate, newVal)
                this.weeks = this.cale.weeks
            }
        },
        created() {
            // èŽ·å–æ—¥åŽ†æ–¹æ³•å®žä¾‹
            this.cale = new Calendar({
                // date: new Date(),
                selected: this.selected,
                startDate: this.startDate,
                endDate: this.endDate,
                range: this.range,
            })
            // é€‰ä¸­æŸä¸€å¤©
            this.cale.setDate(this.date)
            this.init(this.cale.selectDate.fullDate)
            // this.setDay
        },
        methods: {
            // å–消穿透
            clean() {
                this.aniMaskShow = false
                this.$nextTick(() => {
                    setTimeout(() => {
                        this.show = false
                        this.$emit('close')
                    }, 300)
                })
            },
            bindDateChange(e) {
                const value = e.detail.value + '-1'
                this.cale.setDate(value)
                this.init(value)
            },
            /**
             * åˆå§‹åŒ–日期显示
             * @param {Object} date
             */
            init(date) {
                this.weeks = this.cale.weeks
                this.nowDate = this.calendar = this.cale.getInfo(date)
            },
            /**
             * æ‰“开日历弹窗
             */
            open() {
                // å¼¹çª—模式并且清理数据
                if (this.clearDate && !this.insert) {
                    this.cale.cleanMultipleStatus()
                    this.cale.setDate(this.date)
                    this.init(this.cale.selectDate.fullDate)
                }
                this.show = true
                this.$nextTick(() => {
                    setTimeout(() => {
                        this.aniMaskShow = true
                    }, 50)
                })
            },
            /**
             * å…³é—­æ—¥åŽ†å¼¹çª—
             */
            close() {
                this.aniMaskShow = false
                this.$nextTick(() => {
                    setTimeout(() => {
                        this.show = false
                        this.$emit('close')
                    }, 300)
                })
            },
            /**
             * ç¡®è®¤æŒ‰é’®
             */
            confirm() {
                this.setEmit('confirm')
                this.close()
            },
            /**
             * å˜åŒ–触发
             */
            change() {
                if (!this.insert) return
                this.setEmit('change')
            },
            /**
             * é€‰æ‹©æœˆä»½è§¦å‘
             */
            monthSwitch() {
                let {
                    year,
                    month
                } = this.nowDate
                this.$emit('monthSwitch', {
                    year,
                    month: Number(month)
                })
            },
            /**
             * æ´¾å‘事件
             * @param {Object} name
             */
            setEmit(name) {
                let {
                    year,
                    month,
                    date,
                    fullDate,
                    lunar,
                    extraInfo
                } = this.calendar
                this.$emit(name, {
                    range: this.cale.multipleStatus,
                    year,
                    month,
                    date,
                    fulldate: fullDate,
                    lunar,
                    extraInfo: extraInfo || {}
                })
            },
            /**
             * é€‰æ‹©å¤©è§¦å‘
             * @param {Object} weeks
             */
            choiceDate(weeks) {
                if (weeks.disable) return
                this.calendar = weeks
                // è®¾ç½®å¤šé€‰
                this.cale.setMultiple(this.calendar.fullDate)
                this.weeks = this.cale.weeks
                this.change()
            },
            /**
             * å›žåˆ°ä»Šå¤©
             */
            backtoday() {
                console.log(this.cale.getDate(new Date()).fullDate);
                let date = this.cale.getDate(new Date()).fullDate
                this.cale.setDate(date)
                this.init(date)
                this.change()
            },
            /**
             * ä¸Šä¸ªæœˆ
             */
            pre() {
                const preDate = this.cale.getDate(this.nowDate.fullDate, -1, 'month').fullDate
                this.setDate(preDate)
                this.monthSwitch()
            },
            /**
             * ä¸‹ä¸ªæœˆ
             */
            next() {
                const nextDate = this.cale.getDate(this.nowDate.fullDate, +1, 'month').fullDate
                this.setDate(nextDate)
                this.monthSwitch()
            },
            /**
             * è®¾ç½®æ—¥æœŸ
             * @param {Object} date
             */
            setDate(date) {
                this.cale.setDate(date)
                this.weeks = this.cale.weeks
                this.nowDate = this.cale.getInfo(date)
            }
        }
    }
</script>
<style lang="scss" scoped>
    .uni-calendar {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: column;
    }
    .uni-calendar__mask {
        position: fixed;
        bottom: 0;
        top: 0;
        left: 0;
        right: 0;
        background-color: $uni-bg-color-mask;
        transition-property: opacity;
        transition-duration: 0.3s;
        opacity: 0;
        /* #ifndef APP-NVUE */
        z-index: 99;
        /* #endif */
    }
    .uni-calendar--mask-show {
        opacity: 1
    }
    .uni-calendar--fixed {
        position: fixed;
        bottom: 0;
        left: 0;
        right: 0;
        transition-property: transform;
        transition-duration: 0.3s;
        transform: translateY(460px);
        /* #ifndef APP-NVUE */
        z-index: 99;
        /* #endif */
    }
    .uni-calendar--ani-show {
        transform: translateY(0);
    }
    .uni-calendar__content {
        background-color: #fff;
    }
    .uni-calendar__header {
        position: relative;
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
        justify-content: center;
        align-items: center;
        height: 50px;
        border-bottom-color: $uni-border-color;
        border-bottom-style: solid;
        border-bottom-width: 1px;
    }
    .uni-calendar--fixed-top {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
        justify-content: space-between;
        border-top-color: $uni-border-color;
        border-top-style: solid;
        border-top-width: 1px;
    }
    .uni-calendar--fixed-width {
        width: 50px;
        // padding: 0 15px;
    }
    .uni-calendar__backtoday {
        position: absolute;
        right: 0;
        top: 25rpx;
        padding: 0 5px;
        padding-left: 10px;
        height: 25px;
        line-height: 25px;
        font-size: 12px;
        border-top-left-radius: 25px;
        border-bottom-left-radius: 25px;
        color: $uni-text-color;
        background-color: $uni-bg-color-hover;
    }
    .uni-calendar__header-text {
        text-align: center;
        width: 100px;
        font-size: $uni-font-size-base;
        color: $uni-text-color;
    }
    .uni-calendar__header-btn-box {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
        align-items: center;
        justify-content: center;
        width: 50px;
        height: 50px;
    }
    .uni-calendar__header-btn {
        width: 10px;
        height: 10px;
        border-left-color: $uni-text-color-placeholder;
        border-left-style: solid;
        border-left-width: 2px;
        border-top-color: $uni-color-subtitle;
        border-top-style: solid;
        border-top-width: 2px;
    }
    .uni-calendar--left {
        transform: rotate(-45deg);
    }
    .uni-calendar--right {
        transform: rotate(135deg);
    }
    .uni-calendar__weeks {
        position: relative;
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: row;
    }
    .uni-calendar__weeks-item {
        flex: 1;
    }
    .uni-calendar__weeks-day {
        flex: 1;
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: column;
        justify-content: center;
        align-items: center;
        height: 45px;
        border-bottom-color: #F5F5F5;
        border-bottom-style: solid;
        border-bottom-width: 1px;
    }
    .uni-calendar__weeks-day-text {
        font-size: 14px;
    }
    .uni-calendar__box {
        position: relative;
    }
    .uni-calendar__box-bg {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        justify-content: center;
        align-items: center;
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
    }
    .uni-calendar__box-bg-text {
        font-size: 200px;
        font-weight: bold;
        color: $uni-text-color-grey;
        opacity: 0.1;
        text-align: center;
        /* #ifndef APP-NVUE */
        line-height: 1;
        /* #endif */
    }
</style>
src/pages_qiun/components/uni-calendar/util.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,357 @@
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 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)
            }
            if (this.endDate) {
                let dateCompAfter = this.dateCompare(fullDate, this.endDate)
                disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate)
            }
            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 {
            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
src/pages_qiun/components/wuc-tab/wuc-tab.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,134 @@
<template>
  <scroll-view class="wuc-tab" :class="tabClass" :style="tabStyle" scroll-with-animation scroll-x :scroll-left="scrollLeft">
    <div v-if="!textFlex">
      <div class="wuc-tab-item" :class="[index === tabCur ? selectClass + ' cur':'']" v-for="(item,index) in tabList" :key="index" :id="index" @tap="tabSelect(index,$event)">
        <text :class="item.icon"></text>
        <span>{{item.name}}</span>
      </div>
    </div>
    <div class="flex text-center" v-if="textFlex">
      <div class="wuc-tab-item flex-sub" :class="index === tabCur ? selectClass + ' cur':''" v-for="(item,index) in tabList" :key="index" :id="index" @tap="tabSelect(index,$event)">
        <text :class="item.icon"></text>
        <span>{{item.name}}</span>
      </div>
    </div>
  </scroll-view>
</template>
<script>
export default {
    name: 'wuc-tab',
    data() {
        return {};
    },
    props: {
        tabList: {
            type: Array,
            default() {
                return [];
            }
        },
        tabCur: {
            type: Number,
            default() {
                return 0;
            }
        },
        tabClass: {
            type: String,
            default() {
                return '';
            }
        },
        tabStyle: {
            type: String,
            default() {
                return '';
            }
        },
        textFlex: {
            type: Boolean,
            default() {
                return false;
            }
        },
        selectClass: {
            type: String,
            default() {
                return 'text-blue';
            }
        }
    },
    methods: {
        tabSelect(index, e) {
            if (this.currentTab === index) return false;
            this.$emit('update:tabCur', index);
            this.$emit('changeTab', this.tabList[index]);
        }
    },
    computed: {
        scrollLeft() {
            return (this.tabCur - 1) * 60;
        }
    }
};
</script>
<style>
div,
scroll-view,
swiper {
    box-sizing: border-box;
}
.wuc-tab {
    white-space: nowrap;
}
.wuc-tab-item {
    height: 90rpx;
    display: inline-block;
    line-height: 90rpx;
    margin: 0 10upx;
    padding: 0 20upx;
}
.wuc-tab-item.cur {
    color: #40A2ED;
    background-color: #fff;
}
.wuc-tab.fixed {
    position: fixed;
    width: 100%;
    top: 0;
    z-index: 1024;
    box-shadow: 0 1upx 6upx rgba(0, 0, 0, 0.1);
}
.flex {
    display: flex;
}
.text-center {
    text-align: center;
}
.flex-sub {
    flex: 1;
}
.text-blue{
  color:#40A2ED;
}
.text-white{
  color:#ffffff;
}
.bg-white{
    background-color: #ffffff;
}
.bg-blue{
    background-color: #40A2ED;
}
.text-orange{
  color: #f37b1d
}
.text-xl {
    font-size: 36upx;
}
</style>
src/pages_qiun/pages/finance/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,585 @@
<script setup>
import { ref, reactive, watch, onMounted } from 'vue';
import ProgressBar from "../../components/progress-bar/progress-bar.vue"
import dataOne from '../../static/json/finance/1.json';
import expendDetail from '../../static/json/finance/2.json';
import Config from '../../static/js/config'
import Common from '../../static/js/common'
let _now = new Date();
let now_time = {};
now_time.year = _now.getFullYear()
now_time.month = _now.getMonth() + 1
now_time.day = _now.getDay()
// æ•°æ®å®šä¹‰
const info = ref('大便超人'); // ç”¨æˆ·æ•°æ®
const scrollHeight = ref("600px"); // æ•°æ®å±•示体高度
const isCanvas2d = ref(Config.ISCANVAS2D);
const historyData = ref({});
const expendCount = ref(0);
const delayload = ref(false);
const nowTime = reactive({
  year: now_time.year,
  month: now_time.month,
  day: now_time.day
});
const historyBtn = reactive([
  {
    name: "支出",
    state: 1,
    type: "expend"
  },
  {
    name: "收入",
    state: 0,
    type: "income"
  },
  {
    name: "结余",
    state: 0,
    type: "remaining"
  }
]);
const myWallet = reactive({
  remaining: 3000.34,
  expend: 5240.32,
  income: 8240.66
});
const extendRank = reactive([
  {
    name: "腐败聚会",
    desc: now_time.month + "月6日12:34-跨界空间轰趴",
    money: "422.12"
  },
  {
    name: "沐浴按摩",
    desc: now_time.month + "月12日21:34-乔杉沐浴城",
    money: "318.00"
  },
  {
    name: "食品酒水",
    desc: now_time.month + "月1日21:34-school酒馆",
    money: "289.50"
  }
]);
const extend_level_bar = reactive([
  { name: "低消费", range: "<2000元", width: "20%" },
  { name: "中间消费", range: "2000-5000元", width: "35%" },
  { name: "较高消费", range: "5000-8000元", width: "25%", state: 1 },
  { name: "高消费", range: ">8000元", width: "20%" }
]);
const extend_morethan = ref("68%");
const detail_list = reactive([
  { date: now_time.month + "-01", time: "11:01", "type": "extend", money: "10.00", desc: "银行卡转出" },
  { date: now_time.month + "-01", time: "13:45", "type": "income", money: "18.00", desc: "银行卡收入" },
  { date: now_time.month + "-02", time: "06:21", "type": "extend", money: "123.45", desc: "信用卡转出" },
  { date: now_time.month + "-03", time: "07:38", "type": "income", money: "23.00", desc: "银行卡收入" },
  { date: now_time.month + "-08", time: "16:28", "type": "extend", money: "23.56", desc: "信用卡转出" },
  { date: now_time.month + "-09", time: "15:25", "type": "income", money: "850.12", desc: "银行卡收入" },
  { date: now_time.month + "-09", time: "18:52", "type": "income", money: "1.88", desc: "银行卡收入" },
  { date: now_time.month + "-11", time: "21:12", "type": "extend", money: "220.21", desc: "银行卡转出" },
  { date: now_time.month + "-12", time: "13:08", "type": "income", money: "32.28", desc: "银行卡收入" },
  { date: now_time.month + "-12", time: "12:41", "type": "extend", money: "122.12", desc: "信用卡转出" },
  { date: now_time.month + "-13", time: "17:21", "type": "income", money: "10.00", desc: "银行卡收入" }
]);
// ç›‘听器
watch(historyBtn, () => {
  filterHistoryData();
}, { deep: true });
// æ–¹æ³•定义
async function getData() {
  uni.showLoading();
  filterHistoryData();
  for (let i = 0; i < expendDetail.series.length; i++) {
    expendDetail.series[i].format = "pieDemo";
  }
  let length = expendDetail.series[0].data.length;
  for (let i = 0; i < length; i++) {
    expendCount.value += expendDetail.series[0].data[i].value;
  }
  await setTimeout(() => {
    delayload.value = true;
    uni.hideLoading();
  }, 1000);
}
function changeHistoryBtn(type) {
  for (let i = 0; i < historyBtn.length; i++) {
    if (historyBtn[i].type == type) {
      historyBtn[i].state = 1;
    } else {
      historyBtn[i].state = 0;
    }
  }
}
function filterHistoryData() {
  let type = historyBtn.filter(x => x.state == 1)[0].type;
  switch (type) {
    case "expend":
      historyData.value = dataOne.expend;
      break;
    case "income":
      historyData.value = dataOne.income;
      break;
    case "remaining":
      historyData.value = dataOne.remaining;
      break;
  }
}
function gotoBack() {
  Common.navigateBack("/index/index");
}
function getImage(index) {
  switch (index) {
    case 0:
      return "https://s1.ax1x.com/2023/03/31/ppRYrfP.png";
    case 1:
      return "https://s1.ax1x.com/2023/03/31/ppRYySf.png";
    case 2:
      return "https://s1.ax1x.com/2023/03/31/ppRY6l8.png";
  }
}
// ç”Ÿå‘½å‘¨æœŸ
onMounted(() => {
  //#ifndef H5
  uni.showShareMenu();
  //#endif
  getData();
});
</script>
<template>
    <view class="body">
        <!-- <view class="topLine" :style="{height: topBar+'px'}"></view> -->
        <view class="nav row_align_center" id="nav">
            <li class="li_4" style="color: #fff;z-index: 999;" :class="['iconfont icon-zuojiantou back']" @click="gotoBack()"></li>
        </view>
        <view class="top_head">
            <view class="text_des">
                <text class="month_num">{{ nowTime.month }}</text>
                <text class="month_text">月</text>
                <text class="month_year">{{ nowTime.year }}</text>
                <text class="point">.</text>
                <text class="title">财务报告</text>
            </view>
            <view class="top_desc">
                <view class="text-gray">结余</view>
                <view class="remaining">{{ myWallet.remaining }}</view>
                <view class="row head_block">
                    <view class="flex_1">
                        <text class="text-gray">支出</text>
                        <text class="text_green">{{ myWallet.expend }}</text>
                    </view>
                    <view class="flex_1">
                        <text class="text-gray">收入</text>
                        <text class="income">{{ myWallet.income }}</text>
                    </view>
                </view>
            </view>
        </view>
        <view class="main">
            <view class="row_block">
                <view class="the_title" style="justify-content: space-between;">
                    <view class="left_title">
                        <view class="title_icon"></view>
                        <text class="margin_stand-samll font-big wide">历史趋势</text>
                    </view>
                    <view class="right_btn">
                        <view v-for="(item, index) in historyBtn" :key="index" :class="item.state ? 'active_btn' : ''"
                            @click="changeHistoryBtn(item.type)">{{ item.name }}</view>
                    </view>
                </view>
                <view class="charts-box" style="height: 200px;">
                    <qiun-data-charts type="line" canvasId="finance_a" :canvas2d="isCanvas2d" :reshow="delayload"
                        :opts="{ xAxis: { itemCount: 12, disableGrid: true }, yAxis: { disableGrid: true, data: [{ disabled: true }] } }"
                        :chartData="historyData" />
                </view>
            </view>
            <view class="row_block">
                <view class="the_title">
                    <view class="title_icon"></view>
                    <text class="margin_stand-samll font-big wide">钱都去哪了</text>
                </view>
                <view v-if="delayload" class="charts-box">
                    <qiun-data-charts type="ring" canvasId="finance_b" :canvas2d="isCanvas2d" :reshow="delayload"
                        :opts="{ padding: [15, 0, 4, 0], legend: { position: 'bottom' }, title: { name: expendCount }, subtitle: { name: '支出', fontSize: '20' } }"
                        :chartData="expendDetail" />
                </view>
                <view class="the_title">
                    <text class="margin_stand-samll font-middle wide">支出单笔最贵</text>
                </view>
                <view class="extend_rank">
                    <view class="rank_item" v-for="(item, index) in extendRank" :key="index">
                        <image :src="getImage(index)" mode="widthFix"></image>
                        <text class="name">{{ item.name }}</text>
                        <text class="desc">{{ item.desc }}</text>
                        <text class="text_green money">{{ item.money }}</text>
                    </view>
                </view>
            </view>
            <view class="row_block">
                <view class="the_title">
                    <view class="title_icon"></view>
                    <text class="margin_stand-samll font-big wide">{{ nowTime.month }}月明细</text>
                </view>
                <view class="detail_list">
                    <view v-for="(item, index) in detail_list" :key="index" class="detail_item">
                        <view>
                            <view class="font-middle">{{ item.date }}</view>
                            <view class="font-small">{{ item.time }}</view>
                        </view>
                        <view class="icon">
                            <li class="li_2" :class="['iconfont', item.type == 'income' ? 'icon-income' : 'icon-expend']"></li>
                        </view>
                        <view class="right_content">
                            <view class="money">{{ item.type == 'income' ? '+' : '-' }}{{ item.money }}</view>
                            <view class="text-gray font-middle">{{ item.desc }}</view>
                        </view>
                    </view>
                </view>
            </view>
            <view class="end_block">
                <view class="the_title" style="margin-bottom: 40rpx;">
                    <view class="title_icon"></view>
                    <text class="margin_stand-samll font-big wide">我的支出水平</text>
                </view>
                <view class="level_bar">
                    <view v-for="(item, index) in extend_level_bar" :key="index" :style="{ width: item.width }"
                        :class="item.state ? 'text_green font-middle' : ''">{{ item.name }}</view>
                </view>
                <view class="level_bar">
                    <view v-for="(item, index) in extend_level_bar" :key="index" :style="{ width: item.width }"
                        :class="item.state ? 'active_bar' : 'default_bar'"></view>
                </view>
                <view class="level_bar">
                    <view v-for="(item, index) in extend_level_bar" :key="index" :style="{ width: item.width }"
                        :class="item.state ? 'text_green font-middle' : ''">{{ item.range }}</view>
                </view>
                <view class="extend_message">
                    <li style="color: #ccc;" :class="['iconfont icon-message']"></li>
                    <view>
                        â€œ æˆ‘的支出水平已超过
                        <text>{{ extend_morethan }}</text>
                        çš„乡镇居民。 â€
                    </view>
                </view>
            </view>
        </view>
    </view>
</template>
<style scoped lang="scss">
.body {
    height: 100%;
    background-color: #560594;
    margin: 0;
    padding-bottom: 20rpx;
    .li_4 {
        list-style-type: none;
    }
    .nav {
        position: fixed;
        top: 50rpx;
        left: 20rpx;
    }
    .text_green {
        color: #4ECDB6;
    }
    .main {
        width: 100%;
        padding: 0 10rpx;
        box-sizing: border-box;
        margin-top: 20rpx;
        .detail_list {
            height: 700rpx;
            overflow: auto;
            color: #9E9E9E;
            .detail_item {
                display: flex;
                margin: 20rpx 0;
                align-items: center;
                .icon {
                    width: 30%;
                    text-align: center;
                    .li_2 {
                        font-size: 80rpx;
                    }
                }
                .right_content {
                    width: 50%;
                    text-align: center;
                }
                .icon-income {
                    color: #4AABF9;
                }
                .icon-expend {
                    color: #E45521;
                }
                .money {
                    color: #000;
                }
            }
        }
        .extend_message {
            margin-top: 20rpx;
            color: #ccc;
            display: flex;
            text {
                color: #ff9900;
            }
        }
        .level_bar {
            width: 100%;
            height: 40rpx;
            border-radius: 40rpx;
            overflow: hidden;
            display: flex;
            color: #ccc;
            font-size: 20rpx;
            text-align: right;
            line-height: 40rpx;
            view {
                border-right: 2rpx solid #fff;
                position: relative;
            }
            .name {
                position: absolute;
                top: -30rpx;
                right: -40rpx;
            }
            .range {
                position: absolute;
                bottom: 30rpx;
                right: -40rpx;
            }
            .default_bar {
                background-color: #A0DFCD;
            }
            .active_bar {
                background-color: #02AE7A;
            }
        }
        .right_btn {
            float: right;
            display: flex;
            color: #ccc;
            font-size: 22rpx;
            view {
                line-height: 50rpx;
                height: 50rpx;
                margin: 0 20rpx;
            }
            .active_btn {
                padding: 0rpx 20rpx;
                border: 1px solid #ccc;
                border-radius: 40rpx;
            }
        }
        .end_block {
            width: 100%;
            box-sizing: border-box;
            background-color: #fff;
            border-radius: 12rpx;
            position: relative;
            padding: 20rpx;
        }
        .row_block {
            width: 100%;
            box-sizing: border-box;
            background-color: #fff;
            border-radius: 12rpx;
            position: relative;
            padding: 20rpx;
            &::after {
                content: "";
                height: 0px;
                width: 92%;
                position: absolute;
                transform: translateX(-50%);
                left: 50%;
                bottom: 0;
                border-top: 1px dashed #ccc;
            }
        }
        .the_title {
            display: flex;
            align-items: center;
            .left_title {
                display: flex;
                align-items: center;
            }
            .title_icon {
                background-color: #7E7E7E;
                height: 40rpx;
                width: 10rpx;
                border-radius: 10rpx;
                margin-right: 20rpx;
                font-size: 16px;
                font-weight: 600;
            }
        }
        .extend_rank {
            width: 100%;
            background-color: #F5F5F5;
            box-sizing: border-box;
            padding: 10rpx;
            .rank_item {
                width: 100%;
                margin: 20rpx 0;
                box-sizing: border-box;
                display: flex;
                font-size: 26rpx;
                justify-content: space-between;
                align-items: center;
                image {
                    width: 10%;
                }
                text {
                    text-overflow: ellipsis;
                    overflow: hidden;
                    white-space: nowrap;
                    display: block;
                }
                .name {
                    margin: 0 10rpx;
                    color: #7D7D7D;
                    width: 20%;
                }
                .desc {
                    width: 50%;
                    color: #ccc;
                }
                .money {
                    width: 20%;
                    text-align: right;
                }
            }
        }
    }
    .top_head {
        height: 435rpx;
        width: 100%;
        padding: 110rpx 10rpx 0rpx 10rpx;
        background: url("https://img1.qunarzz.com/travel/d3/1704/db/34de73c353d44db5.jpg_r_640x426x70_53f464ca.jpg") no-repeat center 0px;
        background-size: 100% 100%;
        box-sizing: border-box;
        .top_desc {
            width: 100%;
            border-radius: 20rpx;
            background-color: #fff;
            margin-top: 20rpx;
            padding: 20rpx;
            box-sizing: border-box;
            .text-gray {
                font-size: 28rpx;
                color: #ccc;
                margin-right: 10rpx;
            }
            .remaining {
                font-size: 46rpx;
            }
            .flex_1 {
                flex: 1;
            }
            .head_block {
                margin-top: 20rpx;
                .income {
                    color: #E34B5E;
                }
            }
        }
        .text_des {
            height: 100rpx;
            color: #fff;
            font-weight: 900;
            position: relative;
            margin-left: 60rpx;
            text {
                display: inline-block;
                height: 100%;
            }
            .month_num {
                font-size: 90rpx;
            }
            .month_text {
                font-size: 56rpx;
            }
            .month_year {
                font-size: 22rpx;
                position: absolute;
                left: 60rpx;
                top: 20rpx;
            }
            .point {
                font-size: 40rpx;
            }
            .title {
                font-size: 40rpx;
            }
        }
    }
}
</style>
src/pages_qiun/pages/main/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,348 @@
<template>
    <view class="window">
        <!-- #ifndef H5 -->
        <view class="topLine" :style="{ height: topBar + 'px' }"></view>
        <!-- #endif -->
        <view class="nav row_align_center" id="nav">
            <li class="li_5" :class="['iconfont icon-zuojiantou back']" @click="gotoBack()"></li>
            <text class="title li_5">{{ title ? title : '' }}</text>
            <li class="iconfont icon-zuojiantou back hidden"></li>
        </view>
        <view class="row_align_center head" id="head">
            <!-- æ—¥æœŸä¸‹æ‹‰åˆ—表 -->
            <drop-down ref="caleDrop" @tap="changDrop(1)" @changeItem="changeTime" :list="timeArray" :contentTop="top"
                selectWidth="260rpx" contentLeft="0"></drop-down>
            <!-- æ—¥åŽ†é€‰æ‹©æ—¥æœŸ -->
            <view v-if="showCalendar"
                :class="['dropdown-item__selected', listWidth != '150rpx' ? 'dropdown-item__right' : 'dropdown-item__left']"
                @click="openCalendar" class="calendar_drag">
                <view class="selected__name">{{ nowDate }}</view>
                <li class="iconfont icon-calendar" style="margin-left: 10rpx;"></li>
            </view>
            <!-- å…¬å¸åŒºåŸŸä¸‹æ‹‰åˆ—表 -->
            <drop-down ref="companyDrop" @tap="changDrop(2)" @changeItem="changeLocation" :list="locationArray"
                :contentTop="top" contentRight="10" :selectWidth="showCalendar ? '200rpx' : '300rpx'" listWidth="75%">
            </drop-down>
        </view>
        <uni-calendar ref="calendar" :insert="false" :start-date="startDate" :end-date="endDate" :clearDate="false"
            @confirm="confirm">
        </uni-calendar>
        <!--滑动列表头-->
        <wuc-tab id="wuctab" :tab-list="tabList" :tabCur.sync="tabCur" tab-class="text-center text-white bg-blue"
            select-class="text-white"></wuc-tab>
        <!--主体内容-->
        <view class="data_body" :style="{ height: scrollHeight }">
            <view v-if="tabCur == 0">
                <wechat :scrollHeight="scrollHeight" />
            </view>
            <view v-else-if="tabCur == 1">
                <user-operate :scrollHeight="scrollHeight" />
            </view>
            <view v-else-if="tabCur == 2">
                <user-healthy :scrollHeight="scrollHeight" />
            </view>
            <view v-else-if="tabCur == 3">
                <user-server :scrollHeight="scrollHeight"></user-server>
            </view>
        </view>
        <!--水印-->
        <view class="water-mark-mask row_wrap" :style="{ height: scrollHeight }">
            <text class="container" v-for="(count, index) in 10" :key="index">{{ info.name }}</text>
        </view>
    </view>
</template>
<script>
import Wechat from "../../components/data-center/wechat.vue"
import UserOperate from "../../components/data-center/user-operate.vue"
import UserHealthy from "../../components/data-center/user-healthy.vue"
import UserServer from "../../components/data-center/user-server.vue"
import WucTab from '../../components/wuc-tab/wuc-tab.vue'
import DropDown from '../../components/drop-down/drop-down.vue'
import UniCalendar from '../../components/uni-calendar/uni-calendar.vue'
import Config from '../../static/js/config'
import Common from "../../static/js/common"
export default {
    components: {
        WucTab,
        DropDown,
        UniCalendar,
        Wechat,
        UserOperate,
        UserHealthy,
        UserServer,
    },
    data() {
        return {
            tabList: Config.TABLIST, //标签头
            timeArray: Config.TIMEARRAY, //时间数组
            info: '大便超人', //用户数据
            title: "数据报表中心", //标题
            showDataTime: "today", //选中的时间
            tabCur: 0, //标签头下标
            topBar: 17, //导航高
            top: '180', //下拉栏位置
            scrollHeight: "100%", //数据展示体高度
            nowDate: Common.getNowDate(), //现在日期
            endDate: Common.getNowDate(), //日历可选日期范围的结束时间
            startDate: Common.getPreMonth(Common.getNowDate()), //日历可选日期范围的开始时间,
            showCalendar: false,
        };
    },
    computed: {
        locationArray() {
            return [{
                value: "GDBJ-ENTRY-1",
                text: "天猫"
            }, {
                value: "GDBJ-ENTRY-201",
                text: "京东"
            }];
        }
    },
    methods: {
        gotoBack() {
            Common.navigateBack("/index/index");
        },
        changDrop(index) {
            if (index == 1 && this.$refs.companyDrop.showList) {
                this.$refs.companyDrop.closePopup()
            } else if (index == 2 && this.$refs.caleDrop.showList) {
                this.$refs.caleDrop.closePopup()
            }
        },
        // æ‰“开日历
        openCalendar() {
            this.$refs.calendar.open();
        },
        // æ—¥åŽ†é€‰æ‹©æ—¥æœŸ
        confirm(e) {
            if (this.nowDate != e.fulldate || !this.showCalendar) {
                this.showCalendar = true;
                this.$refs.caleDrop.selectAuto();
                this.nowDate = e.fulldate;
                this.showDataTime = e.fulldate.replace(/-/g, "");
                Common.tipMsg("当前时间:" + this.showDataTime)
            }
        },
        //下拉选择时间
        changeTime(e) {
            if (e.value == "auto") {
                this.openCalendar();
            } else if (this.showDataTime != e.value) {
                this.showDataTime = e.value;
                this.showCalendar = false;
                Common.tipMsg("当前时间:" + this.showDataTime)
            }
        },
        changeLocation(e) {
            Common.tipMsg("当前选中平台:" + e.text)
        },
        //获取设备信息
        async getTelephoneInfo() {
            var telephoneInfo = await Common.getTelephoneInfo();
            let hasHeight = 0;
            if (telephoneInfo.top >= 40) {
                this.top = telephoneInfo.statusBarHeight * 2 + 150;
                this.topBar = telephoneInfo.statusBarHeight;
            }
            // è®¾ç½®æ»šåŠ¨é«˜åº¦
            const query = wx.createSelectorQuery();
            query.select('#nav').boundingClientRect();
            query.select('#head').boundingClientRect();
            query.select('#wuctab').boundingClientRect();
            query.exec(res => {
                res.map((item, index) => {
                    hasHeight += item.height;
                })
                this.scrollHeight = (telephoneInfo.screenHeight - hasHeight - this.topBar) + 'px';
            })
        },
        getH5Info() {
            uni.getSystemInfo({
                success: e => {
                    let hasHeight = 0;
                    let element = wx.createSelectorQuery().in(this);
                    element.select('#nav').boundingClientRect();
                    element.select('#head').boundingClientRect();
                    element.select('#wuctab').boundingClientRect();
                    element.exec(res => {
                        res.map((item, index) => {
                            hasHeight += item.height;
                        })
                        this.scrollHeight = (e.screenHeight - hasHeight) + 'px';
                    })
                },
                fail: (err) => {
                    reject(err);
                }
            })
        }
    },
    onReady() {
        //#ifndef H5
        uni.showShareMenu();
        this.getTelephoneInfo();
        //#endif
        //#ifdef H5
        this.getH5Info();
        //#endif
    }
};
</script>
<style lang="scss">
page,
body {
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100%;
}
.li_5 {
    list-style-type: none;
}
.window {
    height: 100vh;
    overflow: hidden;
    .topLine {
        background-color: #40A2ED;
        width: 100%;
    }
    scroll-view {
        box-sizing: border-box;
    }
    .swiper {
        box-sizing: border-box;
    }
    .nav {
        background-image: url(http://photo.gdbjyy.cn/image/BCAI/top_bg.jpg);
        background-size: 100% 100%;
        .back {
            font-size: 54rpx;
            padding: 20rpx 14rpx 15rpx 14rpx;
            color: #fff;
        }
        .title {
            color: #fff;
            font-size: 30rpx;
            flex: 1;
            text-align: center;
        }
        .hidden {
            visibility: hidden;
        }
    }
    .head {
        padding: 0 16rpx 14rpx 16rpx;
        color: #fff;
        background-color: #40A2ED;
        justify-content: space-between;
        font-size: 26rpx !important;
        .calendar_drag {
            width: 340rpx;
            display: flex;
            justify-content: center;
            align-items: center;
            .calendar_name {
                margin-right: 10rpx;
            }
            .icon-calendar {
                font-size: 26rpx;
                margin-top: 4rpx;
            }
        }
    }
    .data_body {
        overflow: auto;
        text-align: center;
        color: #333333;
        background-repeat: repeat;
        background-color: #ffffff;
        position: relative;
        .item {
            padding: 0 20rpx;
            margin-bottom: 20rpx;
            .name {
                font-weight: 600;
                font-size: 36rpx;
            }
            .operate {
                view {
                    padding: 5rpx 12rpx;
                    color: #fff;
                }
                .bg-blue {
                    background-color: #40A2ED;
                }
                .bg-yellow {
                    background-color: #FFC300;
                }
            }
            .tip {
                margin-bottom: 30rpx;
                .update {
                    color: #C4100A;
                    margin-left: auto;
                    font-size: 30rpx;
                }
            }
        }
        .cry {
            font-size: 96rpx;
            margin-bottom: 10rpx;
        }
    }
}
.water-mark-mask {
    width: 100%;
    position: fixed;
    left: 0;
    bottom: 0;
    z-index: 1000;
    justify-content: space-between;
    pointer-events: none; //无视鼠标事件,相当于鼠标事件透传下去一样
    flex: 1;
    overflow: hidden;
    text {
        width: 50%;
        color: #909399;
        opacity: 0.25;
        transform: rotate(-15deg);
    }
}
.histogram {
    height: 100%;
    width: 100%;
    canvas {
        margin-top: 40rpx;
    }
}
</style>
src/pages_qiun/pages/school/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,259 @@
<template>
    <view class="body window">
        <view class="topLine" :style="{ height: topBar + 'px' }"></view>
        <view class="nav row_align_center" id="nav">
            <li class="li_6" :class="['iconfont icon-zuojiantou back']" @click="gotoBack()"></li>
            <text class="title">{{ title ? title : '' }}</text>
            <li class="iconfont icon-zuojiantou back hidden li_6"></li>
        </view>
        <view class="data_body">
            <scroll-view class="scroll_list" scroll-y :style="{ height: scrollHeight }">
                <!-- æ•™å­¦ç§‘研情况 -->
                <view class="view_block">
                    <view class="title">教学科研情况</view>
                    <progress-bar :content="RankData" @updateRanking="updateRanking"></progress-bar>
                </view>
                <!-- å­¦åŽ†åˆ†å¸ƒçŠ¶å†µ -->
                <view class="view_block">
                    <view class="title">学历分布状况
                        <text class="font-small" style="color: #ccc;">(教职工)</text>
                    </view>
                    <view class="charts-box" style="height: 300px;">
                        <qiun-data-charts type="rose" :chartData="ProductRateData" canvasId="school_a"
                            :canvas2d="isCanvas2d" :resshow="delayload" />
                    </view>
                </view>
                <!-- å­¦ä¸šæˆç»© -->
                <view class="view_block">
                    <view class="title">学业成绩分布图
                        <text class="font-small" style="color: #ccc;">(班级)</text>
                    </view>
                    <view class="charts-box" style="height: 300px;">
                        <qiun-data-charts type="radar" :chartData="RadarModel" background="none" canvasId="school_b"
                            :animation="false" :canvas2d="isCanvas2d" :resshow="delayload" />
                    </view>
                </view>
                <!-- å›¾ä¹¦å€Ÿé˜…情况 -->
                <view class="view_block">
                    <view class="title">图书借阅情况</view>
                    <view class="charts-box" style="height: 300px;">
                        <qiun-data-charts type="line" canvasId="school_c" :canvas2d="isCanvas2d" :resshow="delayload"
                            :ontouch="true"
                            :opts="{ enableScroll: true, xAxis: { scrollShow: true, itemCount: 4, disableGrid: true }, series: { style: 'curve' } }"
                            :chartData="friendTrand" />
                    </view>
                </view>
            </scroll-view>
        </view>
    </view>
</template>
<script>
import ProgressBar from "../../components/progress-bar/progress-bar.vue"
import RankData from '../../static/json/school/1.json';
import ProductRateData from '../../static/json/school/2.json';
import RadarModel from '../../static/json/school/3.json';
import friendTrand from '../../static/json/school/4.json';
import Config from '../../static/js/config'
import Common from '../../static/js/common'
export default {
    components: {
        ProgressBar
    },
    data() {
        return {
            info: "大便超人", //用户数据
            title: "智慧教育报表中心", //标题
            showDataTime: "today", //选中的时间
            tabCur: 0, //标签头下标
            topBar: 17, //导航高
            top: '180', //下拉栏位置
            scrollHeight: "1400rpx", //数据展示体高度
            friendTrand,
            RankData,
            ProductRateData,
            RadarModel,
            isCanvas2d: Config.ISCANVAS2D,
            delayload: false, //延时加载图表,否则会出现图表加载完后定位错乱
        };
    },
    computed: {
        locationArray() {
            return [{ value: "GDBJ-ENTRY-1", text: "天猫" }, { value: "GDBJ-ENTRY-201", text: "京东" }];
        }
    },
    methods: {
        async getData() {
            uni.showLoading();
            await setTimeout(() => {
                this.delayload = true;
                uni.hideLoading();
            }, 1000)
        },
        gotoBack() {
            Common.navigateBack("/index/index");
        },
        //获取设备信息
        async getTelephoneInfo() {
            var telephoneInfo = await Common.getTelephoneInfo();
            let hasHeight = 0;
            if (telephoneInfo.top >= 40) {
                this.top = telephoneInfo.statusBarHeight * 2 + 150;
                this.topBar = telephoneInfo.statusBarHeight;
            }
            // è®¾ç½®æ»šåŠ¨é«˜åº¦
            const query = wx.createSelectorQuery();
            query.select('#nav').boundingClientRect();
            query.exec(res => {
                res.map((item, index) => {
                    hasHeight += item.height;
                })
                this.scrollHeight = (telephoneInfo.screenHeight - hasHeight - this.topBar) + 'px';
            })
        },
        updateRanking(nVal) {
            this.RankData = nVal;
        },
    },
    onLoad() {
        //#ifndef H5
        uni.showShareMenu();
        //#endif
        this.getData()
        this.getTelephoneInfo();
    }
}
</script>
<style scoped lang="scss">
.body {
    height: 100vh;
    margin: 0;
    padding: 0 20rpx;
    font-family: "montserrat";
    background-image: linear-gradient(125deg, #CB9FFE, #5894F7, #ABCDFA, #74A3F6, #CB9FFE);
    background-size: 400%;
    animation: bganimation 15s infinite;
}
.li_6 {
    list-style-type: none;
}
page,
body {
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100%;
}
.window {
    height: 100vh;
    overflow: hidden;
    .topLine {
        width: 100%;
    }
    scroll-view {
        box-sizing: border-box;
    }
    .swiper {
        box-sizing: border-box;
    }
    .nav {
        background-size: 100% 100%;
        .back {
            font-size: 54rpx;
            padding: 20rpx 14rpx 15rpx 14rpx;
            color: #fff;
        }
        .title {
            color: #fff;
            font-size: 30rpx;
            flex: 1;
            text-align: center;
        }
        .hidden {
            visibility: hidden;
        }
    }
    .head {
        padding: 0 16rpx 14rpx 16rpx;
        color: #fff;
        background-color: #40A2ED;
        justify-content: space-between;
        font-size: 26rpx !important;
        .calendar_drag {
            width: 340rpx;
            display: flex;
            justify-content: center;
            align-items: center;
            .calendar_name {
                margin-right: 10rpx;
            }
            .icon-calendar {
                font-size: 26rpx;
                margin-top: 4rpx;
            }
        }
    }
    .data_body {
        overflow: auto;
        text-align: center;
        color: #333333;
        background-repeat: repeat;
        height: 100%;
        .scroll_list {
            height: 100%;
            .view_block {
                background-color: #fff;
                padding: 16rpx 20rpx 10rpx 20rpx;
                border-radius: 20rpx;
                margin-bottom: 40rpx;
                .title {
                    text-align: left;
                    margin-bottom: 30rpx;
                    font-size: 30rpx;
                }
                .trend_title {
                    text-align: right;
                    font-size: 22rpx;
                    color: #ff9900;
                    margin-top: 50rpx;
                }
            }
        }
    }
}
@keyframes bganimation {
    0% {
        background-position: 0% 50%;
    }
    50% {
        background-position: 100% 50%;
    }
    100% {
        background-position: 0% 50%;
    }
}
</style>
src/pages_qiun/pages/sport/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,762 @@
<template>
    <view class="body">
        <view class="nav row_align_center" id="nav">
            <li class="li_7" style="z-index: 999;font-size: 50rpx;" :class="['iconfont icon-zuojiantou back']" @click="gotoBack()">
            </li>
        </view>
        <view class="head">
            <view class="title">运动报告</view>
            <view class="customer_img">
                <!-- <open-data type="userAvatarUrl" class="img"></open-data> -->
                <image class="img" src="https://s1.ax1x.com/2022/11/16/zZUoK1.jpg" mode="widthFix"></image>
            </view>
        </view>
        <view class="score_view">
            <view class="title">本次评分</view>
            <view class="detail">
                <view class="socre">98</view>
                <li class="li_7" :class="['iconfont icon-up text-green']" @click="gotoBack()"></li>
                <view class="up_socre">0.4</view>
            </view>
        </view>
        <view class="census_view">
            <view class="left">
                <view class="text_gray small_text">消耗(千卡)</view>
                <view class="middle_text text_wide_900">165</view>
            </view>
            <view class="right">
                <view class="text_gray small_text">心率主要集中在</view>
                <view style="font-size: 30rpx;">燃烧脂肪</view>
            </view>
        </view>
        <view class="census_view">
            <view class="left">
                <view class="text_gray small_text">时长(分钟)</view>
                <view class="middle_text text_wide_900">75</view>
            </view>
            <view class="center">
                <view class="text_gray small_text">累计打卡(天)</view>
                <view class="middle_text text_wide_900">24</view>
            </view>
            <view class="right">
                <view class="text_gray small_text">平均心率(次/分钟)</view>
                <view class="middle_text text_wide_900">98</view>
            </view>
        </view>
        <view class="consume_view">
            <view class="wrap"><span class="consume_tip">身体消耗</span></view>
            <li class="li_7" :class="['iconfont icon-niunai consume_icon']"></li>
            <view class="desc">
                <view class="small_text">约消耗</view>
                <view class="text_wide_900"><text class="left">1000</text><text class="right">毫升牛奶</text></view>
            </view>
        </view>
        <view class="heart_rate_view">
            <view class="left">
                <li class="li_7" :class="['iconfont icon-zhexiantu']"></li>
                <text class="title">心率变化曲线</text>
            </view>
            <view class="right text_gray">心率变化</view>
        </view>
        <view v-if="heartRateData.series" class="heart_rate_chart">
            <view class="charts-box">
                <qiun-data-charts type="tline" canvasId="sport_a" :canvas2d="isCanvas2d" :resshow="delayload"
                    :opts="{ padding: [0, 20, 10, 0], legend: { position: 'top', lineHeight: 20 }, xAxis: { disableGrid: true, format: 'xAxisDemo3' }, yAxis: { data: [{ min: 0, max: 175 }], gridType: 'solid' }, dataLabel: false, dataPointShape: false }"
                    :chartData="heartRateData" />
            </view>
        </view>
        <view class="title_view">
            <view class="left">
                <li class="li_7" :class="['iconfont icon-xinlv']"></li>
                <text class="title">心率区间</text>
            </view>
        </view>
        <view class="heart_rate_range">
            <view class="top">
                <view class="item" v-for="(item, index) in heatRateRange" :key="index">
                    <view class="name text_gray">{{ item.name }}</view>
                    <view class="data">{{ item.type }}{{ item.data }}<text class="unit text_gray">分钟</text></view>
                </view>
            </view>
            <view v-if="heartRateRangeData" class="charts-box">
                <qiun-data-charts type="ring" canvasId="sport_b" :canvas2d="isCanvas2d" :resshow="delayload"
                    :opts="{ legend: { position: 'bottom' }, extra: { ring: { border: false, centerColor: '#312C34' } }, title: { name: '' }, subtitle: { name: '' } }"
                    :chartData="heartRateRangeData" />
            </view>
        </view>
        <view class="title_view">
            <view class="left">
                <li class="li_7" :class="['iconfont icon-pie']"></li>
                <text class="title">运动分析</text>
            </view>
        </view>
        <view class="sport_analysis_view">
            <view class="top">
                <li class="iconfont icon-feiji li_7"></li>
                <text class="title font-s-34">跑步机</text>
            </view>
            <view class="middle">
                <view class="left">
                    <li class="iconfont icon-clock li_7"></li>
                    <view>3.24P.M</view>
                </view>
                <view class="right">
                    <li class="iconfont icon-huo li_7"></li>
                    <view>热量消耗(千卡)</view>
                </view>
            </view>
            <view class="bottom">
                <view class="left">
                    <li class="iconfont icon-kongxinyuan li_7"></li>
                    <view>燃烧脂肪</view>
                </view>
                <view class="right">
                    <view class="text_wide_600 font-s-40">637</view>
                </view>
            </view>
        </view>
        <view class="box_view speed_rank_view">
            <view class="top">
                <view class="item" v-for="(item, index) in speedRank" :key="index">
                    <view class="name text_gray">{{ item.name }}</view>
                    <view class="data">{{ item.data }}<text class="unit text_gray">{{ item.unit }}</text></view>
                </view>
            </view>
            <view v-if="speedRankData" class="charts-box">
                <qiun-data-charts type="bar" canvasId="sport_c" :canvas2d="isCanvas2d" :resshow="delayload"
                    :chartData="speedRankData" background="none"
                    :opts="{ xAxis: { disabled: true, disableGrid: true }, extra: { bar: { barBorderCircle: true, width: 20 } }, legend: { show: false } }" />
            </view>
        </view>
        <view class="box_view">
            <view v-if="speedAndRateData.series" class="charts-box">
                <qiun-data-charts type="tline" canvasId="sport_d" :canvas2d="isCanvas2d" :resshow="delayload"
                    :opts="{ padding: [0, 20, 10, 0], legend: { position: 'top', lineHeight: 20 }, xAxis: { disableGrid: true, format: 'xAxisDemo3' }, yAxis: { data: [{ position: 'left', min: 0, max: 25 }, { position: 'right', min: 50, max: 175 }], gridType: 'solid' }, dataLabel: false, dataPointShape: false }"
                    :chartData="speedAndRateData" />
            </view>
        </view>
    </view>
</template>
<script>
import heartRateData from "../../static/json/sport/1.json"
import heartRateRangeData from "../../static/json/sport/2.json"
import speedRankData from "../../static/json/sport/3.json"
import speedAndRateData from "../../static/json/sport/4.json"
import Config from '../../static/js/config'
import Common from '../../static/js/common'
export default {
    components: {
    },
    data() {
        return {
            info: '大便超人', //用户数据
            isCanvas2d: Config.ISCANVAS2D,
            heartRateData: {},
            speedRankData: {},
            speedAndRateData: {},
            delayload: null,
            heartRateRangeData: {},
            heatRateRange: [{
                name: "激活放松",
                data: "5",
                type: "≤"
            },
            {
                name: "动态热身",
                data: "13",
                type: ""
            },
            {
                name: "脂肪燃烧",
                data: "24",
                type: ""
            },
            {
                name: "糖分消耗",
                data: "8",
                type: "≤"
            },
            {
                name: "心肺训练",
                data: "7",
                type: ""
            },
            {
                name: "极限锻炼",
                data: "16",
                type: ""
            },
            ],
            speedRank: [{
                name: "距离",
                data: "5",
                unit: "公里"
            },
            {
                name: "时长",
                data: "12",
                unit: "分钟"
            },
            {
                name: "平均配速",
                data: "6\'05\"",
                unit: ""
            }
            ]
        };
    },
    watch: {
    },
    methods: {
        async getData() {
            uni.showLoading();
            /*将钟点时间随机转成某一天的具体时间戳*/
            if (typeof heartRateData.series[0].data[0][0] == 'string') {
                for (let i = 0; i < heartRateData.series.length; i++) {
                    heartRateData.series[i].data.map(x => {
                        x[0] = "2018/08/08 " + x[0];
                        x[0] = this.tranTimestamp(x[0]);
                        return x[0];
                    })
                }
            }
            if (typeof speedAndRateData.series[0].data[0][0] == 'string') {
                for (let i = 0; i < speedAndRateData.series.length; i++) {
                    speedAndRateData.series[i].data.map(x => {
                        x[0] = "2018/08/08 " + x[0];
                        x[0] = this.tranTimestamp(x[0]);
                        return x[0];
                    })
                }
            }
            this.heartRateData = heartRateData;
            this.heartRateRangeData = heartRateRangeData;
            this.speedRankData = speedRankData;
            this.speedAndRateData = speedAndRateData;
            this.delayload = true;
            uni.hideLoading();
        },
        tranTimestamp(date) {
            return new Date(date).getTime()
        },
        gotoBack() {
            Common.navigateBack("/index/index");
        },
    },
    onReady() {
        //#ifndef H5
        uni.showShareMenu();
        //#endif
        this.getData()
    }
}
</script>
<style scoped lang="scss">
.body {
    height: 100%;
    background-color: #1C191F;
    margin: 0;
    color: #fff;
    padding: 80rpx 20rpx 0 20rpx;
    width: 100%;
    box-sizing: border-box;
    padding-bottom: 50rpx;
    .box_view {
        width: 100%;
        padding: 20rpx;
        position: relative;
        background-color: #312C34;
        color: #FFFFFF;
        box-sizing: border-box;
        border-radius: 20rpx;
        overflow: hidden;
        margin-top: 30rpx;
    }
    .speed_rank_view {
        .top {
            width: 100%;
            &:after {
                content: "";
                clear: both;
                display: block;
            }
            .item {
                float: left;
                width: 33%;
                box-sizing: border-box;
                padding: 30rpx 20rpx;
                text-align: left;
                .name {
                    font-size: 26rpx;
                }
                .data {
                    font-size: 40rpx;
                    margin-top: 10rpx;
                    .unit {
                        font-size: 24rpx;
                        margin-left: 14rpx;
                    }
                }
            }
        }
    }
    .sport_analysis_view {
        width: 100%;
        padding: 20rpx;
        position: relative;
        background-color: #312C34;
        color: #FFFFFF;
        box-sizing: border-box;
        border-radius: 20rpx;
        overflow: hidden;
        .top {
            width: 100%;
            height: 120rpx;
            display: flex;
            align-items: center;
            .icon-feiji {
                margin-top: 10rpx;
            }
            .title {
                margin-left: 10rpx;
            }
        }
        .middle {
            width: 100%;
            display: flex;
            justify-content: space-between;
            font-size: 28rpx;
            .iconfont {
                font-size: 28rpx;
                margin-right: 10rpx;
                margin-top: 4rpx;
            }
            .left {
                width: 50%;
                height: 60rpx;
                display: flex;
                align-items: center;
                justify-content: flex-start;
            }
            .right {
                width: 50%;
                height: 60rpx;
                display: flex;
                align-items: center;
                justify-content: flex-end;
            }
        }
        .bottom {
            width: 100%;
            display: flex;
            justify-content: space-between;
            font-size: 28rpx;
            .iconfont {
                font-size: 28rpx;
                margin-right: 10rpx;
                margin-top: 4rpx;
            }
            .left {
                width: 50%;
                height: 60rpx;
                display: flex;
                align-items: center;
                justify-content: flex-start;
                .icon-kongxinyuan {
                    color: #6FCEF7;
                }
            }
            .right {
                width: 50%;
                height: 60rpx;
                display: flex;
                align-items: center;
                justify-content: flex-end;
            }
        }
    }
    .heart_rate_range {
        width: 100%;
        position: relative;
        background-color: #312C34;
        color: #FFFFFF;
        box-sizing: border-box;
        border-radius: 20rpx;
        overflow: hidden;
        .top {
            width: 100%;
            &:after {
                content: "";
                clear: both;
                display: block;
            }
            .item {
                float: left;
                width: 33%;
                box-sizing: border-box;
                padding: 30rpx 20rpx;
                text-align: center;
                .name {
                    font-size: 26rpx;
                }
                .data {
                    font-size: 40rpx;
                    margin-top: 10rpx;
                    .unit {
                        font-size: 24rpx;
                        margin-left: 14rpx;
                    }
                }
            }
        }
    }
    .heart_rate_chart {
        display: flex;
        justify-content: center;
        width: 100%;
        position: relative;
        background-color: #312C34;
        color: #FFFFFF;
        box-sizing: border-box;
        border-radius: 20rpx;
        overflow: hidden;
    }
    .title_view {
        display: flex;
        width: 100%;
        align-items: center;
        height: 150rpx;
        .left {
            display: flex;
            align-items: center;
            .iconfont {
                font-size: 40rpx !important;
            }
            .title {
                font-size: 34rpx;
                margin-left: 20rpx;
            }
        }
    }
    .heart_rate_view {
        display: flex;
        width: 100%;
        justify-content: space-around;
        align-items: center;
        height: 150rpx;
        .left {
            display: flex;
            align-items: center;
            .icon-zhexiantu {
                font-size: 26rpx;
            }
            .title {
                font-size: 34rpx;
                margin-left: 20rpx;
            }
        }
        .right {
            font-size: 22rpx;
            padding: 10rpx 30rpx;
            border-radius: 40rpx;
            background-color: #342E39;
        }
    }
    .consume_view {
        display: flex;
        justify-content: center;
        width: 100%;
        height: 190rpx;
        position: relative;
        margin-top: 100rpx;
        background-color: #312C34;
        color: #FFFFFF;
        box-sizing: border-box;
        border-radius: 10rpx;
        .consume_img {
            width: 240rpx;
            height: auto;
            position: absolute;
            top: -80rpx;
            left: 20rpx;
        }
        .consume_icon {
            font-size: 220rpx;
            position: absolute;
            top: -80rpx;
            left: 20rpx;
        }
        .desc {
            position: absolute;
            right: 80rpx;
            top: 20rpx;
            view {
                padding: 10rpx 0;
                display: flex;
                align-items: center;
            }
            .left {
                font-size: 50rpx;
            }
            .right {
                font-size: 30rpx;
                margin-left: 10rpx;
                font-weight: 400;
            }
        }
    }
    .text-green {
        color: #10A764;
    }
    .text_gray {
        color: #8E8B8B;
    }
    .small_text {
        font-size: 24rpx;
    }
    .font-s-34 {
        font-size: 34rpx;
    }
    .font-s-36 {
        font-size: 36rpx;
    }
    .font-s-38 {
        font-size: 38rpx;
    }
    .font-s-40 {
        font-size: 40rpx;
    }
    .middle_text {
        font-size: 36rpx;
    }
    .text_wide_900 {
        font-weight: 900;
    }
    .text_wide_600 {
        font-weight: 600;
    }
    .census_view {
        width: 100%;
        display: flex;
        justify-content: space-around;
        .left {
            text-align: left;
            view {
                padding: 10rpx 0;
            }
        }
        .center {
            text-align: center;
            view {
                padding: 10rpx 0;
            }
        }
        .right {
            text-align: right;
            view {
                padding: 10rpx 0;
            }
        }
    }
    .score_view {
        width: 100%;
        .title {
            color: #8E8B8B;
            font-size: 24rpx;
        }
        .detail {
            height: 120rpx;
            width: 100%;
            display: flex;
            align-items: flex-end;
            .icon-up {
                margin-left: 40rpx;
                height: 54rpx;
                font-weight: 600;
            }
            .socre {
                font-size: 80rpx;
                font-weight: 900;
            }
            .up_socre {
                color: #10A764;
                height: 50rpx;
                font-size: 24rpx;
                font-weight: 600;
            }
        }
    }
    .head {
        height: 140rpx;
        line-height: 140rpx;
        position: relative;
        .title {
            font-size: 40rpx;
            margin-left: 20rpx;
        }
        .customer_img {
            position: absolute;
            bottom: 0rpx;
            right: 20rpx;
            width: 100rpx;
            height: 100rpx;
            margin: 0;
            padding: 0;
            background-size: 100% 100%;
            border-radius: 100%;
            overflow: hidden;
            .img {
                height: auto;
                width: 100%;
            }
        }
    }
    .li_7 {
        list-style-type: none;
    }
    .nav {
        position: fixed;
        top: 50rpx;
        left: 20rpx;
    }
}
.consume_view:nth-child(even) {
    margin-right: 4%;
}
.consume_tip {
    display: inline-block;
    text-align: center;
    width: 188rpx;
    height: 30rpx;
    line-height: 30rpx;
    position: absolute;
    top: 36rpx;
    right: -44rpx;
    z-index: 2;
    overflow: hidden;
    transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -webkit-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    border: 1px dashed;
    box-shadow: 0 0 0 3px #10A764, 0px 21px 5px -18px rgba(0, 0, 0, 0.6);
    background: #10A764;
    font-size: 16rpx;
}
.wrap {
    width: 100%;
    height: 100%;
    position: absolute;
    top: -12rpx;
    left: 12rpx;
    overflow: hidden;
}
.wrap:before {
    content: "";
    display: block;
    border-radius: 8px 8px 0px 0px;
    width: 80rpx;
    height: 14rpx;
    position: absolute;
    right: 68rpx;
    top: -1px;
    background: #4D6530;
}
.wrap:after {
    content: "";
    display: block;
    border-radius: 0px 8px 8px 0px;
    width: 14rpx;
    height: 80rpx;
    position: absolute;
    right: -1px;
    top: 66rpx;
    background: #4D6530;
}</style>
src/pages_qiun/static/js/common.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,170 @@
let isReadyLogin = 1
let loginFlag = 1
export default {
    //提示窗
    tipMsg: function (title, icon, time, mask,callback) {
        title = title == undefined ? "系统繁忙" : title;
        icon = icon == undefined ? "none" : icon;
        time = time == undefined ? 1300 : time;
        mask = mask == undefined ? true : mask;
        uni.showToast({
            title: title,
            icon: icon,
            mask: mask,
            duration: time,
            success() {
                if(callback){
                    setTimeout(()=>{
                        callback()
                    },time);
                }
            }
        })
    },
    getTelephoneInfo(){
        return new Promise((resolve, reject) => {
            var data = uni.getStorageSync("telephoneInfo");
            if(!data){
                // èŽ·å–å³ä¸Šè§’èƒ¶å›Šçš„ä½ç½®ä¿¡æ¯
                //#ifndef H5
                let btn = wx.getMenuButtonBoundingClientRect();
                uni.getSystemInfo({
                    success: e => {
                        let info = {
                            screenHeight:e.screenHeight,
                            statusBarHeight:e.statusBarHeight,
                            windowWidth:e.windowWidth,
                            top:btn.top
                        }
                        uni.setStorageSync("telephoneInfo",info);
                        resolve(info);
                    },
                    fail: (err) => {
                        reject(err);
                    }
                })
                //#endif
            }else{
                resolve(data);
            }
        })
    },
    // èŽ·å–å½“å‰å¹´æœˆæ—¥
    getNowDate(){
        let date = new Date;
        let now = date.getFullYear() + "-" + (date.getMonth()+1) + "-" + date.getDate();
        return now;
    },
    // èŽ·å–ä¸Šä¸ªæœˆçš„å¹´æœˆæ—¥
    getPreMonth(date) {
        var arr = date.split('-');
        var year = arr[0]; //获取当前日期的年份
        var month = arr[1]; //获取当前日期的月份
        var day = arr[2]; //获取当前日期的日
        var days = new Date(year, month, 0);
        days = days.getDate(); //获取当前日期中月的天数
        var year2 = year;
        var month2 = parseInt(month) - 1;
        if (month2 == 0) {
            year2 = parseInt(year2) - 1;
            month2 = 12;
        }
        var day2 = day;
        var days2 = new Date(year2, month2, 0);
        days2 = days2.getDate();
        if (day2 > days2) {
            day2 = days2;
        }
        if (month2 < 10) {
            month2 = '0' + month2;
        }
        var t2 = year2 + '-' + month2 + '-' + "01";
        return t2;
    },
    //检测小程序更新
    checkUpdateVersion(){
        //新版本更新
        if (uni.canIUse('getUpdateManager')) {
            //判断当前微信版本是否支持版本更新
            const updateManager = uni.getUpdateManager();
            updateManager.onCheckForUpdate(function (res) {
                if (res.hasUpdate) {
                    // è¯·æ±‚完新版本信息的回调
                    updateManager.onUpdateReady(function () {
                        uni.showModal({
                            title: '更新提示',
                            content: '已更新版本,是否重启小程序?',
                            showCancel:false,
                            cancelColor:'#eeeeee',
                            confirmColor:'#40A2ED',
                            success: function (res) {
                                if (res.confirm) {
                                    // æ–°çš„版本已经下载好,调用 applyUpdate åº”用新版本并重启
                                    updateManager.applyUpdate();
                                }
                            },
                        });
                    });
                    // æ–°çš„版本下载失败
                    updateManager.onUpdateFailed(function () {
                        uni.showModal({
                            title: '更新失败',
                            content: '请检查网络设置,若仍更新失败,重新搜索打开',
                            success(res) {
                                if (res.confirm) {
                                    // æ–°çš„版本已经下载好,调用 applyUpdate åº”用新版本并重启
                                    updateManager.applyUpdate();
                                }
                            }
                        });
                    });
                }
            });
        } else {
            uni.showModal({
                // å¦‚果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示
                title: '提示',
                content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。',
            });
        }
    },
    /**
     * @param {string} url ç›®æ ‡é¡µé¢çš„路由
     * @param {Object} param ä¼ é€’给目标页面的参数
     * @description å¤„理目标页面的参数,转成json字符串传递给param字段,在目标页面通过JSON.parse(options.param)接收
     */
    navigateTo(url, param = {},flag) {
        if(isReadyLogin<=0 && !flag){
            this.loginTip();
        }else{
            let part = '';
            for(var item in param){
                part += '&' + item + '=' + param[item];
            }
            url = url + part.replace('&','?');
            uni.navigateTo({
                url: url,
                fail:err=> {
                    this.tipMsg('页面正在火速开发中,敬请期待!');
                },
            })
        }
    },
    navigateBack(url, param = {}) {
        if (loginFlag <= 0) {
            this.tipMsg("很抱歉,你没有权限!");
        } else {
            let part = '';
            for (var item in param) {
                part += '&' + item + '=' + param[item];
            }
            url = "/pages" + url + part.replace('&', '?');
            uni.navigateBack({
                url: url,
                fail: err => {
                    this.tipMsg('暂未开放该功能!');
                },
            })
        }
    },
}
src/pages_qiun/static/js/config.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
const COLOR = [
    "#EE6A66", "#6BC588", "#FFC300", "#24ABFD"
];
var ISCANVAS2D = true;
switch (uni.getSystemInfoSync().platform) {
    case 'android':
        ISCANVAS2D = true
        break;
    case 'ios':
        ISCANVAS2D = true
        break;
    default:
        ISCANVAS2D = false
        break;
}
const RESPOND = {
    success: 0,
    warn: 301,
    error: 500,
};
const TIMEARRAY = [
    {
        text: '当天',
        value: 'today'
    },
    {
        text: '昨天',
        value: 'yesterday'
    },
    {
        text: '本周',
        value: 'week'
    },
    {
        text: '上周',
        value: 'weeklast'
    },
    {
        text: '本月',
        value: 'month'
    },
    {
        text: '上月',
        value: 'monthlast'
    },
    {
        text: '指定日期',
        value: 'auto'
    }
];
const TABLIST = [
    {name:"企业微信",type:"WECHAT"},
    {name:"会员运营",type:"OPERATE"},
    {name:"会员健康",type:"GJJK"},
    {name:"会员服务",type:"SERVICE"},
];
const CARD_MENU = [
    {title:"会员报表中心",author:"howcode",img:"https://s1.ax1x.com/2023/03/31/ppRp4iV.jpg",url:"/myPackageA/pages/main/index"},
    {title:"智慧教育报表中心",author:"howcode",img:"https://s1.ax1x.com/2023/03/31/ppRp5GT.jpg",url:"/myPackageA/pages/school/index"},
    {title:"差旅报表中心",author:"秋云",img:"https://s1.ax1x.com/2023/03/31/ppRpfI0.jpg",url:""},
    {title:"运动报表中心",author:"howcode",img:"https://s1.ax1x.com/2023/03/31/ppRpWaq.jpg",url:"/myPackageA/pages/sport/index"},
    {title:"财务报表中心",author:"howcode",img:"https://s1.ax1x.com/2023/03/31/ppRpozF.jpg",url:"/myPackageA/pages/finance/index"},
]
export default {
    COLOR,
    TIMEARRAY,
    TABLIST,
    RESPOND,
        ISCANVAS2D,
        CARD_MENU
}
src/pages_qiun/static/json/finance/1.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
{
    "expend":{
        "categories": [
            "1月",
            "2月",
            "2月",
            "4月",
            "5月"
        ],
        "series": [
            {
                "name": "支出情况",
                "data": [1201,2501.5,985,1760,2013.85],
                "type": "line",
                "style": "curve",
                "color": "#4ECDB6",
                "unit":""
            }
        ],
        "yAxis":[
            {"calibration":true,"position":"left","title":"单位/元","titleFontSize":12,"unit":"","tofix":0,"min":0,"disableGrid":true}
        ]
    },
    "income":{
        "categories": [
            "1月",
            "2月",
            "2月",
            "4月",
            "5月"
        ],
        "series": [
            {
                "name": "收入情况",
                "data": [1601,1840.5,1900,1760,1500.85],
                "type": "line",
                "style": "curve",
                "color": "#4ECDB6",
                "unit":""
            }
        ],
        "yAxis":[
            {"calibration":true,"position":"left","title":"单位/元","titleFontSize":12,"unit":"","tofix":0,"min":0,"disableGrid":true}
        ]
    },
    "remaining":{
        "categories": [
            "1月",
            "2月",
            "2月",
            "4月",
            "5月"
        ],
        "series": [
            {
                "name": "结余情况",
                "data": [815,712.5,378,450,600.85],
                "type": "line",
                "style": "curve",
                "color": "#4ECDB6",
                "unit":""
            }
        ],
        "yAxis":[
            {"calibration":true,"position":"left","title":"单位/元","titleFontSize":12,"unit":"","tofix":0,"min":0,"disableGrid":true}
        ]
    }
}
src/pages_qiun/static/json/finance/2.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
{
    "series": [
        {
            "data":[
                {
                    "name": "住房相关",
                    "value": 3200,
                    "color":"#4DCCB3"
                },
                {
                    "name": "食品酒水",
                    "value": 1020,
                    "color":"#5A77EC"
                },
                {
                    "name": "娱乐休闲",
                    "value": 500,
                    "color":"#4E94EC"
                },
                {
                    "name": "交流通讯",
                    "value": 214.5,
                    "color":"#4FD4EB"
                },
                {
                    "name": "其他",
                    "value": 320.13,
                    "color":"#B5ED21"
                }
            ]
        }
    ]
}
src/pages_qiun/static/json/school/1.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
[
    {
        "name":"课题研究",
        "num":500,
        "width":"",
        "background":"#FFBE68"
    },
    {
        "name":"论文发布",
        "num":300,
        "width":"",
        "background":"#0FEBE1"
    },
    {
        "name":"实践研究",
        "num":455,
        "width":"",
        "background":"#BF8DFC"
    },
    {
        "name":"评教",
        "num":601,
        "width":"",
        "background":"#FF859C"
    }
]
src/pages_qiun/static/json/school/2.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
{
    "series": [
        {
            "data": [
                {
                    "name": "本科",
                    "value": 168,
                    "color": "#FFBF31"
                },
                {
                    "name": "大专",
                    "value": 144,
                    "color": "#3CEFC4"
                },
                {
                    "name": "博士",
                    "value": 123,
                    "color": "#FFA9B3"
                },
                {
                    "name": "硕士",
                    "value": 96,
                    "color": "#3CBBFF"
                }
            ]
        }
    ]
}
src/pages_qiun/static/json/school/3.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
{
    "categories":["语文","数学","英语","物理","化学","生物"],
    "series":[
        {
            "name":"一班",
            "area":[123.45,234,192.5,245],
            "color":"#1890ff",
            "data":[90,110,165,195,187,172],
            "index":0,
            "legendShape":"circle",
            "pointShape":"",
            "show": true,
            "type": "radar"
        },
        {
            "name":"二班",
            "area":[192.5,234,261.55,245],
            "color":"#2fc25b",
            "data":[190,210,105,35,27,102],
            "index":0,
            "legendShape":"circle",
            "pointShape":"",
            "show": true,
            "type": "radar"
        }
    ]
}
src/pages_qiun/static/json/school/4.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
{
    "categories": [
        "1",
        "2",
        "2",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12"
    ],
    "series": [
        {
            "name": "图书借阅人数",
            "data": [6,8,9,8.2,7.5,9,10.3,8,12,6.2,7.2,4.5],
            "type": "line",
            "style": "curve",
            "color": "#A800FB",
            "unit":""
        }
    ],
    "yAxis":[
        {"calibration":true,"position":"left","title":"单位/千","titleFontSize":12,"unit":"","tofix":0,"min":0,"max":20,"disableGrid":true}
    ]
}
src/pages_qiun/static/json/sport/1.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
{
    "series": [{
            "name": "激活放松",
            "color": "#FDEC9F",
            "data": [
                ["17:24", 75],
                ["17:26", 83],
                ["17:28", 88],
                ["17:30", 92]
            ]
        },
        {
            "name": "动态热身",
            "color": "#FBCD2B",
            "data": [
                ["17:30", 92],
                ["17:32", 96],
                ["17:34", 94],
                ["17:36", 93.5],
                ["17:38", 94.6],
                ["17:40", 98]
            ]
        },
        {
            "name": "糖分消耗",
            "color": "#FC9E83",
            "data": [
                ["17:40", 98],
                ["17:42", 100],
                ["17:44", 104],
                ["17:46", 113],
                ["17:48", 142]
            ]
        },
        {
            "name": "脂肪燃烧",
            "color": "#EF6DCF",
            "data": [
                ["17:48", 142],
                ["17:50", 130],
                ["17:52", 134],
                ["17:54", 150],
                ["17:56", 148],
                ["17:58", 142],
                ["18:00", 132],
                ["18:02", 136],
                ["18:04", 136.5]
            ]
        },
        {
            "name": "心肺训练",
            "color": "#BC38E5",
            "data": [
                ["18:04", 136.5],
                ["18:06", 140],
                ["18:08", 135],
                ["18:10", 130],
                ["18:12", 124],
                ["18:14", 120],
                ["18:16", 118],
                ["18:18", 116.5],
                ["18:20", 112]
            ]
        }, {
            "name": "极限锻炼",
            "color": "#8908FA",
            "data": [
                ["18:20", 112],
                ["18:22", 123],
                ["18:24", 130],
                ["18:26", 138],
                ["18:28", 116],
                ["18:30", 123],
                ["18:32", 128],
                ["18:34", 126],
                ["18:36", 137]
            ]
        }
    ]
}
src/pages_qiun/static/json/sport/2.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
{
    "series": [
        {
            "data": [
                {
                    "name": "激活放松",
                    "value": 5,
                    "color": "#FDEC9F"
                },
                {
                    "name": "动态热身",
                    "value": 13,
                    "color": "#FBCD2B"
                },
                {
                    "name": "糖分消耗",
                    "value": 8,
                    "color": "#FC9E83"
                },
                {
                    "name": "脂肪燃烧",
                    "value": 24,
                    "color": "#EF6DCF"
                },
                {
                    "name": "心肺训练",
                    "value": 7,
                    "color": "#BC38E5"
                },
                {
                    "name": "极限锻炼",
                    "value": 16,
                    "color": "#8908FA"
                }
            ]
        }
    ]
}
src/pages_qiun/static/json/sport/3.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
{
    "categories": [
        "1",
        "2",
        "3",
        "4",
        "5"
    ],
    "series": [
        {
            "name": "公里配速",
            "data": [
                5.09,
                6.18,
                6.38,
                7.15,
                9.05
            ],
                        "color":"#FFD597"
        }
    ]
}
src/pages_qiun/static/json/sport/4.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,174 @@
{
    "series": [
        {
            "name": "速度",
            "color": "#1C9862",
                        "index":0,
            "data": [
                [
                    "17:24",
                    0
                ],
                [
                    "17:26",
                    1
                ],
                [
                    "17:28",
                    1.2
                ],
                [
                    "17:30",
                    1.6
                ],
                                [
                                    "17:32",
                                    1.8
                                ],
                                [
                                    "17:34",
                                    2
                                ],
                                [
                    "17:36",
                    4
                ],
                                [
                                    "17:38",
                                    6.5
                                ],
                                [
                    "17:40",
                    10
                ],
                                [
                                    "17:42",
                                    13.4
                                ],
                                [
                                    "17:44",
                                    13
                                ],
                                [
                                    "17:46",
                                    12.6
                                ],
                                [
                                    "17:48",
                                    12.2
                                ],
                                [
                                    "17:50",
                                    14
                                ],
                                [
                                    "17:52",
                                    16.8
                                ],
                                [
                    "17:54",
                    20
                ],
                                [
                                    "17:56",
                                    25
                                ],
                                [
                                    "17:58",
                                    23
                                ],
                                [
                                    "18:00",
                                    16
                                ]
            ]
        },
        {
            "name": "心率",
                        "index":1,
            "color": "#FBCD2B",
            "data": [
                [
                    "17:24",
                    72
                ],
                [
                    "17:26",
                    73
                ],
                [
                    "17:28",
                    73.5
                ],
                [
                    "17:30",
                    74
                ],
                [
                    "17:32",
                    76.5
                ],
                [
                    "17:34",
                    78
                ],
                [
                    "17:36",
                    80
                ],
                [
                    "17:38",
                    76.3
                ],
                [
                    "17:40",
                    75
                ],
                [
                    "17:42",
                    86
                ],
                [
                    "17:44",
                    84
                ],
                [
                    "17:46",
                    90
                ],
                [
                    "17:48",
                    100
                ],
                [
                    "17:50",
                    112
                ],
                [
                    "17:52",
                   125
                ],
                [
                    "17:54",
                    117
                ],
                [
                    "17:56",
                    110
                ],
                [
                    "17:58",
                    108
                ],
                [
                    "18:00",
                    104
                ]
            ]
        }
    ],
        "yAxis":[
            {"calibration":true,"position":"left","title":"","titleFontSize":12,"unit":"","tofix":0,"min":0,"max":25,"disableGrid":true},
            {"calibration":true,"position":"right","title":"","titleFontSize":12,"unit":"","tofix":0,"min":0,"disableGrid":true}
        ]
}
src/pages_qiun/static/json/user-healthy/1.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
[
    {
        "expect": "",
        "now": "",
        "name": "时间进度",
        "value": "60.12"
    },
    {
        "expect": "30000",
        "now": "36000",
        "dataType": "1",
        "name": "会员拉新",
        "value": "120"
    },
    {
        "expect": "",
        "now": "",
        "name": "扫码渗透率",
        "value": "35"
    }
]
src/pages_qiun/static/json/user-healthy/2.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
[
    {
        "kind":1,
        "background":["#B678FD","#4A64F9"],
        "content":[
            {"text":"","value":"1800","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"日均新增目标","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    },
    {
        "kind":1,
        "background":["#B678FD","#4A64F9"],
        "content":[
            {"text":"","value":"1960","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"当日新增会员","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    },
    {
        "kind":1,
        "background":["#B678FD","#4A64F9"],
        "content":[
            {"text":"","value":"36050","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"本月新增会员","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    },
    {
        "kind":1,
        "background":["#B678FD","#4A64F9"],
        "content":[
            {"text":"","value":"3%","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"日均环比","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    }
]
src/pages_qiun/static/json/user-healthy/3.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
{
    "categories": [
        "1月11",
        "1月12",
        "1月11",
        "1月14",
        "1月15"
    ],
    "series": [{
            "name": "新增会员数",
            "data": [{
                    "value": 5,
                    "color": "#24ABFD"
                },
                {
                    "value": -3,
                    "color": "#24ABFD"
                },
                {
                    "value": 3.5,
                    "color": "#24ABFD"
                },
                {
                    "value": 10,
                    "color": "#24ABFD"
                },
                {
                    "value": 2.8,
                    "color": "#24ABFD"
                }
            ],
            "type": "column",
            "color": "#24ABFD",
            "unit": "",
            "textNoShow": true
        },
        {
            "name": "当日达成率",
            "data": [
                101,
                91,
                97,
                131,
                109
            ],
            "type": "line",
            "addPoint": true,
            "color": "#DF297D",
            "unit": "%",
            "index": 1
        },
        {
            "name": "日均达成率",
            "data": [
                102,
                92,
                96,
                115,
                105
            ],
            "type": "line",
            "color": "#24ABFD",
            "unit": "%",
            "index": 1
        }
    ],
    "yAxis": [{
        "max": 20,
        "min": 0
    }, {
        "max": 200,
        "min": 0
    }]
}
src/pages_qiun/static/json/user-healthy/4.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
[
    {
        "kind":1,
        "background":["#B678FD","#4A64F9"],
        "content":[
            {"text":"","value":"42%","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"当日扫码率","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    },
    {
        "kind":1,
        "background":["#B678FD","#4A64F9"],
        "content":[
            {"text":"","value":"37%","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"累计扫码率","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    },
    {
        "kind":2,
        "background":["#B678FD","#4A64F9"],
        "content":[
            {"text":"环比增长","value":"3.2%","colortext":"#fff","colorvalue":"#fff","size":"24rpx"},
            {"text":"同比增长","value":"1.1%","colortext":"#fff","colorvalue":"#fff","size":"24rpx"}
        ]
    }
]
src/pages_qiun/static/json/user-healthy/5.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
{
    "categories": [
        "1月11",
        "1月12",
        "1月13",
        "1月14",
        "1月15"
    ],
    "series": [{
            "name": "当天扫码率",
            "data": [
                39,
                34,
                36,
                45,
                38
            ],
            "type": "line",
            "addPoint": true,
            "color": "#24ABFD",
            "unit": "%"
        },
        {
            "name": "累计扫码率",
            "data": [
                32,
                30,
                31,
                37,
                35
            ],
            "type": "line",
            "addPoint": true,
            "color": "#DF297D",
            "unit": "%"
        },
        {
            "name": "目标扫码率",
            "data": [
                40,
                40,
                40,
                40,
                40
            ],
            "type": "line",
            "color": "#FF9900",
            "textNoShow": true,
            "unit": ""
        }
    ],
    "yAxis": [{
        "max": 60,
        "min": 0
    }]
}
src/pages_qiun/static/json/user-healthy/6.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
[
    {
        "kind":3,
        "background":["#B678FD","#4A64F9"],
        "content":[
            {"text":"","value":"38%","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"小程序购买活跃会员占比","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
            {"text":"同比","value":"2.5%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"环比","value":"3.2%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
        ]
    }
]
src/pages_qiun/static/json/user-healthy/7.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
{
    "categories": [
        "1月11",
        "1月12",
        "1月11",
        "1月14",
        "1月15"
    ],
    "series": [{
            "name": "新增会员数",
            "data": [{
                    "value": 5,
                    "color": "#24ABFD"
                },
                {
                    "value": -3,
                    "color": "#24ABFD"
                },
                {
                    "value": 3.5,
                    "color": "#24ABFD"
                },
                {
                    "value": 10,
                    "color": "#24ABFD"
                },
                {
                    "value": 2.8,
                    "color": "#24ABFD"
                }
            ],
            "type": "column",
            "color": "#24ABFD",
            "unit": "",
            "textNoShow": true
        },
        {
            "name": "当日达成率",
            "data": [
                101,
                91,
                97,
                131,
                109
            ],
            "type": "line",
            "addPoint": true,
            "color": "#DF297D",
            "unit": "%",
            "index": 1
        },
        {
            "name": "日均达成率",
            "data": [
                102,
                92,
                96,
                115,
                105
            ],
            "type": "line",
            "style": "curve",
            "color": "#ff9900",
            "unit": "%",
            "index": 1
        },
        {
            "name": "日均达成率",
            "data": [
                102,
                92,
                96,
                115,
                105
            ],
            "type": "area",
            "color": "#ff9900",
            "unit": "%",
            "index": 1
        }
    ],
    "yAxis": [{
        "max": 20,
        "min": 0
    }, {
        "max": 200,
        "min": 0
    }]
}
src/pages_qiun/static/json/user-operate/1.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
[
    {
        "expect": "",
        "now": "",
        "name": "时间进度",
        "value": "50.88"
    },
    {
        "expect": "54800",
        "now": "51000",
        "dataType": "1",
        "name": "新开会员",
        "value": "93.07"
    },
    {
        "expect": "30000",
        "now": "25600",
        "dataType": "1",
        "name": "新增消费会员",
        "value": "85.33"
    }
]
src/pages_qiun/static/json/user-operate/2.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
[
    {
        "kind":5,
        "background":["#F77E89","#F7953B"],
        "content":[
            {"text":"扫一扫","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
            {"text":"","value":"63%","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"环比","value":"81.5%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"同比","value":"-81.3%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"平均参考水平","value":"85%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
        ]
    },
    {
        "kind":5,
        "background":["#F77E89","#F7953B"],
        "content":[
            {"text":"二维码识别","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
            {"text":"","value":"13%","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"环比","value":"2%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"同比","value":"-0.8%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"平均参考水平","value":"80%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
        ]
    },
    {
        "kind":5,
        "background":["#F77E89","#F7953B"],
        "content":[
            {"text":"最近使用","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
            {"text":"","value":"21%","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"环比","value":"1%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"同比","value":"-0.8%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"平均参考水平","value":"80%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
        ]
    }
]
src/pages_qiun/static/json/user-operate/3.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
[
    {
        "kind":5,
        "background":["#F77E89","#F7953B"],
        "content":[
            {"text":"会员销售占比","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
            {"text":"","value":"80%","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"环比","value":"81.5%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"同比","value":"-81.3%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"平均参考水平","value":"85%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
        ]
    },
    {
        "kind":5,
        "background":["#F77E89","#F7953B"],
        "content":[
            {"text":"会员客流占比","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
            {"text":"","value":"79%","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"环比","value":"2%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"同比","value":"-0.8%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"平均参考水平","value":"80%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
        ]
    },
    {
        "kind":5,
        "background":["#F77E89","#F7953B"],
        "content":[
            {"text":"会员客单价","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
            {"text":"","value":"79元","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"环比","value":"1%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"同比","value":"-0.8%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
            {"text":"平均参考水平","value":"80%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
        ]
    }
]
src/pages_qiun/static/json/user-operate/4.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
{
    "categories": [
        "1周",
        "2周",
        "3周",
        "4周",
        "5周"
    ],
    "series": [{
            "name": "同比增长率",
            "data": [{
                    "value": 5,
                    "color": "#24ABFD"
                },
                {
                    "value": -3,
                    "color": "#24ABFD"
                },
                {
                    "value": 3.5,
                    "color": "#24ABFD"
                },
                {
                    "value": 10,
                    "color": "#24ABFD"
                },
                {
                    "value": 2.8,
                    "color": "#24ABFD"
                }
            ],
            "type": "column",
            "color": "#24ABFD",
            "index": 1,
            "unit": "%"
        },
        {
            "name": "消费金额",
            "data": [
                1850,
                1660,
                1760,
                2360,
                1970
            ],
            "type": "line",
            "addPoint": true,
            "color": "#DF297D",
            "unit": ""
        }
    ],
    "target": 1800,
    "yAxis": [{
        "max": 3000,
        "min": 0
    }, {
        "max": 20,
        "min": 0
    }],
    "targetAdd": "9%"
}
src/pages_qiun/static/json/user-operate/6.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
{
    "headers":[
        {
            "label": "最近活跃时间",
            "key": "col1"
        }, {
            "label": "人数",
            "key": "col2"
        }, {
            "label": "人数占比",
            "key": "col3"
        }, {
            "label": "活跃会员环比",
            "key": "col4"
        }, {
            "label": "活跃消费人数占比",
            "key": "col5"
        }
    ],
    "contents":[
        {
            "col1": "0-30天",
            "col2": "15350",
            "col3": "45",
            "col4": "9.5",
            "col5": "29"
        }, {
            "col1": "30-60天",
            "col2": "15350",
            "col3": "13",
            "col4": "-2.5",
            "col5": "-25"
        }, {
            "col1": "60-90天",
            "col2": "15371",
            "col3": "15",
            "col4": "-5.2",
            "col5": "63"
        }, {
            "col1": "90-120天",
            "col2": "12340",
            "col3": "12",
            "col4": "2.9",
            "col5": "-12"
        }, {
            "col1": "120-180天",
            "col2": "12360",
            "col3": "17",
            "col4": "3.5",
            "col5": "11"
        }
    ],
    "sortCol":[
        {
        "key": "col1",
        "isNumber": false
        }, {
            "key": "col2",
            "isNumber": true
        },
        {
            "key": "col3",
            "isNumber": true
        },
        {
            "key": "col4",
            "isNumber": true
        },
        {
            "key": "col5",
            "isNumber": true
        }
    ],
    "computedCol":["col2","col3","col4","col5"],
    "formatCol":[{
        "key": "col3",
        "template": "#col3#%",
        "bottomComputedFormat": true
    }, {
        "key": "col4",
        "template": "#col4#%",
        "bottomComputedFormat": true
    }, {
        "key": "col5",
        "template": "#col5#%",
        "bottomComputedFormat": true
    }]
}
src/pages_qiun/static/json/user-operate/7.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
[{
         "series": [{
             "color": "#24ABFD",
             "data": 0.18,
             "index": 0,
             "legendShape": "circle",
             "name": "当前脱落率",
             "pointShape": "circle",
             "show": true,
             "type": "arcbar"
         }]
     },
     {
         "series": [{
             "color": "#F04864",
             "data": 0.25,
             "index": 0,
             "legendShape": "circle",
             "name": "脱落率警示线",
             "pointShape": "circle",
             "show": true,
             "type": "arcbar"
         }]
     }
 ]
src/pages_qiun/static/json/user-operate/8.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
{
        "categories": [
            "高血压",
            "糖尿病",
            "痛风",
            "血脂",
            "尿酸"
        ],
        "series": [{
            "name": "今周脱落率",
            "data": [{
                    "value": 6,
                    "color": "#24ABFD"
                },
                {
                    "value": 3.2,
                    "color": "#24ABFD"
                },
                {
                    "value": 5.5,
                    "color": "#24ABFD"
                },
                {
                    "value": 8,
                    "color": "#24ABFD"
                },
                {
                    "value": 6,
                    "color": "#24ABFD"
                }
            ],
            "type": "column",
            "color": "#24ABFD",
            "unit": "%"
        }]
    }
src/pages_qiun/static/json/user-operate/9.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
[{
         "series": [{
             "color": "#24ABFD",
             "data": 0.75,
             "index": 0,
             "legendShape": "circle",
             "name": "当前脱落率",
             "pointShape": "circle",
             "show": true,
             "type": "arcbar"
         }]
     },
     {
         "series": [{
             "color": "#F04864",
             "data": 0.33,
             "index": 0,
             "legendShape": "circle",
             "name": "脱落率警示线",
             "pointShape": "circle",
             "show": true,
             "type": "arcbar"
         }]
     }
 ]
src/pages_qiun/static/json/user-server/1.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
[
    {
        "series": [{
            "color": "#fff",
            "data": 0.224,
            "precent":"22.4%",
            "index": 0,
            "legendShape": "circle",
            "name": "B2C销售额",
            "pointShape": "circle",
            "show": true,
            "type": "arcbar",
            "value":"12786",
            "backgroundColor":"#00AEF9"
        }]
    },
    {
        "series": [{
            "color": "#fff",
            "data": 0.3717,
            "precent":"37.17%",
            "index": 0,
            "legendShape": "circle",
            "name": "B2C毛利率",
            "pointShape": "circle",
            "show": true,
            "type": "arcbar",
            "value":"1096",
            "backgroundColor":"#F55676"
        }]
    },
    {
        "series": [{
            "color": "#fff",
            "data": 0.0017,
            "precent":"0.17%",
            "index": 0,
            "legendShape": "circle",
            "name": "O2O销售额",
            "pointShape": "circle",
            "show": true,
            "type": "arcbar",
            "value":"147604",
            "backgroundColor":"#FAB215"
        }]
    },
    {
        "series": [{
            "color": "#fff",
            "data": 0.6321,
            "precent":"63.21%",
            "index": 0,
            "legendShape": "circle",
            "name": "O2O毛利率",
            "pointShape": "circle",
            "show": true,
            "type": "arcbar",
            "value":"173",
            "backgroundColor":"#2EC693"
        }]
    }
]
src/pages_qiun/static/json/user-server/2.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
{
    "series": [
        {
            "name": "任务栏最近使用",
            "data": 500,
            "color":"#2fc25b"
        },
        {
            "name": "最近使用小程序列表",
            "data": 623,
            "color":"#facc14"
        },
        {
            "name": "手机系统",
            "data": 123,
            "color":"#f04864"
        },
        {
            "name": "任务栏我的小程序",
            "data": 96,
            "color":"#8543e0"
        },
        {
            "name": "其他",
            "data": 423,
            "color":"#51c2d5"
        }
    ]
}
src/pages_qiun/static/json/user-server/3.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
{
    "categories": [
        "周一",         "周二",         "周三",         "周四",         "周五",
        "周六",
        "周日"
    ],
    "series": [
        {
            "name": "老会员",             "data": [                 1850,                 1660,                 1760,                 2360,                 1560,                 1970,                 2570             ],             "type": "line",
            "style": "curve",
            "addPoint": true,             "color": "#DF297D",
            "unit":""
        },
        {
            "name": "新会员",
            "data": [
                450,
                260,
                360,
                560,
                460,
                170,
                570
            ],
            "type": "line",
            "style": "curve",
            "addPoint": true,
            "color": "#ff9900",
            "unit":""
        }
    ],
    "yAxis":[
        {"calibration":true,"position":"left","min":0,"max":3000,"title":"","titleFontSize":12,"unit":"万","tofix":0}
    ],
    "targetAdd":"9%"
}
src/pages_qiun/static/json/user-server/4.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
[
    {
        "kind":4,
        "background":["#0081ff","#1cbbb4"],
        "content":[
            {"text":"已评价数","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
            {"text":"","value":"161","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"增长","value":"","colortext":"#fff","colorvalue":"","size":"20rpx"},
            {"text":"up","value":"325","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
        ]
    },
    {
        "kind":4,
        "background":["#0081ff","#1cbbb4"],
        "content":[
            {"text":"平均分","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
            {"text":"","value":"82","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"增长","value":"","colortext":"#fff","colorvalue":"","size":"20rpx"},
            {"text":"up","value":"0.7","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
        ]
    },
    {
        "kind":4,
        "background":["#0081ff","#1cbbb4"],
        "content":[
            {"text":"好评率","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
            {"text":"","value":"161","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"增长","value":"","colortext":"#fff","colorvalue":"","size":"20rpx"},
            {"text":"down","value":"1.2%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
        ]
    }
]
src/pages_qiun/static/json/user-server/5.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
[
    {
        "name":"华东",
        "num":50000,
        "width":"",
        "background":"#FFBE68"
    },
    {
        "name":"华南",
        "num":30000,
        "width":"",
        "background":"#0FEBE1"
    },
    {
        "name":"华北",
        "num":45500,
        "width":"",
        "background":"#BF8DFC"
    },
    {
        "name":"西北",
        "num":60120,
        "width":"",
        "background":"#FF859C"
    },
    {
        "name":"西南",
        "num":26020,
        "width":"",
        "background":"#51ADCF"
    }
]
src/pages_qiun/static/json/wechat/1.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
[
    {
        "expect": "",
        "now": "",
        "name": "时间进度",
        "value": "37.88"
    },
    {
        "expect": "224.64",
        "now": "53.96",
        "dataType": "1",
        "name": "微好友拉新",
        "value": "24.02"
    },
    {
        "expect": "80.17",
        "now": "18.82",
        "dataType": "1",
        "name": "微客群拉新",
        "value": "23.48"
    }
]
src/pages_qiun/static/json/wechat/2.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
[
    {
        "kind":1,
        "background":["#3EB2F5","#9374F7"],
        "content":[
            {"text":"","value":"5860","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"新增微好友","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    },
    {
        "kind":1,
        "background":["#3EB2F5","#9374F7"],
        "content":[
            {"text":"","value":"3605","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"新增小程序会员","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    },
    {
        "kind":1,
        "background":["#3EB2F5","#9374F7"],
        "content":[
            {"text":"","value":"5860","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"删除/拉黑的微好友","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    },
    {
        "kind":1,
        "background":["#3EB2F5","#9374F7"],
        "content":[
            {"text":"","value":"605","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"单聊总数","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    },
    {
        "kind":1,
        "background":["#3EB2F5","#9374F7"],
        "content":[
            {"text":"","value":"641","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"发送消息数","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    },
    {
        "kind":1,
        "background":["#3EB2F5","#9374F7"],
        "content":[
            {"text":"","value":"35分钟","colortext":"","colorvalue":"#fff","size":"44rpx"},
            {"text":"平均首次回复时长","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
        ]
    }
]
src/pages_qiun/static/json/wechat/3.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
[{
        "categories": [{
                "value": 0.2,
                "color": "#1890ff"
            },
            {
                "value": 0.8,
                "color": "#1890ff"
            }
        ],
        "series": [{
            "name": "新增小程序会员占比",
            "data": 0.21,
            "color": "#24ABFD"
        }]
    },
    {
        "categories": [{
                "value": 0.2,
                "color": "#1890ff"
            },
            {
                "value": 0.8,
                "color": "#1890ff"
            }
        ],
        "series": [{
            "name": "已回复单聊占比",
            "data": 0.65,
            "color": "#24ABFD"
        }]
    }
]
src/pages_qiun/static/json/wechat/4.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
{
        "categories": [
            "1月11",
            "1月12",
            "1月13",
            "1月14",
            "1月15",
            "1月16",
            "1月17"
        ],
        "series": [{
                "name": "新增微好友数",
                "data": [{
                        "value": 1800,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1300,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1580,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1600,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1600,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1600,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1300,
                        "color": "#24ABFD"
                    }
                ],
                "type": "column",
                "color": "#24ABFD",
                "unit": ""
            },
            {
                "name": "新增小程序会员数",
                "data": [{
                        "value": 1580,
                        "color": "#6BC588"
                    },
                    {
                        "value": 850,
                        "color": "#6BC588"
                    },
                    {
                        "value": 1100,
                        "color": "#6BC588"
                    },
                    {
                        "value": 1400,
                        "color": "#6BC588"
                    },
                    {
                        "value": 1200,
                        "color": "#6BC588"
                    },
                    {
                        "value": 980,
                        "color": "#6BC588"
                    },
                    {
                        "value": 560,
                        "color": "#6BC588"
                    }
                ],
                "type": "column",
                "color": "#6BC588",
                "unit": ""
            }
        ]
    }
src/pages_qiun/static/json/wechat/5.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
{
        "categories": [
            "1月11",
            "1月12",
            "1月13",
            "1月14",
            "1月15",
            "1月16",
            "1月17"
        ],
        "series": [{
                "name": "新增微好友数",
                "data": [{
                        "value": 1400,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1300,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1000,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1500,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1580,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1700,
                        "color": "#24ABFD"
                    },
                    {
                        "value": 1500,
                        "color": "#24ABFD"
                    }
                ],
                "type": "column",
                "color": "#24ABFD",
                "unit": ""
            },
            {
                "name": "新增小程序会员数",
                "data": [{
                        "value": 400,
                        "color": "#FB8F82"
                    },
                    {
                        "value": 700,
                        "color": "#FB8F82"
                    },
                    {
                        "value": 500,
                        "color": "#FB8F82"
                    },
                    {
                        "value": 300,
                        "color": "#FB8F82"
                    },
                    {
                        "value": 400,
                        "color": "#FB8F82"
                    },
                    {
                        "value": 350,
                        "color": "#FB8F82"
                    },
                    {
                        "value": 400,
                        "color": "#FB8F82"
                    }
                ],
                "type": "column",
                "color": "#FB8F82",
                "unit": ""
            }
        ],
        "yAxis": [{
            "calibration": true,
            "position": "left",
            "title": "",
            "titleFontSize": 12,
            "unit": "",
            "tofix": 0,
            "min": 0,
            "max": 2500
        }]
    }
src/pages_qiun/static/json/wechat/6.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
{
    "headers":[
        {
            "label": "活动名称",
            "key": "col1"
        }, {
            "label": "员工总任务",
            "key": "col2"
        }, {
            "label": "员工完成数",
            "key": "col3"
        }, {
            "label": "完成率",
            "key": "col4"
        }
    ],
    "contents":[
        {
            "col1": "周末秒杀",
            "col2": "450",
            "col3": "420",
            "col4": "99%"
        }, {
            "col1": "摇号活动",
            "col2": "430",
            "col3": "1390",
            "col4": "90%"
        }, {
            "col1": "早间问候",
            "col2": "450",
            "col3": "430",
            "col4": "95%"
        }, {
            "col1": "汇总",
            "col2": "1330",
            "col3": "1240",
            "col4": "93%"
        }
    ],
    "sortCol":[
        {
        "key": "col1",
        "isNumber": false
        }, {
            "key": "col2",
            "isNumber": true
        },
        {
            "key": "col3",
            "isNumber": true
        },
        {
            "key": "col4",
            "isNumber": true
        }
    ]
}
src/pages_qiun/static/table/characterToPinyin.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,901 @@
/*!
author:kooboy_li@163.com
MIT licensed
*/
let base = 19968,
    middle = (40896 - base) / 2;
let EMPTY = '';
let COMA = ',';
let chars = (() => {
    let a = [];
    for (let i = 33; i < 127; i++) {
        if (i != 34 && i != 92 && i != 45) {
            a.push(String.fromCharCode(i));
        }
    }
    return a.join(EMPTY);
})();
let SDB = {
    "a": {
        "yi": "!]#R$!$q(3(p)[*2*g+6+d.C.q0[0w1L2<717l8B8E9?:8;V;[;e;{<)<+<S<]=9>.>4??@~A`BbC:CGC^CiDMDjDkF!H/H;JaL?M.M2MoNCN|OgO|P$P)PBPyQ~R%R.S.T;T<TBTqT|UQUXU}V[WCXgYCYDY_YdYuZ9Zs];]j]p]q^.^@^S^w^x_,_T`H`J`ga)a8aQb9budJddgoh9hqi2itj&jEjRj]jzk>k^l$l<mLmdnDoEoMoQoop3p5pWp`qSr.u'uLv]wIxXy_y~{z}`~r-$=-$X-$Y-%!-%0-%j-&^-&s-'t-(<-)2-*n-+6-+f-/M-/N-0.-2|-3u-4b-4c-4m-5E-5N-5Z-5l-6&-6+-7*-70-73-8F-8R-8g-:*-:5",
        "ding": "!2%%&_&x'u=:=h@NC`H?LQNkQ3Xo^Gn?osrUsNvAwKxKy9-!T-$6-$v-%O-&b-(+-9%-9(",
        "zheng": "!S#(#D/]031$456+=L?OIzYM[']I^g_.eUl}m~qJsHulwuxU-!?-,d-3D",
        "kao": "<dLWr5x7-!J-,7-/Y-/s-2'",
        "qiao": "#+$4&.&1'7'Y'z($(),B,{0c7y8<:H<8<YE{F0GdKYMCZP]Y_8_zd.d/d{e5fGfHfUmKmrmvp#t>t?uJv$vMyE|R}a-!}-#&-#8-#L-#b-$Q-%?-+q-,6-,8",
        "yu": "#V$l%S&9&I('(7(=)))m*#*$*B+2+F+v,0,b,i.W0.1F232L2a3(384>6P8n;';i;y<1>(>)>]@iB<B?BDBEC'C*CoCpELE^HIHJHTIpJIJ`KXL&L1LxMbMqNXNqPdPsQ<RFT?U(URV7WnX:Z?ZT[6[H]!]~_7_J_``Za#eXg;h#hVhuiyj!j#k9kDkMl#lClUlmmUnFoAp(pzqnrSsSt0vJwszp{_|N}!}$}I}t~(~,~.~w-$D-$]-%^-&j-';-'k-(3-(H-(v-*1-*Z-+#-+d-+{-.1-.2-.<-.K-.[-.e-/d-0=-0P-1:-1m-39-3`-3b-3e-41-5e-5}-6/-6;-6p-7:-7Z-:(-:2-:F",
        "qi": "!8%&%>&X&m&s'2'X'd'f(9(c(i(j)@)l+'+M.).+1y1{2=3K4c6&6'6)606<6B6`9`9{:a<g>`?`AgCLCuD%D2F2GyH&H1I;K~LkLuM&MYO0O3O9P8PbPcQqR5S2SCU0U~V%XYY&Z}[G^P`7cUc}dEeNgOj$j)l?m:n4p,sOuRv.y'{/|i}1~P-$B-%Y-)|-)}-*K-+G-+H-,m-.@-.M-/|-0y-2D-2c-4W-4`-4h-7a-7p-9c-9i",
        "shang": ")Y6V9cJvR8UqXJXa])asbQc,s,uSvz-#+-.;",
        "xia": "#Y#w&,&;'''I)1.u/j7=:[<'B[ByCtL'NmNyQOR([0`(cLh[iRkVt/t_u4uezFzM|W|{~d-&)-*4-.}-0a-5;-8S",
        "han": "#,.m/h:l<P>MFrGXJqNrOUPCPqPrQ|]@`+`2h1lBlZnXp*r;rWrkz9{4{B}x-#c-#y-$;-$l-$y-%Q-%n-(i-(x-)i-/!-3*-5B-9V",
        "wan": "#=$0&o.]0F4@5X5b6*628u9p<K?e?h@IChFqG!G7H2HHJzL=O5Q'RQ`;a:b<bGeHh&h)rMr^s'slu!-$E-%V",
        "mo": "!`#$#&#y$%%P'e(T*N3v5$517`8R=6?XA5E6FZF~JLM;MgP+RTRcU6]'](_j`s`x`y`za+qkuDyR|G-!e-'g-($-(U-*R-+k-,(-.U-.k-.{-8/-80-8K-8L",
        "zhang": "#~(#.:2o3N>k@,JhR`b$b`knmtujz'z0}<-#+-'I-*Q-16-7m",
        "san": "3T3q3w3x7~uJuwzA-'n-([-,s",
        "ji": "#r%''l'y)3)d)o*Z+'+9+G+M+T+Z+^+g+x._.c/R090d1S1W2;43484J4R5C5w6)6C6`7f7s878H8t8w9J9X9Z9{;8;<;B;C=(=2>6?YA$B+CHD0D8DbE:EQF2I*I|JEJnKKL)L:LkLzMdN'N5N:NiQ6QyRrUWVcVnWPWQWtX6XEXYXuY(ZAZ|[/]O]e^F^J^U^~`)b#b0c*ckc}dee!e$e9e>eyf+fXfrg)hFhriMjZlrqmr)sRt%uov3vevw|@};}N}g~!~+~F~{-!&-!u-#N-$%-&a-'u-(,-*x-+]-,W-.?-.V-._-.d-.g-/+-0$-0H-1%-1/-10-1^-1o-2/-2@-3'-4)-4o-5>-5H-5U-6,-6J-7/-7P-9e-9g-9h-9i-9j-:l",
        "bu": "0$192,FKJgT=UYZ^e+hhjmm8mFoGpGp}sjw]w{-'7-'E-/m-3#-4.-6=",
        "fou": "4I:L:O:Q~1-3:",
        "mian": "!G!d#4$U$W$]3Y5X6A6_6o9g9w@qB/CkG!H_Q;-!L-!M-!P-/_-7y-7z-8'-8,-8q-8r",
        "gai": "):5=5LD,ErI!J1Z'_/`TaYaac!lnpcw[|O}1",
        "chou": "!+#n$N+0/y0}2:4e5/6#9jB*B.GNLfUmZ+^3^5_4e%e4fWkan]nbo.o6oU}u~$~*-.X-/>",
        "zhuan": "%H'S'V.K0k1B1H1r2?7Z<r@RA7IDRsVk[J]Tb3b<c8gThai'mp-%+-%u-'p-(]-14",
        "qie": "%>+7+f,8.#.|0K0p2O>#DNE1P.ccd]eMlpt8y>-0&",
        "ju": "!Z$L$w%R*W,c,l/e1~3&3J8#:t=#=`=k@FBGC0DlD}FeGAIaIkJbMrN[OVP`RDTlU|W>Y`[$^Z`Ua*ccc{dWd]dae#e@eFeff8fSg*g<guh~l'lXmIoOq(rps%vXw_x|y;zb|m}o-#/-#:-&4-&Q-)<-)?-)d-*z-+0-/.-/:-3[-48-4S-4k-5.-9H-9K-9x-:@",
        "pi": "#M%D'C(5(6)L*F*K+;.n1C4M8}:y;/;2;A<,<{>a@'@2@KA%C|DQO+O]O^PvR!REScU'UfZw]m`l`na'i[l_m;p<pYpyqCqyr*s1s;trx4{8|*|=|p}F-!!-#,-)@-,H-.p-/#-/3-2#-3>-4F-6'-63-91",
        "shi": "!E!Q!e#?$p%$&+'$([(](q*^.&/5/n0[1w204z<gBNBQG)I:ISIUJ3NlN{Q>QQR9VYW2W@W^X2XNYxY{ZI[:[<[v]X^l^{^}_p`DaDbmgqi8ixjdk!kNkpl(lkntoMo^ocoeofp5ppq%q&q*q4qbr=t9x/-&^-&_-&}-'<-'@-(*-(8-)!-)H-+,-/<-0?-0d-0o-0p-2:-2O-3+-38-57-6M-9C-9E",
        "qiu": "*6*7+a0r3k4D5]6j>7CaCeF`HEJXMhNgNjONP;QMQ_RfSWUUX?XUXqXrajc$d'jpjskXl]n@o.oup:r?-#5-#6-$8-/'-/k-0W-0X-1,-2Z-4v-7&-9U-:Y-:Z-:]",
        "bing": "!n)F*4+/,>.75@DsOcZ7l`puqar||>-!:-!q-#,-#G-''-'C-(D-/O",
        "ye": "$>$E(0,a6g=;@?HfSb[]_]lUlfn(oip=rmtDtTtevTx?-!O-!R-$5-%N-'F-'e-(T-*o-4Y-61",
        "cong": "$'&Y1>8==g=l=p=vDIE=I2JUK0LsRZZk]$a}a~sKtBuKu_-*)-*V-+Y",
        "dong": "&&.r0b5D?7?C@JD|G;I#KwQ([&jV~^-)T-/=-0)-4g-5/-6T-9,",
        "si": "'?(b)^)g)p*+.</#40415O6i8l9~;.<|<}>+>0KxL+NLP7PiQnReS&W_`tp1pvp{qTqnr8r`tIuzyB-&6-&R-&^-&c-&s-&{-(:-)L-)q-*8-+.-0.-5j-6`-9N-:o",
        "cheng": "#0$,$P&W*O*[*w+A+{,O,v/l5[7#:`?}FQOoS(UKZV_#cHcJk#m$nhrxtkuxv@vWx=xB|2-!A-$h-'w-)o-*>-+B-/u",
        "diu": "r2xL-&&",
        "liang": "3A3D3{6K@0CRF{Q%Up[,_Oe1h!h2hCiBiHojss-!=-)h-.J-.O",
        "you": "(r)O*I7o8W;L;f=5=M>VDKFoFsFwG/KaOOOSPSQLY8ZN_;`qh%hMjWjnk6kPlYmEn3n>ncodp~r3x&x<-),-.y-/1-1p-1z-7N-8P-9D",
        "yan": "##%F%L&%&F&T&v(Z,j/u1?2$5t7V;!;h?<@@AsCVCYCZD3FmGpH.JlN_PVQAT$UxV9WUX/XkXmXnY?Z3[U^1^C^E_e_~`B`C`RbDbPc;g/g7kIm#mNmsn5nHnsnyoPoVo`x+z7zkzmzn{A{`{e|}}2}b-%'-%,-%B-%v-'0-(#-)~-*$-*F-*j-*s-+C-.4-.H-.Y-0V-3$-3*-3B-3n-5#-5G-5u-7K-7r-8T-8W-8_-8`-8a-8d-8j-9L-9Q-9w-:1-:N",
        "sang": "'EVNts-%2-%{",
        "gun": "#<&#'U6F6z9dJ>JpTFTwUu]4h<iF-/2-/g-2<",
        "jiu": "+E,*42464]8mB:BCBHBMH7cQnGz){Z-#}-#~-,l-./-01-3!-5w-6I-79-7c-:$",
        "ge": "&!/30*4?8r>:?B@}AbB3BwECHxJ1NwOrP'U9UPXM[X[hhLhmq`tetlu.xSyUzTzU{W}4-!S-!s-#F-#`-#j-%f-(A-*%-+t-.3-/K-/U-1u-3T-3z-6g",
        "ya": "#B%C&{'I*{,a.g=UDEKqO;T1WEWGY.^[g=i!j4lUp=s=v7x;}f-3C-3c-4U-6O-6V-9o-:;",
        "pan": "!&!>!?!H!o'L'x2A76=F>R?$AIH<IrRoT{WBY[d[e{f0rvtpw=zx-#E-$J-4D",
        "zhong": "#%(n*8+>+m/V2T4{6b99>j@`BnEkK*O:OBP^R2RKSzTKTNTO[@e^f>ohparHtQv5wbyF-3_-9@",
        "jie": "#S%@&{(.*d+=.G0e4J5,599D;k=(@/CfD,G#G`J[LzOFP&P:PTQ=SKSQSqT/TITPTlU4U7UPVQXOXSX}Z%ZWZh]/^K^~_5ckdve=j^qGtNtXz,|1}.-!m-!u-$U-%c-&v-+i-.l-/@-2&-4{-5$",
        "feng": "!@%N'40m5v7R:3C$FdHnN.PFSaWI[R^c`?b.c5k'n+n;r[u5uXxs-!$-!4-&%-&J-&L-(w-3(-3,-3F-8)",
        "guan": "!'$b$j$k(W)B,Y/f0E6:9&:]:gBVFqIEWSW{X+X.a?bifMh?kmsUu>w7zOzS{,{2}{-'K-(N-0q-1N-1j-2e-2z-6D-7A",
        "kuang": "!Y!z$Y%1%r%w(G+}/O/z5'538V8vZ<ZG^y_=aNbpgHgRgXg`j+lHlhn/qUrevy-4>-8>",
        "chuan": ",40jA7BYB`BhBxEvale[hIkJp%wQ-5+",
        "chan": "&6'W)K)q1N6D7$8*8A8[8_:6;xCODJIHKQQ2RGR_R{S1UeW!W`X3ZMZy]B^+^7_N_bfbi|n2n6o@rTr]uWw3xYz%ze{7{g-#Q-%D-%~-(%-(S-+Z",
        "lin": "$B&['t0:393O5{8!<WA?B%GsKEMOaWb{fEf]fgfxhlh}iVk{lgn$utzg|9}C~[-*a-1G-2t-7_-7n",
        "zhuo": "#'&Q)a+l,%,V,]102E2`8?:J;&=NE.HtJ:L|SJSsZx[+]6_Fd!nArfvLvOy|-4J-5d-:x",
        "zhu": "!a$6$h%^%v'f)!)/*h,@.4.S.T.[.w/P/o0]0n141=1a4n4q5.9+:s;W<EBrD/DVDpE_EmFYHtJQKZMMO`O{QTS>S]SrU;V<YLYoZ;[S_$_B`[aCbhdVdjfRggjMjrk1ljq6q{r}vbwExIx`|x-&r-(~-)=-)]-+2-/H-0E-11-3s-6(-7T-7V-8x",
        "ba": "%#.a3#:y;2;N<z>sD5E4GTO$WNYk`LdDdNgjozp?wr~~-!a-&.-.D-.`-/&-/0-1t-1v-1}-9=",
        "dan": "!K%$%5)r,S0N1h4V8A=A=B=H=~>q@9ATAVH*JDOkPUTLV?VoXGX~ZK_'a|bBc3f{mHn&nKn~~t-$I-'G-'s-)*-)a-,C-3Z-8H-8b-8i",
        "wei": "#o$M%}&0'#'D'M6/6p6r7+8y9f;6>n@gC+D!DOE+FCGBH)I&I(I4INJ]K$KJL7LdMDN0PwQ$QDQHR?T3T6V`WkX$Z)[#[^^*^4_I_^e;fefig@hbj>k<k[m}nvs~t4uGzz{G}&}'}7}Y~n-!#-#Z-#a-#i-#q-#v-#z-$T-&7-'J-'X-'z-+a-+b-+c-.P-/,-/F-/P-0N-0O-2(-2W-2p",
        "jing": "#C*?*u,2.8.9.A.E.P.R042v3F3Q5(5q6!9@=_>g?:?k@<E;EtExFiG8HlS/Z`]ge(jTjwrhuYyi|+-!=-!@-!C-!D-!F-$N-$m-%b-*m-03-2M-4:-4a-4d-7e-7o-9I",
        "li": "!!!0#A#E%7%_%m%q'|(K(L(Q(^)u)y*%*H,&.$.J.{/c1.1:2Z3$303G3b4)5}7T8Q8g:7;4@*C%DPDbEEF%FDFWF[GUI[I`JFKIM1MKN4OWOnP#PNPlQaR[S*S:STSVS_ULU_VWXhYY]&^,`9`}cPdbf`hzh{i5jDk+l7l;m6n=oBoNogokqAqururzs3tludvuxjyU}V}W}X~&~8-!+-!5-*}-+A-,^-.3-/p-/v-07-1W-1b-1k-26-29-2x-2~-3Q-4X-5I-6F-6l-7f-7k-8A-8Z",
        "pie": "$2DmW]u~",
        "fu": "%8%[(u(v)U)j*k*o+:.'/$///_0$0=1j3C3d4a4j4u5B5k5p6q7B8L939<:0:o:}<&>N?#@!@D@E@nA3C!CWC}D*DFE'E,E]EpFFF|GKHKHjJXKsNSODOGOXOwPIPMQEQIQWTETsTvU.V(V6ViW+WKWMXpYS[C^H`Va4a{b4bXc(c7cRd=dZegh*hPhRiAiLlIm(m*mmnQowo|pFq<q@t#t5{s{t|?-#]-#x-$`-&(-&.-(n-)F-+/-,P-.5-/)-/8-/X-0^-1|-2[-2}-3%-34-3N-4H-4}-7x-7{-8#-8*-8o-8p",
        "nai": "<p<q?L@=CcH4R'VHj[o}sk-9'",
        "wu": "$A%*&l)+,D,o0a2tAMB]D#D<EPFSKvMVPLQzS#Z>ZYZZ]U_6_9d9fYj6j~lWm)mep)rQrbrctvwkxc{y|U}6~?~C~`~m-!Z-*'-+R-/j-0j-3i-4/-4@-5,-5f-6j-6s-7)-9G-9W-9X",
        "tuo": "%U%V&z0L2J4v?{@$F_H6MUTbT~Y'Yc^QdHdQnVq+r`x1{{|;|<-&d-(.-(z-({-)1-)J-)K-*:-*e-*p-+$-+3-.b-/%-/[-0b-3O-4,-6_-8}-9$-9?",
        "zhe": "#'%+%E'P2f2|<f=VHtJ~NoP4PKR9RRRSU%VXW<Yq]*]:^%^0_ucKe`h(h0hei@iUj:j{kurAtMy!-({-/f-5W-75",
        "ma": "#X%3'8(e)h;0GsK?N}R+RTRUkku/z2-(u-)N-+!-+9-,r-0n-5P-8.-80",
        "me": "-8/-80",
        "yao": "!T$R'T(g,3,:,=,F,I,J,e,f/C0^4<7o8Q8s<a>_@eB>CADvFAI0I>J:L]M:M~TgWHWfY/Ya[|[}^6_ngmi6k`kll*l9r!tdwhxRzv}!-!j-%=-&9-&T-'(-'=-*&-0u-1I-2f-3;-3]-5F-5Y-7+-9T-:%",
        "zhi": "!7!t$s%=(J(i(k(s(y)2)I)Z*2*>*A*T*^*c+(+)+J+Y,G/k4Q4b5T5W5s6~7^7|9(98;(<0=E=Q=b=}>L>|?+?QA<AJB1B2B5B6CzD$D?E8GeM7N/O3P1P]R@RhTQTTTxTyU{W.WgXCX[XcY9ZB^l`@`A`haAb!b=bbbwdAdYdueTeWf,f_fag6glg}i1i:jDlqm6neoyqrr=r_vsxAy3|)|Z}R}[}j-)!-))-)Q-*?-*L-*Y-+O-0:-31-3S-3m-5+-5^-6a-8m-8y",
        "zha": "!l%Q0>4^4g=0D{OPOZX]Yb[(]G]W^ng=o;t*xHzI{N~J-&t-/9-/a-1{-22-9]-9`",
        "hu": "(1(~.j0Z1M3!3^545r757G?0AMCtCxD<E$GxI+K%K;NGNHNPNWQ^R)T2X`Xd]<]x^^``gVi3mqo)snt+tK}Z}q~B-$4-$k-'O-,j-.s-0<-0c-1`-2v-32-4?-4x-5)-52-5?-65-6n-7!-7?",
        "fa": "#k%O/'/N:q;*;3EeKkLvo1oKstzV{V-,F-,J",
        "le": "%f.U1_>5C_{u-$*-'1-(A-1!-1d-2i",
        "yue": "$S%!(a){0^0|242S2_373H4<8sAlM{O,O.ZaZc_>cid2dCdFfZgApDqBw2whw}zczd{[-,V-6:-6B-8Y-:^-:m",
        "lao": "&)'n,71s3<5>9M<b<c=&=3F'HYP3Rvg.g4hin`oDr(v/x8xa-%8-,9-/W",
        "yin": "&#&j'a)Q*a,^/B2{5G6{7V?3DJEGEcF=FHIRK4K8MuO2RLRzU=Y$Y*Y2Zu[M^9cXczh'monipNp]qer/xFx^z{{||/|l|w|~}0}@}Q~W~f~p-!b-!r-$&-$2-&m-&q-(6-)^-+:-/I-5h-9p-:!-:?-:E",
        "ping": "%b&'.H0W1Q:T=f>~CXE%F$H(JWMaOQP%Yg^jgrh>mAqa-$^-(w-/(-1w",
        "pang": "!o'A1+=/>R?$?=A/B|QmWsd@jf~6~|-0k-2g-:K-:M",
        "guai": "0,;%",
        "sheng": "!D!^...t7*7q859e=[=x?*E(KM]^aMb1q2t2|#|Y|u-4_-9B",
        "hao": "*:.,25<x=ZEMJ$L3L5LWLtNYO<SG[0]z`Y`ym,mhu#y]-%>-%|-0i",
        "mie": "!`(D1G1dJxL>SNS~W]vt-1e-3M",
        "nie": "1&294(4,=G=|B)B0E!GDMlSX^=e)e?eAezforAs$sJu*vfw9wByVyY{&|c}(-%L-%x-:#",
        "xi": "!>#6$3$d%/&(&g'J's(!)P)n*l+7,,,n313z434i5j6H7?7W81878g979U;V;n<2<5<6>c>d@>A6BABBB}FUG]HeI9IbIwJ+JVKzL2NdPjQoQqRYRqSiT!U)UzW9WFWiWlX7XfXjXlZH[K[m]5]F_@`.`/`W`_a(cCcGcfcwesf)fulGlplwm&m4m_n:oIokp2p7pbqLqMqvsYu+ufv&w6wSxJy,z[{5{b}9}?}P}U~#~2~q-!%-&?-'2-'`-'r-(1-(C-*C-*O-*{-.)-/x-0_-1+-1J-2X-2q-46-6*-8I-9O",
        "xiang": "!;)*+50U5Q6Y8b9u:U;E;J<4APC{HGHvL<N~RbS4T.VgVsZ(_0`PdqmGmYmZmfqiq|v(w4z&zXzt|H-$3-$9-%R-&g-'+-'{-(&-(?-(b-*w-+_-/C-/~-1<-1L-1g-23-7g",
        "shu": "*V*x.0.D2B4#4K5%5^6s9/;,@[BPF(GuIBIeK7LUL`MLNePDShT*UHW'W0`=bOc+e%e0gIhOiOjQmSqIs_u[|I}!~Y-/A-1Z-1a-4G-4p-8@-98-99-:e",
        "dou": "$#,[,}1E@#FEKCOI_E`5jym%mMnMpCrIwpzH{.{~|]-'9-(F-.%-.&-.*-.,-..",
        "nang": "Sd-(&-()-(^-9b",
        "jia": "+L/23l=!?)?u@jF+FuI.P5P>TaU4UI`]a$a]bxdRjGl{m/q#qOrXu,x$x>y`-$a-$e-%c-%d-)B-+5-3J-3q-4(-7i",
        "mao": "!M#i$i*:/66e:u<eDDE/E2E3HVJOQ9QNRXT}WY`|a&aSbrgPmkn!nJq>qcsVx,y%-,B-,O-4|",
        "mai": "?W?XF>K^LgS{aKaxj(l+~g~h-!'-5{-7t-7u",
        "luan": ";D?dAzA{L=NDW~o{r7w@-4'-6G-6h-:y",
        "ru": "/M7F8G:1>AEgIYJ6KlLhQJSHU:VGW,inlEm`oSr+x_-%E-&!-1]-3)-3K-3x",
        "xue": "$?,(A=C@E@IGLKStTnXd[p_[coe,hdibig~/-!_-#M-18-2k-6%-6^",
        "sha": "%4&G052u4O8F8~<<<CFaG`H+K<U]t}xPzazi~S-,[-.h-/q-/r-2=",
        "na": "*0.u.x4E9#>WIYIuTJU!Zt`m`pgNlNlypHu7wcyZ~0-!d-.x",
        "qian": "'K.(/~0A0t1'2*2D2R2p6+7[8J8q:G;h>b@vA~CnD(EIElF:I%IjK>KLNNO&O8P}VR[*[u]u_q`!`&gSh;i~kjk~p9pEpOq;q?r6sPtYukvqwPwgwtwvx+{x-#U-$z-*+-*/-*=-+U-,y-,z-0x-37-4M-6z-8G-8M",
        "suo": "#*1Z1^4Z797U:?;cFaFbJ7P{VJcuk)tatju3u9xi-/b",
        "gan": "!3%)*1*t.Y/x1*1}3%4s91>GCmE#T>Y^bJbTcAcTcti}nE-+e-.Q-1T-2w-3*-:i",
        "gui": "!q#o$.$C%x%})0)s,E/?1K1T?NERJ;N%P/R*RpU<V{WVX0XPZ!_*aHbod<dng>gEi#lilxuyvlzY{P|M~#-#K-*;-.7-.:-.=-/S-1F-1U-2%-2r-34-:Y-:]",
        "jue": "$Z$l$o%6,%525S8#9NA^D=KiKtNnO6RwRxU!WWWbX%X5X>XBXZXiY4Zj]N^f_}a0c[chd<fCfDfwpKv)v:wCyo-)0-,$-2r-3<-3=-5g",
        "liao": "$:,A,m,x1g7n8%:@:C=OA#ADJcM(RnRv`1b8f$fJizl&mnopv,wNypz.-&@-&G-,)-5t-77",
        "er": "3><m<p=8=T?HEyLoS|U8Z6aBaGbjd3gshtjJl2q_x9|L}M-'/-(=-)Y-,Q-,R-/D-2)-3j-6b",
        "chu": "$e%s(/)M.%.)114y9=<~=%A_DCG=IdIoMMNOPQS'XRXe[/`E`Oa,cmf=fTfcmaq3rnxlzW|`}p}|-59-8O-9|-:)-:9",
        "kui": "#f#o$C'D,Z,p0v1m22=m=o=s={?NAFI6IJKnLyN1N;NbQY[edpf*fvk;mXt;tJ{0}7-$A-$d-%6-'a-'o-(P-(`-*6-+P-.B",
        "yun": "!F'N*;/`/|0y4T6z7!7<7C8z9|<y=?@_D@FLG7IAIVIyK_K|L#L0MIM`QcV@a3b)b@bYc=j1kQm!m7mVmgnRo0o8pVrO|'|d}5~7~i-#?-#g-#n-#{-$(-$/-'N-(p-)'-:'-:0",
        "sui": "!q#G#J%G&f)$)t+R+h+p5m7>7h7x8D9V:4AQCyFOFPNxV}Zm]c_QazkFkHl.uqv!vF}*}/}G}H}w-#$-#r-+|-,/",
        "gen": "CQEHdc",
        "xie": "';(f*&3c4k5+595I5h6g6v7&8>8T92:B:M<3>l?T?V?ZA&LRLTM0Q7QKS+S@SBStTRV*V^W4XKXOXS[B[y^<_Z_mflfnl,lU-!i-!v-#1-#D-#h-$#-%c-/S-2%-9Z-9q-9t-9~-:b",
        "zhai": "%X)3,92q<?a@b]q=-9c-9d-9i",
        "tou": "4G6sMyjqrItA-$b-&r-+h-8;",
        "wang": "!664:h:i:j:k:mFvGmO>P*Q,Znh5iGj+jM-.N",
        "kang": "%<+U2v3tg1lJpgugwmz={L-17",
        "da": "!W.u/(/S84;H=<EsF*LHS0VCYldzi{j0j7j;k?kZt]tqvZ-!g-!|-#R-:S-:U",
        "jiao": "$y$}'~+k,A,K.`/I1o5;8?8]9O:J?E?j@hA9AKB(CaEZE[KTM5NZP!RkR|WWWbX%X5X>Xs]Q]fa`d0dhe3gvh_hfi;i?lvnkoHo]p#q]v*xW-'%-(B-*h-+;-/Q-1>-20-3|-5k-5s-78-:a",
        "hai": "5L?Aj9l/lnnro<-'!-'~-)Z-)b-+>-+p",
        "heng": "?J?mMZT9vc-3o-4$-6e",
        "peng": "%c&'&S'+'Z+,.V1+1@5@8P>~AACgE%FdJRMkRiRjU3eSgbh:s9v{zL-$+-$0-):-*A-,X-,b-,q-4K-6y",
        "mu": "!1#N%]+V7`7n:@?.C5DeF~G%O=e/qKqPx!~3~G-#9",
        "ting": "/s5l<t=j=z>%>&?qC)FnI7PWQ8ZJ[El=rUxKz`~K-!~-$g-%e-9F",
        "qin": "$j$k*'*Q.d5c=>>MD1DAGZG^GkMRO8Q}RJS7TVWJWrZQc]pXpkriwix{}c-!]-$~-)f-+E-/c-33-4L",
        "qing": "&/&Z'i046+60:ZDaHzQ#Wr[%]%_Agph+i7m<s4vi-!;-!<-!B-$7-%P-/}-2B-8X",
        "bo": "%h&^'x(B(U*L+l081c2%2,3~4m:S>;>t?fA!BuC,DrGWH=I'J{L4MmO^U+U,U6VrW5ZL[d]Rd8d_eKf@m3pxq5qFrVtow0wxw|x(yT-'4-'^-(E-(V-(d-(g-).-)[-*^-+)-+~-,$-/0-1=-1}-42-6k",
        "lian": "'K+D2+2P2V6w7b8k94;s<T=Y=n=q=t=u@+AZAcG(G,HLJTKDLELOMsMtQtS=U`UaVUW#We]0f2j?k(n0oPsZsyt`u@vKxfy}-,n-0U-0}-27",
        "duo": "&U5|:!BtU0Uncrdfdid~eYg!g#g5plvUx5|E|J}*}3}S-&~-(;-(z-)1-,i-4]",
        "men": "#{$*+XGRNEsuwVz1z6{>{M-#!",
        "ren": "(o*,*e+#4A4U5)5y8x9$>?@AD)E}FGGDTUU2Y!ZC^I^Vg&gFi&p/p;pRqp-!W-![-#[-#w-&i-'#-(2-.^-3{",
        "shen": "!U![$8$r$u%j)#)9,12e2g3T3U3q3w4l96:p:~>i>m?t@BFkHwH}JGK!LCPGPHUNX)Y1YHZ*[2^)_%_L_S_VfylPqRrj-$W-)W-.m-/z-0@-0|-1)-2N-4A-8b",
        "ze": "#R#}$n(+*p/,0J1I=0BsKAS?Vz[(].a@b7b]c:jO-&t-6.-9s-:,",
        "jin": "!#$j$k%M)8)G.U.m/J4W4`6L70:/B6F&F;GcGkJYM!TWW%WzX<X@]9_sb&bIc#j2j<k8olomp>sTwGy2-!^-'m-(Y-)$-7D-88-::",
        "pu": "$5*k+j0$8LBTBUFXGGGaH~IsIt[D]]_|bEfInprtupv=xbyqyu|[-/m",
        "reng": "(_DGiu|z",
        "zong": "&Y'h+?3P3]4$5z6E6Q6n6x7(7M7X7e7t9%9n<J@MI=J=QU`eePeRf1t!v_-)z-*5-+K-,`-,f-.8-09-0G",
        "lun": "&n'k*|6:9&='@4D:GLPk[1^`eBhAi)s.|k-04",
        "cang": "15B$BpC<DUI~M#R3b/w8-50-6P",
        "zi": "!i!j%()R*/*X*b+E/)2l354F4d6I6W8O9s<u>z?!?MB'CwE5E7ENE`F4GHHuJbL;NsXHYOYP[I_caFa[bzb~cZcpd(h3hQiJmbp&pmsGtRtuy=yO-$s-$t-,I-/{-0r-2P-4e-9)-9f-9i-9u-:D",
        "zai": "#^7HGHb+g|i9n^",
        "ta": "(d)i2~VAZr]wdBe7etfFfOfpkdkiq+sBt]tex1{'{5{;{={R{o-!s-#*-#B-/?-0t-2d",
        "xian": "!:!O#5$<&#(F(h)X*3+D/D0V2k3B4%4|5A5c5t6,6]7J7r8Z8c8q90:%;];d;h?&@oAnA~B;BvDSDwFzG,LOM'M*MpOKO_O}PJT+T0V_W:WRX,ZXZo[O]d`>awbKb^cYdgd}f;fhgBhHnfo'oPqvr#r$rFrqs<sps{uww'xJxMy4zBzC{H|K|a|e|s|v}J~v-#T-$!-$$-%.-%H-'D-(M-(o-/T-1l-21-55-5x-5y-6$-6q-7G-7h-8$-9P",
        "cha": "'0*049B=C9CjD}EYEdTAYyY}_1enr't7t[vryDz!-!U-'Z-(O",
        "hong": "&*&8.*.>0o334=4P4f5i8o8{;z<!<==CDyF?HoHpL*LXNtXtXy^L`'`*`,gUhNhwi+p[q[rGrYt:z?zXzrzt{I~U~e-!n-.(-.a-3v-6i-8<-8?",
        "tong": "!r$@%o&>*]+m.?/Q/i345D5N5`9PA@EjJPO1T,Z,cFj|ndq:qYqjxC-')-/L-2*",
        "dai": "0,1n4x7%9AC?OMQ]TdW=Yd^xa7aLbqdff'gCgLg[i%jIk4p0~z-!0-)E-/>-3I-8N-8e",
        "ling": "%d)D*M++.5/+4p6@9];K;U<.=KBqD[GiJJJmL%M|OiT(TcUjYVdLgZh/n8oWpts0x)zN|q~;~O~]~a~c-!2-$L-%`-)C-/$-05-2C-3L-6Y-7E-7q-9z-9{-:A-:T",
        "chao": "!k,h,r2u6?9b;5<wXDY=]?cdh`mlpSwa-7w-8v-9#",
        "chang": ">J@mA+DTGMH!UlUqZfs&sWy+z'z(z0zh{1{a-#d-.0-02-1X-2H-2T-92-:d",
        "sa": "8g?^HDK{LYY@fnpQuwwS}A-!c-!s-&,-&P-)&",
        "fan": "%0(M/1/40i2A2d6R7i8$;o<[AIBcBfE0KNLPM>N!SOVqXva=bcf<gEg_hThkj5p'v#v?wT-&=-&Z-&n-&o-(5-1E-5r",
        "miao": "!J#m*=.10s6e6u7n9z:@D`M$l3-4s-6u",
        "yang": "!R#!(C)Y*R4t;E;J;P?5OxQ/YX[T_0gahGqDswt,wX{}|.|y~:~}-!p-&8-&M-&k-',-)G-0]-3a-3t-62-6X",
        "ang": ">Xo:-+g",
        "wo": "#l&A,R,_6}>I@OAlB!G*HQLgP[Qbe:-(p-:4-:I-:L",
        "jian": "!%#9#`$<$D$I&N&b','r'}(&(<(X+D.p/9/g0#0/0Q181k262I3_5U6Z788(899v:9<F>$>S@fB4BoCICSCTETE~G<GrHiI{K5K]L!LVLwN=RGSEU5UcVjVlWAWRW}X#X,YT[.[F[c],][]}^!_Y_v`K`Racaybkc|d?dKdye8ecephvp/p;qXrMrZs(tFtHu!ubv4vDvNvovpw.w1w5xwy:zCzD{J}d-!V-#;-#>-#O-#X-'A-'S-(7-(k-,h-0Y-0`-0h-1(-28-2h-37-40-4R-5@-71-7F-7I-7J-7W",
        "fen": "#|%A*9./2x3=3r4S9';M;q;~ARD4IxKmO?O@TGY,`^`ff|hjnOpUvY}K~5-'W-'}-(c-(r-.w-1M-2Q-35-85-8n-9.-9:",
        "bin": "%A8I::A)AiNc`X`cahailKvjya~l-$p-%G-%k-,'-,1-,E-,_-,p-.!",
        "di": "!u#/%W')'.'{)<)_*U.v/*1=2c4+6c:);X<?=b>;@WDXD_FMG9G_ICJMJrJwJ|M6Q+QVR<TtX*X8XIYW[:[A^q_f`dcee_f/gYjKjtjukLkekwldp0qNuIyj|5}#-!X-#=-$H-(y-+n-,>-0>-69",
        "fang": "!I!n(l4Y9*>TBjD;O!Y;^ed@lLp@siwn|,-,?-.v-1s-3E-51",
        "pei": ">Q?(JBSwUrUsauc2hyiPnBn{s5y7|%|f~M-)#",
        "diao": "$#&a,C,k.B1]5FJML|NhOaXxZ8Zv_M`ro~p_r!r:s*s[vawUxExR}v~D-.c-//-0%-2L-2{-3&-4O-9>",
        "dun": "!<!A%J'3(%Pxd;eZf?fKfVjikGkvpLw`-$G-%X-*c",
        "wen": "+C+`+z4B4C5X7!7<839)9|=d>^?gD'G!O'O(R/RO`ahShWiNu6zlzqzw{<{D{Q{c~4-#?-#{-%(-'f-)(-)4-.r-0g-0z-2V-36-3G-9<",
        "xin": "!=(F?zBID7FkLZSyVtY3Y<gBiWlOo[pIrNv1w,xtyn{w-%/-(q-(t-)$",
        "ai": "$F$|%l%~&e'M(:5=CbKGL6MN[K]k]{b2g(r9tWv^yK}1}8~s-!.-!3-'U-(m-1[-3l",
        "xiu": "**3h5g7u8,9T;Y?i?yB*B7DuQ{ToV0V1`ur%rBtSu=u^uvxp-&K-'l-(X-,@-,U-/Z-13-3}-6d-9^",
        "xu": "!$!*!4!Z#j$l%;)W+@+H3[5K5e5x6T6X6s7)8X9[9_=X=e?4D/IeJ)JXJfKrLxM/NQNTNUO[P$Q:UDX|YBYJYs[8[Z]C^^_3_ia^lUmwnLo*qovn~E-$<-$>-%T-%U-*[-,w-.G-.W-1_",
        "tang": "$f'@)f0{3V3j3o;l=)@zA4J4LJQSR$RAcMc~eef&g+m]o=tiu)uTv'wDx[yWyd{1}:-#I-']-'h-5:-96",
        "huo": "!V$S$^(*)>)S*Y*_*`+|,W10=$=4AuCJG.IhMTSI[g`0a<bacnlTpesrvhwoy6yyz5}y~R-!,-#S-*0",
        "hui": "#J#[$G)N*i+s1;5R8.869I9}<9<:<L<^CxEbF1K2KeL8L9MFN,NuO7OtOuPZR*RyT_V:Z$Z2Z_[L]S]n^#^X_!_<`FaXbyh4iEjUk*qouqvI{6{j}3}S-!Q-$c-%C-%l-'R-/V-1#-81",
        "kuai": "/w3}?]AWIJIql|n*-)0-1P-2.",
        "cui": "'g,w2z3L4[697>:4<%<@?R?U@.AEANAhG{THVmd#uQ}Y-$|",
        "che": "$;%I&?&@=JFjP@g<h~jA-$M",
        "chen": "#t&M&t'`*[+A+{5{>FA}EKFRFcK:LmRBTDW6Y7Zz[Q[o^;_V`$arb;c`cad>dKeagKimjHmDo@pAt(|C|o~H-5T-7]-9l-9m-:=",
        "xun": "!x$Q*p,^4;8MAjEnF:KLKSL[LaMcRzS%XwY#Y)Yt^R^T_+j%jajlkclsmzoTv`-%A-(}-)U-+%-1?-1H-24-5A",
        "chi": "!]!y$).X.y/A0+02133,5W<#<$<D<H<|=@>>?2?D@SE9E|GeO%OHORR;U/U0UkVMYFZ9Zq[t`8aRcBc^d+dfeGj@jBkKkfkrkyl7q7q^qusx~9-&l-(4-(|-+&-.R-3Y-4!-4r-4w-4y-5]-6Z-8(-8C-9k-9v-:<",
        "xuan": "!m!x#d$['5)k0R5?7J7d7w9K<G<_HMHNJ8K#L/MQMfPEQ?S<T)U$[;[W]_^&_abRgDi$jkl!q,ratLu?x0yl-#'-&2-)U-)k-0f",
        "nu": "%a/.?;-)>-+4",
        "bai": "+&.;3;3M51L^W3b:b_-#k",
        "gu": "!/$J'B)A*~+P.z010?0u3g75:r:v;Q>K@(AfE)G>GhJ,LSOdOjSeXFYR^h`%a]bxgdgehYi,iXk,nYprpws]wwy.}h-%@-%W-'Y-(Q-+`-/;-0'-2I-3^-5?-6S-7%-9*-9+",
        "ni": "!h#P*G2m73=i>$>}@pABA{DqLpOLP.Q!XXZt`~d`h.jhmCpnx3}L~X-(e-0,-2J-7`-:+",
        "ban": "*E2s5!9;>PBgBkQ*QvVKd[iciipPqEwfzx|$-!h-$F-%Z-.n-35",
        "zhou": "!+#U$x&y062.2@2C3+384:777o8p9:<B>B>o?#B^F@GoI$LfY][a]y^r_4_Manc0gkg{h,i0i<k7m>nCqg~Q-);-)`-)t-*r-+[-0(-3~-6f",
        "qu": "$L'o(}.2.F/@2U3?4o5#<1<U<~>u?/AxDlG:HhKbM}O[OfOpQdRDRlSkSpT'T:U&WxX!X&X=YeYjZj^tcjcld%d*fqf}g2gWw<zfzu{i|4-)3-)5-*W-+'-,S-.~-1'-1;-3W-4l-6E-6[-7}-7~-8&-8+-8U-8u-9A-:/-:H",
        "ci": "'=(A)%353a5579ESEUG6L;OsQpS3Yp^saqc.c_dSiYiZiaij}m-&y-'*-+l-,%-/+-3V-5C-5D-7'-:6",
        "beng": "(l5@657k9iGnO*dtf3jYk2uiygz>-#)",
        "ga": "g=onsfwH-.A",
        "dian": "&p'v,j1iIiKRPXdXeVewq!x%|8~@-!E-%3-%4-%z-*g-8Q-:8",
        "tian": "!:#;'1'H,j4w6D>v@:BRBXGvWmX9atnTr#rFsXx%xM{%{n-!>-!G-'$-3f-5J-5S-8:",
        "bi": "#L#M'!(w)L*@*C+;.n.o/E/Y0(0)1/1<2r2y4M4m6>7Q8@8};7<,=a>a>r@lA[BlC|E*F.FJG~H:J<JdKHLLPPR!TiUfVhW$W)X^Yh^v`<a!aEaUbMblc/d|e~fPfQi[kBl)l^mjmym{q1truFvQx2z8z9z:zP{B{C|V-#,-#G-#p-&u-'j-(f-)I-*X-+x-,N-.T-/*-0Z-2S-45-4}-5b-5n-8~-9S",
        "zhao": "#'$K.e00:V;#;?>*>1>2GdYf^ucScxorp<q.t6wL-)8-/G-3&",
        "shao": "#+*y/r4r6%9>C&CqD^FyHSK}Tjh$la-#&-$)-,Z-/`",
        "zuo": "(|*S+!+n/,/p4*7{?'D{F^H`HaJ?Th[(nWp||7-&t",
        "ti": "!g#e')'?)Z)|*v/8285f6|9Y9y:{DXF!KgLIUzV&V'[qd)d2eJemexf~g8jxk=kLo&rDt)xy-%$-%r-*2-+m-,0-,L-,]-,a-/^-0B-2U-4;-4w-4y-5L-5M-5i-6r",
        "zhan": "$H&b.33*6=9oGQLMN2N`NaOeWyYQZ/]h]l^B`#cghUhgiSl0n|zK~V-%~-&*-&N-&e-'|-*b-*l-.Z-1S-2y-37-60-7=-8i-:h",
        "he": "&c()*(0z2i3@4?8r<N<ODdFIGFGzJ1R(SMTmV2WOYGYIYw[z^i`x`yaTbtcIloovq0vgzRzU{){X{m}Z-!7-!8-!9-#7-$P-%f-'&-(@-.|-1u-5$-52-58-6?-7#-72-7v-9n-:>-:`",
        "she": "'y(`BJBKBLJuNpOgP(S5Y>^dagakc'cDg~{!{^-#h-)u-7l",
        "die": "!g!t&w5M9G<k<l>pB5C6D~PmQ`R@V,V]YU[7_WcbdOdXdreigojNz+-#1-0S-2R-3d",
        "gou": "/01%2)3g6t:&<h<i<jD>DhO[U#VBWwX;YNY~_(`ob5bgk_pMqHwl}k-#A-#m",
        "kou": "!P!Z#r$$,P.2/W1OD+K=KFp$-5K",
        "ning": "$P=R>!DpLevm-,~-64",
        "yong": "%p&>A]DcIPP=Yre2e]l@mJmio9rHuVyh}n}~-%*-%s-'x-/y-0w-15-2A-2o-5`",
        "wa": "%K,),?,E,`=N@r@xOyTuW1lc-#W-#^-#t-8w",
        "ka": "?8U@qV",
        "bao": ",<.~6h?,DgGYHcK`L4MJN^OJTeUdV4V5Vf`ib*d8q/w%x.zs~>-!6-&x-&|-(9-)/-+j-,M-/7-1~-3/-3A-6Q-9r-:B",
        "huai": "=7N3N8VDVSeE-:f",
        "ming": "!C!w#zEDJ'R,WuZ0m^n_q}xT-3.-6L",
        "hen": "Y|-!y",
        "quan": "$b%u/K0B5<6$7:9mEqI3NAP|SlXLZ#_)dkeIgzi=o5qxv%xO{#-#_-%M-&$-)V-*3-,e-0L-2^-9}",
        "tiao": "!~(t),,J,g/!3/4.5F=S?PCdD^H0J@JMJNPnWdZ8Zv_McqdwjCr!rdtyxR-#%-,G-/o-1&-2;-9y-:C",
        "xing": "!D#Z&$0Y0g6J@YApBFEuF7FhHrP9T#XVX_[_lMluo+pBqZqwrhwZx6|D|S-'V-(/-)p-+D-/5-0D",
        "kan": "!N$=$g%?'^.QG&T%h8ho{4{q-%)-.+-:R-:X",
        "lai": "#8#F/X0%2/2MG'H%MSW7Zqaob,c&c4k.mBsgxd-$q-$w-)y-0*-4B-4f-8%",
        "kua": "50?>B~Z=d9dlq~-+s",
        "gong": "'91*44474=8o;z>[OBXQXba6bZfzg$gtrG-!z-,T-:L-:Q-:W-:u",
        "mi": "!s#p$A(w)')w*C1d2b2}3p407c;>;F?bClH{J#K'K/L}N#N6PaU*WZW[WcX1Z.[j[l_g_rjXo4oXoYo_r,z/-!K-66-7X-7Y-7j-82-9&",
        "an": "!(!.;)?I@XEzGlHWHgJSUxZS[N_d`k`{r1s:x]zy}+~=-!w-!x-$1-(l-/E-4I-4u-6v-8c",
        "lu": "!)#Q$_%|&L&d'])E)J*}+[+o071X1v2!2#2G2H3I6S8^9q:f?9A,AtBmBzCFCMCND.G@JcJeJtKcM[N<NINVR>SYXh[~aVb|d$dseCf#gxh^h|i/i>iTk5nwpis2sascu8uMumvGw&w+yr|A|t~x-%J-%_-)+-)r-*N-,3-.q-.t-00-1i-1r-1y-3w-4E-4P-6!-6>-6U-7;-7C-7M-7b-8l",
        "mou": "!|7n:@Oq[[_Ue6t=-#9-3y-8!",
        "cun": ".N2nA>lS",
        "lv": "$()(*r+~0`5Z5~6S7_7j9q:*@wA(A8A;HkM,NKV=VZm'rJw#xDz_{T-*u-+*-5a",
        "zhen": "!X!b!c!}%Y'%)5)T)b+I.A0X264N4w5Y7D7L9,:2=I?%B9H5I5IWJ&LnTpUSWaYKZb^pa2afbWc%g^hZi4iqkOnNoxq$r~s`tOu$u%wJyS|0|_~L-)D-,o-1f-3@-6R-8d",
        "ce": "/%/U/^/t0G1W36F/H3HPJA",
        "chai": ")&>HCjEJNzS9T[Xz`jp4wY",
        "nong": ")v*j+q8C?cAXL,V~]iioipoL-,{-9a",
        "hou": "#c$t0q3Z<M<UEVHq`MjgltmWq|t@-'T-+r-/B-0C-1O-2!-2,-9Y",
        "jiong": ",M4~5uB#B&MeMjVIjFjjqi-$}-%h-)6-)X",
        "tui": "+y=N@tJ^MAM^P?PYQkVL^.eof7jb}D-$n-$o-$r-%m-)l-+u-.L",
        "nan": "@^G$HOQe[PcEk]}_~'",
        "xiao": "#+&4&:+i,N.l/q0!0O0c1(1b1u5a9R<;>@AGFyHCKyL2LtNBNMP<RPR^S!S[Y5YzZUZl[ke*jom9r@xh~I-&3-*`-+8-+q-,!-,+-.I-3X-3p-5Q-6W",
        "bian": "%`&}+8,;/=0S2A2W3W6k6y:$:+B/C4DLHUL{QBV+WTW}[5^/aJbfi^idieifihikiliviwkSl4l5oatPzO-##-#<-0I-0J-2`-3R-5&",
        "pian": "0l6y:$<I?K@5WX[9_haIaZdtejsq-)O-)v-*(-**-+?-+N-+w-.z-5&",
        "cu": "1P3)7S?xK)XAZDcjcvd%d*eOehf%fAfBo$-%<-7O-7R-7T-7s-8t",
        "e": "#3%:%B%Z%y'<(9@bDRF}HXKfO#PBQ)WpY+ZF[?]L^2^___`NgMgii(j8kRkUl%mRpJpjrrt&w*xoyCzn{f|!|3|:-$?-$R-$S-%%-%&-%t-%w-'6-'L-(G-)n-.f-0[-0v-1h-2Y-4&-4<-4=-4z-6o-7$-9[-:3",
        "guang": "%w?@B#B&EWgwj}r0-89",
        "ku": "%,&5*D,@,T5:9E>{DoU1UbVTdPllnm-+o-/R-:p",
        "jun": "&].=/`0<0CFlGCI1O/PeTXWhaeg?m1p^qfr&t'wj|Q}^}l-$j-'8-(J-)m-+F-/]-2?-43-44-47-7U-7^-7d-:Y-:]",
        "zu": "(x*J+10H4}95GqHbIkYm^kd6eLtdu2u;yk|6-!f",
        "hun": "!F#O#W#]F6I8JyXT[=_2hczo{d-'>-(L-.C-9J",
        "su": "';+1+3+],X1U3.324X7K7U:?>,>/@{DWFwJsM+M]MiXWYE[r^o_lcyf(k$khksnZrR-':-*_-+L-/i-1@-5p-6~",
        "pai": "0'1z1|IOhBjLtV",
        "biao": "'c,!1D@3A,A1AoJoM=T@UoVa[3]#b?seuZw$ycz#-&&-&+-&5-&D-&E-&F-&H-&O-&W-&X-*~-+@-+W-,;-2j-7Q",
        "fei": "%[//1!6M9a<A>O>e>r>z>{@GDFGjH$KhP_PuRuUtZp_GaObsvEyP|g~T-!/-!H-!I-&Y-&[-&]-'H-(j-*!-*,-0+-2F-9;",
        "bei": "&i&r)`0'3f>wA[DfJ9M8PAU'V;ZLZwa1bVgch@iDlbm5mQqWrPv[wd|=-!l-#,-#C-+k-4N-6x",
        "dao": ")=)H)x+B+K005F8h<B<`B_C7GwR7T4T7Umeqg9iwkYoq|b}=}O-.]-1n",
        "tan": "'/6D8A:_:eBOBSGtM@TkW(WJZ~]Z]a_R_xa.a>bdm?n~o,oJqQsMx#y8-$x",
        "chui": "&U0D@8GPsFtny0|n-$u-:_",
        "kong": "%.&V,/0@;gg,sA-#(-4[",
        "juan": "!{#2#H5J5V7Z9S:|;=?w@7AaG[K3SfUM^&mTrZras6u0vHy5yXzt}^}l-#'-&k-'.-6m-:w",
        "luo": "%T&!&='n/>0M2]5>8f9M:n;@@)@UAwF8H9HYJ5N9OrRHS6UvW~X'Z1dbf`g'kAl:uEw>y/yf}s-$f-('-)_-*P-*k-+=-+X-/K-4#-6)",
        "song": "&P.@===yGOY0Z]^b_?jcu1-$@-%[-'[-)e-,c",
        "leng": "#>&h++L@eD",
        "ben": "/&<(DxRuaUblk/sIy&",
        "cai": "#T677P8aGSK+U>a5b[dxeQob",
        "ying": "!R$v&C&|(P)c+_2K2^6U7/8`9^:>:X:Y:c=?A:ASDzEAF7F9G0G1H@HAHBHZJKLqMwOmQ0QPQiR0S8SgVPWv[i]M]|adbHc@g:j/m2twv8vky?~_-##-$.-$i-%g-%o-%p-1V-3g-4q-5*-53-5o-5~-67-6C-74-7>",
        "ruan": "&u(>6^<o@QgQhDi*|(",
        "chun": "#_0_4L8|>U?sA7C~G3G}HRITJZQgSUb(hKn}o/sL|T-0#-0Q-4i-4~-6{",
        "ruo": "0P1#DnI}mP-0e-0{-5<",
        "dang": "!,#s%2'((2/[1f2&CDF3GbKuN(S)UCW&]b^A_kd&kEvWxB{9~A-8[",
        "huang": "'w+e0f1q7O>=C1F#H|Q@RtSuYv[V[f_Xd,kWt3txu}yI},-$,-'P-*.-0T-1A-2]-5q-86-87",
        "duan": "${'&.I1`2X6a:#<r@kI/V/fdt.tGyG",
        "ou": "*$=*@VA*KPM)MG]3^Yu:-3H-5[-6N",
        "zan": ")},'1A1t1x3`W?^'^?apbCc<d4d5e}n1n7n<smuaubv2v<-((-4C",
        "za": "%k4^4gAvA|Vpj*q8}r}}~)-$'-.u",
        "lou": "$(0x1V=+=1C>IMK(QfRI]1a*g3kxu]yN|F~x-#J-+}-,*-5a",
        "sou": "#v2BC;IQJ(L_M?Qum[o3t~uAyH-&:-&<-&S-'c-(R-*<",
        "yuan": "!9!f)V.i0F6f7':.;m>CD3DYE?I?I_InLGLdO5PRPzQFQXQrT&TYUiUuV3VF[xa3bYh]iQj=k@kgl8lRnPphs'u(|^-%1-)9-*G-.o-30-3U-4V-5%-54-6K-6]-6}-8s-9!-90-95",
        "rong": "+Q+S5E7@9C;^>FEFEfF5J/QhQwQxSDVEghthyb-)R",
        "jiang": "(43u3|5P8:9L:F<>=.A2EaH^ILK.LAQjRM[w]=^W`6ngo>oF|H-#P-%5-12-2_",
        "bang": "&<'A+%5_749B@uC8IcO!O*OvPt[s_olQlVt^y^-#3-,#",
        "shan": "#:'m)K)q+W.s7g7}:D;p;r?pALATBaD&DtR}S,TCWjY%[b]r^ObFc?cVd^gGlAn#p!qtvBwRz4z5z;{@|P|X-'q-*J-+V-/l-1C-1D-2s-2y",
        "que": "&5&E&g'6'7(1(N:P:RI]O6c}z}{*{l{p}a-4Q-6t",
        "nuo": "+<+u3e3y4&<oU/U0[Y_DelkCt<y#}_~'",
        "can": "+W1A3ELBO4Q.SjSn]2uJ-&`-'3-*T-+M-8^-8f",
        "lei": "$X'F'b(,(H(I)7)~2j4h5H7Y8S8Y8j:=:d;t<s>5JiKWL.M4N*N+N7N@SPZ:^(^zhxnoqls?vPvvw:yz~<-!*-$O-$_-%7-%}-1Y-6<-9R",
        "zao": ",y,~1R3sC#LlMPOC]`d1f4fNk%ktoCwA",
        "cao": "3m>9C=C[EwJ_R:VbV|n)uc-*D-94",
        "ao": "!T'Y<Q<V<Z=wC]DBK&R=T]Vy]7]8g]kom9uBuMuNz*}>}I-*S-+S-0~-2b-5X-8{",
        "cou": "@ThJiK",
        "chuang": "'_,H,L,q{+{E",
        "piao": "$+).1D7a:;<RF|LiRCo?{3-%9-&A-&B-&V-*U-+W-.S-1.",
        "man": "#{$*$c5X7]:<JkJzN)P2R6R]SoVw]>_tmuuCuUye-#!-%;-%y-'i-(Z-,t-,u-1*-2m",
        "zun": "8':^U5]Pk|qqv+-1B-2u-4n-5|",
        "deng": "$7'q.M/H1pCCW|`:f9l>mxv6yx}E",
        "tie": "=VH8OhaPbndXq'qzv>vRx'-&z-'Q-*i",
        "seng": "-,v",
        "zhuang": "3:3nF)F]UBUZ",
        "min": "!B%9&`.}/<1l6O6d:,:wDiSSb'pqs7tEzEzZ{K{S-1$-2n-3P-8q-8r",
        "sai": "2'@cb6c9-%#-0_-2X",
        "tai": "0+27>h>yB8BeD]GeLjdIl[nSpfw^-&/-)E-+7-/6-2$",
        "lan": "17212Q4/8K8i9x;+I<JCL~N$N&VVVxW*W;WDWoX(X4]K^:_{fknxw/wFytz~{h-#Y-%K",
        "meng": "$/$T$`(?C.CKFgH'IZKONvPgQZRaSFn'n,rKsby<~?~k-!(-!)-%F-(!-,O-/t-08-68-7@-8q-8r-8z",
        "qiong": "#@#x,+,.,d,|/:/FB{EBM%MBP,P0cWdolFqs",
        "lie": "5}=]?oEOOzU?csf^j`-&0-,x-.#-/J-1c-3r",
        "teng": "2>2F7I@sAHM9N?R1Z@[`l1~u-)S-*B-*v-0s-97",
        "long": "!p$a%n&=(R(S,u.!.6/;1*162N=P>'?6E<MxS^S`W8`4bSffu`w)|B}%}T~y-!1-*t-6@-:J-:O-:P-:V",
        "rang": ")z+t,$8bMn]s^8^Nfm-.$",
        "xiong": "?F?GCrY:YiZ4^a^mb'}e",
        "chong": "*86b;:;|B@CBEhNfQRS$T5V)f!ohqhxZ||",
        "dui": "&k'O(m5nLb]H]vhsj_v0v9ys{v|j})-$[-3h",
        "rui": "#h.h6N8+D6E(KUKVKpMWMXO)P~r<rwuqxx",
        "ke": "#u%T&5&~'B'Q(*(;*<+.,U,r6[9t<7C3DdHFLFOTQ5S}TmZi_Hd:gni.o2psqds/wyxQy)zM-$Z-${-%i-%q-){-+I-+y",
        "tu": "*)*.*x,6/a@dFNG+GVHsIfcbe&j,jvnjp6porIs!s}wO-(h-)j-4*-49-4T-5!-5O-5z-9M",
        "nei": "?~@;lNsE-'5-(I-/e-0!",
        "liu": "&B&d'>'[,A6;9l;1;;</IgJ*MERWUTe|kbs#tctzuHu{xuy[ym~%~j-&>-&@-&C-&U-'b-(W-)M-)c-*@-*d-+T-.9-0m-5=-5_-7.-76-7[",
        "shou": "6.9h@yC2uA-(_-:s",
        "ran": "7v>ZDZIFOEOYTST`Tz-,A-,K",
        "gang": "%.&q/{639!:N:W:x>Ep+s)ttwe",
        "gua": "506}:z;%>xU<V#Z5[>^|cnedr#rFxM-&'-&1-*9-3k-6c",
        "zui": "#G)C+15&8d;$KjRdXHi]nInqo!s$s8",
        "qia": "%{'I?1HyU4dUnU-!{-+z",
        "mei": "!L!_#)#a({)]+X0h3p;I;T?S?r@PE&FfI@QGTZdMg0mOnlrKtUtZyMyQ~N-#^-.>-.F-5(-7(-8V-8h",
        "zhun": "+$,56(>UT8YAZ{_Pj.",
        "du": "#K#b*f.T.^1,>DCsFBR&SZSmUyWqZd^$^D_E`3b%bNc)mMo(sDs|v}yL{!{^-!Y-#V-#s-#u-*E-,,-8]-8k",
        "kai": "II`7gysvtbt{vCxGxvy@z<{({U-&;",
        "hua": "%;&K'B3S8/BWD9D:GgIKK[MzR#XKZ&Ze[4[>]A]o_&`0p(p)rbsdunxN-*]-+<-5m-8=",
        "bie": "FTNFObRmVuf6-19-2l-8|-:[",
        "pao": "%e(@(O,!?|H>M=TeTfV>dDdTgfq/x.-!N-!o-7Q-7S-7|",
        "geng": "56575d6m7,9Q;j;u<v=DFVGfavc1m0-%b-+v-/h-25-4j-6|",
        "shua": "<nZR",
        "cuo": "#1$z'G79?nFpFtImJ2J}NR[(erk0kzn7o7rEs^t[xqy$-7H-7L",
        "la": "%_'R<*@>AbArG?HYM3PfQ4Q[SRi_i`l6v|z$-#0-,k-0F",
        "pou": "0$UO",
        "tuan": "1H4'V8a%u<-5V-6#",
        "zuan": "1B2Y808N8U8e:Kb3fjftq)vxw?w~",
        "keng": "%t&3&RZOr>t1uOxg|&",
        "gao": "#R#g)4)6)e*m+N+O/v0~3i7E:5;O;TA'B,GILrMHZ[_:m+ryu#xny]-#o-'_-,4-,5-5R-5v-93",
        "lang": "&7*n/dC(F{IXJ.JHPOQlZEg%lzl~m.rLu&xzz^{]-)h",
        "weng": "#q:b;}=rJ0L(Qstg-56-7,-9_",
        "tao": ")?58617A7N9W9kG|PoUhX{Yn[{^MdwhXjPjenzs+|r-!k-!t-#@-#l-#|-&w-'d-'y-)P-)x-9/",
        "nao": "%z&q'*?a@&@ZAkP6R~YZ]Ju|x@zJ{O-.'",
        "zang": ";S?_AmAyB$I,K@M#abambLbUb}rC-)A-++-,.",
        "suan": "(z.b/m0;1BI^nn",
        "nian": "':*5*P1Y3*C/K6evf5f[h=iCiS-/4-0;-1x-2K-4%-8B",
        "shuai": "7>:4RNTH",
        "mang": "!5!6&<&D.ZCvEXEiG4G5M_OvRaSAlDp.rsx:-)g",
        "rou": "*!2w3X>3?l@aHdQC]tekhEt$-#2-#f-*7-0R-4t",
        "cen": "+W.m1A",
        "shuang": "(V7;CPuh}z~b-*M-*y-+^-5c-6A-7B",
        "po": "%g%i/70I3'7i<,IlK,jLn%n[o1oKotq9uswMwz|=-$K-%a-)7-,N-.E",
        "a": "@@s@x}|:",
        "tun": "AYAeC~OlVL`G`IgJ~Z-&h-(0-.j-1q-8J",
        "hang": ".k/T5*9HBiDHOAT#UAa9j3lJ-$C-%]-.i",
        "shun": "!x$&$1$9BZKo-$:-%S-,g",
        "ne": "!vY6^]",
        "chuo": "'j0^6?8&9bd!e'e<h6iIirisk:narfu;w!-'B-:&-:G",
        "wai": ".O-%:",
        "guo": "$Y1K3R68=W=c@6@LA.GJK9N]Q&Q1RVUwV!h7j'kTm=pZszvVxm-'?-(K-(a",
        "qiang": "%.157p82;G;R;Z;a;g;w@HCEJjKBLDMvPhVd[ndGeuf.tkuPurx~yAyw-50",
        "pen": "<XHm",
        "pin": "$V%A(8+w=^LcMaSLa;be-%I-%k-&#-(s-*q",
        "ha": "4_NyP'QOqdxQ",
        "o": "/}",
        "huan": "#.#x4!565b6l8;:(:I;b><EoH#H,I_M<^>`Q`b`va/hpj9k3l/lsn9tCvSyJy{{:{r}i}{-*|-,|-/n-0A-0K-2>-3?-4+-7<",
        "ken": "&#>8>Y>fUFV$`S`wsh-:?-:E",
        "chuai": "A0ACeb",
        "pa": "/b<zBdDrI)Trd7wr",
        "se": "+b+r,#3688CULD]Ehnr4tauuxVz[{5~2-&I",
        "re": "Dn",
        "sun": ".f/L0T1rF<J%L$LNt|}]-&f-&p-5A",
        "hei": "-8D-8E",
        "de": "OMsoy(",
        "kuo": "*Y*_/GH[H]O~r#rFxMz|{k~o-#.-#H-#e-$V-,V-,}",
        "ceng": ".Lf:-*f",
        "ca": "(E(Ykq",
        "zeng": "$~'p.L5z7H7z9n:E;9]DbAc>m|roxk-.6-1K",
        "nin": "?[",
        "kun": "#7&H);*s+*5oGEPpUEUJUgV.`wo%sCy*z]zj{Y-)w-,<-,=-,D-0/-2G-4^-5'-6w",
        "qun": "0<;_;`UVU^e.k&-7U",
        "ri": "TMp/p;pd-)%-+(",
        "lve": "+4rgrlxr",
        "zhui": "&U((.h66729r:'@C@|[!b>c6j_o#s>sQvdy1})}Y-)s-+J-4Z",
        "sao": "$O7m8<:A:HAdR4-&<-*#-*I-+Q-,:-0l-1R-2a",
        "en": "J!",
        "zou": "0&6GG=[)_CcNcOlem@mcn.|h-*H-+1-/w-06-2E-83-:.-:7-:n",
        "nv": "2h=TSvSxp8wW",
        "nuan": "-'M",
        "shuo": "$m&+'$0cIvZaZc_>qttmv~x*",
        "niu": "4H9.FxpTwq-!`",
        "rao": "+i8)9FF,KdVvk}}B-'v-(>",
        "niang": "nuoRoZ",
        "shui": "#I)7*q*z@1U[ZaZcZg_>_KzG",
        "nve": "&ONJ",
        "niao": "@%E>K1T^UGVO-2{-6H",
        "kuan": ",s,tAqw(-,&-,2",
        "cuan": ",',Q,s,t,z1)1[fLfsrZw;yv",
        "te": "?vRgr{xe",
        "zen": "]V_y",
        "zei": "S;a_bv-0M-1Q-2+",
        "zhua": "2(AU-,Y",
        "shuan": "5<@]z3{?",
        "zhuai": "#1dmi'",
        "nou": ";v=,tfv;",
        "shai": "/Z121J1e2[[K",
        "sen": "Ve",
        "run": "$1AOz@zQ{F",
        "ei": "ZH_@",
        "gei": "5C9J",
        "miu": "7n:@]+_w",
        "neng": "?LR'",
        "fiao": "WL",
        "shei": "Zg",
        "zhei": "j:",
        "nun": "-84"
    },
    "m": {
        "yi": "-:~-:<-:;-:4-:3-:#-:!-9~-9T-92-8u-8R-8N-8I-8+-8(-7O-7M-74-6l-6c-6L-5z-5)-40-2U-2Q-2>-11-0o-/_-..-,o-,B-,3-+q-+[-+<-)X-(o-(5-'w-'k-'=-'#-&6-$'-!?~=}E}1|x{Zz|zzxix6x.x%wKw,v%uPs_rurorEr8r)pppdpXojoioVnxn<mLm=l1j{jvjkj/j(i^i]i6h6gYg0g)g&g%fbf2f1f0f/etepd~dpd;c~c`c@bhbbbTaE_T_>_,^g]|]{]`]/[!Z=Y5XVVTTgT_T7T1SxSsR~RyR;QwQ0Q!PDP6NbN^N,MZMSLXLIL6L$J9I}IUIIHMG?EaEHE4D!CwCFBkBTBEB9B5@2?Y?K?I>K>H>'=a=R;m:~:48c8!7,5g4q3&2}2Y1j1f1`1M1/1'0t.O.K,_,,*x*f(c'G&.&&%b%Y%G%$$b$6$/#x#T!9",
        "ding": "-:}-8q-)?-%!vipfkGiydzY2Ik6u+B&^&[%_",
        "zheng": "-:}-9O-7L-0#{1{,yjuvsRm*lNlIi;eheZe8e4e3d/`x_v]3[+ZSY8Y2XlVFTYT#Q1C@A!4W3w07.),]%*#C",
        "kao": "-:|n{k][#TbL>>R3p/,",
        "qiao": "-:|-:(-6A-5v-4=-3(-2[-.@-,2-$H-$5-!q-!=y/y$xkx4rSm+m!k]k%j:iSi(hqbvaT_wVuV6V$T%KgGaF^FKFGEpDSBCBBB;8<2b1C1>.}#e",
        "yu": "-:|-:p-9^-9P-9J-9H-80-7t-75-6'-5g-5b-5H-4U-3F-2l-20-1F-+K-)O-)+-(J-%a-$p-$K-$9-!7}]}W}5{7zizNzEvyvwv9v3tytjtetcsqsos@rsq|pyp+p%oQn6m%l8kyklk8jfgvguf%eGdWbtb(aLaKa:`1_1^:]e]d]KZOZ!YmXiTDS`SUS7RpQyNvLAKsJKJJJ;IAH|HmHVDVD:D*D#D!CrC[CDC,B*@K=Q<><<<1;h;_:v9G908=7M7I7A535#2{2R1b1:1(0;/q.(.&,1+G+9+7)n)h)F))(+&*%!$M$D$=#V!A!0",
        "qi": "-:{-:r-9{-9E-9;-99-82-8$-5f-5(-3D-2{-1:-0G-.j-(Y-(A-(.-'v-'C-&%-%m-%I-%F-%E-%:-$D-#N-!Z-!B}$zvyHwbw;w1u~t[tFn;n3n$m~l^kkiBg/dpdTcKb<aBa&`3`2`'_b_)^K]OYRY@X?W1TgT1SkSjS1RxQ4PbO@N]MyMCL]LZKhKOJ~JcJ]J[J>J4GyGJE<E,CyCkCjC<AEABA6@a@7@$?+>W<Y<N;5;49h9*6f4x3D,m+N+8)a)](`'4&V&1%K!C",
        "shang": "-:z-:t-7k-3C-%S{p{*y:oAo@c8aA`@]}Q^G.BxBZ@P:h9>8l1T",
        "xia": "-:y-:s-9u-6I-5e-3w-+T-*+-(v-'m-%n-!!}({Mwtwpm/logkeB_3YST)P~M<Jm4X3z2i.L.,,}*C)1%V%J$8",
        "han": "-:x-8S-7J-3>-1A-/j-/i-*P-*J-(^-&C-&9-$k}[{Xtrrbp,n8lJl%dqbm_c_L]cZ(VLV%T]R_R^QRQQPOK9IJCH@l@^@?=k=Z=?<l8k7X6'3I3@1Z01.g,t**&{!p",
        "wan": "-:w-:E-5=-/S-.f-+)-+&-&1{0z*x=wlwkv6tJt3ptpen%iGf_f?d[b.b,]1Z9Y|YmY=QOQDQ@Q,NVNNK1J%G9B2@h<m:X7}7<5:3]+&)t)Z%z!n!7",
        "mo": "-:w-:5-0z-.(-#S-!l~j~b}!yQy#v!r_rMr$qno}o?iji_hR_(^d[cVzVkVjUHTyR$O4M[FrFMC$C#B~?~?o?e8m640`.8,%#m!x",
        "zhang": "-:v-8k-8]-8L-3=-1byErnkDimiIh}hsfnfmfXey`Q]hYEPRNeFt<y<p8Z8Y,$(V$`#}#u",
        "san": "-:u-8d-7q-5p-3c-*Q-)m-)l-)k-)j-)ix:iHg#T5AeAdAZ7s/%",
        "ji": "-:r-:O-:<-9p-99-8x-8w-8'-8$-6t-4W-41-2w-1:-12-10-0*-/l-/^-/W-/#-.d-.^-.0-,9-*z-*`-*U-)d-)P-)0-)#-'6-&c-%s-%d-$V-#x-!{~z|~|f|.zxz?z(z'xlw;v^vJuZuLs$qAp=p;oJnfnEn(l$l#kRjsj0iBhYh!gEf=f<eseMdxdaczbAb*a!_K_)^k^F^C]@ZRYCXHW1V`VBV$UtU^TgT1RnRmRlP]P[PCOAO@O$N9N5K,JNI*HrHhGoGTFfF3ExEXEPE8E'D[BdB:@O@B>y>]=x<`;t;(9.9(857&6{6d5m3D/;.j+?(>(!&8%{%t%4$X$,#H#>#'!w",
        "bu": "-:q-7F-,M-*w-*t-(d-'K-&D{B{?{6zPtOm#izh'gfd,bi[rY}Y{YfQHM,C>C;C:'=",
        "fou": "-:q-(cvCBj4H",
        "mian": "-:o-42-1d-0w-,S-,H-$`tktQsZqpq#aDNWJ^E=D~@p?|;k;,7G/o",
        "gai": "-:n-9w-6e-+u-+t|'uYm@dy^AW%T`QYNaHZGNGM:M8|'{&6!,",
        "chou": "-:m-:l-8m-5_-4=-2A-(m~{t/r!iKhld$b3aS_%[_Y%W~N?N=LJJkI|E?B_0h/O.s.p&3&!%l#v!m",
        "zhuan": "-:k-7o-3G-3+-2y-.I-)n-%+~EzRyPreq<oXoRc0V28t5%)5(f'.",
        "qie": "-:j-7Q-/`-+P-*@-#uw1u{iCcpbkaia8`fZoOZL]I~>;<`,E%g#(",
        "ju": "-:j-:?-9m-7n-62-5`-5S-4x-4j-2l-19-0%-.Z-.:-,.-+n-)H-'d-$|{/ztx_uct_tNt$o{nvnqnOnMmqmil`jYj9j7g+e%d<d3d(an`}_E^j];[I[C[;Z^Z@YdY$XMUdUVR3M^M9KxJyI{IzIrHSHDF:EcDPDCC8AqAi?b?L?(>:<g<I;[:o7)4L3o3<30/4/..P.A*e)m%5",
        "pi": "-:i-8@-7|-7P-2Z-.R-.9-+>-(h-(c-%5-!.-!,~|~X}2|L{2xhvCs<rwnumblFk7hWcibx_U]G[q[eXcUgS+OXN3N2HPB&B%<@8>7*6e4n2x.Q.G,n)Q'(%k%h%@$p#R!U",
        "shi": "-:h-:g-9q-9l-9N-9M-8t-8_-7R-6k-6]-1X-0m-,^-,:-+_-+6-++-*>-);-()-'{-',-%.-#t-#7-!W-!>{>z|y{x<wQvqunu<r4pbpap[pVpMp*oun~ninhm;m7l0l/kQi{iuiQg!f}f|eCdodTc_c[aU^*[.ZyXYS6RXRUQ{QzQhMWLxLrLlL5HiH[H,ELBiAJ>n=}:{:s:W:5:'9v7C7?6n4=4%28.3.+.#,0)$&3$}",
        "qiu": "-:f-:^-8m-6#-)u-)9-&+~*|FyTsQl4j2j1cFc&]rWkO%KIHeF8BpAn@s@b?J=o;^:l:k:j2D/T.k+D*'([!P!(",
        "bing": "-:e-:W-8h-8b-6u-5B-4T-3Y-1;-0a-0[{mp1ngnZhbhah&cm[vY,W5R0QpN/MQLQLLJnJbGXE:@~4E)r%,",
        "ye": "-:d-9z-9.-9&-4e-2_-0U-)7-(u-'%-$W-#,-!]{:zIxqxdwgoVm$jxjw[hZzZ!YyY;X:X6UhUcUUUSURQUPxP@P?P,OmOkMYMXIQHsHpCXBh>i<o8q7w753l3M2N1H0M0,0)).(T'b$V!a",
        "cong": "-:c-8f-+r-)K}w}ptPq6eUeTeReJdZcnbUbIa3`^`.PTMxJ`HyG2FgF[D?<G9!8v8L8D8#5V3+1n0H)X(e(a",
        "dong": "-:b-6R-4n-3,-0`-0P-0>-,u-,G-,/-'I|/{)y&u^tXr*mSm>lKl?eNc3_H^LZhX<QrNILfJGA8A+>L<j:n4#18.0",
        "si": "-:a-9B-7T-7R-7N-6H-5f-5X-4,-3y-2+-1[-03-*#-)x-)5-'F-#m-!u-!M~)ugtdsJqDoaj.gUd%cHa2VMSDNOMeL{J~I/H!C'@X?O?8?*>^>J=,7[6?1</R",
        "cheng": "-:`-:%-:$-68-4_-2z-0K-0C-(@{H{A{,zYz#ywu*pSlth%eZb^al`(_v^t^U]A[zZFYPXDWQW,VRVQVFQJQ)N}MnLtJPJ@IyF=F<F9EeETA!?0>e=_=G<8:?7f7d6/05/f*6*2)c%x!'",
        "diu": "-:_-:[",
        "liang": "-:]-:Y-9)-5x-5[-5>-5%-1G-0B-&J-%y-%7-$Ly2bWY7Q*KJIwG%<e:_",
        "you": "-:Z-9#-7w-7=-7'-6X-4;-2*-0t-*p-)f-)c-):-'~-&u-&>~n}bvRuAq=pZo8o6m1lyh[hZh(d]d$c|cqbY`,^xXkTaS4OVM;LAKGK=H{GFD}DJ@8@(?V?>=g;C:b976B/j/i/O.b.D,?,>+Z+Q&g&d%O%!",
        "yan": "-:X-9d-5]-4]-4O-3;-1u-1Z-1Y-.a-.[-+:-*O-*F-*/-*$-){-)z-'%-&=-&2-%'-$N-$G-!L~~~a~Q~5{GzAydy7xLx@wMw>vPv>uFu@titfrgr?r9qwqfqWpKmhlEl'kuktk0jUjKjJjIjGg<g*f'f&c$a7_5^~^8]w]?Y3Y'XhXPT3R8QZQ.P`P/O}OrJsJ<IFIEI5FeF'E^E.D`D3C_BhBG@,?P>M<V<&;K;D:i:H9R8y8S5O5I56544k4j3u3X3J3B3?3!2~2U1t1E140Q/U,w,g,d*Q*()V'$!3",
        "sang": "-:V-$J-#}WgK{KzGV",
        "gun": "-:Ub6JY9W93",
        "jiu": "-:T-:8-:7-9|-9v-5A-2p-.H-+|-+e-+]-+A-*(-'U-$wvdo(gogdgc`IZ2XkXBXAW9TGRhO#NTM+LsKwFxD;BW@v@Q5$/b+:%X",
        "ge": "-:S-9Q-8R-7!-6|-59-.O-+l-)(-)$-(e-(D-'4-&Y-&?-#s-#`-#J}6yhfLaO^^^R^=]_ZkX*WHULTML4GsE!CW9l9`/T.f,C+k%Y!,",
        "ya": "-:R-9>-9<-9:-7m-5K-0W-.$-*H-*G-*A-*?-(s-(H-&n-&'-%;}L}@}9{j{5zbxTuBu3t%q2n,lVlUhKh?[`[ZZZY:XLN'KlIsIFA0A,<r9,8//g.^,[,E+/)}'b%h%J$x$K",
        "pan": "-:Q-0S-/B-)R|Ys3i1[O[AW]U=MMGu?t>}>k:c9s84684l0$/w&C&/&,!*",
        "zhong": "-:P-8A-83-7x-4Z-0j-/C-$Tz8ysx$vMvHs^o)i)eqe0dddYS`MKC2@=?G4w2k.T$F!>",
        "jie": "-:N-8i-8<-5$-4~-4W-4!-3j-2]-/@-/?-/)-,r-,a-*j-*i-(e-&c-%d-%H-$m-$8-#q~zzKz7vevOuit>sasVsCs(qSpIoJnpnln*m|lCkvkbjrjqjgjbhihIeEbr^S^;]_[,YZY+X{XwX?W_UmUOUJS9RINXNJL0KxKoI~I1HqHgHfH8EOB,>j>;:z9b882?/'.6+0)H)8&K&J%g%]%M%##D!~",
        "feng": "-:M-8:-5L-4N-2Y-0]-0&-0!-/{-/y-%p{Rz9z5w}w9v7odoYl}l|l5W4MkKPI.E[?m?h=S;Y;#:R8e5Z4i3V3*2g1h/1,O)u%C$B",
        "guan": "-:L-58-1=-0l-*vphb@b?af`LXqW*SRJ+G*D(B2>w<v<W8G5Q0E)W(4'e$_$0#Y",
        "kuang": "-:L-22-0V-,b-+V-+N-*v-&o}&xNwFm_dJcW^z^y]>RWQkP#L)?N>=0X.X.U",
        "chuan": "-:K-7o-3G-2t-.K-$]}Tz3jFjDPMIRIDCbA?@i,H+<)7",
        "chan": "-:J-91-2y-2R-1~-1/-/:-.k-.J-.*-*~-%$-$F-!n~P~@xBszr>q3l>kJkCkBjXh{hpgWdu^r^lXsX+W;VqVhU#S9RYJsJXDEB#=v:^967o7n71655d5B2V1I,#&v&u",
        "lin": "-:I-9U-2g-0e-00-0/-)v-(l-%PxDlbk,gIgHc=bob)_=_6[MVGS?Q+PGN!FIEmED<U7j7H5h3819+u)S(I'+%o$Z#M#K",
        "zhuo": "-:H-4t-.`-.<-+#-)X-%U-%T-!G}+y@v,tYeu[BZ,Y~V3UxU[StSHSESBSAS>Q>L#JuJfJ3J,IoGcDh@j=|=h<b<J7%6S5[4}4N3_3#1>.h)e)N",
        "zhu": "-:G-:B-9]-7d-7G-7?-6Z-.&-,t-,n-#T-!z~4|=xpx3qVq!ploNnWnIl*i>[[[WT&StS;OqO1O0O.N>M#LzLFGWFmF,DhDbD^D0BH?&>Q;b7t7Z6s5x5>4V4A3y2^2@1+0x0?,K*K%B$J",
        "ba": "-:F-8l-7`-1E-)^-)@-(b-&M-&I|_{[x>wCv0mumIj,fq]o]I]6]#[GZ)O+M'D,5?4R0+.m+@%N#/#!",
        "dan": "-:D-8~-7{-7H-2r-2J-/V-,,-+G-*~-*{-'f-&2-%C-%B-$v-$F-!m-!b~[vTsjiofTfOfEb$aga>_q_P]4[VXuV@V?UjRiM/BeBSA*@)>r<?7.1I.@+#'O''%f%:$H#`#N!F",
        "wei": "-:C-8{-7p-7e-7A-4s-4V-4Q-3~-2x-2$-*h-*b-*O-)O-'q-%q-%k-$s-$S-$@~.}o}m}S}7y1xJueu7u$snsUsHoqoQnxn_m9m2lHl7kskZk=jljTiniEi9gme=e:avaPaM`?_JYnYUXbX1VEV1S^PuO5L*JqIOINHkD@?g>c>C=n=$;S;N;0:N:08?837i6R6G5|4]4>4$2]2O2F1]0u02/$.r,[,P,I*~)h);'f&H%!$N#X#U",
        "jing": "-:A-9C-9+-9'-5r-5%-3A-2O-1N-0K-0C-/9-.~-,y-,k-,[|i|g|cyIvQt:t8t+pojAh|fdfZeeeWb/___NUoT+S&S%Q:Q3PIP0KZJpEvBsBn@I@H>m>%=><87]6#,r,'(^(B(<%($u",
        "li": "-:@-6_-5u-5k-5Z-3s-2&-1z-08-/Q-/=-.o-.G-.'-.%-,l-,&-*L-*I-*:-*.-*!-)|-)Z-)X-(z-(2-&U-&0-%g-$C~g~`~A~>|`yrxEu+tat#rjqYq,nAmkm5m.lzjag@b]bXbRbB`l^&]q]gWYU@U3TsTlSpP_P>P%O&NmN^MqMSLnLcLYLUK!JoJdJMG1ECDuDjD_D8D.C/C+?k?[?Z=Y=U=/:/8z7@6C6$5H0a0U/>/=/#.z,~,u*V*$)z(t(_'x'u'l'W%R%F$l#P#A!Y",
        "pie": "-:>rVV]V[PHAD8>",
        "fu": "-:=-9c-8[-8#-7z-73-5y-5m-5j-5U-46-3v-0d-/|-/J-.R-+h-(=-(6-'[-'S-&E-!s|<|!{]wvwWvVvRuru'tDt,sbr5qJq/pmp3oWmgmFi~ifi7hzh;fwfkeje?c{ct^w]l]J]&]%[Y[QZ+YfV7S}SLS)ORN+M]MGM)M'L1KWJ2IYIPHKA:>~>Y=W<w9c7T4S3d3/0.+2*t*!()&m&b&N&G&@#h!)",
        "nai": "-::-6v-4iw:vhv)qxq(g6WVV{M$AC;<%`",
        "wu": "-:9-:1-9D-97-8>-8%-6;-5|-4k-2k-2:-1q-.T-,|-,C-+y-+/-*V-(U-(T-(J-(?-(+-&)-%K-#v}4|^zLykxvvxv4u%tjthsurTownkn9n+lmkzk_j6hFgQfudbd`d@c'b[bZbKat_]^[]e]d]]Z4WGTTS7RoROQENvNtNoM&K#FLCVC=B3@[@Z@S?{>T>*=V;^:,874(3C322*1w/V/A+3*4*3(|(P')$h",
        "tuo": "-:6-8X-77-6h-6.-'a-'G-%[-%$|Sz;v8sNrRmck'gzet]i]`[H[F[EZMYuV1NgN^MTM8ITI+GbFBF0AvA_@d?`?_?^<k.K",
        "zhe": "-:6-9[-*K-&L-%9-$o-#T~h{Er^bp`6]H]'W_ViQGQFNgM=JWFwC%=m<E",
        "ma": "-:5-9Q-3o-(r-&!-$%-#4-#3vUs1rWqNhR[cVzNQH2:2/&.c,4+5(x$[$Z",
        "me": "-:5~t~j~UhR6I",
        "yao": "-:5-:,-8;-6D-5@-4?-3_-2q-+m-)&-'7-$b-$2{}zBwUvGu_svs=pro3o,n/m,l,k#j~h^e;e.cqcRa%[oX2WrW@VdV$PkP'NGN#LuI;HBH9G5C!BA:B9J444&1|0f0(.E,;+r*D(~(l%S$%!t",
        "zhi": "-:2-9Y-6f-5^-5C-4|-4d-44-3y-2,-/}-/0-.U-.+-,v-*e-*>-)C-(W-'v-'8|||{|T|:z~z{yFy@x$v%uNtsrGp&m7l0j+iridiahyh5h3ggf5eYeKe4e3dmdUcU`6`*_$^{^E]Y]F]E[u[HZtZpZ]Y{XvWpWVW2V{VvVtUKUJU>TjSMRwRgQ`Q/NOMyMcM2LqLhL6K~K7JjIuI]I*H+GHF_D|DnCAC6BiAJ@t@O@N?v?T?3>V>3<L<!9e9S9B8}8@7~6>4`1_/9,x,^(R'w'[&3%c%;%7${$z$k$E",
        "zha": "-:0-48-.N-.=-*C-(w-'X-'?-&K-$j-$O-$Aw/pNd6]s[m[XZdX4WIW#O2M7M1M0LvLlI?H4Fv;X:67u5#4@2N/p&d%.!M!H",
        "hu": "-:/-:'-9j-9F-5E-0Z-+U-+L-'h-'W-%n-%Z-$_-$4-$1-#>-#2~k}v|;x1x0x,uGt4sEr]r[oxm[iphxfxfgdFd*d)cGa{^V^6^4^3^/^.^,^']y]9[xWWW$SXRFR<OjN(L8I%I$GEGCCR@9@&?f?7=t<.<+;$9E99986Y5s483S2;1a.J,S)b)+']'['I",
        "fa": "-:.-8!-6y-3Z-0R-)]|A{vy)uwm4fKL@FO?X?:=z5R*[)L%8#.#+",
        "le": "-:,-9R-8r-,J-)2-#1d}]qH`G5@z??/b+A",
        "yue": "-:,-1g-1e-1`-/P-&j-&@-%A-!DvAqrn1m^jec,bubS^]]g]8Y_U@OpOoOWN8LcH`G5FTDj?'5e0J+*",
        "lao": "-:,-6~-3!-,j-,i-,>-'$-&N-%z-#p-!}uSr`ljk/cY_f_eYtVZO:L=G5F!=O='8%7a3{/^./*<$f#c",
        "yin": "-:+-7}-6^-0t-0;-*c-(j-(V-%o-$d-!T-!+~l~+~$}`}$|&{w{YzXz:w_u=t0t&p:n}lnlLl<jdg^g>fya@`i`B_u_t_0SMO[L:KKEkE@E1DKCwC_BYBGA5>l>d>U<5;~:}:i9}9V6^6]4).],|,j*I(U$7#k#_#:",
        "ping": "-:*-5i-0]-/z-/s-'u|Qz1u/ngnZmTi[iJi4heh&`0_zMfEU?6>6=A<D3)*v'F';&_",
        "pang": "-:)-*B-#ww}r|o2h9h*ere<S2@<?y9p4i",
        "guai": "-:&-)_wVcuc>[KMbLw",
        "sheng": "-:%-:$-4H-.X-.Q-,?-+0-(9}=x{x7u*k}_VS[RGQJQIOeMuIyG~E{BzBF?%;k;@:q7G2u/M.N*h)i&y&s&`!'",
        "hao": "-:!-65-3k-2)-)6-'j-&_-#k-!t-!Y-!#~xxRvacOblRDR'QBPePaPWP7J!A~Ao=]<Q9j9U7S6c5N5@,/,)+}!y!q!h!f!c!_",
        "mie": "-9}-),-':-&Hq7hk^uWeDr9m64504!",
        "nie": "-9}-%*-#e-!O~m~D~5~2}#q'q&mFkTjujLivZ&YVY5X[WCVsT|T<MVG@DW=@:Z%+",
        "xi": "-9y-6&-5l-3i-3#-1B-0,-+?-+*-*n-*R-(P-'x-'>-'6-&/-%]-$X-$:-!p-![~T~8y?xWwnw'tgs;rCr@nsncn`nRnHkgk9jpj`jZiqiOeceOe9djd_dEcscgcZcKc/bqbeb8ay`r`p_s_r^V^6^4^3]_]O]HW%R:QKQ9Q6PEOzNON)MdLZKSIdIGG{GUFkFRE|EjCzCuCmCMCJA4@e>X>S=f<[;i:+9h9)8p8/8,7N3e3R3K343&2Y2+2)2%1q1P1O1N0}0P/E/?/*.{.t.#+p*r)|(#'h$1!k",
        "xiang": "-9x-9,-9(-6}-3*-1}-,4-,$-*0-(x-&r-%L~Ww~uXk5j)h7gqe'abQXP5LWH^F1DH;!8:*E'g'T",
        "shu": "-9s-61-5g-55-54-1|-1F-)Y-'3yNyGu[tGq4oNoCnWnIg}gxdWchcgcIbt^X].Z.Z#Y>WBU9T'S|PvPtP*OhO1O0O.N[NBMtL`JtFuFYEpBuBKAaA`?c<O8[8H7m7Z6m5q3Q1k)f(i('%h%e%d#O",
        "dou": "-9r-61-1T-1P-(~-(N-&&-%|])S]SPN&J}EwAm=d;n6<.$$v",
        "nang": "-9o-1s~d~;~1_QWwU{TkOwD+<n5b5;",
        "jia": "-9n-8<-7Q-6w-4X-3X-2]-,}-)S-&?-&4-#F|}{MwIwDsrs,pvpImei,e[eBd^cA^J^G]L[d[Z[,ZWZ8UhSYSVM`M_K/ILHNH:G^ENAz?H>&=L/3,E,B*n*d&f%0$8",
        "mao": "-9k-1,-1(-0|-0z-*dzLwksLmOkzi?a=_?^(S/QvPrN4M@I'B!AcAW?9;F/Y/#,J)E#$",
        "mai": "-9i-7I-,{-,*-*}-#${Kx5",
        "luan": "-9h-9Y-9V-*^}C}Bvmu0qXq:q$m)jOZ[TvOuL2D69K5J59#4#3",
        "ru": "-9f-6K-2C-1K-(N-#{-!$vkv[s7qyq)jciX]kZgUTP+NzL(E0@W>7;Q9u6b+^",
        "xue": "-9e-.x-(Q-!9|Bxbq>q+mmmMjzf=ckT/SlKvFc?!>u9j7>5y1&.B%L%<",
        "sha": "-9b-4c-3?-2H-/,-.t-*+-%t-%^-%H-%4-$R-$0iCgkZEZDW<N{NrK`H?FlCaC3BDAl?w6{2P,v$g",
        "na": "-9a-1*-*|-(R-(8-&T-#_v=tx]0[LZxZgYWWL",
        "qian": "-9`-9Z-9W-8T-8B-7l-7(-5q-4w-4^-3g-31-2<-/r-/[-.u-+4-)}-&4-#u}/}.zaySy4xZvgt7seqtq`q5n'n!k{kVdObgbLaN`f`<]Z]N[J[1ZCYLY=Y!X7WSVgVbVUU,U+U)O_NwJ_IbH3GiGPF%E7DzD'C~CeCZC7@]@M>$<%81806O5S4B2Z/J/B/2+%!l",
        "suo": "-9_-9=-3]-&8-%x-$&-#j-#gu&s(as^$ZEZDW:PjKaJz:E9y+|)w)v)!(]",
        "gan": "-9Z-8S-7J-5&-0=-/u-'c|Ro'o%o#o!hfh_dqa5U~T]T6R_NuMDKLH6FNEd@??;<:8f7_7/55+;*w'#%?!T",
        "gui": "-9X-6q-3{-/(-/&-.7-.5-+Q-+J-+I-+F-*%}3{zv2u;s?rhrIp|k$jpj`iLhLh,gmf;cMVxVVTiThRCQ2O%M9L.KeIeI`GTGAG<G;FWEQE)DXDQC*@v;;:H4t,Q*A(r(D'q#X#0!|",
        "jue": "-9S-50-3f-0X-/R-.?-+@-*,-)X-(Q-!a-!R-!9~I{PxbvAqRqQnLnJlPl@k$j}fmf>_k_Z^b]7Z`Y~Y9V^V;TnSgKTF7F6D[CvAG@:?!5P2|1d1>0S0G000/+z+M+)+'*](n(G%L$3",
        "liao": "-9R-2|-!rrLovomo<o5o4nKkLk+k*g]gG`/_^W9VaV9S{SZPLO~FxFA8Q8%4f1;0V0R+q(H%[#g",
        "er": "-9L-6v-6T-1r-1a-1_-/1-'B-%hoHoGoFmAg$f~NiLCLBK6FaAt>[>90%*F",
        "chu": "-9K-5N-3d-3R-2K-2!-0$-/m-/Y-/I-,t-*)-!o{$x!s>n5hjgXcj`g_SWxW$VoTNS=NEIjI&HoHQF|E}EsESE#DsDdCzCG?@9r9q6x4N/+*+(,&;",
        "kui": "-9I-3{-/4-+I-+F-$U-$;-!xwow4s/rBo*mQjVjHb]a.a,_y^BXgQdPyI2I0E&BV:S7x2l.q!/",
        "yun": "-9G-7r-3q-1p-+}-+x-(0-&^-$^}xwEvsvEqOb}aca4a)`c]2[yRNQTP}MwHWF@BmBaA&A%@0=3=!:!7W2h2:202(2$1b.Y+(&P",
        "sui": "-9A-5#-&F-#U{3wytvr1nwn4kpRqEWC1C0Ab=H9[7+6z5}2C1g0~(/'p",
        "gen": "-9@-9?-&pX=X'L7",
        "xie": "-9=-9!-7[-4J-4A-4/-39-1{-0s-0c-,w-,+-+'-+!-*k-*Z-)7-$(-!C~e{ry_wrw8w1u)sOq]opnenVnNm$jrgJeFcT`z`p_BZ~ZWZ8X9WnWMV*UiUFT}SWRePXMZLIK@JwI,HOH?H/FlC]?K>p>A;P9h7B695{5!4Q4P3b3E2,0w0s0O,C+k+e)8",
        "zhai": "-9;-6B-4f-4*-3E-*K-*C-&c~zw{p{os[u[2YxW/UwU>SiSfH#EL#t",
        "tou": "-98-4'-4&{$wNv'sqs@aK]*T0SQ",
        "wang": "-97-8v-87-1JvYo7o1o0o/eoeiefe[dldJa}]>RTQ(OEODO=N1JD@J6;+E",
        "kang": "-96-8)-+X}|rmkKg|dG`8]f](G=8_4d.a",
        "da": "-95-.N-+f-'f-'R-&m-#~-!J{hxrw[v*d'ag_q]nWZVJ@f?}:<4Y0p&@&4$#",
        "jiao": "-94-6n-6D-2q-2j-2I-.B-.6-,6-)B-(<-$H-#M-#K-#?-#(-!^-!=~IuUu1r=r6qcm+m(k1k%k!e.e+cJbl_~_i_KZjZTZ5X&W9VlVCV(ToTJT?T,SwSuSgSSQbPgP2LOIpG!>!:l:k9Y8w8<7b5[5C443,2b1>1*.9+l*X(5#e!v!^!V",
        "hai": "-93-'V-'0-$#-#h~ey]vOq;pL[!A3=N3[,C",
        "heng": "-90-&B-%QuJcXcLbaVKL/FiF&<|42*B",
        "peng": "-90-5,-3J-.F-+o-!~zgyqyYfUe|cyc+`%[tZ?Z6YkXpWvW4OTKCJLIlIWGGFn?6<R<D8e8]7Y3Z1h$a!u",
        "mu": "-9/-8H-/~-,=|Ey9usuSu%m<i&i!`[`Z[TPVPUO7O'I(FrFqB1AwApAX@#4h/a/_/X/L.S&U&Q&E&:&9&(",
        "ting": "-9*-68-60-4C-*M-*7-(]}>t}sxk~hVhJh)gBg?g;dzZ<K]KHH~H(@u=6;]6u453`3^*.&^&[",
        "qin": "-9%-64-1^-,8-(g-(f-&#-#f-!Q|w{Fshs.p.p(o~oyogkmkVk2k)hOgbdO`C_G_F]N]5YlX,X$V/UlS@R=J|E`Cg@3:$7'6(*J)R)M#l",
        "qing": "-9%-4b-3<-2(-0A-.b-,O-*S-%1}V{1wfp7hQgwgeb4`9YLUpUoQ5PsJ'G/EME/DcBnBFA7A.A(<';w;B916X&x",
        "bo": "-9$-8Q-7`-73-6,-2v-2f-.e-.]-,Y-*y-*w-&M-%#-!h~oxbq*k3ibeu`s^|[3ZJWyV=V5UgUfMFM'KYHKEVEUDFBj?E?,=e;};W:L2//l.?,9*q'`'^#2#1!Y!8",
        "lian": "-8}-34-.;-+E-+D-#V-!XzUwAvusMrKr/iegjd&cS`F_{^fW.T=SrJhI#GiGSE7DfCHBlBP=%;6:C8j8A777$6p5p5l4<2f1y0z)x)3(X",
        "duo": "-8|-8X-02-/2-/$-.c-.V-'`-&y-&e-$O~}~S{|{{z}z]xzxywiwhwHvtvlsNo+lOh1ae_oZrZqYJTET>T8T.O)O(NfN^MrMTMSM&KuIRAh?`?^&D$i",
        "men": "-8{-8G-53d8bcbCaz_9_&]VYgS^PZIh@>3=1,+((W",
        "ren": "-8z-8y-8s-8U-8F-88-/d-/cx;vSu`n:n2d|dwdv]XO,NiLPLMK6J7/]",
        "shen": "-8t-7V-6i-6/-5d-1Q-)l-)k-)j-)i-(V-'i-&}z^u|u>ttsys.qmp_pHorn7lui(fp`t`b]b]4WPTFR4P9P3M:J7J(IHHRA9@+=D<0</;f;e9?671?*g&~&w&q&e$G#{",
        "ze": "-8p-6B-4*-/M-.{-'X-%d-%2-%.-#9rcl:iAi#hU[~[2Z$UwRKR7G)C.@q?n?A>n:(9U7C5[!e",
        "jin": "-8o-8j-8d-7}-6<-35-2^-2=-01-,y-,k-,[-*X-*'-%o-!F~y{Fzkz6y<xPvFt7rfr9q~p(nyj'j!gbb+`CWfSOQaQ_N7HEG8CTB[>E=q=M:I9$6~6g3h2M0i*Y)y)K(z(d(@(*",
        "pu": "-8n-3$-+k-!S}^}O}<{BzPy(]p[rY{V0UvTeTdQ;PiPPP&O*M,FZE_AS=`:17k6T614r3a+v(C$m",
        "reng": "-8g]m",
        "zong": "-8f-5:-4y-43-3KzFpikxkrkNeJcdaraVY^XXX(W&Q|O>MxJQIKG28L8D8#3+1n1c0{,b,R%E#w",
        "fo": "-8e-8;-73|IJl",
        "lun": "-8c-7i-6S-4u}l}Y{.t*lSlRb9[{YMJa?j<6:3",
        "cang": "-8a-89-7h-5;-3e-07-+OkeD<?i9n6J,**{(p",
        "zi": "-8`-4m-17-.h-)%-(W-'t-'r-';-%@-#r-#cupuoudu9qTqNqMqHq1q.l;k[c;NnLKK8InH=Ez?s>W<];o:Y9g9_8a7;/G+J(!&Y&7",
        "zai": "-8`-3V-2G-1!-&v}8pOl.]j]>L3>f;>:.4|4{3~&Y&7",
        "ta": "-8^-6E-3^-#~-!&~Kz$yyy6vep}lc[HZXW`V&HCG}EqA[?}<c:<9w8^7(6w/`.3+d+V",
        "xian": "-8Z-8Y-7b-7,-30-2m-2d-2b-1i-0O-)o-'c-'E-'*-&O-&2-%6-#u-#:{`{!ycxXv`v&uKu>u.t`tZs~r~rOrNr9q`pUo;o:nBmylxlhjthhgCfhf+dI_a_X_R_'ZPYQXsWnWiVhVXVSU6U'QlQNPKNFMhGiFFEtDRC~ArA@>S=E=7:]:C7Q6*574*0l.=,s,G+f+c+U+O*|*s*T*,'3$c#b#Z",
        "cha": "-8X-6Q-4D-/,-.t-)e-$A-$$~s{yvbu?o|m}kqj3]a]OZ7Z.XZX5WJW1NsM0LvK?I?GjEB@k,<%s",
        "hong": "-8W-)w-).-(X-(K-(;-&{-%}-$)~i{kvXu6pqpjn=j[fvfBa*``XeVNQ[@E?y?<>@=b=S;J;B:R8J7U5(3|31+>+4'T",
        "tong": "-8V-7/-6R-4Z-2h-,/-(}-&|-#Z}o|/mNm>m3h:f(c%`P`)Z1Q]P<O<K|KUG+F+AV=P7l4C4#18.~.0+s%%$s",
        "dai": "-8P-6G-3W-)g-(B-(4|3{(w[m`ikiViMiFg[edd!_/^1PAMJJCC)ByB+5c,2*y)?'!",
        "ling": "-8O-7X-0?-/D-)G-(#}h|>wwuqtKqdmdmVlQjhekY<R)OQMRJeJ5DND)?/<77=5'4O0v0=.I*z){'H!z",
        "chao": "-8M-8D-.B-.6-,6-(S-!yjQj?j>ffd9]<VlQiOBGFG!C{9+7z4g303#22/v",
        "chang": "-8L-8J-7j-5D-5+-5!-3|-2~-26-1b-*P-)~-%i-#8~v}%z=yZtWrdo=iDgReLd>bDaxT:RBQtPcIiAT<T<P2t,`+6)^)4(h'B&z&R%w",
        "sa": "-8K-+2W<VPU:Dw?'>X7s5L",
        "fan": "-8E-0)-0(-0'-,1-+R-)a-!hy%v_tDr;r:iwhwdi_h]l[ARvRtNpMLKXJrJAG,FD@w@g?4955t5_3n2E15.l.[(A&O&/&,!.",
        "miao": "-8D-,m-)v-$?vDscrPh>gtgSX^NP<#;A+K",
        "yang": "-8C-7<-6{-3[-15-,f-,@-*g-'Z|J{xwTukswmrl6l3e`d4cEaA`m^}]T[lXRU<T*RVR2PmNRMHL9I7HvG`FpB|A=A2A'>z>`8N6A4y4D4.2B+6*O)4%Q$|$@#F",
        "ang": "-8C-*gn.RLQoN0!5",
        "wo": "-8?-4s-4L-*l-(/-'&-%q-$atCtBsfi8^TZYYbYSXKV#SRN8I>@1=#<m<h;V;U7!6`3.,N'|",
        "jian": "-8=-6J-5W-5P-4g-4:-3g-2s-2i-2L-14-0L-0<-.q-._-.W-.P-.4-.3-./-.,~6~'|bzmzaz2xovfuRuQp4oDiHhcg8fNfHeDaq^Z^Q^<^9[8Z>YqXmXjX7WmV!UGU'R{PpO_MoM(LEK3JgIfIJICI)HEG]FhFCEKE2DLC&BMBLA]>a>$<z;l;a;&;%:Q8T7P6H625k5f5a2a1l1Q/u/Q/2,g+%*W)<)6!2",
        "fen": "-86-3}-2n-/a-(`|v|q|]xuw7vpv;n&ithog,dDa0_gR>OYOSN.K&J*J)F)A>@66}5i4v391=16+{+.",
        "bin": "-86-3S-2EpAe}W?UNShJnImGXE:B^BO@r9I6q6Q6M6,+.(j((",
        "di": "-85-7@-5a-4F-3:-*D-'}-&t-&$-%R-%&-#O-!(}0|h|d|@{Q{L{8zMyFy;x|w?tqsmrimUkIjoi`hBg:fofjeld#`7]g[g[=YFX]XGW2TLT!R[NfN(MrM3KAK:JCHiG7AI=g<};T9f9=3F/K.V+=*5'1%c##",
        "fang": "-84-4}-+^|r{Qzcv5er^%TZS:S(RER6N/@<<M/Z'P",
        "pei": "-81-7$-5o-'lzyvZvCuCtOs_k7iid7[eU5S5S,M'LyJUAj?u=F<@.`*=)d",
        "diao": "-8/-0@-/f-/G-)1-)!w$njfzfYe~]gYHI|@m)U#p!?",
        "dun": "-8.-(a-!2}}|sy!x~x}hNdPb2_mVYV.T2HnF>@'8*4c1@/!+m",
        "wen": "-8,-/X-(M-(C-(&-%Jy`vNf)dfde]:X.WRSmQsKNHWH)C$B`@>;z;R:*4s+1*8(}(&$;$.",
        "xin": "-8*-7f-5d-5G-!3-!0~%v<r,qFgTe$e#dHawa>SCR9N@N%D$C^4a3$",
        "ai": "-8&-2W-09-)h-'!-&q-&5-%Y-$'-#]-#E-!;{SzIyfxUtgtUrxr'kaa9_7_,ZNYaT&T$QqP^P.CxClB.:%9t6U3.03(k(;#]!s!j!]",
        "xiu": "-7~-5c-5V-''-$/~|p@mfmPh2N~G09~9F8I4+*P*#(N",
        "xu": "-7~-7Y-6Y-6!-49-0x-,F-,E-*Y-)T-)+-'p-$e-$Q-#7-!o-!W}7{Wy,x+v&uxspsArFhHeXckcKc:b(`g^YY4XMTKT@RbRZR!QcP{O^OOLGI9GfC|CtCiCOCKBw@5@4>?=t<>;+;):P9r998W8B433W2H0m+t*N*?&;%T",
        "tang": "-7y-5+-4M-3l-3U-1v-.2-&.-${-#.|XzpyukdilaA^cW^V~OsJFH%F{F<@P<T:h:G8n5D3i23100A(u",
        "huo": "-7v-6r-5T-.Y-.1-(p-'W-'D-$e-!%~V~Fw^vouWf.f,b'^OZ/Y4UPU4RkO|E9@%>/:f8U6y6Y6+525127+_#@",
        "hui": "-7u-7#-2u-1{-+H-+.-'/-&j-$[-#=-!f-!U-!D~p~,~&}u}Fz]xztEsgr7q]onn?n>i*gmg7g5f6f4f3e,e*cDcCc<c(bfau`H_x^sZ|ZQX>VEQSQCP|PQO]KeIOI3GRF4EiEZEQDqBVB>B=B7@n?D>h>g=y;+:S9X897x796y6:5,5)3t3q3k2h0y0q+h*9)G(=(2$~$)",
        "kuai": "-7u-6@-2M-/p-&f-!8}:|ez&y'jEgMdXUkRrO]Cq=y79.*+g(2",
        "cui": "-7s-5?-3N-04-%I-%>y8lYlWkhdSbE`TV|IxH*GHAg<48P6a331g)p(b%I$L!d",
        "che": "-7n-5`-4I-,%-'y-&*|?vln|nGene/]QY.XcVsV>V<7`3r3b3E0C",
        "chen": "-7h-4_-3e-2'-#|~ZyWyAw]pGoBdRa>[aY]THS~QAP$L[K_K'J(HUG3D]@+@*2n05)l%P$?$$",
        "xun": "-7g-6O-4.-,Q-,A-,)-,(-+5-'3-!k-!P~u|y{=yixYxAw#uHqKq9o`oOmEj@j&j#g=ebe>c]`uXUTfRcP(NqL_KbF`BvB@Au@Y>5=r=l8+7y6V583O2h1{1D130j0Y0Q.5+b*H(L&T",
        "chi": "-7c-7M-6b-6P-5E-3@-,W-,K-+_-*]-)<-)3-))-(:-&W-$z-$I-#l-!g-!=|@|)yLw/vBs6n|fsf$eweve6cBc9`X`7_|_2]`[f[!ZvZ/W+TxTCSNNcMPM3G1ChC6C4BX@T?Y;:8g4~4;3U1K.O'A$Y$U$E$2#G",
        "xuan": "-7b-2N-/.-)o-)'-'(-$Y-$Mz)wsv&sWrqr.p]f[cobMaQaI_I^nX_SyS'RAR,QeQ$Q#PNK@HxHwEf?#;I8d4M3x2e+L*s*)*&)B(Z'~%/#E#<",
        "nu": "-7a-3r-,svjq?ilfed1Wo",
        "bai": "-7`-6z-(1-&:hJ[?[>ZwYeX}WAUfUCTAMFLN,n'D#*#)",
        "gu": "-7_-3T-2e-0F-)I-'s-'N-&<-&;-%G-#y-#@}gzfx#uhrUq@o&lXl=j5j4d*`~]_]9TSNaM.K<JIHFGzF$D{B<@K?R?=<X6P6./P/@$Q!L!G",
        "ni": "-7^-7]-7.-4v-2>-27-+8-(%|Nzsznv/v)t<rkqkq0nznbnEcvb5`{_,]0[i[<Y5UQS$QuQ7PSMPJ&E6@y?)<=9x6o.F,l%b",
        "ban": "-7Z-.!-+,|z|Yutn0d2]R]M[OW]W[T[ScSbRJOSN;MM:c/x*>'Y'R$*#[",
        "zhou": "-7W-6M-2X-0{-'|-'z-'Q-'5-%X-$i-!G~{v.t/pgjCiceIY%QnQLQ<I|>8<S494'*S'9%W!R!I",
        "qu": "-7U-7E-7+-/H-,q-+S-+=-+7-)t-)s-)W-'e|Vt^nnm{m]k?e%`&^0[^SzSIOnOOD=D4CzAL>)<3;[5U3G2o0D(K(8#9",
        "ci": "-7T-7B-6m-47-17-/+-/'-'t-'r-%@|*q}j3h<`hN|MILHD&C??56Z*p*k'E'6%=!{",
        "beng": "-7S-#w-#+{R{#zgyXw!lBkYX0>v)d)[',&k&j$a",
        "ga": "-7Q-'M-#A-#/-!4wIwDoEo>o.RaOM+C",
        "dian": "-7K-7:-3m-18-**~M|P{lyBxfw6v~t6t!kXj]jNjMh@ao^!YOTrTWT9I_GqG_FPF5B?<a9k764?*u)s&c&`%1$W$$#L#=#6",
        "tian": "-7K-56-1>-(7-%`ylybwYvit=nodgc2b:Y#WPQ?LSB{?U<A<$;2)g(q(.&}&|&h&`&L&F$W",
        "bi": "-7D-78-73-5F-45-+c-(h-']-&k-%?-#Y|jzVxgwLvnv:u}twt1r3qonrlFi|huhthPgLg'fRfQfJeme!crciaJaF[YT;SqS+OXO!MUM!K;I<HPB)B(B'B$A|Af?x?C:u9Z9D7q6e2`1p.%+y+x*`(:&W&V&G&5%^%H$T$S#'!o",
        "zhao": "-7C-1k-)A-%X-%T-!y|#v+j*]B[@S!Q}P8OBM{J,E*?S6S4T2G0r0:09.7(m!F",
        "shao": "-7C-,p-+~-*a-)A-&Vu,oIf^Z'R|NhM?K(7v3m2s17*m",
        "zuo": "-7>-72-66-4E-'L-&,-#!|lmtmsj;h0d6YTV4R%M7M&)e",
        "ti": "-7;-5N-5'-4R-/!-.n-*;-%H-$y-$3~w~rw?smsPnmnYnVl2foeCe6bnbjb#b!aU^)ZHY*X]XGU>OaONL$JxJCCQB]=0;T8O*5)A'r",
        "zhan": "-7:-4>-2y-*s-!IrQnamRl>l)kCkBk.j|d+b0^M^?^5W|SJSGS0RsMjLiL<KmJ?HLFCDEAyAQAO?Q:|)q!F!4!$",
        "he": "-79-,_-)$-(v-(/-'o-'Y-'W-'&-&R-%<-$Y-$W-$1-#d-!c-!!|,xVuyp6mJb&[jTROiOZMNL8I@CsA^?]<i;M7R3P2m2'2&0k0e.8,C#^!W!<!:!6!1!,",
        "she": "-76-*E-*9w/v|oVfP`_`;^h]'ZyZbYjX:WEWCT|EEDACJ?@=<<f;s9Q5Y,W&*&)&$",
        "die": "-74-)M-'>-&t-%H-$j{szSmDl/kIi3c}cPa`^IZbX:QwP!M2HsGUBcAK?I0*/}/n'_&#%q%j%i",
        "gou": "-71-3p-0y-+z-)H-'p-%W|C{uwdwcuTs0mnfM[CX%VcN6M^Gm?q:925.C*o%2",
        "kou": "-71-0f-.C-,g-)J-)DpCp8fId3]^[|VpTV9@",
        "ning": "-70-6>-4a-29-0.-'H-!)r%q!p2p)p'p!ot[4UMM5F/E5?17J6k.<+a&i",
        "yong": "-7*-5t-3M-,U-,T-'T-$t-$+-!:{Oz!yCxcrlkUg{gAe{ceb{bzapaC`w`n`:[6XTU}M4LaGQ@}>x=9:p947:5T/{/i&p&l%)#S#8",
        "wa": "-7)-/n-,e-(/-'P-'&-&x-%h-%A-#y-#nu5tbt3sGnCije[ZaWUTq>.:;8h'V'D'>&A",
        "ka": "-7&-*r-'O-'M-'4-$u{g",
        "bao": "-7%-5h-21-/>-.e-.]-,!-+{-+s~ozPzOz@sBqBpcpMp$ohoee&d:[w[kPPP1P&M]614J2<0_.u.h*G",
        "huai": "-7#-',|mx^xIe_dC_:^oGhDX<25z",
        "ming": "-6x-0g-06-(|-'guEs&`aXxR@PhOFH<>0:7,8",
        "hen": "-6s-&p-!3eac6[0.:$y",
        "quan": "-6p-1H-/.-.#-,5-,#-%%}X}Q{4w5u:t;q[m?jRf`c0b_b%['Y`WKNxJ:I[H_GLFjD>?F>F:a5841/I/H/7.o.n.m.O)2&I%'",
        "tiao": "-6o-%Xr#pWmjmWh4cRZfSQRdQjOLO'NYK.Fo",
        "xing": "-6j-5.-1<-/U-&g|0{auft{t5qljAh`f*cxb>aZUYR/P4Nl>Z<u9d2d.N,L)@![",
        "kan": "-6g-4G-0r-/r-/]-,D|n{!zGyDlkl)k{b7^D]ELRG]E2CeCc",
        "lai": "-6d-5Y-5<-%_u!t2lil_h$eSeHU2NUJiJ0DT=&<)6r5v5r,i)k%R#P#J#?",
        "kua": "-6a-'.{iwJuGcGZiQcI:",
        "gong": "-6`-6N-1D-1?-,~-+g-+d-)w-%}-$)yepTpQj<j8i2g4f{c1a*``[)[(T^N`L?@V7U1u*R",
        "mi": "-6[-0v-0n-0b-'9-#'yzqZpmpDp9m6i:i.hrfifafAcb^dVnU_TyTON2HIG$E6E+@L?{?Z?C>G<9;H9<8o6o6l5n5G1z0B,a+T'h",
        "an": "-6W-5J-4<-2D-*P-*J-')-%e-$x{b{&z_sYpwn@n8mXm:hXg~ZnXNQ.PnL'L&A1>M.g*w$V",
        "lu": "-6V-33-1C-.H-,N-,<-*q-*o-!N~q~_};|G|5yVyUxMtVmChGgZgFf9f8^7XzW)V)UzUAU/O{MpLeJ#G&FyEuDvDaARAM>s<K<;;p9:9'8.7L6@6)4p1m0T+W+H)Y(Q()'m&n!%",
        "mou": "-6U-,c-)x-($-&azLcVTTMEKs/a",
        "cun": "-6J-/Z-(~x'qLocdn[%Nj7^!O",
        "lv": "-6F-63-4#-38-23-,'-*x-(t-(F-&G|+nTnSnPl(e^`A`5ZcZ*YwS.K*HTDsDoAYA)9M6D3A0]+I",
        "zhen": "-6C-67-4)},ygybuMs*p5ndiUiRi<fc[nZlZGXWWOSTR*OJN$MhLVKjK_IHHuHLHAG_FVBb=~:y:$8$72,+*_*^({(q'8&Z&<%9",
        "ce": "-6B-4*-1%-1#-*=-*2wZgrc!aY_jZ}TQLl={;O&8",
        "chai": "-6?-2@-$h~?j3[UL}.i$'",
        "nong": "-6=-2S-0p-&b-!Eg.ZmZAElDG=s7#0o#W",
        "hou": "-6:-5*-*8-({-(L-(K-'p-$l|%zQi=e]>b._,A$C",
        "jiong": "-69-3'-1.-1$-0}}z|K{;]~]}?M=J7e4t4I3c2T2S1W1.",
        "tui": "-6.-6(-3&y'tmo$ftfodrY(F>24",
        "nan": "-6+-*|-$r~'~#v=tzstrb^e[sXfPqN*M6H}:d29&a&?",
        "xiao": "-6*-5v-5R-3a-.x-,d-'j-'1-&l-&P-$}-$1-#D-#?-#&-!|-!v~c~J~CuUtHqGpPpJoKlGh/fFcJ_iX;V:TPT/SoSnQVQ'P;MiMaLOK+DOCYCLBAB4>B===8<Z8E6!5+5*4,3L2&1L,o+r+o$t$o!i!b",
        "bian": "-6)-+9-*u-)UwzmKg1eAdVaX^#]=XSR#@A@@4Z26/o,@+`+,':%8",
        "pian": "-6)-4P}ysI^#I=Ht/y/0,@+`(j((",
        "cu": "-6%-+$-!csFegd(_YEsB},X$I#z!H",
        "e": "-6$-4K-2k-+j-*T-*N-(_-(E-(*-'A-')-&X-!j-!A}s{nzhzIzCv$uzuBtotUtTtSn]n)mGm'm&l+gnc'bOata?^+]DWsWdWNUbTMM}DZCEC(>M=5;9*7)`$V$O!r",
        "guang": "-5~-2}-1h-'@{~uIhXhTgOZsVKL+>28)5/4b4_4^3s.d+Y*U",
        "ku": "-5}-/3-&Q-$6~R}PzrhDh+gN]dZiZ5OPMgL!I%3N.>$9",
        "jun": "-5{-2T-0q-(n-(G|u{NuHollq_;Z3U5TzQPKMJH@F=l6V3G1B*1&'!Q!K!J",
        "zu": "-5w-5?-+1-+$-&S-%rlYlAd(S#M1Ix0'*e",
        "hun": "-5s-4o}_t9t'o9dMaz`oYDR?Q~JYJRBf=u<d<(;=:t:`9{3O36*9)G",
        "su": "-5n-3x-2c-$*~9}/{3y}y|wjs#p@a(a'_lVnKKJ2H;G(F~F8DYBo?2>>=4:&9z828&+F*L(F&r",
        "lia": "-5[-5>",
        "pai": "-5Q-&sg9eP[NY?JU?p>+;j;8/t.w,q",
        "biao": "-5O-36-2/yJtIryi%f!VfNhLjFzEG<.9C66511o0c,k#|",
        "fei": "-5M-.m-+M-*4-(i-%8w%vZt@t?nXh8gpgPbH]xSdQxQ%P:OPNLLxJVH5FOF)Di?W<C;x6K.`.H,p%3$]#a",
        "bei": "-5I-57-4B-4%-3b-37-,Y-+a-+%-(1-&:w|qIh#bdbGajaR`$X3RMNLNKLyK^K5JUJSIq3:/S/).R,y*/)T!@",
        "dao": "-52-/g-/e-/6-)E-#K-!5xSo_oLmvlvk;k:jiiKhld{b=YoYcWqUZO'JkIaGZEIE?AA3;0g'd!+!&",
        "tan": "-51-3^-3/-2R-)4-%$-#P-#I-!n-!m|o|a|U{'xxxsxaxKtAfTfOfEdtcfb$_p_W_OY/W=UDTuR5PJP=HYF5EnCUAk:w9H7|7{7.5E4K1G(3$}$^#~#7",
        "chui": "-5/-(O}T|9{Va|Y[WcKtJ6ItGl4o",
        "kong": "-4{{+qPlfcNb;Y)Iv<n",
        "juan": "-4z-,h-,P-,0-*[-((}X}Q{Iw<w5uVtut;jpj`j%iYf`byb%`4Z%Y`OGL%K@J:I[=2<^3M.!+j'C",
        "luo": "-4r-1y-.|-'4-%(~<~/o^mHZ*YbW(U@U3U/T{TlOvI^D9>q>O>N;y8^6F3{/(,T+P*M#y#5!Y",
        "song": "-4q-3I-0D-)'u8pulDk^kOgydYdAb`a3a$`D_MZ#XXW0N<N:MmM>K%J`HyEF<B9!6v",
        "leng": "-4p-0T-%uzdz,lQa1J5I!",
        "ben": "-4l-$E|q|pwSwPw.w(YXV8O3LQKXI4?B;|8]4v/8&=",
        "cai": "-4h-4,-%N{%tLp?f#]t]qY0NkJZA},Y",
        "ying": "-4`-3.-%1-$>-#*-!K~Oz%x#s{sXs9s%quqqq_q%kcj[jWhCgDexdha/_AVwV_U0U&R]R.Q:PwO?MHKpK]J{HvHdFbDMDI=_;E:U:K9d9O8K8F6j6i6N6=6&5~5o5j5M5A2w2r2_1x1)0b*:)*(y(S'i'5'%#j#;!B!;",
        "ruan": "-4[zJxQsiVWOUE0):'}",
        "chun": "-4Y-&7sda^RPR(PlOONDIBGrFQE(=T<,:[9N8u/6)C",
        "ruo": "-4S-)[sskPf]Z:YUI8;y3'0^",
        "dang": "-4M-2P-1V-/k-!1}*{fx]swpkl6kdf:aAZUUsTpKiEYD5@|8:7E5D*;(J(6'?%}",
        "huang": "-4@-1L-/w-$PzDz.xtw&s[pEl9jBi0e@clcQa_a#`dXTQgQfPBOEHbH7D{@9:x9i8)4:2c2.1J0X+w)((E#i!}!g!Z",
        "duan": "-4+-.Uz+s`SFS<IMBIB62j)0",
        "ou": "-4(-+=-+7-(q-(K-(3-#;yTd?`EDpC}CSBJB8?l8s1Y'M'0",
        "zan": "-4$-2.-1x-1o-'2-$c-!e~:p>[$XOVUU8U*TwR1Q&PYKrEy6E5K't'k'c",
        "za": "-4$-+Z-'b-'X-'2-$c-!c~B~:~5i}]s[$NyKr?r?a",
        "lou": "-4#-38-.}-$7-#ByMu4tRo{n[kjkEg_`5X)W'HaG#:O9&8~1i'2$5#o#n",
        "sou": "-3z-0J-)Q-)N-#z-#R-#QgsghZ#YvWlW>W0V:U`UBJ/DgCn:#,5#s",
        "yuan": "-3u-1n-1)-0h-.z-*3-*1-)y-(0-&^-$Y-!<}{}t}Z}R}N}M}D{t{_yawlv6v(sSs:s)qhpep<f[cwbyb,`qXoX8NNJ=HxH>H0ErDk@/<m<*;{;v;r;g:e:F:D5]04,M,6)/",
        "rong": "-3t-3`-0u|ts8s'qzp~pFlwkokcjj^WX#WwOyLmHGH.H&GQAsAU9|6%3T1v0b.2)#",
        "jiang": "-3p-2a-,7-+Y-+Wz/xew~w+vvvru]oToSkMfrfWfVfSfCVyVeKdGDEoDeBQ@U>P>#;L9A8M.|,&&B%y%n%m",
        "bang": "-3n{^ypiNi5h~hme|Z?YrWvS2KEJTJSH@=j/m++",
        "shan": "-3h-3)-2R-/F-/<-.a-.E-*~-$q-$F-#H}'{Gy+y*ulubr2nDj|i(f+]zZ;Y3XuXsWaVhV?UySvQ8NrL|LlIVFSEhCI@`7|7p7O5F4B2Z211~.4*b%U%1",
        "que": "-3f-*_-*W{Pyty$lgbNa+`KX!T8T.JBH$@j4e0|)O#q!N",
        "nuo": "-3Q-1w-$ftxa6_#_!ZLXnWoWbWLK0HJF2Am",
        "can": "-3P-2F-)l-)k-)j-)i-$D-#H~:r(q3amah`W`V`U_[XsVqVhO_BtBg;/784z1!0L(9",
        "lei": "-3O-24-1t-,J-)q-#1|(z0xOx?rrU|U;G'E]DyDxD/?$>I=+<F5X'z%u$)#Q",
        "zao": "-3L-/h-&(-%w-$5-!@`JRfMsLkK>JO7F5&2>1#(](7#&#%",
        "cao": "-3L-#GnGk@`v`k`^_DVAUqOgOfG:8x",
        "ao": "-3H-/n-*&-#X-#W|H|4xnxkv}vyvwsDs2rZmxmakAjnga`O_@]I]![DVuUeTBM*K=?>9;7M741m1^0Z,!+~(Y",
        "cou": "-3D-0:Hl;1",
        "chuang": "-3B-/b-/K-/5-.s-.i-.L-$T-!dhvhMd=`|W7O<F+0#/r/k%D$+",
        "piao": "-36-.D-,;-#Crteze7`]RuO*Br9/.v'Z!X",
        "man": "-32{KyKujtlrpn^i'bc`M`=VrOdG9Fs:V9P928b7<701V,(",
        "zun": "-3%-!ix}oPk&[%YzVILEFU5k",
        "deng": "-2z-/t-!VxwrHk(_v^@E$7d6/5.1A(O#,",
        "tie": "-2s-'yigd+",
        "seng": "-2o",
        "zhuang": "-2hx9x8x2w)vWv@tphvhShE^a^`^_VDKcKBG6:`8X3H.e.Z",
        "min": "-2`-0Q-/E-,X-(&|1uumYl]dfded8bJaWaG`S_`[]YhTUTIT(RSRRPzAH>|;z;+:t8(+1*c)o)j)=$R!D",
        "sai": "-2V-#b-#)-!/yod%a2XaAxAb",
        "tai": "-2B-0_-)=}e|Mw[wXwOvzqvqCdodQdB`e[pU]SpR]MeE>@f@D@C>{:=4G4F1$*f",
        "lan": "-2?-1@-)}-%P-!'~3|hx`xXt(qgqaqUmwkwhgb)_8_'^p[5X/UXU(TmSaS_PpLbHXDDD2D1=^9L8i7K6W5`5W5=5<46121%0n0d0I0@0>($'j",
        "meng": "-2;-0k-,Lwaw`qEo2hnh*_._+^qXtUaP)O9K$F;EAANAF:A6h,Z+]'/&X#B!#",
        "qiong": "-28-*fr.pza]`!K}F(3(3%2L1}*))J(G's'f",
        "lie": "-25-0N-/O-,z-,w-,`-'<-&G{D{CuDjaj=djZeZ_YiUEL;JMA{>_=p403f2A1$0a0[.x,h,V+k+[",
        "teng": "-2%i+9]8r1e%6%&",
        "long": "-2#-'J-&]~^|7|6xHxGo2n=k6j_j^g.e([9U.QmOxO8LgKDGYDU>t:g9T9%5w0N*Z'n#f",
        "rang": "-1}-,$~Nx[xC^mU$5b0K+S'X",
        "xiong": "-1m-1j-/q-+v-+p-&zwsdLc?Sy@;>42w2r2#2!",
        "chong": "-1l-0Y-#L{*p`oflelde0dc`+_dX<W8?z=K=98X0F*@%&",
        "dui": "-1g-1e-1`-%L|$zlymobo]oMcc_n_m_*TET>T2NB6[6G5|5u$P",
        "rui": "-1g-1e-1`-)LxFas]0M~KVF.@G)'&t",
        "ke": "-1f-/*-.w-,]-,R-+;-)>-'o-'0-$!|Dzqx4u#p^oUmomIkvknjqc4bra<a;XJWsT4M%J1G|F}CcBCBBA/;u;G:>6U4U0!/N//*j%>$O",
        "tu": "-1c-1]-0H-/o-(y-&3-%?}n}c}J}I}A}?zezZyvxipvnUlskikFh.gVeVc}bsZ.YYX@W2K?EL@R=C=::r7u(i$r$>",
        "nei": "-1I-1*-&TtvA<A;=H",
        "liu": "-1C-/N-.8~fy^s5qik`gl^vW9S4S*R}L~LpKnKQH'FHF#>(=w::8Q7V631r1[*a)~)%(v(?&S&>&%%r$(#d",
        "shou": "-13-)`-)V-%l-!o{ox)x&pxo[]v]uYITcTN<t.1+n+X$e$&",
        "ran": "-1+-1&-(!-##umsKMBF'2y1Z1F*i",
        "gang": "-1'-0^-/L-.gzjz4mzmplT^a^`^_]fYKWDNZJEGe;L2z2v/W/:.a%Z",
        "gua": "-0~-/8-.r-.S-.A-*m-)F-(/-'s-'&-%0|Ooz[/ZuY6LSK[C`2='a",
        "zui": "-0i-*6-'d-#U-!w-!*k<jmQ=O`OGLDG[F]EgEbD@6a(%",
        "qia": "-0M-+;-*r-'6})m0iZc.a<[j[7YAXJUhBq>,",
        "mei": "-0I~j|vz>yRv#sks]sTs4r<p/l&k|e)[bZBU%S3R&M|LoKFHzHjGgDrBfB0B/?~?o?d=I;?;7;32Q2J11,=+$*0)D$w",
        "zhun": "-0E-05-%L}5zwpnnFdPRQ<,:@",
        "du": "-0+-.`-+B-)p-#0z<vKv1uTqjh1SsQ4PvN_IcDlBRBNB+=(;n;Z6</s/h/5.y..+i)I'y!E",
        "kai": "-/x-/v-/%-.M-,I-#J{ey~w0n3kag2dEc#aB`y`r`GXCPfHfCxCu6U4m3}",
        "hua": "-/T-.>-+b-+(-(_-(.-&h-#%{@wGuWs}s|rJrDlaWTV}V+NAMvKfIgGKFX9a7c,7&]&+%~",
        "bie": "-/A-/;fGe2`#M'M!$!#I",
        "pao": "-/>-+i-'^~o|2w=hA]$[P?.4J4H3d06.M'^%A!S",
        "geng": "-/7-&A{TzHlrh=ZIOlK4IX=X2p&M",
        "shua": "-//-%j",
        "cuo": "-.y-.p-*5wukWkSh!ZKY&WuV4(o$j$'",
        "kei": "-.woU",
        "la": "-.v-%3-$n~L|8[RXFXEWnUEU2R`MOI6DT:T0['o$A",
        "pou": "-.l-'_-&[{]twtO]+]&Z+YGJS/<",
        "tuan": "-.I~!}~}K}HyPy&f7`>[}XIVmGLE;;.:m8t2[,F%v%p",
        "zuan": "-.)XOTt",
        "keng": "-,x-([|t|kvIZCXlVgBF/C",
        "gao": "-,Z-(I-(>wRlpWjNHGxGwGdG>E~E3Dm,)!y!t",
        "lang": "-,V-&J-$~{Jy[r{llgiSeOIOHO;KRHHG4Cp=[3Y,z*%(s",
        "weng": "-,@-#oyxv{kfU!Pd9o'N'&",
        "tao": "-+m-)E-'+-%DwPwMw*r}i/fl`j[oYBWXL,JkGtE?><=)<t<H9^6_(w",
        "nao": "-+`-'n{cz[wqt.rzq8l{jyjSd0b~bPad_QZVW9VOKkFJ<J,D+Z+Q),",
        "zang": "-+Oynw)g(/~",
        "suan": "-+C,{$n",
        "nian": "-+3-&i-%b{9uOhdg3dNbTa~[SYVVHV,U7HL=;<0:C2q",
        "shuai": "-*xixiWW3+I&o",
        "mang": "-*<-)*-&Zx(u(o2h*dkb|OENdNSAF@c=i8`/[/D.$$q",
        "rou": "-)uslpsXdMAHc;d2K)>'v",
        "cen": "-)l-)k-)j-)i{Un#kH@?=1",
        "shuang": "-)byOqeq^`NDB>t8R5w5^0&",
        "po": "-)8-&M-#6~]|ZvztMoZmlmZg9W]TXR+O*E%?E>q>o>D;*:J8;6F3v,9*l!`",
        "a": "-(s-'o-%O-$0",
        "tun": "-(k-(7-%L-!`}}|snFhNdP_mRQPFOC@x=335",
        "hang": "-([{dwSvIj)dGS8NML/@.",
        "shun": "-(ZHnF?",
        "ne": "-(R-(8-(%-&T]0%a",
        "chuo": "-(Q-&@-%=~Hu!t~t.ssqVa|^2Z}UuCC<q<J",
        "wai": "-(/-'&-$gwml7C95z",
        "guo": "-(/-'&-%)-$e-#<~.}r}k}f}d}a}U{<zTy>lMi@i$fDf@b1`Y_4XyW6TMMzJ$I:GOD{=#<W;U9#7!,c$<",
        "qiang": "-(,-%f-%M-$.-#[y=y3xmrXr0k>gKfVfSfC^P^N^>[zWQW!VySKMlIvGkFdEJ:)8{4[1s/|/z,f,.*{(p%m",
        "pen": "-('-$E-$=-!6CN;'6}'Q!=",
        "pin": "-&~~Yuatnrvq{[AZ{H]@_/c+!)r",
        "ha": "-&wvz",
        "yo": "-&`-%c-$B",
        "o": "-&X-$a-!H-!%",
        "n": "-&)-#a",
        "huan": "-%v-$Z-$Y~G}D{_zWw@w2r.q[pYp0okm8l!h]bVaH_I^iYpXQUnU1KyK2GBD%CPCB>1=c<~;c8V7D734/3>2I.[.;,3+R*})9(1'b$d$:",
        "ken": "-%V{qxjc*_CX~*I",
        "chuai": "-%=XIW}Ch",
        "pa": "-%/vLisihd.]oX|NC@r8608)P#!",
        "se": "-%,-$,yogK_<Z}VnUrLTGJC5C3>W<x;q7h7g6|6t60)p)&(0#r",
        "re": "-$fa[YU;y3g1X",
        "sun": "-$DqKq9]EYsW{WzW;H1Gv.',:",
        "hei": "-#h-!l7r",
        "dia": "-#^",
        "de": "-#5}0hBeQe5e1c)bFakR[JW<_##",
        "dei": "-#5eQ",
        "kuo": "-!`g`]W[:[/ZsUI8U6L",
        "ceng": "-!_ntnQk4OcObF*",
        "ca": "~s~B[UUWU:",
        "zeng": "~7y5y._}OcObF*1R(M'*",
        "nin": "~(c^bQ[*",
        "kun": "}q|Wzoz`x/x*t'l[lZbwZ0RHQMJv=B8C371U,e)_(g",
        "qun": "}jwxpRl~iPCT",
        "ri": "}iRjA=",
        "lve": "}Go^Y1&2&0",
        "zhui": "|[y0w#t]aaXIIt?s'<%|",
        "sao": "zus+`k_D]UYNXrWtK(AP:8$4",
        "en": "wBmBc5WF20",
        "zou": "w3s>Y%X`W~J/J.Hl",
        "nv": "vkc7OM@!",
        "nuan": "vcPo;`:m2X2W",
        "shuo": "v]a'WhT'S|OKGnCn>>470W+p",
        "niu": "v?q=dKd0]S]![DN?@8@!4u/e/d.W",
        "rao": "u2rA]PU?KkFJ",
        "niang": "t|r&qb",
        "shui": "t]iTZMYuA$A#@{=.=*",
        "nve": "t)%S$%",
        "nen": "sirarYc^",
        "niao": "s!r+qsnwFq9x",
        "kuan": "pBp#ooK)CoCfCd",
        "cuan": "jPV'U*T~TwDtD7BU@o6E5K1S0<",
        "te": "dsdr`R/F/9",
        "zen": "d5VU",
        "zei": "^H",
        "den": "][]C",
        "zhua": "],ZYV#ER0:09",
        "shuan": "[&L^GL<s",
        "zhuai": "Zz",
        "nou": "WoGpE0+^",
        "shai": "W<TsQWOt",
        "sen": "J8ISGI",
        "run": "FE<{8'",
        "ei": "Cl",
        "chua": "Ci"
    }
};
let DB = {
    sToC: {},
    cToS: {}
};
let sToC = DB.sToC,
    cToS = DB.cToS,
    ungroup = /-?.{2}/g,
    rg = /^-/,
    fromX = str => {
        let result = 0,
            temp = 1;
        for (let idx = str.length; idx--;) {
            result += temp * (chars.indexOf(str.charAt(idx)));
            temp *= 91;
        }
        return result;
    },
    fn = (a, f) => {
        let p, gs, i, ch, num;
        for (p in a) {
            if (a.hasOwnProperty(p)) {
                gs = a[p].match(ungroup);
                for (i = 0; i < gs.length; i++) {
                    ch = gs[i].replace(rg, '#');
                    num = fromX(ch);
                    ch = String.fromCharCode(base + middle + (f ? -num : num));
                    if (sToC.hasOwnProperty(p)) {
                        sToC[p] += ch;
                    } else {
                        sToC[p] = ch;
                    }
                    if (cToS.hasOwnProperty(ch)) {
                        cToS[ch] += COMA + p;
                    } else {
                        cToS[ch] = p;
                    }
                }
            }
        }
    };
fn(SDB.m, 1);
fn(SDB.a);
SDB = null;
export default {
    getSpell(chars, polyphone, spliter) {
        let cToS = DB.cToS;
        let res = [],
            pp = typeof (polyphone) == 'function'; //判断polyphone是否是函数
        chars = String(chars).split(EMPTY);
        for (let i = 0, ch, ss; i < chars.length; i++) {
            ch = chars[i];
            if (cToS.hasOwnProperty(ch)) {
                ss = cToS[ch];
                if (~ss.indexOf(COMA)) {
                    ss = ss.split(COMA);
                    ss = pp ? polyphone(ch, ss) : '[' + ss + ']';
                    res.push(ss);
                } else {
                    res.push(ss);
                }
            } else {
                res.push(ch);
            }
        }
        return res.join(spliter || COMA);
    },
    getChars(spell) {
        let sToC = DB.sToC;
        if (sToC.hasOwnProperty(spell)) {
            return sToC[spell].split(EMPTY);
        }
        return [];
    }
};
在上述文件截断后对比
src/pages_qiun/static/table/iconfont.wxss src/pages_qiun/static/table/loader.wxss src/pages_qiun/static/table/objEqual.js src/pages_template/common/api.js src/pages_template/common/classify.data.js src/pages_template/common/config.js src/pages_template/common/demo.scss src/pages_template/common/locales/en.js src/pages_template/common/locales/zh.js src/pages_template/common/mixin.js src/pages_template/common/props.js src/pages_template/pages/address/addSite.vue src/pages_template/pages/address/index.ts src/pages_template/pages/address/index.vue src/pages_template/pages/citySelect/index.vue src/pages_template/pages/comment/index.vue src/pages_template/pages/comment/reply.vue src/pages_template/pages/coupon/index.vue src/pages_template/pages/keyboardPay/index.vue src/pages_template/pages/login/code.vue src/pages_template/pages/login/index1.vue src/pages_template/pages/login/index2.vue src/pages_template/pages/mallMenu/index1.vue src/pages_template/pages/mallMenu/index2.vue src/pages_template/pages/order/OrderItem.vue src/pages_template/pages/order/index.vue src/pages_template/pages/submitBar/index.vue src/pages_template/pages/wxCenter/index.vue src/plugins/auth.ts src/plugins/bus.ts src/plugins/index.ts src/plugins/modal.ts src/plugins/mqttclient.ts src/plugins/socketclient.ts src/plugins/tab.ts src/shime-uni.d.ts src/static/favicon.ico src/static/font/iconfont.css src/static/font/iconfont.ttf src/static/images/banner/banner01.jpg src/static/images/banner/banner02.jpg src/static/images/banner/banner03.jpg src/static/images/icon/dialogue.png src/static/images/icon/knowledge.png src/static/images/icon/message.png src/static/images/icon/phone.png src/static/images/icon/rocket.png src/static/images/profile.jpg src/static/images/tabbar/home.png src/static/images/tabbar/home_.png src/static/images/tabbar/mine.png src/static/images/tabbar/mine_.png src/static/images/tabbar/work.png src/static/images/tabbar/work_.png src/static/index.html src/static/logo.png src/static/scss/colorui.css src/static/scss/global.scss src/static/scss/index.scss src/static/uview/common/favicon.ico src/static/uview/common/gray-logo.png src/static/uview/common/logo.png src/static/uview/demo/actionSheet.png src/static/uview/demo/address.png src/static/uview/demo/album.png src/static/uview/demo/alert.png src/static/uview/demo/avatar.png src/static/uview/demo/backTop.png src/static/uview/demo/badge.png src/static/uview/demo/button.png src/static/uview/demo/calendar.png src/static/uview/demo/cell.png src/static/uview/demo/checkbox.png src/static/uview/demo/citySelect.png src/static/uview/demo/code.png src/static/uview/demo/collapse.png src/static/uview/demo/color.png src/static/uview/demo/comment.png src/static/uview/demo/countDown.png src/static/uview/demo/countTo.png src/static/uview/demo/coupon.png src/static/uview/demo/datetimePicker.png src/static/uview/demo/divider.png src/static/uview/demo/empty.png src/static/uview/demo/field.png src/static/uview/demo/form.png src/static/uview/demo/gap.png src/static/uview/demo/grid.png src/static/uview/demo/icon.png src/static/uview/demo/image.png src/static/uview/demo/indexList (1).png src/static/uview/demo/indexList.png src/static/uview/demo/keyboard.png src/static/uview/demo/keyboardPay.png src/static/uview/demo/layout.png src/static/uview/demo/line.png src/static/uview/demo/link.png src/static/uview/demo/list.png src/static/uview/demo/loading-page.png src/static/uview/demo/loading.png src/static/uview/demo/loadmore.png src/static/uview/demo/login.png src/static/uview/demo/mall_menu_1.png src/static/uview/demo/mall_menu_2.png src/static/uview/demo/mask.png src/static/uview/demo/messageInput.png src/static/uview/demo/modal.png src/static/uview/demo/navbar.png src/static/uview/demo/noNetwork.png src/static/uview/demo/noticeBar.png src/static/uview/demo/notify.png src/static/uview/demo/numberBox.png src/static/uview/demo/order.png src/static/uview/demo/parse.png src/static/uview/demo/picker.png src/static/uview/demo/popup.png src/static/uview/demo/progress.png src/static/uview/demo/radio.png src/static/uview/demo/rate.png src/static/uview/demo/readMore.png src/static/uview/demo/scrollList.png src/static/uview/demo/search.png src/static/uview/demo/skeleton.png src/static/uview/demo/slider.png src/static/uview/demo/steps.png src/static/uview/demo/sticky.png src/static/uview/demo/submitBar.png src/static/uview/demo/subsection.png src/static/uview/demo/swipeAction.png src/static/uview/demo/swiper.png src/static/uview/demo/switch.png src/static/uview/demo/tabbar.png src/static/uview/demo/tabs.png src/static/uview/demo/tag.png src/static/uview/demo/text.png src/static/uview/demo/textarea.png src/static/uview/demo/toast.png src/static/uview/demo/tooltip.png src/static/uview/demo/transition.png src/static/uview/demo/upload.png src/static/uview/demo/wxCenter.png src/static/uview/example/component.png src/static/uview/example/component_select.png src/static/uview/example/js.png src/static/uview/example/js_bak.png src/static/uview/example/js_select.png src/static/uview/example/template.png src/static/uview/example/template_select.png src/store/index.ts src/store/modules/dict.ts src/store/modules/user.ts src/types/request.ts src/uni.scss src/uni_modules/uni-badge/changelog.md src/uni_modules/uni-badge/components/uni-badge/uni-badge.vue src/uni_modules/uni-badge/package.json src/uni_modules/uni-badge/readme.md src/uni_modules/uni-breadcrumb/changelog.md src/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue src/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue src/uni_modules/uni-breadcrumb/package.json src/uni_modules/uni-breadcrumb/readme.md src/uni_modules/uni-calendar/changelog.md src/uni_modules/uni-calendar/components/uni-calendar/calendar.js src/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json src/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js src/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json src/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue src/uni_modules/uni-calendar/components/uni-calendar/util.js src/uni_modules/uni-calendar/package.json src/uni_modules/uni-calendar/readme.md src/uni_modules/uni-card/changelog.md src/uni_modules/uni-card/components/uni-card/uni-card.vue src/uni_modules/uni-card/package.json src/uni_modules/uni-card/readme.md src/uni_modules/uni-collapse/changelog.md src/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue src/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue src/uni_modules/uni-collapse/package.json src/uni_modules/uni-collapse/readme.md src/uni_modules/uni-combox/changelog.md src/uni_modules/uni-combox/components/uni-combox/uni-combox.vue src/uni_modules/uni-combox/package.json src/uni_modules/uni-combox/readme.md src/uni_modules/uni-countdown/changelog.md src/uni_modules/uni-countdown/components/uni-countdown/i18n/en.json src/uni_modules/uni-countdown/components/uni-countdown/i18n/index.js src/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json src/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json src/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue src/uni_modules/uni-countdown/package.json src/uni_modules/uni-countdown/readme.md src/uni_modules/uni-data-checkbox/changelog.md src/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue src/uni_modules/uni-data-checkbox/package.json src/uni_modules/uni-data-checkbox/readme.md src/uni_modules/uni-data-picker/changelog.md src/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js src/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue src/uni_modules/uni-data-picker/package.json src/uni_modules/uni-data-picker/readme.md src/uni_modules/uni-data-select/changelog.md src/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue src/uni_modules/uni-data-select/package.json src/uni_modules/uni-data-select/readme.md src/uni_modules/uni-dateformat/changelog.md src/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js src/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue src/uni_modules/uni-dateformat/package.json src/uni_modules/uni-dateformat/readme.md src/uni_modules/uni-datetime-picker/changelog.md src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js src/uni_modules/uni-datetime-picker/package.json src/uni_modules/uni-datetime-picker/readme.md src/uni_modules/uni-drawer/changelog.md src/uni_modules/uni-drawer/components/uni-drawer/keypress.js src/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue src/uni_modules/uni-drawer/package.json src/uni_modules/uni-drawer/readme.md src/uni_modules/uni-easyinput/changelog.md src/uni_modules/uni-easyinput/components/uni-easyinput/common.js src/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue src/uni_modules/uni-easyinput/package.json src/uni_modules/uni-easyinput/readme.md src/uni_modules/uni-fab/changelog.md src/uni_modules/uni-fab/components/uni-fab/uni-fab.vue src/uni_modules/uni-fab/package.json src/uni_modules/uni-fab/readme.md src/uni_modules/uni-fav/changelog.md src/uni_modules/uni-fav/components/uni-fav/i18n/en.json src/uni_modules/uni-fav/components/uni-fav/i18n/index.js src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json src/uni_modules/uni-fav/components/uni-fav/uni-fav.vue src/uni_modules/uni-fav/package.json src/uni_modules/uni-fav/readme.md src/uni_modules/uni-file-picker/changelog.md src/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js src/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue src/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue src/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue src/uni_modules/uni-file-picker/components/uni-file-picker/utils.js src/uni_modules/uni-file-picker/package.json src/uni_modules/uni-file-picker/readme.md src/uni_modules/uni-forms/changelog.md src/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue src/uni_modules/uni-forms/components/uni-forms/uni-forms.vue src/uni_modules/uni-forms/components/uni-forms/utils.js src/uni_modules/uni-forms/components/uni-forms/validate.js src/uni_modules/uni-forms/package.json src/uni_modules/uni-forms/readme.md src/uni_modules/uni-goods-nav/changelog.md src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json src/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue src/uni_modules/uni-goods-nav/package.json src/uni_modules/uni-goods-nav/readme.md src/uni_modules/uni-grid/changelog.md src/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue src/uni_modules/uni-grid/components/uni-grid/uni-grid.vue src/uni_modules/uni-grid/package.json src/uni_modules/uni-grid/readme.md src/uni_modules/uni-group/changelog.md src/uni_modules/uni-group/components/uni-group/uni-group.vue src/uni_modules/uni-group/package.json src/uni_modules/uni-group/readme.md src/uni_modules/uni-icons/changelog.md src/uni_modules/uni-icons/components/uni-icons/icons.js src/uni_modules/uni-icons/components/uni-icons/uni-icons.vue src/uni_modules/uni-icons/components/uni-icons/uniicons.css src/uni_modules/uni-icons/components/uni-icons/uniicons.ttf src/uni_modules/uni-icons/package.json src/uni_modules/uni-icons/readme.md src/uni_modules/uni-indexed-list/changelog.md src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue src/uni_modules/uni-indexed-list/package.json src/uni_modules/uni-indexed-list/readme.md src/uni_modules/uni-link/changelog.md src/uni_modules/uni-link/components/uni-link/uni-link.vue src/uni_modules/uni-link/package.json src/uni_modules/uni-link/readme.md src/uni_modules/uni-list/changelog.md src/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue src/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss src/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue src/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue src/uni_modules/uni-list/components/uni-list/uni-list.vue src/uni_modules/uni-list/components/uni-list/uni-refresh.vue src/uni_modules/uni-list/components/uni-list/uni-refresh.wxs src/uni_modules/uni-list/package.json src/uni_modules/uni-list/readme.md src/uni_modules/uni-load-more/changelog.md src/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json src/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js src/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json src/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json src/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue src/uni_modules/uni-load-more/package.json src/uni_modules/uni-load-more/readme.md src/uni_modules/uni-nav-bar/changelog.md src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue src/uni_modules/uni-nav-bar/package.json src/uni_modules/uni-nav-bar/readme.md src/uni_modules/uni-notice-bar/changelog.md src/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue src/uni_modules/uni-notice-bar/package.json src/uni_modules/uni-notice-bar/readme.md src/uni_modules/uni-number-box/changelog.md src/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue src/uni_modules/uni-number-box/package.json src/uni_modules/uni-number-box/readme.md src/uni_modules/uni-pagination/changelog.md src/uni_modules/uni-pagination/components/uni-pagination/i18n/en.json src/uni_modules/uni-pagination/components/uni-pagination/i18n/es.json src/uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json src/uni_modules/uni-pagination/components/uni-pagination/i18n/index.js src/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json src/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json src/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue src/uni_modules/uni-pagination/package.json src/uni_modules/uni-pagination/readme.md src/uni_modules/uni-popup/changelog.md src/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js src/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue src/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue src/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue src/uni_modules/uni-popup/components/uni-popup/i18n/en.json src/uni_modules/uni-popup/components/uni-popup/i18n/index.js src/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json src/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json src/uni_modules/uni-popup/components/uni-popup/keypress.js src/uni_modules/uni-popup/components/uni-popup/popup.js src/uni_modules/uni-popup/components/uni-popup/uni-popup.vue src/uni_modules/uni-popup/package.json src/uni_modules/uni-popup/readme.md src/uni_modules/uni-rate/changelog.md src/uni_modules/uni-rate/components/uni-rate/uni-rate.vue src/uni_modules/uni-rate/package.json src/uni_modules/uni-rate/readme.md src/uni_modules/uni-row/changelog.md src/uni_modules/uni-row/components/uni-col/uni-col.vue src/uni_modules/uni-row/components/uni-row/uni-row.vue src/uni_modules/uni-row/package.json src/uni_modules/uni-row/readme.md src/uni_modules/uni-scss/changelog.md src/uni_modules/uni-scss/index.scss src/uni_modules/uni-scss/package.json src/uni_modules/uni-scss/readme.md src/uni_modules/uni-scss/styles/index.scss src/uni_modules/uni-scss/styles/setting/_border.scss src/uni_modules/uni-scss/styles/setting/_color.scss src/uni_modules/uni-scss/styles/setting/_radius.scss src/uni_modules/uni-scss/styles/setting/_space.scss src/uni_modules/uni-scss/styles/setting/_styles.scss src/uni_modules/uni-scss/styles/setting/_text.scss src/uni_modules/uni-scss/styles/setting/_variables.scss src/uni_modules/uni-scss/styles/tools/functions.scss src/uni_modules/uni-scss/theme.scss src/uni_modules/uni-scss/variables.scss src/uni_modules/uni-search-bar/changelog.md src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json src/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue src/uni_modules/uni-search-bar/package.json src/uni_modules/uni-search-bar/readme.md src/uni_modules/uni-segmented-control/changelog.md src/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue src/uni_modules/uni-segmented-control/package.json src/uni_modules/uni-segmented-control/readme.md src/uni_modules/uni-steps/changelog.md src/uni_modules/uni-steps/components/uni-steps/uni-steps.vue src/uni_modules/uni-steps/package.json src/uni_modules/uni-steps/readme.md src/uni_modules/uni-swipe-action/changelog.md src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs src/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue src/uni_modules/uni-swipe-action/package.json src/uni_modules/uni-swipe-action/readme.md src/uni_modules/uni-swiper-dot/changelog.md src/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue src/uni_modules/uni-swiper-dot/package.json src/uni_modules/uni-swiper-dot/readme.md src/uni_modules/uni-table/changelog.md src/uni_modules/uni-table/components/uni-table/uni-table.vue src/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue src/uni_modules/uni-table/components/uni-td/uni-td.vue src/uni_modules/uni-table/components/uni-th/filter-dropdown.vue src/uni_modules/uni-table/components/uni-th/uni-th.vue src/uni_modules/uni-table/components/uni-thead/uni-thead.vue src/uni_modules/uni-table/components/uni-tr/table-checkbox.vue src/uni_modules/uni-table/components/uni-tr/uni-tr.vue src/uni_modules/uni-table/i18n/en.json src/uni_modules/uni-table/i18n/es.json src/uni_modules/uni-table/i18n/fr.json src/uni_modules/uni-table/i18n/index.js src/uni_modules/uni-table/i18n/zh-Hans.json src/uni_modules/uni-table/i18n/zh-Hant.json src/uni_modules/uni-table/package.json src/uni_modules/uni-table/readme.md src/uni_modules/uni-tag/changelog.md src/uni_modules/uni-tag/components/uni-tag/uni-tag.vue src/uni_modules/uni-tag/package.json src/uni_modules/uni-tag/readme.md src/uni_modules/uni-title/changelog.md src/uni_modules/uni-title/components/uni-title/uni-title.vue src/uni_modules/uni-title/package.json src/uni_modules/uni-title/readme.md src/uni_modules/uni-tooltip/changelog.md src/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue src/uni_modules/uni-tooltip/package.json src/uni_modules/uni-tooltip/readme.md src/uni_modules/uni-transition/changelog.md src/uni_modules/uni-transition/components/uni-transition/createAnimation.js src/uni_modules/uni-transition/components/uni-transition/uni-transition.vue src/uni_modules/uni-transition/package.json src/uni_modules/uni-transition/readme.md src/utils/auth.ts src/utils/common.ts src/utils/constant.ts src/utils/dict.ts src/utils/errorCode.ts src/utils/geek.ts src/utils/permission.ts src/utils/request.ts src/utils/ruoyi.js src/utils/storage.ts src/utils/upload.ts static/img/avatar.png (已删除) static/img/b-1.png (已删除) static/img/b-2.png (已删除) static/img/tabbar/center.png (已删除) static/img/tabbar/center_art.png (已删除) static/preview/ali_pay.jpg (已删除) static/preview/index.jpg (已删除) static/preview/login.jpg (已删除) static/preview/logs.jpg (已删除) static/preview/my.jpg (已删除) static/preview/notice-e.jpg (已删除) static/preview/notice-m.jpg (已删除) static/preview/prefile.jpg (已删除) static/preview/pwd-reset.jpg (已删除) static/preview/wechat_pay.jpg (已删除) static/preview/work.jpg (已删除) static/style.scss (已删除) store/index.js (已删除) store/modules/system.js (已删除) store/modules/user.js (已删除) store/mutation-types.js (已删除) template.h5.html (已删除) tsconfig.json uni.scss (已删除) uni_modules/qiun-data-charts/changelog.md (已删除) uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue (已删除) uni_modules/qiun-data-charts/js_sdk/u-charts/config-ucharts.js (已删除) uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js (已删除) uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.min.js (已删除) uni_modules/qiun-data-charts/package.json (已删除) uni_modules/qiun-data-charts/readme.md (已删除) uni_modules/uview-ui/LICENSE (已删除) uni_modules/uview-ui/README.md (已删除) uni_modules/uview-ui/changelog.md (已删除) uni_modules/uview-ui/components/u--form/u--form.vue (已删除) uni_modules/uview-ui/components/u--image/u--image.vue (已删除) uni_modules/uview-ui/components/u--input/u--input.vue (已删除) uni_modules/uview-ui/components/u--text/u--text.vue (已删除) uni_modules/uview-ui/components/u--textarea/u--textarea.vue (已删除) uni_modules/uview-ui/components/u-action-sheet/props.js (已删除) uni_modules/uview-ui/components/u-action-sheet/u-action-sheet.vue (已删除) uni_modules/uview-ui/components/u-album/props.js (已删除) uni_modules/uview-ui/components/u-album/u-album.vue (已删除) uni_modules/uview-ui/components/u-alert/props.js (已删除) uni_modules/uview-ui/components/u-alert/u-alert.vue (已删除) uni_modules/uview-ui/components/u-avatar-group/props.js (已删除) uni_modules/uview-ui/components/u-avatar-group/u-avatar-group.vue (已删除) uni_modules/uview-ui/components/u-avatar/props.js (已删除) uni_modules/uview-ui/components/u-avatar/u-avatar.vue (已删除) uni_modules/uview-ui/components/u-back-top/props.js (已删除) uni_modules/uview-ui/components/u-back-top/u-back-top.vue (已删除) uni_modules/uview-ui/components/u-badge/props.js (已删除) uni_modules/uview-ui/components/u-badge/u-badge.vue (已删除) uni_modules/uview-ui/components/u-button/nvue.scss (已删除) uni_modules/uview-ui/components/u-button/props.js (已删除) uni_modules/uview-ui/components/u-button/u-button.vue (已删除) uni_modules/uview-ui/components/u-button/vue.scss (已删除) uni_modules/uview-ui/components/u-calendar/header.vue (已删除) uni_modules/uview-ui/components/u-calendar/month.vue (已删除) uni_modules/uview-ui/components/u-calendar/props.js (已删除) uni_modules/uview-ui/components/u-calendar/u-calendar.vue (已删除) uni_modules/uview-ui/components/u-calendar/util.js (已删除) uni_modules/uview-ui/components/u-car-keyboard/props.js (已删除) uni_modules/uview-ui/components/u-car-keyboard/u-car-keyboard.vue (已删除) uni_modules/uview-ui/components/u-cell-group/props.js (已删除) uni_modules/uview-ui/components/u-cell-group/u-cell-group.vue (已删除) uni_modules/uview-ui/components/u-cell/props.js (已删除) uni_modules/uview-ui/components/u-cell/u-cell.vue (已删除) uni_modules/uview-ui/components/u-checkbox-group/props.js (已删除) uni_modules/uview-ui/components/u-checkbox-group/u-checkbox-group.vue (已删除) uni_modules/uview-ui/components/u-checkbox/props.js (已删除) uni_modules/uview-ui/components/u-checkbox/u-checkbox.vue (已删除) uni_modules/uview-ui/components/u-circle-progress/props.js (已删除) uni_modules/uview-ui/components/u-circle-progress/u-circle-progress.vue (已删除) uni_modules/uview-ui/components/u-code-input/props.js (已删除) uni_modules/uview-ui/components/u-code-input/u-code-input.vue (已删除) uni_modules/uview-ui/components/u-code/props.js (已删除) uni_modules/uview-ui/components/u-code/u-code.vue (已删除) uni_modules/uview-ui/components/u-col/props.js (已删除) uni_modules/uview-ui/components/u-col/u-col.vue (已删除) uni_modules/uview-ui/components/u-collapse-item/props.js (已删除) uni_modules/uview-ui/components/u-collapse-item/u-collapse-item.vue (已删除) uni_modules/uview-ui/components/u-collapse/props.js (已删除) uni_modules/uview-ui/components/u-collapse/u-collapse.vue (已删除) uni_modules/uview-ui/components/u-column-notice/props.js (已删除) uni_modules/uview-ui/components/u-column-notice/u-column-notice.vue (已删除) uni_modules/uview-ui/components/u-count-down/props.js (已删除) uni_modules/uview-ui/components/u-count-down/u-count-down.vue (已删除) uni_modules/uview-ui/components/u-count-down/utils.js (已删除) uni_modules/uview-ui/components/u-count-to/props.js (已删除) uni_modules/uview-ui/components/u-count-to/u-count-to.vue (已删除) uni_modules/uview-ui/components/u-datetime-picker/props.js (已删除) uni_modules/uview-ui/components/u-datetime-picker/u-datetime-picker.vue (已删除) uni_modules/uview-ui/components/u-divider/props.js (已删除) uni_modules/uview-ui/components/u-divider/u-divider.vue (已删除) uni_modules/uview-ui/components/u-dropdown-item/props.js (已删除) uni_modules/uview-ui/components/u-dropdown-item/u-dropdown-item.vue (已删除) uni_modules/uview-ui/components/u-dropdown/props.js (已删除) uni_modules/uview-ui/components/u-dropdown/u-dropdown.vue (已删除) uni_modules/uview-ui/components/u-empty/props.js (已删除) uni_modules/uview-ui/components/u-empty/u-empty.vue (已删除) uni_modules/uview-ui/components/u-form-item/props.js (已删除) uni_modules/uview-ui/components/u-form-item/u-form-item.vue (已删除) uni_modules/uview-ui/components/u-form/props.js (已删除) uni_modules/uview-ui/components/u-form/u-form.vue (已删除) uni_modules/uview-ui/components/u-gap/props.js (已删除) uni_modules/uview-ui/components/u-gap/u-gap.vue (已删除) uni_modules/uview-ui/components/u-grid-item/props.js (已删除) uni_modules/uview-ui/components/u-grid-item/u-grid-item.vue (已删除) uni_modules/uview-ui/components/u-grid/props.js (已删除) uni_modules/uview-ui/components/u-grid/u-grid.vue (已删除) uni_modules/uview-ui/components/u-icon/icons.js (已删除) uni_modules/uview-ui/components/u-icon/props.js (已删除) uni_modules/uview-ui/components/u-icon/u-icon.vue (已删除) uni_modules/uview-ui/components/u-image/props.js (已删除) uni_modules/uview-ui/components/u-image/u-image.vue (已删除) uni_modules/uview-ui/components/u-index-anchor/props.js (已删除) uni_modules/uview-ui/components/u-index-anchor/u-index-anchor.vue (已删除) uni_modules/uview-ui/components/u-index-item/props.js (已删除) uni_modules/uview-ui/components/u-index-item/u-index-item.vue (已删除) uni_modules/uview-ui/components/u-index-list/props.js (已删除) uni_modules/uview-ui/components/u-index-list/u-index-list.vue (已删除) uni_modules/uview-ui/components/u-input/props.js (已删除) uni_modules/uview-ui/components/u-input/u-input.vue (已删除) uni_modules/uview-ui/components/u-keyboard/props.js (已删除) uni_modules/uview-ui/components/u-keyboard/u-keyboard.vue (已删除) uni_modules/uview-ui/components/u-line-progress/props.js (已删除) uni_modules/uview-ui/components/u-line-progress/u-line-progress.vue (已删除) uni_modules/uview-ui/components/u-line/props.js (已删除) uni_modules/uview-ui/components/u-line/u-line.vue (已删除) uni_modules/uview-ui/components/u-link/props.js (已删除) uni_modules/uview-ui/components/u-link/u-link.vue (已删除) uni_modules/uview-ui/components/u-list-item/props.js (已删除) uni_modules/uview-ui/components/u-list-item/u-list-item.vue (已删除) uni_modules/uview-ui/components/u-list/props.js (已删除) uni_modules/uview-ui/components/u-list/u-list.vue (已删除) uni_modules/uview-ui/components/u-loading-icon/props.js (已删除) uni_modules/uview-ui/components/u-loading-icon/u-loading-icon.vue (已删除) uni_modules/uview-ui/components/u-loading-page/props.js (已删除) uni_modules/uview-ui/components/u-loading-page/u-loading-page.vue (已删除) uni_modules/uview-ui/components/u-loadmore/props.js (已删除) uni_modules/uview-ui/components/u-loadmore/u-loadmore.vue (已删除) uni_modules/uview-ui/components/u-modal/props.js (已删除) uni_modules/uview-ui/components/u-modal/u-modal.vue (已删除) uni_modules/uview-ui/components/u-navbar/props.js (已删除) uni_modules/uview-ui/components/u-navbar/u-navbar.vue (已删除) uni_modules/uview-ui/components/u-no-network/props.js (已删除) uni_modules/uview-ui/components/u-no-network/u-no-network.vue (已删除) uni_modules/uview-ui/components/u-notice-bar/props.js (已删除) uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.vue (已删除) uni_modules/uview-ui/components/u-notify/props.js (已删除) uni_modules/uview-ui/components/u-notify/u-notify.vue (已删除) uni_modules/uview-ui/components/u-number-box/props.js (已删除) uni_modules/uview-ui/components/u-number-box/u-number-box.vue (已删除) uni_modules/uview-ui/components/u-number-keyboard/props.js (已删除) uni_modules/uview-ui/components/u-number-keyboard/u-number-keyboard.vue (已删除) uni_modules/uview-ui/components/u-overlay/props.js (已删除) uni_modules/uview-ui/components/u-overlay/u-overlay.vue (已删除) uni_modules/uview-ui/components/u-parse/node/node.vue (已删除) uni_modules/uview-ui/components/u-parse/parser.js (已删除) uni_modules/uview-ui/components/u-parse/props.js (已删除) uni_modules/uview-ui/components/u-parse/u-parse.vue (已删除) uni_modules/uview-ui/components/u-picker-column/props.js (已删除) uni_modules/uview-ui/components/u-picker-column/u-picker-column.vue (已删除) uni_modules/uview-ui/components/u-picker/props.js (已删除) uni_modules/uview-ui/components/u-picker/u-picker.vue (已删除) uni_modules/uview-ui/components/u-popup/props.js (已删除) uni_modules/uview-ui/components/u-popup/u-popup.vue (已删除) uni_modules/uview-ui/components/u-radio-group/props.js (已删除) uni_modules/uview-ui/components/u-radio-group/u-radio-group.vue (已删除) uni_modules/uview-ui/components/u-radio/props.js (已删除) uni_modules/uview-ui/components/u-radio/u-radio.vue (已删除) uni_modules/uview-ui/components/u-rate/props.js (已删除) uni_modules/uview-ui/components/u-rate/u-rate.vue (已删除) uni_modules/uview-ui/components/u-read-more/props.js (已删除) uni_modules/uview-ui/components/u-read-more/u-read-more.vue (已删除) uni_modules/uview-ui/components/u-row-notice/props.js (已删除) uni_modules/uview-ui/components/u-row-notice/u-row-notice.vue (已删除) uni_modules/uview-ui/components/u-row/props.js (已删除) uni_modules/uview-ui/components/u-row/u-row.vue (已删除) uni_modules/uview-ui/components/u-safe-bottom/props.js (已删除) uni_modules/uview-ui/components/u-safe-bottom/u-safe-bottom.vue (已删除) uni_modules/uview-ui/components/u-scroll-list/nvue.js (已删除) uni_modules/uview-ui/components/u-scroll-list/other.js (已删除) uni_modules/uview-ui/components/u-scroll-list/props.js (已删除) uni_modules/uview-ui/components/u-scroll-list/scrollWxs.wxs (已删除) uni_modules/uview-ui/components/u-scroll-list/u-scroll-list.vue (已删除) uni_modules/uview-ui/components/u-search/props.js (已删除) uni_modules/uview-ui/components/u-search/u-search.vue (已删除) uni_modules/uview-ui/components/u-skeleton/props.js (已删除) uni_modules/uview-ui/components/u-skeleton/u-skeleton.vue (已删除) uni_modules/uview-ui/components/u-slider/mpother.js (已删除) uni_modules/uview-ui/components/u-slider/mpwxs.js (已删除) uni_modules/uview-ui/components/u-slider/mpwxs.wxs (已删除) uni_modules/uview-ui/components/u-slider/nvue - 副本.js (已删除) uni_modules/uview-ui/components/u-slider/nvue.js (已删除) uni_modules/uview-ui/components/u-slider/props.js (已删除) uni_modules/uview-ui/components/u-slider/u-slider.vue (已删除) uni_modules/uview-ui/components/u-status-bar/props.js (已删除) uni_modules/uview-ui/components/u-status-bar/u-status-bar.vue (已删除) uni_modules/uview-ui/components/u-steps-item/props.js (已删除) uni_modules/uview-ui/components/u-steps-item/u-steps-item.vue (已删除) uni_modules/uview-ui/components/u-steps/props.js (已删除) uni_modules/uview-ui/components/u-steps/u-steps.vue (已删除) uni_modules/uview-ui/components/u-sticky/props.js (已删除) uni_modules/uview-ui/components/u-sticky/u-sticky.vue (已删除) uni_modules/uview-ui/components/u-subsection/props.js (已删除) uni_modules/uview-ui/components/u-subsection/u-subsection.vue (已删除) uni_modules/uview-ui/components/u-swipe-action-item/index - backup.wxs (已删除) uni_modules/uview-ui/components/u-swipe-action-item/index.wxs (已删除) uni_modules/uview-ui/components/u-swipe-action-item/nvue - backup.js (已删除) uni_modules/uview-ui/components/u-swipe-action-item/nvue.js (已删除) uni_modules/uview-ui/components/u-swipe-action-item/props.js (已删除) uni_modules/uview-ui/components/u-swipe-action-item/u-swipe-action-item.vue (已删除) uni_modules/uview-ui/components/u-swipe-action-item/wxs.js (已删除) uni_modules/uview-ui/components/u-swipe-action/props.js (已删除) uni_modules/uview-ui/components/u-swipe-action/u-swipe-action.vue (已删除) uni_modules/uview-ui/components/u-swiper-indicator/props.js (已删除) uni_modules/uview-ui/components/u-swiper-indicator/u-swiper-indicator.vue (已删除) uni_modules/uview-ui/components/u-swiper/props.js (已删除) uni_modules/uview-ui/components/u-swiper/u-swiper.vue (已删除) uni_modules/uview-ui/components/u-switch/props.js (已删除) uni_modules/uview-ui/components/u-switch/u-switch.vue (已删除) uni_modules/uview-ui/components/u-tabbar-item/props.js (已删除) uni_modules/uview-ui/components/u-tabbar-item/u-tabbar-item.vue (已删除) uni_modules/uview-ui/components/u-tabbar/props.js (已删除) uni_modules/uview-ui/components/u-tabbar/u-tabbar.vue (已删除) uni_modules/uview-ui/components/u-table/props.js (已删除) uni_modules/uview-ui/components/u-table/u-table.vue (已删除) uni_modules/uview-ui/components/u-tabs-item/props.js (已删除) uni_modules/uview-ui/components/u-tabs-item/u-tabs-item.vue (已删除) uni_modules/uview-ui/components/u-tabs/props.js (已删除) uni_modules/uview-ui/components/u-tabs/u-tabs.vue (已删除) uni_modules/uview-ui/components/u-tag/props.js (已删除) uni_modules/uview-ui/components/u-tag/u-tag.vue (已删除) uni_modules/uview-ui/components/u-td/props.js (已删除) uni_modules/uview-ui/components/u-td/u-td.vue (已删除) uni_modules/uview-ui/components/u-text/props.js (已删除) uni_modules/uview-ui/components/u-text/u-text.vue (已删除) uni_modules/uview-ui/components/u-text/value.js (已删除) uni_modules/uview-ui/components/u-textarea/props.js (已删除) uni_modules/uview-ui/components/u-textarea/u-textarea.vue (已删除) uni_modules/uview-ui/components/u-toast/u-toast.vue (已删除) uni_modules/uview-ui/components/u-toolbar/props.js (已删除) uni_modules/uview-ui/components/u-toolbar/u-toolbar.vue (已删除) uni_modules/uview-ui/components/u-tooltip/clipboard.min.js (已删除) uni_modules/uview-ui/components/u-tooltip/props.js (已删除) uni_modules/uview-ui/components/u-tooltip/u-tooltip.vue (已删除) uni_modules/uview-ui/components/u-tr/props.js (已删除) uni_modules/uview-ui/components/u-tr/u-tr.vue (已删除) uni_modules/uview-ui/components/u-transition/nvue.ani-map.js (已删除) uni_modules/uview-ui/components/u-transition/props.js (已删除) uni_modules/uview-ui/components/u-transition/transition.js (已删除) uni_modules/uview-ui/components/u-transition/u-transition.vue (已删除) uni_modules/uview-ui/components/u-transition/vue.ani-style.scss (已删除) uni_modules/uview-ui/components/u-upload/mixin.js (已删除) uni_modules/uview-ui/components/u-upload/props.js (已删除) uni_modules/uview-ui/components/u-upload/u-upload.vue (已删除) uni_modules/uview-ui/components/u-upload/utils.js (已删除) uni_modules/uview-ui/components/uview-ui/uview-ui.vue (已删除) uni_modules/uview-ui/index.js (已删除) uni_modules/uview-ui/index.scss (已删除) uni_modules/uview-ui/libs/config/color.js (已删除) uni_modules/uview-ui/libs/config/config.js (已删除) uni_modules/uview-ui/libs/config/props.js (已删除) uni_modules/uview-ui/libs/config/props/actionSheet.js (已删除) uni_modules/uview-ui/libs/config/props/album.js (已删除) uni_modules/uview-ui/libs/config/props/alert.js (已删除) uni_modules/uview-ui/libs/config/props/avatar.js (已删除) uni_modules/uview-ui/libs/config/props/avatarGroup.js (已删除) uni_modules/uview-ui/libs/config/props/backtop.js (已删除) uni_modules/uview-ui/libs/config/props/badge.js (已删除) uni_modules/uview-ui/libs/config/props/button.js (已删除) uni_modules/uview-ui/libs/config/props/calendar.js (已删除) uni_modules/uview-ui/libs/config/props/carKeyboard.js (已删除) uni_modules/uview-ui/libs/config/props/cell.js (已删除) uni_modules/uview-ui/libs/config/props/cellGroup.js (已删除) uni_modules/uview-ui/libs/config/props/checkbox.js (已删除) uni_modules/uview-ui/libs/config/props/checkboxGroup.js (已删除) uni_modules/uview-ui/libs/config/props/circleProgress.js (已删除) uni_modules/uview-ui/libs/config/props/code.js (已删除) uni_modules/uview-ui/libs/config/props/codeInput.js (已删除) uni_modules/uview-ui/libs/config/props/col.js (已删除) uni_modules/uview-ui/libs/config/props/collapse.js (已删除) uni_modules/uview-ui/libs/config/props/collapseItem.js (已删除) uni_modules/uview-ui/libs/config/props/columnNotice.js (已删除) uni_modules/uview-ui/libs/config/props/countDown.js (已删除) uni_modules/uview-ui/libs/config/props/countTo.js (已删除) uni_modules/uview-ui/libs/config/props/datetimePicker.js (已删除) uni_modules/uview-ui/libs/config/props/divider.js (已删除) uni_modules/uview-ui/libs/config/props/empty.js (已删除) uni_modules/uview-ui/libs/config/props/form.js (已删除) uni_modules/uview-ui/libs/config/props/formItem.js (已删除) uni_modules/uview-ui/libs/config/props/gap.js (已删除) uni_modules/uview-ui/libs/config/props/grid.js (已删除) uni_modules/uview-ui/libs/config/props/gridItem.js (已删除) uni_modules/uview-ui/libs/config/props/icon.js (已删除) uni_modules/uview-ui/libs/config/props/image.js (已删除) uni_modules/uview-ui/libs/config/props/indexAnchor.js (已删除) uni_modules/uview-ui/libs/config/props/indexList.js (已删除) uni_modules/uview-ui/libs/config/props/input.js (已删除) uni_modules/uview-ui/libs/config/props/keyboard.js (已删除) uni_modules/uview-ui/libs/config/props/line.js (已删除) uni_modules/uview-ui/libs/config/props/lineProgress.js (已删除) uni_modules/uview-ui/libs/config/props/link.js (已删除) uni_modules/uview-ui/libs/config/props/list.js (已删除) uni_modules/uview-ui/libs/config/props/listItem.js (已删除) uni_modules/uview-ui/libs/config/props/loadingIcon.js (已删除) uni_modules/uview-ui/libs/config/props/loadingPage.js (已删除) uni_modules/uview-ui/libs/config/props/loadmore.js (已删除) uni_modules/uview-ui/libs/config/props/modal.js (已删除) uni_modules/uview-ui/libs/config/props/navbar.js (已删除) uni_modules/uview-ui/libs/config/props/noNetwork.js (已删除) uni_modules/uview-ui/libs/config/props/noticeBar.js (已删除) uni_modules/uview-ui/libs/config/props/notify.js (已删除) uni_modules/uview-ui/libs/config/props/numberBox.js (已删除) uni_modules/uview-ui/libs/config/props/numberKeyboard.js (已删除) uni_modules/uview-ui/libs/config/props/overlay.js (已删除) uni_modules/uview-ui/libs/config/props/parse.js (已删除) uni_modules/uview-ui/libs/config/props/picker.js (已删除) uni_modules/uview-ui/libs/config/props/popup.js (已删除) uni_modules/uview-ui/libs/config/props/radio.js (已删除) uni_modules/uview-ui/libs/config/props/radioGroup.js (已删除) uni_modules/uview-ui/libs/config/props/rate.js (已删除) uni_modules/uview-ui/libs/config/props/readMore.js (已删除) uni_modules/uview-ui/libs/config/props/row.js (已删除) uni_modules/uview-ui/libs/config/props/rowNotice.js (已删除) uni_modules/uview-ui/libs/config/props/scrollList.js (已删除) uni_modules/uview-ui/libs/config/props/search.js (已删除) uni_modules/uview-ui/libs/config/props/section.js (已删除) uni_modules/uview-ui/libs/config/props/skeleton.js (已删除) uni_modules/uview-ui/libs/config/props/slider.js (已删除) uni_modules/uview-ui/libs/config/props/statusBar.js (已删除) uni_modules/uview-ui/libs/config/props/steps.js (已删除) uni_modules/uview-ui/libs/config/props/stepsItem.js (已删除) uni_modules/uview-ui/libs/config/props/sticky.js (已删除) uni_modules/uview-ui/libs/config/props/subsection.js (已删除) uni_modules/uview-ui/libs/config/props/swipeAction.js (已删除) uni_modules/uview-ui/libs/config/props/swipeActionItem.js (已删除) uni_modules/uview-ui/libs/config/props/swiper.js (已删除) uni_modules/uview-ui/libs/config/props/swipterIndicator.js (已删除) uni_modules/uview-ui/libs/config/props/switch.js (已删除) uni_modules/uview-ui/libs/config/props/tabbar.js (已删除) uni_modules/uview-ui/libs/config/props/tabbarItem.js (已删除) uni_modules/uview-ui/libs/config/props/tabs.js (已删除) uni_modules/uview-ui/libs/config/props/tag.js (已删除) uni_modules/uview-ui/libs/config/props/text.js (已删除) uni_modules/uview-ui/libs/config/props/textarea.js (已删除) uni_modules/uview-ui/libs/config/props/toast.js (已删除) uni_modules/uview-ui/libs/config/props/toolbar.js (已删除) uni_modules/uview-ui/libs/config/props/tooltip.js (已删除) uni_modules/uview-ui/libs/config/props/transition.js (已删除) uni_modules/uview-ui/libs/config/props/upload.js (已删除) uni_modules/uview-ui/libs/config/zIndex.js (已删除) uni_modules/uview-ui/libs/css/color.scss (已删除) uni_modules/uview-ui/libs/css/common.scss (已删除) uni_modules/uview-ui/libs/css/components.scss (已删除) uni_modules/uview-ui/libs/css/flex.scss (已删除) uni_modules/uview-ui/libs/css/h5.scss (已删除) uni_modules/uview-ui/libs/css/mixin.scss (已删除) uni_modules/uview-ui/libs/css/mp.scss (已删除) uni_modules/uview-ui/libs/css/nvue.scss (已删除) uni_modules/uview-ui/libs/css/vue.scss (已删除) uni_modules/uview-ui/libs/function/colorGradient.js (已删除) uni_modules/uview-ui/libs/function/debounce.js (已删除) uni_modules/uview-ui/libs/function/digit.js (已删除) uni_modules/uview-ui/libs/function/index.js (已删除) uni_modules/uview-ui/libs/function/platform.js (已删除) uni_modules/uview-ui/libs/function/test.js (已删除) uni_modules/uview-ui/libs/function/throttle.js (已删除) uni_modules/uview-ui/libs/luch-request/adapters/index.js (已删除) uni_modules/uview-ui/libs/luch-request/core/InterceptorManager.js (已删除) uni_modules/uview-ui/libs/luch-request/core/Request.js (已删除) uni_modules/uview-ui/libs/luch-request/core/buildFullPath.js (已删除) uni_modules/uview-ui/libs/luch-request/core/defaults.js (已删除) uni_modules/uview-ui/libs/luch-request/core/dispatchRequest.js (已删除) uni_modules/uview-ui/libs/luch-request/core/mergeConfig.js (已删除) uni_modules/uview-ui/libs/luch-request/core/settle.js (已删除) uni_modules/uview-ui/libs/luch-request/helpers/buildURL.js (已删除) uni_modules/uview-ui/libs/luch-request/helpers/combineURLs.js (已删除) uni_modules/uview-ui/libs/luch-request/helpers/isAbsoluteURL.js (已删除) uni_modules/uview-ui/libs/luch-request/index.d.ts (已删除) uni_modules/uview-ui/libs/luch-request/index.js (已删除) uni_modules/uview-ui/libs/luch-request/utils.js (已删除) uni_modules/uview-ui/libs/luch-request/utils/clone.js (已删除) uni_modules/uview-ui/libs/mixin/button.js (已删除) uni_modules/uview-ui/libs/mixin/mixin.js (已删除) uni_modules/uview-ui/libs/mixin/mpMixin.js (已删除) uni_modules/uview-ui/libs/mixin/mpShare.js (已删除) uni_modules/uview-ui/libs/mixin/openType.js (已删除) uni_modules/uview-ui/libs/mixin/style.js (已删除) uni_modules/uview-ui/libs/mixin/touch.js (已删除) uni_modules/uview-ui/libs/util/async-validator.js (已删除) uni_modules/uview-ui/libs/util/calendar.js (已删除) uni_modules/uview-ui/libs/util/dayjs.js (已删除) uni_modules/uview-ui/libs/util/emitter.js (已删除) uni_modules/uview-ui/libs/util/route.js (已删除) uni_modules/uview-ui/package.json (已删除) uni_modules/uview-ui/theme.scss (已删除) utils/storage.js (已删除) utils/verify.js (已删除) vite.config.js vue.config.js (已删除) yarn.lock