commit c1d7b9bba21e1ca928c3759df0613a7251f719b3 Author: hflllll Date: Wed Aug 27 17:48:42 2025 +0800 '初始化' diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..99057ba --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +unpackage/ \ No newline at end of file diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..3a6b618 --- /dev/null +++ b/App.vue @@ -0,0 +1,23 @@ + + + diff --git a/api/http.js b/api/http.js new file mode 100644 index 0000000..5b44ba0 --- /dev/null +++ b/api/http.js @@ -0,0 +1,56 @@ +// 这里书写防抖,节流 +import request from "@/api/request"; + +// 全局管理的存储状态 +const requestControlMap = new Map() +const MAX_MAP_SIZE = 1000 // 防止内存轻易泄露 + +// 请求标识生成器(更稳健的版本) +const generateApiKey = (config) => { + const { method, url, header, debounce, throttle } = config + return `DEBOUNCE_AND_THROTTLE:${method}:${url}:${JSON.stringify(header)}:${debounce}:${throttle}`; +} + +export default function http (config) { + const apiKey = generateApiKey(config) + + // 空间保护 + if (requestControlMap.size > MAX_MAP_SIZE) { + requestControlMap.clear() // 清空缓存 + // 类型保护 + }else if (config.debounce > 0 && config.throttle > 0) { + throw new Error('请勿同时使用防抖和节流!') + } + + // 如果有防抖的需求 + if (config.debounce > 0 ){ + clearTimeout(requestControlMap.get(apiKey)?.timer) + + return new Promise((resolve, reject) => { + requestControlMap.set(apiKey, { + timer: setTimeout(() => { + // 防抖时间到了,清除缓存并发起请求 + requestControlMap.delete(apiKey) + request(config).then(resolve).catch(reject) + }, config.debounce), + timeStamp: Date.now() + }) + }) + } + + // 如果需要节流 + if (config.throttle > 0){ + const record = requestControlMap.get(apiKey) + if (record && Date.now() - record.lastTime < config.throttle) { + // 节流时间未到,不发起请求 + return Promise.reject(new Error('请求过于频繁')) + } + requestControlMap.set(apiKey, { + lastTime: Date.now(), + timeStamp: Date.now() + }) + } + + // 正常发起请求 + return request(config) +} \ No newline at end of file diff --git a/api/index.js b/api/index.js new file mode 100644 index 0000000..9d68de6 --- /dev/null +++ b/api/index.js @@ -0,0 +1,19 @@ +import user from '@/api/modules/user' +import shop from '@/api/modules/shop' +import score from '@/api/modules/score' +import config from '@/api/modules/config' +import home from '@/api/modules/home' +import activity from '@/api/modules/activity' +import login from '@/api/modules/login' +import community from '@/api/modules/community' + +export { + user, + shop, + score, + config, + home, + activity, + login, + community +} diff --git a/api/modules/activity.js b/api/modules/activity.js new file mode 100644 index 0000000..735b605 --- /dev/null +++ b/api/modules/activity.js @@ -0,0 +1,73 @@ +// import request from '@/api/request' +import http from '@/api/http' + +export default { + // 活动- 活动报名 + async applyActivity(data) { + return http({ + url: '/activity/applyActivity', + method: 'POST', + data + }) + }, + + // 活动- 收藏活动 + async collectionActivity(data) { + return http({ + url: '/activity/collectionActivity', + method: 'POST', + data + }) + }, + + // 活动- 获取活动详情 + async queryActivityById(data) { + return http({ + url: '/activity/queryActivityById', + method: 'GET', + data, + noToken: true + }) + }, + + // 活动- 获取我收藏的活动列表 + async queryActivityCollectionList(data) { + return http({ + url: '/activity/queryActivityCollectionList', + method: 'POST', + data + }) + }, + + // 活动- 获取活动列表 + async queryActivityList(data) { + return http({ + url: '/activity/queryActivityList', + method: 'GET', + data, + noToken: true, + debounce: 200, + // showLoading: true + }) + }, + + // 我的报名- 获取我报名的活动列表 + async queryApplyList(data) { + return http({ + url: '/activity/queryApplyList', + method: 'POST', + data, + // showLoading: true + }) + }, + + // 我的报名- 活动签到 + async signActivity(data) { + return http({ + url: '/activity/signActivity', + method: 'POST', + data, + // showToast: false + }) + }, +} \ No newline at end of file diff --git a/api/modules/community.js b/api/modules/community.js new file mode 100644 index 0000000..a87b6eb --- /dev/null +++ b/api/modules/community.js @@ -0,0 +1,26 @@ +// import request from "@/api/request"; +import http from "@/api/http"; + +export default { + // 社区- 获取帖子列表 + async queryPostList(data) { + return http({ + url: '/comment/queryPostList', + method: 'GET', + data, + noToken: true, + debounce: 200, + }) + }, + + // 社区- 上传帖子 + async addPost(data) { + return http({ + url: '/comment/addPost', + method: 'POST', + data, + showLoading: true, + // noToken: true + }) + } +} \ No newline at end of file diff --git a/api/modules/config.js b/api/modules/config.js new file mode 100644 index 0000000..ff7d6c7 --- /dev/null +++ b/api/modules/config.js @@ -0,0 +1,47 @@ +// import request from "@/api/request"; +import http from "@/api/http"; + +export default { + async queryCareerList() { + return http({ + url: '/config/queryCareerList', + method: 'GET', + noToken: true + }) + }, + + async queryConfigList() { + return http({ + url: '/config/queryConfigList', + method: 'GET', + noToken: true + }) + }, + + async queryQualificationList() { + return http({ + url: '/config/queryQualificationList', + method: 'GET', + noToken: true + }) + }, + + // 系统配置- 查询活动分类列表 + async queryCategoryActivityList() { + return http({ + url: '/config/queryCategoryActivityList', + method: 'GET', + noToken: true + }) + }, + + // 系统配置- 查询商品分类列表 + async queryCategoryGoodsList() { + return http({ + url: '/config/queryCategoryGoodsList', + method: 'GET', + noToken: true + }) + }, + +} \ No newline at end of file diff --git a/api/modules/home.js b/api/modules/home.js new file mode 100644 index 0000000..d74697d --- /dev/null +++ b/api/modules/home.js @@ -0,0 +1,53 @@ +// import request from "@/api/request"; +import http from "@/api/http"; + +export default { + // 首页- 申请成为志愿者 + async applyVolunteer(data) { + return http({ + url: '/index/applyVolunteer', + method: 'POST', + data + }) + }, + + // 首页- 查看志愿者信息复制接口复制文档复制地址 + // POST + // / community - admin / community / index /queryVolunteer + async queryVolunteer() { + return http({ + url: '/index/queryVolunteer', + method: 'POST' + }) + }, + // 首页- 获取banner图列表 + async queryBannerList(data) { + return http({ + url: '/index/queryBannerList', + method: 'GET', + noToken: true, + data + }) + }, + + // 首页- 获取公告详情 + async queryNoticeById(data) { + return http({ + url: '/index/queryNoticeById', + method: 'GET', + data, + noToken: true + }) + }, + + // 首页- 获取公告列表 + async queryNoticeList(data) { + return http({ + url: '/index/queryNoticeList', + method: 'GET', + data, + noToken: true + + }) + }, +} \ No newline at end of file diff --git a/api/modules/login.js b/api/modules/login.js new file mode 100644 index 0000000..2373a7b --- /dev/null +++ b/api/modules/login.js @@ -0,0 +1,25 @@ +// import request from "@/api/request"; +import http from "@/api/http"; +export default { + // 程序-绑定手机号码 + async bindPhone(data) { + return http({ + url: '/login/bindPhone', + method: 'GET', + data + }) + }, + + async login(data) { + return http({ + url: '/login/login', + method: 'GET', + data, + // header: { + // 'Content-Type': 'application/x-www-form-urlencoded' + // }, + showLoading: true, + noToken: true + }) + } +} \ No newline at end of file diff --git a/api/modules/score.js b/api/modules/score.js new file mode 100644 index 0000000..8ae61a2 --- /dev/null +++ b/api/modules/score.js @@ -0,0 +1,25 @@ +// import request from "@/api/request"; +import http from "@/api/http"; +export default { + // 可用积分- 获取积分明细列表 + async queryScoreList(data) { + return http({ + url: '/score/queryScoreList', + method: 'POST', + data, + debounce: 300 + }) + }, + + // 首页- 积分排行榜复制接口复制文档复制地址 + // POST + // / community - admin / community / score / queryScoreRank + async queryScoreRank(data) { + return http({ + url: '/score/queryScoreRank', + method: 'POST', + data, + noToken: true + }) + } +} \ No newline at end of file diff --git a/api/modules/shop.js b/api/modules/shop.js new file mode 100644 index 0000000..a3d8126 --- /dev/null +++ b/api/modules/shop.js @@ -0,0 +1,55 @@ +// import request from "@/api/request"; +import http from "@/api/http"; + +export default { + // 首页-兑换商品 + async buyGoods(data) { + return http({ + url: '/goods/buyGoods', + method: 'POST', + data, + showLoading: true + }) + }, + + // 首页- 收藏商品 + async collectionGoods(data) { + return http({ + url: '/goods/collectionGoods', + method: 'POST', + data, + showLoading: true + }) + }, + + // 首页- 获取商品详情 + async queryGoodsById(data) { + return http({ + url: '/goods/queryGoodsById', + method: 'GET', + data, + noToken: true + }) + }, + + // 商品收藏- 获取我收藏的商品列表 + async queryGoodsCollectionList(data) { + return http({ + url: '/goods/queryGoodsCollectionList', + method: 'POST', + data + }) + }, + + // 首页- 获取商品列表 + async queryGoodsList(data) { + return http({ + url: '/goods/queryGoodsList', + method: 'GET', + data, + noToken: true, + debounce: 200, + // showLoading: true + }) + } +} \ No newline at end of file diff --git a/api/modules/user.js b/api/modules/user.js new file mode 100644 index 0000000..4d964a7 --- /dev/null +++ b/api/modules/user.js @@ -0,0 +1,49 @@ +// import request from "@/api/request"; +import http from "@/api/http"; + +export default { + // 兑换记录- 确认取货 + async finishOrder(data) { + return http ({ + url: '/order/finishOrder', + method: 'POST', + data + }) + }, + + // 兑换记录- 查看订单详情 + async queryOrderById(data) { + return http({ + url: '/order/queryOrderById', + method: 'GET', + data + }) + }, + + // 兑换记录- 查看订单列表 + async queryOrderList(data) { + return http({ + url: '/order/queryOrderList', + method: 'GET', + data, + // showLoading: true + }) + }, + + // 我的资料- 获取个人信息 + async queryUser() { + return http({ + url: '/userInfo/queryUser', + method: 'GET' + }) + }, + + // 我的资料- 修改个人信息 + async updateUser(data) { + return http({ + url: '/userInfo/updateUser', + method: 'POST', + data + }) + }, +} \ No newline at end of file diff --git a/api/request.js b/api/request.js new file mode 100644 index 0000000..44fcb20 --- /dev/null +++ b/api/request.js @@ -0,0 +1,115 @@ +import config from "@/config"; + +export default function request ( { + url = '', + method = 'GET', + data = {}, + showLoading = false, + header = {} , + noToken = false, // 不需要token的接口 + showToast = true // 默认显示失败的提示 + +} ) { + if (showLoading) uni.showLoading({title: '加载中'}) + if(!noToken) { + const token = uni.getStorageSync('token') + if (token) { + header['X-Access-Token'] = token + }else { + uni.showToast({ + title: '请先登录', + icon: 'none' + }) + uni.reLaunch({ url: '/subPages/login/login' }) + return + } + } + return new Promise((resolve, reject) => { + uni.request({ + url: config.baseURL + url, + method, + data, + header: { + 'Content-Type': 'application/x-www-form-urlencoded', + ...header + }, + success: (res) => { + console.log(`Success ${method} ${url}`, res); + + // 优先处理业务逻辑响应 + if (res.statusCode === 200 && res.data) { + // 业务成功 + if (res.data.code === 200 ) { + resolve(res.data) + return + } + + // 业务失败但有具体错误信息 + const errorMsg = res.data.message || '请求失败' + + if (showToast) { + uni.showToast({ + title: errorMsg, + icon: 'none' + }) + } + reject({ + code: res.data.code, + message: errorMsg, + data: res.data + }) + return + } + + // 处理HTTP状态码错误(无有效响应体的情况) + const error = { + code: res.statusCode, + message: '网络请求错误' + } + + switch (res.statusCode) { + case 401: + case 403: + uni.removeStorageSync('token') + uni.reLaunch({ url: '/subPages/login/login' }) + error.message = '登录已过期,请重新登录' + break; + case 404: + error.message = '资源不存在' + break; + case 500: + error.message = '服务器错误' + break; + } + if (showToast) { + uni.showToast({ + title: error.message, + icon: 'none' + }) + } + reject(error) + }, + fail: (err) => { + console.log(`Fail ${method} ${url}`, err); + const errorMsg = err.errMsg || '请求失败' + if (showToast) { + uni.showToast({ + title: errorMsg, + icon: 'none' + }) + } + + reject({ + code: -1, + message: errorMsg, + data: err + }) + }, + complete: () => { + if (showLoading) { + uni.hideLoading() + } + } + }) + }) +} \ No newline at end of file diff --git a/config/index.js b/config/index.js new file mode 100644 index 0000000..6f13caf --- /dev/null +++ b/config/index.js @@ -0,0 +1,77 @@ +// 环境配置相关 +/** + * 环境配置 + * env 环境变量字段 + * netConfig 网络配置 + * aliOSSConfig 阿里云配置 + * debounceConfig 防抖相关配置 + */ +const env = 'development' + + +// 全局配置 +const config = { + // 网络全局配置 + netConfig: { + development: { + baseURL: 'http://augcl.natapp1.cc/community-admin/community', + }, + + testing: { + baseURL: 'https://mulinyouni.augcl.com/community-admin/community', + }, + + production: { + baseURL: 'https://www.mulinyouni.com/community-admin/community', + } + }, + + // 阿里云配置 + aliOSSConfig :{ + development: { + aliOSS_accessKey: 'LTAI5tQSs47izVy8DLVdwUU9', + aliOSS_secretKey: 'qHI7C3PaXYZySr84HTToviC71AYlFq', + aliOSS_bucketName: 'hanhaiimage', + endpoint: 'oss-cn-shenzhen.aliyuncs.com', + staticDomain: 'https://image.hhlm1688.com/' + }, + testing: { + aliOSS_accessKey: 'LTAI5tQSs47izVy8DLVdwUU9', + aliOSS_secretKey: 'qHI7C3PaXYZySr84HTToviC71AYlFq', + aliOSS_bucketName: 'hanhaiimage', + endpoint: 'oss-cn-shenzhen.aliyuncs.com', + staticDomain: 'https://image.hhlm1688.com/' + }, + production: { + aliOSS_accessKey: 'LTAI5tRqoxbC9BKrWJduKDVT', + aliOSS_secretKey: 's5ANiOq4kYpzuMLQhqPMYL4IybMR7L', + aliOSS_bucketName: 'mulinyouni', + endpoint: 'oss-cn-beijing.aliyuncs.com', + staticDomain: 'https://image.mulinyouni.com/' + }, + }, + + // 防抖相关配置 + debounceConfig : { + DEFAULT_DEBOUNCE_TIME: 0, + DEFAULT_THROTTLE_TIME: 0, + MAX_MAP_SIZE: 1000, + } +} + +// 全自动导入并生成平坦化结构 +const finalConfig = Object.keys(config).reduce((finallyConfig, key) => { + let tempConfig = {} + if (key === 'netConfig' || key === 'aliOSSConfig') { + + tempConfig = config[key][env] + }else { + tempConfig = config[key] + } + return { + ...finallyConfig, + ...tempConfig, + } +}, {}) + +export default finalConfig \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..c3ff205 --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..f9858da --- /dev/null +++ b/main.js @@ -0,0 +1,44 @@ +import App from './App' + +// #ifndef VUE3 +import GlobalPopup from '@/pages/components/GlobalPopup.vue' +import Vue from 'vue' +import './uni.promisify.adaptor' +import * as api from '@/api' +import utils from '@/utils' +import config from '@/config' +import MixinConfig from '@/mixins/config' + +import store from '@/stores' + +Vue.config.productionTip = false + +// 全局混入获取配置相关信息的方法 +Vue.mixin(MixinConfig) + +// 全局注册弹窗组件 +Vue.component('GlobalPopup', GlobalPopup) + +// 将api挂载到Vue的原型 +Vue.prototype.$api = api +Vue.prototype.$utils = utils +Vue.prototype.$config = config // 这里是静态config + +App.mpType = 'app' +const app = new Vue({ + ...App, + store +}) + +app.$mount() +// #endif + +// #ifdef VUE3 +import { createSSRApp } from 'vue' +export function createApp() { + const app = createSSRApp(App) + return { + app + } +} +// #endif \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..652af75 --- /dev/null +++ b/manifest.json @@ -0,0 +1,78 @@ +{ + "name" : "木邻有你", + "appid" : "__UNI__DDC9EFD", + "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" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios" : {}, + /* SDK配置 */ + "sdkConfigs" : {} + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "wxb6f11363a55f9535", + "setting" : { + "urlCheck" : false + }, + "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ], + "permission" : { + "scope.userLocation" : { + "desc" : "你的位置信息将用于定位" + } + }, + "usingComponents" : true + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "uniStatistics" : { + "enable" : false + }, + "vueVersion" : "2" +} diff --git a/mixins/config.js b/mixins/config.js new file mode 100644 index 0000000..024cf32 --- /dev/null +++ b/mixins/config.js @@ -0,0 +1,49 @@ +export default { + data() { + return { + + } + }, + methods: { + // 自定义分享内容 + mixinCustomShare() { + return { + } + } + }, + computed: { + // 获取全局配置的文本 + configParamText() { + return key => this.$store.state.configList[key]?.paramText || '默认文本' + }, + // 获取全局配置的图片 + configParamImage() { + return key => this.$store.state.configList[key]?.paramImage || '/static/默认图片.png' + }, + // 获取全局配置的富文本 + configParamTextarea() { + return key => this.$store.state.configList[key]?.paramTextarea || '默认富文本' + }, + // 默认的全局分享参数 + GShare() { + return { + title: this.configParamText('config_app_name'), + desc: this.configParamText('share_desc'), + imageUrl: this.configParamImage('config_logo'), + path: '/pages/index/index' + } + } + }, + onShareAppMessage() { + return { + ...this.GShare, + ...this.mixinCustomShare() + } + }, + onShareTimeline() { + return { + ...this.GShare, + ...this.mixinCustomShare() + } + } +} diff --git a/mixins/list.js b/mixins/list.js new file mode 100644 index 0000000..cd5ae7d --- /dev/null +++ b/mixins/list.js @@ -0,0 +1,133 @@ +// 简化版列表的混入 +export default { + data() { + return { + list: [], + pageNo : 1, + pageSize : 10, + mixinListApi: '', + isLoading: false, + hasMore: true, + // 额外返回出去的数据 + extraData: null, + // 每次更新数据后执行的函数 可以进行数据处理 + afterUpdateDataFn: function() {}, + // 每次更新数据前执行的函数, + beforeUpdateDataFn: function() {}, + // 混入配置 + mixinListConfig: { + // 数据返回的直接路径 + responsePath: 'result.records', + // 列表是否需要下拉刷新 + isPullDownRefresh: true, + // 列表是否需要上拉加载 + isReachBottomLoad: true, + // 额外返回出去的数据的路径 + extraDataPath: '' + } + } + }, + computed: { + // 自定义onShow前会执行的函数 + mixinFnBeforePageShow() { + return function() {} + } + }, + methods: { + // 获取文件的自定义传参 -- 可以在页面中重写 + mixinSetParams() { + return {} + }, + // 解析分路径获取嵌套值 + resolvePath(obj, path) { + if (path){ + return path.split('.').reduce((acc, key) => (acc && acc[key] !== undefined ? acc[key] : null), obj) + }else { + return obj + } + }, + // 初始化分页 + initPage(){ + this.pageNo = 1, + this.hasMore = true + }, + // 获取列表 + async getList(isRefresh = false) { + if (!this.hasMore) { + return + } + this.isLoading = true + const apiMethod = this.resolvePath(this.$api, this.mixinListApi) + if (typeof apiMethod !== 'function') { + console.log('mixinApi不存在', this.mixinListApi); + return + } + // 每次更新数据前执行的函数 + if (this.beforeUpdateDataFn) { + this.beforeUpdateDataFn(this.list) + } + const res = await apiMethod({ + pageNo: this.pageNo, + pageSize: this.pageSize, + ...this.mixinSetParams() + }) + const resData = this.resolvePath(res, this.mixinListConfig.responsePath) || [] + if (res.code === 200) { + // 如果没有值了 + if (!resData.length) { + this.hasMore = false + uni.showToast({ + title: '暂无更多数据', + icon: 'none' + }) + }else { + this.pageNo++ + } + + if (isRefresh ) { + // 如果是刷新,直接覆盖 + this.list = resData + + } else { + this.list = [...this.list, ...resData] + } + + // 如果有额外数据的路径,刷新后,需要将额外数据也刷新 + if (this.mixinListConfig.extraDataPath !== '') { + this.extraData = this.resolvePath(res, this.mixinListConfig.extraDataPath) + } + } + // 每次更新数据后执行的函数 + if (this.afterUpdateDataFn) { + this.afterUpdateDataFn(this.list) + } + // 如果有在加载中 + if (this.isLoading) { + this.isLoading = false + } + // 有过有在下拉加载 + uni.stopPullDownRefresh() + }, + }, + async onShow() { + // if (!this.list.length) { + if (this.mixinFnBeforePageShow) this.mixinFnBeforePageShow() + this.initPage() + await this.getList(true) + // } + }, + async onPullDownRefresh() { + // 在下拉还没结束前 不做任何操作 + if (this.isLoading) { + return + } + this.initPage() + await this.getList(true) + }, + async onReachBottom() { + if (this.isLoading) { + return + } + await this.getList() + } +} \ No newline at end of file diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..1a7087c --- /dev/null +++ b/pages.json @@ -0,0 +1,242 @@ +{ + "pages": [ + { + "path": "pages/index/index", + "style": { + "navigationStyle": "custom", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/index/shop", + "style": { + "navigationStyle": "custom", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/index/activity", + "style": { + "navigationStyle": "custom", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/index/community", + "style": { + "navigationBarTitleText": "社区", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/index/my", + "style": { + "navigationStyle": "custom", + "enablePullDownRefresh": true + } + } + ], + "subPackages":[ + { + "root": "subPages", + "pages":[ + { + "path": "index/announcement", + "style": { + "navigationBarTitleText": "公告", + "enablePullDownRefresh": true + } + }, + { + "path": "login/login", + "style": { + "navigationStyle": "custom" + } + }, + { + "path": "login/userInfo", + "style": { + "navigationBarTitleText": "用户信息", + "navigationBarBackButtonHidden": true + } + }, + { + "path": "index/announcementDetail", + "style": { + "navigationBarTitleText": "公告详情" + } + }, + { + "path": "index/ranking", + "style": { + "navigationStyle": "custom", + "enablePullDownRefresh": true + } + }, + { + "path": "index/volunteerApply", + "style": { + "navigationBarTitleText": "申请志愿者" + } + }, + { + "path": "index/organizationIntroduction", + "style": { + "navigationBarTitleText": "组织介绍" + } + }, + { + "path": "index/activityCalendar", + "style": { + "navigationBarTitleText": "活动日历", + "enablePullDownRefresh": true + } + }, + { + "path": "index/activityDetail", + "style": { + "navigationBarTitleText": "活动详情", + "enablePullDownRefresh": true + } + }, + { + "path": "shop/goodsDetail", + "style": { + "navigationBarTitleText": "商品详情" + } + }, + { + "path": "shop/pointsDetail", + "style": { + "navigationBarTitleText": "积分详情", + "enablePullDownRefresh": true + } + }, + { + "path": "community/publishPost", + "style": { + "navigationBarTitleText": "发布动态" + } + }, + { + "path": "my/activityFavorites", + "style": { + "navigationBarTitleText": "活动收藏", + "enablePullDownRefresh": true + } + }, + { + "path": "my/myProfile", + "style": { + "navigationBarTitleText": "我的资料" + } + }, + { + "path": "my/myRegistrations", + "style": { + "navigationBarTitleText": "我的报名", + "enablePullDownRefresh": true + } + }, + { + "path": "my/myActivityDetail", + "style": { + "navigationBarTitleText": "活动详情" + } + }, + { + "path": "my/exchangeRecord", + "style": { + "navigationBarTitleText": "兑换记录", + "enablePullDownRefresh": true + } + }, + { + "path": "my/exchangeDetail", + "style": { + "navigationBarTitleText": "商品详情", + "enablePullDownRefresh": true + } + }, + { + "path": "my/productFavorites", + "style": { + "navigationBarTitleText": "商品收藏", + "enablePullDownRefresh": true + } + }, + { + "path": "my/activityCheckin", + "style": { + "navigationBarTitleText": "活动签到", + "enablePullDownRefresh": true + } + }, + { + "path": "my/checkinCode", + "style": { + "navigationBarTitleText": "签到码" + } + }, + { + "path": "my/signupSuccess", + "style": { + "navigationBarTitleText": "报名成功!" + } + } + ] + } + ], + + "preloadRule": { + "pages/index/index": { + "network": "all", + "packages": ["subPages"] + } + }, + "globalStyle": { + "navigationBarTextStyle": "white", + "navigationBarTitleText": "uni-app", + "navigationBarBackgroundColor": "#1488DB", + "backgroundColor": "#218CDD" + // "enablePullDownRefresh": true + }, + "tabBar": { + "color": "#999999", + "selectedColor": "#2E66F4", + "borderStyle": "white", + "backgroundColor": "#ffffff", + "list": [ + { + "pagePath": "pages/index/index", + "text": "主页", + "iconPath": "static/主页.png", + "selectedIconPath": "static/主页_点击.png" + }, + { + "pagePath": "pages/index/shop", + "text": "商城", + "iconPath": "static/商城.png", + "selectedIconPath": "static/商城_点击.png" + }, + { + "pagePath": "pages/index/activity", + "text": "活动", + "iconPath": "static/活动.png", + "selectedIconPath": "static/活动_点击.png" + }, + { + "pagePath": "pages/index/community", + "text": "社区", + "iconPath": "static/社区.png", + "selectedIconPath": "static/社区_点击.png" + }, + { + "pagePath": "pages/index/my", + "text": "我的", + "iconPath": "static/我的.png", + "selectedIconPath": "static/我的_点击.png" + } + ] + } +} diff --git a/pages/components/GlobalPopup.vue b/pages/components/GlobalPopup.vue new file mode 100644 index 0000000..fe6281c --- /dev/null +++ b/pages/components/GlobalPopup.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/pages/components/HomePageNav.vue b/pages/components/HomePageNav.vue new file mode 100644 index 0000000..ab67941 --- /dev/null +++ b/pages/components/HomePageNav.vue @@ -0,0 +1,23 @@ + + + \ No newline at end of file diff --git a/pages/components/Search.vue b/pages/components/Search.vue new file mode 100644 index 0000000..3148a4f --- /dev/null +++ b/pages/components/Search.vue @@ -0,0 +1,226 @@ + + + + + \ No newline at end of file diff --git a/pages/components/index/RecommendedActivities.vue b/pages/components/index/RecommendedActivities.vue new file mode 100644 index 0000000..147848e --- /dev/null +++ b/pages/components/index/RecommendedActivities.vue @@ -0,0 +1,236 @@ + + + + + \ No newline at end of file diff --git a/pages/components/index/VolunteerFeatures.vue b/pages/components/index/VolunteerFeatures.vue new file mode 100644 index 0000000..9b1636d --- /dev/null +++ b/pages/components/index/VolunteerFeatures.vue @@ -0,0 +1,143 @@ + + + + + \ No newline at end of file diff --git a/pages/components/index/VolunteerHeader.vue b/pages/components/index/VolunteerHeader.vue new file mode 100644 index 0000000..47eb749 --- /dev/null +++ b/pages/components/index/VolunteerHeader.vue @@ -0,0 +1,192 @@ + + + + + \ No newline at end of file diff --git a/pages/components/index/VolunteerRanking.vue b/pages/components/index/VolunteerRanking.vue new file mode 100644 index 0000000..fd67d23 --- /dev/null +++ b/pages/components/index/VolunteerRanking.vue @@ -0,0 +1,224 @@ + + + + + \ No newline at end of file diff --git a/pages/components/searchDemo.vue b/pages/components/searchDemo.vue new file mode 100644 index 0000000..bd97741 --- /dev/null +++ b/pages/components/searchDemo.vue @@ -0,0 +1,158 @@ + + + + + \ No newline at end of file diff --git a/pages/components/shop/PointsCard.vue b/pages/components/shop/PointsCard.vue new file mode 100644 index 0000000..f10c86b --- /dev/null +++ b/pages/components/shop/PointsCard.vue @@ -0,0 +1,146 @@ + + + + + \ No newline at end of file diff --git a/pages/components/shop/ShopContent.vue b/pages/components/shop/ShopContent.vue new file mode 100644 index 0000000..ab9eb89 --- /dev/null +++ b/pages/components/shop/ShopContent.vue @@ -0,0 +1,423 @@ + + + + + \ No newline at end of file diff --git a/pages/index/activity.vue b/pages/index/activity.vue new file mode 100644 index 0000000..c60172f --- /dev/null +++ b/pages/index/activity.vue @@ -0,0 +1,403 @@ + + + + + \ No newline at end of file diff --git a/pages/index/community.vue b/pages/index/community.vue new file mode 100644 index 0000000..d2b6e75 --- /dev/null +++ b/pages/index/community.vue @@ -0,0 +1,425 @@ + + + + + \ No newline at end of file diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..817ba6f --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/pages/index/my.vue b/pages/index/my.vue new file mode 100644 index 0000000..c03714b --- /dev/null +++ b/pages/index/my.vue @@ -0,0 +1,375 @@ + + + + + \ No newline at end of file diff --git a/pages/index/shop.vue b/pages/index/shop.vue new file mode 100644 index 0000000..9633dc2 --- /dev/null +++ b/pages/index/shop.vue @@ -0,0 +1,66 @@ + + + + + \ No newline at end of file diff --git a/static/bannerImage.png b/static/bannerImage.png new file mode 100644 index 0000000..59e330e Binary files /dev/null and b/static/bannerImage.png differ diff --git a/static/china-regions.json b/static/china-regions.json new file mode 100644 index 0000000..2a7d395 --- /dev/null +++ b/static/china-regions.json @@ -0,0 +1,10597 @@ +[ + { + "name": "北京市", + "children": [ + { + "name": "北京市", + "children": [ + { + "name": "东城区", + "children": [] + }, + { + "name": "西城区", + "children": [] + }, + { + "name": "朝阳区", + "children": [] + }, + { + "name": "丰台区", + "children": [] + }, + { + "name": "石景山区", + "children": [] + }, + { + "name": "海淀区", + "children": [] + }, + { + "name": "门头沟区", + "children": [] + }, + { + "name": "房山区", + "children": [] + }, + { + "name": "通州区", + "children": [] + }, + { + "name": "顺义区", + "children": [] + }, + { + "name": "昌平区", + "children": [] + }, + { + "name": "大兴区", + "children": [] + }, + { + "name": "怀柔区", + "children": [] + }, + { + "name": "平谷区", + "children": [] + }, + { + "name": "密云区", + "children": [] + }, + { + "name": "延庆区", + "children": [] + } + ] + } + ] + }, + { + "name": "天津市", + "children": [ + { + "name": "天津市", + "children": [ + { + "name": "和平区", + "children": [] + }, + { + "name": "河东区", + "children": [] + }, + { + "name": "河西区", + "children": [] + }, + { + "name": "南开区", + "children": [] + }, + { + "name": "河北区", + "children": [] + }, + { + "name": "红桥区", + "children": [] + }, + { + "name": "东丽区", + "children": [] + }, + { + "name": "西青区", + "children": [] + }, + { + "name": "津南区", + "children": [] + }, + { + "name": "北辰区", + "children": [] + }, + { + "name": "武清区", + "children": [] + }, + { + "name": "宝坻区", + "children": [] + }, + { + "name": "滨海新区", + "children": [] + }, + { + "name": "宁河区", + "children": [] + }, + { + "name": "静海区", + "children": [] + }, + { + "name": "蓟州区", + "children": [] + } + ] + } + ] + }, + { + "name": "上海市", + "children": [ + { + "name": "上海市", + "children": [ + { + "name": "黄浦区", + "children": [] + }, + { + "name": "徐汇区", + "children": [] + }, + { + "name": "长宁区", + "children": [] + }, + { + "name": "静安区", + "children": [] + }, + { + "name": "普陀区", + "children": [] + }, + { + "name": "虹口区", + "children": [] + }, + { + "name": "杨浦区", + "children": [] + }, + { + "name": "闵行区", + "children": [] + }, + { + "name": "宝山区", + "children": [] + }, + { + "name": "嘉定区", + "children": [] + }, + { + "name": "浦东新区", + "children": [] + }, + { + "name": "金山区", + "children": [] + }, + { + "name": "松江区", + "children": [] + }, + { + "name": "青浦区", + "children": [] + }, + { + "name": "奉贤区", + "children": [] + }, + { + "name": "崇明区", + "children": [] + } + ] + } + ] + }, + { + "name": "重庆市", + "children": [ + { + "name": "重庆市", + "children": [ + { + "name": "万州区", + "children": [] + }, + { + "name": "涪陵区", + "children": [] + }, + { + "name": "渝中区", + "children": [] + }, + { + "name": "大渡口区", + "children": [] + }, + { + "name": "江北区", + "children": [] + }, + { + "name": "沙坪坝区", + "children": [] + }, + { + "name": "九龙坡区", + "children": [] + }, + { + "name": "南岸区", + "children": [] + }, + { + "name": "北碚区", + "children": [] + }, + { + "name": "綦江区", + "children": [] + }, + { + "name": "大足区", + "children": [] + }, + { + "name": "渝北区", + "children": [] + }, + { + "name": "巴南区", + "children": [] + }, + { + "name": "黔江区", + "children": [] + }, + { + "name": "长寿区", + "children": [] + }, + { + "name": "江津区", + "children": [] + }, + { + "name": "合川区", + "children": [] + }, + { + "name": "永川区", + "children": [] + }, + { + "name": "南川区", + "children": [] + }, + { + "name": "璧山区", + "children": [] + }, + { + "name": "铜梁区", + "children": [] + }, + { + "name": "潼南区", + "children": [] + }, + { + "name": "荣昌区", + "children": [] + }, + { + "name": "开州区", + "children": [] + }, + { + "name": "梁平区", + "children": [] + }, + { + "name": "武隆区", + "children": [] + } + ] + } + ] + }, + { + "name": "河北省", + "children": [ + { + "name": "石家庄市", + "children": [ + { + "name": "长安区" + }, + { + "name": "桥西区" + }, + { + "name": "新华区" + }, + { + "name": "井陉矿区" + }, + { + "name": "裕华区" + }, + { + "name": "藁城区" + }, + { + "name": "鹿泉区" + }, + { + "name": "栾城区" + }, + { + "name": "井陉县" + }, + { + "name": "正定县" + }, + { + "name": "行唐县" + }, + { + "name": "灵寿县" + }, + { + "name": "高邑县" + }, + { + "name": "深泽县" + }, + { + "name": "赞皇县" + }, + { + "name": "无极县" + }, + { + "name": "平山县" + }, + { + "name": "元氏县" + }, + { + "name": "赵县" + }, + { + "name": "辛集市" + }, + { + "name": "晋州市" + }, + { + "name": "新乐市" + } + ] + }, + { + "name": "唐山市", + "children": [ + { + "name": "路南区" + }, + { + "name": "路北区" + }, + { + "name": "古冶区" + }, + { + "name": "开平区" + }, + { + "name": "丰南区" + }, + { + "name": "丰润区" + }, + { + "name": "曹妃甸区" + }, + { + "name": "滦州市" + }, + { + "name": "滦南县" + }, + { + "name": "乐亭县" + }, + { + "name": "迁西县" + }, + { + "name": "玉田县" + }, + { + "name": "遵化市" + }, + { + "name": "迁安市" + } + ] + }, + { + "name": "秦皇岛市", + "children": [ + { + "name": "海港区" + }, + { + "name": "山海关区" + }, + { + "name": "北戴河区" + }, + { + "name": "抚宁区" + }, + { + "name": "青龙满族自治县" + }, + { + "name": "昌黎县" + }, + { + "name": "卢龙县" + } + ] + }, + { + "name": "邯郸市", + "children": [ + { + "name": "邯山区" + }, + { + "name": "丛台区" + }, + { + "name": "复兴区" + }, + { + "name": "峰峰矿区" + }, + { + "name": "肥乡区" + }, + { + "name": "永年区" + }, + { + "name": "临漳县" + }, + { + "name": "成安县" + }, + { + "name": "大名县" + }, + { + "name": "涉县" + }, + { + "name": "磁县" + }, + { + "name": "邱县" + }, + { + "name": "鸡泽县" + }, + { + "name": "广平县" + }, + { + "name": "馆陶县" + }, + { + "name": "魏县" + }, + { + "name": "曲周县" + }, + { + "name": "武安市" + } + ] + }, + { + "name": "邢台市", + "children": [ + { + "name": "桥东区" + }, + { + "name": "桥西区" + }, + { + "name": "邢台县" + }, + { + "name": "临城县" + }, + { + "name": "内丘县" + }, + { + "name": "柏乡县" + }, + { + "name": "隆尧县" + }, + { + "name": "任县" + }, + { + "name": "南和县" + }, + { + "name": "宁晋县" + }, + { + "name": "巨鹿县" + }, + { + "name": "新河县" + }, + { + "name": "广宗县" + }, + { + "name": "平乡县" + }, + { + "name": "威县" + }, + { + "name": "清河县" + }, + { + "name": "临西县" + }, + { + "name": "南宫市" + }, + { + "name": "沙河市" + } + ] + }, + { + "name": "保定市", + "children": [ + { + "name": "竞秀区" + }, + { + "name": "莲池区" + }, + { + "name": "满城区" + }, + { + "name": "清苑区" + }, + { + "name": "徐水区" + }, + { + "name": "涞水县" + }, + { + "name": "阜平县" + }, + { + "name": "定兴县" + }, + { + "name": "唐县" + }, + { + "name": "高阳县" + }, + { + "name": "容城县" + }, + { + "name": "涞源县" + }, + { + "name": "望都县" + }, + { + "name": "安新县" + }, + { + "name": "易县" + }, + { + "name": "曲阳县" + }, + { + "name": "蠡县" + }, + { + "name": "顺平县" + }, + { + "name": "博野县" + }, + { + "name": "雄县" + }, + { + "name": "涿州市" + }, + { + "name": "定州市" + }, + { + "name": "安国市" + }, + { + "name": "高碑店市" + } + ] + }, + { + "name": "张家口市", + "children": [ + { + "name": "桥东区" + }, + { + "name": "桥西区" + }, + { + "name": "宣化区" + }, + { + "name": "下花园区" + }, + { + "name": "万全区" + }, + { + "name": "崇礼区" + }, + { + "name": "张北县" + }, + { + "name": "康保县" + }, + { + "name": "沽源县" + }, + { + "name": "尚义县" + }, + { + "name": "蔚县" + }, + { + "name": "阳原县" + }, + { + "name": "怀安县" + }, + { + "name": "怀来县" + }, + { + "name": "涿鹿县" + }, + { + "name": "赤城县" + } + ] + }, + { + "name": "承德市", + "children": [ + { + "name": "双桥区" + }, + { + "name": "双滦区" + }, + { + "name": "鹰手营子矿区" + }, + { + "name": "承德县" + }, + { + "name": "兴隆县" + }, + { + "name": "平泉市" + }, + { + "name": "滦平县" + }, + { + "name": "隆化县" + }, + { + "name": "丰宁满族自治县" + }, + { + "name": "宽城满族自治县" + }, + { + "name": "围场满族蒙古族自治县" + } + ] + }, + { + "name": "沧州市", + "children": [ + { + "name": "新华区" + }, + { + "name": "运河区" + }, + { + "name": "沧县" + }, + { + "name": "青县" + }, + { + "name": "东光县" + }, + { + "name": "海兴县" + }, + { + "name": "盐山县" + }, + { + "name": "肃宁县" + }, + { + "name": "南皮县" + }, + { + "name": "吴桥县" + }, + { + "name": "献县" + }, + { + "name": "孟村回族自治县" + }, + { + "name": "泊头市" + }, + { + "name": "任丘市" + }, + { + "name": "黄骅市" + }, + { + "name": "河间市" + } + ] + }, + { + "name": "廊坊市", + "children": [ + { + "name": "安次区" + }, + { + "name": "广阳区" + }, + { + "name": "固安县" + }, + { + "name": "永清县" + }, + { + "name": "香河县" + }, + { + "name": "大城县" + }, + { + "name": "文安县" + }, + { + "name": "大厂回族自治县" + }, + { + "name": "霸州市" + }, + { + "name": "三河市" + } + ] + }, + { + "name": "衡水市", + "children": [ + { + "name": "桃城区" + }, + { + "name": "冀州区" + }, + { + "name": "枣强县" + }, + { + "name": "武邑县" + }, + { + "name": "武强县" + }, + { + "name": "饶阳县" + }, + { + "name": "安平县" + }, + { + "name": "故城县" + }, + { + "name": "景县" + }, + { + "name": "阜城县" + }, + { + "name": "深州市" + } + ] + } + ] + }, + { + "name": "山西省", + "children": [ + { + "name": "太原市", + "children": [ + { + "name": "小店区" + }, + { + "name": "迎泽区" + }, + { + "name": "杏花岭区" + }, + { + "name": "尖草坪区" + }, + { + "name": "万柏林区" + }, + { + "name": "晋源区" + }, + { + "name": "清徐县" + }, + { + "name": "阳曲县" + }, + { + "name": "娄烦县" + }, + { + "name": "古交市" + } + ] + }, + { + "name": "大同市", + "children": [ + { + "name": "新荣区" + }, + { + "name": "平城区" + }, + { + "name": "云冈区" + }, + { + "name": "云州区" + }, + { + "name": "阳高县" + }, + { + "name": "天镇县" + }, + { + "name": "广灵县" + }, + { + "name": "灵丘县" + }, + { + "name": "浑源县" + }, + { + "name": "左云县" + } + ] + }, + { + "name": "阳泉市", + "children": [ + { + "name": "城区" + }, + { + "name": "矿区" + }, + { + "name": "郊区" + }, + { + "name": "平定县" + }, + { + "name": "盂县" + } + ] + }, + { + "name": "长治市", + "children": [ + { + "name": "潞州区" + }, + { + "name": "上党区" + }, + { + "name": "屯留区" + }, + { + "name": "潞城区" + }, + { + "name": "襄垣县" + }, + { + "name": "平顺县" + }, + { + "name": "黎城县" + }, + { + "name": "壶关县" + }, + { + "name": "长子县" + }, + { + "name": "武乡县" + }, + { + "name": "沁县" + }, + { + "name": "沁源县" + } + ] + }, + { + "name": "晋城市", + "children": [ + { + "name": "城区" + }, + { + "name": "沁水县" + }, + { + "name": "阳城县" + }, + { + "name": "陵川县" + }, + { + "name": "泽州县" + }, + { + "name": "高平市" + } + ] + }, + { + "name": "朔州市", + "children": [ + { + "name": "朔城区" + }, + { + "name": "平鲁区" + }, + { + "name": "山阴县" + }, + { + "name": "应县" + }, + { + "name": "右玉县" + }, + { + "name": "怀仁市" + } + ] + }, + { + "name": "晋中市", + "children": [ + { + "name": "榆次区" + }, + { + "name": "太谷区" + }, + { + "name": "榆社县" + }, + { + "name": "左权县" + }, + { + "name": "和顺县" + }, + { + "name": "昔阳县" + }, + { + "name": "寿阳县" + }, + { + "name": "祁县" + }, + { + "name": "平遥县" + }, + { + "name": "灵石县" + }, + { + "name": "介休市" + } + ] + }, + { + "name": "运城市", + "children": [ + { + "name": "盐湖区" + }, + { + "name": "临猗县" + }, + { + "name": "万荣县" + }, + { + "name": "闻喜县" + }, + { + "name": "稷山县" + }, + { + "name": "新绛县" + }, + { + "name": "绛县" + }, + { + "name": "垣曲县" + }, + { + "name": "夏县" + }, + { + "name": "平陆县" + }, + { + "name": "芮城县" + }, + { + "name": "永济市" + }, + { + "name": "河津市" + } + ] + }, + { + "name": "忻州市", + "children": [ + { + "name": "忻府区" + }, + { + "name": "定襄县" + }, + { + "name": "五台县" + }, + { + "name": "代县" + }, + { + "name": "繁峙县" + }, + { + "name": "宁武县" + }, + { + "name": "静乐县" + }, + { + "name": "神池县" + }, + { + "name": "五寨县" + }, + { + "name": "岢岚县" + }, + { + "name": "河曲县" + }, + { + "name": "保德县" + }, + { + "name": "偏关县" + }, + { + "name": "原平市" + } + ] + }, + { + "name": "临汾市", + "children": [ + { + "name": "尧都区" + }, + { + "name": "曲沃县" + }, + { + "name": "翼城县" + }, + { + "name": "襄汾县" + }, + { + "name": "洪洞县" + }, + { + "name": "古县" + }, + { + "name": "安泽县" + }, + { + "name": "浮山县" + }, + { + "name": "吉县" + }, + { + "name": "乡宁县" + }, + { + "name": "大宁县" + }, + { + "name": "隰县" + }, + { + "name": "永和县" + }, + { + "name": "蒲县" + }, + { + "name": "汾西县" + }, + { + "name": "侯马市" + }, + { + "name": "霍州市" + } + ] + }, + { + "name": "吕梁市", + "children": [ + { + "name": "离石区" + }, + { + "name": "文水县" + }, + { + "name": "交城县" + }, + { + "name": "兴县" + }, + { + "name": "临县" + }, + { + "name": "柳林县" + }, + { + "name": "石楼县" + }, + { + "name": "岚县" + }, + { + "name": "方山县" + }, + { + "name": "中阳县" + }, + { + "name": "交口县" + }, + { + "name": "孝义市" + }, + { + "name": "汾阳市" + } + ] + } + ] + }, + { + "name": "内蒙古自治区", + "children": [ + { + "name": "呼和浩特市", + "children": [ + { + "name": "新城区" + }, + { + "name": "回民区" + }, + { + "name": "玉泉区" + }, + { + "name": "赛罕区" + }, + { + "name": "土默特左旗" + }, + { + "name": "托克托县" + }, + { + "name": "和林格尔县" + }, + { + "name": "清水河县" + }, + { + "name": "武川县" + } + ] + }, + { + "name": "包头市", + "children": [ + { + "name": "东河区" + }, + { + "name": "昆都仑区" + }, + { + "name": "青山区" + }, + { + "name": "石拐区" + }, + { + "name": "白云鄂博矿区" + }, + { + "name": "九原区" + }, + { + "name": "土默特右旗" + }, + { + "name": "固阳县" + }, + { + "name": "达尔罕茂明安联合旗" + } + ] + }, + { + "name": "乌海市", + "children": [ + { + "name": "海勃湾区" + }, + { + "name": "海南区" + }, + { + "name": "乌达区" + } + ] + }, + { + "name": "赤峰市", + "children": [ + { + "name": "红山区" + }, + { + "name": "元宝山区" + }, + { + "name": "松山区" + }, + { + "name": "阿鲁科尔沁旗" + }, + { + "name": "巴林左旗" + }, + { + "name": "巴林右旗" + }, + { + "name": "林西县" + }, + { + "name": "克什克腾旗" + }, + { + "name": "翁牛特旗" + }, + { + "name": "喀喇沁旗" + }, + { + "name": "宁城县" + }, + { + "name": "敖汉旗" + } + ] + }, + { + "name": "通辽市", + "children": [ + { + "name": "科尔沁区" + }, + { + "name": "科尔沁左翼中旗" + }, + { + "name": "科尔沁左翼后旗" + }, + { + "name": "开鲁县" + }, + { + "name": "库伦旗" + }, + { + "name": "奈曼旗" + }, + { + "name": "扎鲁特旗" + }, + { + "name": "霍林郭勒市" + } + ] + }, + { + "name": "鄂尔多斯市", + "children": [ + { + "name": "东胜区" + }, + { + "name": "康巴什区" + }, + { + "name": "达拉特旗" + }, + { + "name": "准格尔旗" + }, + { + "name": "鄂托克前旗" + }, + { + "name": "鄂托克旗" + }, + { + "name": "杭锦旗" + }, + { + "name": "乌审旗" + }, + { + "name": "伊金霍洛旗" + } + ] + }, + { + "name": "呼伦贝尔市", + "children": [ + { + "name": "海拉尔区" + }, + { + "name": "扎赉诺尔区" + }, + { + "name": "阿荣旗" + }, + { + "name": "莫力达瓦达斡尔族自治旗" + }, + { + "name": "鄂伦春自治旗" + }, + { + "name": "鄂温克族自治旗" + }, + { + "name": "陈巴尔虎旗" + }, + { + "name": "新巴尔虎左旗" + }, + { + "name": "新巴尔虎右旗" + }, + { + "name": "满洲里市" + }, + { + "name": "牙克石市" + }, + { + "name": "扎兰屯市" + }, + { + "name": "额尔古纳市" + }, + { + "name": "根河市" + } + ] + }, + { + "name": "巴彦淖尔市", + "children": [ + { + "name": "临河区" + }, + { + "name": "五原县" + }, + { + "name": "磴口县" + }, + { + "name": "乌拉特前旗" + }, + { + "name": "乌拉特中旗" + }, + { + "name": "乌拉特后旗" + }, + { + "name": "杭锦后旗" + } + ] + }, + { + "name": "乌兰察布市", + "children": [ + { + "name": "集宁区" + }, + { + "name": "卓资县" + }, + { + "name": "化德县" + }, + { + "name": "商都县" + }, + { + "name": "兴和县" + }, + { + "name": "凉城县" + }, + { + "name": "察哈尔右翼前旗" + }, + { + "name": "察哈尔右翼中旗" + }, + { + "name": "察哈尔右翼后旗" + }, + { + "name": "四子王旗" + }, + { + "name": "丰镇市" + } + ] + }, + { + "name": "兴安盟", + "children": [ + { + "name": "乌兰浩特市" + }, + { + "name": "阿尔山市" + }, + { + "name": "科尔沁右翼前旗" + }, + { + "name": "科尔沁右翼中旗" + }, + { + "name": "扎赉特旗" + }, + { + "name": "突泉县" + } + ] + }, + { + "name": "锡林郭勒盟", + "children": [ + { + "name": "二连浩特市" + }, + { + "name": "锡林浩特市" + }, + { + "name": "阿巴嘎旗" + }, + { + "name": "苏尼特左旗" + }, + { + "name": "苏尼特右旗" + }, + { + "name": "东乌珠穆沁旗" + }, + { + "name": "西乌珠穆沁旗" + }, + { + "name": "太仆寺旗" + }, + { + "name": "镶黄旗" + }, + { + "name": "正镶白旗" + }, + { + "name": "正蓝旗" + }, + { + "name": "多伦县" + } + ] + }, + { + "name": "阿拉善盟", + "children": [ + { + "name": "阿拉善左旗" + }, + { + "name": "阿拉善右旗" + }, + { + "name": "额济纳旗" + } + ] + } + ] + }, + { + "name": "辽宁省", + "children": [ + { + "name": "沈阳市", + "children": [ + { + "name": "和平区" + }, + { + "name": "沈河区" + }, + { + "name": "大东区" + }, + { + "name": "皇姑区" + }, + { + "name": "铁西区" + }, + { + "name": "苏家屯区" + }, + { + "name": "浑南区" + }, + { + "name": "沈北新区" + }, + { + "name": "于洪区" + }, + { + "name": "辽中区" + }, + { + "name": "康平县" + }, + { + "name": "法库县" + }, + { + "name": "新民市" + } + ] + }, + { + "name": "大连市", + "children": [ + { + "name": "中山区" + }, + { + "name": "西岗区" + }, + { + "name": "沙河口区" + }, + { + "name": "甘井子区" + }, + { + "name": "旅顺口区" + }, + { + "name": "金州区" + }, + { + "name": "普兰店区" + }, + { + "name": "长海县" + }, + { + "name": "瓦房店市" + }, + { + "name": "庄河市" + } + ] + }, + { + "name": "鞍山市", + "children": [ + { + "name": "铁东区" + }, + { + "name": "铁西区" + }, + { + "name": "立山区" + }, + { + "name": "千山区" + }, + { + "name": "台安县" + }, + { + "name": "岫岩满族自治县" + }, + { + "name": "海城市" + } + ] + }, + { + "name": "抚顺市", + "children": [ + { + "name": "新抚区" + }, + { + "name": "东洲区" + }, + { + "name": "望花区" + }, + { + "name": "顺城区" + }, + { + "name": "抚顺县" + }, + { + "name": "新宾满族自治县" + }, + { + "name": "清原满族自治县" + } + ] + }, + { + "name": "本溪市", + "children": [ + { + "name": "平山区" + }, + { + "name": "溪湖区" + }, + { + "name": "明山区" + }, + { + "name": "南芬区" + }, + { + "name": "本溪满族自治县" + }, + { + "name": "桓仁满族自治县" + } + ] + }, + { + "name": "丹东市", + "children": [ + { + "name": "元宝区" + }, + { + "name": "振兴区" + }, + { + "name": "振安区" + }, + { + "name": "宽甸满族自治县" + }, + { + "name": "东港市" + }, + { + "name": "凤城市" + } + ] + }, + { + "name": "锦州市", + "children": [ + { + "name": "古塔区" + }, + { + "name": "凌河区" + }, + { + "name": "太和区" + }, + { + "name": "黑山县" + }, + { + "name": "义县" + }, + { + "name": "凌海市" + }, + { + "name": "北镇市" + } + ] + }, + { + "name": "营口市", + "children": [ + { + "name": "站前区" + }, + { + "name": "西市区" + }, + { + "name": "鲅鱼圈区" + }, + { + "name": "老边区" + }, + { + "name": "盖州市" + }, + { + "name": "大石桥市" + } + ] + }, + { + "name": "阜新市", + "children": [ + { + "name": "海州区" + }, + { + "name": "新邱区" + }, + { + "name": "太平区" + }, + { + "name": "清河门区" + }, + { + "name": "细河区" + }, + { + "name": "阜新蒙古族自治县" + }, + { + "name": "彰武县" + } + ] + }, + { + "name": "辽阳市", + "children": [ + { + "name": "白塔区" + }, + { + "name": "文圣区" + }, + { + "name": "宏伟区" + }, + { + "name": "弓长岭区" + }, + { + "name": "太子河区" + }, + { + "name": "辽阳县" + }, + { + "name": "灯塔市" + } + ] + }, + { + "name": "盘锦市", + "children": [ + { + "name": "双台子区" + }, + { + "name": "兴隆台区" + }, + { + "name": "大洼区" + }, + { + "name": "盘山县" + } + ] + }, + { + "name": "铁岭市", + "children": [ + { + "name": "银州区" + }, + { + "name": "清河区" + }, + { + "name": "铁岭县" + }, + { + "name": "西丰县" + }, + { + "name": "昌图县" + }, + { + "name": "调兵山市" + }, + { + "name": "开原市" + } + ] + }, + { + "name": "朝阳市", + "children": [ + { + "name": "双塔区" + }, + { + "name": "龙城区" + }, + { + "name": "朝阳县" + }, + { + "name": "建平县" + }, + { + "name": "喀喇沁左翼蒙古族自治县" + }, + { + "name": "北票市" + }, + { + "name": "凌源市" + } + ] + }, + { + "name": "葫芦岛市", + "children": [ + { + "name": "连山区" + }, + { + "name": "龙港区" + }, + { + "name": "南票区" + }, + { + "name": "绥中县" + }, + { + "name": "建昌县" + }, + { + "name": "兴城市" + } + ] + } + ] + }, + { + "name": "吉林省", + "children": [ + { + "name": "长春市", + "children": [ + { + "name": "南关区" + }, + { + "name": "宽城区" + }, + { + "name": "朝阳区" + }, + { + "name": "二道区" + }, + { + "name": "绿园区" + }, + { + "name": "双阳区" + }, + { + "name": "九台区" + }, + { + "name": "农安县" + }, + { + "name": "榆树市" + }, + { + "name": "德惠市" + } + ] + }, + { + "name": "吉林市", + "children": [ + { + "name": "昌邑区" + }, + { + "name": "龙潭区" + }, + { + "name": "船营区" + }, + { + "name": "丰满区" + }, + { + "name": "永吉县" + }, + { + "name": "蛟河市" + }, + { + "name": "桦甸市" + }, + { + "name": "舒兰市" + }, + { + "name": "磐石市" + } + ] + }, + { + "name": "四平市", + "children": [ + { + "name": "铁西区" + }, + { + "name": "铁东区" + }, + { + "name": "梨树县" + }, + { + "name": "伊通满族自治县" + }, + { + "name": "公主岭市" + }, + { + "name": "双辽市" + } + ] + }, + { + "name": "辽源市", + "children": [ + { + "name": "龙山区" + }, + { + "name": "西安区" + }, + { + "name": "东丰县" + }, + { + "name": "东辽县" + } + ] + }, + { + "name": "通化市", + "children": [ + { + "name": "东昌区" + }, + { + "name": "二道江区" + }, + { + "name": "通化县" + }, + { + "name": "辉南县" + }, + { + "name": "柳河县" + }, + { + "name": "梅河口市" + }, + { + "name": "集安市" + } + ] + }, + { + "name": "白山市", + "children": [ + { + "name": "浑江区" + }, + { + "name": "江源区" + }, + { + "name": "抚松县" + }, + { + "name": "靖宇县" + }, + { + "name": "长白朝鲜族自治县" + }, + { + "name": "临江市" + } + ] + }, + { + "name": "松原市", + "children": [ + { + "name": "宁江区" + }, + { + "name": "前郭尔罗斯蒙古族自治县" + }, + { + "name": "长岭县" + }, + { + "name": "乾安县" + }, + { + "name": "扶余市" + } + ] + }, + { + "name": "白城市", + "children": [ + { + "name": "洮北区" + }, + { + "name": "镇赊县" + }, + { + "name": "通榆县" + }, + { + "name": "洮南市" + }, + { + "name": "大安市" + } + ] + }, + { + "name": "延边朝鲜族自治州", + "children": [ + { + "name": "延吉市" + }, + { + "name": "图们市" + }, + { + "name": "敦化市" + }, + { + "name": "珲春市" + }, + { + "name": "龙井市" + }, + { + "name": "和龙市" + }, + { + "name": "汪清县" + }, + { + "name": "安图县" + } + ] + } + ] + }, + { + "name": "黑龙江省", + "children": [ + { + "name": "哈尔滨市", + "children": [ + { + "name": "道里区" + }, + { + "name": "南岗区" + }, + { + "name": "道外区" + }, + { + "name": "平房区" + }, + { + "name": "松北区" + }, + { + "name": "香坊区" + }, + { + "name": "呼兰区" + }, + { + "name": "阿城区" + }, + { + "name": "双城区" + }, + { + "name": "依兰县" + }, + { + "name": "方正县" + }, + { + "name": "宾县" + }, + { + "name": "巴彦县" + }, + { + "name": "木兰县" + }, + { + "name": "通河县" + }, + { + "name": "延寿县" + }, + { + "name": "尚志市" + }, + { + "name": "五常市" + } + ] + }, + { + "name": "齐齐哈尔市", + "children": [ + { + "name": "龙沙区" + }, + { + "name": "建华区" + }, + { + "name": "铁锋区" + }, + { + "name": "昂昂溪区" + }, + { + "name": "富拉尔基区" + }, + { + "name": "碾子山区" + }, + { + "name": "梅里斯达斡尔族区" + }, + { + "name": "龙江县" + }, + { + "name": "依安县" + }, + { + "name": "泰来县" + }, + { + "name": "甘南县" + }, + { + "name": "富裕县" + }, + { + "name": "克山县" + }, + { + "name": "克东县" + }, + { + "name": "拜泉县" + }, + { + "name": "讷河市" + } + ] + }, + { + "name": "鸡西市", + "children": [ + { + "name": "鸡冠区" + }, + { + "name": "恒山区" + }, + { + "name": "滴道区" + }, + { + "name": "梨树区" + }, + { + "name": "城子河区" + }, + { + "name": "麻山区" + }, + { + "name": "鸡东县" + }, + { + "name": "虎林市" + }, + { + "name": "密山市" + } + ] + }, + { + "name": "鹤岗市", + "children": [ + { + "name": "向阳区" + }, + { + "name": "工农区" + }, + { + "name": "南山区" + }, + { + "name": "兴安区" + }, + { + "name": "东山区" + }, + { + "name": "兴山区" + }, + { + "name": "萝北县" + }, + { + "name": "绥滨县" + } + ] + }, + { + "name": "双鸭山市", + "children": [ + { + "name": "尖山区" + }, + { + "name": "岭东区" + }, + { + "name": "四方台区" + }, + { + "name": "宝山区" + }, + { + "name": "集贤县" + }, + { + "name": "友谊县" + }, + { + "name": "宝清县" + }, + { + "name": "饶河县" + } + ] + }, + { + "name": "大庆市", + "children": [ + { + "name": "萨尔图区" + }, + { + "name": "龙凤区" + }, + { + "name": "让胡路区" + }, + { + "name": "红岗区" + }, + { + "name": "大同区" + }, + { + "name": "肇州县" + }, + { + "name": "肇源县" + }, + { + "name": "林甸县" + }, + { + "name": "杜尔伯特蒙古族自治县" + } + ] + }, + { + "name": "伊春市", + "children": [ + { + "name": "伊美区" + }, + { + "name": "乌翠区" + }, + { + "name": "友好区" + }, + { + "name": "嘉荫县" + }, + { + "name": "汤旺县" + }, + { + "name": "丰林县" + }, + { + "name": "大箐山县" + }, + { + "name": "南岔县" + }, + { + "name": "金林区" + }, + { + "name": "铁力市" + } + ] + }, + { + "name": "佳木斯市", + "children": [ + { + "name": "向阳区" + }, + { + "name": "前进区" + }, + { + "name": "东风区" + }, + { + "name": "郊区" + }, + { + "name": "桦南县" + }, + { + "name": "桦川县" + }, + { + "name": "汤原县" + }, + { + "name": "同江市" + }, + { + "name": "富锦市" + }, + { + "name": "抚远市" + } + ] + }, + { + "name": "七台河市", + "children": [ + { + "name": "新兴区" + }, + { + "name": "桃山区" + }, + { + "name": "茄子河区" + }, + { + "name": "勃利县" + } + ] + }, + { + "name": "牡丹江市", + "children": [ + { + "name": "东安区" + }, + { + "name": "阳明区" + }, + { + "name": "爱民区" + }, + { + "name": "西安区" + }, + { + "name": "林口县" + }, + { + "name": "绥芬河市" + }, + { + "name": "海林市" + }, + { + "name": "宁安市" + }, + { + "name": "穆棱市" + }, + { + "name": "东宁市" + } + ] + }, + { + "name": "黑河市", + "children": [ + { + "name": "爱辉区" + }, + { + "name": "嫩江市" + }, + { + "name": "逊克县" + }, + { + "name": "孙吴县" + }, + { + "name": "北安市" + }, + { + "name": "五大连池市" + } + ] + }, + { + "name": "绥化市", + "children": [ + { + "name": "北林区" + }, + { + "name": "望奎县" + }, + { + "name": "兰西县" + }, + { + "name": "青冈县" + }, + { + "name": "庆安县" + }, + { + "name": "明水县" + }, + { + "name": "绥棱县" + }, + { + "name": "安达市" + }, + { + "name": "肇东市" + }, + { + "name": "海伦市" + } + ] + }, + { + "name": "大兴安岭地区", + "children": [ + { + "name": "呼玛县" + }, + { + "name": "塔河县" + }, + { + "name": "漠河市" + } + ] + } + ] + }, + { + "name": "江苏省", + "children": [ + { + "name": "南京市", + "children": [ + { + "name": "玄武区" + }, + { + "name": "秦淮区" + }, + { + "name": "建邺区" + }, + { + "name": "鼓楼区" + }, + { + "name": "浦口区" + }, + { + "name": "栖霞区" + }, + { + "name": "雨花台区" + }, + { + "name": "江宁区" + }, + { + "name": "六合区" + }, + { + "name": "溧水区" + }, + { + "name": "高淳区" + } + ] + }, + { + "name": "无锡市", + "children": [ + { + "name": "锡山区" + }, + { + "name": "惠山区" + }, + { + "name": "滨湖区" + }, + { + "name": "梁溪区" + }, + { + "name": "新吴区" + }, + { + "name": "江阴市" + }, + { + "name": "宜兴市" + } + ] + }, + { + "name": "徐州市", + "children": [ + { + "name": "鼓楼区" + }, + { + "name": "云龙区" + }, + { + "name": "贾汪区" + }, + { + "name": "泉山区" + }, + { + "name": "铜山区" + }, + { + "name": "丰县" + }, + { + "name": "沛县" + }, + { + "name": "睢宁县" + }, + { + "name": "新沂市" + }, + { + "name": "邳州市" + } + ] + }, + { + "name": "常州市", + "children": [ + { + "name": "天宁区" + }, + { + "name": "钟楼区" + }, + { + "name": "新北区" + }, + { + "name": "武进区" + }, + { + "name": "金坛区" + }, + { + "name": "溧阳市" + } + ] + }, + { + "name": "苏州市", + "children": [ + { + "name": "虎丘区" + }, + { + "name": "吴中区" + }, + { + "name": "相城区" + }, + { + "name": "姑苏区" + }, + { + "name": "吴江区" + }, + { + "name": "常熟市" + }, + { + "name": "张家港市" + }, + { + "name": "昆山市" + }, + { + "name": "太仓市" + } + ] + }, + { + "name": "南通市", + "children": [ + { + "name": "崇川区" + }, + { + "name": "港闸区" + }, + { + "name": "通州区" + }, + { + "name": "海安市" + }, + { + "name": "如东县" + }, + { + "name": "启东市" + }, + { + "name": "如皋市" + }, + { + "name": "海门区" + } + ] + }, + { + "name": "连云港市", + "children": [ + { + "name": "连云区" + }, + { + "name": "海州区" + }, + { + "name": "赣榆区" + }, + { + "name": "东海县" + }, + { + "name": "灌云县" + }, + { + "name": "灌南县" + } + ] + }, + { + "name": "淮安市", + "children": [ + { + "name": "淮安区" + }, + { + "name": "淮阴区" + }, + { + "name": "清江浦区" + }, + { + "name": "洪泽区" + }, + { + "name": "涟水县" + }, + { + "name": "盱眙县" + }, + { + "name": "金湖县" + } + ] + }, + { + "name": "盐城市", + "children": [ + { + "name": "亭湖区" + }, + { + "name": "盐都区" + }, + { + "name": "大丰区" + }, + { + "name": "响水县" + }, + { + "name": "滨海县" + }, + { + "name": "阜宁县" + }, + { + "name": "射阳县" + }, + { + "name": "建湖县" + }, + { + "name": "东台市" + } + ] + }, + { + "name": "扬州市", + "children": [ + { + "name": "广陵区" + }, + { + "name": "邗江区" + }, + { + "name": "江都区" + }, + { + "name": "宝应县" + }, + { + "name": "仪征市" + }, + { + "name": "高邮市" + } + ] + }, + { + "name": "镇江市", + "children": [ + { + "name": "京口区" + }, + { + "name": "润州区" + }, + { + "name": "丹徒区" + }, + { + "name": "丹阳市" + }, + { + "name": "扬中市" + }, + { + "name": "句容市" + } + ] + }, + { + "name": "泰州市", + "children": [ + { + "name": "海陵区" + }, + { + "name": "高港区" + }, + { + "name": "姜堰区" + }, + { + "name": "兴化市" + }, + { + "name": "靖江市" + }, + { + "name": "泰兴市" + } + ] + }, + { + "name": "宿迁市", + "children": [ + { + "name": "宿城区" + }, + { + "name": "宿豫区" + }, + { + "name": "沭阳县" + }, + { + "name": "泗阳县" + }, + { + "name": "泗洪县" + } + ] + } + ] + }, + { + "name": "浙江省", + "children": [ + { + "name": "杭州市", + "children": [ + { + "name": "上城区" + }, + { + "name": "拱墅区" + }, + { + "name": "西湖区" + }, + { + "name": "滨江区" + }, + { + "name": "萧山区" + }, + { + "name": "余杭区" + }, + { + "name": "富阳区" + }, + { + "name": "临安区" + }, + { + "name": "桐庐县" + }, + { + "name": "淳安县" + }, + { + "name": "建德市" + } + ] + }, + { + "name": "宁波市", + "children": [ + { + "name": "海曙区" + }, + { + "name": "江北区" + }, + { + "name": "北仑区" + }, + { + "name": "镇海区" + }, + { + "name": "鄞州区" + }, + { + "name": "奉化区" + }, + { + "name": "象山县" + }, + { + "name": "宁海县" + }, + { + "name": "余姚市" + }, + { + "name": "慈溪市" + } + ] + }, + { + "name": "温州市", + "children": [ + { + "name": "鹿城区" + }, + { + "name": "龙湾区" + }, + { + "name": "瓯海区" + }, + { + "name": "洞头区" + }, + { + "name": "永嘉县" + }, + { + "name": "平阳县" + }, + { + "name": "苍南县" + }, + { + "name": "文成县" + }, + { + "name": "泰顺县" + }, + { + "name": "瑞安市" + }, + { + "name": "乐清市" + } + ] + }, + { + "name": "嘉兴市", + "children": [ + { + "name": "南湖区" + }, + { + "name": "秀洲区" + }, + { + "name": "嘉善县" + }, + { + "name": "海盐县" + }, + { + "name": "海宁市" + }, + { + "name": "平湖市" + }, + { + "name": "桐乡市" + } + ] + }, + { + "name": "湖州市", + "children": [ + { + "name": "吴兴区" + }, + { + "name": "南浔区" + }, + { + "name": "德清县" + }, + { + "name": "长兴县" + }, + { + "name": "安吉县" + } + ] + }, + { + "name": "绍兴市", + "children": [ + { + "name": "越城区" + }, + { + "name": "柯桥区" + }, + { + "name": "上虞区" + }, + { + "name": "新昌县" + }, + { + "name": "诸暨市" + }, + { + "name": "嵊州市" + } + ] + }, + { + "name": "金华市", + "children": [ + { + "name": "婺城区" + }, + { + "name": "金东区" + }, + { + "name": "武义县" + }, + { + "name": "浦江县" + }, + { + "name": "磐安县" + }, + { + "name": "兰溪市" + }, + { + "name": "义乌市" + }, + { + "name": "东阳市" + }, + { + "name": "永康市" + } + ] + }, + { + "name": "衢州市", + "children": [ + { + "name": "柯城区" + }, + { + "name": "衢江区" + }, + { + "name": "常山县" + }, + { + "name": "开化县" + }, + { + "name": "龙游县" + }, + { + "name": "江山市" + } + ] + }, + { + "name": "舟山市", + "children": [ + { + "name": "定海区" + }, + { + "name": "普陀区" + }, + { + "name": "岱山县" + }, + { + "name": "嵊泗县" + } + ] + }, + { + "name": "台州市", + "children": [ + { + "name": "椒江区" + }, + { + "name": "黄岩区" + }, + { + "name": "路桥区" + }, + { + "name": "三门县" + }, + { + "name": "天台县" + }, + { + "name": "仙居县" + }, + { + "name": "温岭市" + }, + { + "name": "临海市" + }, + { + "name": "玉环市" + } + ] + }, + { + "name": "丽水市", + "children": [ + { + "name": "莲都区" + }, + { + "name": "青田县" + }, + { + "name": "缙云县" + }, + { + "name": "遂昌县" + }, + { + "name": "松阳县" + }, + { + "name": "云和县" + }, + { + "name": "庆元县" + }, + { + "name": "景宁畲族自治县" + }, + { + "name": "龙泉市" + } + ] + } + ] + }, + { + "name": "安徽省", + "children": [ + { + "name": "合肥市", + "children": [ + { + "name": "瑶海区" + }, + { + "name": "庐阳区" + }, + { + "name": "蜀山区" + }, + { + "name": "包河区" + }, + { + "name": "长丰县" + }, + { + "name": "肥东县" + }, + { + "name": "肥西县" + }, + { + "name": "庐江县" + }, + { + "name": "巢湖市" + } + ] + }, + { + "name": "芜湖市", + "children": [ + { + "name": "镜湖区" + }, + { + "name": "弋江区" + }, + { + "name": "鸠江区" + }, + { + "name": "三山区" + }, + { + "name": "芜湖县" + }, + { + "name": "繁昌区" + }, + { + "name": "南陵县" + }, + { + "name": "无为市" + } + ] + }, + { + "name": "蚌埠市", + "children": [ + { + "name": "龙子湖区" + }, + { + "name": "蚌山区" + }, + { + "name": "禹会区" + }, + { + "name": "淮上区" + }, + { + "name": "怀远县" + }, + { + "name": "五河县" + }, + { + "name": "固镇县" + } + ] + }, + { + "name": "淮南市", + "children": [ + { + "name": "大通区" + }, + { + "name": "田家庵区" + }, + { + "name": "谢家集区" + }, + { + "name": "八公山区" + }, + { + "name": "潘集区" + }, + { + "name": "凤台县" + }, + { + "name": "寿县" + } + ] + }, + { + "name": "马鞍山市", + "children": [ + { + "name": "花山区" + }, + { + "name": "雨山区" + }, + { + "name": "博望区" + }, + { + "name": "当涂县" + }, + { + "name": "含山县" + }, + { + "name": "和县" + } + ] + }, + { + "name": "淮北市", + "children": [ + { + "name": "杜集区" + }, + { + "name": "相山区" + }, + { + "name": "烈山区" + }, + { + "name": "濉溪县" + } + ] + }, + { + "name": "铜陵市", + "children": [ + { + "name": "铜官区" + }, + { + "name": "义安区" + }, + { + "name": "郊区" + }, + { + "name": "枞阳县" + } + ] + }, + { + "name": "安庆市", + "children": [ + { + "name": "迎江区" + }, + { + "name": "大观区" + }, + { + "name": "宜秀区" + }, + { + "name": "怀宁县" + }, + { + "name": "太湖县" + }, + { + "name": "宿松县" + }, + { + "name": "望江县" + }, + { + "name": "岳西县" + }, + { + "name": "桐城市" + }, + { + "name": "潜山市" + } + ] + }, + { + "name": "黄山市", + "children": [ + { + "name": "屯溪区" + }, + { + "name": "黄山区" + }, + { + "name": "徽州区" + }, + { + "name": "歙县" + }, + { + "name": "休宁县" + }, + { + "name": "黟县" + }, + { + "name": "祁门县" + } + ] + }, + { + "name": "滁州市", + "children": [ + { + "name": "琅琊区" + }, + { + "name": "南谯区" + }, + { + "name": "来安县" + }, + { + "name": "全椒县" + }, + { + "name": "定远县" + }, + { + "name": "凤阳县" + }, + { + "name": "天长市" + }, + { + "name": "明光市" + } + ] + }, + { + "name": "阜阳市", + "children": [ + { + "name": "颍州区" + }, + { + "name": "颍东区" + }, + { + "name": "颍泉区" + }, + { + "name": "临泉县" + }, + { + "name": "太和县" + }, + { + "name": "阜南县" + }, + { + "name": "颍上县" + }, + { + "name": "界首市" + } + ] + }, + { + "name": "宿州市", + "children": [ + { + "name": "埇桥区" + }, + { + "name": "砀山县" + }, + { + "name": "萧县" + }, + { + "name": "灵璧县" + }, + { + "name": "泗县" + } + ] + }, + { + "name": "六安市", + "children": [ + { + "name": "金安区" + }, + { + "name": "裕安区" + }, + { + "name": "叶集区" + }, + { + "name": "霍邱县" + }, + { + "name": "舒城县" + }, + { + "name": "金寨县" + }, + { + "name": "霍山县" + } + ] + }, + { + "name": "亳州市", + "children": [ + { + "name": "谯城区" + }, + { + "name": "涡阳县" + }, + { + "name": "蒙城县" + }, + { + "name": "利辛县" + } + ] + }, + { + "name": "池州市", + "children": [ + { + "name": "贵池区" + }, + { + "name": "东至县" + }, + { + "name": "石台县" + }, + { + "name": "青阳县" + } + ] + }, + { + "name": "宣城市", + "children": [ + { + "name": "宣州区" + }, + { + "name": "郎溪县" + }, + { + "name": "广德市" + }, + { + "name": "泾县" + }, + { + "name": "绩溪县" + }, + { + "name": "旌德县" + }, + { + "name": "宁国市" + } + ] + } + ] + }, + { + "name": "福建省", + "children": [ + { + "name": "福州市", + "children": [ + { + "name": "鼓楼区" + }, + { + "name": "台江区" + }, + { + "name": "仓山区" + }, + { + "name": "马尾区" + }, + { + "name": "晋安区" + }, + { + "name": "长乐区" + }, + { + "name": "闽侯县" + }, + { + "name": "连江县" + }, + { + "name": "罗源县" + }, + { + "name": "闽清县" + }, + { + "name": "永泰县" + }, + { + "name": "平潭县" + }, + { + "name": "福清市" + } + ] + }, + { + "name": "厦门市", + "children": [ + { + "name": "思明区" + }, + { + "name": "海沧区" + }, + { + "name": "湖里区" + }, + { + "name": "集美区" + }, + { + "name": "同安区" + }, + { + "name": "翔安区" + } + ] + }, + { + "name": "莆田市", + "children": [ + { + "name": "城厢区" + }, + { + "name": "涵江区" + }, + { + "name": "荔城区" + }, + { + "name": "秀屿区" + }, + { + "name": "仙游县" + } + ] + }, + { + "name": "三明市", + "children": [ + { + "name": "梅列区" + }, + { + "name": "三元区" + }, + { + "name": "明溪县" + }, + { + "name": "清流县" + }, + { + "name": "宁化县" + }, + { + "name": "大田县" + }, + { + "name": "尤溪县" + }, + { + "name": "沙县" + }, + { + "name": "将乐县" + }, + { + "name": "泰宁县" + }, + { + "name": "建宁县" + }, + { + "name": "永安市" + } + ] + }, + { + "name": "泉州市", + "children": [ + { + "name": "鲤城区" + }, + { + "name": "丰泽区" + }, + { + "name": "洛江区" + }, + { + "name": "泉港区" + }, + { + "name": "惠安县" + }, + { + "name": "安溪县" + }, + { + "name": "永春县" + }, + { + "name": "德化县" + }, + { + "name": "金门县" + }, + { + "name": "石狮市" + }, + { + "name": "晋江市" + }, + { + "name": "南安市" + } + ] + }, + { + "name": "漳州市", + "children": [ + { + "name": "芗城区" + }, + { + "name": "龙文区" + }, + { + "name": "云霄县" + }, + { + "name": "漳浦县" + }, + { + "name": "诏安县" + }, + { + "name": "长泰县" + }, + { + "name": "东山县" + }, + { + "name": "南靖县" + }, + { + "name": "平和县" + }, + { + "name": "华安县" + }, + { + "name": "龙海市" + } + ] + }, + { + "name": "南平市", + "children": [ + { + "name": "延平区" + }, + { + "name": "建阳区" + }, + { + "name": "顺昌县" + }, + { + "name": "浦城县" + }, + { + "name": "光泽县" + }, + { + "name": "松溪县" + }, + { + "name": "政和县" + }, + { + "name": "邵武市" + }, + { + "name": "武夷山市" + }, + { + "name": "建瓯市" + } + ] + }, + { + "name": "龙岩市", + "children": [ + { + "name": "新罗区" + }, + { + "name": "永定区" + }, + { + "name": "长汀县" + }, + { + "name": "上杭县" + }, + { + "name": "武平县" + }, + { + "name": "连城县" + }, + { + "name": "漳平市" + } + ] + }, + { + "name": "宁德市", + "children": [ + { + "name": "蕉城区" + }, + { + "name": "霞浦县" + }, + { + "name": "古田县" + }, + { + "name": "屏南县" + }, + { + "name": "寿宁县" + }, + { + "name": "周宁县" + }, + { + "name": "柘荣县" + }, + { + "name": "福安市" + }, + { + "name": "福鼎市" + } + ] + } + ] + }, + { + "name": "江西省", + "children": [ + { + "name": "南昌市", + "children": [ + { + "name": "东湖区" + }, + { + "name": "西湖区" + }, + { + "name": "青云谱区" + }, + { + "name": "湾里区" + }, + { + "name": "青山湖区" + }, + { + "name": "新建区" + }, + { + "name": "南昌县" + }, + { + "name": "安义县" + }, + { + "name": "进贤县" + } + ] + }, + { + "name": "景德镇市", + "children": [ + { + "name": "昌江区" + }, + { + "name": "珠山区" + }, + { + "name": "浮梁县" + }, + { + "name": "乐平市" + } + ] + }, + { + "name": "萍乡市", + "children": [ + { + "name": "安源区" + }, + { + "name": "湘东区" + }, + { + "name": "莲花县" + }, + { + "name": "上栗县" + }, + { + "name": "芦溪县" + } + ] + }, + { + "name": "九江市", + "children": [ + { + "name": "濂溪区" + }, + { + "name": "浔阳区" + }, + { + "name": "柴桑区" + }, + { + "name": "武宁县" + }, + { + "name": "修水县" + }, + { + "name": "永修县" + }, + { + "name": "德安县" + }, + { + "name": "都昌县" + }, + { + "name": "湖口县" + }, + { + "name": "彭泽县" + }, + { + "name": "瑞昌市" + }, + { + "name": "共青城市" + }, + { + "name": "庐山市" + } + ] + }, + { + "name": "新余市", + "children": [ + { + "name": "渝水区" + }, + { + "name": "分宜县" + } + ] + }, + { + "name": "鹰潭市", + "children": [ + { + "name": "月湖区" + }, + { + "name": "余江区" + }, + { + "name": "贵溪市" + } + ] + }, + { + "name": "赣州市", + "children": [ + { + "name": "章贡区" + }, + { + "name": "南康区" + }, + { + "name": "赣县区" + }, + { + "name": "信丰县" + }, + { + "name": "大余县" + }, + { + "name": "上犹县" + }, + { + "name": "崇义县" + }, + { + "name": "安远县" + }, + { + "name": "龙南县" + }, + { + "name": "定南县" + }, + { + "name": "全南县" + }, + { + "name": "宁都县" + }, + { + "name": "于都县" + }, + { + "name": "兴国县" + }, + { + "name": "会昌县" + }, + { + "name": "寻乌县" + }, + { + "name": "石城县" + }, + { + "name": "瑞金市" + } + ] + }, + { + "name": "吉安市", + "children": [ + { + "name": "吉州区" + }, + { + "name": "青原区" + }, + { + "name": "吉安县" + }, + { + "name": "吉水县" + }, + { + "name": "峡江县" + }, + { + "name": "新干县" + }, + { + "name": "永丰县" + }, + { + "name": "泰和县" + }, + { + "name": "遂川县" + }, + { + "name": "万安县" + }, + { + "name": "安福县" + }, + { + "name": "永新县" + }, + { + "name": "井冈山市" + } + ] + }, + { + "name": "宜春市", + "children": [ + { + "name": "袁州区" + }, + { + "name": "奉新县" + }, + { + "name": "万载县" + }, + { + "name": "上高县" + }, + { + "name": "宜丰县" + }, + { + "name": "靖安县" + }, + { + "name": "铜鼓县" + }, + { + "name": "丰城市" + }, + { + "name": "樟树市" + }, + { + "name": "高安市" + } + ] + }, + { + "name": "抚州市", + "children": [ + { + "name": "临川区" + }, + { + "name": "东乡区" + }, + { + "name": "南城县" + }, + { + "name": "黎川县" + }, + { + "name": "南丰县" + }, + { + "name": "崇仁县" + }, + { + "name": "乐安县" + }, + { + "name": "宜黄县" + }, + { + "name": "金溪县" + }, + { + "name": "资溪县" + }, + { + "name": "广昌县" + } + ] + }, + { + "name": "上饶市", + "children": [ + { + "name": "信州区" + }, + { + "name": "广丰区" + }, + { + "name": "上饶县" + }, + { + "name": "玉山县" + }, + { + "name": "铅山县" + }, + { + "name": "横峰县" + }, + { + "name": "弋阳县" + }, + { + "name": "余干县" + }, + { + "name": "鄱阳县" + }, + { + "name": "万年县" + }, + { + "name": "婺源县" + }, + { + "name": "德兴市" + } + ] + } + ] + }, + { + "name": "山东省", + "children": [ + { + "name": "济南市", + "children": [ + { + "name": "历下区" + }, + { + "name": "市中区" + }, + { + "name": "槐荫区" + }, + { + "name": "天桥区" + }, + { + "name": "历城区" + }, + { + "name": "长清区" + }, + { + "name": "章丘区" + }, + { + "name": "济阳区" + }, + { + "name": "莱芜区" + }, + { + "name": "钢城区" + }, + { + "name": "平阴县" + }, + { + "name": "商河县" + } + ] + }, + { + "name": "青岛市", + "children": [ + { + "name": "市南区" + }, + { + "name": "市北区" + }, + { + "name": "黄岛区" + }, + { + "name": "崂山区" + }, + { + "name": "李沧区" + }, + { + "name": "城阳区" + }, + { + "name": "即墨区" + }, + { + "name": "胶州市" + }, + { + "name": "平度市" + }, + { + "name": "莱西市" + } + ] + }, + { + "name": "淄博市", + "children": [ + { + "name": "淄川区" + }, + { + "name": "张店区" + }, + { + "name": "博山区" + }, + { + "name": "临淄区" + }, + { + "name": "周村区" + }, + { + "name": "桓台县" + }, + { + "name": "高青县" + }, + { + "name": "沂源县" + } + ] + }, + { + "name": "枣庄市", + "children": [ + { + "name": "市中区" + }, + { + "name": "薛城区" + }, + { + "name": "峄城区" + }, + { + "name": "台儿庄区" + }, + { + "name": "山亭区" + }, + { + "name": "滕州市" + } + ] + }, + { + "name": "东营市", + "children": [ + { + "name": "东营区" + }, + { + "name": "河口区" + }, + { + "name": "垦利区" + }, + { + "name": "利津县" + }, + { + "name": "广饶县" + } + ] + }, + { + "name": "烟台市", + "children": [ + { + "name": "芝罘区" + }, + { + "name": "福山区" + }, + { + "name": "牟平区" + }, + { + "name": "莱山区" + }, + { + "name": "长岛县" + }, + { + "name": "龙口市" + }, + { + "name": "莱阳市" + }, + { + "name": "莱州市" + }, + { + "name": "蓬莱市" + }, + { + "name": "招远市" + }, + { + "name": "栖霞市" + }, + { + "name": "海阳市" + } + ] + }, + { + "name": "潍坊市", + "children": [ + { + "name": "潍城区" + }, + { + "name": "寒亭区" + }, + { + "name": "坊子区" + }, + { + "name": "奎文区" + }, + { + "name": "临朐县" + }, + { + "name": "昌乐县" + }, + { + "name": "青州市" + }, + { + "name": "诸城市" + }, + { + "name": "寿光市" + }, + { + "name": "安丘市" + }, + { + "name": "高密市" + }, + { + "name": "昌邑市" + } + ] + }, + { + "name": "济宁市", + "children": [ + { + "name": "任城区" + }, + { + "name": "兖州区" + }, + { + "name": "微山县" + }, + { + "name": "鱼台县" + }, + { + "name": "金乡县" + }, + { + "name": "嘉祥县" + }, + { + "name": "汶上县" + }, + { + "name": "泗水县" + }, + { + "name": "梁山县" + }, + { + "name": "曲阜市" + }, + { + "name": "邹城市" + } + ] + }, + { + "name": "泰安市", + "children": [ + { + "name": "泰山区" + }, + { + "name": "岱岳区" + }, + { + "name": "宁阳县" + }, + { + "name": "东平县" + }, + { + "name": "新泰市" + }, + { + "name": "肥城市" + } + ] + }, + { + "name": "威海市", + "children": [ + { + "name": "环翠区" + }, + { + "name": "文登区" + }, + { + "name": "荣成市" + }, + { + "name": "乳山市" + } + ] + }, + { + "name": "日照市", + "children": [ + { + "name": "东港区" + }, + { + "name": "岚山区" + }, + { + "name": "五莲县" + }, + { + "name": "莒县" + } + ] + }, + { + "name": "临沂市", + "children": [ + { + "name": "兰山区" + }, + { + "name": "罗庄区" + }, + { + "name": "河东区" + }, + { + "name": "沂南县" + }, + { + "name": "郯城县" + }, + { + "name": "沂水县" + }, + { + "name": "兰陵县" + }, + { + "name": "费县" + }, + { + "name": "平邑县" + }, + { + "name": "莒南县" + }, + { + "name": "蒙阴县" + }, + { + "name": "临沭县" + } + ] + }, + { + "name": "德州市", + "children": [ + { + "name": "德城区" + }, + { + "name": "陵城区" + }, + { + "name": "宁津县" + }, + { + "name": "庆云县" + }, + { + "name": "临邑县" + }, + { + "name": "齐河县" + }, + { + "name": "平原县" + }, + { + "name": "夏津县" + }, + { + "name": "武城县" + }, + { + "name": "乐陵市" + }, + { + "name": "禹城市" + } + ] + }, + { + "name": "聊城市", + "children": [ + { + "name": "东昌府区" + }, + { + "name": "茌平区" + }, + { + "name": "阳谷县" + }, + { + "name": "莘县" + }, + { + "name": "东阿县" + }, + { + "name": "冠县" + }, + { + "name": "高唐县" + }, + { + "name": "临清市" + } + ] + }, + { + "name": "滨州市", + "children": [ + { + "name": "滨城区" + }, + { + "name": "沾化区" + }, + { + "name": "惠民县" + }, + { + "name": "阳信县" + }, + { + "name": "无棣县" + }, + { + "name": "博兴县" + }, + { + "name": "邹平市" + } + ] + }, + { + "name": "菏泽市", + "children": [ + { + "name": "牡丹区" + }, + { + "name": "定陶区" + }, + { + "name": "曹县" + }, + { + "name": "单县" + }, + { + "name": "成武县" + }, + { + "name": "巨野县" + }, + { + "name": "郓城县" + }, + { + "name": "鄄城县" + }, + { + "name": "东明县" + } + ] + } + ] + }, + { + "name": "河南省", + "children": [ + { + "name": "郑州市", + "children": [ + { + "name": "中原区" + }, + { + "name": "二七区" + }, + { + "name": "管城回族区" + }, + { + "name": "金水区" + }, + { + "name": "上街区" + }, + { + "name": "惠济区" + }, + { + "name": "中牟县" + }, + { + "name": "巩义市" + }, + { + "name": "荥阳市" + }, + { + "name": "新密市" + }, + { + "name": "新郑市" + }, + { + "name": "登封市" + } + ] + }, + { + "name": "开封市", + "children": [ + { + "name": "龙亭区" + }, + { + "name": "顺河回族区" + }, + { + "name": "鼓楼区" + }, + { + "name": "禹王台区" + }, + { + "name": "祥符区" + }, + { + "name": "杞县" + }, + { + "name": "通许县" + }, + { + "name": "尉氏县" + }, + { + "name": "兰考县" + } + ] + }, + { + "name": "洛阳市", + "children": [ + { + "name": "老城区" + }, + { + "name": "西工区" + }, + { + "name": "瀍河回族区" + }, + { + "name": "涧西区" + }, + { + "name": "吉利区" + }, + { + "name": "洛龙区" + }, + { + "name": "孟津区" + }, + { + "name": "新安县" + }, + { + "name": "栾川县" + }, + { + "name": "嵩县" + }, + { + "name": "汝阳县" + }, + { + "name": "宜阳县" + }, + { + "name": "洛宁县" + }, + { + "name": "伊川县" + }, + { + "name": "偃师市" + } + ] + }, + { + "name": "平顶山市", + "children": [ + { + "name": "新华区" + }, + { + "name": "卫东区" + }, + { + "name": "石龙区" + }, + { + "name": "湛河区" + }, + { + "name": "宝丰县" + }, + { + "name": "叶县" + }, + { + "name": "鲁山县" + }, + { + "name": "郏县" + }, + { + "name": "舞钢市" + }, + { + "name": "汝州市" + } + ] + }, + { + "name": "安阳市", + "children": [ + { + "name": "文峰区" + }, + { + "name": "北关区" + }, + { + "name": "殷都区" + }, + { + "name": "龙安区" + }, + { + "name": "安阳县" + }, + { + "name": "汤阴县" + }, + { + "name": "滑县" + }, + { + "name": "内黄县" + }, + { + "name": "林州市" + } + ] + }, + { + "name": "鹤壁市", + "children": [ + { + "name": "鹤山区" + }, + { + "name": "山城区" + }, + { + "name": "淇滨区" + }, + { + "name": "浚县" + }, + { + "name": "淇县" + } + ] + }, + { + "name": "新乡市", + "children": [ + { + "name": "红旗区" + }, + { + "name": "卫滨区" + }, + { + "name": "凤泉区" + }, + { + "name": "牧野区" + }, + { + "name": "新乡县" + }, + { + "name": "获嘉县" + }, + { + "name": "原阳县" + }, + { + "name": "延津县" + }, + { + "name": "封丘县" + }, + { + "name": "长垣市" + }, + { + "name": "卫辉市" + }, + { + "name": "辉县市" + } + ] + }, + { + "name": "焦作市", + "children": [ + { + "name": "解放区" + }, + { + "name": "中站区" + }, + { + "name": "马村区" + }, + { + "name": "山阳区" + }, + { + "name": "修武县" + }, + { + "name": "博爱县" + }, + { + "name": "武陟县" + }, + { + "name": "温县" + }, + { + "name": "沁阳市" + }, + { + "name": "孟州市" + } + ] + }, + { + "name": "濮阳市", + "children": [ + { + "name": "华龙区" + }, + { + "name": "清丰县" + }, + { + "name": "南乐县" + }, + { + "name": "范县" + }, + { + "name": "台前县" + }, + { + "name": "濮阳县" + } + ] + }, + { + "name": "许昌市", + "children": [ + { + "name": "魏都区" + }, + { + "name": "建安区" + }, + { + "name": "鄢陵县" + }, + { + "name": "襄城县" + }, + { + "name": "禹州市" + }, + { + "name": "长葛市" + } + ] + }, + { + "name": "漯河市", + "children": [ + { + "name": "源汇区" + }, + { + "name": "郾城区" + }, + { + "name": "召陵区" + }, + { + "name": "舞阳县" + }, + { + "name": "临颍县" + } + ] + }, + { + "name": "三门峡市", + "children": [ + { + "name": "湖滨区" + }, + { + "name": "陕州区" + }, + { + "name": "渑池县" + }, + { + "name": "卢氏县" + }, + { + "name": "义马市" + }, + { + "name": "灵宝市" + } + ] + }, + { + "name": "南阳市", + "children": [ + { + "name": "宛城区" + }, + { + "name": "卧龙区" + }, + { + "name": "南召县" + }, + { + "name": "方城县" + }, + { + "name": "西峡县" + }, + { + "name": "镇平县" + }, + { + "name": "内乡县" + }, + { + "name": "淅川县" + }, + { + "name": "社旗县" + }, + { + "name": "唐河县" + }, + { + "name": "新野县" + }, + { + "name": "桐柏县" + }, + { + "name": "邓州市" + } + ] + }, + { + "name": "商丘市", + "children": [ + { + "name": "梁园区" + }, + { + "name": "睢阳区" + }, + { + "name": "民权县" + }, + { + "name": "睢县" + }, + { + "name": "宁陵县" + }, + { + "name": "柘城县" + }, + { + "name": "虞城县" + }, + { + "name": "夏邑县" + }, + { + "name": "永城市" + } + ] + }, + { + "name": "信阳市", + "children": [ + { + "name": "浉河区" + }, + { + "name": "平桥区" + }, + { + "name": "罗山县" + }, + { + "name": "光山县" + }, + { + "name": "新县" + }, + { + "name": "商城县" + }, + { + "name": "固始县" + }, + { + "name": "潢川县" + }, + { + "name": "淮滨县" + }, + { + "name": "息县" + } + ] + }, + { + "name": "周口市", + "children": [ + { + "name": "川汇区" + }, + { + "name": "淮阳区" + }, + { + "name": "扶沟县" + }, + { + "name": "西华县" + }, + { + "name": "商水县" + }, + { + "name": "沈丘县" + }, + { + "name": "郸城县" + }, + { + "name": "太康县" + }, + { + "name": "鹿邑县" + }, + { + "name": "项城市" + } + ] + }, + { + "name": "驻马店市", + "children": [ + { + "name": "驿城区" + }, + { + "name": "西平县" + }, + { + "name": "上蔡县" + }, + { + "name": "平舆县" + }, + { + "name": "正阳县" + }, + { + "name": "确山县" + }, + { + "name": "泌阳县" + }, + { + "name": "汝南县" + }, + { + "name": "遂平县" + }, + { + "name": "新蔡县" + } + ] + }, + { + "name": "济源市", + "children": [] + } + ] + }, + { + "name": "湖北省", + "children": [ + { + "name": "武汉市", + "children": [ + { + "name": "江岸区" + }, + { + "name": "江汉区" + }, + { + "name": "硚口区" + }, + { + "name": "汉阳区" + }, + { + "name": "武昌区" + }, + { + "name": "青山区" + }, + { + "name": "洪山区" + }, + { + "name": "东西湖区" + }, + { + "name": "汉南区" + }, + { + "name": "蔡甸区" + }, + { + "name": "江夏区" + }, + { + "name": "黄陂区" + }, + { + "name": "新洲区" + } + ] + }, + { + "name": "黄石市", + "children": [ + { + "name": "黄石港区" + }, + { + "name": "西塞山区" + }, + { + "name": "下陆区" + }, + { + "name": "铁山区" + }, + { + "name": "阳新县" + }, + { + "name": "大冶市" + } + ] + }, + { + "name": "十堰市", + "children": [ + { + "name": "茅箭区" + }, + { + "name": "张湾区" + }, + { + "name": "郧阳区" + }, + { + "name": "郧西县" + }, + { + "name": "竹山县" + }, + { + "name": "竹溪县" + }, + { + "name": "房县" + }, + { + "name": "丹江口市" + } + ] + }, + { + "name": "宜昌市", + "children": [ + { + "name": "西陵区" + }, + { + "name": "伍家岗区" + }, + { + "name": "点军区" + }, + { + "name": "猇亭区" + }, + { + "name": "夷陵区" + }, + { + "name": "远安县" + }, + { + "name": "兴山县" + }, + { + "name": "秭归县" + }, + { + "name": "长阳土家族自治县" + }, + { + "name": "五峰土家族自治县" + }, + { + "name": "宜都市" + }, + { + "name": "当阳市" + }, + { + "name": "枝江市" + } + ] + }, + { + "name": "襄阳市", + "children": [ + { + "name": "襄城区" + }, + { + "name": "樊城区" + }, + { + "name": "襄州区" + }, + { + "name": "南漳县" + }, + { + "name": "谷城县" + }, + { + "name": "保康县" + }, + { + "name": "老河口市" + }, + { + "name": "枣阳市" + }, + { + "name": "宜城市" + } + ] + }, + { + "name": "鄂州市", + "children": [ + { + "name": "梁子湖区" + }, + { + "name": "华容区" + }, + { + "name": "鄂城区" + } + ] + }, + { + "name": "荆门市", + "children": [ + { + "name": "东宝区" + }, + { + "name": "掇刀区" + }, + { + "name": "沙洋县" + }, + { + "name": "钟祥市" + }, + { + "name": "京山市" + } + ] + }, + { + "name": "孝感市", + "children": [ + { + "name": "孝南区" + }, + { + "name": "孝昌县" + }, + { + "name": "大悟县" + }, + { + "name": "云梦县" + }, + { + "name": "应城市" + }, + { + "name": "安陆市" + }, + { + "name": "汉川市" + } + ] + }, + { + "name": "荆州市", + "children": [ + { + "name": "沙市区" + }, + { + "name": "荆州区" + }, + { + "name": "公安县" + }, + { + "name": "监利县" + }, + { + "name": "江陵县" + }, + { + "name": "石首市" + }, + { + "name": "洪湖市" + }, + { + "name": "松滋市" + } + ] + }, + { + "name": "黄冈市", + "children": [ + { + "name": "黄州区" + }, + { + "name": "团风县" + }, + { + "name": "红安县" + }, + { + "name": "罗田县" + }, + { + "name": "英山县" + }, + { + "name": "浠水县" + }, + { + "name": "蕲春县" + }, + { + "name": "黄梅县" + }, + { + "name": "麻城市" + }, + { + "name": "武穴市" + } + ] + }, + { + "name": "咸宁市", + "children": [ + { + "name": "咸安区" + }, + { + "name": "嘉鱼县" + }, + { + "name": "通城县" + }, + { + "name": "崇阳县" + }, + { + "name": "通山县" + }, + { + "name": "赤壁市" + } + ] + }, + { + "name": "随州市", + "children": [ + { + "name": "曾都区" + }, + { + "name": "随县" + }, + { + "name": "广水市" + } + ] + }, + { + "name": "恩施土家族苗族自治州", + "children": [ + { + "name": "恩施市" + }, + { + "name": "利川市" + }, + { + "name": "建始县" + }, + { + "name": "巴东县" + }, + { + "name": "宣恩县" + }, + { + "name": "咸丰县" + }, + { + "name": "来凤县" + }, + { + "name": "鹤峰县" + } + ] + }, + { + "name": "仙桃市", + "children": [] + }, + { + "name": "潜江市", + "children": [] + }, + { + "name": "天门市", + "children": [] + }, + { + "name": "神农架林区", + "children": [] + } + ] + }, + { + "name": "湖南省", + "children": [ + { + "name": "长沙市", + "children": [ + { + "name": "芙蓉区" + }, + { + "name": "天心区" + }, + { + "name": "岳麓区" + }, + { + "name": "开福区" + }, + { + "name": "雨花区" + }, + { + "name": "望城区" + }, + { + "name": "长沙县" + }, + { + "name": "浏阳市" + }, + { + "name": "宁乡市" + } + ] + }, + { + "name": "株洲市", + "children": [ + { + "name": "荷塘区" + }, + { + "name": "芦淞区" + }, + { + "name": "石峰区" + }, + { + "name": "天元区" + }, + { + "name": "渌口区" + }, + { + "name": "攸县" + }, + { + "name": "茶陵县" + }, + { + "name": "炎陵县" + }, + { + "name": "醴陵市" + } + ] + }, + { + "name": "湘潭市", + "children": [ + { + "name": "雨湖区" + }, + { + "name": "岳塘区" + }, + { + "name": "湘潭县" + }, + { + "name": "湘乡市" + }, + { + "name": "韶山市" + } + ] + }, + { + "name": "衡阳市", + "children": [ + { + "name": "珠晖区" + }, + { + "name": "雁峰区" + }, + { + "name": "石鼓区" + }, + { + "name": "蒸湘区" + }, + { + "name": "南岳区" + }, + { + "name": "衡阳县" + }, + { + "name": "衡南县" + }, + { + "name": "衡山县" + }, + { + "name": "衡东县" + }, + { + "name": "祁东县" + }, + { + "name": "耒阳市" + }, + { + "name": "常宁市" + } + ] + }, + { + "name": "邵阳市", + "children": [ + { + "name": "双清区" + }, + { + "name": "大祥区" + }, + { + "name": "北塔区" + }, + { + "name": "邵东市" + }, + { + "name": "新邵县" + }, + { + "name": "邵阳县" + }, + { + "name": "隆回县" + }, + { + "name": "洞口县" + }, + { + "name": "绥宁县" + }, + { + "name": "新宁县" + }, + { + "name": "城步苗族自治县" + }, + { + "name": "武冈市" + } + ] + }, + { + "name": "岳阳市", + "children": [ + { + "name": "岳阳楼区" + }, + { + "name": "云溪区" + }, + { + "name": "君山区" + }, + { + "name": "岳阳县" + }, + { + "name": "华容县" + }, + { + "name": "湘阴县" + }, + { + "name": "平江县" + }, + { + "name": "汨罗市" + }, + { + "name": "临湘市" + } + ] + }, + { + "name": "常德市", + "children": [ + { + "name": "武陵区" + }, + { + "name": "鼎城区" + }, + { + "name": "安乡县" + }, + { + "name": "汉寿县" + }, + { + "name": "澧县" + }, + { + "name": "临澧县" + }, + { + "name": "桃源县" + }, + { + "name": "石门县" + }, + { + "name": "津市市" + } + ] + }, + { + "name": "张家界市", + "children": [ + { + "name": "永定区" + }, + { + "name": "武陵源区" + }, + { + "name": "慈利县" + }, + { + "name": "桑植县" + } + ] + }, + { + "name": "益阳市", + "children": [ + { + "name": "资阳区" + }, + { + "name": "赫山区" + }, + { + "name": "南县" + }, + { + "name": "桃江县" + }, + { + "name": "安化县" + }, + { + "name": "沅江市" + } + ] + }, + { + "name": "郴州市", + "children": [ + { + "name": "北湖区" + }, + { + "name": "苏仙区" + }, + { + "name": "桂阳县" + }, + { + "name": "宜章县" + }, + { + "name": "永兴县" + }, + { + "name": "嘉禾县" + }, + { + "name": "临武县" + }, + { + "name": "汝城县" + }, + { + "name": "桂东县" + }, + { + "name": "安仁县" + }, + { + "name": "资兴市" + } + ] + }, + { + "name": "永州市", + "children": [ + { + "name": "零陵区" + }, + { + "name": "冷水滩区" + }, + { + "name": "祁阳市" + }, + { + "name": "东安县" + }, + { + "name": "双牌县" + }, + { + "name": "道县" + }, + { + "name": "江永县" + }, + { + "name": "宁远县" + }, + { + "name": "蓝山县" + }, + { + "name": "新田县" + }, + { + "name": "江华瑶族自治县" + } + ] + }, + { + "name": "怀化市", + "children": [ + { + "name": "鹤城区" + }, + { + "name": "中方县" + }, + { + "name": "沅陵县" + }, + { + "name": "辰溪县" + }, + { + "name": "溆浦县" + }, + { + "name": "会同县" + }, + { + "name": "麻阳苗族自治县" + }, + { + "name": "新晃侗族自治县" + }, + { + "name": "芷江侗族自治县" + }, + { + "name": "靖州苗族侗族自治县" + }, + { + "name": "通道侗族自治县" + }, + { + "name": "洪江市" + } + ] + }, + { + "name": "娄底市", + "children": [ + { + "name": "娄星区" + }, + { + "name": "双峰县" + }, + { + "name": "新化县" + }, + { + "name": "冷水江市" + }, + { + "name": "涟源市" + } + ] + }, + { + "name": "湘西土家族苗族自治州", + "children": [ + { + "name": "吉首市" + }, + { + "name": "泸溪县" + }, + { + "name": "凤凰县" + }, + { + "name": "花垣县" + }, + { + "name": "保靖县" + }, + { + "name": "古丈县" + }, + { + "name": "永顺县" + }, + { + "name": "龙山县" + } + ] + } + ] + }, + { + "name": "广东省", + "children": [ + { + "name": "广州市", + "children": [ + { + "name": "荔湾区" + }, + { + "name": "越秀区" + }, + { + "name": "海珠区" + }, + { + "name": "天河区" + }, + { + "name": "白云区" + }, + { + "name": "黄埔区" + }, + { + "name": "番禺区" + }, + { + "name": "花都区" + }, + { + "name": "南沙区" + }, + { + "name": "从化区" + }, + { + "name": "增城区" + } + ] + }, + { + "name": "韶关市", + "children": [ + { + "name": "武江区" + }, + { + "name": "浈江区" + }, + { + "name": "曲江区" + }, + { + "name": "始兴县" + }, + { + "name": "仁化县" + }, + { + "name": "翁源县" + }, + { + "name": "乳源瑶族自治县" + }, + { + "name": "新丰县" + }, + { + "name": "乐昌市" + }, + { + "name": "南雄市" + } + ] + }, + { + "name": "深圳市", + "children": [ + { + "name": "罗湖区" + }, + { + "name": "福田区" + }, + { + "name": "南山区" + }, + { + "name": "宝安区" + }, + { + "name": "龙岗区" + }, + { + "name": "盐田区" + }, + { + "name": "龙华区" + }, + { + "name": "坪山区" + }, + { + "name": "光明区" + }, + { + "name": "大鹏新区" + } + ] + }, + { + "name": "珠海市", + "children": [ + { + "name": "香洲区" + }, + { + "name": "斗门区" + }, + { + "name": "金湾区" + } + ] + }, + { + "name": "汕头市", + "children": [ + { + "name": "龙湖区" + }, + { + "name": "金平区" + }, + { + "name": "濠江区" + }, + { + "name": "潮阳区" + }, + { + "name": "潮南区" + }, + { + "name": "澄海区" + }, + { + "name": "南澳县" + } + ] + }, + { + "name": "佛山市", + "children": [ + { + "name": "禅城区" + }, + { + "name": "南海区" + }, + { + "name": "顺德区" + }, + { + "name": "三水区" + }, + { + "name": "高明区" + } + ] + }, + { + "name": "江门市", + "children": [ + { + "name": "蓬江区" + }, + { + "name": "江海区" + }, + { + "name": "新会区" + }, + { + "name": "台山市" + }, + { + "name": "开平市" + }, + { + "name": "鹤山市" + }, + { + "name": "恩平市" + } + ] + }, + { + "name": "湛江市", + "children": [ + { + "name": "赤坎区" + }, + { + "name": "霞山区" + }, + { + "name": "坡头区" + }, + { + "name": "麻章区" + }, + { + "name": "遂溪县" + }, + { + "name": "徐闻县" + }, + { + "name": "廉江市" + }, + { + "name": "雷州市" + }, + { + "name": "吴川市" + } + ] + }, + { + "name": "茂名市", + "children": [ + { + "name": "茂南区" + }, + { + "name": "电白区" + }, + { + "name": "高州市" + }, + { + "name": "化州市" + }, + { + "name": "信宜市" + } + ] + }, + { + "name": "肇庆市", + "children": [ + { + "name": "端州区" + }, + { + "name": "鼎湖区" + }, + { + "name": "高要区" + }, + { + "name": "广宁县" + }, + { + "name": "怀集县" + }, + { + "name": "封开县" + }, + { + "name": "德庆县" + }, + { + "name": "四会市" + } + ] + }, + { + "name": "惠州市", + "children": [ + { + "name": "惠城区" + }, + { + "name": "惠阳区" + }, + { + "name": "博罗县" + }, + { + "name": "惠东县" + }, + { + "name": "龙门县" + } + ] + }, + { + "name": "梅州市", + "children": [ + { + "name": "梅江区" + }, + { + "name": "梅县区" + }, + { + "name": "大埔县" + }, + { + "name": "丰顺县" + }, + { + "name": "五华县" + }, + { + "name": "平远县" + }, + { + "name": "蕉岭县" + }, + { + "name": "兴宁市" + } + ] + }, + { + "name": "汕尾市", + "children": [ + { + "name": "城区" + }, + { + "name": "海丰县" + }, + { + "name": "陆河县" + }, + { + "name": "陆丰市" + } + ] + }, + { + "name": "河源市", + "children": [ + { + "name": "源城区" + }, + { + "name": "紫金县" + }, + { + "name": "龙川县" + }, + { + "name": "连平县" + }, + { + "name": "和平县" + }, + { + "name": "东源县" + } + ] + }, + { + "name": "阳江市", + "children": [ + { + "name": "江城区" + }, + { + "name": "阳东区" + }, + { + "name": "阳西县" + }, + { + "name": "阳春市" + } + ] + }, + { + "name": "清远市", + "children": [ + { + "name": "清城区" + }, + { + "name": "清新区" + }, + { + "name": "佛冈县" + }, + { + "name": "阳山县" + }, + { + "name": "连山壮族瑶族自治县" + }, + { + "name": "连南瑶族自治县" + }, + { + "name": "英德市" + }, + { + "name": "连州市" + } + ] + }, + { + "name": "东莞市", + "children": [] + }, + { + "name": "中山市", + "children": [] + }, + { + "name": "潮州市", + "children": [ + { + "name": "湘桥区" + }, + { + "name": "潮安区" + }, + { + "name": "饶平县" + } + ] + }, + { + "name": "揭阳市", + "children": [ + { + "name": "榕城区" + }, + { + "name": "揭东区" + }, + { + "name": "揭西县" + }, + { + "name": "惠来县" + }, + { + "name": "普宁市" + } + ] + }, + { + "name": "云浮市", + "children": [ + { + "name": "云城区" + }, + { + "name": "云安区" + }, + { + "name": "新兴县" + }, + { + "name": "郁南县" + }, + { + "name": "罗定市" + } + ] + } + ] + }, + { + "name": "广西壮族自治区", + "children": [ + { + "name": "南宁市", + "children": [ + { + "name": "兴宁区" + }, + { + "name": "青秀区" + }, + { + "name": "江南区" + }, + { + "name": "西乡塘区" + }, + { + "name": "良庆区" + }, + { + "name": "邕宁区" + }, + { + "name": "武鸣区" + }, + { + "name": "隆安县" + }, + { + "name": "马山县" + }, + { + "name": "上林县" + }, + { + "name": "宾阳县" + }, + { + "name": "横县" + } + ] + }, + { + "name": "柳州市", + "children": [ + { + "name": "城中区" + }, + { + "name": "鱼峰区" + }, + { + "name": "柳南区" + }, + { + "name": "柳北区" + }, + { + "name": "柳江区" + }, + { + "name": "柳城县" + }, + { + "name": "鹿寨县" + }, + { + "name": "融安县" + }, + { + "name": "融水苗族自治县" + }, + { + "name": "三江侗族自治县" + } + ] + }, + { + "name": "桂林市", + "children": [ + { + "name": "秀峰区" + }, + { + "name": "叠彩区" + }, + { + "name": "象山区" + }, + { + "name": "七星区" + }, + { + "name": "雁山区" + }, + { + "name": "临桂区" + }, + { + "name": "阳朔县" + }, + { + "name": "灵川县" + }, + { + "name": "全州县" + }, + { + "name": "兴安县" + }, + { + "name": "永福县" + }, + { + "name": "灌阳县" + }, + { + "name": "龙胜各族自治县" + }, + { + "name": "资源县" + }, + { + "name": "平乐县" + }, + { + "name": "荔浦市" + }, + { + "name": "恭城瑶族自治县" + } + ] + }, + { + "name": "梧州市", + "children": [ + { + "name": "万秀区" + }, + { + "name": "长洲区" + }, + { + "name": "龙圩区" + }, + { + "name": "苍梧县" + }, + { + "name": "藤县" + }, + { + "name": "蒙山县" + }, + { + "name": "岑溪市" + } + ] + }, + { + "name": "北海市", + "children": [ + { + "name": "海城区" + }, + { + "name": "银海区" + }, + { + "name": "铁山港区" + }, + { + "name": "合浦县" + } + ] + }, + { + "name": "防城港市", + "children": [ + { + "name": "港口区" + }, + { + "name": "防城区" + }, + { + "name": "上思县" + }, + { + "name": "东兴市" + } + ] + }, + { + "name": "钦州市", + "children": [ + { + "name": "钦南区" + }, + { + "name": "钦北区" + }, + { + "name": "灵山县" + }, + { + "name": "浦北县" + } + ] + }, + { + "name": "贵港市", + "children": [ + { + "name": "港北区" + }, + { + "name": "港南区" + }, + { + "name": "覃塘区" + }, + { + "name": "平南县" + }, + { + "name": "桂平市" + } + ] + }, + { + "name": "玉林市", + "children": [ + { + "name": "玉州区" + }, + { + "name": "福绵区" + }, + { + "name": "容县" + }, + { + "name": "陆川县" + }, + { + "name": "博白县" + }, + { + "name": "兴业县" + }, + { + "name": "北流市" + } + ] + }, + { + "name": "百色市", + "children": [ + { + "name": "右江区" + }, + { + "name": "田阳区" + }, + { + "name": "田东县" + }, + { + "name": "平果市" + }, + { + "name": "德保县" + }, + { + "name": "那坡县" + }, + { + "name": "凌云县" + }, + { + "name": "乐业县" + }, + { + "name": "田林县" + }, + { + "name": "西林县" + }, + { + "name": "隆林各族自治县" + }, + { + "name": "靖西市" + } + ] + }, + { + "name": "贺州市", + "children": [ + { + "name": "八步区" + }, + { + "name": "平桂区" + }, + { + "name": "昭平县" + }, + { + "name": "钟山县" + }, + { + "name": "富川瑶族自治县" + } + ] + }, + { + "name": "河池市", + "children": [ + { + "name": "金城江区" + }, + { + "name": "宜州区" + }, + { + "name": "南丹县" + }, + { + "name": "天峨县" + }, + { + "name": "凤山县" + }, + { + "name": "东兰县" + }, + { + "name": "罗城仫佬族自治县" + }, + { + "name": "环江毛南族自治县" + }, + { + "name": "巴马瑶族自治县" + }, + { + "name": "都安瑶族自治县" + }, + { + "name": "大化瑶族自治县" + } + ] + }, + { + "name": "来宾市", + "children": [ + { + "name": "兴宾区" + }, + { + "name": "忻城县" + }, + { + "name": "象州县" + }, + { + "name": "武宣县" + }, + { + "name": "金秀瑶族自治县" + }, + { + "name": "合山市" + } + ] + }, + { + "name": "崇左市", + "children": [ + { + "name": "江州区" + }, + { + "name": "扶绥县" + }, + { + "name": "宁明县" + }, + { + "name": "龙州县" + }, + { + "name": "大新县" + }, + { + "name": "天等县" + }, + { + "name": "凭祥市" + } + ] + } + ] + }, + { + "name": "海南省", + "children": [ + { + "name": "海口市", + "children": [ + { + "name": "秀英区" + }, + { + "name": "龙华区" + }, + { + "name": "琼山区" + }, + { + "name": "美兰区" + } + ] + }, + { + "name": "三亚市", + "children": [ + { + "name": "海棠区" + }, + { + "name": "吉阳区" + }, + { + "name": "天涯区" + }, + { + "name": "崖州区" + } + ] + }, + { + "name": "三沙市", + "children": [] + }, + { + "name": "儋州市", + "children": [] + }, + { + "name": "五指山市", + "children": [] + }, + { + "name": "琼海市", + "children": [] + }, + { + "name": "文昌市", + "children": [] + }, + { + "name": "万宁市", + "children": [] + }, + { + "name": "东方市", + "children": [] + }, + { + "name": "定安县", + "children": [] + }, + { + "name": "屯昌县", + "children": [] + }, + { + "name": "澄迈县", + "children": [] + }, + { + "name": "临高县", + "children": [] + }, + { + "name": "白沙黎族自治县", + "children": [] + }, + { + "name": "昌江黎族自治县", + "children": [] + }, + { + "name": "乐东黎族自治县", + "children": [] + }, + { + "name": "陵水黎族自治县", + "children": [] + }, + { + "name": "保亭黎族苗族自治县", + "children": [] + }, + { + "name": "琼中黎族苗族自治县", + "children": [] + } + ] + }, + { + "name": "重庆市", + "children": [ + { + "name": "万州区", + "children": [] + }, + { + "name": "涪陵区", + "children": [] + }, + { + "name": "渝中区", + "children": [] + }, + { + "name": "大渡口区", + "children": [] + }, + { + "name": "江北区", + "children": [] + }, + { + "name": "沙坪坝区", + "children": [] + }, + { + "name": "九龙坡区", + "children": [] + }, + { + "name": "南岸区", + "children": [] + }, + { + "name": "北碚区", + "children": [] + }, + { + "name": "綦江区", + "children": [] + }, + { + "name": "大足区", + "children": [] + }, + { + "name": "渝北区", + "children": [] + }, + { + "name": "巴南区", + "children": [] + }, + { + "name": "黔江区", + "children": [] + }, + { + "name": "长寿区", + "children": [] + }, + { + "name": "江津区", + "children": [] + }, + { + "name": "合川区", + "children": [] + }, + { + "name": "永川区", + "children": [] + }, + { + "name": "南川区", + "children": [] + }, + { + "name": "璧山区", + "children": [] + }, + { + "name": "铜梁区", + "children": [] + }, + { + "name": "潼南区", + "children": [] + }, + { + "name": "荣昌区", + "children": [] + }, + { + "name": "开州区", + "children": [] + }, + { + "name": "梁平区", + "children": [] + }, + { + "name": "武隆区", + "children": [] + }, + { + "name": "城口县", + "children": [] + }, + { + "name": "丰都县", + "children": [] + }, + { + "name": "垫江县", + "children": [] + }, + { + "name": "忠县", + "children": [] + }, + { + "name": "云阳县", + "children": [] + }, + { + "name": "奉节县", + "children": [] + }, + { + "name": "巫山县", + "children": [] + }, + { + "name": "巫溪县", + "children": [] + }, + { + "name": "石柱土家族自治县", + "children": [] + }, + { + "name": "秀山土家族苗族自治县", + "children": [] + }, + { + "name": "酉阳土家族苗族自治县", + "children": [] + }, + { + "name": "彭水苗族土家族自治县", + "children": [] + } + ] + }, + { + "name": "四川省", + "children": [ + { + "name": "成都市", + "children": [ + { + "name": "锦江区" + }, + { + "name": "青羊区" + }, + { + "name": "金牛区" + }, + { + "name": "武侯区" + }, + { + "name": "成华区" + }, + { + "name": "龙泉驿区" + }, + { + "name": "青白江区" + }, + { + "name": "新都区" + }, + { + "name": "温江区" + }, + { + "name": "双流区" + }, + { + "name": "郫都区" + }, + { + "name": "新津区" + }, + { + "name": "金堂县" + }, + { + "name": "大邑县" + }, + { + "name": "蒲江县" + }, + { + "name": "都江堰市" + }, + { + "name": "彭州市" + }, + { + "name": "邛崃市" + }, + { + "name": "崇州市" + }, + { + "name": "简阳市" + } + ] + }, + { + "name": "自贡市", + "children": [ + { + "name": "自流井区" + }, + { + "name": "贡井区" + }, + { + "name": "大安区" + }, + { + "name": "沿滩区" + }, + { + "name": "荣县" + }, + { + "name": "富顺县" + } + ] + }, + { + "name": "攀枝花市", + "children": [ + { + "name": "东区" + }, + { + "name": "西区" + }, + { + "name": "仁和区" + }, + { + "name": "米易县" + }, + { + "name": "盐边县" + } + ] + }, + { + "name": "泸州市", + "children": [ + { + "name": "江阳区" + }, + { + "name": "纳溪区" + }, + { + "name": "龙马潭区" + }, + { + "name": "泸县" + }, + { + "name": "合江县" + }, + { + "name": "叙永县" + }, + { + "name": "古蔺县" + } + ] + }, + { + "name": "德阳市", + "children": [ + { + "name": "旌阳区" + }, + { + "name": "罗江区" + }, + { + "name": "中江县" + }, + { + "name": "广汉市" + }, + { + "name": "什邡市" + }, + { + "name": "绵竹市" + } + ] + }, + { + "name": "绵阳市", + "children": [ + { + "name": "涪城区" + }, + { + "name": "游仙区" + }, + { + "name": "安州区" + }, + { + "name": "三台县" + }, + { + "name": "盐亭县" + }, + { + "name": "梓潼县" + }, + { + "name": "北川羌族自治县" + }, + { + "name": "平武县" + }, + { + "name": "江油市" + } + ] + }, + { + "name": "广元市", + "children": [ + { + "name": "利州区" + }, + { + "name": "昭化区" + }, + { + "name": "朝天区" + }, + { + "name": "旺苍县" + }, + { + "name": "青川县" + }, + { + "name": "剑阁县" + }, + { + "name": "苍溪县" + } + ] + }, + { + "name": "遂宁市", + "children": [ + { + "name": "船山区" + }, + { + "name": "安居区" + }, + { + "name": "蓬溪县" + }, + { + "name": "射洪市" + }, + { + "name": "大英县" + } + ] + }, + { + "name": "内江市", + "children": [ + { + "name": "市中区" + }, + { + "name": "东兴区" + }, + { + "name": "威远县" + }, + { + "name": "资中县" + }, + { + "name": "隆昌市" + } + ] + }, + { + "name": "乐山市", + "children": [ + { + "name": "市中区" + }, + { + "name": "沙湾区" + }, + { + "name": "五通桥区" + }, + { + "name": "金口河区" + }, + { + "name": "犍为县" + }, + { + "name": "井研县" + }, + { + "name": "夹江县" + }, + { + "name": "沐川县" + }, + { + "name": "峨边彝族自治县" + }, + { + "name": "马边彝族自治县" + }, + { + "name": "峨眉山市" + } + ] + }, + { + "name": "南充市", + "children": [ + { + "name": "顺庆区" + }, + { + "name": "高坪区" + }, + { + "name": "嘉陵区" + }, + { + "name": "南部县" + }, + { + "name": "营山县" + }, + { + "name": "蓬安县" + }, + { + "name": "仪陇县" + }, + { + "name": "西充县" + }, + { + "name": "阆中市" + } + ] + }, + { + "name": "眉山市", + "children": [ + { + "name": "东坡区" + }, + { + "name": "彭山区" + }, + { + "name": "仁寿县" + }, + { + "name": "洪雅县" + }, + { + "name": "丹棱县" + }, + { + "name": "青神县" + } + ] + }, + { + "name": "宜宾市", + "children": [ + { + "name": "翠屏区" + }, + { + "name": "南溪区" + }, + { + "name": "叙州区" + }, + { + "name": "江安县" + }, + { + "name": "长宁县" + }, + { + "name": "高县" + }, + { + "name": "珙县" + }, + { + "name": "筠连县" + }, + { + "name": "兴文县" + }, + { + "name": "屏山县" + } + ] + }, + { + "name": "广安市", + "children": [ + { + "name": "广安区" + }, + { + "name": "前锋区" + }, + { + "name": "岳池县" + }, + { + "name": "武胜县" + }, + { + "name": "邻水县" + }, + { + "name": "华蓥市" + } + ] + }, + { + "name": "达州市", + "children": [ + { + "name": "通川区" + }, + { + "name": "达川区" + }, + { + "name": "宣汉县" + }, + { + "name": "开江县" + }, + { + "name": "大竹县" + }, + { + "name": "渠县" + }, + { + "name": "万源市" + } + ] + }, + { + "name": "雅安市", + "children": [ + { + "name": "雨城区" + }, + { + "name": "名山区" + }, + { + "name": "荥经县" + }, + { + "name": "汉源县" + }, + { + "name": "石棉县" + }, + { + "name": "天全县" + }, + { + "name": "芦山县" + }, + { + "name": "宝兴县" + } + ] + }, + { + "name": "巴中市", + "children": [ + { + "name": "巴州区" + }, + { + "name": "恩阳区" + }, + { + "name": "通江县" + }, + { + "name": "南江县" + }, + { + "name": "平昌县" + } + ] + }, + { + "name": "资阳市", + "children": [ + { + "name": "雁江区" + }, + { + "name": "安岳县" + }, + { + "name": "乐至县" + } + ] + }, + { + "name": "阿坝藏族羌族自治州", + "children": [ + { + "name": "马尔康市" + }, + { + "name": "汶川县" + }, + { + "name": "理县" + }, + { + "name": "茂县" + }, + { + "name": "松潘县" + }, + { + "name": "九寨沟县" + }, + { + "name": "金川县" + }, + { + "name": "小金县" + }, + { + "name": "黑水县" + }, + { + "name": "壤塘县" + }, + { + "name": "阿坝县" + }, + { + "name": "若尔盖县" + }, + { + "name": "红原县" + } + ] + }, + { + "name": "甘孜藏族自治州", + "children": [ + { + "name": "康定市" + }, + { + "name": "泸定县" + }, + { + "name": "丹巴县" + }, + { + "name": "九龙县" + }, + { + "name": "雅江县" + }, + { + "name": "道孚县" + }, + { + "name": "炉霍县" + }, + { + "name": "甘孜县" + }, + { + "name": "新龙县" + }, + { + "name": "德格县" + }, + { + "name": "白玉县" + }, + { + "name": "石渠县" + }, + { + "name": "色达县" + }, + { + "name": "理塘县" + }, + { + "name": "巴塘县" + }, + { + "name": "乡城县" + }, + { + "name": "稻城县" + }, + { + "name": "得荣县" + } + ] + }, + { + "name": "凉山彝族自治州", + "children": [ + { + "name": "西昌市" + }, + { + "name": "木里藏族自治县" + }, + { + "name": "盐源县" + }, + { + "name": "德昌县" + }, + { + "name": "会理市" + }, + { + "name": "会东县" + }, + { + "name": "宁南县" + }, + { + "name": "普格县" + }, + { + "name": "布拖县" + }, + { + "name": "金阳县" + }, + { + "name": "昭觉县" + }, + { + "name": "喜德县" + }, + { + "name": "冕宁县" + }, + { + "name": "越西县" + }, + { + "name": "甘洛县" + }, + { + "name": "美姑县" + }, + { + "name": "雷波县" + } + ] + } + ] + }, + { + "name": "贵州省", + "children": [ + { + "name": "贵阳市", + "children": [ + { + "name": "南明区" + }, + { + "name": "云岩区" + }, + { + "name": "花溪区" + }, + { + "name": "乌当区" + }, + { + "name": "白云区" + }, + { + "name": "观山湖区" + }, + { + "name": "开阳县" + }, + { + "name": "息烽县" + }, + { + "name": "修文县" + }, + { + "name": "清镇市" + } + ] + }, + { + "name": "六盘水市", + "children": [ + { + "name": "钟山区" + }, + { + "name": "六枝特区" + }, + { + "name": "水城区" + }, + { + "name": "盘州市" + } + ] + }, + { + "name": "遵义市", + "children": [ + { + "name": "红花岗区" + }, + { + "name": "汇川区" + }, + { + "name": "播州区" + }, + { + "name": "桐梓县" + }, + { + "name": "绥阳县" + }, + { + "name": "正安县" + }, + { + "name": "道真仡佬族苗族自治县" + }, + { + "name": "务川仡佬族苗族自治县" + }, + { + "name": "凤冈县" + }, + { + "name": "湄潭县" + }, + { + "name": "余庆县" + }, + { + "name": "习水县" + }, + { + "name": "赤水市" + }, + { + "name": "仁怀市" + } + ] + }, + { + "name": "安顺市", + "children": [ + { + "name": "西秀区" + }, + { + "name": "平坝区" + }, + { + "name": "普定县" + }, + { + "name": "镇宁布依族苗族自治县" + }, + { + "name": "关岭布依族苗族自治县" + }, + { + "name": "紫云苗族布依族自治县" + } + ] + }, + { + "name": "毕节市", + "children": [ + { + "name": "七星关区" + }, + { + "name": "大方县" + }, + { + "name": "黔西市" + }, + { + "name": "金沙县" + }, + { + "name": "织金县" + }, + { + "name": "纳雍县" + }, + { + "name": "威宁彝族回族苗族自治县" + }, + { + "name": "赫章县" + } + ] + }, + { + "name": "铜仁市", + "children": [ + { + "name": "碧江区" + }, + { + "name": "万山区" + }, + { + "name": "江口县" + }, + { + "name": "玉屏侗族自治县" + }, + { + "name": "石阡县" + }, + { + "name": "思南县" + }, + { + "name": "印江土家族苗族自治县" + }, + { + "name": "德江县" + }, + { + "name": "沿河土家族自治县" + }, + { + "name": "松桃苗族自治县" + } + ] + }, + { + "name": "黔西南布依族苗族自治州", + "children": [ + { + "name": "兴义市" + }, + { + "name": "兴仁市" + }, + { + "name": "普安县" + }, + { + "name": "晴隆县" + }, + { + "name": "贞丰县" + }, + { + "name": "望谟县" + }, + { + "name": "册亨县" + }, + { + "name": "安龙县" + } + ] + }, + { + "name": "黔东南苗族侗族自治州", + "children": [ + { + "name": "凯里市" + }, + { + "name": "黄平县" + }, + { + "name": "施秉县" + }, + { + "name": "三穗县" + }, + { + "name": "镇远县" + }, + { + "name": "岑巩县" + }, + { + "name": "天柱县" + }, + { + "name": "锦屏县" + }, + { + "name": "剑河县" + }, + { + "name": "台江县" + }, + { + "name": "黎平县" + }, + { + "name": "榕江县" + }, + { + "name": "从江县" + }, + { + "name": "雷山县" + }, + { + "name": "麻江县" + }, + { + "name": "丹寨县" + } + ] + }, + { + "name": "黔南布依族苗族自治州", + "children": [ + { + "name": "都匀市" + }, + { + "name": "福泉市" + }, + { + "name": "荔波县" + }, + { + "name": "贵定县" + }, + { + "name": "瓮安县" + }, + { + "name": "独山县" + }, + { + "name": "平塘县" + }, + { + "name": "罗甸县" + }, + { + "name": "长顺县" + }, + { + "name": "龙里县" + }, + { + "name": "惠水县" + }, + { + "name": "三都水族自治县" + } + ] + } + ] + }, + { + "name": "云南省", + "children": [ + { + "name": "昆明市", + "children": [ + { + "name": "五华区" + }, + { + "name": "盘龙区" + }, + { + "name": "官渡区" + }, + { + "name": "西山区" + }, + { + "name": "东川区" + }, + { + "name": "呈贡区" + }, + { + "name": "晋宁区" + }, + { + "name": "富民县" + }, + { + "name": "宜良县" + }, + { + "name": "石林彝族自治县" + }, + { + "name": "嵩明县" + }, + { + "name": "禄劝彝族苗族自治县" + }, + { + "name": "寻甸回族彝族自治县" + }, + { + "name": "安宁市" + } + ] + }, + { + "name": "曲靖市", + "children": [ + { + "name": "麒麟区" + }, + { + "name": "沾益区" + }, + { + "name": "马龙区" + }, + { + "name": "陆良县" + }, + { + "name": "师宗县" + }, + { + "name": "罗平县" + }, + { + "name": "富源县" + }, + { + "name": "会泽县" + }, + { + "name": "宣威市" + } + ] + }, + { + "name": "玉溪市", + "children": [ + { + "name": "红塔区" + }, + { + "name": "江川区" + }, + { + "name": "通海县" + }, + { + "name": "华宁县" + }, + { + "name": "易门县" + }, + { + "name": "峨山彝族自治县" + }, + { + "name": "新平彝族傣族自治县" + }, + { + "name": "元江哈尼族彝族傣族自治县" + }, + { + "name": "澄江市" + } + ] + }, + { + "name": "保山市", + "children": [ + { + "name": "隆阳区" + }, + { + "name": "施甸县" + }, + { + "name": "龙陵县" + }, + { + "name": "昌宁县" + }, + { + "name": "腾冲市" + } + ] + }, + { + "name": "昭通市", + "children": [ + { + "name": "昭阳区" + }, + { + "name": "鲁甸县" + }, + { + "name": "巧家县" + }, + { + "name": "盐津县" + }, + { + "name": "大关县" + }, + { + "name": "永善县" + }, + { + "name": "绥江县" + }, + { + "name": "镇雄县" + }, + { + "name": "彝良县" + }, + { + "name": "威信县" + }, + { + "name": "水富市" + } + ] + }, + { + "name": "丽江市", + "children": [ + { + "name": "古城区" + }, + { + "name": "玉龙纳西族自治县" + }, + { + "name": "永胜县" + }, + { + "name": "华坪县" + }, + { + "name": "宁蒗彝族自治县" + } + ] + }, + { + "name": "普洱市", + "children": [ + { + "name": "思茅区" + }, + { + "name": "宁洱哈尼族彝族自治县" + }, + { + "name": "墨江哈尼族自治县" + }, + { + "name": "景东彝族自治县" + }, + { + "name": "景谷傣族彝族自治县" + }, + { + "name": "镇沅彝族哈尼族拉祜族自治县" + }, + { + "name": "江城哈尼族彝族自治县" + }, + { + "name": "孟连傣族拉祜族佤族自治县" + }, + { + "name": "澜沧拉祜族自治县" + }, + { + "name": "西盟佤族自治县" + } + ] + }, + { + "name": "临沧市", + "children": [ + { + "name": "临翔区" + }, + { + "name": "凤庆县" + }, + { + "name": "云县" + }, + { + "name": "永德县" + }, + { + "name": "镇康县" + }, + { + "name": "双江拉祜族佤族布朗族傣族自治县" + }, + { + "name": "耿马傣族佤族自治县" + }, + { + "name": "沧源佤族自治县" + } + ] + }, + { + "name": "楚雄彝族自治州", + "children": [ + { + "name": "楚雄市" + }, + { + "name": "双柏县" + }, + { + "name": "牟定县" + }, + { + "name": "南华县" + }, + { + "name": "姚安县" + }, + { + "name": "大姚县" + }, + { + "name": "永仁县" + }, + { + "name": "元谋县" + }, + { + "name": "武定县" + }, + { + "name": "禄丰市" + } + ] + }, + { + "name": "红河哈尼族彝族自治州", + "children": [ + { + "name": "个旧市" + }, + { + "name": "开远市" + }, + { + "name": "蒙自市" + }, + { + "name": "弥勒市" + }, + { + "name": "屏边苗族自治县" + }, + { + "name": "建水县" + }, + { + "name": "石屏县" + }, + { + "name": "泸西县" + }, + { + "name": "元阳县" + }, + { + "name": "红河县" + }, + { + "name": "金平苗族瑶族傣族自治县" + }, + { + "name": "绿春县" + }, + { + "name": "河口瑶族自治县" + } + ] + }, + { + "name": "文山壮族苗族自治州", + "children": [ + { + "name": "文山市" + }, + { + "name": "砚山县" + }, + { + "name": "西畴县" + }, + { + "name": "麻栗坡县" + }, + { + "name": "马关县" + }, + { + "name": "丘北县" + }, + { + "name": "广南县" + }, + { + "name": "富宁县" + } + ] + }, + { + "name": "西双版纳傣族自治州", + "children": [ + { + "name": "景洪市" + }, + { + "name": "勐海县" + }, + { + "name": "勐腊县" + } + ] + }, + { + "name": "大理白族自治州", + "children": [ + { + "name": "大理市" + }, + { + "name": "漾濞彝族自治县" + }, + { + "name": "祥云县" + }, + { + "name": "宾川县" + }, + { + "name": "弥渡县" + }, + { + "name": "南涧彝族自治县" + }, + { + "name": "巍山彝族回族自治县" + }, + { + "name": "永平县" + }, + { + "name": "云龙县" + }, + { + "name": "洱源县" + }, + { + "name": "剑川县" + }, + { + "name": "鹤庆县" + } + ] + }, + { + "name": "德宏傣族景颇族自治州", + "children": [ + { + "name": "瑞丽市" + }, + { + "name": "芒市" + }, + { + "name": "梁河县" + }, + { + "name": "盈江县" + }, + { + "name": "陇川县" + } + ] + }, + { + "name": "怒江傈僳族自治州", + "children": [ + { + "name": "泸水市" + }, + { + "name": "福贡县" + }, + { + "name": "贡山独龙族怒族自治县" + }, + { + "name": "兰坪白族普米族自治县" + } + ] + }, + { + "name": "迪庆藏族自治州", + "children": [ + { + "name": "香格里拉市" + }, + { + "name": "德钦县" + }, + { + "name": "维西傈僳族自治县" + } + ] + } + ] + }, + { + "name": "西藏自治区", + "children": [ + { + "name": "拉萨市", + "children": [ + { + "name": "城关区" + }, + { + "name": "堆龙德庆区" + }, + { + "name": "达孜区" + }, + { + "name": "林周县" + }, + { + "name": "当雄县" + }, + { + "name": "尼木县" + }, + { + "name": "曲水县" + }, + { + "name": "墨竹工卡县" + } + ] + }, + { + "name": "日喀则市", + "children": [ + { + "name": "桑珠孜区" + }, + { + "name": "南木林县" + }, + { + "name": "江孜县" + }, + { + "name": "定日县" + }, + { + "name": "萨迦县" + }, + { + "name": "拉孜县" + }, + { + "name": "昂仁县" + }, + { + "name": "谢通门县" + }, + { + "name": "白朗县" + }, + { + "name": "仁布县" + }, + { + "name": "康马县" + }, + { + "name": "定结县" + }, + { + "name": "仲巴县" + }, + { + "name": "亚东县" + }, + { + "name": "吉隆县" + }, + { + "name": "聂拉木县" + }, + { + "name": "萨嘎县" + }, + { + "name": "岗巴县" + } + ] + }, + { + "name": "昌都市", + "children": [ + { + "name": "卡若区" + }, + { + "name": "江达县" + }, + { + "name": "贡觉县" + }, + { + "name": "类乌齐县" + }, + { + "name": "丁青县" + }, + { + "name": "察雅县" + }, + { + "name": "八宿县" + }, + { + "name": "左贡县" + }, + { + "name": "芒康县" + }, + { + "name": "洛隆县" + }, + { + "name": "边坝县" + } + ] + }, + { + "name": "林芝市", + "children": [ + { + "name": "巴宜区" + }, + { + "name": "工布江达县" + }, + { + "name": "米林县" + }, + { + "name": "墨脱县" + }, + { + "name": "波密县" + }, + { + "name": "察隅县" + }, + { + "name": "朗县" + } + ] + }, + { + "name": "山南市", + "children": [ + { + "name": "乃东区" + }, + { + "name": "扎囊县" + }, + { + "name": "贡嘎县" + }, + { + "name": "桑日县" + }, + { + "name": "琼结县" + }, + { + "name": "曲松县" + }, + { + "name": "措美县" + }, + { + "name": "洛扎县" + }, + { + "name": "加查县" + }, + { + "name": "隆子县" + }, + { + "name": "错那县" + }, + { + "name": "浪卡子县" + } + ] + }, + { + "name": "那曲市", + "children": [ + { + "name": "色尼区" + }, + { + "name": "嘉黎县" + }, + { + "name": "比如县" + }, + { + "name": "聂荣县" + }, + { + "name": "安多县" + }, + { + "name": "申扎县" + }, + { + "name": "索县" + }, + { + "name": "班戈县" + }, + { + "name": "巴青县" + }, + { + "name": "尼玛县" + }, + { + "name": "双湖县" + } + ] + }, + { + "name": "阿里地区", + "children": [ + { + "name": "普兰县" + }, + { + "name": "札达县" + }, + { + "name": "噶尔县" + }, + { + "name": "日土县" + }, + { + "name": "革吉县" + }, + { + "name": "改则县" + }, + { + "name": "措勤县" + } + ] + } + ] + }, + { + "name": "陕西省", + "children": [ + { + "name": "西安市", + "children": [ + { + "name": "新城区" + }, + { + "name": "碑林区" + }, + { + "name": "莲湖区" + }, + { + "name": "灞桥区" + }, + { + "name": "未央区" + }, + { + "name": "雁塔区" + }, + { + "name": "阎良区" + }, + { + "name": "临潼区" + }, + { + "name": "长安区" + }, + { + "name": "高陵区" + }, + { + "name": "鄠邑区" + }, + { + "name": "蓝田县" + }, + { + "name": "周至县" + } + ] + }, + { + "name": "铜川市", + "children": [ + { + "name": "王益区" + }, + { + "name": "印台区" + }, + { + "name": "耀州区" + }, + { + "name": "宜君县" + } + ] + }, + { + "name": "宝鸡市", + "children": [ + { + "name": "渭滨区" + }, + { + "name": "金台区" + }, + { + "name": "陈仓区" + }, + { + "name": "凤翔区" + }, + { + "name": "岐山县" + }, + { + "name": "扶风县" + }, + { + "name": "眉县" + }, + { + "name": "陇县" + }, + { + "name": "千阳县" + }, + { + "name": "麟游县" + }, + { + "name": "凤县" + }, + { + "name": "太白县" + } + ] + }, + { + "name": "咸阳市", + "children": [ + { + "name": "秦都区" + }, + { + "name": "杨陵区" + }, + { + "name": "渭城区" + }, + { + "name": "三原县" + }, + { + "name": "泾阳县" + }, + { + "name": "乾县" + }, + { + "name": "礼泉县" + }, + { + "name": "永寿县" + }, + { + "name": "长武县" + }, + { + "name": "旬邑县" + }, + { + "name": "淳化县" + }, + { + "name": "武功县" + }, + { + "name": "兴平市" + }, + { + "name": "彬州市" + } + ] + }, + { + "name": "渭南市", + "children": [ + { + "name": "临渭区" + }, + { + "name": "华州区" + }, + { + "name": "潼关县" + }, + { + "name": "大荔县" + }, + { + "name": "合阳县" + }, + { + "name": "澄城县" + }, + { + "name": "蒲城县" + }, + { + "name": "白水县" + }, + { + "name": "富平县" + }, + { + "name": "韩城市" + }, + { + "name": "华阴市" + } + ] + }, + { + "name": "延安市", + "children": [ + { + "name": "宝塔区" + }, + { + "name": "安塞区" + }, + { + "name": "延长县" + }, + { + "name": "延川县" + }, + { + "name": "志丹县" + }, + { + "name": "吴起县" + }, + { + "name": "甘泉县" + }, + { + "name": "富县" + }, + { + "name": "洛川县" + }, + { + "name": "宜川县" + }, + { + "name": "黄龙县" + }, + { + "name": "黄陵县" + }, + { + "name": "子长市" + } + ] + }, + { + "name": "汉中市", + "children": [ + { + "name": "汉台区" + }, + { + "name": "南郑区" + }, + { + "name": "城固县" + }, + { + "name": "洋县" + }, + { + "name": "西乡县" + }, + { + "name": "勉县" + }, + { + "name": "宁强县" + }, + { + "name": "略阳县" + }, + { + "name": "镇巴县" + }, + { + "name": "留坝县" + }, + { + "name": "佛坪县" + } + ] + }, + { + "name": "榆林市", + "children": [ + { + "name": "榆阳区" + }, + { + "name": "横山区" + }, + { + "name": "府谷县" + }, + { + "name": "靖边县" + }, + { + "name": "定边县" + }, + { + "name": "绥德县" + }, + { + "name": "米脂县" + }, + { + "name": "佳县" + }, + { + "name": "吴堡县" + }, + { + "name": "清涧县" + }, + { + "name": "子洲县" + }, + { + "name": "神木市" + } + ] + }, + { + "name": "安康市", + "children": [ + { + "name": "汉滨区" + }, + { + "name": "汉阴县" + }, + { + "name": "石泉县" + }, + { + "name": "宁陕县" + }, + { + "name": "紫阳县" + }, + { + "name": "岚皋县" + }, + { + "name": "平利县" + }, + { + "name": "镇坪县" + }, + { + "name": "旬阳市" + }, + { + "name": "白河县" + } + ] + }, + { + "name": "商洛市", + "children": [ + { + "name": "商州区" + }, + { + "name": "洛南县" + }, + { + "name": "丹凤县" + }, + { + "name": "商南县" + }, + { + "name": "山阳县" + }, + { + "name": "镇安县" + }, + { + "name": "柞水县" + } + ] + } + ] + }, + { + "name": "甘肃省", + "children": [ + { + "name": "兰州市", + "children": [ + { + "name": "城关区" + }, + { + "name": "七里河区" + }, + { + "name": "西固区" + }, + { + "name": "安宁区" + }, + { + "name": "红古区" + }, + { + "name": "永登县" + }, + { + "name": "皋兰县" + }, + { + "name": "榆中县" + } + ] + }, + { + "name": "嘉峪关市", + "children": [] + }, + { + "name": "金昌市", + "children": [ + { + "name": "金川区" + }, + { + "name": "永昌县" + } + ] + }, + { + "name": "白银市", + "children": [ + { + "name": "白银区" + }, + { + "name": "平川区" + }, + { + "name": "靖远县" + }, + { + "name": "会宁县" + }, + { + "name": "景泰县" + } + ] + }, + { + "name": "天水市", + "children": [ + { + "name": "秦州区" + }, + { + "name": "麦积区" + }, + { + "name": "清水县" + }, + { + "name": "秦安县" + }, + { + "name": "甘谷县" + }, + { + "name": "武山县" + }, + { + "name": "张家川回族自治县" + } + ] + }, + { + "name": "武威市", + "children": [ + { + "name": "凉州区" + }, + { + "name": "民勤县" + }, + { + "name": "古浪县" + }, + { + "name": "天祝藏族自治县" + } + ] + }, + { + "name": "张掖市", + "children": [ + { + "name": "甘州区" + }, + { + "name": "肃南裕固族自治县" + }, + { + "name": "民乐县" + }, + { + "name": "临泽县" + }, + { + "name": "高台县" + }, + { + "name": "山丹县" + } + ] + }, + { + "name": "平凉市", + "children": [ + { + "name": "崆峒区" + }, + { + "name": "泾川县" + }, + { + "name": "灵台县" + }, + { + "name": "崇信县" + }, + { + "name": "庄浪县" + }, + { + "name": "静宁县" + }, + { + "name": "华亭市" + } + ] + }, + { + "name": "酒泉市", + "children": [ + { + "name": "肃州区" + }, + { + "name": "金塔县" + }, + { + "name": "瓜州县" + }, + { + "name": "肃北蒙古族自治县" + }, + { + "name": "阿克塞哈萨克族自治县" + }, + { + "name": "玉门市" + }, + { + "name": "敦煌市" + } + ] + }, + { + "name": "庆阳市", + "children": [ + { + "name": "西峰区" + }, + { + "name": "庆城县" + }, + { + "name": "环县" + }, + { + "name": "华池县" + }, + { + "name": "合水县" + }, + { + "name": "正宁县" + }, + { + "name": "宁县" + }, + { + "name": "镇原县" + } + ] + }, + { + "name": "定西市", + "children": [ + { + "name": "安定区" + }, + { + "name": "通渭县" + }, + { + "name": "陇西县" + }, + { + "name": "渭源县" + }, + { + "name": "临洮县" + }, + { + "name": "漳县" + }, + { + "name": "岷县" + } + ] + }, + { + "name": "陇南市", + "children": [ + { + "name": "武都区" + }, + { + "name": "成县" + }, + { + "name": "文县" + }, + { + "name": "宕昌县" + }, + { + "name": "康县" + }, + { + "name": "西和县" + }, + { + "name": "礼县" + }, + { + "name": "徽县" + }, + { + "name": "两当县" + } + ] + }, + { + "name": "临夏回族自治州", + "children": [ + { + "name": "临夏市" + }, + { + "name": "临夏县" + }, + { + "name": "康乐县" + }, + { + "name": "永靖县" + }, + { + "name": "广河县" + }, + { + "name": "和政县" + }, + { + "name": "东乡族自治县" + }, + { + "name": "积石山保安族东乡族撒拉族自治县" + } + ] + }, + { + "name": "甘南藏族自治州", + "children": [ + { + "name": "合作市" + }, + { + "name": "临潭县" + }, + { + "name": "卓尼县" + }, + { + "name": "舟曲县" + }, + { + "name": "迭部县" + }, + { + "name": "玛曲县" + }, + { + "name": "碌曲县" + }, + { + "name": "夏河县" + } + ] + } + ] + }, + { + "name": "青海省", + "children": [ + { + "name": "西宁市", + "children": [ + { + "name": "城东区" + }, + { + "name": "城中区" + }, + { + "name": "城西区" + }, + { + "name": "城北区" + }, + { + "name": "湟中区" + }, + { + "name": "大通回族土族自治县" + }, + { + "name": "湟源县" + } + ] + }, + { + "name": "海东市", + "children": [ + { + "name": "乐都区" + }, + { + "name": "平安区" + }, + { + "name": "民和回族土族自治县" + }, + { + "name": "互助土族自治县" + }, + { + "name": "化隆回族自治县" + }, + { + "name": "循化撒拉族自治县" + } + ] + }, + { + "name": "海北藏族自治州", + "children": [ + { + "name": "门源回族自治县" + }, + { + "name": "祁连县" + }, + { + "name": "海晏县" + }, + { + "name": "刚察县" + } + ] + }, + { + "name": "黄南藏族自治州", + "children": [ + { + "name": "同仁市" + }, + { + "name": "尖扎县" + }, + { + "name": "泽库县" + }, + { + "name": "河南蒙古族自治县" + } + ] + }, + { + "name": "海南藏族自治州", + "children": [ + { + "name": "共和县" + }, + { + "name": "同德县" + }, + { + "name": "贵德县" + }, + { + "name": "兴海县" + }, + { + "name": "贵南县" + } + ] + }, + { + "name": "果洛藏族自治州", + "children": [ + { + "name": "玛沁县" + }, + { + "name": "班玛县" + }, + { + "name": "甘德县" + }, + { + "name": "达日县" + }, + { + "name": "久治县" + }, + { + "name": "玛多县" + } + ] + }, + { + "name": "玉树藏族自治州", + "children": [ + { + "name": "玉树市" + }, + { + "name": "杂多县" + }, + { + "name": "称多县" + }, + { + "name": "治多县" + }, + { + "name": "囊谦县" + }, + { + "name": "曲麻莱县" + } + ] + }, + { + "name": "海西蒙古族藏族自治州", + "children": [ + { + "name": "德令哈市" + }, + { + "name": "格尔木市" + }, + { + "name": "茫崖市" + }, + { + "name": "乌兰县" + }, + { + "name": "都兰县" + }, + { + "name": "天峻县" + }, + { + "name": "大柴旦行政委员会" + } + ] + } + ] + }, + { + "name": "宁夏回族自治区", + "children": [ + { + "name": "银川市", + "children": [ + { + "name": "兴庆区" + }, + { + "name": "西夏区" + }, + { + "name": "金凤区" + }, + { + "name": "永宁县" + }, + { + "name": "贺兰县" + }, + { + "name": "灵武市" + } + ] + }, + { + "name": "石嘴山市", + "children": [ + { + "name": "大武口区" + }, + { + "name": "惠农区" + }, + { + "name": "平罗县" + } + ] + }, + { + "name": "吴忠市", + "children": [ + { + "name": "利通区" + }, + { + "name": "红寺堡区" + }, + { + "name": "盐池县" + }, + { + "name": "同心县" + }, + { + "name": "青铜峡市" + } + ] + }, + { + "name": "固原市", + "children": [ + { + "name": "原州区" + }, + { + "name": "西吉县" + }, + { + "name": "隆德县" + }, + { + "name": "泾源县" + }, + { + "name": "彭阳县" + } + ] + }, + { + "name": "中卫市", + "children": [ + { + "name": "沙坡头区" + }, + { + "name": "中宁县" + }, + { + "name": "海原县" + } + ] + } + ] + }, + { + "name": "新疆维吾尔自治区", + "children": [ + { + "name": "乌鲁木齐市", + "children": [ + { + "name": "天山区" + }, + { + "name": "沙依巴克区" + }, + { + "name": "新市区" + }, + { + "name": "水磨沟区" + }, + { + "name": "头屯河区" + }, + { + "name": "达坂城区" + }, + { + "name": "米东区" + }, + { + "name": "乌鲁木齐县" + } + ] + }, + { + "name": "克拉玛依市", + "children": [ + { + "name": "独山子区" + }, + { + "name": "克拉玛依区" + }, + { + "name": "白碱滩区" + }, + { + "name": "乌尔禾区" + } + ] + }, + { + "name": "吐鲁番市", + "children": [ + { + "name": "高昌区" + }, + { + "name": "鄯善县" + }, + { + "name": "托克逊县" + } + ] + }, + { + "name": "哈密市", + "children": [ + { + "name": "伊州区" + }, + { + "name": "巴里坤哈萨克自治县" + }, + { + "name": "伊吾县" + } + ] + }, + { + "name": "昌吉回族自治州", + "children": [ + { + "name": "昌吉市" + }, + { + "name": "阜康市" + }, + { + "name": "呼图壁县" + }, + { + "name": "玛纳斯县" + }, + { + "name": "奇台县" + }, + { + "name": "吉木萨尔县" + }, + { + "name": "木垒哈萨克自治县" + } + ] + }, + { + "name": "博尔塔拉蒙古自治州", + "children": [ + { + "name": "博乐市" + }, + { + "name": "阿拉山口市" + }, + { + "name": "精河县" + }, + { + "name": "温泉县" + } + ] + }, + { + "name": "巴音郭楞蒙古自治州", + "children": [ + { + "name": "库尔勒市" + }, + { + "name": "轮台县" + }, + { + "name": "尉犁县" + }, + { + "name": "若羌县" + }, + { + "name": "且末县" + }, + { + "name": "焉耆回族自治县" + }, + { + "name": "和静县" + }, + { + "name": "和硕县" + }, + { + "name": "博湖县" + } + ] + }, + { + "name": "阿克苏地区", + "children": [ + { + "name": "阿克苏市" + }, + { + "name": "库车市" + }, + { + "name": "温宿县" + }, + { + "name": "沙雅县" + }, + { + "name": "新和县" + }, + { + "name": "拜城县" + }, + { + "name": "乌什县" + }, + { + "name": "阿瓦提县" + }, + { + "name": "柯坪县" + } + ] + }, + { + "name": "克孜勒苏柯尔克孜自治州", + "children": [ + { + "name": "阿图什市" + }, + { + "name": "阿克陶县" + }, + { + "name": "阿合奇县" + }, + { + "name": "乌恰县" + } + ] + }, + { + "name": "喀什地区", + "children": [ + { + "name": "喀什市" + }, + { + "name": "疏附县" + }, + { + "name": "疏勒县" + }, + { + "name": "英吉沙县" + }, + { + "name": "泽普县" + }, + { + "name": "莎车县" + }, + { + "name": "叶城县" + }, + { + "name": "麦盖提县" + }, + { + "name": "岳普湖县" + }, + { + "name": "伽师县" + }, + { + "name": "巴楚县" + }, + { + "name": "塔什库尔干塔吉克自治县" + } + ] + }, + { + "name": "和田地区", + "children": [ + { + "name": "和田市" + }, + { + "name": "和田县" + }, + { + "name": "墨玉县" + }, + { + "name": "皮山县" + }, + { + "name": "洛浦县" + }, + { + "name": "策勒县" + }, + { + "name": "于田县" + }, + { + "name": "民丰县" + } + ] + }, + { + "name": "伊犁哈萨克自治州", + "children": [ + { + "name": "伊宁市" + }, + { + "name": "奎屯市" + }, + { + "name": "霍尔果斯市" + }, + { + "name": "伊宁县" + }, + { + "name": "察布查尔锡伯自治县" + }, + { + "name": "霍城县" + }, + { + "name": "巩留县" + }, + { + "name": "新源县" + }, + { + "name": "昭苏县" + }, + { + "name": "特克斯县" + }, + { + "name": "尼勒克县" + } + ] + }, + { + "name": "塔城地区", + "children": [ + { + "name": "塔城市" + }, + { + "name": "乌苏市" + }, + { + "name": "额敏县" + }, + { + "name": "沙湾县" + }, + { + "name": "托里县" + }, + { + "name": "裕民县" + }, + { + "name": "和布克赛尔蒙古自治县" + } + ] + }, + { + "name": "阿勒泰地区", + "children": [ + { + "name": "阿勒泰市" + }, + { + "name": "布尔津县" + }, + { + "name": "富蕴县" + }, + { + "name": "福海县" + }, + { + "name": "哈巴河县" + }, + { + "name": "青河县" + }, + { + "name": "吉木乃县" + } + ] + }, + { + "name": "石河子市", + "children": [] + }, + { + "name": "阿拉尔市", + "children": [] + }, + { + "name": "图木舒克市", + "children": [] + }, + { + "name": "五家渠市", + "children": [] + }, + { + "name": "北屯市", + "children": [] + }, + { + "name": "铁门关市", + "children": [] + }, + { + "name": "双河市", + "children": [] + }, + { + "name": "可克达拉市", + "children": [] + }, + { + "name": "昆玉市", + "children": [] + }, + { + "name": "胡杨河市", + "children": [] + } + ] + } +] \ No newline at end of file diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000..bf130d6 Binary files /dev/null and b/static/logo.png differ diff --git a/static/主页.png b/static/主页.png new file mode 100644 index 0000000..bbbc124 Binary files /dev/null and b/static/主页.png differ diff --git a/static/主页_点击.png b/static/主页_点击.png new file mode 100644 index 0000000..f88844e Binary files /dev/null and b/static/主页_点击.png differ diff --git a/static/兑换失败.png b/static/兑换失败.png new file mode 100644 index 0000000..efb2028 Binary files /dev/null and b/static/兑换失败.png differ diff --git a/static/兑换成功.png b/static/兑换成功.png new file mode 100644 index 0000000..811d1e6 Binary files /dev/null and b/static/兑换成功.png differ diff --git a/static/可用积分背景图.png b/static/可用积分背景图.png new file mode 100644 index 0000000..e5df7dc Binary files /dev/null and b/static/可用积分背景图.png differ diff --git a/static/商城.png b/static/商城.png new file mode 100644 index 0000000..1e3521e Binary files /dev/null and b/static/商城.png differ diff --git a/static/商城_商品1.png b/static/商城_商品1.png new file mode 100644 index 0000000..0d03818 Binary files /dev/null and b/static/商城_商品1.png differ diff --git a/static/商城_商品2.png b/static/商城_商品2.png new file mode 100644 index 0000000..1dddc7d Binary files /dev/null and b/static/商城_商品2.png differ diff --git a/static/商城_点击.png b/static/商城_点击.png new file mode 100644 index 0000000..3566170 Binary files /dev/null and b/static/商城_点击.png differ diff --git a/static/商城_积分明细框.png b/static/商城_积分明细框.png new file mode 100644 index 0000000..e9d7947 Binary files /dev/null and b/static/商城_积分明细框.png differ diff --git a/static/失败弹窗.png b/static/失败弹窗.png new file mode 100644 index 0000000..7c68022 Binary files /dev/null and b/static/失败弹窗.png differ diff --git a/static/待上传头像.png b/static/待上传头像.png new file mode 100644 index 0000000..6dcb174 Binary files /dev/null and b/static/待上传头像.png differ diff --git a/static/志愿者箭头.png b/static/志愿者箭头.png new file mode 100644 index 0000000..9c04030 Binary files /dev/null and b/static/志愿者箭头.png differ diff --git a/static/成为志愿者.png b/static/成为志愿者.png new file mode 100644 index 0000000..e92433d Binary files /dev/null and b/static/成为志愿者.png differ diff --git a/static/成功弹窗.png b/static/成功弹窗.png new file mode 100644 index 0000000..f8b213d Binary files /dev/null and b/static/成功弹窗.png differ diff --git a/static/我的.png b/static/我的.png new file mode 100644 index 0000000..cd8454e Binary files /dev/null and b/static/我的.png differ diff --git a/static/我的_兑换记录.png b/static/我的_兑换记录.png new file mode 100644 index 0000000..c4c85b1 Binary files /dev/null and b/static/我的_兑换记录.png differ diff --git a/static/我的_关于我们.png b/static/我的_关于我们.png new file mode 100644 index 0000000..8f9b8eb Binary files /dev/null and b/static/我的_关于我们.png differ diff --git a/static/我的_商品收藏.png b/static/我的_商品收藏.png new file mode 100644 index 0000000..e0fe55a Binary files /dev/null and b/static/我的_商品收藏.png differ diff --git a/static/我的_我的报名.png b/static/我的_我的报名.png new file mode 100644 index 0000000..9527a3f Binary files /dev/null and b/static/我的_我的报名.png differ diff --git a/static/我的_我的资料.png b/static/我的_我的资料.png new file mode 100644 index 0000000..13d2515 Binary files /dev/null and b/static/我的_我的资料.png differ diff --git a/static/我的_活动收藏.png b/static/我的_活动收藏.png new file mode 100644 index 0000000..24725df Binary files /dev/null and b/static/我的_活动收藏.png differ diff --git a/static/我的_点击.png b/static/我的_点击.png new file mode 100644 index 0000000..ce87d42 Binary files /dev/null and b/static/我的_点击.png differ diff --git a/static/我的_积分.png b/static/我的_积分.png new file mode 100644 index 0000000..9e3a144 Binary files /dev/null and b/static/我的_积分.png differ diff --git a/static/我的_背景.png b/static/我的_背景.png new file mode 100644 index 0000000..0765ce8 Binary files /dev/null and b/static/我的_背景.png differ diff --git a/static/我的_退出登录.png b/static/我的_退出登录.png new file mode 100644 index 0000000..f70071d Binary files /dev/null and b/static/我的_退出登录.png differ diff --git a/static/报名成功.png b/static/报名成功.png new file mode 100644 index 0000000..cda8d00 Binary files /dev/null and b/static/报名成功.png differ diff --git a/static/推荐活动.png b/static/推荐活动.png new file mode 100644 index 0000000..dd526b8 Binary files /dev/null and b/static/推荐活动.png differ diff --git a/static/提交成功.png b/static/提交成功.png new file mode 100644 index 0000000..8ceb47c Binary files /dev/null and b/static/提交成功.png differ diff --git a/static/暂无搜索结果.png b/static/暂无搜索结果.png new file mode 100644 index 0000000..3f11f9a Binary files /dev/null and b/static/暂无搜索结果.png differ diff --git a/static/暂无收藏.png b/static/暂无收藏.png new file mode 100644 index 0000000..0606258 Binary files /dev/null and b/static/暂无收藏.png differ diff --git a/static/活动.png b/static/活动.png new file mode 100644 index 0000000..aa3c548 Binary files /dev/null and b/static/活动.png differ diff --git a/static/活动_点击.png b/static/活动_点击.png new file mode 100644 index 0000000..8de4449 Binary files /dev/null and b/static/活动_点击.png differ diff --git a/static/活动日历.png b/static/活动日历.png new file mode 100644 index 0000000..9cb93fb Binary files /dev/null and b/static/活动日历.png differ diff --git a/static/活动箭头.png b/static/活动箭头.png new file mode 100644 index 0000000..57f6228 Binary files /dev/null and b/static/活动箭头.png differ diff --git a/static/社区.png b/static/社区.png new file mode 100644 index 0000000..05604f0 Binary files /dev/null and b/static/社区.png differ diff --git a/static/社区_点击.png b/static/社区_点击.png new file mode 100644 index 0000000..9c6f2c3 Binary files /dev/null and b/static/社区_点击.png differ diff --git a/static/社区_背景.png b/static/社区_背景.png new file mode 100644 index 0000000..36b81e0 Binary files /dev/null and b/static/社区_背景.png differ diff --git a/static/社区_背景2.png b/static/社区_背景2.png new file mode 100644 index 0000000..7a93662 Binary files /dev/null and b/static/社区_背景2.png differ diff --git a/static/积分图标.png b/static/积分图标.png new file mode 100644 index 0000000..a265514 Binary files /dev/null and b/static/积分图标.png differ diff --git a/static/积分排行榜.png b/static/积分排行榜.png new file mode 100644 index 0000000..f18f537 Binary files /dev/null and b/static/积分排行榜.png differ diff --git a/static/签到成功.png b/static/签到成功.png new file mode 100644 index 0000000..398a31e Binary files /dev/null and b/static/签到成功.png differ diff --git a/static/组织介绍.png b/static/组织介绍.png new file mode 100644 index 0000000..686cb11 Binary files /dev/null and b/static/组织介绍.png differ diff --git a/static/组织箭头.png b/static/组织箭头.png new file mode 100644 index 0000000..af692d0 Binary files /dev/null and b/static/组织箭头.png differ diff --git a/static/首页_小喇叭.png b/static/首页_小喇叭.png new file mode 100644 index 0000000..8b5e8c4 Binary files /dev/null and b/static/首页_小喇叭.png differ diff --git a/static/默认头像.png b/static/默认头像.png new file mode 100644 index 0000000..7c58b4f Binary files /dev/null and b/static/默认头像.png differ diff --git a/stores/index.js b/stores/index.js new file mode 100644 index 0000000..0d02b96 --- /dev/null +++ b/stores/index.js @@ -0,0 +1,111 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import * as api from '@/api' + +Vue.use(Vuex) + +const store = new Vuex.Store({ + state: { + // 存放状态 + configList: [], + careerList: [], + qualificationList: [], + categoryGoodsList: [], + categoryActivityList: [] + }, + mutations: { + + setConfigList(state, data) { + state.configList = data + }, + setCareerList(state, data) { + state.careerList = data + }, + setQualificationList(state, data) { + state.qualificationList = data + }, + setCategoryGoodsList(state, data) { + state.categoryGoodsList = data + }, + setCategoryActivityList(state, data) { + state.categoryActivityList = data + } + }, + actions: { + // 查询配置列表 + async getConfig({ commit }) { + const res = await api.config.queryConfigList() + // 要求变成键值对的样子 + const config = res.result.records.reduce((acc, item) => { + if (!item.paramCode) { + console.log('paramCode为空', item); + return acc + } + acc[item.paramCode] = item + return acc + }, {}) + commit('setConfigList', config) + + }, + + // 查询职业列表 + async getCareer({ commit }) { + const res = await api.config.queryCareerList() + // if (res.code === 0) { + commit('setCareerList', res.result.records) + // } else { + // uni.showToast({ title: res.msg, icon: 'error' }) + // } + }, + + // 查询学历列表 + async getQualification({ commit }) { + const res = await api.config.queryQualificationList() + // if (res.code === 0) { + commit('setQualificationList', res.result.records) + // } else { + // uni.showToast({ title: res.msg, icon: 'error' }) + // } + }, + + // 查询商品分类列表 + async getCategoryGoodsList({ commit }) { + const res = await api.config.queryCategoryGoodsList() + commit('setCategoryGoodsList', res.result.records) + + }, + + // 查询活动分类列表 + async getCategoryActivityList({ commit }) { + const res = await api.config.queryCategoryActivityList() + commit('setCategoryActivityList', res.result.records) + }, + + // 初始化数据 + async initData({ dispatch, state }) { + // 检查是否已初始化 + if (state.configList.length > 0 && state.careerList.length > 0 && state.qualificationList.length > 0 && state.categoryGoodsList.length > 0 && state.categoryActivityList.length > 0) { + + console.log('配置数据已初始化,无需重复初始化') + return + } + + try { + await Promise.all([ + dispatch('getConfig'), + dispatch('getCareer'), + dispatch('getQualification'), + dispatch('getCategoryGoodsList'), + dispatch('getCategoryActivityList') + ]) + console.log('所有配置数据初始化完成') + } catch (error) { + console.error('配置数据初始化失败:', error) + } + }, + + + } +}) + +export default store \ No newline at end of file diff --git a/subPages/community/publishPost.vue b/subPages/community/publishPost.vue new file mode 100644 index 0000000..2599bbd --- /dev/null +++ b/subPages/community/publishPost.vue @@ -0,0 +1,351 @@ + + + + + \ No newline at end of file diff --git a/subPages/index/activityCalendar.vue b/subPages/index/activityCalendar.vue new file mode 100644 index 0000000..5a9c52b --- /dev/null +++ b/subPages/index/activityCalendar.vue @@ -0,0 +1,309 @@ + + + + + \ No newline at end of file diff --git a/subPages/index/activityDetail.vue b/subPages/index/activityDetail.vue new file mode 100644 index 0000000..afb2a5b --- /dev/null +++ b/subPages/index/activityDetail.vue @@ -0,0 +1,487 @@ + + + + + \ No newline at end of file diff --git a/subPages/index/announcement.vue b/subPages/index/announcement.vue new file mode 100644 index 0000000..32de381 --- /dev/null +++ b/subPages/index/announcement.vue @@ -0,0 +1,115 @@ + + + + + \ No newline at end of file diff --git a/subPages/index/announcementDetail.vue b/subPages/index/announcementDetail.vue new file mode 100644 index 0000000..1518022 --- /dev/null +++ b/subPages/index/announcementDetail.vue @@ -0,0 +1,97 @@ + + + + + \ No newline at end of file diff --git a/subPages/index/components/SignUpForm.vue b/subPages/index/components/SignUpForm.vue new file mode 100644 index 0000000..77e7f34 --- /dev/null +++ b/subPages/index/components/SignUpForm.vue @@ -0,0 +1,357 @@ + + + + + \ No newline at end of file diff --git a/subPages/index/organizationIntroduction.vue b/subPages/index/organizationIntroduction.vue new file mode 100644 index 0000000..d98820c --- /dev/null +++ b/subPages/index/organizationIntroduction.vue @@ -0,0 +1,93 @@ + + + + + \ No newline at end of file diff --git a/subPages/index/ranking.vue b/subPages/index/ranking.vue new file mode 100644 index 0000000..f12ff51 --- /dev/null +++ b/subPages/index/ranking.vue @@ -0,0 +1,330 @@ + + + + + \ No newline at end of file diff --git a/subPages/index/volunteerApply.vue b/subPages/index/volunteerApply.vue new file mode 100644 index 0000000..f87e1a3 --- /dev/null +++ b/subPages/index/volunteerApply.vue @@ -0,0 +1,617 @@ + + + + + \ No newline at end of file diff --git a/subPages/login/login.vue b/subPages/login/login.vue new file mode 100644 index 0000000..ebf8fc9 --- /dev/null +++ b/subPages/login/login.vue @@ -0,0 +1,291 @@ + + + + + \ No newline at end of file diff --git a/subPages/login/userInfo.vue b/subPages/login/userInfo.vue new file mode 100644 index 0000000..548f397 --- /dev/null +++ b/subPages/login/userInfo.vue @@ -0,0 +1,416 @@ + + + + + \ No newline at end of file diff --git a/subPages/my/activityCheckin.vue b/subPages/my/activityCheckin.vue new file mode 100644 index 0000000..654b951 --- /dev/null +++ b/subPages/my/activityCheckin.vue @@ -0,0 +1,163 @@ + + + + + \ No newline at end of file diff --git a/subPages/my/activityFavorites.vue b/subPages/my/activityFavorites.vue new file mode 100644 index 0000000..46d66ab --- /dev/null +++ b/subPages/my/activityFavorites.vue @@ -0,0 +1,145 @@ + + + + + \ No newline at end of file diff --git a/subPages/my/checkinCode.vue b/subPages/my/checkinCode.vue new file mode 100644 index 0000000..e6bb605 --- /dev/null +++ b/subPages/my/checkinCode.vue @@ -0,0 +1,246 @@ + + + + + \ No newline at end of file diff --git a/subPages/my/exchangeDetail.vue b/subPages/my/exchangeDetail.vue new file mode 100644 index 0000000..dd061ad --- /dev/null +++ b/subPages/my/exchangeDetail.vue @@ -0,0 +1,215 @@ + + + + + \ No newline at end of file diff --git a/subPages/my/exchangeRecord.vue b/subPages/my/exchangeRecord.vue new file mode 100644 index 0000000..f7ca6ea --- /dev/null +++ b/subPages/my/exchangeRecord.vue @@ -0,0 +1,241 @@ + + + + + \ No newline at end of file diff --git a/subPages/my/myActivityDetail.vue b/subPages/my/myActivityDetail.vue new file mode 100644 index 0000000..107788e --- /dev/null +++ b/subPages/my/myActivityDetail.vue @@ -0,0 +1,407 @@ + + + + + \ No newline at end of file diff --git a/subPages/my/myProfile.vue b/subPages/my/myProfile.vue new file mode 100644 index 0000000..9e9d5d6 --- /dev/null +++ b/subPages/my/myProfile.vue @@ -0,0 +1,366 @@ + + + + + \ No newline at end of file diff --git a/subPages/my/myRegistrations.vue b/subPages/my/myRegistrations.vue new file mode 100644 index 0000000..4a21d36 --- /dev/null +++ b/subPages/my/myRegistrations.vue @@ -0,0 +1,243 @@ + + + + + \ No newline at end of file diff --git a/subPages/my/productFavorites.vue b/subPages/my/productFavorites.vue new file mode 100644 index 0000000..d5ac3d6 --- /dev/null +++ b/subPages/my/productFavorites.vue @@ -0,0 +1,153 @@ + + + + + \ No newline at end of file diff --git a/subPages/my/signupSuccess.vue b/subPages/my/signupSuccess.vue new file mode 100644 index 0000000..3a7a08f --- /dev/null +++ b/subPages/my/signupSuccess.vue @@ -0,0 +1,101 @@ + + + + + \ No newline at end of file diff --git a/subPages/shop/goodsDetail.vue b/subPages/shop/goodsDetail.vue new file mode 100644 index 0000000..4e017df --- /dev/null +++ b/subPages/shop/goodsDetail.vue @@ -0,0 +1,350 @@ + + + + + \ No newline at end of file diff --git a/subPages/shop/pointsDetail.vue b/subPages/shop/pointsDetail.vue new file mode 100644 index 0000000..86a10a7 --- /dev/null +++ b/subPages/shop/pointsDetail.vue @@ -0,0 +1,195 @@ + + + + + \ No newline at end of file diff --git a/subPages/static/first.png b/subPages/static/first.png new file mode 100644 index 0000000..4477ccf Binary files /dev/null and b/subPages/static/first.png differ diff --git a/subPages/static/rank_bg.png b/subPages/static/rank_bg.png new file mode 100644 index 0000000..c934d57 Binary files /dev/null and b/subPages/static/rank_bg.png differ diff --git a/subPages/static/second.png b/subPages/static/second.png new file mode 100644 index 0000000..1879856 Binary files /dev/null and b/subPages/static/second.png differ diff --git a/subPages/static/third.png b/subPages/static/third.png new file mode 100644 index 0000000..87c1bcb Binary files /dev/null and b/subPages/static/third.png differ diff --git a/subPages/static/volunteer_bg@2x.png b/subPages/static/volunteer_bg@2x.png new file mode 100644 index 0000000..dfbb9d7 Binary files /dev/null and b/subPages/static/volunteer_bg@2x.png differ diff --git a/subPages/static/商品_积分@2x.png b/subPages/static/商品_积分@2x.png new file mode 100644 index 0000000..de3d956 Binary files /dev/null and b/subPages/static/商品_积分@2x.png differ diff --git a/subPages/static/活动日历_图标@2x.png b/subPages/static/活动日历_图标@2x.png new file mode 100644 index 0000000..b22c1f1 Binary files /dev/null and b/subPages/static/活动日历_图标@2x.png differ diff --git a/subPages/static/登录_标题.png b/subPages/static/登录_标题.png new file mode 100644 index 0000000..428f311 Binary files /dev/null and b/subPages/static/登录_标题.png differ diff --git a/subPages/static/登录_背景图.png b/subPages/static/登录_背景图.png new file mode 100644 index 0000000..844920d Binary files /dev/null and b/subPages/static/登录_背景图.png differ diff --git a/uni.promisify.adaptor.js b/uni.promisify.adaptor.js new file mode 100644 index 0000000..5fec4f3 --- /dev/null +++ b/uni.promisify.adaptor.js @@ -0,0 +1,13 @@ +uni.addInterceptor({ + returnValue (res) { + if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) { + return res; + } + return new Promise((resolve, reject) => { + res.then((res) => { + if (!res) return resolve(res) + return res[0] ? reject(res[0]) : resolve(res[1]) + }); + }); + }, +}); \ No newline at end of file diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..1c1d400 --- /dev/null +++ b/uni.scss @@ -0,0 +1,92 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +// @import '@/main.scss'; + +/* 颜色变量 */ +// 自定义颜色 +$primary-color: #C70019; +$secondary-color: #990012; +$primary-text-color: #000; +$secondary-text-color: #999; + +// +.click-animation{ + &:active { + transform: scale(0.98); + box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.12); + } +} + + +/* 行为相关颜色 */ +$uni-color-primary: #218CDD; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:12px; +$uni-font-size-base:14px; +$uni-font-size-lg:16px; + +/* 图片尺寸 */ +$uni-img-size-sm:20px; +$uni-img-size-base:26px; +$uni-img-size-lg:40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:20px; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:26px; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:15px; diff --git a/uni_modules/uv-action-sheet/changelog.md b/uni_modules/uv-action-sheet/changelog.md new file mode 100644 index 0000000..ab3545e --- /dev/null +++ b/uni_modules/uv-action-sheet/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-07-02) +uv-action-sheet 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/actionSheet.html +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-action-sheet 底部操作菜单 diff --git a/uni_modules/uv-action-sheet/components/uv-action-sheet/props.js b/uni_modules/uv-action-sheet/components/uv-action-sheet/props.js new file mode 100644 index 0000000..8adffee --- /dev/null +++ b/uni_modules/uv-action-sheet/components/uv-action-sheet/props.js @@ -0,0 +1,50 @@ +export default { + props: { + // 标题,有值则显示,同时会显示关闭按钮 + title: { + type: String, + default: '' + }, + // 选项上方的描述信息 + description: { + type: String, + default: '' + }, + // 数据 + actions: { + type: Array, + default: () => [] + }, + // 取消按钮的文字,不为空时显示按钮 + cancelText: { + type: String, + default: '' + }, + // 点击某个菜单项时是否关闭弹窗 + closeOnClickAction: { + type: Boolean, + default: true + }, + // 处理底部安全区(默认true) + safeAreaInsetBottom: { + type: Boolean, + default: true + }, + // 小程序的打开方式 + openType: { + type: String, + default: '' + }, + // 点击遮罩是否允许关闭 (默认true) + closeOnClickOverlay: { + type: Boolean, + default: true + }, + // 圆角值 + round: { + type: [Boolean, String, Number], + default: 0 + }, + ...uni.$uv?.props?.actionSheet + } +} \ No newline at end of file diff --git a/uni_modules/uv-action-sheet/components/uv-action-sheet/uv-action-sheet.vue b/uni_modules/uv-action-sheet/components/uv-action-sheet/uv-action-sheet.vue new file mode 100644 index 0000000..edca089 --- /dev/null +++ b/uni_modules/uv-action-sheet/components/uv-action-sheet/uv-action-sheet.vue @@ -0,0 +1,280 @@ + + + + + + diff --git a/uni_modules/uv-action-sheet/package.json b/uni_modules/uv-action-sheet/package.json new file mode 100644 index 0000000..e7b6173 --- /dev/null +++ b/uni_modules/uv-action-sheet/package.json @@ -0,0 +1,92 @@ +{ + "id": "uv-action-sheet", + "displayName": "uv-action-sheet 底部操作菜单 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "该组件用于从底部弹出一个操作菜单,供用户选择并返回结果。本组件功能类似于uni的uni.showActionSheet API,配置更加灵活,所有平台都表现一致。", + "keywords": [ + "action-sheet", + "uvui", + "uv-ui", + "操作菜单", + "菜单选择" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-popup", + "uv-icon", + "uv-line", + "uv-loading-icon", + "uv-gap" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-action-sheet/readme.md b/uni_modules/uv-action-sheet/readme.md new file mode 100644 index 0000000..9ea5487 --- /dev/null +++ b/uni_modules/uv-action-sheet/readme.md @@ -0,0 +1,13 @@ +## ActionSheet 操作菜单 + +> **组件名:uv-action-sheet** + +本组件用于从底部弹出一个操作菜单,供用户选择并返回结果。 + +本组件功能类似于uni的uni.showActionSheet API,配置更加灵活,所有平台都表现一致。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-album/changelog.md b/uni_modules/uv-album/changelog.md new file mode 100644 index 0000000..42ab5e2 --- /dev/null +++ b/uni_modules/uv-album/changelog.md @@ -0,0 +1,10 @@ +## 1.0.4(2023-12-06) +1. 阻止事件冒泡处理 +## 1.0.3(2023-10-23) +1. 修复报错的BUG +## 1.0.2(2023-10-23) +1. 修复设置singleSize、multipleSize、space等值带单位,存在不显示的BUG +## 1.0.1(2023-09-13) +1. 添加依赖 +## 1.0.0(2023-08-30) +1. 新增uv-album相册组件 diff --git a/uni_modules/uv-album/components/uv-album/uv-album.vue b/uni_modules/uv-album/components/uv-album/uv-album.vue new file mode 100644 index 0000000..835d792 --- /dev/null +++ b/uni_modules/uv-album/components/uv-album/uv-album.vue @@ -0,0 +1,312 @@ + + + + \ No newline at end of file diff --git a/uni_modules/uv-album/package.json b/uni_modules/uv-album/package.json new file mode 100644 index 0000000..700602f --- /dev/null +++ b/uni_modules/uv-album/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-album", + "displayName": "uv-album 相册 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.4", + "description": "本组件提供一个类似相册的功能,让开发者开发起来更加得心应手,功能齐全,灵活配置可以,开箱即用。减少重复的模板代码", + "keywords": [ + "album", + "uv-ui", + "uvui", + "相册", + "图片" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-text" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-album/readme.md b/uni_modules/uv-album/readme.md new file mode 100644 index 0000000..edd2f0b --- /dev/null +++ b/uni_modules/uv-album/readme.md @@ -0,0 +1,21 @@ +# Album 相册 + +> **组件名:uv-album** + +本组件提供一个类似相册的功能,让开发者开发起来更加得心应手。 + +功能齐全,灵活配置可以,开箱即用。减少重复的模板代码。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-alert/changelog.md b/uni_modules/uv-alert/changelog.md new file mode 100644 index 0000000..71cca03 --- /dev/null +++ b/uni_modules/uv-alert/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-06-01) +1. 修复点击触发两次实践的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-alert 警告提示组件 diff --git a/uni_modules/uv-alert/components/uv-alert/props.js b/uni_modules/uv-alert/components/uv-alert/props.js new file mode 100644 index 0000000..cc8edc1 --- /dev/null +++ b/uni_modules/uv-alert/components/uv-alert/props.js @@ -0,0 +1,45 @@ +export default { + props: { + // 显示文字 + title: { + type: String, + default: '' + }, + // 主题,success/warning/info/error + type: { + type: String, + default: 'warning' + }, + // 辅助性文字 + description: { + type: String, + default: '' + }, + // 是否可关闭 + closable: { + type: Boolean, + default: false + }, + // 是否显示图标 + showIcon: { + type: Boolean, + default: false + }, + // 浅或深色调,light-浅色,dark-深色 + effect: { + type: String, + default: 'light' + }, + // 文字是否居中 + center: { + type: Boolean, + default: false + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 14 + }, + ...uni.$uv?.props?.alert + } +} \ No newline at end of file diff --git a/uni_modules/uv-alert/components/uv-alert/uv-alert.vue b/uni_modules/uv-alert/components/uv-alert/uv-alert.vue new file mode 100644 index 0000000..ba3965e --- /dev/null +++ b/uni_modules/uv-alert/components/uv-alert/uv-alert.vue @@ -0,0 +1,246 @@ + + + + + diff --git a/uni_modules/uv-alert/package.json b/uni_modules/uv-alert/package.json new file mode 100644 index 0000000..34bec20 --- /dev/null +++ b/uni_modules/uv-alert/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-alert", + "displayName": "uv-alert 警告提示 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "uv-alert 警告提示,展现需要关注的信息。灵活配置,功能齐全,兼容全端", + "keywords": [ + "alert", + "uvui", + "uv-ui", + "警告提示" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-transition", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-alert/readme.md b/uni_modules/uv-alert/readme.md new file mode 100644 index 0000000..63dda76 --- /dev/null +++ b/uni_modules/uv-alert/readme.md @@ -0,0 +1,15 @@ +## Alert 警告提示 + +> **组件名:uv-alert** + +警告提示,展现需要关注的信息。 + +当某个页面需要向用户显示警告的信息时。 + +非浮层的静态展现形式,始终展现,不会自动消失,用户可以点击关闭。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-avatar/changelog.md b/uni_modules/uv-avatar/changelog.md new file mode 100644 index 0000000..8631c86 --- /dev/null +++ b/uni_modules/uv-avatar/changelog.md @@ -0,0 +1,13 @@ +## 1.0.5(2023-12-06) +1. 优化 +## 1.0.4(2023-12-06) +1. 优化 +## 1.0.3(2023-12-06) +1. 阻止事件冒泡处理,单个头像模式 +## 1.0.2(2023-12-06) +1. 阻止事件冒泡处理 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-avatar 头像组件 diff --git a/uni_modules/uv-avatar/components/uv-avatar-group/props.js b/uni_modules/uv-avatar/components/uv-avatar-group/props.js new file mode 100644 index 0000000..a610ab4 --- /dev/null +++ b/uni_modules/uv-avatar/components/uv-avatar-group/props.js @@ -0,0 +1,53 @@ +export default { + props: { + // 头像图片组 + urls: { + type: Array, + default: () => [] + }, + // 最多展示的头像数量 + maxCount: { + type: [String, Number], + default: 5 + }, + // 头像形状 + shape: { + type: String, + default: 'circle' + }, + // 图片裁剪模式 + mode: { + type: String, + default: 'scaleToFill' + }, + // 超出maxCount时是否显示查看更多的提示 + showMore: { + type: Boolean, + default: true + }, + // 头像大小 + size: { + type: [String, Number], + default: 40 + }, + // 指定从数组的对象元素中读取哪个属性作为图片地址 + keyName: { + type: String, + default: '' + }, + // 头像之间的遮挡比例 + gap: { + type: [String, Number], + validator(value) { + return value >= 0 && value <= 1 + }, + default: 0.5 + }, + // 需额外显示的值 + extraValue: { + type: [Number, String], + default: 0 + }, + ...uni.$uv?.props?.avatarGroup + } +} \ No newline at end of file diff --git a/uni_modules/uv-avatar/components/uv-avatar-group/uv-avatar-group.vue b/uni_modules/uv-avatar/components/uv-avatar-group/uv-avatar-group.vue new file mode 100644 index 0000000..59481f6 --- /dev/null +++ b/uni_modules/uv-avatar/components/uv-avatar-group/uv-avatar-group.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/uni_modules/uv-avatar/components/uv-avatar/props.js b/uni_modules/uv-avatar/components/uv-avatar/props.js new file mode 100644 index 0000000..6c8d725 --- /dev/null +++ b/uni_modules/uv-avatar/components/uv-avatar/props.js @@ -0,0 +1,80 @@ +import { range } from '@/uni_modules/uv-ui-tools/libs/function/test.js' +export default { + props: { + // 头像图片路径(不能为相对路径) + src: { + type: String, + default: '' + }, + // 头像形状,circle-圆形,square-方形 + shape: { + type: String, + default: 'circle' + }, + // 头像尺寸 + size: { + type: [String, Number], + default: 40 + }, + // 裁剪模式 + mode: { + type: String, + default: 'scaleToFill' + }, + // 显示的文字 + text: { + type: String, + default: '' + }, + // 背景色 + bgColor: { + type: String, + default: '#c0c4cc' + }, + // 文字颜色 + color: { + type: String, + default: '#fff' + }, + // 文字大小 + fontSize: { + type: [String, Number], + default: 18 + }, + // 显示的图标 + icon: { + type: String, + default: '' + }, + // 显示小程序头像,只对百度,微信,QQ小程序有效 + mpAvatar: { + type: Boolean, + default: false + }, + // 是否使用随机背景色 + randomBgColor: { + type: Boolean, + default: false + }, + // 加载失败的默认头像(组件有内置默认图片) + defaultUrl: { + type: String, + default: '' + }, + // 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间 + colorIndex: { + type: [String, Number], + // 校验参数规则,索引在0-19之间 + validator(n) { + return range(n, [0, 19]) || n === '' + }, + default: '' + }, + // 组件标识符 + name: { + type: String, + default: '' + }, + ...uni.$uv?.props?.avatar + } +} \ No newline at end of file diff --git a/uni_modules/uv-avatar/components/uv-avatar/uv-avatar.vue b/uni_modules/uv-avatar/components/uv-avatar/uv-avatar.vue new file mode 100644 index 0000000..0959d6a --- /dev/null +++ b/uni_modules/uv-avatar/components/uv-avatar/uv-avatar.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/uni_modules/uv-avatar/package.json b/uni_modules/uv-avatar/package.json new file mode 100644 index 0000000..e77ab68 --- /dev/null +++ b/uni_modules/uv-avatar/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-avatar", + "displayName": "uv-avatar 头像 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.5", + "description": "uv-avatar 本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。", + "keywords": [ + "uv-avatar", + "uvui", + "uv-ui", + "avatar", + "头像" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-text" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-avatar/readme.md b/uni_modules/uv-avatar/readme.md new file mode 100644 index 0000000..1f068eb --- /dev/null +++ b/uni_modules/uv-avatar/readme.md @@ -0,0 +1,11 @@ +## Avatar 头像 + +> **组件名:uv-avatar** + +本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-back-top/changelog.md b/uni_modules/uv-back-top/changelog.md new file mode 100644 index 0000000..9772262 --- /dev/null +++ b/uni_modules/uv-back-top/changelog.md @@ -0,0 +1,8 @@ +## 1.0.2(2023-07-03) +1. 优化插槽自定义内容部分 +2. 增加backToTop方法说明 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-back-top 返回顶部 diff --git a/uni_modules/uv-back-top/components/uv-back-top/props.js b/uni_modules/uv-back-top/components/uv-back-top/props.js new file mode 100644 index 0000000..74daff4 --- /dev/null +++ b/uni_modules/uv-back-top/components/uv-back-top/props.js @@ -0,0 +1,58 @@ +export default { + props: { + // 返回顶部的形状,circle-圆形,square-方形 + mode: { + type: String, + default: 'circle' + }, + // 自定义图标 + icon: { + type: String, + default: 'arrow-upward' + }, + // 提示文字 + text: { + type: String, + default: '' + }, + // 返回顶部滚动时间 + duration: { + type: [String, Number], + default: 100 + }, + // 滚动距离 + scrollTop: { + type: [String, Number], + default: 0 + }, + // 距离顶部多少距离显示,单位px + top: { + type: [String, Number], + default: 400 + }, + // 返回顶部按钮到底部的距离,单位px + bottom: { + type: [String, Number], + default: 100 + }, + // 返回顶部按钮到右边的距离,单位px + right: { + type: [String, Number], + default: 20 + }, + // 层级 + zIndex: { + type: [String, Number], + default: 9 + }, + // 图标的样式,对象形式 + iconStyle: { + type: Object, + default: () => ({ + color: '#909399', + fontSize: '19px' + }) + }, + ...uni.$uv?.props?.backtop + } +} \ No newline at end of file diff --git a/uni_modules/uv-back-top/components/uv-back-top/uv-back-top.vue b/uni_modules/uv-back-top/components/uv-back-top/uv-back-top.vue new file mode 100644 index 0000000..fad73d4 --- /dev/null +++ b/uni_modules/uv-back-top/components/uv-back-top/uv-back-top.vue @@ -0,0 +1,116 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-back-top/package.json b/uni_modules/uv-back-top/package.json new file mode 100644 index 0000000..a2035a5 --- /dev/null +++ b/uni_modules/uv-back-top/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-back-top", + "displayName": "uv-back-top 返回顶部 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "返回顶部 组件一个用于长页面,滑动一定距离后,出现返回顶部按钮,方便快速返回顶部的场景。", + "keywords": [ + "uv-back-top", + "uvui", + "uv-ui", + "avatar", + "返回顶部" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-back-top/readme.md b/uni_modules/uv-back-top/readme.md new file mode 100644 index 0000000..d6a2aec --- /dev/null +++ b/uni_modules/uv-back-top/readme.md @@ -0,0 +1,11 @@ +## BackTop 返回顶部 + +> **组件名:uv-back-top** + +该组件一个用于长页面,滑动一定距离后,出现返回顶部按钮,方便快速返回顶部的场景。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-badge/changelog.md b/uni_modules/uv-badge/changelog.md new file mode 100644 index 0000000..b0ba104 --- /dev/null +++ b/uni_modules/uv-badge/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-06-04) +1. 修复type等属性为null的时候不显示徽标的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-badge 徽标数,数字角标 diff --git a/uni_modules/uv-badge/components/uv-badge/props.js b/uni_modules/uv-badge/components/uv-badge/props.js new file mode 100644 index 0000000..c6369c3 --- /dev/null +++ b/uni_modules/uv-badge/components/uv-badge/props.js @@ -0,0 +1,73 @@ +export default { + props: { + // 是否显示圆点 + isDot: { + type: Boolean, + default: false + }, + // 显示的内容 + value: { + type: [Number, String], + default: '' + }, + // 是否显示 + show: { + type: Boolean, + default: true + }, + // 最大值,超过最大值会显示 '{max}+' + max: { + type: [Number, String], + default: 999 + }, + // 主题类型,error|warning|success|primary + type: { + type: [String,undefined,null], + default: 'error' + }, + // 当数值为 0 时,是否展示 Badge + showZero: { + type: Boolean, + default: false + }, + // 背景颜色,优先级比type高,如设置,type参数会失效 + bgColor: { + type: [String, null], + default: null + }, + // 字体颜色 + color: { + type: [String, null], + default: null + }, + // 徽标形状,circle-四角均为圆角,horn-左下角为直角 + shape: { + type: [String,undefined,null], + default: 'circle' + }, + // 设置数字的显示方式,overflow|ellipsis|limit + // overflow会根据max字段判断,超出显示`${max}+` + // ellipsis会根据max判断,超出显示`${max}...` + // limit会依据1000作为判断条件,超出1000,显示`${value/1000}K`,比如2.2k、3.34w,最多保留2位小数 + numberType: { + type: [String,undefined,null], + default: 'overflow' + }, + // 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效 + offset: { + type: Array, + default: () => [] + }, + // 是否反转背景和字体颜色 + inverted: { + type: Boolean, + default: false + }, + // 是否绝对定位 + absolute: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.badge + } +} \ No newline at end of file diff --git a/uni_modules/uv-badge/components/uv-badge/uv-badge.vue b/uni_modules/uv-badge/components/uv-badge/uv-badge.vue new file mode 100644 index 0000000..f7d3911 --- /dev/null +++ b/uni_modules/uv-badge/components/uv-badge/uv-badge.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/uni_modules/uv-badge/package.json b/uni_modules/uv-badge/package.json new file mode 100644 index 0000000..5a81386 --- /dev/null +++ b/uni_modules/uv-badge/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-badge", + "displayName": "uv-badge 徽标数,数字角标 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "徽标数一般用于图标右上角显示未读的消息数量,提示用户点击,有圆点和圆包含文字两种形式。", + "keywords": [ + "uv-badge", + "uvui", + "uv-ui", + "徽标数", + "数字角标" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-badge/readme.md b/uni_modules/uv-badge/readme.md new file mode 100644 index 0000000..cf597eb --- /dev/null +++ b/uni_modules/uv-badge/readme.md @@ -0,0 +1,11 @@ +## Badge 徽标数 + +> **组件名:uv-badge** + +该组件一般用于图标右上角显示未读的消息数量,提示用户点击,有圆点和圆包含文字两种形式。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-button/changelog.md b/uni_modules/uv-button/changelog.md new file mode 100644 index 0000000..11e954e --- /dev/null +++ b/uni_modules/uv-button/changelog.md @@ -0,0 +1,33 @@ +## 1.0.15(2023-12-20) +1. 优化 +## 1.0.14(2023-12-06) +1. 优化 +## 1.0.13(2023-12-06) +1. 阻止事件冒泡处理 +## 1.0.12(2023-10-19) +1. 增加后置插槽 +## 1.0.11(2023-09-21) +1. 修复通过customStyle修改按钮宽度,组件中最外层节点不改变的问题 +## 1.0.10(2023-09-15) +1. 按钮支持open-type="agreePrivacyAuthorization" +## 1.0.9(2023-09-11) +1. 增加参数iconSize,用于控制图标的大小 +## 1.0.8(2023-09-10) +1. 修复多个按钮在一行宽度不正常的BUG +## 1.0.7(2023-09-07) +1. 修复warning颜色对应错误的BUG +## 1.0.6(2023-07-25) +1. 增加customTextStyle属性,方便自定义文字样式 +## 1.0.5(2023-07-20) +1. 解决微信小程序动态设置hover-class点击态不消失的BUG +## 1.0.4(2023-06-29) +1. 修改上次更新出现nvue报错异常 +## 1.0.3(2023-06-28) + 修复:设置open-type="chooseAvatar"等值不生效的BUG +## 1.0.2(2023-06-01) +1. 修复按钮点击触发两次的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-button 按钮 diff --git a/uni_modules/uv-button/components/uv-button/nvue.scss b/uni_modules/uv-button/components/uv-button/nvue.scss new file mode 100644 index 0000000..be6c16e --- /dev/null +++ b/uni_modules/uv-button/components/uv-button/nvue.scss @@ -0,0 +1,46 @@ +$uv-button-active-opacity:0.75 !default; +$uv-button-loading-text-margin-left:4px !default; +$uv-button-text-color: #FFFFFF !default; +$uv-button-text-plain-error-color:$uv-error !default; +$uv-button-text-plain-warning-color:$uv-warning !default; +$uv-button-text-plain-success-color:$uv-success !default; +$uv-button-text-plain-info-color:$uv-info !default; +$uv-button-text-plain-primary-color:$uv-primary !default; +.uv-button { + &--active { + opacity: $uv-button-active-opacity; + } + + &--active--plain { + background-color: rgb(217, 217, 217); + } + + &__loading-text { + margin-left:$uv-button-loading-text-margin-left; + } + + &__text, + &__loading-text { + color:$uv-button-text-color; + } + + &__text--plain--error { + color:$uv-button-text-plain-error-color; + } + + &__text--plain--warning { + color:$uv-button-text-plain-warning-color; + } + + &__text--plain--success{ + color:$uv-button-text-plain-success-color; + } + + &__text--plain--info { + color:$uv-button-text-plain-info-color; + } + + &__text--plain--primary { + color:$uv-button-text-plain-primary-color; + } +} \ No newline at end of file diff --git a/uni_modules/uv-button/components/uv-button/props.js b/uni_modules/uv-button/components/uv-button/props.js new file mode 100644 index 0000000..6275ad5 --- /dev/null +++ b/uni_modules/uv-button/components/uv-button/props.js @@ -0,0 +1,163 @@ +export default { + props: { + // 是否细边框 + hairline: { + type: Boolean, + default: true + }, + // 按钮的预置样式,info,primary,error,warning,success + type: { + type: String, + default: 'info' + }, + // 按钮尺寸,large,normal,small,mini + size: { + type: String, + default: 'normal' + }, + // 按钮形状,circle(两边为半圆),square(带圆角) + shape: { + type: String, + default: 'square' + }, + // 按钮是否镂空 + plain: { + type: Boolean, + default: false + }, + // 是否禁止状态 + disabled: { + type: Boolean, + default: false + }, + // 是否加载中 + loading: { + type: Boolean, + default: false + }, + // 加载中提示文字 + loadingText: { + type: [String, Number], + default: '' + }, + // 加载状态图标类型 + loadingMode: { + type: String, + default: 'spinner' + }, + // 加载图标大小 + loadingSize: { + type: [String, Number], + default: 14 + }, + // 开放能力,具体请看uniapp稳定关于button组件部分说明 + // https://uniapp.dcloud.io/component/button + openType: { + type: String, + default: '' + }, + // 用于
组件,点击分别会触发 组件的 submit/reset 事件 + // 取值为submit(提交表单),reset(重置表单) + formType: { + type: String, + default: '' + }, + // 打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效 + // 只微信小程序、QQ小程序有效 + appParameter: { + type: String, + default: '' + }, + // 指定是否阻止本节点的祖先节点出现点击态,微信小程序有效 + hoverStopPropagation: { + type: Boolean, + default: true + }, + // 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。只微信小程序有效 + lang: { + type: String, + default: 'en' + }, + // 会话来源,open-type="contact"时有效。只微信小程序有效 + sessionFrom: { + type: String, + default: '' + }, + // 会话内消息卡片标题,open-type="contact"时有效 + // 默认当前标题,只微信小程序有效 + sendMessageTitle: { + type: String, + default: '' + }, + // 会话内消息卡片点击跳转小程序路径,open-type="contact"时有效 + // 默认当前分享路径,只微信小程序有效 + sendMessagePath: { + type: String, + default: '' + }, + // 会话内消息卡片图片,open-type="contact"时有效 + // 默认当前页面截图,只微信小程序有效 + sendMessageImg: { + type: String, + default: '' + }, + // 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示, + // 用户点击后可以快速发送小程序消息,open-type="contact"时有效 + showMessageCard: { + type: Boolean, + default: true + }, + // 额外传参参数,用于小程序的data-xxx属性,通过target.dataset.name获取 + dataName: { + type: String, + default: '' + }, + // 节流,一定时间内只能触发一次 + throttleTime: { + type: [String, Number], + default: 0 + }, + // 按住后多久出现点击态,单位毫秒 + hoverStartTime: { + type: [String, Number], + default: 0 + }, + // 手指松开后点击态保留时间,单位毫秒 + hoverStayTime: { + type: [String, Number], + default: 200 + }, + // 按钮文字,之所以通过props传入,是因为slot传入的话 + // nvue中无法控制文字的样式 + text: { + type: [String, Number], + default: '' + }, + // 按钮图标 + icon: { + type: String, + default: '' + }, + // 按钮图标大小 + iconSize: { + type: [String, Number], + default: '' + }, + // 按钮图标颜色 + iconColor: { + type: String, + default: '#000000' + }, + // 按钮颜色,支持传入linear-gradient渐变色 + color: { + type: String, + default: '' + }, + // 自定义按钮文本样式 + customTextStyle: { + type: [Object,String], + default: '' + }, + ...uni.$uv?.props?.button + } +} diff --git a/uni_modules/uv-button/components/uv-button/uv-button.vue b/uni_modules/uv-button/components/uv-button/uv-button.vue new file mode 100644 index 0000000..3a2470a --- /dev/null +++ b/uni_modules/uv-button/components/uv-button/uv-button.vue @@ -0,0 +1,528 @@ + + + + + diff --git a/uni_modules/uv-button/components/uv-button/vue.scss b/uni_modules/uv-button/components/uv-button/vue.scss new file mode 100644 index 0000000..7a089be --- /dev/null +++ b/uni_modules/uv-button/components/uv-button/vue.scss @@ -0,0 +1,93 @@ +@import '@/uni_modules/uv-ui-tools/libs/css/color.scss'; +// nvue下hover-class无效 +$uv-button-before-top:50% !default; +$uv-button-before-left:50% !default; +$uv-button-before-width:100% !default; +$uv-button-before-height:100% !default; +$uv-button-before-transform:translate(-50%, -50%) !default; +$uv-button-before-opacity:0 !default; +$uv-button-before-background-color:#000 !default; +$uv-button-before-border-color:#000 !default; +$uv-button-active-before-opacity:.15 !default; +$uv-button-icon-margin-left:4px !default; +$uv-button-plain-uv-button-info-color:$uv-info; +$uv-button-plain-uv-button-success-color:$uv-success; +$uv-button-plain-uv-button-error-color:$uv-error; +$uv-button-plain-uv-button-warning-color:$uv-warning; + +.uv-button-wrapper { + position: relative; + &--dis { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + z-index: 9; + } +} + +.uv-button { + width: 100%; + + &__text { + white-space: nowrap; + line-height: 1; + } + + &:before { + position: absolute; + top:$uv-button-before-top; + left:$uv-button-before-left; + width:$uv-button-before-width; + height:$uv-button-before-height; + border: inherit; + border-radius: inherit; + transform:$uv-button-before-transform; + opacity:$uv-button-before-opacity; + content: " "; + background-color:$uv-button-before-background-color; + border-color:$uv-button-before-border-color; + } + + &--active { + &:before { + opacity: .15 + } + } + + &__icon+&__text:not(:empty), + &__loading-text { + margin-left:$uv-button-icon-margin-left; + } + + &--plain { + &.uv-button--primary { + color: $uv-primary; + } + } + + &--plain { + &.uv-button--info { + color:$uv-button-plain-uv-button-info-color; + } + } + + &--plain { + &.uv-button--success { + color:$uv-button-plain-uv-button-success-color; + } + } + + &--plain { + &.uv-button--error { + color:$uv-button-plain-uv-button-error-color; + } + } + + &--plain { + &.uv-button--warning { + color:$uv-button-plain-uv-button-warning-color; + } + } +} diff --git a/uni_modules/uv-button/package.json b/uni_modules/uv-button/package.json new file mode 100644 index 0000000..c2a4a17 --- /dev/null +++ b/uni_modules/uv-button/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-button", + "displayName": "uv-button 按钮 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.15", + "description": "按钮组件内部实现以uni-app的button组件为基础,进行二次封装,灵活配置,功能齐全,兼容全端。", + "keywords": [ + "uv-button", + "uvui", + "uv-ui", + "button", + "按钮" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-loading-icon", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-button/readme.md b/uni_modules/uv-button/readme.md new file mode 100644 index 0000000..124a7f4 --- /dev/null +++ b/uni_modules/uv-button/readme.md @@ -0,0 +1,19 @@ +## Button 按钮 + +> **组件名:uv-button** + +该组件内部实现以`uni-app`的`button`组件为基础,进行二次封装,灵活配置,功能齐全,兼容全端。灵活配置,内置状态设置,开箱即用。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-calendar/changelog.md b/uni_modules/uv-calendar/changelog.md new file mode 100644 index 0000000..581562a --- /dev/null +++ b/uni_modules/uv-calendar/changelog.md @@ -0,0 +1,16 @@ +## 1.0.6(2023-11-03) +1. **该版本不再维护**,推荐使用新版本[https://ext.dcloud.net.cn/plugin?name=uv-calendars](https://ext.dcloud.net.cn/plugin?name=uv-calendars) +## 1.0.5(2023-07-02) +uv-calendar 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/calendar.html +## 1.0.4(2023-06-15) +1. formatter格式化中增加topInfo参数 +## 1.0.3(2023-06-08) +1. 增加点击日期change回调 +2. 优化 +## 1.0.2(2023-06-05) +1. 修改多个时间选择的时候存在反选的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-calendar 日历 diff --git a/uni_modules/uv-calendar/components/uv-calendar/calendar.js b/uni_modules/uv-calendar/components/uv-calendar/calendar.js new file mode 100644 index 0000000..e006dea --- /dev/null +++ b/uni_modules/uv-calendar/components/uv-calendar/calendar.js @@ -0,0 +1,546 @@ +/** +* @1900-2100区间内的公历、农历互转 +* @charset UTF-8 +* @github https://github.com/jjonline/calendar.js +* @Author Jea杨(JJonline@JJonline.Cn) +* @Time 2014-7-21 +* @Time 2016-8-13 Fixed 2033hex、Attribution Annals +* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug +* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year +* @Version 1.0.3 +* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] +* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] +*/ +/* eslint-disable */ +var calendar = { + + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909 + 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919 + 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929 + 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939 + 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949 + 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959 + 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969 + 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979 + 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989 + 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999 + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009 + 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019 + 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029 + 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039 + 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049 + /** Add By JJonline@JJonline.Cn**/ + 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059 + 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069 + 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079 + 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089 + 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099 + 0x0d520], // 2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'], + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'], + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function (y) { + var i; var sum = 348 + for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 } + return (sum + this.leapDays(y)) + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function (y) { // 闰字编码 \u95f0 + return (this.lunarInfo[y - 1900] & 0xf) + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function (y) { + if (this.leapMonth(y)) { + return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29) + } + return (0) + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function (y, m) { + if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1 + return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29) + }, + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function (y, m) { + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var ms = m - 1 + if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29 + return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28) + } else { + return (this.solarMonth[ms]) + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function (lYear) { + var ganKey = (lYear - 3) % 10 + var zhiKey = (lYear - 3) % 12 + if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干 + if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1] + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function (cMonth, cDay) { + var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf' + var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function (offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12] + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function (y, n) { + if (y < 1900 || y > 2100) { return -1 } + if (n < 1 || n > 24) { return -1 } + var _table = this.sTermInfo[y - 1900] + var _info = [ + parseInt('0x' + _table.substr(0, 5)).toString(), + parseInt('0x' + _table.substr(5, 5)).toString(), + parseInt('0x' + _table.substr(10, 5)).toString(), + parseInt('0x' + _table.substr(15, 5)).toString(), + parseInt('0x' + _table.substr(20, 5)).toString(), + parseInt('0x' + _table.substr(25, 5)).toString() + ] + var _calday = [ + _info[0].substr(0, 1), + _info[0].substr(1, 2), + _info[0].substr(3, 1), + _info[0].substr(4, 2), + + _info[1].substr(0, 1), + _info[1].substr(1, 2), + _info[1].substr(3, 1), + _info[1].substr(4, 2), + + _info[2].substr(0, 1), + _info[2].substr(1, 2), + _info[2].substr(3, 1), + _info[2].substr(4, 2), + + _info[3].substr(0, 1), + _info[3].substr(1, 2), + _info[3].substr(3, 1), + _info[3].substr(4, 2), + + _info[4].substr(0, 1), + _info[4].substr(1, 2), + _info[4].substr(3, 1), + _info[4].substr(4, 2), + + _info[5].substr(0, 1), + _info[5].substr(1, 2), + _info[5].substr(3, 1), + _info[5].substr(4, 2) + ] + return parseInt(_calday[n - 1]) + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function (m) { // 月 => \u6708 + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var s = this.nStr3[m - 1] + s += '\u6708'// 加上月字 + return s + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function (d) { // 日 => \u65e5 + var s + switch (d) { + case 10: + s = '\u521d\u5341'; break + case 20: + s = '\u4e8c\u5341'; break + break + case 30: + s = '\u4e09\u5341'; break + break + default: + s = this.nStr2[Math.floor(d / 10)] + s += this.nStr1[d % 10] + } + return (s) + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function (y) { + return this.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31 + // 年份限定、上限 + if (y < 1900 || y > 2100) { + return -1// undefined转换为数字变为NaN + } + // 公历传参最下限 + if (y == 1900 && m == 1 && d < 31) { + return -1 + } + // 未传参 获得当天 + if (!y) { + var objDate = new Date() + } else { + var objDate = new Date(y, parseInt(m) - 1, d) + } + var i; var leap = 0; var temp = 0 + // 修正ymd参数 + var y = objDate.getFullYear() + var m = objDate.getMonth() + 1 + var d = objDate.getDate() + var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000 + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i) + offset -= temp + } + if (offset < 0) { + offset += temp; i-- + } + + // 是否今天 + var isTodayObj = new Date() + var isToday = false + if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { + isToday = true + } + // 星期几 + var nWeek = objDate.getDay() + var cWeek = this.nStr1[nWeek] + // 数字表示周几顺应天朝周一开始的惯例 + if (nWeek == 0) { + nWeek = 7 + } + // 农历年 + var year = i + var leap = this.leapMonth(i) // 闰哪个月 + var isLeap = false + + // 效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + // 闰月 + if (leap > 0 && i == (leap + 1) && isLeap == false) { + --i + isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数 + } else { + temp = this.monthDays(year, i)// 计算农历普通月天数 + } + // 解除闰月 + if (isLeap == true && i == (leap + 1)) { isLeap = false } + offset -= temp + } + // 闰月导致数组下标重叠取反 + if (offset == 0 && leap > 0 && i == leap + 1) { + if (isLeap) { + isLeap = false + } else { + isLeap = true; --i + } + } + if (offset < 0) { + offset += temp; --i + } + // 农历月 + var month = i + // 农历日 + var day = offset + 1 + // 天干地支处理 + var sm = m - 1 + var gzY = this.toGanZhiYear(year) + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始 + var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始 + + // 依据12节气修正干支月 + var gzM = this.toGanZhi((y - 1900) * 12 + m + 11) + if (d >= firstNode) { + gzM = this.toGanZhi((y - 1900) * 12 + m + 12) + } + + // 传入的日期的节气与否 + var isTerm = false + var Term = null + if (firstNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 2] + } + if (secondNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 1] + } + // 日柱 当月一日与 1900/1/1 相差天数 + var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 + var gzD = this.toGanZhi(dayCyclical + d - 1) + // 该日期所属的星座 + var astro = this.toAstro(m, d) + + return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro } + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1 + var isLeapMonth = !!isLeapMonth + var leapOffset = 0 + var leapMonth = this.leapMonth(y) + var leapDay = this.leapDays(y) + if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值 + var day = this.monthDays(y, m) + var _day = day + // bugFix 2016-9-25 + // if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m) + } + if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验 + + // 计算农历的时间差 + var offset = 0 + for (var i = 1900; i < y; i++) { + offset += this.lYearDays(i) + } + var leap = 0; var isAdd = false + for (var i = 1; i < m; i++) { + leap = this.leapMonth(y) + if (!isAdd) { // 处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); isAdd = true + } + } + offset += this.monthDays(y, i) + } + // 转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { offset += day } + // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + var stmap = Date.UTC(1900, 1, 30, 0, 0, 0) + var calObj = new Date((offset + d - 31) * 86400000 + stmap) + var cY = calObj.getUTCFullYear() + var cM = calObj.getUTCMonth() + 1 + var cD = calObj.getUTCDate() + + return this.solar2lunar(cY, cM, cD) + } +} + +export default calendar diff --git a/uni_modules/uv-calendar/components/uv-calendar/header.vue b/uni_modules/uv-calendar/components/uv-calendar/header.vue new file mode 100644 index 0000000..d7daa7b --- /dev/null +++ b/uni_modules/uv-calendar/components/uv-calendar/header.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/uni_modules/uv-calendar/components/uv-calendar/month.vue b/uni_modules/uv-calendar/components/uv-calendar/month.vue new file mode 100644 index 0000000..1a649bc --- /dev/null +++ b/uni_modules/uv-calendar/components/uv-calendar/month.vue @@ -0,0 +1,616 @@ + + + + + diff --git a/uni_modules/uv-calendar/components/uv-calendar/props.js b/uni_modules/uv-calendar/components/uv-calendar/props.js new file mode 100644 index 0000000..c359293 --- /dev/null +++ b/uni_modules/uv-calendar/components/uv-calendar/props.js @@ -0,0 +1,145 @@ +export default { + props: { + // 日历顶部标题 + title: { + type: String, + default: '日期选择' + }, + // 是否显示标题 + showTitle: { + type: Boolean, + default: true + }, + // 是否显示副标题 + showSubtitle: { + type: Boolean, + default: true + }, + // 日期类型选择,single-选择单个日期,multiple-可以选择多个日期,range-选择日期范围 + mode: { + type: String, + default: 'single' + }, + // mode=range时,第一个日期底部的提示文字 + startText: { + type: String, + default: '开始' + }, + // mode=range时,最后一个日期底部的提示文字 + endText: { + type: String, + default: '结束' + }, + // 自定义列表 + customList: { + type: Array, + default: () => [] + }, + // 主题色,对底部按钮和选中日期有效 + color: { + type: String, + default: '#3c9cff' + }, + // 最小的可选日期 + minDate: { + type: [String, Number], + default: 0 + }, + // 最大可选日期 + maxDate: { + type: [String, Number], + default: 0 + }, + // 默认选中的日期,mode为multiple或range是必须为数组格式 + defaultDate: { + type: [Array, String, Date, null], + default: null + }, + // mode=multiple时,最多可选多少个日期 + maxCount: { + type: [String, Number], + default: Number.MAX_SAFE_INTEGER + }, + // 日期行高 + rowHeight: { + type: [String, Number], + default: 56 + }, + // 日期格式化函数 + formatter: { + type: [Function, null], + default: null + }, + // 是否显示农历 + showLunar: { + type: Boolean, + default: false + }, + // 是否显示月份背景色 + showMark: { + type: Boolean, + default: true + }, + // 确定按钮的文字 + confirmText: { + type: String, + default: '确定' + }, + // 确认按钮处于禁用状态时的文字 + confirmDisabledText: { + type: String, + default: '确定' + }, + // 是否允许点击遮罩关闭日历 + closeOnClickOverlay: { + type: Boolean, + default: false + }, + // 是否允许点击确认按钮关闭日历 + closeOnClickConfirm: { + type: Boolean, + default: true + }, + // 是否为只读状态,只读状态下禁止选择日期 + readonly: { + type: Boolean, + default: false + }, + // 是否展示确认按钮 + showConfirm: { + type: Boolean, + default: true + }, + // 日期区间最多可选天数,默认无限制,mode = range时有效 Infinity + maxRange: { + type: [Number, String], + default: Number.MAX_SAFE_INTEGER + }, + // 范围选择超过最多可选天数时的提示文案,mode = range时有效 + rangePrompt: { + type: String, + default: '' + }, + // 范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效 + showRangePrompt: { + type: Boolean, + default: true + }, + // 是否允许日期范围的起止时间为同一天,mode = range时有效 + allowSameDay: { + type: Boolean, + default: false + }, + // 圆角值 + round: { + type: [Boolean, String, Number], + default: 0 + }, + // 最多展示月份数量 + monthNum: { + type: [Number, String], + default: 3 + }, + ...uni.$uv?.props?.calendar + } +} \ No newline at end of file diff --git a/uni_modules/uv-calendar/components/uv-calendar/uv-calendar.vue b/uni_modules/uv-calendar/components/uv-calendar/uv-calendar.vue new file mode 100644 index 0000000..626e833 --- /dev/null +++ b/uni_modules/uv-calendar/components/uv-calendar/uv-calendar.vue @@ -0,0 +1,390 @@ + + + + + diff --git a/uni_modules/uv-calendar/package.json b/uni_modules/uv-calendar/package.json new file mode 100644 index 0000000..03d8812 --- /dev/null +++ b/uni_modules/uv-calendar/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-calendar", + "displayName": "uv-calendar 日历 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.6", + "description": "日历组件用于单个选择日期,范围选择日期等,日历被包裹在底部弹起的容器中,灵活配置,功能齐全,兼容全端。强烈推荐使用最新版日历组件,在下方跳入。", + "keywords": [ + "uv-calendar", + "uvui", + "uv-ui", + "calendar", + "日历" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-button", + "uv-popup" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-calendar/readme.md b/uni_modules/uv-calendar/readme.md new file mode 100644 index 0000000..3c2de54 --- /dev/null +++ b/uni_modules/uv-calendar/readme.md @@ -0,0 +1,21 @@ +## Calendar 日历 + +> **组件名:uv-calendar** + +此组件用于单个选择日期,范围选择日期等,日历被包裹在底部弹起的容器中。灵活配置,功能齐全,兼容全端。 + +## 温馨提示:该组件不再更新,强烈推荐使用最新版日历组件:[https://www.uvui.cn/components/calendars.html](https://www.uvui.cn/components/calendars.html)。基于 `uv-ui` 插件市场首款多功能日历组件,不仅可以查看、选择日期,还可以选择任意范围内的日期、打点操作、自定义主题颜色、自定义文案、农历显示等。追求的就是完美。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-calendars/changelog.md b/uni_modules/uv-calendars/changelog.md new file mode 100644 index 0000000..b3b2e38 --- /dev/null +++ b/uni_modules/uv-calendars/changelog.md @@ -0,0 +1,40 @@ +## 1.0.15(2023-11-08) +1. 增加readonly属性,是否为只读状态,只读状态下禁止选择日期 +## 1.0.14(2023-10-12) +1. 修复selected没有设置了info或者info设置为空字符串后,文本则无法恢复BUG +## 1.0.13(2023-09-19) +1. 修复range模式下,selected设置了info后选中后,导致文本不恢复的问题 +2. 修复multiple模式下,selected自定义信息的颜色没变,依然是白色 +## 1.0.12(2023-09-14) +1. 优化 +## 1.0.11(2023-09-14) +1. 增加allowSameDay参数,是否允许日期范围的起止时间为同一天,mode = range时有效 +2. 修复在vue2+小程序渲染时闪烁的问题 +## 1.0.10(2023-09-07) +1. 修复国际化失效的BUG +## 1.0.9(2023-09-01) +1. 修复在pages.json中设置easycom会报错的BUG +## 1.0.8(2023-08-29) +1. 修复mainjs中设置setConfig修改属性不生效的问题,出自评论区:https://ext.dcloud.net.cn/plugin?id=12287 +## 1.0.7(2023-08-26) +1. 去除range参数,由mode="range"替换 +2. 新增mode参数,不传 / multiple / range,分别为单日期, 多个日期,选择日期范围 +3. 与uv-calendar选择日期的功能保持一致 +## 1.0.6(2023-08-25) +1. 修复点击返回今天按钮时,monthSwitch方法回调参数返回月份不是当天对应月份:https://github.com/climblee/uv-ui/issues/7 +## 1.0.5(2023-08-13) +1. 修复选择月份弹窗层级的问题 +## 1.0.4(2023-08-06) +1. 优化 +## 1.0.3(2023-08-06) +1. 修复高度不对的BUG +2. 修复文案在小屏幕的BUG +## 1.0.2(2023-08-05) +1. 增加startText参数 +2. 增加endText参数 +3. 增加selected中的参数 +4. 优化日历范围选择 +## 1.0.1(2023-08-04) +1. 修复 自定义主题时 颜色错误的BUG +## 1.0.0(2023-08-03) +1. 新增 uv-calendars 新版日历发布 diff --git a/uni_modules/uv-calendars/components/uv-calendars/calendar-body.vue b/uni_modules/uv-calendars/components/uv-calendars/calendar-body.vue new file mode 100644 index 0000000..b675fbd --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/calendar-body.vue @@ -0,0 +1,376 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-calendars/components/uv-calendars/calendar-item.vue b/uni_modules/uv-calendars/components/uv-calendars/calendar-item.vue new file mode 100644 index 0000000..862d068 --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/calendar-item.vue @@ -0,0 +1,248 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-calendars/components/uv-calendars/calendar.js b/uni_modules/uv-calendars/components/uv-calendars/calendar.js new file mode 100644 index 0000000..b8d7d6f --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/calendar.js @@ -0,0 +1,546 @@ +/** +* @1900-2100区间内的公历、农历互转 +* @charset UTF-8 +* @github https://github.com/jjonline/calendar.js +* @Author Jea杨(JJonline@JJonline.Cn) +* @Time 2014-7-21 +* @Time 2016-8-13 Fixed 2033hex、Attribution Annals +* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug +* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year +* @Version 1.0.3 +* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] +* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] +*/ +/* eslint-disable */ +var calendar = { + + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909 + 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919 + 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929 + 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939 + 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949 + 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959 + 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969 + 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979 + 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989 + 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999 + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009 + 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019 + 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029 + 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039 + 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049 + /** Add By JJonline@JJonline.Cn**/ + 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059 + 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069 + 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079 + 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089 + 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099 + 0x0d520], // 2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'], + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'], + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function (y) { + var i; var sum = 348 + for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 } + return (sum + this.leapDays(y)) + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function (y) { // 闰字编码 \u95f0 + return (this.lunarInfo[y - 1900] & 0xf) + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function (y) { + if (this.leapMonth(y)) { + return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29) + } + return (0) + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function (y, m) { + if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1 + return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29) + }, + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function (y, m) { + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var ms = m - 1 + if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29 + return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28) + } else { + return (this.solarMonth[ms]) + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function (lYear) { + var ganKey = (lYear - 3) % 10 + var zhiKey = (lYear - 3) % 12 + if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干 + if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1] + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function (cMonth, cDay) { + var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf' + var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function (offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12] + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function (y, n) { + if (y < 1900 || y > 2100) { return -1 } + if (n < 1 || n > 24) { return -1 } + var _table = this.sTermInfo[y - 1900] + var _info = [ + parseInt('0x' + _table.substr(0, 5)).toString(), + parseInt('0x' + _table.substr(5, 5)).toString(), + parseInt('0x' + _table.substr(10, 5)).toString(), + parseInt('0x' + _table.substr(15, 5)).toString(), + parseInt('0x' + _table.substr(20, 5)).toString(), + parseInt('0x' + _table.substr(25, 5)).toString() + ] + var _calday = [ + _info[0].substr(0, 1), + _info[0].substr(1, 2), + _info[0].substr(3, 1), + _info[0].substr(4, 2), + + _info[1].substr(0, 1), + _info[1].substr(1, 2), + _info[1].substr(3, 1), + _info[1].substr(4, 2), + + _info[2].substr(0, 1), + _info[2].substr(1, 2), + _info[2].substr(3, 1), + _info[2].substr(4, 2), + + _info[3].substr(0, 1), + _info[3].substr(1, 2), + _info[3].substr(3, 1), + _info[3].substr(4, 2), + + _info[4].substr(0, 1), + _info[4].substr(1, 2), + _info[4].substr(3, 1), + _info[4].substr(4, 2), + + _info[5].substr(0, 1), + _info[5].substr(1, 2), + _info[5].substr(3, 1), + _info[5].substr(4, 2) + ] + return parseInt(_calday[n - 1]) + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function (m) { // 月 => \u6708 + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var s = this.nStr3[m - 1] + s += '\u6708'// 加上月字 + return s + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function (d) { // 日 => \u65e5 + var s + switch (d) { + case 10: + s = '\u521d\u5341'; break + case 20: + s = '\u4e8c\u5341'; break + break + case 30: + s = '\u4e09\u5341'; break + break + default : + s = this.nStr2[Math.floor(d / 10)] + s += this.nStr1[d % 10] + } + return (s) + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function (y) { + return this.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31 + // 年份限定、上限 + if (y < 1900 || y > 2100) { + return -1// undefined转换为数字变为NaN + } + // 公历传参最下限 + if (y == 1900 && m == 1 && d < 31) { + return -1 + } + // 未传参 获得当天 + if (!y) { + var objDate = new Date() + } else { + var objDate = new Date(y, parseInt(m) - 1, d) + } + var i; var leap = 0; var temp = 0 + // 修正ymd参数 + var y = objDate.getFullYear() + var m = objDate.getMonth() + 1 + var d = objDate.getDate() + var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000 + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i) + offset -= temp + } + if (offset < 0) { + offset += temp; i-- + } + + // 是否今天 + var isTodayObj = new Date() + var isToday = false + if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { + isToday = true + } + // 星期几 + var nWeek = objDate.getDay() + var cWeek = this.nStr1[nWeek] + // 数字表示周几顺应天朝周一开始的惯例 + if (nWeek == 0) { + nWeek = 7 + } + // 农历年 + var year = i + var leap = this.leapMonth(i) // 闰哪个月 + var isLeap = false + + // 效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + // 闰月 + if (leap > 0 && i == (leap + 1) && isLeap == false) { + --i + isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数 + } else { + temp = this.monthDays(year, i)// 计算农历普通月天数 + } + // 解除闰月 + if (isLeap == true && i == (leap + 1)) { isLeap = false } + offset -= temp + } + // 闰月导致数组下标重叠取反 + if (offset == 0 && leap > 0 && i == leap + 1) { + if (isLeap) { + isLeap = false + } else { + isLeap = true; --i + } + } + if (offset < 0) { + offset += temp; --i + } + // 农历月 + var month = i + // 农历日 + var day = offset + 1 + // 天干地支处理 + var sm = m - 1 + var gzY = this.toGanZhiYear(year) + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始 + var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始 + + // 依据12节气修正干支月 + var gzM = this.toGanZhi((y - 1900) * 12 + m + 11) + if (d >= firstNode) { + gzM = this.toGanZhi((y - 1900) * 12 + m + 12) + } + + // 传入的日期的节气与否 + var isTerm = false + var Term = null + if (firstNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 2] + } + if (secondNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 1] + } + // 日柱 当月一日与 1900/1/1 相差天数 + var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 + var gzD = this.toGanZhi(dayCyclical + d - 1) + // 该日期所属的星座 + var astro = this.toAstro(m, d) + + return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro } + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1 + var isLeapMonth = !!isLeapMonth + var leapOffset = 0 + var leapMonth = this.leapMonth(y) + var leapDay = this.leapDays(y) + if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值 + var day = this.monthDays(y, m) + var _day = day + // bugFix 2016-9-25 + // if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m) + } + if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验 + + // 计算农历的时间差 + var offset = 0 + for (var i = 1900; i < y; i++) { + offset += this.lYearDays(i) + } + var leap = 0; var isAdd = false + for (var i = 1; i < m; i++) { + leap = this.leapMonth(y) + if (!isAdd) { // 处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); isAdd = true + } + } + offset += this.monthDays(y, i) + } + // 转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { offset += day } + // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + var stmap = Date.UTC(1900, 1, 30, 0, 0, 0) + var calObj = new Date((offset + d - 31) * 86400000 + stmap) + var cY = calObj.getUTCFullYear() + var cM = calObj.getUTCMonth() + 1 + var cD = calObj.getUTCDate() + + return this.solar2lunar(cY, cM, cD) + } +} + +export default calendar diff --git a/uni_modules/uv-calendars/components/uv-calendars/i18n/en.json b/uni_modules/uv-calendars/components/uv-calendars/i18n/en.json new file mode 100644 index 0000000..c83e8b2 --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/i18n/en.json @@ -0,0 +1,12 @@ +{ + "uv-calender.ok": "ok", + "uv-calender.cancel": "cancel", + "uv-calender.today": "today", + "uv-calender.MON": "MON", + "uv-calender.TUE": "TUE", + "uv-calender.WED": "WED", + "uv-calender.THU": "THU", + "uv-calender.FRI": "FRI", + "uv-calender.SAT": "SAT", + "uv-calender.SUN": "SUN" +} diff --git a/uni_modules/uv-calendars/components/uv-calendars/i18n/index.js b/uni_modules/uv-calendars/components/uv-calendars/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hans.json b/uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hans.json new file mode 100644 index 0000000..03c5486 --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hans.json @@ -0,0 +1,12 @@ +{ + "uv-calender.ok": "确定", + "uv-calender.cancel": "取消", + "uv-calender.today": "今日", + "uv-calender.SUN": "日", + "uv-calender.MON": "一", + "uv-calender.TUE": "二", + "uv-calender.WED": "三", + "uv-calender.THU": "四", + "uv-calender.FRI": "五", + "uv-calender.SAT": "六" +} diff --git a/uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hant.json b/uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hant.json new file mode 100644 index 0000000..95cf29e --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/i18n/zh-Hant.json @@ -0,0 +1,12 @@ +{ + "uv-calender.ok": "確定", + "uv-calender.cancel": "取消", + "uv-calender.today": "今日", + "uv-calender.SUN": "日", + "uv-calender.MON": "一", + "uv-calender.TUE": "二", + "uv-calender.WED": "三", + "uv-calender.THU": "四", + "uv-calender.FRI": "五", + "uv-calender.SAT": "六" +} diff --git a/uni_modules/uv-calendars/components/uv-calendars/util.js b/uni_modules/uv-calendars/components/uv-calendars/util.js new file mode 100644 index 0000000..ae1c6d6 --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/util.js @@ -0,0 +1,435 @@ +import CALENDAR from './calendar.js' +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range, + multiple, + allowSameDay + } = {}) { + // 当前日期 + this.date = this.getDate(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 范围开始 + this.startDate = startDate + // 范围结束 + this.endDate = endDate + this.range = range + this.multiple = multiple + this.allowSameDay = allowSameDay + // 多选状态 + this.cleanRangeStatus() + // 范围状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + // this._getWeek(this.date.fullDate) + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date, status) { + if (this.range && status == 'init') { + this.cleanRangeStatus(); + if (Array.isArray(date)) { + this.rangeStatus.before = date[0]; + this.rangeStatus.after = date.length > 1 ? date[date.length - 1] : ''; + if (this.rangeStatus.after && this.dateCompare(this.rangeStatus.before, this.rangeStatus.after)) { + this.rangeStatus.data = this.geDateAll(this.rangeStatus.before, this.rangeStatus.after) + } + this.selectDate = this.getDate(date[0]) + this._getWeek(this.selectDate.fullDate) + } else { + this.selectDate = this.getDate(date) + this.rangeStatus.before = this.selectDate.fullDate; + this._getWeek(this.selectDate.fullDate) + } + } else if (this.multiple && status == 'init') { + this.cleanMultipleStatus(); + if (Array.isArray(date)) { + this.multipleStatus.data = date; + this.selectDate = this.getDate(date[0]) + this._getWeek(this.selectDate.fullDate) + } else { + this.selectDate = this.getDate(date) + this.multipleStatus.data = [this.selectDate.fullDate]; + this._getWeek(this.selectDate.fullDate) + } + } else { + if (Array.isArray(date)) { + this.selectDate = this.getDate(date[0]) + this._getWeek(this.selectDate.fullDate) + } else { + this.selectDate = this.getDate(date) + this._getWeek(this.selectDate.fullDate) + } + } + } + /** + * 清理多选状态 + */ + cleanRangeStatus() { + this.rangeStatus = { + before: '', + after: '', + data: [] + } + } + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + data: [] + } + } + /** + * 重置开始日期 + */ + resetSatrtDate(startDate) { + // 范围开始 + this.startDate = startDate + } + /** + * 重置结束日期 + */ + resetEndDate(endDate) { + // 范围结束 + this.endDate = endDate + } + /** + * 获取任意时间 + */ + getDate(date, AddDayCount = 0, str = 'day') { + if (!date) { + date = new Date() + } + if (typeof date !== 'object') { + date = date.replace(/-/g, '/') + } + const dd = new Date(date) + switch (str) { + case 'day': + dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 + break + case 'month': + if (dd.getDate() === 31 && AddDayCount > 0) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + const preMonth = dd.getMonth() + dd.setMonth(preMonth + AddDayCount) // 获取AddDayCount天后的日期 + const nextMonth = dd.getMonth() + // 处理 pre 切换月份目标月份为2月没有当前日(30 31) 切换错误问题 + if (AddDayCount < 0 && preMonth !== 0 && nextMonth - preMonth > AddDayCount) { + dd.setMonth(nextMonth + (nextMonth - preMonth + AddDayCount)) + } + // 处理 next 切换月份目标月份为2月没有当前日(30 31) 切换错误问题 + if (AddDayCount > 0 && nextMonth - preMonth > AddDayCount) { + dd.setMonth(nextMonth - (nextMonth - preMonth - AddDayCount)) + } + } + break + case 'year': + dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 + break + } + const y = dd.getFullYear() + const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 + const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 + return { + fullDate: y + '-' + m + '-' + d, + year: y, + month: m, + date: d, + day: dd.getDay() + } + } + /** + * 获取上月剩余天数 + */ + _getLastMonthDays(firstDay, full) { + let dateArr = [] + for (let i = firstDay; i > 0; i--) { + const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() + dateArr.push({ + date: beforeDate, + month: full.month - 1, + lunar: this.getlunar(full.year, full.month - 1, beforeDate), + disable: true + }) + } + return dateArr + } + /** + * 获取本月天数 + */ + _currentMonthDys(dateData, full) { + let dateArr = [] + let fullDate = this.date.fullDate + for (let i = 1; i <= dateData; i++) { + let nowDate = full.year + '-' + (full.month < 10 ? full.month : full.month) + '-' + (i < 10 ? '0' + i : i) + // 是否今天 + let isDay = fullDate === nowDate + // 获取打点信息 + let info = this.selected && this.selected.find((item) => { + if (this.dateEqual(nowDate, item.date)) { + return item + } + }) + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + // let dateCompBefore = this.dateCompare(this.startDate, fullDate) + // disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) + disableBefore = this.dateCompare(this.startDate, nowDate) + } + if (this.endDate) { + // let dateCompAfter = this.dateCompare(fullDate, this.endDate) + // disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) + disableAfter = this.dateCompare(nowDate, this.endDate) + } + let ranges = this.rangeStatus.data + let checked = false + let rangesStatus = -1 + if (this.range) { + if (ranges) { + rangesStatus = ranges.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (rangesStatus !== -1) { + checked = true + } + } + let multiples = this.multipleStatus.data + let checked_multiple = false + let multiplesStatus = -1 + if (this.multiple) { + if (multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (multiplesStatus !== -1) { + checked_multiple = true + } + } + let data = { + fullDate: nowDate, + year: full.year, + date: i, + range: this.range ? checked : false, + multiple: this.multiple ? checked_multiple : false, + beforeRange: this.dateEqual(this.rangeStatus.before, nowDate), + afterRange: this.dateEqual(this.rangeStatus.after, nowDate), + dateEqual: this.range && checked && this.dateEqual(this.rangeStatus.before, this.rangeStatus.after), + 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() + } else if (Array.isArray(date)) { + date = date[0] + } + 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 + } + } + /** + * 比较after时间是否大于before时间 + */ + dateAfterLgBefore(before, after) { + // 计算截止时间 + before = new Date(before.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + after = new Date(after.replace('-', '/').replace('-', '/')) + if (after.getTime() - before.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) { + if (!this.multiple) return + let multiples = this.multipleStatus.data; + const findIndex = multiples.findIndex(item => this.dateEqual(fullDate, item)); + if (findIndex < 0) { + this.multipleStatus.data = this.multipleStatus.data.concat([fullDate]); + } else { + this.multipleStatus.data.splice(findIndex, 1); + } + this._getWeek(fullDate) + } + /** + * 获取范围状态 + */ + setRange(fullDate) { + let { + before, + after + } = this.rangeStatus + if (!this.range) return + if (before && after) { + this.cleanRangeStatus(); + this.rangeStatus.before = fullDate + } else { + if (!before) { + this.rangeStatus.before = fullDate + } else { + if (this.allowSameDay && this.dateEqual(before, fullDate)) { + this.rangeStatus.after = fullDate + } else if (!this.dateAfterLgBefore(this.rangeStatus.before, fullDate)) { + this.cleanRangeStatus(); + this.rangeStatus.before = fullDate + this._getWeek(fullDate) + return; + } + this.rangeStatus.after = fullDate + if (this.dateCompare(this.rangeStatus.before, this.rangeStatus.after)) { + this.rangeStatus.data = this.geDateAll(this.rangeStatus.before, this.rangeStatus.after); + } else { + this.rangeStatus.data = this.geDateAll(this.rangeStatus.after, this.rangeStatus.before); + } + } + } + this._getWeek(fullDate) + } + /** + * 获取每周数据 + * @param {Object} dateData + */ + _getWeek(dateData) { + const { + year, + month + } = this.getDate(dateData) + let firstDay = new Date(year, month - 1, 1).getDay() + let currentDay = new Date(year, month, 0).getDate() + let dates = { + lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 + currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 + nextMonthDays: [], // 下个月开始几天 + weeks: [] + } + let canlender = [] + const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) + dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) + canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) + let weeks = {} + // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 + for (let i = 0; i < canlender.length; i++) { + if (i % 7 === 0) { + weeks[parseInt(i / 7)] = new Array(7) + } + weeks[parseInt(i / 7)][i % 7] = canlender[i] + } + this.canlender = canlender + this.weeks = weeks + } + //静态方法 + // static init(date) { + // if (!this.instance) { + // this.instance = new Calendar(date); + // } + // return this.instance; + // } +} +export default Calendar \ No newline at end of file diff --git a/uni_modules/uv-calendars/components/uv-calendars/uv-calendars.vue b/uni_modules/uv-calendars/components/uv-calendars/uv-calendars.vue new file mode 100644 index 0000000..8d5b377 --- /dev/null +++ b/uni_modules/uv-calendars/components/uv-calendars/uv-calendars.vue @@ -0,0 +1,452 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-calendars/package.json b/uni_modules/uv-calendars/package.json new file mode 100644 index 0000000..7153510 --- /dev/null +++ b/uni_modules/uv-calendars/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-calendars", + "displayName": "uv-calendars 最新日历 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.15", + "description": "新版本uv-calendars,不仅拥有老版本的所有功能,还增加了更加适用的插入页面等强大功能,且更加简洁。查看日期、选择单个或多个或任意范围日期,打点操作,自定义文案,自定义主题等强大功能。", + "keywords": [ + "uv-ui", + "uvui", + "日历", + "打卡", + "日历选择" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration":{ + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-popup", + "uv-toolbar" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-calendars/readme.md b/uni_modules/uv-calendars/readme.md new file mode 100644 index 0000000..d986eb9 --- /dev/null +++ b/uni_modules/uv-calendars/readme.md @@ -0,0 +1,23 @@ +## Calendars 全新日历 + +> **组件名:uv-calendars** + +为了解决老版本`uv-calendar`性能问题,特别是对日期选择范围有很大限制,体验不友好等缺点。于是有了新版日历组件。 + +新版本`uv-calendars`,不仅拥有老版本的所有功能,还增加了更加适用的插入页面等强大功能,且更加简洁。查看日期、选择单个或多个或任意范围日期,打点操作,自定义文案,自定义主题等强大功能。 + +常用场景:酒店日期预订、火车机票选择购买日期、上下班打卡等。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-cell/changelog.md b/uni_modules/uv-cell/changelog.md new file mode 100644 index 0000000..c342b0c --- /dev/null +++ b/uni_modules/uv-cell/changelog.md @@ -0,0 +1,13 @@ +## 1.0.5(2023-12-06) +1. 修复uv-cell right-icon插槽编译到APP端不显示的BUG,问题来源:https://gitee.com/climblee/uv-ui/issues/I8LXZI +## 1.0.4(2023-09-19) +1. 增加cellStyle参数,方便自定义单元格的样式 +## 1.0.3(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.2(2023-06-21) +1. 优化 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-cell 单元格 diff --git a/uni_modules/uv-cell/components/uv-cell-group/props.js b/uni_modules/uv-cell/components/uv-cell-group/props.js new file mode 100644 index 0000000..57deb4c --- /dev/null +++ b/uni_modules/uv-cell/components/uv-cell-group/props.js @@ -0,0 +1,15 @@ +export default { + props: { + // 分组标题 + title: { + type: String, + default: '' + }, + // 是否显示外边框 + border: { + type: Boolean, + default: true + }, + ...uni.$uv?.props?.cellGroup + } +} \ No newline at end of file diff --git a/uni_modules/uv-cell/components/uv-cell-group/uv-cell-group.vue b/uni_modules/uv-cell/components/uv-cell-group/uv-cell-group.vue new file mode 100644 index 0000000..0f17865 --- /dev/null +++ b/uni_modules/uv-cell/components/uv-cell-group/uv-cell-group.vue @@ -0,0 +1,63 @@ + + + + + + diff --git a/uni_modules/uv-cell/components/uv-cell/props.js b/uni_modules/uv-cell/components/uv-cell/props.js new file mode 100644 index 0000000..6579636 --- /dev/null +++ b/uni_modules/uv-cell/components/uv-cell/props.js @@ -0,0 +1,116 @@ +export default { + props: { + // 标题 + title: { + type: [String, Number], + default: '' + }, + // 标题下方的描述信息 + label: { + type: [String, Number], + default: '' + }, + // 右侧的内容 + value: { + type: [String, Number], + default: '' + }, + // 左侧图标名称,或者图片链接(本地文件建议使用绝对地址) + icon: { + type: String, + default: '' + }, + // 是否禁用cell + disabled: { + type: Boolean, + default: false + }, + // 是否显示下边框 + border: { + type: Boolean, + default: true + }, + // 内容是否垂直居中(主要是针对右侧的value部分) + center: { + type: Boolean, + default: true + }, + // 点击后跳转的URL地址 + url: { + type: String, + default: '' + }, + // 链接跳转的方式,内部使用的是uvui封装的route方法,可能会进行拦截操作 + linkType: { + type: String, + default: 'navigateTo' + }, + // 是否开启点击反馈(表现为点击时加上灰色背景) + clickable: { + type: Boolean, + default: false + }, + // 是否展示右侧箭头并开启点击反馈 + isLink: { + type: Boolean, + default: false + }, + // 是否显示表单状态下的必填星号(此组件可能会内嵌入input组件) + required: { + type: Boolean, + default: false + }, + // 右侧的图标箭头 + rightIcon: { + type: String, + default: 'arrow-right' + }, + // 右侧箭头的方向,可选值为:left,up,down + arrowDirection: { + type: String, + default: '' + }, + // 左侧图标样式 + iconStyle: { + type: [Object, String], + default: () => { + return {} + } + }, + // 右侧箭头图标的样式 + rightIconStyle: { + type: [Object, String], + default: () => { + return {} + } + }, + // 标题的样式 + titleStyle: { + type: [Object, String], + default: () => { + return {} + } + }, + // 单位元的大小,可选值为large + size: { + type: String, + default: '' + }, + // 点击cell是否阻止事件传播 + stop: { + type: Boolean, + default: true + }, + // 标识符,cell被点击时返回 + name: { + type: [Number, String], + default: '' + }, + // 单元格自定义样式 + cellStyle: { + type: [Object, String], + default: () => {} + }, + ...uni.$uv?.props?.cell + } +} \ No newline at end of file diff --git a/uni_modules/uv-cell/components/uv-cell/uv-cell.vue b/uni_modules/uv-cell/components/uv-cell/uv-cell.vue new file mode 100644 index 0000000..bdd268e --- /dev/null +++ b/uni_modules/uv-cell/components/uv-cell/uv-cell.vue @@ -0,0 +1,209 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-cell/package.json b/uni_modules/uv-cell/package.json new file mode 100644 index 0000000..8ff5cf6 --- /dev/null +++ b/uni_modules/uv-cell/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-cell", + "displayName": "uv-cell 单元格 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.5", + "description": "cell单元格一般用于一组列表的情况,比如个人中心页,设置页等。", + "keywords": [ + "uv-cell", + "uvui", + "uv-ui", + "单元格", + "设置页" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-line" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-cell/readme.md b/uni_modules/uv-cell/readme.md new file mode 100644 index 0000000..3ea9937 --- /dev/null +++ b/uni_modules/uv-cell/readme.md @@ -0,0 +1,11 @@ +## Cell 单元格 + +> **组件名:uv-cell** + +cell单元格一般用于一组列表的情况,比如个人中心页,设置页等。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-checkbox/changelog.md b/uni_modules/uv-checkbox/changelog.md new file mode 100644 index 0000000..2a142ce --- /dev/null +++ b/uni_modules/uv-checkbox/changelog.md @@ -0,0 +1,34 @@ +## 1.0.14(2023-11-04) +1. 修复label文字较多不分行的问题 +## 1.0.13(2023-10-11) +1. 优化同类问题:https://gitee.com/climblee/uv-ui/issues/I872VD +## 1.0.12(2023-09-22) +1. 修复change回调中v-model值不更新的BUG +## 1.0.11(2023-09-01) +1. 修复点击空隙处无效的问题 +2. label支持插槽下可点击 +## 1.0.10(2023-08-27) +1. 修复label设置布尔值不生效的BUG +## 1.0.9(2023-08-16) +1. 解决数据多不换行的BUG +## 1.0.8(2023-07-13) +1. 修复 uv-checkbox设置value属性不生效的BUG +## 1.0.7(2023-07-05) +修复vue3模式下,动态修改v-model绑定的值无效的BUG +## 1.0.6(2023-06-29) +1. 增加label插槽,与radio保持一致 +2. 优化文档 +## 1.0.5(2023-06-12) +1. 修复1.0.4改出的问题 +## 1.0.4(2023-06-08) +1. 复选框修复全局设置不生效的BUG +## 1.0.3(2023-06-06) +1. uv-checkbox-group 兼容自定义样式customStyle,方便通过样式调整整体位置等; +2. .uv-checkbox-group--row增加flex-wrap: wrap;允许换行 +## 1.0.2(2023-05-30) +1. 修复error报错的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-checkbox 复选框 diff --git a/uni_modules/uv-checkbox/components/uv-checkbox-group/props.js b/uni_modules/uv-checkbox/components/uv-checkbox-group/props.js new file mode 100644 index 0000000..47bf005 --- /dev/null +++ b/uni_modules/uv-checkbox/components/uv-checkbox-group/props.js @@ -0,0 +1,84 @@ +export default { + props: { + // 绑定的值 + value: { + type: Array, + default: () => [] + }, + modelValue: { + type: Array, + default: () => [] + }, + // 标识符 + name: { + type: String, + default: '' + }, + // 形状,circle-圆形,square-方形 + shape: { + type: String, + default: 'square' + }, + // 是否禁用全部checkbox + disabled: { + type: Boolean, + default: false + }, + // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 + activeColor: { + type: String, + default: '#2979ff' + }, + // 未选中的颜色 + inactiveColor: { + type: String, + default: '#c8c9cc' + }, + // 整个组件的尺寸,默认px + size: { + type: [String, Number], + default: 18 + }, + // 布局方式,row-横向,column-纵向 + placement: { + type: String, + default: 'row' + }, + // label的字体大小,px单位 + labelSize: { + type: [String, Number], + default: 14 + }, + // label的字体颜色 + labelColor: { + type: [String], + default: '#303133' + }, + // 是否禁止点击文本操作 + labelDisabled: { + type: Boolean, + default: false + }, + // 图标颜色 + iconColor: { + type: String, + default: '#fff' + }, + // 图标的大小,单位px + iconSize: { + type: [String, Number], + default: 12 + }, + // 勾选图标的对齐方式,left-左边,right-右边 + iconPlacement: { + type: String, + default: 'left' + }, + // 竖向配列时,是否显示下划线 + borderBottom: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.checkboxGroup + } +} \ No newline at end of file diff --git a/uni_modules/uv-checkbox/components/uv-checkbox-group/uv-checkbox-group.vue b/uni_modules/uv-checkbox/components/uv-checkbox-group/uv-checkbox-group.vue new file mode 100644 index 0000000..d5ea81f --- /dev/null +++ b/uni_modules/uv-checkbox/components/uv-checkbox-group/uv-checkbox-group.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/uni_modules/uv-checkbox/components/uv-checkbox/props.js b/uni_modules/uv-checkbox/components/uv-checkbox/props.js new file mode 100644 index 0000000..58ec890 --- /dev/null +++ b/uni_modules/uv-checkbox/components/uv-checkbox/props.js @@ -0,0 +1,70 @@ +export default { + props: { + // checkbox的名称 + name: { + type: [String, Number, Boolean], + default: '' + }, + // 形状,square为方形,circle为圆型 + shape: { + type: String, + default: '' + }, + // 整体的大小 + size: { + type: [String, Number], + default: '' + }, + // 是否默认选中 + checked: { + type: Boolean, + default: false + }, + // 是否禁用 + disabled: { + type: [String, Boolean], + default: '' + }, + // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 + activeColor: { + type: String, + default: '' + }, + // 未选中的颜色 + inactiveColor: { + type: String, + default: '' + }, + // 图标的大小,单位px + iconSize: { + type: [String, Number], + default: '' + }, + // 图标颜色 + iconColor: { + type: String, + default: '' + }, + // label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式 + label: { + type: [String, Number, Boolean], + default: '' + }, + // label的字体大小,px单位 + labelSize: { + type: [String, Number], + default: '' + }, + // label的颜色 + labelColor: { + type: String, + default: '' + }, + // 是否禁止点击提示语选中复选框 + labelDisabled: { + type: [String, Boolean], + default: '' + }, + ...uni.$uv?.props?.checkbox + } +} \ No newline at end of file diff --git a/uni_modules/uv-checkbox/components/uv-checkbox/uv-checkbox.vue b/uni_modules/uv-checkbox/components/uv-checkbox/uv-checkbox.vue new file mode 100644 index 0000000..dfd1912 --- /dev/null +++ b/uni_modules/uv-checkbox/components/uv-checkbox/uv-checkbox.vue @@ -0,0 +1,370 @@ + + + + + diff --git a/uni_modules/uv-checkbox/package.json b/uni_modules/uv-checkbox/package.json new file mode 100644 index 0000000..44944d9 --- /dev/null +++ b/uni_modules/uv-checkbox/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-checkbox", + "displayName": "uv-checkbox 复选框 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.14", + "description": "复选框组件一般用于需要多个选择的场景,该组件功能完整,使用方便。", + "keywords": [ + "uv-checkbox", + "uvui", + "uv-ui", + "checkbox", + "复选框" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-checkbox/readme.md b/uni_modules/uv-checkbox/readme.md new file mode 100644 index 0000000..43b6f2e --- /dev/null +++ b/uni_modules/uv-checkbox/readme.md @@ -0,0 +1,19 @@ +## Checkbox 复选框 + +> **组件名:uv-checkbox** + +复选框组件一般用于需要多个选择的场景,该组件功能完整,使用方便。可配合 `uv-form` 组件进行表单验证等场景使用。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-code-input/changelog.md b/uni_modules/uv-code-input/changelog.md new file mode 100644 index 0000000..1fefc03 --- /dev/null +++ b/uni_modules/uv-code-input/changelog.md @@ -0,0 +1,13 @@ +## 1.0.5(2023-08-05) +在vue2模式下,v-model设置为0时不生效的BUG +## 1.0.4(2023-07-13) +1. 修复value/v-model更改不生效的BUG +## 1.0.3(2023-06-28) +修复:使用:disabledKeyboard="true"属性,事件全部失效的BUG +## 1.0.2(2023-06-23) +优化下边框 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-code-input 验证码输入 diff --git a/uni_modules/uv-code-input/components/uv-code-input/props.js b/uni_modules/uv-code-input/components/uv-code-input/props.js new file mode 100644 index 0000000..4a5e460 --- /dev/null +++ b/uni_modules/uv-code-input/components/uv-code-input/props.js @@ -0,0 +1,83 @@ +export default { + props: { + value: { + type: [String, Number], + default: '' + }, + modelValue: { + type: [String, Number], + default: '' + }, + // 键盘弹起时,是否自动上推页面 + adjustPosition: { + type: Boolean, + default: true + }, + // 最大输入长度 + maxlength: { + type: [String, Number], + default: 6 + }, + // 是否用圆点填充 + dot: { + type: Boolean, + default: false + }, + // 显示模式,box-盒子模式,line-底部横线模式 + mode: { + type: String, + default: 'box' + }, + // 是否细边框 + hairline: { + type: Boolean, + default: false + }, + // 字符间的距离 + space: { + type: [String, Number], + default: 10 + }, + // 是否自动获取焦点 + focus: { + type: Boolean, + default: false + }, + // 字体是否加粗 + bold: { + type: Boolean, + default: false + }, + // 字体颜色 + color: { + type: String, + default: '#606266' + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 18 + }, + // 输入框的大小,宽等于高 + size: { + type: [String, Number], + default: 35 + }, + // 是否隐藏原生键盘,如果想用自定义键盘的话,需设置此参数为true + disabledKeyboard: { + type: Boolean, + default: false + }, + // 边框和线条颜色 + borderColor: { + type: String, + default: '#c9cacc' + }, + // 是否禁止输入"."符号 + disabledDot: { + type: Boolean, + default: true + }, + ...uni.$uv?.props?.codeInput + } +} \ No newline at end of file diff --git a/uni_modules/uv-code-input/components/uv-code-input/uv-code-input.vue b/uni_modules/uv-code-input/components/uv-code-input/uv-code-input.vue new file mode 100644 index 0000000..14ad8a2 --- /dev/null +++ b/uni_modules/uv-code-input/components/uv-code-input/uv-code-input.vue @@ -0,0 +1,272 @@ + + + + \ No newline at end of file diff --git a/uni_modules/uv-code-input/package.json b/uni_modules/uv-code-input/package.json new file mode 100644 index 0000000..ab8762c --- /dev/null +++ b/uni_modules/uv-code-input/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-code-input", + "displayName": "uv-code-input 验证码输入 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.5", + "description": "验证码输入组件一般用于验证用户短信验证码的场景,输入框或横线多种模式可选。", + "keywords": [ + "uv-code-input", + "uvui", + "uv-ui", + "code", + "验证码输入" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-code-input/readme.md b/uni_modules/uv-code-input/readme.md new file mode 100644 index 0000000..aa5b0a1 --- /dev/null +++ b/uni_modules/uv-code-input/readme.md @@ -0,0 +1,19 @@ +## CodeInput 验证码输入框 + +> **组件名:uv-code-input** + +该组件一般用于验证用户短信验证码的场景,输入框或横线多种模式可选。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-code/changelog.md b/uni_modules/uv-code/changelog.md new file mode 100644 index 0000000..7054a25 --- /dev/null +++ b/uni_modules/uv-code/changelog.md @@ -0,0 +1,9 @@ +## 1.0.3(2023-10-13) +1. 优化 +## 1.0.2(2023-10-13) +1. unmounted兼容vue3 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-code 验证码倒计时 diff --git a/uni_modules/uv-code/components/uv-code/props.js b/uni_modules/uv-code/components/uv-code/props.js new file mode 100644 index 0000000..afc9d3c --- /dev/null +++ b/uni_modules/uv-code/components/uv-code/props.js @@ -0,0 +1,35 @@ +export default { + props: { + // 倒计时总秒数 + seconds: { + type: [String, Number], + default: 60 + }, + // 尚未开始时提示 + startText: { + type: String, + default: '获取验证码' + }, + // 正在倒计时中的提示 + changeText: { + type: String, + default: 'X秒重新获取' + }, + // 倒计时结束时的提示 + endText: { + type: String, + default: '重新获取' + }, + // 是否在H5刷新或各端返回再进入时继续倒计时 + keepRunning: { + type: Boolean, + default: false + }, + // 为了区分多个页面,或者一个页面多个倒计时组件本地存储的继续倒计时变了 + uniqueKey: { + type: String, + default: '' + }, + ...uni.$uv?.props?.code + } +} \ No newline at end of file diff --git a/uni_modules/uv-code/components/uv-code/uv-code.vue b/uni_modules/uv-code/components/uv-code/uv-code.vue new file mode 100644 index 0000000..de02c83 --- /dev/null +++ b/uni_modules/uv-code/components/uv-code/uv-code.vue @@ -0,0 +1,136 @@ + + \ No newline at end of file diff --git a/uni_modules/uv-code/package.json b/uni_modules/uv-code/package.json new file mode 100644 index 0000000..d4392c0 --- /dev/null +++ b/uni_modules/uv-code/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-code", + "displayName": "uv-code 验证码倒计时 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.3", + "description": "考虑到用户实际发送验证码的场景,可能是一个按钮,也可能是一段文字,提示语各有不同,所以本组件不提供界面显示,只提供倒计时文本,由用户将文本嵌入到具体的场景。", + "keywords": [ + "uv-code", + "uvui", + "uv-ui", + "code", + "验证码倒计时" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-code/readme.md b/uni_modules/uv-code/readme.md new file mode 100644 index 0000000..cf2eb51 --- /dev/null +++ b/uni_modules/uv-code/readme.md @@ -0,0 +1,11 @@ +## Code 验证码输入框 + +> **组件名:uv-code** + +考虑到用户实际发送验证码的场景,可能是一个按钮,也可能是一段文字,提示语各有不同,所以本组件不提供界面显示,只提供倒计时文本,由用户将文本嵌入到具体的场景。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-collapse/changelog.md b/uni_modules/uv-collapse/changelog.md new file mode 100644 index 0000000..0219560 --- /dev/null +++ b/uni_modules/uv-collapse/changelog.md @@ -0,0 +1,5 @@ +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-collapse 折叠面板 diff --git a/uni_modules/uv-collapse/components/uv-collapse-item/props.js b/uni_modules/uv-collapse/components/uv-collapse-item/props.js new file mode 100644 index 0000000..18983c1 --- /dev/null +++ b/uni_modules/uv-collapse/components/uv-collapse-item/props.js @@ -0,0 +1,60 @@ +export default { + props: { + // 标题 + title: { + type: String, + default: '' + }, + // 标题右侧内容 + value: { + type: String, + default: '' + }, + // 标题下方的描述信息 + label: { + type: String, + default: '' + }, + // 是否禁用折叠面板 + disabled: { + type: Boolean, + default: false + }, + // 是否展示右侧箭头并开启点击反馈 + isLink: { + type: Boolean, + default: true + }, + // 是否开启点击反馈 + clickable: { + type: Boolean, + default: true + }, + // 是否显示内边框 + border: { + type: Boolean, + default: true + }, + // 标题的对齐方式 + align: { + type: String, + default: 'left' + }, + // 唯一标识符 + name: { + type: [String, Number], + default: '' + }, + // 标题左侧图片,可为绝对路径的图片或内置图标 + icon: { + type: String, + default: '' + }, + // 面板展开收起的过渡时间,单位ms + duration: { + type: Number, + default: 300 + }, + ...uni.$uv?.props?.collapseItem + } +} \ No newline at end of file diff --git a/uni_modules/uv-collapse/components/uv-collapse-item/uv-collapse-item.vue b/uni_modules/uv-collapse/components/uv-collapse-item/uv-collapse-item.vue new file mode 100644 index 0000000..840f28d --- /dev/null +++ b/uni_modules/uv-collapse/components/uv-collapse-item/uv-collapse-item.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/uni_modules/uv-collapse/components/uv-collapse/props.js b/uni_modules/uv-collapse/components/uv-collapse/props.js new file mode 100644 index 0000000..70fa04c --- /dev/null +++ b/uni_modules/uv-collapse/components/uv-collapse/props.js @@ -0,0 +1,20 @@ +export default { + props: { + // 当前展开面板的name,非手风琴模式:[],手风琴模式:string | number + value: { + type: [String, Number, Array, null], + default: null + }, + // 是否手风琴模式 + accordion: { + type: Boolean, + default: false + }, + // 是否显示外边框 + border: { + type: Boolean, + default: true + }, + ...uni.$uv?.props?.collapse + } +} \ No newline at end of file diff --git a/uni_modules/uv-collapse/components/uv-collapse/uv-collapse.vue b/uni_modules/uv-collapse/components/uv-collapse/uv-collapse.vue new file mode 100644 index 0000000..5e5c96d --- /dev/null +++ b/uni_modules/uv-collapse/components/uv-collapse/uv-collapse.vue @@ -0,0 +1,86 @@ + + + diff --git a/uni_modules/uv-collapse/package.json b/uni_modules/uv-collapse/package.json new file mode 100644 index 0000000..cf9565f --- /dev/null +++ b/uni_modules/uv-collapse/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-collapse", + "displayName": "uv-collapse 折叠面板 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.1", + "description": "折叠面板组件,通过折叠面板收纳内容区域,点击可展开收起,多功能参数可配置。", + "keywords": [ + "uv-collapse", + "uvui", + "uv-ui", + "collapse", + "折叠面板" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-line", + "uv-cell" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-collapse/readme.md b/uni_modules/uv-collapse/readme.md new file mode 100644 index 0000000..cb340ba --- /dev/null +++ b/uni_modules/uv-collapse/readme.md @@ -0,0 +1,11 @@ +## Collapse 折叠面板 + +> **组件名:uv-collapse** + +通过折叠面板收纳内容区域,点击可展开收起,多功能参数可配置。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-count-down/changelog.md b/uni_modules/uv-count-down/changelog.md new file mode 100644 index 0000000..44392c2 --- /dev/null +++ b/uni_modules/uv-count-down/changelog.md @@ -0,0 +1,9 @@ +## 1.0.3(2023-10-13) +1. unmounted兼容vue3 +## 1.0.2(2023-06-20) +1. 增加外部样式customStyle参数 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-count-down 倒计时 diff --git a/uni_modules/uv-count-down/components/uv-count-down/props.js b/uni_modules/uv-count-down/components/uv-count-down/props.js new file mode 100644 index 0000000..c5b5461 --- /dev/null +++ b/uni_modules/uv-count-down/components/uv-count-down/props.js @@ -0,0 +1,25 @@ +export default { + props: { + // 倒计时时长,单位ms + time: { + type: [String, Number], + default: 0 + }, + // 时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒 + format: { + type: String, + default: 'HH:mm:ss' + }, + // 是否自动开始倒计时 + autoStart: { + type: Boolean, + default: true + }, + // 是否展示毫秒倒计时 + millisecond: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.countDown + } +} \ No newline at end of file diff --git a/uni_modules/uv-count-down/components/uv-count-down/utils.js b/uni_modules/uv-count-down/components/uv-count-down/utils.js new file mode 100644 index 0000000..8c75005 --- /dev/null +++ b/uni_modules/uv-count-down/components/uv-count-down/utils.js @@ -0,0 +1,62 @@ +// 补0,如1 -> 01 +function padZero(num, targetLength = 2) { + let str = `${num}` + while (str.length < targetLength) { + str = `0${str}` + } + return str +} +const SECOND = 1000 +const MINUTE = 60 * SECOND +const HOUR = 60 * MINUTE +const DAY = 24 * HOUR +export function parseTimeData(time) { + const days = Math.floor(time / DAY) + const hours = Math.floor((time % DAY) / HOUR) + const minutes = Math.floor((time % HOUR) / MINUTE) + const seconds = Math.floor((time % MINUTE) / SECOND) + const milliseconds = Math.floor(time % SECOND) + return { + days, + hours, + minutes, + seconds, + milliseconds + } +} +export function parseFormat(format, timeData) { + let { + days, + hours, + minutes, + seconds, + milliseconds + } = timeData + // 如果格式化字符串中不存在DD(天),则将天的时间转为小时中去 + if (format.indexOf('DD') === -1) { + hours += days * 24 + } else { + // 对天补0 + format = format.replace('DD', padZero(days)) + } + // 其他同理于DD的格式化处理方式 + if (format.indexOf('HH') === -1) { + minutes += hours * 60 + } else { + format = format.replace('HH', padZero(hours)) + } + if (format.indexOf('mm') === -1) { + seconds += minutes * 60 + } else { + format = format.replace('mm', padZero(minutes)) + } + if (format.indexOf('ss') === -1) { + milliseconds += seconds * 1000 + } else { + format = format.replace('ss', padZero(seconds)) + } + return format.replace('SSS', padZero(milliseconds, 3)) +} +export function isSameSecond(time1, time2) { + return Math.floor(time1 / 1000) === Math.floor(time2 / 1000) +} diff --git a/uni_modules/uv-count-down/components/uv-count-down/uv-count-down.vue b/uni_modules/uv-count-down/components/uv-count-down/uv-count-down.vue new file mode 100644 index 0000000..a758d31 --- /dev/null +++ b/uni_modules/uv-count-down/components/uv-count-down/uv-count-down.vue @@ -0,0 +1,169 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-count-down/package.json b/uni_modules/uv-count-down/package.json new file mode 100644 index 0000000..da501f1 --- /dev/null +++ b/uni_modules/uv-count-down/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-count-down", + "displayName": "uv-count-down 倒计时 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.3", + "description": "该倒计时组件一般使用于某个活动的截止时间上,通过数字的变化,给用户明确的时间感受,提示用户进行某一个行为操作。", + "keywords": [ + "uv-count-down", + "uvui", + "uv-ui", + "countDown", + "倒计时" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-count-down/readme.md b/uni_modules/uv-count-down/readme.md new file mode 100644 index 0000000..0f326a8 --- /dev/null +++ b/uni_modules/uv-count-down/readme.md @@ -0,0 +1,11 @@ +## CountDown 倒计时 + +> **组件名:uv-count-down** + +该组件一般使用于某个活动的截止时间上,通过数字的变化,给用户明确的时间感受,提示用户进行某一个行为操作。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-count-to/changelog.md b/uni_modules/uv-count-to/changelog.md new file mode 100644 index 0000000..cf323f9 --- /dev/null +++ b/uni_modules/uv-count-to/changelog.md @@ -0,0 +1,13 @@ +## 1.0.4(2023-06-20) +1. 优化 +## 1.0.3(2023-06-20) +1. 修复继续滚动的函数 +2. 修复其他 +## 1.0.2(2023-06-20) +1. 适配px和rpx的单位 +2. 适配customStyle参数 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-count-to 数字滚动 diff --git a/uni_modules/uv-count-to/components/uv-count-to/props.js b/uni_modules/uv-count-to/components/uv-count-to/props.js new file mode 100644 index 0000000..498371a --- /dev/null +++ b/uni_modules/uv-count-to/components/uv-count-to/props.js @@ -0,0 +1,60 @@ +export default { + props: { + // 开始的数值,默认从0增长到某一个数 + startVal: { + type: [String, Number], + default: 0 + }, + // 要滚动的目标数值,必须 + endVal: { + type: [String, Number], + default: 0 + }, + // 滚动到目标数值的动画持续时间,单位为毫秒(ms) + duration: { + type: [String, Number], + default: 2000 + }, + // 设置数值后是否自动开始滚动 + autoplay: { + type: Boolean, + default: true + }, + // 要显示的小数位数 + decimals: { + type: [String, Number], + default: 0 + }, + // 是否在即将到达目标数值的时候,使用缓慢滚动的效果 + useEasing: { + type: Boolean, + default: true + }, + // 十进制分割 + decimal: { + type: [String, Number], + default: '.' + }, + // 字体颜色 + color: { + type: String, + default: '#606266' + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 22 + }, + // 是否加粗字体 + bold: { + type: Boolean, + default: false + }, + // 千位分隔符,类似金额的分割(¥23,321.05中的",") + separator: { + type: String, + default: '' + }, + ...uni.$uv?.props?.countTo + } +} \ No newline at end of file diff --git a/uni_modules/uv-count-to/components/uv-count-to/uv-count-to.vue b/uni_modules/uv-count-to/components/uv-count-to/uv-count-to.vue new file mode 100644 index 0000000..5f34167 --- /dev/null +++ b/uni_modules/uv-count-to/components/uv-count-to/uv-count-to.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/uni_modules/uv-count-to/package.json b/uni_modules/uv-count-to/package.json new file mode 100644 index 0000000..1ed07dc --- /dev/null +++ b/uni_modules/uv-count-to/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-count-to", + "displayName": "uv-count-to 数字滚动 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.4", + "description": "该数字滚动组件一般用于需要滚动数字到某一个值的场景,目标要求是一个递增的值,一种数字上升的视觉冲击效果。", + "keywords": [ + "countTo", + "uvui", + "uv-ui", + "数字滚动", + "数字变化" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-count-to/readme.md b/uni_modules/uv-count-to/readme.md new file mode 100644 index 0000000..5d5f996 --- /dev/null +++ b/uni_modules/uv-count-to/readme.md @@ -0,0 +1,11 @@ +## CountTo 数字滚动 + +> **组件名:uv-count-to** + +该组件一般用于需要滚动数字到某一个值的场景,目标要求是一个递增的值。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-datetime-picker/changelog.md b/uni_modules/uv-datetime-picker/changelog.md new file mode 100644 index 0000000..c56eabd --- /dev/null +++ b/uni_modules/uv-datetime-picker/changelog.md @@ -0,0 +1,34 @@ +## 1.0.15(2024-06-14) +1. 修复上次更改引出的BUG +## 1.0.14(2024-05-31) +1. 修复设置maxDate后存在选择不准确的BUG +## 1.0.13(2024-03-22) +1. 修复VUE3中出现的BUG +## 1.0.12(2023-11-27) +1. 增加round圆角属性 +## 1.0.11(2023-10-11) +1. 修复设置minDate出现选择错乱的BUG +## 1.0.10(2023-09-01) +1. 增加clearDate参数,是否清除上次选择,默认false +## 1.0.9(2023-08-31) +1. 增加mode="year",方便只选择年 +## 1.0.8(2023-07-17) +1. 优化文档 +2. 优化其他 +## 1.0.7(2023-07-13) +1. 修复 uv-datetime-picker 设置value属性不生效的BUG +## 1.0.6(2023-07-05) +修复vue3模式下,动态修改v-model绑定的值无效的BUG +## 1.0.5(2023-07-02) +uv-datetime-picker 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/datetimePicker.html +## 1.0.4(2023-06-29) +1. 修复抖音小程序报错的BUG +## 1.0.3(2023-06-07) +1. 取消defaultIndex参数,传该值没实际意义,后续更新文档 +## 1.0.2(2023-06-02) +1. 修复v-model重新赋值不更新的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-datetime-picker 时间选择器 diff --git a/uni_modules/uv-datetime-picker/components/uv-datetime-picker/props.js b/uni_modules/uv-datetime-picker/components/uv-datetime-picker/props.js new file mode 100644 index 0000000..6031d84 --- /dev/null +++ b/uni_modules/uv-datetime-picker/components/uv-datetime-picker/props.js @@ -0,0 +1,130 @@ +export default { + props: { + value: { + type: [String, Number], + default: '' + }, + modelValue: { + type: [String, Number], + default: '' + }, + // 是否打开组件 + show: { + type: Boolean, + default: false + }, + // 是否展示顶部的操作栏 + showToolbar: { + type: Boolean, + default: true + }, + // 顶部标题 + title: { + type: String, + default: '' + }, + // 展示格式,mode=date为日期选择,mode=time为时间选择,mode=year-month为年月选择,mode=datetime为日期时间选择 + mode: { + type: String, + default: 'datetime' + }, + // 可选的最大时间 + maxDate: { + type: Number, + // 最大默认值为后10年 + default: new Date(new Date().getFullYear() + 10, 0, 1).getTime() + }, + // 可选的最小时间 + minDate: { + type: Number, + // 最小默认值为前10年 + default: new Date(new Date().getFullYear() - 10, 0, 1).getTime() + }, + // 可选的最小小时,仅mode=time有效 + minHour: { + type: Number, + default: 0 + }, + // 可选的最大小时,仅mode=time有效 + maxHour: { + type: Number, + default: 23 + }, + // 可选的最小分钟,仅mode=time有效 + minMinute: { + type: Number, + default: 0 + }, + // 可选的最大分钟,仅mode=time有效 + maxMinute: { + type: Number, + default: 59 + }, + // 选项过滤函数 + filter: { + type: [Function, null], + default: null + }, + // 选项格式化函数 + formatter: { + type: [Function, null], + default: null + }, + // 是否显示加载中状态 + loading: { + type: Boolean, + default: false + }, + // 各列中,单个选项的高度 + itemHeight: { + type: [String, Number], + default: 44 + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: '取消' + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: '确认' + }, + // 取消按钮的颜色 + cancelColor: { + type: String, + default: '#909193' + }, + // 确认按钮的颜色 + confirmColor: { + type: String, + default: '#3c9cff' + }, + // 每列中可见选项的数量 + visibleItemCount: { + type: [String, Number], + default: 5 + }, + // 是否允许点击遮罩关闭选择器 + closeOnClickOverlay: { + type: Boolean, + default: true + }, + // 是否允许点击确认关闭选择器 + closeOnClickConfirm: { + type: Boolean, + default: true + }, + // 是否清空上次选择内容 + clearDate: { + type: Boolean, + default: false + }, + // 圆角 + round: { + type: [String, Number], + default: 0 + }, + ...uni.$uv?.props?.datetimePicker + } +} \ No newline at end of file diff --git a/uni_modules/uv-datetime-picker/components/uv-datetime-picker/uv-datetime-picker.vue b/uni_modules/uv-datetime-picker/components/uv-datetime-picker/uv-datetime-picker.vue new file mode 100644 index 0000000..d45c822 --- /dev/null +++ b/uni_modules/uv-datetime-picker/components/uv-datetime-picker/uv-datetime-picker.vue @@ -0,0 +1,360 @@ + + \ No newline at end of file diff --git a/uni_modules/uv-datetime-picker/package.json b/uni_modules/uv-datetime-picker/package.json new file mode 100644 index 0000000..a2415b1 --- /dev/null +++ b/uni_modules/uv-datetime-picker/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-datetime-picker", + "displayName": "uv-datetime-picker 时间选择器 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.15", + "description": "时间选择器组件用于时间日期,主要用于年月日时分的选择,具体选择的精确度由参数控制。", + "keywords": [ + "datetime-picker", + "uvui", + "uv-ui", + "datetime", + "时间选择" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-picker" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-datetime-picker/readme.md b/uni_modules/uv-datetime-picker/readme.md new file mode 100644 index 0000000..0db9d9c --- /dev/null +++ b/uni_modules/uv-datetime-picker/readme.md @@ -0,0 +1,19 @@ +## DatetimePicker 时间选择器 + +> **组件名:uv-datetime-picker** + +此选择器用于时间日期,主要用于年月日时分的选择,具体选择的精确度由参数控制。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-divider/changelog.md b/uni_modules/uv-divider/changelog.md new file mode 100644 index 0000000..9ff8c52 --- /dev/null +++ b/uni_modules/uv-divider/changelog.md @@ -0,0 +1,11 @@ +## 1.0.4(2023-12-06) +1. 优化 +## 1.0.3(2023-12-06) +1. 阻止事件冒泡问题 +## 1.0.2(2023-06-01) +1. 修复点击触发两次事件的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-divider 分割线 diff --git a/uni_modules/uv-divider/components/uv-divider/props.js b/uni_modules/uv-divider/components/uv-divider/props.js new file mode 100644 index 0000000..7b97c2c --- /dev/null +++ b/uni_modules/uv-divider/components/uv-divider/props.js @@ -0,0 +1,45 @@ +export default { + props: { + // 是否虚线 + dashed: { + type: Boolean, + default: false + }, + // 是否细线 + hairline: { + type: Boolean, + default: true + }, + // 是否以点替代文字,优先于text字段起作用 + dot: { + type: Boolean, + default: false + }, + // 内容文本的位置,left-左边,center-中间,right-右边 + textPosition: { + type: String, + default: 'center' + }, + // 文本内容 + text: { + type: [String, Number], + default: '' + }, + // 文本大小 + textSize: { + type: [String, Number], + default: 14 + }, + // 文本颜色 + textColor: { + type: String, + default: '#909399' + }, + // 线条颜色 + lineColor: { + type: String, + default: '#dcdfe6' + }, + ...uni.$uv?.props?.divider + } +} \ No newline at end of file diff --git a/uni_modules/uv-divider/components/uv-divider/uv-divider.vue b/uni_modules/uv-divider/components/uv-divider/uv-divider.vue new file mode 100644 index 0000000..ba0dfa7 --- /dev/null +++ b/uni_modules/uv-divider/components/uv-divider/uv-divider.vue @@ -0,0 +1,113 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-divider/package.json b/uni_modules/uv-divider/package.json new file mode 100644 index 0000000..a54b458 --- /dev/null +++ b/uni_modules/uv-divider/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-divider", + "displayName": "uv-divider 分割线 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.4", + "description": "区隔内容的分割线,一般用于页面底部没有更多的提示。", + "keywords": [ + "divider", + "uvui", + "uv-ui", + "分割线", + "没有更多" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-line" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-divider/readme.md b/uni_modules/uv-divider/readme.md new file mode 100644 index 0000000..2384cba --- /dev/null +++ b/uni_modules/uv-divider/readme.md @@ -0,0 +1,11 @@ +## Divider 分割线 + +> **组件名:uv-divider** + +区隔内容的分割线,一般用于页面底部"没有更多"的提示。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-drop-down/changelog.md b/uni_modules/uv-drop-down/changelog.md new file mode 100644 index 0000000..637c605 --- /dev/null +++ b/uni_modules/uv-drop-down/changelog.md @@ -0,0 +1,13 @@ +## 1.0.5(2024-01-02) +1. 修复parentData不变的BUG +## 1.0.4(2023-09-28) +1. 增加uv-sticky依赖 +## 1.0.3(2023-08-29) +1. 修复自定义内容,点击自定义内容时会自动关闭弹窗的问题 +## 1.0.2(2023-08-22) +1. 优化 +## 1.0.1(2023-08-22) +1. 增加@change回调,返回弹窗关闭状态 +2. 增加init方法,方便位置改变进行调整 +## 1.0.0(2023-07-30) +新增uv-drop-down 下拉筛选组件 diff --git a/uni_modules/uv-drop-down/components/uv-drop-down-item/uv-drop-down-item.vue b/uni_modules/uv-drop-down/components/uv-drop-down-item/uv-drop-down-item.vue new file mode 100644 index 0000000..9438a57 --- /dev/null +++ b/uni_modules/uv-drop-down/components/uv-drop-down-item/uv-drop-down-item.vue @@ -0,0 +1,169 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-drop-down/components/uv-drop-down-popup/uv-drop-down-popup.vue b/uni_modules/uv-drop-down/components/uv-drop-down-popup/uv-drop-down-popup.vue new file mode 100644 index 0000000..6a1efc8 --- /dev/null +++ b/uni_modules/uv-drop-down/components/uv-drop-down-popup/uv-drop-down-popup.vue @@ -0,0 +1,242 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-drop-down/components/uv-drop-down/uv-drop-down.vue b/uni_modules/uv-drop-down/components/uv-drop-down/uv-drop-down.vue new file mode 100644 index 0000000..9978b40 --- /dev/null +++ b/uni_modules/uv-drop-down/components/uv-drop-down/uv-drop-down.vue @@ -0,0 +1,135 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-drop-down/package.json b/uni_modules/uv-drop-down/package.json new file mode 100644 index 0000000..f4ad683 --- /dev/null +++ b/uni_modules/uv-drop-down/package.json @@ -0,0 +1,91 @@ +{ + "id": "uv-drop-down", + "displayName": "uv-drop-down 下拉筛选 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.5", + "description": "该组件主要提供筛选下拉筛选框,内置基础筛选功能,可以根据自己的需求自定义筛选项", + "keywords": [ + "uv-drop-down", + "uvui", + "uv-ui", + "下拉筛选", + "筛选" + ], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-text", + "uv-transition", + "uv-sticky" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-drop-down/readme.md b/uni_modules/uv-drop-down/readme.md new file mode 100644 index 0000000..31cbd24 --- /dev/null +++ b/uni_modules/uv-drop-down/readme.md @@ -0,0 +1,23 @@ +## DropDown 下拉筛选 + +> **组件名:uv-drop-down** + +该组件主要提供筛选下拉筛选框,内置基础筛选功能,可以根据自己的需求自定义筛选项。 + +为了兼容app-nvue,需要内置三个组件进行配合使用,uv-drop-down属于菜单项(其实还包括子组件uv-drop-down-item),uv-drop-down-popup属于筛选框。 + +只需要做简单的约定式配置,即可使用该功能,兼容性良好,已经在多端进行了多次测试。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-empty/changelog.md b/uni_modules/uv-empty/changelog.md new file mode 100644 index 0000000..a1cc2ad --- /dev/null +++ b/uni_modules/uv-empty/changelog.md @@ -0,0 +1,13 @@ +## 1.0.5(2023-12-20) +1. 优化 +## 1.0.4(2023-08-04) +1. icon支持base64图片 +## 1.0.3(2023-07-17) +1. 修复 uv-empty 恢复设置mode属性的内置图标 +## 1.0.2(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-empty 内容为空 diff --git a/uni_modules/uv-empty/components/uv-empty/props.js b/uni_modules/uv-empty/components/uv-empty/props.js new file mode 100644 index 0000000..26c282d --- /dev/null +++ b/uni_modules/uv-empty/components/uv-empty/props.js @@ -0,0 +1,60 @@ +export default { + props: { + // 内置图标名称,或图片路径,建议绝对路径 + icon: { + type: String, + default: '' + }, + // 提示文字 + text: { + type: String, + default: '' + }, + // 文字颜色 + textColor: { + type: String, + default: '#c0c4cc' + }, + // 文字大小 + textSize: { + type: [String, Number], + default: 14 + }, + // 图标的颜色 + iconColor: { + type: String, + default: '#c0c4cc' + }, + // 图标的大小 + iconSize: { + type: [String, Number], + default: 90 + }, + // 选择预置的图标类型 + mode: { + type: String, + default: 'data' + }, + // 图标宽度,单位px + width: { + type: [String, Number], + default: 160 + }, + // 图标高度,单位px + height: { + type: [String, Number], + default: 160 + }, + // 是否显示组件 + show: { + type: Boolean, + default: true + }, + // 组件距离上一个元素之间的距离,默认px单位 + marginTop: { + type: [String, Number], + default: 0 + }, + ...uni.$uv?.props?.empty + } +} \ No newline at end of file diff --git a/uni_modules/uv-empty/components/uv-empty/uv-empty.vue b/uni_modules/uv-empty/components/uv-empty/uv-empty.vue new file mode 100644 index 0000000..22a9264 --- /dev/null +++ b/uni_modules/uv-empty/components/uv-empty/uv-empty.vue @@ -0,0 +1,126 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-empty/package.json b/uni_modules/uv-empty/package.json new file mode 100644 index 0000000..e10f451 --- /dev/null +++ b/uni_modules/uv-empty/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-empty", + "displayName": "uv-empty 内容为空 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.5", + "description": "该组件用于需要加载内容,但是加载的第一页数据就为空,提示一个 没有内容 的场景, 我们精心挑选了十几个场景的图标,方便您使用。", + "keywords": [ + "empty", + "uvui", + "uv-ui", + "空数据", + "暂无数据" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-empty/readme.md b/uni_modules/uv-empty/readme.md new file mode 100644 index 0000000..ecef14d --- /dev/null +++ b/uni_modules/uv-empty/readme.md @@ -0,0 +1,19 @@ +## Empty 内容为空 + +> **组件名:uv-empty** + +该组件用于需要加载内容,但是加载的第一页数据就为空,提示一个"没有内容"的场景, 我们精心挑选了十几个场景的图标,方便您使用。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-form/changelog.md b/uni_modules/uv-form/changelog.md new file mode 100644 index 0000000..b229bca --- /dev/null +++ b/uni_modules/uv-form/changelog.md @@ -0,0 +1,23 @@ +## 1.0.9(2023-08-14) +1. 修复设置labelWidth属性时,节点渲染有闪动的BUG +## 1.0.8(2023-08-13) +1. 修复未设置rules的情况下报错的BUG +2. 优化错误提示 +## 1.0.7(2023-08-10) +1. 修复在vue3+setup语法糖中错误文字动画错乱 +## 1.0.6(2023-07-17) +1. 优化文档 +2. 优化其他 +## 1.0.5(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.4(2023-07-02) +uv-form 由于弹出层uv-transition的修改,组件内部做了相应的修改,参数不变。 +## 1.0.3(2023-06-18) +1. 修改某些情况下的BUG +## 1.0.2(2023-06-15) +1. 修复支付宝报错的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-form 表单 diff --git a/uni_modules/uv-form/components/uv-form-item/props.js b/uni_modules/uv-form/components/uv-form-item/props.js new file mode 100644 index 0000000..00a26bc --- /dev/null +++ b/uni_modules/uv-form/components/uv-form-item/props.js @@ -0,0 +1,49 @@ +export default { + props: { + // input的label提示语 + label: { + type: String, + default: '' + }, + // 绑定的值 + prop: { + type: String, + default: '' + }, + // 是否显示表单域的下划线边框 + borderBottom: { + type: [Boolean], + default: false + }, + // label的位置,left-左边,top-上边 + labelPosition: { + type: String, + default: '' + }, + // label的宽度,单位px + labelWidth: { + type: [String, Number], + default: '' + }, + // 右侧图标 + rightIcon: { + type: String, + default: '' + }, + // 左侧图标 + leftIcon: { + type: String, + default: '' + }, + // 是否显示左边的必填星号,只作显示用,具体校验必填的逻辑,请在rules中配置 + required: { + type: Boolean, + default: false + }, + leftIconStyle: { + type: [String, Object], + default: '' + }, + ...uni.$uv?.props?.formItem + } +} \ No newline at end of file diff --git a/uni_modules/uv-form/components/uv-form-item/uv-form-item.vue b/uni_modules/uv-form/components/uv-form-item/uv-form-item.vue new file mode 100644 index 0000000..25d93ea --- /dev/null +++ b/uni_modules/uv-form/components/uv-form-item/uv-form-item.vue @@ -0,0 +1,226 @@ + + + + \ No newline at end of file diff --git a/uni_modules/uv-form/components/uv-form/props.js b/uni_modules/uv-form/components/uv-form/props.js new file mode 100644 index 0000000..6cffb95 --- /dev/null +++ b/uni_modules/uv-form/components/uv-form/props.js @@ -0,0 +1,46 @@ +export default { + props: { + // 当前form的需要验证字段的集合 + model: { + type: Object, + default: () => ({}) + }, + // 验证规则 + rules: { + type: [Object, Function, Array], + default: () => ({}) + }, + // 有错误时的提示方式,message-提示信息,toast-进行toast提示 + // border-bottom-下边框呈现红色,none-无提示 + errorType: { + type: String, + default: 'message' + }, + // 是否显示表单域的下划线边框 + borderBottom: { + type: Boolean, + default: true + }, + // label的位置,left-左边,top-上边 + labelPosition: { + type: String, + default: 'left' + }, + // label的宽度,单位px + labelWidth: { + type: [String, Number], + default: 45 + }, + // lable字体的对齐方式 + labelAlign: { + type: String, + default: 'left' + }, + // lable的样式,对象形式 + labelStyle: { + type: Object, + default: () => ({}) + }, + ...uni.$uv?.props?.form + } +} \ No newline at end of file diff --git a/uni_modules/uv-form/components/uv-form/uv-form.vue b/uni_modules/uv-form/components/uv-form/uv-form.vue new file mode 100644 index 0000000..bc0876f --- /dev/null +++ b/uni_modules/uv-form/components/uv-form/uv-form.vue @@ -0,0 +1,209 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-form/components/uv-form/valid.js b/uni_modules/uv-form/components/uv-form/valid.js new file mode 100644 index 0000000..9e114df --- /dev/null +++ b/uni_modules/uv-form/components/uv-form/valid.js @@ -0,0 +1,1343 @@ +function _extends() { + _extends = Object.assign || function (target) { + for (let i = 1; i < arguments.length; i++) { + const source = arguments[i] + + for (const key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key] + } + } + } + + return target + } + + return _extends.apply(this, arguments) +} + +/* eslint no-console:0 */ +const formatRegExp = /%[sdj%]/g +let warning = function warning() {} // don't print warning message when in production env or node runtime + +if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window + !== 'undefined' && typeof document !== 'undefined') { + warning = function warning(type, errors) { + if (typeof console !== 'undefined' && console.warn) { + if (errors.every((e) => typeof e === 'string')) { + console.warn(type, errors) + } + } + } +} + +function convertFieldsError(errors) { + if (!errors || !errors.length) return null + const fields = {} + errors.forEach((error) => { + const { field } = error + fields[field] = fields[field] || [] + fields[field].push(error) + }) + return fields +} + +function format() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key] + } + + let i = 1 + const f = args[0] + const len = args.length + + if (typeof f === 'function') { + return f.apply(null, args.slice(1)) + } + + if (typeof f === 'string') { + let str = String(f).replace(formatRegExp, (x) => { + if (x === '%%') { + return '%' + } + + if (i >= len) { + return x + } + + switch (x) { + case '%s': + return String(args[i++]) + + case '%d': + return Number(args[i++]) + + case '%j': + try { + return JSON.stringify(args[i++]) + } catch (_) { + return '[Circular]' + } + + break + + default: + return x + } + }) + + for (let arg = args[i]; i < len; arg = args[++i]) { + str += ` ${arg}` + } + + return str + } + + return f +} + +function isNativeStringType(type) { + return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern' +} + +function isEmptyValue(value, type) { + if (value === undefined || value === null) { + return true + } + + if (type === 'array' && Array.isArray(value) && !value.length) { + return true + } + + if (isNativeStringType(type) && typeof value === 'string' && !value) { + return true + } + + return false +} + +function asyncParallelArray(arr, func, callback) { + const results = [] + let total = 0 + const arrLength = arr.length + + function count(errors) { + results.push.apply(results, errors) + total++ + + if (total === arrLength) { + callback(results) + } + } + + arr.forEach((a) => { + func(a, count) + }) +} + +function asyncSerialArray(arr, func, callback) { + let index = 0 + const arrLength = arr.length + + function next(errors) { + if (errors && errors.length) { + callback(errors) + return + } + + const original = index + index += 1 + + if (original < arrLength) { + func(arr[original], next) + } else { + callback([]) + } + } + + next([]) +} + +function flattenObjArr(objArr) { + const ret = [] + Object.keys(objArr).forEach((k) => { + ret.push.apply(ret, objArr[k]) + }) + return ret +} + +function asyncMap(objArr, option, func, callback) { + if (option.first) { + const _pending = new Promise((resolve, reject) => { + const next = function next(errors) { + callback(errors) + return errors.length ? reject({ + errors, + fields: convertFieldsError(errors) + }) : resolve() + } + + const flattenArr = flattenObjArr(objArr) + asyncSerialArray(flattenArr, func, next) + }) + + _pending.catch((e) => e) + + return _pending + } + + let firstFields = option.firstFields || [] + + if (firstFields === true) { + firstFields = Object.keys(objArr) + } + + const objArrKeys = Object.keys(objArr) + const objArrLength = objArrKeys.length + let total = 0 + const results = [] + const pending = new Promise((resolve, reject) => { + const next = function next(errors) { + results.push.apply(results, errors) + total++ + + if (total === objArrLength) { + callback(results) + return results.length ? reject({ + errors: results, + fields: convertFieldsError(results) + }) : resolve() + } + } + + if (!objArrKeys.length) { + callback(results) + resolve() + } + + objArrKeys.forEach((key) => { + const arr = objArr[key] + + if (firstFields.indexOf(key) !== -1) { + asyncSerialArray(arr, func, next) + } else { + asyncParallelArray(arr, func, next) + } + }) + }) + pending.catch((e) => e) + return pending +} + +function complementError(rule) { + return function (oe) { + if (oe && oe.message) { + oe.field = oe.field || rule.fullField + return oe + } + + return { + message: typeof oe === 'function' ? oe() : oe, + field: oe.field || rule.fullField + } + } +} + +function deepMerge(target, source) { + if (source) { + for (const s in source) { + if (source.hasOwnProperty(s)) { + const value = source[s] + + if (typeof value === 'object' && typeof target[s] === 'object') { + target[s] = { ...target[s], ...value } + } else { + target[s] = value + } + } + } + } + + return target +} + +/** + * Rule for validating required fields. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function required(rule, value, source, errors, options, type) { + if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) { + errors.push(format(options.messages.required, rule.fullField)) + } +} + +/** + * Rule for validating whitespace. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function whitespace(rule, value, source, errors, options) { + if (/^\s+$/.test(value) || value === '') { + errors.push(format(options.messages.whitespace, rule.fullField)) + } +} + +/* eslint max-len:0 */ + +const pattern = { + // http://emailregex.com/ + email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, + url: new RegExp( + '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$', + 'i' + ), + hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i +} +var types = { + integer: function integer(value) { + return /^(-)?\d+$/.test(value); + }, + float: function float(value) { + return /^(-)?\d+(\.\d+)?$/.test(value); + }, + array: function array(value) { + return Array.isArray(value) + }, + regexp: function regexp(value) { + if (value instanceof RegExp) { + return true + } + + try { + return !!new RegExp(value) + } catch (e) { + return false + } + }, + date: function date(value) { + return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear + === 'function' + }, + number: function number(value) { + if (isNaN(value)) { + return false + } + + // 修改源码,将字符串数值先转为数值 + return typeof +value === 'number' + }, + object: function object(value) { + return typeof value === 'object' && !types.array(value) + }, + method: function method(value) { + return typeof value === 'function' + }, + email: function email(value) { + return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255 + }, + url: function url(value) { + return typeof value === 'string' && !!value.match(pattern.url) + }, + hex: function hex(value) { + return typeof value === 'string' && !!value.match(pattern.hex) + } +} +/** + * Rule for validating the type of a value. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function type(rule, value, source, errors, options) { + if (rule.required && value === undefined) { + required(rule, value, source, errors, options) + return + } + + const custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'] + const ruleType = rule.type + + if (custom.indexOf(ruleType) > -1) { + if (!types[ruleType](value)) { + errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)) + } // straight typeof check + } else if (ruleType && typeof value !== rule.type) { + errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)) + } +} + +/** + * Rule for validating minimum and maximum allowed values. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function range(rule, value, source, errors, options) { + const len = typeof rule.len === 'number' + const min = typeof rule.min === 'number' + const max = typeof rule.max === 'number' // 正则匹配码点范围从U+010000一直到U+10FFFF的文字(补充平面Supplementary Plane) + + const spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g + let val = value + let key = null + const num = typeof value === 'number' + const str = typeof value === 'string' + const arr = Array.isArray(value) + + if (num) { + key = 'number' + } else if (str) { + key = 'string' + } else if (arr) { + key = 'array' + } // if the value is not of a supported type for range validation + // the validation rule rule should use the + // type property to also test for a particular type + + if (!key) { + return false + } + + if (arr) { + val = value.length + } + + if (str) { + // 处理码点大于U+010000的文字length属性不准确的bug,如"𠮷𠮷𠮷".lenght !== 3 + val = value.replace(spRegexp, '_').length + } + + if (len) { + if (val !== rule.len) { + errors.push(format(options.messages[key].len, rule.fullField, rule.len)) + } + } else if (min && !max && val < rule.min) { + errors.push(format(options.messages[key].min, rule.fullField, rule.min)) + } else if (max && !min && val > rule.max) { + errors.push(format(options.messages[key].max, rule.fullField, rule.max)) + } else if (min && max && (val < rule.min || val > rule.max)) { + errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max)) + } +} + +const ENUM = 'enum' +/** + * Rule for validating a value exists in an enumerable list. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function enumerable(rule, value, source, errors, options) { + rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : [] + + if (rule[ENUM].indexOf(value) === -1) { + errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', '))) + } +} + +/** + * Rule for validating a regular expression pattern. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function pattern$1(rule, value, source, errors, options) { + if (rule.pattern) { + if (rule.pattern instanceof RegExp) { + // if a RegExp instance is passed, reset `lastIndex` in case its `global` + // flag is accidentally set to `true`, which in a validation scenario + // is not necessary and the result might be misleading + rule.pattern.lastIndex = 0 + + if (!rule.pattern.test(value)) { + errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern)) + } + } else if (typeof rule.pattern === 'string') { + const _pattern = new RegExp(rule.pattern) + + if (!_pattern.test(value)) { + errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern)) + } + } + } +} + +const rules = { + required, + whitespace, + type, + range, + enum: enumerable, + pattern: pattern$1 +} + +/** + * Performs validation for string types. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function string(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, 'string') && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options, 'string') + + if (!isEmptyValue(value, 'string')) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + rules.pattern(rule, value, source, errors, options) + + if (rule.whitespace === true) { + rules.whitespace(rule, value, source, errors, options) + } + } + } + + callback(errors) +} + +/** + * Validates a function. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function method(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a number. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function number(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (value === '') { + value = undefined + } + + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a boolean. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function _boolean(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates the regular expression type. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function regexp(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (!isEmptyValue(value)) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a number is an integer. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function integer(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a number is a floating point number. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function floatFn(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates an array. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function array(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, 'array') && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options, 'array') + + if (!isEmptyValue(value, 'array')) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates an object. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function object(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +const ENUM$1 = 'enum' +/** + * Validates an enumerable list. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function enumerable$1(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules[ENUM$1](rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a regular expression pattern. + * + * Performs validation when a rule only contains + * a pattern property but is not declared as a string type. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function pattern$2(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, 'string') && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (!isEmptyValue(value, 'string')) { + rules.pattern(rule, value, source, errors, options) + } + } + + callback(errors) +} + +function date(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (!isEmptyValue(value)) { + let dateObject + + if (typeof value === 'number') { + dateObject = new Date(value) + } else { + dateObject = value + } + + rules.type(rule, dateObject, source, errors, options) + + if (dateObject) { + rules.range(rule, dateObject.getTime(), source, errors, options) + } + } + } + + callback(errors) +} + +function required$1(rule, value, callback, source, options) { + const errors = [] + const type = Array.isArray(value) ? 'array' : typeof value + rules.required(rule, value, source, errors, options, type) + callback(errors) +} + +function type$1(rule, value, callback, source, options) { + const ruleType = rule.type + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, ruleType) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options, ruleType) + + if (!isEmptyValue(value, ruleType)) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Performs validation for any type. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function any(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + } + + callback(errors) +} + +const validators = { + string, + method, + number, + boolean: _boolean, + regexp, + integer, + float: floatFn, + array, + object, + enum: enumerable$1, + pattern: pattern$2, + date, + url: type$1, + hex: type$1, + email: type$1, + required: required$1, + any +} + +function newMessages() { + return { + default: 'Validation error on field %s', + required: '%s is required', + enum: '%s must be one of %s', + whitespace: '%s cannot be empty', + date: { + format: '%s date %s is invalid for format %s', + parse: '%s date could not be parsed, %s is invalid ', + invalid: '%s date %s is invalid' + }, + types: { + string: '%s is not a %s', + method: '%s is not a %s (function)', + array: '%s is not an %s', + object: '%s is not an %s', + number: '%s is not a %s', + date: '%s is not a %s', + boolean: '%s is not a %s', + integer: '%s is not an %s', + float: '%s is not a %s', + regexp: '%s is not a valid %s', + email: '%s is not a valid %s', + url: '%s is not a valid %s', + hex: '%s is not a valid %s' + }, + string: { + len: '%s must be exactly %s characters', + min: '%s must be at least %s characters', + max: '%s cannot be longer than %s characters', + range: '%s must be between %s and %s characters' + }, + number: { + len: '%s must equal %s', + min: '%s cannot be less than %s', + max: '%s cannot be greater than %s', + range: '%s must be between %s and %s' + }, + array: { + len: '%s must be exactly %s in length', + min: '%s cannot be less than %s in length', + max: '%s cannot be greater than %s in length', + range: '%s must be between %s and %s in length' + }, + pattern: { + mismatch: '%s value %s does not match pattern %s' + }, + clone: function clone() { + const cloned = JSON.parse(JSON.stringify(this)) + cloned.clone = this.clone + return cloned + } + } +} +const messages = newMessages() + +/** + * Encapsulates a validation schema. + * + * @param descriptor An object declaring validation rules + * for this schema. + */ + +function Schema(descriptor) { + this.rules = null + this._messages = messages + this.define(descriptor) +} + +Schema.prototype = { + messages: function messages(_messages) { + if (_messages) { + this._messages = deepMerge(newMessages(), _messages) + } + + return this._messages + }, + define: function define(rules) { + if (!rules) { + throw new Error('Cannot configure a schema with no rules') + } + + if (typeof rules !== 'object' || Array.isArray(rules)) { + throw new Error('Rules must be an object') + } + + this.rules = {} + let z + let item + + for (z in rules) { + if (rules.hasOwnProperty(z)) { + item = rules[z] + this.rules[z] = Array.isArray(item) ? item : [item] + } + } + }, + validate: function validate(source_, o, oc) { + const _this = this + + if (o === void 0) { + o = {} + } + + if (oc === void 0) { + oc = function oc() {} + } + + let source = source_ + let options = o + let callback = oc + + if (typeof options === 'function') { + callback = options + options = {} + } + + if (!this.rules || Object.keys(this.rules).length === 0) { + if (callback) { + callback() + } + + return Promise.resolve() + } + + function complete(results) { + let i + let errors = [] + let fields = {} + + function add(e) { + if (Array.isArray(e)) { + let _errors + + errors = (_errors = errors).concat.apply(_errors, e) + } else { + errors.push(e) + } + } + + for (i = 0; i < results.length; i++) { + add(results[i]) + } + + if (!errors.length) { + errors = null + fields = null + } else { + fields = convertFieldsError(errors) + } + + callback(errors, fields) + } + + if (options.messages) { + let messages$1 = this.messages() + + if (messages$1 === messages) { + messages$1 = newMessages() + } + + deepMerge(messages$1, options.messages) + options.messages = messages$1 + } else { + options.messages = this.messages() + } + + let arr + let value + const series = {} + const keys = options.keys || Object.keys(this.rules) + keys.forEach((z) => { + arr = _this.rules[z] + value = source[z] + arr.forEach((r) => { + let rule = r + + if (typeof rule.transform === 'function') { + if (source === source_) { + source = { ...source } + } + + value = source[z] = rule.transform(value) + } + + if (typeof rule === 'function') { + rule = { + validator: rule + } + } else { + rule = { ...rule } + } + + rule.validator = _this.getValidationMethod(rule) + rule.field = z + rule.fullField = rule.fullField || z + rule.type = _this.getType(rule) + + if (!rule.validator) { + return + } + + series[z] = series[z] || [] + series[z].push({ + rule, + value, + source, + field: z + }) + }) + }) + const errorFields = {} + return asyncMap(series, options, (data, doIt) => { + const { rule } = data + let deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField + === 'object') + deep = deep && (rule.required || !rule.required && data.value) + rule.field = data.field + + function addFullfield(key, schema) { + return { ...schema, fullField: `${rule.fullField}.${key}` } + } + + function cb(e) { + if (e === void 0) { + e = [] + } + + let errors = e + + if (!Array.isArray(errors)) { + errors = [errors] + } + + if (!options.suppressWarning && errors.length) { + Schema.warning('async-validator:', errors) + } + + if (errors.length && rule.message) { + errors = [].concat(rule.message) + } + + errors = errors.map(complementError(rule)) + + if (options.first && errors.length) { + errorFields[rule.field] = 1 + return doIt(errors) + } + + if (!deep) { + doIt(errors) + } else { + // if rule is required but the target object + // does not exist fail at the rule level and don't + // go deeper + if (rule.required && !data.value) { + if (rule.message) { + errors = [].concat(rule.message).map(complementError(rule)) + } else if (options.error) { + errors = [options.error(rule, format(options.messages.required, rule.field))] + } else { + errors = [] + } + + return doIt(errors) + } + + let fieldsSchema = {} + + if (rule.defaultField) { + for (const k in data.value) { + if (data.value.hasOwnProperty(k)) { + fieldsSchema[k] = rule.defaultField + } + } + } + + fieldsSchema = { ...fieldsSchema, ...data.rule.fields } + + for (const f in fieldsSchema) { + if (fieldsSchema.hasOwnProperty(f)) { + const fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]] + fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f)) + } + } + + const schema = new Schema(fieldsSchema) + schema.messages(options.messages) + + if (data.rule.options) { + data.rule.options.messages = options.messages + data.rule.options.error = options.error + } + + schema.validate(data.value, data.rule.options || options, (errs) => { + const finalErrors = [] + + if (errors && errors.length) { + finalErrors.push.apply(finalErrors, errors) + } + + if (errs && errs.length) { + finalErrors.push.apply(finalErrors, errs) + } + + doIt(finalErrors.length ? finalErrors : null) + }) + } + } + + let res + + if (rule.asyncValidator) { + res = rule.asyncValidator(rule, data.value, cb, data.source, options) + } else if (rule.validator) { + res = rule.validator(rule, data.value, cb, data.source, options) + + if (res === true) { + cb() + } else if (res === false) { + cb(rule.message || `${rule.field} fails`) + } else if (res instanceof Array) { + cb(res) + } else if (res instanceof Error) { + cb(res.message) + } + } + + if (res && res.then) { + res.then(() => cb(), (e) => cb(e)) + } + }, (results) => { + complete(results) + }) + }, + getType: function getType(rule) { + if (rule.type === undefined && rule.pattern instanceof RegExp) { + rule.type = 'pattern' + } + + if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) { + throw new Error(format('Unknown rule type %s', rule.type)) + } + + return rule.type || 'string' + }, + getValidationMethod: function getValidationMethod(rule) { + if (typeof rule.validator === 'function') { + return rule.validator + } + + const keys = Object.keys(rule) + const messageIndex = keys.indexOf('message') + + if (messageIndex !== -1) { + keys.splice(messageIndex, 1) + } + + if (keys.length === 1 && keys[0] === 'required') { + return validators.required + } + + return validators[this.getType(rule)] || false + } +} + +Schema.register = function register(type, validator) { + if (typeof validator !== 'function') { + throw new Error('Cannot register a validator by type, validator is not a function') + } + + validators[type] = validator +} + +Schema.warning = warning +Schema.messages = messages + +export default Schema +// # sourceMappingURL=index.js.map diff --git a/uni_modules/uv-form/package.json b/uni_modules/uv-form/package.json new file mode 100644 index 0000000..5e612c2 --- /dev/null +++ b/uni_modules/uv-form/package.json @@ -0,0 +1,93 @@ +{ + "id": "uv-form", + "displayName": "uv-form 表单 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.9", + "description": "此组件一般用于表单场景,可以配置Input输入框,Textarea文本域,Checkbox复选框,Radio单选框,开关选择器等,进行表单验证等。", + "keywords": [ + "form", + "uvui", + "uv-ui", + "表单", + "表单验证" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-line", + "uv-transition", + "uv-action-sheet", + "uv-input", + "uv-button" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-form/readme.md b/uni_modules/uv-form/readme.md new file mode 100644 index 0000000..0458a6a --- /dev/null +++ b/uni_modules/uv-form/readme.md @@ -0,0 +1,19 @@ +## Form 表单 + +> **组件名:uv-form** + +此组件一般用于表单场景,可以配置`Input`输入框,`Textarea`文本域,`Checkbox`复选框,`Radio`单选框,开关选择器等,进行表单验证等。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-gap/changelog.md b/uni_modules/uv-gap/changelog.md new file mode 100644 index 0000000..7d603b4 --- /dev/null +++ b/uni_modules/uv-gap/changelog.md @@ -0,0 +1,5 @@ +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +1. 新增间隔槽组件 diff --git a/uni_modules/uv-gap/components/uv-gap/props.js b/uni_modules/uv-gap/components/uv-gap/props.js new file mode 100644 index 0000000..0ad787c --- /dev/null +++ b/uni_modules/uv-gap/components/uv-gap/props.js @@ -0,0 +1,25 @@ +export default { + props: { + // 背景颜色(默认transparent) + bgColor: { + type: String, + default: 'transparent' + }, + // 分割槽高度,单位px(默认20) + height: { + type: [String, Number], + default: 20 + }, + // 与上一个组件的距离 + marginTop: { + type: [String, Number], + default: 0 + }, + // 与下一个组件的距离 + marginBottom: { + type: [String, Number], + default: 0 + }, + ...uni.$uv?.props?.gap + } +} \ No newline at end of file diff --git a/uni_modules/uv-gap/components/uv-gap/uv-gap.vue b/uni_modules/uv-gap/components/uv-gap/uv-gap.vue new file mode 100644 index 0000000..55720a1 --- /dev/null +++ b/uni_modules/uv-gap/components/uv-gap/uv-gap.vue @@ -0,0 +1,36 @@ + + + diff --git a/uni_modules/uv-gap/package.json b/uni_modules/uv-gap/package.json new file mode 100644 index 0000000..3a17ec3 --- /dev/null +++ b/uni_modules/uv-gap/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-gap", + "displayName": "uv-gap 间隔槽 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.1", + "description": "该组件一般用于内容块之间的用一个灰色块隔开的场景,方便用户风格统一,减少工作量。", + "keywords": [ + "gap", + "uvui", + "uv-ui", + "间隔槽", + "内容块" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-gap/readme.md b/uni_modules/uv-gap/readme.md new file mode 100644 index 0000000..dedd565 --- /dev/null +++ b/uni_modules/uv-gap/readme.md @@ -0,0 +1,12 @@ +## Gap 间隔槽 + +> **组件名:uv-gap** + +该组件一般用于内容块之间的用一个灰色块隔开的场景,方便用户风格统一,减少工作量。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 + diff --git a/uni_modules/uv-grid/changelog.md b/uni_modules/uv-grid/changelog.md new file mode 100644 index 0000000..8c61261 --- /dev/null +++ b/uni_modules/uv-grid/changelog.md @@ -0,0 +1,21 @@ +## 1.0.9(2023-12-06) +1. 优化 +## 1.0.8(2023-12-06) +1. 阻止事件冒泡问题 +## 1.0.7(2023-10-13) +1. unmounted兼容vue3 +## 1.0.6(2023-08-14) +1. 修复初始的时候闪动的BUG +## 1.0.5(2023-06-22) +1. 优化修改 +## 1.0.4(2023-06-21) +1. 修复BUG +## 1.0.3(2023-06-01) +1. 修复点击触发两次事件的BUG +## 1.0.2(2023-05-23) +1. 优化 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-grid 宫格布局 diff --git a/uni_modules/uv-grid/components/uv-grid-item/props.js b/uni_modules/uv-grid/components/uv-grid-item/props.js new file mode 100644 index 0000000..6b86298 --- /dev/null +++ b/uni_modules/uv-grid/components/uv-grid-item/props.js @@ -0,0 +1,15 @@ +export default { + props: { + // 宫格的name + name: { + type: [String, Number, null], + default: null + }, + // 背景颜色 + bgColor: { + type: String, + default: 'transparent' + }, + ...uni.$uv?.props?.gridItem + } +} \ No newline at end of file diff --git a/uni_modules/uv-grid/components/uv-grid-item/uv-grid-item.vue b/uni_modules/uv-grid/components/uv-grid-item/uv-grid-item.vue new file mode 100644 index 0000000..9412852 --- /dev/null +++ b/uni_modules/uv-grid/components/uv-grid-item/uv-grid-item.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/uni_modules/uv-grid/components/uv-grid/props.js b/uni_modules/uv-grid/components/uv-grid/props.js new file mode 100644 index 0000000..d5f8474 --- /dev/null +++ b/uni_modules/uv-grid/components/uv-grid/props.js @@ -0,0 +1,20 @@ +export default { + props: { + // 分成几列 + col: { + type: [String, Number], + default: 3 + }, + // 是否显示边框 + border: { + type: Boolean, + default: false + }, + // 宫格对齐方式,表现为数量少的时候,靠左,居中,还是靠右 + align: { + type: String, + default: 'left' + }, + ...uni.$uv?.props?.grid + } +} \ No newline at end of file diff --git a/uni_modules/uv-grid/components/uv-grid/uv-grid.vue b/uni_modules/uv-grid/components/uv-grid/uv-grid.vue new file mode 100644 index 0000000..0314b18 --- /dev/null +++ b/uni_modules/uv-grid/components/uv-grid/uv-grid.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/uni_modules/uv-grid/package.json b/uni_modules/uv-grid/package.json new file mode 100644 index 0000000..0c93379 --- /dev/null +++ b/uni_modules/uv-grid/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-grid", + "displayName": "uv-grid 宫格布局 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.9", + "description": "uv-grid 宫格组件一般用于同时展示多个同类项目的场景,可以给宫格的项目设置徽标组件(badge),或者图标等,也可以扩展为左右滑动的轮播形式。", + "keywords": [ + "uv-grid", + "uvui", + "uv-ui", + "宫格布局", + "grid" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-grid/readme.md b/uni_modules/uv-grid/readme.md new file mode 100644 index 0000000..cd13cef --- /dev/null +++ b/uni_modules/uv-grid/readme.md @@ -0,0 +1,17 @@ +## Grid 宫格布局 + +> **组件名:uv-grid** + +宫格组件一般用于同时展示多个同类项目的场景,可以给宫格的项目设置徽标组件(badge),或者图标等,也可以扩展为左右滑动的轮播形式。 + +# 查看文档 + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-icon/changelog.md b/uni_modules/uv-icon/changelog.md new file mode 100644 index 0000000..c610827 --- /dev/null +++ b/uni_modules/uv-icon/changelog.md @@ -0,0 +1,31 @@ +## 1.0.13(2023-12-06) +1. 优化 +## 1.0.12(2023-12-06) +1. 阻止事件冒泡处理 +## 1.0.11(2023-10-29) +1. imgMode默认值改成aspectFit +## 1.0.10(2023-08-13) +1. 优化nvue,方便自定义图标 +## 1.0.9(2023-07-28) +1. 修改几个对应错误图标的BUG +## 1.0.8(2023-07-24) +1. 优化 支持base64图片 +## 1.0.7(2023-07-17) +1. 修复 uv-icon 恢复uv-empty相关的图标 +## 1.0.6(2023-07-13) +1. 修复icon设置name属性对应图标错误的BUG +## 1.0.5(2023-07-04) +1. 更新图标,删除一些不常用的图标 +2. 删除base64,修改成ttf文件引入读取图标 +3. 自定义图标文档说明:https://www.uvui.cn/guide/customIcon.html +## 1.0.4(2023-07-03) +1. 修复主题颜色在APP不生效的BUG +## 1.0.3(2023-05-24) +1. 将线上ttf字体包替换成base64,避免加载时或者网络差时候显示白色方块 +## 1.0.2(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.1(2023-05-10) +1. 修复小程序中异常显示 +## 1.0.0(2023-05-04) +新发版 diff --git a/uni_modules/uv-icon/components/uv-icon/icons.js b/uni_modules/uv-icon/components/uv-icon/icons.js new file mode 100644 index 0000000..8469a2d --- /dev/null +++ b/uni_modules/uv-icon/components/uv-icon/icons.js @@ -0,0 +1,160 @@ +export default { + 'uvicon-level': 'e68f', + 'uvicon-checkbox-mark': 'e659', + 'uvicon-folder': 'e694', + 'uvicon-movie': 'e67c', + 'uvicon-star-fill': 'e61e', + 'uvicon-star': 'e618', + 'uvicon-phone-fill': 'e6ac', + 'uvicon-phone': 'e6ba', + 'uvicon-apple-fill': 'e635', + 'uvicon-backspace': 'e64d', + 'uvicon-attach': 'e640', + 'uvicon-empty-data': 'e671', + 'uvicon-empty-address': 'e68a', + 'uvicon-empty-favor': 'e662', + 'uvicon-empty-car': 'e657', + 'uvicon-empty-order': 'e66b', + 'uvicon-empty-list': 'e672', + 'uvicon-empty-search': 'e677', + 'uvicon-empty-permission': 'e67d', + 'uvicon-empty-news': 'e67e', + 'uvicon-empty-history': 'e685', + 'uvicon-empty-coupon': 'e69b', + 'uvicon-empty-page': 'e60e', + 'uvicon-empty-wifi-off': 'e6cc', + 'uvicon-reload': 'e627', + 'uvicon-order': 'e695', + 'uvicon-server-man': 'e601', + 'uvicon-search': 'e632', + 'uvicon-more-dot-fill': 'e66f', + 'uvicon-scan': 'e631', + 'uvicon-map': 'e665', + 'uvicon-map-fill': 'e6a8', + 'uvicon-tags': 'e621', + 'uvicon-tags-fill': 'e613', + 'uvicon-eye': 'e664', + 'uvicon-eye-fill': 'e697', + 'uvicon-eye-off': 'e69c', + 'uvicon-eye-off-outline': 'e688', + 'uvicon-mic': 'e66d', + 'uvicon-mic-off': 'e691', + 'uvicon-calendar': 'e65c', + 'uvicon-trash': 'e623', + 'uvicon-trash-fill': 'e6ce', + 'uvicon-play-left': 'e6bf', + 'uvicon-play-right': 'e6b3', + 'uvicon-minus': 'e614', + 'uvicon-plus': 'e625', + 'uvicon-info-circle': 'e69f', + 'uvicon-info-circle-fill': 'e6a7', + 'uvicon-question-circle': 'e622', + 'uvicon-question-circle-fill': 'e6bc', + 'uvicon-close': 'e65a', + 'uvicon-checkmark': 'e64a', + 'uvicon-checkmark-circle': 'e643', + 'uvicon-checkmark-circle-fill': 'e668', + 'uvicon-setting': 'e602', + 'uvicon-setting-fill': 'e6d0', + 'uvicon-heart': 'e6a2', + 'uvicon-heart-fill': 'e68b', + 'uvicon-camera': 'e642', + 'uvicon-camera-fill': 'e650', + 'uvicon-more-circle': 'e69e', + 'uvicon-more-circle-fill': 'e684', + 'uvicon-chat': 'e656', + 'uvicon-chat-fill': 'e63f', + 'uvicon-bag': 'e647', + 'uvicon-error-circle': 'e66e', + 'uvicon-error-circle-fill': 'e655', + 'uvicon-close-circle': 'e64e', + 'uvicon-close-circle-fill': 'e666', + 'uvicon-share': 'e629', + 'uvicon-share-fill': 'e6bb', + 'uvicon-share-square': 'e6c4', + 'uvicon-shopping-cart': 'e6cb', + 'uvicon-shopping-cart-fill': 'e630', + 'uvicon-bell': 'e651', + 'uvicon-bell-fill': 'e604', + 'uvicon-list': 'e690', + 'uvicon-list-dot': 'e6a9', + 'uvicon-zhifubao-circle-fill': 'e617', + 'uvicon-weixin-circle-fill': 'e6cd', + 'uvicon-weixin-fill': 'e620', + 'uvicon-qq-fill': 'e608', + 'uvicon-qq-circle-fill': 'e6b9', + 'uvicon-moments-circel-fill': 'e6c2', + 'uvicon-moments': 'e6a0', + 'uvicon-car': 'e64f', + 'uvicon-car-fill': 'e648', + 'uvicon-warning-fill': 'e6c7', + 'uvicon-warning': 'e6c1', + 'uvicon-clock-fill': 'e64b', + 'uvicon-clock': 'e66c', + 'uvicon-edit-pen': 'e65d', + 'uvicon-edit-pen-fill': 'e679', + 'uvicon-email': 'e673', + 'uvicon-email-fill': 'e683', + 'uvicon-minus-circle': 'e6a5', + 'uvicon-plus-circle': 'e603', + 'uvicon-plus-circle-fill': 'e611', + 'uvicon-file-text': 'e687', + 'uvicon-file-text-fill': 'e67f', + 'uvicon-pushpin': 'e6d1', + 'uvicon-pushpin-fill': 'e6b6', + 'uvicon-grid': 'e68c', + 'uvicon-grid-fill': 'e698', + 'uvicon-play-circle': 'e6af', + 'uvicon-play-circle-fill': 'e62a', + 'uvicon-pause-circle-fill': 'e60c', + 'uvicon-pause': 'e61c', + 'uvicon-pause-circle': 'e696', + 'uvicon-gift-fill': 'e6b0', + 'uvicon-gift': 'e680', + 'uvicon-kefu-ermai': 'e660', + 'uvicon-server-fill': 'e610', + 'uvicon-coupon-fill': 'e64c', + 'uvicon-coupon': 'e65f', + 'uvicon-integral': 'e693', + 'uvicon-integral-fill': 'e6b1', + 'uvicon-home-fill': 'e68e', + 'uvicon-home': 'e67b', + 'uvicon-account': 'e63a', + 'uvicon-account-fill': 'e653', + 'uvicon-thumb-down-fill': 'e628', + 'uvicon-thumb-down': 'e60a', + 'uvicon-thumb-up': 'e612', + 'uvicon-thumb-up-fill': 'e62c', + 'uvicon-lock-fill': 'e6a6', + 'uvicon-lock-open': 'e68d', + 'uvicon-lock-opened-fill': 'e6a1', + 'uvicon-lock': 'e69d', + 'uvicon-red-packet': 'e6c3', + 'uvicon-photo-fill': 'e6b4', + 'uvicon-photo': 'e60d', + 'uvicon-volume-off-fill': 'e6c8', + 'uvicon-volume-off': 'e6bd', + 'uvicon-volume-fill': 'e624', + 'uvicon-volume': 'e605', + 'uvicon-download': 'e670', + 'uvicon-arrow-up-fill': 'e636', + 'uvicon-arrow-down-fill': 'e638', + 'uvicon-play-left-fill': 'e6ae', + 'uvicon-play-right-fill': 'e6ad', + 'uvicon-arrow-downward': 'e634', + 'uvicon-arrow-leftward': 'e63b', + 'uvicon-arrow-rightward': 'e644', + 'uvicon-arrow-upward': 'e641', + 'uvicon-arrow-down': 'e63e', + 'uvicon-arrow-right': 'e63c', + 'uvicon-arrow-left': 'e646', + 'uvicon-arrow-up': 'e633', + 'uvicon-skip-back-left': 'e6c5', + 'uvicon-skip-forward-right': 'e61f', + 'uvicon-arrow-left-double': 'e637', + 'uvicon-man': 'e675', + 'uvicon-woman': 'e626', + 'uvicon-en': 'e6b8', + 'uvicon-twitte': 'e607', + 'uvicon-twitter-circle-fill': 'e6cf' +} \ No newline at end of file diff --git a/uni_modules/uv-icon/components/uv-icon/props.js b/uni_modules/uv-icon/components/uv-icon/props.js new file mode 100644 index 0000000..7668cf9 --- /dev/null +++ b/uni_modules/uv-icon/components/uv-icon/props.js @@ -0,0 +1,90 @@ +export default { + props: { + // 图标类名 + name: { + type: String, + default: '' + }, + // 图标颜色,可接受主题色 + color: { + type: String, + default: '#606266' + }, + // 字体大小,单位px + size: { + type: [String, Number], + default: '16px' + }, + // 是否显示粗体 + bold: { + type: Boolean, + default: false + }, + // 点击图标的时候传递事件出去的index(用于区分点击了哪一个) + index: { + type: [String, Number], + default: null + }, + // 触摸图标时的类名 + hoverClass: { + type: String, + default: '' + }, + // 自定义扩展前缀,方便用户扩展自己的图标库 + customPrefix: { + type: String, + default: 'uvicon' + }, + // 图标右边或者下面的文字 + label: { + type: [String, Number], + default: '' + }, + // label的位置,只能右边或者下边 + labelPos: { + type: String, + default: 'right' + }, + // label的大小 + labelSize: { + type: [String, Number], + default: '15px' + }, + // label的颜色 + labelColor: { + type: String, + default: '#606266' + }, + // label与图标的距离 + space: { + type: [String, Number], + default: '3px' + }, + // 图片的mode + imgMode: { + type: String, + default: 'aspectFit' + }, + // 用于显示图片小图标时,图片的宽度 + width: { + type: [String, Number], + default: '' + }, + // 用于显示图片小图标时,图片的高度 + height: { + type: [String, Number], + default: '' + }, + // 用于解决某些情况下,让图标垂直居中的用途 + top: { + type: [String, Number], + default: 0 + }, + // 是否阻止事件传播 + stop: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.icon + } +} \ No newline at end of file diff --git a/uni_modules/uv-icon/components/uv-icon/uv-icon.vue b/uni_modules/uv-icon/components/uv-icon/uv-icon.vue new file mode 100644 index 0000000..d61c9e5 --- /dev/null +++ b/uni_modules/uv-icon/components/uv-icon/uv-icon.vue @@ -0,0 +1,226 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-icon/components/uv-icon/uvicons.ttf b/uni_modules/uv-icon/components/uv-icon/uvicons.ttf new file mode 100644 index 0000000..9aedef8 Binary files /dev/null and b/uni_modules/uv-icon/components/uv-icon/uvicons.ttf differ diff --git a/uni_modules/uv-icon/package.json b/uni_modules/uv-icon/package.json new file mode 100644 index 0000000..0a838d5 --- /dev/null +++ b/uni_modules/uv-icon/package.json @@ -0,0 +1,83 @@ +{ + "id": "uv-icon", + "displayName": "uv-icon 图标 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.13", + "description": "基于字体的图标集,包含了大多数常见场景的图标,支持自定义,支持自定义图片图标等。可自定义颜色、大小。", + "keywords": [ + "uv-ui,uvui,uv-icon,icon,图标,字体图标" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-icon/readme.md b/uni_modules/uv-icon/readme.md new file mode 100644 index 0000000..d526e1a --- /dev/null +++ b/uni_modules/uv-icon/readme.md @@ -0,0 +1,15 @@ +## uv-icon 图标库 + +> **组件名:uv-icon** + +基于字体的图标集,包含了大多数常见场景的图标,支持自定义,支持自定义图片图标等。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 diff --git a/uni_modules/uv-image/changelog.md b/uni_modules/uv-image/changelog.md new file mode 100644 index 0000000..e5a633d --- /dev/null +++ b/uni_modules/uv-image/changelog.md @@ -0,0 +1,36 @@ +## 1.0.16(2023-12-21) +1. 修复设置show-menu-by-longpress不生效的BUG +## 1.0.15(2023-12-06) +1. 优化 +## 1.0.14(2023-12-06) +1. 阻止事件冒泡问题 +## 1.0.13(2023-11-15) +1. 修复webp之前未使用的BUG +## 1.0.12(2023-10-11) +1. 修复懒加载报错:https://gitee.com/climblee/uv-ui/issues/I869JS +## 1.0.11(2023-08-31) +1. 修复设置widthFix时出现显示不全的BUG +2. 修复抖音等平台在width和height属性改变时出现不显示的BUG +## 1.0.10(2023-08-29) +1. 修复异步修改宽高不生效的问题,问题来源:https://gitee.com/climblee/uv-ui/issues/I7WUQ3 +## 1.0.9(2023-08-21) +1. 修复设置宽高为百分比不生效的BUG +## 1.0.8(2023-07-24) +1. 优化 nvue模式下增加cellChild参数,是否在list中cell节点下,nvue中cell下建议设置成true +## 1.0.7(2023-07-02) +修复VUE3模式下可能不显示的BUG +## 1.0.6(2023-07-02) +优化修改 +## 1.0.5(2023-06-28) +修复duration属性不生效的BUG +## 1.0.4(2023-05-27) +1. 修复可能报错的问题 +## 1.0.3(2023-05-24) +1. 去掉template中存在的this.导致头条小程序编译警告 +## 1.0.2(2023-05-23) +1. 优化 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-image 图片 diff --git a/uni_modules/uv-image/components/uv-image/props.js b/uni_modules/uv-image/components/uv-image/props.js new file mode 100644 index 0000000..6ef04a5 --- /dev/null +++ b/uni_modules/uv-image/components/uv-image/props.js @@ -0,0 +1,95 @@ +export default { + props: { + // 图片地址 + src: { + type: String, + default: '' + }, + // 裁剪模式 + mode: { + type: String, + default: 'aspectFill' + }, + // 宽度,单位任意 + width: { + type: [String, Number], + default: '300' + }, + // 高度,单位任意 + height: { + type: [String, Number], + default: '225' + }, + // 图片形状,circle-圆形,square-方形 + shape: { + type: String, + default: 'square' + }, + // 圆角,单位任意 + radius: { + type: [String, Number], + default: 0 + }, + // 是否懒加载,微信小程序、App、百度小程序、字节跳动小程序 + lazyLoad: { + type: Boolean, + default: true + }, + // 是否开启observer懒加载,nvue不生效 + observeLazyLoad: { + type: Boolean, + default: false + }, + // 开启长按图片显示识别微信小程序码菜单 + showMenuByLongpress: { + type: Boolean, + default: true + }, + // 加载中的图标,或者小图片 + loadingIcon: { + type: String, + default: 'photo' + }, + // 加载失败的图标,或者小图片 + errorIcon: { + type: String, + default: 'error-circle' + }, + // 是否显示加载中的图标或者自定义的slot + showLoading: { + type: Boolean, + default: true + }, + // 是否显示加载错误的图标或者自定义的slot + showError: { + type: Boolean, + default: true + }, + // 是否需要淡入效果 + fade: { + type: Boolean, + default: true + }, + // 只支持网络资源,只对微信小程序有效 + webp: { + type: Boolean, + default: false + }, + // 过渡时间,单位ms + duration: { + type: [String, Number], + default: 500 + }, + // 背景颜色,用于深色页面加载图片时,为了和背景色融合 + bgColor: { + type: String, + default: '#f3f4f6' + }, + // nvue模式下 是否直接显示,在uv-list等cell下面使用就需要设置 + cellChild: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.image + } +} \ No newline at end of file diff --git a/uni_modules/uv-image/components/uv-image/uv-image.vue b/uni_modules/uv-image/components/uv-image/uv-image.vue new file mode 100644 index 0000000..2ab4a78 --- /dev/null +++ b/uni_modules/uv-image/components/uv-image/uv-image.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/uni_modules/uv-image/package.json b/uni_modules/uv-image/package.json new file mode 100644 index 0000000..796089e --- /dev/null +++ b/uni_modules/uv-image/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-image", + "displayName": "uv-image 图片 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.16", + "description": "uv-image 此组件为uni-app的image组件的加强版,在继承了原有功能外,增加observer懒加载功能,还支持淡入动画、加载中、加载失败提示、圆角值和形状等。", + "keywords": [ + "uv-image", + "uvui", + "uv-ui", + "image", + "图片" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-transition", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-image/readme.md b/uni_modules/uv-image/readme.md new file mode 100644 index 0000000..0ecc120 --- /dev/null +++ b/uni_modules/uv-image/readme.md @@ -0,0 +1,15 @@ +## Image 图片 + +> **组件名:uv-image** + +此组件为`uni-app`的`image`组件的加强版,在继承了原有功能外,增加`observer`懒加载功能,还支持淡入动画、加载中、加载失败提示、圆角值和形状等。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 diff --git a/uni_modules/uv-index-list/changelog.md b/uni_modules/uv-index-list/changelog.md new file mode 100644 index 0000000..deda715 --- /dev/null +++ b/uni_modules/uv-index-list/changelog.md @@ -0,0 +1,18 @@ +## 1.0.7(2023-11-07) +1. 修复sticky属性不生效的BUG +## 1.0.6(2023-09-01) +1. 修复设置customNavHeight导致定位不准确的BUG +## 1.0.5(2023-08-23) +1. 修复ios端快速滑动+点击右侧导航会出现白屏的BUG +## 1.0.4(2023-07-25) +1. 修复全局设置成rpx存在的高度BUG +2. 修复其他BUG +## 1.0.3(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.2(2023-05-27) +1. select事件修复 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-index-list 索引列表 diff --git a/uni_modules/uv-index-list/components/uv-index-anchor/props.js b/uni_modules/uv-index-list/components/uv-index-anchor/props.js new file mode 100644 index 0000000..9ec949e --- /dev/null +++ b/uni_modules/uv-index-list/components/uv-index-anchor/props.js @@ -0,0 +1,30 @@ +export default { + props: { + // 列表锚点文本内容 + text: { + type: [String, Number], + default: '' + }, + // 列表锚点文字颜色 + color: { + type: String, + default: '#606266' + }, + // 列表锚点文字大小,单位默认px + size: { + type: [String, Number], + default: 14 + }, + // 列表锚点背景颜色 + bgColor: { + type: String, + default: '#dedede' + }, + // 列表锚点高度,单位默认px + height: { + type: [String, Number], + default: 32 + }, + ...uni.$uv?.props?.indexAnchor + } +} \ No newline at end of file diff --git a/uni_modules/uv-index-list/components/uv-index-anchor/uv-index-anchor.vue b/uni_modules/uv-index-list/components/uv-index-anchor/uv-index-anchor.vue new file mode 100644 index 0000000..e566aa7 --- /dev/null +++ b/uni_modules/uv-index-list/components/uv-index-anchor/uv-index-anchor.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/uni_modules/uv-index-list/components/uv-index-item/uv-index-item.vue b/uni_modules/uv-index-list/components/uv-index-item/uv-index-item.vue new file mode 100644 index 0000000..f6e8901 --- /dev/null +++ b/uni_modules/uv-index-list/components/uv-index-item/uv-index-item.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/uni_modules/uv-index-list/components/uv-index-list/props.js b/uni_modules/uv-index-list/components/uv-index-list/props.js new file mode 100644 index 0000000..0cf6356 --- /dev/null +++ b/uni_modules/uv-index-list/components/uv-index-list/props.js @@ -0,0 +1,30 @@ +export default { + props: { + // 右边锚点非激活的颜色 + inactiveColor: { + type: String, + default: '#606266' + }, + // 右边锚点激活的颜色 + activeColor: { + type: String, + default: '#5677fc' + }, + // 索引字符列表,数组形式 + indexList: { + type: Array, + default: () => [] + }, + // 是否开启锚点自动吸顶 + sticky: { + type: Boolean, + default: true + }, + // 自定义导航栏的高度 + customNavHeight: { + type: [String, Number], + default: 0 + }, + ...uni.$uv?.props?.indexList + } +} \ No newline at end of file diff --git a/uni_modules/uv-index-list/components/uv-index-list/uv-index-list.vue b/uni_modules/uv-index-list/components/uv-index-list/uv-index-list.vue new file mode 100644 index 0000000..e610323 --- /dev/null +++ b/uni_modules/uv-index-list/components/uv-index-list/uv-index-list.vue @@ -0,0 +1,461 @@ + + + + + diff --git a/uni_modules/uv-index-list/package.json b/uni_modules/uv-index-list/package.json new file mode 100644 index 0000000..133736b --- /dev/null +++ b/uni_modules/uv-index-list/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-index-list", + "displayName": "uv-index-list 索引列表 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.7", + "description": "该组件用于展示索引列表,右侧带索引的列表,方便快速定位到具体内容,通常用于城市/机场选择等场景。类似于微信通讯录页面", + "keywords": [ + "uv-index-list", + "uvui", + "uv-ui", + "index-list", + "索引列表" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-index-list/readme.md b/uni_modules/uv-index-list/readme.md new file mode 100644 index 0000000..605741c --- /dev/null +++ b/uni_modules/uv-index-list/readme.md @@ -0,0 +1,19 @@ +## IndexList 索引列表 + +> **组件名:uv-index-list** + +用于展示索引列表,右侧带索引的列表,方便快速定位到具体内容,通常用于城市/机场选择等场景,类似于微信通讯录页面。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-input/changelog.md b/uni_modules/uv-input/changelog.md new file mode 100644 index 0000000..2b354d0 --- /dev/null +++ b/uni_modules/uv-input/changelog.md @@ -0,0 +1,29 @@ +## 1.0.13(2023-12-06) +1. 优化 +## 1.0.12(2023-12-06) +1. 阻止事件冒泡问题 +## 1.0.11(2023-11-10) +1. 调整清除按钮样式的marginLeft,避免微信上多数情况触发不了的BUG +## 1.0.10(2023-10-07) +1. 修复搜狗输入法下存在不可清空的情况 +## 1.0.9(2023-09-14) +1. 修复H5等情况设置禁用或可读情况下,点击事件无效的问题 +## 1.0.8(2023-08-22) +1. 修复无法@keyboardheightchange无法获取键盘高度的BUG +## 1.0.7(2023-08-18) +1. 修复ios端不能输入的BUG +## 1.0.6(2023-08-05) +1. 修复在vue2模式下,v-model设置为0时不生效的BUG +## 1.0.5(2023-07-18) +1. 修复在微信小程序端清除内容存在不能清除的BUG +## 1.0.4(2023-07-13) +1. 修复value/v-model更改不生效的BUG +## 1.0.3(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.2(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.1(2023-05-12) +1. 修复vue3双向绑定的BUG +## 1.0.0(2023-05-10) +uv-input 输入框 diff --git a/uni_modules/uv-input/components/uv-input/props.js b/uni_modules/uv-input/components/uv-input/props.js new file mode 100644 index 0000000..e969493 --- /dev/null +++ b/uni_modules/uv-input/components/uv-input/props.js @@ -0,0 +1,175 @@ +export default { + props: { + value: { + type: [String, Number], + default: '' + }, + modelValue: { + type: [String, Number], + default: '' + }, + // 输入框类型 + // number-数字输入键盘,app-vue下可以输入浮点数,app-nvue和小程序平台下只能输入整数 + // idcard-身份证输入键盘,微信、支付宝、百度、QQ小程序 + // digit-带小数点的数字键盘,App的nvue页面、微信、支付宝、百度、头条、QQ小程序 + // text-文本输入键盘 + type: { + type: String, + default: 'text' + }, + // 是否禁用输入框 + disabled: { + type: Boolean, + default: false + }, + // 禁用状态时的背景色 + disabledColor: { + type: String, + default: '#f5f7fa' + }, + // 是否显示清除控件 + clearable: { + type: Boolean, + default: false + }, + // 是否密码类型 + password: { + type: Boolean, + default: false + }, + // 最大输入长度,设置为 -1 的时候不限制最大长度 + maxlength: { + type: [String, Number], + default: -1 + }, + // 输入框为空时的占位符 + placeholder: { + type: String, + default: null + }, + // 指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/ + placeholderClass: { + type: String, + default: 'input-placeholder' + }, + // 指定placeholder的样式 + placeholderStyle: { + type: [String, Object], + default: 'color: #c0c4cc' + }, + // 设置右下角按钮的文字,有效值:send|search|next|go|done,兼容性详见uni-app文档 + // https://uniapp.dcloud.io/component/input + // https://uniapp.dcloud.io/component/textarea + confirmType: { + type: String, + default: 'done' + }, + // 点击键盘右下角按钮时是否保持键盘不收起,H5无效 + confirmHold: { + type: Boolean, + default: false + }, + // focus时,点击页面的时候不收起键盘,微信小程序有效 + holdKeyboard: { + type: Boolean, + default: false + }, + // 自动获取焦点 + // 在 H5 平台能否聚焦以及软键盘是否跟随弹出,取决于当前浏览器本身的实现。nvue 页面不支持,需使用组件的 focus()、blur() 方法控制焦点 + focus: { + type: Boolean, + default: false + }, + // 键盘收起时,是否自动失去焦点,目前仅App3.0.0+有效 + autoBlur: { + type: Boolean, + default: false + }, + // 指定focus时光标的位置 + cursor: { + type: [String, Number], + default: -1 + }, + // 输入框聚焦时底部与键盘的距离 + cursorSpacing: { + type: [String, Number], + default: 30 + }, + // 光标起始位置,自动聚集时有效,需与selection-end搭配使用 + selectionStart: { + type: [String, Number], + default: -1 + }, + // 光标结束位置,自动聚集时有效,需与selection-start搭配使用 + selectionEnd: { + type: [String, Number], + default: -1 + }, + // 键盘弹起时,是否自动上推页面 + adjustPosition: { + type: Boolean, + default: true + }, + // 输入框内容对齐方式,可选值为:left|center|right + inputAlign: { + type: String, + default: 'left' + }, + // 输入框字体的大小 + fontSize: { + type: [String, Number], + default: '14px' + }, + // 输入框字体颜色 + color: { + type: String, + default: '#303133' + }, + // 输入框前置图标 + prefixIcon: { + type: String, + default: '' + }, + // 前置图标样式,对象或字符串 + prefixIconStyle: { + type: [String, Object], + default: '' + }, + // 输入框后置图标 + suffixIcon: { + type: String, + default: '' + }, + // 后置图标样式,对象或字符串 + suffixIconStyle: { + type: [String, Object], + default: '' + }, + // 边框类型,surround-四周边框,bottom-底部边框,none-无边框 + border: { + type: String, + default: 'surround' + }, + // 是否只读,与disabled不同之处在于disabled会置灰组件,而readonly则不会 + readonly: { + type: Boolean, + default: false + }, + // 输入框形状,circle-圆形,square-方形 + shape: { + type: String, + default: 'square' + }, + // 用于处理或者过滤输入框内容的方法 + formatter: { + type: [Function, null], + default: null + }, + // 是否忽略组件内对文本合成系统事件的处理 + ignoreCompositionEvent: { + type: Boolean, + default: true + }, + ...uni.$uv?.props?.input + } +} \ No newline at end of file diff --git a/uni_modules/uv-input/components/uv-input/uv-input.vue b/uni_modules/uv-input/components/uv-input/uv-input.vue new file mode 100644 index 0000000..20c1801 --- /dev/null +++ b/uni_modules/uv-input/components/uv-input/uv-input.vue @@ -0,0 +1,348 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-input/package.json b/uni_modules/uv-input/package.json new file mode 100644 index 0000000..6981fa9 --- /dev/null +++ b/uni_modules/uv-input/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-input", + "displayName": "uv-input 输入框 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.13", + "description": "uv-input 该组件为一个输入框,默认没有边框和样式,是专门为配合表单组件uv-form而设计的,利用它可以快速实现表单验证,输入内容,下拉选择等功能。", + "keywords": [ + "uv-input", + "uvui", + "uv-ui", + "input", + "输入框" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-input/readme.md b/uni_modules/uv-input/readme.md new file mode 100644 index 0000000..00f47e4 --- /dev/null +++ b/uni_modules/uv-input/readme.md @@ -0,0 +1,19 @@ +## Input 输入框 + +> **组件名:uv-input** + +此组件为一个输入框,默认没有边框和样式,是专门为配合表单组件uv-form而设计的,利用它可以快速实现表单验证,输入内容,下拉选择等功能。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-keyboard/changelog.md b/uni_modules/uv-keyboard/changelog.md new file mode 100644 index 0000000..1d1be01 --- /dev/null +++ b/uni_modules/uv-keyboard/changelog.md @@ -0,0 +1,17 @@ +## 1.0.5(2023-10-12) +1. 增加disKeys参数,mode = "car"下,被禁用的键,如:['I','O'] +2. 增加customabc参数,mode = "car"下,是否启用自定义中英文切换内容模式,为了兼容支付宝等小程序不兼容嵌套插槽,导致同时显示自定义内容和原始内容 +3. 增加ref方法changeCarMode,mode = "car"下, 调用此方法可以切换中英文模式 +4. 增加@changeCarInputMode,mode = "car"下,调用此方法可以进行切换中英文 +5. 增加插槽abc,mode = "car"下,自定义中英文切换内容,具体参考[车牌键盘自定义中英文切换及禁用键等设置](https://www.uvui.cn/components/keyboard.html#车牌键盘自定义中英文切换及禁用键等设置) +## 1.0.4(2023-09-04) +1. 优化,修改文件名称 +## 1.0.3(2023-09-04) +1. 修复键盘change回调事件产生冲突的BUG +## 1.0.2(2023-07-02) +uv-keyboard 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/keyboard.html +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-keyboard 键盘 diff --git a/uni_modules/uv-keyboard/components/uv-keyboard-car/props.js b/uni_modules/uv-keyboard/components/uv-keyboard-car/props.js new file mode 100644 index 0000000..3dd93cc --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard-car/props.js @@ -0,0 +1,24 @@ +export default { + props: { + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: false + }, + // 输入一个中文后,是否自动切换到英文 + autoChange: { + type: Boolean, + default: false + }, + // 被禁用的键 + disKeys: { + type: Array, + default: ()=>[] + }, + // 是否自定义abc + customabc: { + type: Boolean, + default: false + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-keyboard/components/uv-keyboard-car/uv-keyboard-car.vue b/uni_modules/uv-keyboard/components/uv-keyboard-car/uv-keyboard-car.vue new file mode 100644 index 0000000..e99e910 --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard-car/uv-keyboard-car.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/uni_modules/uv-keyboard/components/uv-keyboard-number/props.js b/uni_modules/uv-keyboard/components/uv-keyboard-number/props.js new file mode 100644 index 0000000..60d63d4 --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard-number/props.js @@ -0,0 +1,19 @@ +export default { + props: { + // 键盘的类型,number-数字键盘,card-身份证键盘 + mode: { + type: String, + default: 'number' + }, + // 是否显示键盘的"."符号 + dotDisabled: { + type: Boolean, + default: false + }, + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: false + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-keyboard/components/uv-keyboard-number/uv-keyboard-number.vue b/uni_modules/uv-keyboard/components/uv-keyboard-number/uv-keyboard-number.vue new file mode 100644 index 0000000..b7c0b8b --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard-number/uv-keyboard-number.vue @@ -0,0 +1,201 @@ + + + + + diff --git a/uni_modules/uv-keyboard/components/uv-keyboard/props.js b/uni_modules/uv-keyboard/components/uv-keyboard/props.js new file mode 100644 index 0000000..05dd76a --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard/props.js @@ -0,0 +1,95 @@ +export default { + props: { + // 键盘的类型,number-数字键盘,card-身份证键盘,car-车牌号键盘 + mode: { + type: String, + default: 'number' + }, + // 是否显示键盘的"."符号 + dotDisabled: { + type: Boolean, + default: false + }, + // 是否显示顶部工具条 + tooltip: { + type: Boolean, + default: true + }, + // 是否显示工具条中间的提示 + showTips: { + type: Boolean, + default: true + }, + // 工具条中间的提示文字 + tips: { + type: String, + default: '' + }, + // 是否显示工具条左边的"取消"按钮 + showCancel: { + type: Boolean, + default: true + }, + // 是否显示工具条右边的"完成"按钮 + showConfirm: { + type: Boolean, + default: true + }, + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: false + }, + // 是否开启底部安全区适配,开启的话,会在iPhoneX机型底部添加一定的内边距 + safeAreaInsetBottom: { + type: Boolean, + default: true + }, + // 是否允许通过点击遮罩关闭键盘 + closeOnClickOverlay: { + type: Boolean, + default: true + }, + // 是否允许点击确认按钮关闭组件 + closeOnClickConfirm: { + type: Boolean, + default: true + }, + // 是否显示遮罩,某些时候数字键盘时,用户希望看到自己的数值,所以可能不想要遮罩 + overlay: { + type: Boolean, + default: true + }, + // z-index值 + zIndex: { + type: [String, Number], + default: 10075 + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: '取消' + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: '确定' + }, + // 输入一个中文后,是否自动切换到英文 + autoChange: { + type: Boolean, + default: false + }, + // 被禁用的键 + disKeys: { + type: Array, + default: ()=>[] + }, + // 是否自定义abc + customabc: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.keyboard + } +} \ No newline at end of file diff --git a/uni_modules/uv-keyboard/components/uv-keyboard/uv-keyboard.vue b/uni_modules/uv-keyboard/components/uv-keyboard/uv-keyboard.vue new file mode 100644 index 0000000..60b15bf --- /dev/null +++ b/uni_modules/uv-keyboard/components/uv-keyboard/uv-keyboard.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/uni_modules/uv-keyboard/package.json b/uni_modules/uv-keyboard/package.json new file mode 100644 index 0000000..69844c6 --- /dev/null +++ b/uni_modules/uv-keyboard/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-keyboard", + "displayName": "uv-keyboard 键盘 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.5", + "description": "uv-keyboard 该组件为自定义的键盘面板,内含了数字键盘,车牌号键,身份证号键盘3种模式,都有可以打乱按键顺序的选项。", + "keywords": [ + "uv-keyboard", + "uvui", + "uv-ui", + "keyboard", + "键盘" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-popup", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-keyboard/readme.md b/uni_modules/uv-keyboard/readme.md new file mode 100644 index 0000000..9cbef6c --- /dev/null +++ b/uni_modules/uv-keyboard/readme.md @@ -0,0 +1,19 @@ +## Keyboard 键盘 + +> **组件名:uv-keyboard** + +该组件为自定义的键盘面板,内含了数字键盘,车牌号键,身份证号键盘3种模式,都有可以打乱按键顺序的选项。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-line-progress/changelog.md b/uni_modules/uv-line-progress/changelog.md new file mode 100644 index 0000000..975acce --- /dev/null +++ b/uni_modules/uv-line-progress/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-06-20) +1. 适配height参数携带单位 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-line-progress 线形进度条 diff --git a/uni_modules/uv-line-progress/components/uv-line-progress/props.js b/uni_modules/uv-line-progress/components/uv-line-progress/props.js new file mode 100644 index 0000000..23138c7 --- /dev/null +++ b/uni_modules/uv-line-progress/components/uv-line-progress/props.js @@ -0,0 +1,29 @@ +export default { + props: { + // 激活部分的颜色 + activeColor: { + type: String, + default: '#19be6b' + }, + inactiveColor: { + type: String, + default: '#ececec' + }, + // 进度百分比,数值 + percentage: { + type: [String, Number], + default: 0 + }, + // 是否在进度条内部显示百分比的值 + showText: { + type: Boolean, + default: true + }, + // 进度条的高度,单位px + height: { + type: [String, Number], + default: 12 + }, + ...uni.$uv?.props?.lineProgress + } +} \ No newline at end of file diff --git a/uni_modules/uv-line-progress/components/uv-line-progress/uv-line-progress.vue b/uni_modules/uv-line-progress/components/uv-line-progress/uv-line-progress.vue new file mode 100644 index 0000000..229c2aa --- /dev/null +++ b/uni_modules/uv-line-progress/components/uv-line-progress/uv-line-progress.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/uni_modules/uv-line-progress/package.json b/uni_modules/uv-line-progress/package.json new file mode 100644 index 0000000..01e550e --- /dev/null +++ b/uni_modules/uv-line-progress/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-line-progress", + "displayName": "uv-line-progress 线形进度条 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "uv-line-progress 该组件展示操作或任务的当前进度,比如上传文件,是一个线形的进度条。", + "keywords": [ + "uv-line-progress", + "uvui", + "uv-ui", + "progress", + "进度条" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-line-progress/readme.md b/uni_modules/uv-line-progress/readme.md new file mode 100644 index 0000000..98e5d49 --- /dev/null +++ b/uni_modules/uv-line-progress/readme.md @@ -0,0 +1,11 @@ +## LineProgress 线形进度条 + +> **组件名:uv-line-progress** + +展示操作或任务的当前进度,比如上传文件,是一个线形的进度条。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-line/changelog.md b/uni_modules/uv-line/changelog.md new file mode 100644 index 0000000..5eb7ba8 --- /dev/null +++ b/uni_modules/uv-line/changelog.md @@ -0,0 +1,5 @@ +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +1. 新增线条组件 diff --git a/uni_modules/uv-line/components/uv-line/props.js b/uni_modules/uv-line/components/uv-line/props.js new file mode 100644 index 0000000..75b1007 --- /dev/null +++ b/uni_modules/uv-line/components/uv-line/props.js @@ -0,0 +1,34 @@ +export default { + props: { + color: { + type: String, + default: '#d6d7d9' + }, + // 长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带px单位的值等 + length: { + type: [String, Number], + default: '100%' + }, + // 线条方向,col-竖向,row-横向 + direction: { + type: String, + default: 'row' + }, + // 是否显示细边框 + hairline: { + type: Boolean, + default: true + }, + // 线条与上下左右元素的间距,字符串形式,如"30px"、"20px 30px" + margin: { + type: [String, Number], + default: 0 + }, + // 是否虚线,true-虚线,false-实线 + dashed: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.line + } +} \ No newline at end of file diff --git a/uni_modules/uv-line/components/uv-line/uv-line.vue b/uni_modules/uv-line/components/uv-line/uv-line.vue new file mode 100644 index 0000000..866c507 --- /dev/null +++ b/uni_modules/uv-line/components/uv-line/uv-line.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/uni_modules/uv-line/package.json b/uni_modules/uv-line/package.json new file mode 100644 index 0000000..036446a --- /dev/null +++ b/uni_modules/uv-line/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-line", + "displayName": "uv-line 线条 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.1", + "description": "uv-line 此组件一般用于显示一根线条,用于分隔内容块,有横向和竖向两种模式,且能设置0.5px线条,使用也很简单。", + "keywords": [ + "uv-line", + "uvui", + "uv-ui", + "line", + "线条" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-line/readme.md b/uni_modules/uv-line/readme.md new file mode 100644 index 0000000..e47533c --- /dev/null +++ b/uni_modules/uv-line/readme.md @@ -0,0 +1,11 @@ +## Line 线条 + +> **组件名:uv-line** + +此组件一般用于显示一根线条,用于分隔内容块,有横向和竖向两种模式,且能设置0.5px线条,使用也很简单。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-link/changelog.md b/uni_modules/uv-link/changelog.md new file mode 100644 index 0000000..ce52f84 --- /dev/null +++ b/uni_modules/uv-link/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-08-13) +1. 修复报错的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-link 超链接组件 diff --git a/uni_modules/uv-link/components/uv-link/props.js b/uni_modules/uv-link/components/uv-link/props.js new file mode 100644 index 0000000..b3f56a1 --- /dev/null +++ b/uni_modules/uv-link/components/uv-link/props.js @@ -0,0 +1,40 @@ +export default { + props: { + // 文字颜色 + color: { + type: String, + default: '' + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: 14 + }, + // 是否显示下划线 + underLine: { + type: Boolean, + default: false + }, + // 要跳转的链接 + href: { + type: String, + default: '' + }, + // 小程序中复制到粘贴板的提示语 + mpTips: { + type: String, + default: '链接已复制,请在浏览器打开' + }, + // 下划线颜色 + lineColor: { + type: String, + default: '' + }, + // 超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色 + text: { + type: String, + default: '' + }, + ...uni.$uv?.props?.link + } +} \ No newline at end of file diff --git a/uni_modules/uv-link/components/uv-link/uv-link.vue b/uni_modules/uv-link/components/uv-link/uv-link.vue new file mode 100644 index 0000000..4c9258e --- /dev/null +++ b/uni_modules/uv-link/components/uv-link/uv-link.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/uni_modules/uv-link/package.json b/uni_modules/uv-link/package.json new file mode 100644 index 0000000..1b115f4 --- /dev/null +++ b/uni_modules/uv-link/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-link", + "displayName": "uv-link 超链接 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "uv-link 该组件为超链接组件", + "keywords": [ + "uv-link", + "uvui", + "uv-ui", + "link", + "超链接" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-link/readme.md b/uni_modules/uv-link/readme.md new file mode 100644 index 0000000..6e8ce92 --- /dev/null +++ b/uni_modules/uv-link/readme.md @@ -0,0 +1,11 @@ +## Link 超链接 + +> **组件名:uv-link** + +该组件为超链接组件,在不同平台有不同表现形式。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-list/changelog.md b/uni_modules/uv-list/changelog.md new file mode 100644 index 0000000..6c130f0 --- /dev/null +++ b/uni_modules/uv-list/changelog.md @@ -0,0 +1,25 @@ +## 1.0.9(2023-11-10) +1. 修复设置ellipsis不生效的BUG +## 1.0.8(2023-09-20) +1. listItem优化可使用customStyle变量进行样式控制 +## 1.0.7(2023-08-29) +1. 修复边框的BUG +## 1.0.6(2023-08-16) +1. 修复switch开关返回undefined的问题 +2. 优化初始化可能导致的闪动 +## 1.0.5(2023-08-07) +1. 修复分包页面在ios端,nvue编译不能滚动的BUG +## 1.0.4(2023-08-04) +1. nvue修复 触底不触发事件的BUG +2. 更新文档说明事件触发 +## 1.0.3(2023-07-28) +1. 修改可能造成样式污染的BUG +## 1.0.2(2023-07-26) +1. 全面重构,用法与之前保持一致,参数全部变化 +2. 新增多个功能参数,方便一键构建列表 +3. List列表组件,包含基本列表样式、默认插槽机制、可扩展插槽机制、长列表性能优化、多端兼容。 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-list 列表 diff --git a/uni_modules/uv-list/components/uv-list-item/uv-list-item.vue b/uni_modules/uv-list/components/uv-list-item/uv-list-item.vue new file mode 100644 index 0000000..193b48d --- /dev/null +++ b/uni_modules/uv-list/components/uv-list-item/uv-list-item.vue @@ -0,0 +1,535 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uv-list/components/uv-list/uv-list.vue b/uni_modules/uv-list/components/uv-list/uv-list.vue new file mode 100644 index 0000000..3f3e5c2 --- /dev/null +++ b/uni_modules/uv-list/components/uv-list/uv-list.vue @@ -0,0 +1,147 @@ + + + + diff --git a/uni_modules/uv-list/package.json b/uni_modules/uv-list/package.json new file mode 100644 index 0000000..1b1156c --- /dev/null +++ b/uni_modules/uv-list/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-list", + "displayName": "uv-list 列表 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.9", + "description": "uv-list 多功能高性能列表组件", + "keywords": [ + "uv-list", + "uvui", + "uv-ui", + "list", + "列表" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-list/readme.md b/uni_modules/uv-list/readme.md new file mode 100644 index 0000000..930cbd4 --- /dev/null +++ b/uni_modules/uv-list/readme.md @@ -0,0 +1,27 @@ +## List 列表 + +> **组件名:uv-list** + +List列表组件,包含基本列表样式、默认插槽机制、可扩展插槽机制、长列表性能优化、多端兼容。 + +在vue页面里,它默认使用页面级滚动,这样做的目的是性能更加友好。在app-nvue页面里,它默认使用原生list组件滚动,这样的长列表,在滚动出屏幕外后,系统会回收不可见区域的渲染内存资源,不会造成滚动越长手机越卡的问题。 + +uv-list组件是父容器,里面的核心是uv-list-item子组件,它代表列表中的一个可重复行,子组件可以无限循环。 + +uv-list-item有很多风格,uv-list-item组件通过内置的属性,满足一些常用的场景。当内置属性不满足需求时,可以通过扩展插槽来自定义列表内容,插槽包括:默认插槽(完全自定义内容)、具名插槽(header | body | footer),根据需求进行扩展。 + +内置属性可以覆盖的场景包括:导航列表、设置列表、小图标列表等,其他不能满足的场景使用插槽进行扩展。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-load-more/changelog.md b/uni_modules/uv-load-more/changelog.md new file mode 100644 index 0000000..a2e0fed --- /dev/null +++ b/uni_modules/uv-load-more/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-06-21) +1. 优化customStyle属性 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-load-more 加载更多 diff --git a/uni_modules/uv-load-more/components/uv-load-more/props.js b/uni_modules/uv-load-more/components/uv-load-more/props.js new file mode 100644 index 0000000..c6bc287 --- /dev/null +++ b/uni_modules/uv-load-more/components/uv-load-more/props.js @@ -0,0 +1,95 @@ +export default { + props: { + // 组件状态,loadmore-加载前的状态,loading-加载中的状态,nomore-没有更多的状态 + status: { + type: String, + default: 'loadmore' + }, + // 组件背景色 + bgColor: { + type: String, + default: 'transparent' + }, + // 是否显示加载中的图标 + icon: { + type: Boolean, + default: true + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 14 + }, + // 图标大小 + iconSize: { + type: [String, Number], + default: 16 + }, + // 字体颜色 + color: { + type: String, + default: '#606266' + }, + // 加载中状态的图标,spinner-花朵状图标,circle-圆圈状,semicircle-半圆 + loadingIcon: { + type: String, + default: 'spinner' + }, + // 加载前的提示语 + loadmoreText: { + type: String, + default: '加载更多' + }, + // 加载中提示语 + loadingText: { + type: String, + default: '正在加载...' + }, + // 没有更多的提示语 + nomoreText: { + type: String, + default: '没有更多了' + }, + // 在“没有更多”状态下,是否显示粗点 + isDot: { + type: Boolean, + default: false + }, + // 加载中图标的颜色 + iconColor: { + type: String, + default: '#b7b7b7' + }, + // 上边距 + marginTop: { + type: [String, Number], + default: 10 + }, + // 下边距 + marginBottom: { + type: [String, Number], + default: 10 + }, + // 高度,单位px + height: { + type: [String, Number], + default: 'auto' + }, + // 是否显示左边分割线 + line: { + type: Boolean, + default: false + }, + // 线条颜色 + lineColor: { + type: String, + default: '#E6E8EB' + }, + // 是否虚线,true-虚线,false-实线 + dashed: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.loadmore + } +} \ No newline at end of file diff --git a/uni_modules/uv-load-more/components/uv-load-more/uv-load-more.vue b/uni_modules/uv-load-more/components/uv-load-more/uv-load-more.vue new file mode 100644 index 0000000..2b5057c --- /dev/null +++ b/uni_modules/uv-load-more/components/uv-load-more/uv-load-more.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/uni_modules/uv-load-more/package.json b/uni_modules/uv-load-more/package.json new file mode 100644 index 0000000..bc502e3 --- /dev/null +++ b/uni_modules/uv-load-more/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-load-more", + "displayName": "uv-load-more 加载更多 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "uv-load-more 此组件一般用于标识页面底部加载数据时的状态,共有三种状态:加载前、加载中、加载后。", + "keywords": [ + "uv-load-more", + "uvui", + "uv-ui", + "more", + "加载更多" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-line", + "uv-loading-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-load-more/readme.md b/uni_modules/uv-load-more/readme.md new file mode 100644 index 0000000..2e9334e --- /dev/null +++ b/uni_modules/uv-load-more/readme.md @@ -0,0 +1,11 @@ +## LoadMore 加载更多 + +> **组件名:uv-load-more** + +此组件一般用于标识页面底部加载数据时的状态,共有三种状态:加载前、加载中、加载后。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-loading-icon/changelog.md b/uni_modules/uv-loading-icon/changelog.md new file mode 100644 index 0000000..f17e074 --- /dev/null +++ b/uni_modules/uv-loading-icon/changelog.md @@ -0,0 +1,9 @@ +## 1.0.3(2023-08-14) +1. 新增参数textStyle,自定义文本样式 +## 1.0.2(2023-06-27) +优化 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +1. 新增uv-loading-icon组件 diff --git a/uni_modules/uv-loading-icon/components/uv-loading-icon/props.js b/uni_modules/uv-loading-icon/components/uv-loading-icon/props.js new file mode 100644 index 0000000..4ef0e94 --- /dev/null +++ b/uni_modules/uv-loading-icon/components/uv-loading-icon/props.js @@ -0,0 +1,67 @@ +export default { + props: { + // 是否显示组件 + show: { + type: Boolean, + default: true + }, + // 颜色 + color: { + type: String, + default: '#909193' + }, + // 提示文字颜色 + textColor: { + type: String, + default: '#909193' + }, + // 文字和图标是否垂直排列 + vertical: { + type: Boolean, + default: false + }, + // 模式选择,circle-圆形,spinner-花朵形,semicircle-半圆形 + mode: { + type: String, + default: 'spinner' + }, + // 图标大小,单位默认px + size: { + type: [String, Number], + default: 24 + }, + // 文字大小 + textSize: { + type: [String, Number], + default: 15 + }, + // 文字样式 + textStyle: { + type: Object, + default () { + return {} + } + }, + // 文字内容 + text: { + type: [String, Number], + default: '' + }, + // 动画模式 https://www.runoob.com/cssref/css3-pr-animation-timing-function.html + timingFunction: { + type: String, + default: 'linear' + }, + // 动画执行周期时间 + duration: { + type: [String, Number], + default: 1200 + }, + // mode=circle时的暗边颜色 + inactiveColor: { + type: String, + default: '' + }, + ...uni.$uv?.props?.loadingIcon + } +} \ No newline at end of file diff --git a/uni_modules/uv-loading-icon/components/uv-loading-icon/uv-loading-icon.vue b/uni_modules/uv-loading-icon/components/uv-loading-icon/uv-loading-icon.vue new file mode 100644 index 0000000..5650470 --- /dev/null +++ b/uni_modules/uv-loading-icon/components/uv-loading-icon/uv-loading-icon.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/uni_modules/uv-loading-icon/package.json b/uni_modules/uv-loading-icon/package.json new file mode 100644 index 0000000..1485897 --- /dev/null +++ b/uni_modules/uv-loading-icon/package.json @@ -0,0 +1,87 @@ +{ + "id": "uv-loading-icon", + "displayName": "uv-loading-icon 加载动画 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.3", + "description": "此组件为一个小动画,目前用在uv-ui的uv-load-more加载更多等组件,还可以运用在项目中正在加载状态场景。", + "keywords": [ + "uv-loading-icon", + "uvui", + "uv-ui", + "loading", + "加载动画" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-loading-icon/readme.md b/uni_modules/uv-loading-icon/readme.md new file mode 100644 index 0000000..7b0cf0f --- /dev/null +++ b/uni_modules/uv-loading-icon/readme.md @@ -0,0 +1,19 @@ +## LoadingIcon 加载动画 + +> **组件名:uv-loading-icon** + +此组件为一个小动画,目前用在 `uv-ui` 的 `uv-load-more` 加载更多等组件,还可以运用在项目中正在加载状态场景。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-loading-page/changelog.md b/uni_modules/uv-loading-page/changelog.md new file mode 100644 index 0000000..4b7ef61 --- /dev/null +++ b/uni_modules/uv-loading-page/changelog.md @@ -0,0 +1,11 @@ +## 1.0.4(2024-01-20) +1. 修改上版本带出的问题 +## 1.0.3(2024-01-15) +1. 重构,避免初始加载的时候先显示页面的问题 +## 1.0.2(2023-07-02) +uv-loading-page 由于弹出层uv-transition的修改,组件内部做了相应的修改,参数不变。 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-loading-page 加载页 diff --git a/uni_modules/uv-loading-page/components/uv-loading-page/props.js b/uni_modules/uv-loading-page/components/uv-loading-page/props.js new file mode 100644 index 0000000..f1a8a06 --- /dev/null +++ b/uni_modules/uv-loading-page/components/uv-loading-page/props.js @@ -0,0 +1,55 @@ +export default { + props: { + // 提示内容 + loadingText: { + type: [String, Number], + default: '' + }, + // 文字上方用于替换loading动画的图片 + image: { + type: String, + default: '' + }, + // 加载动画的模式,circle-圆形,spinner-花朵形,semicircle-半圆形 + loadingMode: { + type: String, + default: 'circle' + }, + // 是否加载中 + loading: { + type: Boolean, + default: false + }, + // 背景色 + bgColor: { + type: String, + default: '#fff' + }, + // 文字颜色 + color: { + type: String, + default: '#C8C8C8' + }, + // 文字大小 + fontSize: { + type: [String, Number], + default: 16 + }, + // 图标大小 + iconSize: { + type: [String, Number], + default: 26 + }, + // 加载中图标的颜色,只能rgb或者十六进制颜色值 + loadingColor: { + type: String, + default: '#C8C8C8' + }, + // 过渡时间 + duration: { + type: [String, Number], + default: 300 + }, + ...uni.$uv?.props?.loadingPage + } +} \ No newline at end of file diff --git a/uni_modules/uv-loading-page/components/uv-loading-page/uv-loading-page.vue b/uni_modules/uv-loading-page/components/uv-loading-page/uv-loading-page.vue new file mode 100644 index 0000000..8fb26d1 --- /dev/null +++ b/uni_modules/uv-loading-page/components/uv-loading-page/uv-loading-page.vue @@ -0,0 +1,96 @@ + + + \ No newline at end of file diff --git a/uni_modules/uv-loading-page/package.json b/uni_modules/uv-loading-page/package.json new file mode 100644 index 0000000..cc9b171 --- /dev/null +++ b/uni_modules/uv-loading-page/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-loading-page", + "displayName": "uv-loading-page 加载页 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.4", + "description": "uv-loading-page 该组件是一个页面级的加载效果,可以在页面初始化数据等场景使用,与骨架屏有相似之处。", + "keywords": [ + "uv-loading-page", + "uvui", + "uv-ui", + "page", + "loading" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-transition", + "uv-loading-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-loading-page/readme.md b/uni_modules/uv-loading-page/readme.md new file mode 100644 index 0000000..3a5dd96 --- /dev/null +++ b/uni_modules/uv-loading-page/readme.md @@ -0,0 +1,11 @@ +## LoadingPage 加载页 + +> **组件名:uv-loading-page** + +该组件是一个页面级的加载效果,可以在页面初始化数据等场景使用,与骨架屏有相似之处。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-modal/changelog.md b/uni_modules/uv-modal/changelog.md new file mode 100644 index 0000000..d532286 --- /dev/null +++ b/uni_modules/uv-modal/changelog.md @@ -0,0 +1,28 @@ +## 1.0.11(2023-12-20) +1. 优化 +## 1.0.10(2023-12-19) +1. 修复confirm中快速使用closeLoading关闭加载状态失效的BUG +## 1.0.9(2023-11-28) +1. 修复上版本引出的确认和取消按钮均不显示,还有高度的BUG +## 1.0.8(2023-09-08) +1. 修复两个按钮之间竖线不显示的问题 +2. uv-ui项目自定义按钮示例修改 +## 1.0.7(2023-08-30) +1. 增加align参数,设置文本对齐方式,left center right +2. 增加textStyle参数,设置文本样式 +## 1.0.6(2023-08-23) +1. 修复异步loading时,确认回调还会一直触发 +## 1.0.5(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.4(2023-07-02) +uv-modal 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/modal.html +## 1.0.3(2023-06-29) +1. 增加closeLoading方法,方便异步加载手动取消 +2. 更新文档 +## 1.0.2(2023-06-11) +1. 新增zIndex参数 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-modal 模态框 diff --git a/uni_modules/uv-modal/components/uv-modal/props.js b/uni_modules/uv-modal/components/uv-modal/props.js new file mode 100644 index 0000000..6cb1f41 --- /dev/null +++ b/uni_modules/uv-modal/components/uv-modal/props.js @@ -0,0 +1,90 @@ +export default { + props: { + // 标题 + title: { + type: [String], + default: '' + }, + // 弹窗内容 + content: { + type: String, + default: '' + }, + // 确认文案 + confirmText: { + type: String, + default: '确认' + }, + // 取消文案 + cancelText: { + type: String, + default: '取消' + }, + // 是否显示确认按钮 + showConfirmButton: { + type: Boolean, + default: true + }, + // 是否显示取消按钮 + showCancelButton: { + type: Boolean, + default: false + }, + // 确认按钮颜色 + confirmColor: { + type: String, + default: '#2979ff' + }, + // 取消文字颜色 + cancelColor: { + type: String, + default: '#606266' + }, + // 对调确认和取消的位置 + buttonReverse: { + type: Boolean, + default: false + }, + // 是否开启缩放效果 + zoom: { + type: Boolean, + default: true + }, + // 层级 + zIndex: { + type: [String, Number], + default: 10075 + }, + // 是否异步关闭,只对确定按钮有效 + asyncClose: { + type: Boolean, + default: false + }, + // 是否允许点击遮罩关闭modal + closeOnClickOverlay: { + type: Boolean, + default: true + }, + // 给一个负的margin-top,往上偏移,避免和键盘重合的情况 + negativeTop: { + type: [String, Number], + default: 0 + }, + // modal宽度,不支持百分比,可以数值,px,rpx单位 + width: { + type: [String, Number], + default: '650rpx' + }, + // 文本对齐方式,默认left + align: { + type: String, + default: 'left' + }, + // 文本自定义样式 + textStyle: { + type: [Object, String], + default: '' + }, + ...uni.$uv?.props?.modal + } +} \ No newline at end of file diff --git a/uni_modules/uv-modal/components/uv-modal/uv-modal.vue b/uni_modules/uv-modal/components/uv-modal/uv-modal.vue new file mode 100644 index 0000000..4577b99 --- /dev/null +++ b/uni_modules/uv-modal/components/uv-modal/uv-modal.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/uni_modules/uv-modal/package.json b/uni_modules/uv-modal/package.json new file mode 100644 index 0000000..2a815c0 --- /dev/null +++ b/uni_modules/uv-modal/package.json @@ -0,0 +1,90 @@ +{ + "id": "uv-modal", + "displayName": "uv-modal 模态框 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.11", + "description": "支持自定义内容,与uniapp提供的API uni.showModal类似,但是功能更强大,更加灵活", + "keywords": [ + "uv-modal", + "uvui", + "uv-ui", + "modal", + "模态框" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-popup", + "uv-line", + "uv-loading-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-modal/readme.md b/uni_modules/uv-modal/readme.md new file mode 100644 index 0000000..e1aec02 --- /dev/null +++ b/uni_modules/uv-modal/readme.md @@ -0,0 +1,23 @@ +## Modal 模态框 + +> **组件名:uv-modal** + +弹出模态框,常用于消息提示、消息确认、在当前页面内完成特定的交互操作。 + +特性:支持自定义内容,与uniapp提供的API `uni.showModal` 类似,但是功能更强大,更加灵活。 + +运用场景:弹窗验证码输入等场景 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-navbar/changelog.md b/uni_modules/uv-navbar/changelog.md new file mode 100644 index 0000000..01cc4fd --- /dev/null +++ b/uni_modules/uv-navbar/changelog.md @@ -0,0 +1,17 @@ +## 1.0.7(2023-08-16) +1. 修复ios可能存在点击返回按钮点不到的情况 +## 1.0.6(2023-08-07) +1. 修复nvue在ios端可能存在背景图样式错乱的BUG +## 1.0.5(2023-08-04) +1. bgColor设置背景图片,增加imgMode属性 +## 1.0.4(2023-08-01) +1. bgColor属性支持背景图片,在线图片或base64图片都可以 +## 1.0.3(2023-07-03) +去除插槽判断,避免某些平台不显示的BUG +## 1.0.2(2023-06-05) +1. 兼容渐变背景色 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-navbar 自定义导航栏 diff --git a/uni_modules/uv-navbar/components/uv-navbar/props.js b/uni_modules/uv-navbar/components/uv-navbar/props.js new file mode 100644 index 0000000..47fe150 --- /dev/null +++ b/uni_modules/uv-navbar/components/uv-navbar/props.js @@ -0,0 +1,89 @@ +export default { + props: { + // 是否开启顶部安全区适配 + safeAreaInsetTop: { + type: Boolean, + default: true + }, + // 固定在顶部时,是否生成一个等高元素,以防止塌陷 + placeholder: { + type: Boolean, + default: false + }, + // 是否固定在顶部 + fixed: { + type: Boolean, + default: true + }, + // 是否显示下边框 + border: { + type: Boolean, + default: false + }, + // 左边的图标 + leftIcon: { + type: String, + default: 'arrow-left' + }, + // 左边的提示文字 + leftText: { + type: String, + default: '' + }, + // 左右的提示文字 + rightText: { + type: String, + default: '' + }, + // 右边的图标 + rightIcon: { + type: String, + default: '' + }, + // 标题 + title: { + type: [String, Number], + default: '' + }, + // 背景颜色 + bgColor: { + type: String, + default: '#ffffff' + }, + imgMode: { + type: String, + default: 'aspectFill' + }, + // 标题的宽度 + titleWidth: { + type: [String, Number], + default: '400rpx' + }, + // 导航栏高度 + height: { + type: [String, Number], + default: '44px' + }, + // 左侧返回图标的大小 + leftIconSize: { + type: [String, Number], + default: 20 + }, + // 左侧返回图标的颜色 + leftIconColor: { + type: String, + default: '#303133' + }, + // 点击左侧区域(返回图标),是否自动返回上一页 + autoBack: { + type: Boolean, + default: false + }, + // 标题的样式,对象或字符串 + titleStyle: { + type: [String, Object], + default: '' + }, + ...uni.$uv?.props?.navbar + } +} \ No newline at end of file diff --git a/uni_modules/uv-navbar/components/uv-navbar/uv-navbar.vue b/uni_modules/uv-navbar/components/uv-navbar/uv-navbar.vue new file mode 100644 index 0000000..a46ad7a --- /dev/null +++ b/uni_modules/uv-navbar/components/uv-navbar/uv-navbar.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/uni_modules/uv-navbar/package.json b/uni_modules/uv-navbar/package.json new file mode 100644 index 0000000..8d429de --- /dev/null +++ b/uni_modules/uv-navbar/package.json @@ -0,0 +1,89 @@ +{ + "id": "uv-navbar", + "displayName": "uv-navbar 自定义导航栏 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.7", + "description": "uv-navbar 此组件一般用于在特殊情况下,需要自定义导航栏的时候用到,一般建议使用自带的原生导航栏。", + "keywords": [ + "uv-navbar", + "uvui", + "uv-ui", + "navbar", + "自定义导航栏" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon", + "uv-status-bar" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-navbar/readme.md b/uni_modules/uv-navbar/readme.md new file mode 100644 index 0000000..412ea7b --- /dev/null +++ b/uni_modules/uv-navbar/readme.md @@ -0,0 +1,19 @@ +## Navbar 自定义导航栏 + +> **组件名:uv-navbar** + +此组件一般用于在特殊情况下,需要自定义导航栏的时候用到,一般建议使用自带的原生导航栏,支持渐变色、透明色、图片背景。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-no-network/changelog.md b/uni_modules/uv-no-network/changelog.md new file mode 100644 index 0000000..b6fc0ed --- /dev/null +++ b/uni_modules/uv-no-network/changelog.md @@ -0,0 +1,5 @@ +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-no-network 无网络提示 diff --git a/uni_modules/uv-no-network/components/uv-no-network/props.js b/uni_modules/uv-no-network/components/uv-no-network/props.js new file mode 100644 index 0000000..595b1fc --- /dev/null +++ b/uni_modules/uv-no-network/components/uv-no-network/props.js @@ -0,0 +1,20 @@ +export default { + props: { + // 页面文字提示 + tips: { + type: String, + default: '哎呀,网络信号丢失' + }, + // 一个z-index值,用于设置没有网络这个组件的层次,因为页面可能会有其他定位的元素层级过高,导致此组件被覆盖 + zIndex: { + type: [String, Number], + default: '' + }, + // image 没有网络的图片提示 + image: { + type: String, + default: 'data:image/png;base64,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' + }, + ...uni.$uv?.props?.noNetwork + } +} \ No newline at end of file diff --git a/uni_modules/uv-no-network/components/uv-no-network/uv-no-network.vue b/uni_modules/uv-no-network/components/uv-no-network/uv-no-network.vue new file mode 100644 index 0000000..5f134fa --- /dev/null +++ b/uni_modules/uv-no-network/components/uv-no-network/uv-no-network.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/uni_modules/uv-no-network/package.json b/uni_modules/uv-no-network/package.json new file mode 100644 index 0000000..cb48aa9 --- /dev/null +++ b/uni_modules/uv-no-network/package.json @@ -0,0 +1,90 @@ +{ + "id": "uv-no-network", + "displayName": "uv-no-network 无网络提示 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.1", + "description": "uv-no-network 该组件在没有任何网络的情况下,显示在内容上方,无需任何配置,引入即可,内部自动处理所有功能和事件。", + "keywords": [ + "uv-no-network", + "uvui", + "uv-ui", + "network", + "无网络" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-overlay", + "uv-icon", + "uv-button" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-no-network/readme.md b/uni_modules/uv-no-network/readme.md new file mode 100644 index 0000000..0e4a1a2 --- /dev/null +++ b/uni_modules/uv-no-network/readme.md @@ -0,0 +1,11 @@ +## NoNetwork 无网络提示 + +> **组件名:uv-no-network** + +该组件在没有任何网络的情况下,显示在内容上方,无需任何配置,引入即可,内部自动处理所有功能和事件。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-notice-bar/changelog.md b/uni_modules/uv-notice-bar/changelog.md new file mode 100644 index 0000000..cdfec7d --- /dev/null +++ b/uni_modules/uv-notice-bar/changelog.md @@ -0,0 +1,19 @@ +## 1.0.7(2023-10-13) +1. unmounted兼容vue3 +## 1.0.6(2023-08-03) +1. 竖向滚动时候增加change回调 +## 1.0.5(2023-07-21) +1. 增加icon类型,支持设置false不显示图标 +2. 优化文档 +## 1.0.4(2023-07-03) +1. 增加disableScroll 属性,禁止自动滚动 +2. 优化文档 +## 1.0.3(2023-06-04) +1. 修复text传值为null报错的问题 +## 1.0.2(2023-05-30) +1. 修复error报错的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-notice-bar 滚动通知 diff --git a/uni_modules/uv-notice-bar/components/uv-column-notice/props.js b/uni_modules/uv-notice-bar/components/uv-column-notice/props.js new file mode 100644 index 0000000..d93917c --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-column-notice/props.js @@ -0,0 +1,61 @@ +export default { + props: { + // 显示的内容,字符串 + text: { + type: [Array], + default: '' + }, + // 是否显示左侧的音量图标 + icon: { + type: [String, Boolean, null], + default: 'volume' + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: '' + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: '#f9ae3d' + }, + // 背景颜色 + bgColor: { + type: String, + default: '#fdf6ec' + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: 14 + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: 80 + }, + // direction = row时,是否使用步进形式滚动 + step: { + type: Boolean, + default: false + }, + // 滚动一个周期的时间长,单位ms + duration: { + type: [String, Number], + default: 1500 + }, + // 是否禁止用手滑动切换,仅`direction="column"生效` + // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 + disableTouch: { + type: Boolean, + default: true + }, + // 是否禁止滚动,仅`direction="column"生效` + disableScroll: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.columnNotice + } +} \ No newline at end of file diff --git a/uni_modules/uv-notice-bar/components/uv-column-notice/uv-column-notice.vue b/uni_modules/uv-notice-bar/components/uv-column-notice/uv-column-notice.vue new file mode 100644 index 0000000..73c6bfc --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-column-notice/uv-column-notice.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/uni_modules/uv-notice-bar/components/uv-notice-bar/props.js b/uni_modules/uv-notice-bar/components/uv-notice-bar/props.js new file mode 100644 index 0000000..3fe0b44 --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-notice-bar/props.js @@ -0,0 +1,76 @@ +export default { + props: { + // 显示的内容,数组 + text: { + type: [Array, String], + default: () => [] + }, + // 通告滚动模式,row-横向滚动,column-竖向滚动 + direction: { + type: String, + default: 'row' + }, + // direction = row时,是否使用步进形式滚动 + step: { + type: Boolean, + default: false + }, + // 是否显示左侧的音量图标 + icon: { + type: [String, Boolean, null], + default: 'volume' + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: '' + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: '#f9ae3d' + }, + // 背景颜色 + bgColor: { + type: String, + default: '#fdf6ec' + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: 80 + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 14 + }, + // 滚动一个周期的时间长,单位ms + duration: { + type: [String, Number], + default: 2000 + }, + // 跳转的页面路径 + url: { + type: String, + default: '' + }, + // 页面跳转的类型 + linkType: { + type: String, + default: 'navigateTo' + }, + // 是否禁止用手滑动切换 + // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 + disableTouch: { + type: Boolean, + default: true + }, + // 是否禁止滚动,仅`direction="column"生效` + disableScroll: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.noticeBar + } +} \ No newline at end of file diff --git a/uni_modules/uv-notice-bar/components/uv-notice-bar/uv-notice-bar.vue b/uni_modules/uv-notice-bar/components/uv-notice-bar/uv-notice-bar.vue new file mode 100644 index 0000000..14dd7c5 --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-notice-bar/uv-notice-bar.vue @@ -0,0 +1,110 @@ + + + + diff --git a/uni_modules/uv-notice-bar/components/uv-row-notice/props.js b/uni_modules/uv-notice-bar/components/uv-row-notice/props.js new file mode 100644 index 0000000..cba1823 --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-row-notice/props.js @@ -0,0 +1,40 @@ +export default { + props: { + // 显示的内容,字符串 + text: { + type: String, + default: '' + }, + // 是否显示左侧的音量图标 + icon: { + type: [String, Boolean, null], + default: 'volume' + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: '' + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: '#f9ae3d' + }, + // 背景颜色 + bgColor: { + type: String, + default: '#fdf6ec' + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: 14 + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(rpx),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: 80 + }, + ...uni.$uv?.props?.rowNotice + } +} \ No newline at end of file diff --git a/uni_modules/uv-notice-bar/components/uv-row-notice/uv-row-notice.vue b/uni_modules/uv-notice-bar/components/uv-row-notice/uv-row-notice.vue new file mode 100644 index 0000000..16117dd --- /dev/null +++ b/uni_modules/uv-notice-bar/components/uv-row-notice/uv-row-notice.vue @@ -0,0 +1,341 @@ + + + + diff --git a/uni_modules/uv-notice-bar/package.json b/uni_modules/uv-notice-bar/package.json new file mode 100644 index 0000000..f1bca29 --- /dev/null +++ b/uni_modules/uv-notice-bar/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-notice-bar", + "displayName": "uv-notice-bar 滚动通知 全面兼容vue3+2、app、h5、小程序等多端", + "version": "1.0.7", + "description": "uv-notice-bar 该组件用于滚动通告场景,有多种模式可供选择。", + "keywords": [ + "uv-notice-bar", + "uvui", + "uv-ui", + "notice", + "滚动公告" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-notice-bar/readme.md b/uni_modules/uv-notice-bar/readme.md new file mode 100644 index 0000000..61eb131 --- /dev/null +++ b/uni_modules/uv-notice-bar/readme.md @@ -0,0 +1,19 @@ +## NoticeBar 滚动通知 + +> **组件名:uv-notice-bar** + +该组件用于滚动通告场景,有多种模式可供选择。灵活配置,开箱即用。 + +# 查看文档 + +## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP) + +### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui) + + + +![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png) + + + +#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群 \ No newline at end of file diff --git a/uni_modules/uv-notify/changelog.md b/uni_modules/uv-notify/changelog.md new file mode 100644 index 0000000..5d818ba --- /dev/null +++ b/uni_modules/uv-notify/changelog.md @@ -0,0 +1,9 @@ +## 1.0.3(2023-10-13) +1. unmounted兼容vue3 +## 1.0.2(2023-07-02) +uv-notify 由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/notify.html +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-notify 消息提示 diff --git a/uni_modules/uv-notify/components/uv-notify/props.js b/uni_modules/uv-notify/components/uv-notify/props.js new file mode 100644 index 0000000..5728276 --- /dev/null +++ b/uni_modules/uv-notify/components/uv-notify/props.js @@ -0,0 +1,45 @@ +export default { + props: { + // 到顶部的距离 + top: { + type: [String, Number], + default: 0 + }, + // type主题,primary,success,warning,error + type: { + type: String, + default: 'primary' + }, + // 字体颜色 + color: { + type: String, + default: '#ffffff' + }, + // 背景颜色 + bgColor: { + type: String, + default: '' + }, + // 展示的文字内容 + message: { + type: String, + default: '' + }, + // 展示时长,为0时不消失,单位ms + duration: { + type: [String, Number], + default: 3000 + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 15 + }, + // 是否留出顶部安全距离(状态栏高度) + safeAreaInsetTop: { + type: Boolean, + default: false + }, + ...uni.$uv?.props?.notify + } +} \ No newline at end of file diff --git a/uni_modules/uv-notify/components/uv-notify/uv-notify.vue b/uni_modules/uv-notify/components/uv-notify/uv-notify.vue new file mode 100644 index 0000000..96c1566 --- /dev/null +++ b/uni_modules/uv-notify/components/uv-notify/uv-notify.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/uni_modules/uv-notify/package.json b/uni_modules/uv-notify/package.json new file mode 100644 index 0000000..921949b --- /dev/null +++ b/uni_modules/uv-notify/package.json @@ -0,0 +1,90 @@ +{ + "id": "uv-notify", + "displayName": "uv-notify 消息提示 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.3", + "description": "uv-notify 该组件一般用于页面顶部向下滑出一个提示,后自动收起的场景。", + "keywords": [ + "uv-notify", + "uvui", + "uv-ui", + "notify", + "消息提示" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-status-bar", + "uv-overlay", + "uv-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-notify/readme.md b/uni_modules/uv-notify/readme.md new file mode 100644 index 0000000..482344a --- /dev/null +++ b/uni_modules/uv-notify/readme.md @@ -0,0 +1,11 @@ +## Notify 消息提示 + +> **组件名:uv-notify** + +该组件一般用于页面顶部向下滑出一个提示,后自动收起的场景。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-number-box/changelog.md b/uni_modules/uv-number-box/changelog.md new file mode 100644 index 0000000..3f07995 --- /dev/null +++ b/uni_modules/uv-number-box/changelog.md @@ -0,0 +1,7 @@ +## 1.0.2(2023-07-13) +1. 修复 uv-number-box设置value属性不生效的BUG +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-number-box 步进器 diff --git a/uni_modules/uv-number-box/components/uv-number-box/props.js b/uni_modules/uv-number-box/components/uv-number-box/props.js new file mode 100644 index 0000000..64b633b --- /dev/null +++ b/uni_modules/uv-number-box/components/uv-number-box/props.js @@ -0,0 +1,113 @@ +export default { + props: { + value: { + type: [String, Number], + default: 0 + }, + modelValue: { + type: [String, Number], + default: 0 + }, + // 步进器标识符,在change回调返回 + name: { + type: [String, Number], + default: '' + }, + // 最小值 + min: { + type: [String, Number], + default: 1 + }, + // 最大值 + max: { + type: [String, Number], + default: Number.MAX_SAFE_INTEGER + }, + // 加减的步长,可为小数 + step: { + type: [String, Number], + default: 1 + }, + // 是否只允许输入整数 + integer: { + type: Boolean, + default: false + }, + // 是否禁用,包括输入框,加减按钮 + disabled: { + type: Boolean, + default: false + }, + // 是否禁用输入框 + disabledInput: { + type: Boolean, + default: false + }, + // 是否开启异步变更,开启后需要手动控制输入值 + asyncChange: { + type: Boolean, + default: false + }, + // 输入框宽度,单位为px + inputWidth: { + type: [String, Number], + default: 35 + }, + // 是否显示减少按钮 + showMinus: { + type: Boolean, + default: true + }, + // 是否显示增加按钮 + showPlus: { + type: Boolean, + default: true + }, + // 显示的小数位数 + decimalLength: { + type: [String, Number, null], + default: null + }, + // 是否开启长按加减手势 + longPress: { + type: Boolean, + default: true + }, + // 输入框文字和加减按钮图标的颜色 + color: { + type: String, + default: '#323233' + }, + // 按钮大小,宽高等于此值,单位px,输入框高度和此值保持一致 + buttonSize: { + type: [String, Number], + default: 30 + }, + // 输入框和按钮的背景颜色 + bgColor: { + type: String, + default: '#EBECEE' + }, + // 指定光标于键盘的距离,避免键盘遮挡输入框,单位px + cursorSpacing: { + type: [String, Number], + default: 100 + }, + // 是否禁用增加按钮 + disablePlus: { + type: Boolean, + default: false + }, + // 是否禁用减少按钮 + disableMinus: { + type: Boolean, + default: false + }, + // 加减按钮图标的样式 + iconStyle: { + type: [Object, String], + default: '' + }, + ...uni.$uv?.props?.numberBox + } +} \ No newline at end of file diff --git a/uni_modules/uv-number-box/components/uv-number-box/uv-number-box.vue b/uni_modules/uv-number-box/components/uv-number-box/uv-number-box.vue new file mode 100644 index 0000000..6937e89 --- /dev/null +++ b/uni_modules/uv-number-box/components/uv-number-box/uv-number-box.vue @@ -0,0 +1,395 @@ + + + + \ No newline at end of file diff --git a/uni_modules/uv-number-box/package.json b/uni_modules/uv-number-box/package.json new file mode 100644 index 0000000..771e6eb --- /dev/null +++ b/uni_modules/uv-number-box/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-number-box", + "displayName": "uv-number-box 步进器 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.2", + "description": "uv-number-box 该组件一般用于商城购物选择物品数量的场景。", + "keywords": [ + "uv-number-box", + "uvui", + "uv-ui", + "number", + "步进器" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-icon" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-number-box/readme.md b/uni_modules/uv-number-box/readme.md new file mode 100644 index 0000000..6b83da9 --- /dev/null +++ b/uni_modules/uv-number-box/readme.md @@ -0,0 +1,11 @@ +## NumberBox 步进器 + +> **组件名:uv-number-box** + +该组件一般用于商城购物选择物品数量的场景。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-overlay/changelog.md b/uni_modules/uv-overlay/changelog.md new file mode 100644 index 0000000..ff14713 --- /dev/null +++ b/uni_modules/uv-overlay/changelog.md @@ -0,0 +1,9 @@ +## 1.0.3(2023-07-02) +uv-overlay 由于弹出层uv-transition的修改,组件内部做了相应的修改,参数不变。 +## 1.0.2(2023-06-29) +1. 优化,H5端禁止穿透滚动 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +1. 新增uv-overlay组件 diff --git a/uni_modules/uv-overlay/components/uv-overlay/props.js b/uni_modules/uv-overlay/components/uv-overlay/props.js new file mode 100644 index 0000000..267c613 --- /dev/null +++ b/uni_modules/uv-overlay/components/uv-overlay/props.js @@ -0,0 +1,25 @@ +export default { + props: { + // 是否显示遮罩 + show: { + type: Boolean, + default: false + }, + // 层级z-index + zIndex: { + type: [String, Number], + default: 10070 + }, + // 遮罩的过渡时间,单位为ms + duration: { + type: [String, Number], + default: 300 + }, + // 不透明度值,当做rgba的第四个参数 + opacity: { + type: [String, Number], + default: 0.5 + }, + ...uni.$uv?.props?.overlay + } +} \ No newline at end of file diff --git a/uni_modules/uv-overlay/components/uv-overlay/uv-overlay.vue b/uni_modules/uv-overlay/components/uv-overlay/uv-overlay.vue new file mode 100644 index 0000000..53568c0 --- /dev/null +++ b/uni_modules/uv-overlay/components/uv-overlay/uv-overlay.vue @@ -0,0 +1,85 @@ + + + + diff --git a/uni_modules/uv-overlay/package.json b/uni_modules/uv-overlay/package.json new file mode 100644 index 0000000..a664f3a --- /dev/null +++ b/uni_modules/uv-overlay/package.json @@ -0,0 +1,88 @@ +{ + "id": "uv-overlay", + "displayName": "uv-overlay 遮罩层 全面兼容小程序、nvue、vue2、vue3等多端", + "version": "1.0.3", + "description": "uv-overlay 创建一个遮罩层,用于强调特定的页面元素,并阻止用户对遮罩下层的内容进行操作,一般用于弹窗场景,uv-popup、uv-toast、uv-tooltip等组件就是用了该组件。", + "keywords": [ + "uv-overlay", + "uvui", + "uv-ui", + "overlay", + "遮罩层" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uv-ui-tools", + "uv-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uv-overlay/readme.md b/uni_modules/uv-overlay/readme.md new file mode 100644 index 0000000..4e8af4b --- /dev/null +++ b/uni_modules/uv-overlay/readme.md @@ -0,0 +1,11 @@ +## Overlay 遮罩层 + +> **组件名:uv-overlay** + +创建一个遮罩层,用于强调特定的页面元素,并阻止用户对遮罩下层的内容进行操作,一般用于弹窗场景,uv-popup、uv-toast、uv-tooltip等组件就是用了该组件。 + +### 查看文档 + +### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui) + +#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:uv-ui官方QQ群 diff --git a/uni_modules/uv-parse/changelog.md b/uni_modules/uv-parse/changelog.md new file mode 100644 index 0000000..4575e07 --- /dev/null +++ b/uni_modules/uv-parse/changelog.md @@ -0,0 +1,13 @@ +## 1.0.4(2023-07-17) +1. 优化文档 +2. 优化其他 +## 1.0.3(2023-06-19) +1. 修复nvue模式下不显示的BUG +## 1.0.2(2023-06-02) +1. 修复可能存在的BUG +2. 优化 +## 1.0.1(2023-05-16) +1. 优化组件依赖,修改后无需全局引入,组件导入即可使用 +2. 优化部分功能 +## 1.0.0(2023-05-10) +uv-parse 富文本解析器 diff --git a/uni_modules/uv-parse/components/uv-parse/node/node.vue b/uni_modules/uv-parse/components/uv-parse/node/node.vue new file mode 100644 index 0000000..5857077 --- /dev/null +++ b/uni_modules/uv-parse/components/uv-parse/node/node.vue @@ -0,0 +1,576 @@ +