diff --git a/api/index.js b/api/index.js
index 02863d0..e789c9d 100644
--- a/api/index.js
+++ b/api/index.js
@@ -78,3 +78,12 @@ export const getRegion = data => {
data
})
}
+
+/** 用户积分排行榜 */
+export const getUserIntegralRank = data => {
+ return http({
+ url: '/api/system/userPoints/list',
+ method: 'get',
+ data
+ })
+}
diff --git a/components/nav-bar/nav-bar.vue b/components/nav-bar/nav-bar.vue
index a5e8b4e..b163375 100644
--- a/components/nav-bar/nav-bar.vue
+++ b/components/nav-bar/nav-bar.vue
@@ -1,23 +1,90 @@
-
+
@@ -58,6 +140,7 @@
+
@@ -70,10 +153,6 @@
z-index: 99;
}
- .nav-bar_bg {
- background: #ffffff;
- }
-
.top_left-icon {
height: 36rpx;
}
diff --git a/pages.json b/pages.json
index 1308fd7..0a82779 100644
--- a/pages.json
+++ b/pages.json
@@ -59,6 +59,41 @@
"backgroundColor": "#f7f7f7"
}
},
+ {
+ "path": "pages/my-index/personal-center/index",
+ "style": {
+ "navigationBarTitleText": "个人中心",
+ "navigationBarBackgroundColor": "#ffffff"
+ }
+ },
+ {
+ "path": "pages/my-index/wallet/index",
+ "style": {
+ "navigationBarTitleText": "钱包",
+ "navigationBarBackgroundColor": "#ffffff"
+ }
+ },
+ {
+ "path": "pages/my-index/wallet/edit-password",
+ "style": {
+ "navigationBarTitleText": "修改钱包密码",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/my-index/wallet/bank-card/index",
+ "style": {
+ "navigationBarTitleText": "提现卡",
+ "navigationBarBackgroundColor": "#ffffff"
+ }
+ },
+ {
+ "path": "pages/my-index/wallet/bank-card/card-details",
+ "style": {
+ "navigationBarTitleText": "卡信息增删改查",
+ "navigationStyle": "custom"
+ }
+ },
{
"path": "pages/mall/list",
"style": {
@@ -128,6 +163,19 @@
"navigationBarTitleText": "签到",
"navigationStyle": "custom"
}
+ },
+ {
+ "path": "pages/discover/dynamic/dynamic",
+ "style": {
+ "navigationBarTitleText": "朋友圈",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/discover/company",
+ "style": {
+ "navigationBarTitleText": "公司介绍"
+ }
}
],
"globalStyle": {
diff --git a/pages/discover/company.vue b/pages/discover/company.vue
new file mode 100644
index 0000000..b5c4957
--- /dev/null
+++ b/pages/discover/company.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+ 名字
+
+
+
+ 富文本
+
+
+
+
+
diff --git a/pages/discover/discover.vue b/pages/discover/discover.vue
index 688bec7..8dccea2 100644
--- a/pages/discover/discover.vue
+++ b/pages/discover/discover.vue
@@ -20,6 +20,14 @@
navigateTo('/pages/discover/punch')
return
}
+ if (item === 'company') {
+ navigateTo('/pages/discover/company')
+ return
+ }
+ if (item === 'circle') {
+ navigateTo('/pages/discover/dynamic/dynamic')
+ return
+ }
if (item === 'mall') {
navigateTo('/pages/mall/list')
return
diff --git a/pages/discover/dynamic/dynamic.vue b/pages/discover/dynamic/dynamic.vue
new file mode 100644
index 0000000..5f74b8d
--- /dev/null
+++ b/pages/discover/dynamic/dynamic.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 名字
+
+
+
+
+
+
+
+
+
+ 名字
+ 这是一条朋友圈的标题
+
+
+
+
+
+ 19分钟前
+ 重庆市渝北xxx寄街道
+
+
+
+
+
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/discover/punch.vue b/pages/discover/punch.vue
index 0c0521b..f0a3c99 100644
--- a/pages/discover/punch.vue
+++ b/pages/discover/punch.vue
@@ -1,4 +1,15 @@
-
+
@@ -12,20 +23,130 @@
+
+
+
+ 每日签到领积分
+
+ 已连续签到
+ 05
+ 天
+
+
+
+
+
+
+
+ +10
+
+ 今天
+
+
diff --git a/pages/discover/ranking-list.vue b/pages/discover/ranking-list.vue
index f7c30e0..34e3e95 100644
--- a/pages/discover/ranking-list.vue
+++ b/pages/discover/ranking-list.vue
@@ -1,8 +1,36 @@
-
+
-
+
@@ -69,14 +97,14 @@
class="left-icon"
>
- 张三
+ 名字
158****98874
- 100
+ {{ item.totalPoints }}
diff --git a/pages/discover/styles/dynamic.scss b/pages/discover/styles/dynamic.scss
new file mode 100644
index 0000000..4cd29c0
--- /dev/null
+++ b/pages/discover/styles/dynamic.scss
@@ -0,0 +1,126 @@
+.top-bg-img {
+ width: 100%;
+ height: 544rpx;
+ position: relative;
+ .img {
+ width: 100%;
+ height: 100%;
+ }
+ .user-info {
+ position: absolute;
+ right: 24rpx;
+ bottom: -60rpx;
+ display: flex;
+ align-items: flex-start;
+ text {
+ margin-top: 30rpx;
+ font-family: PingFang SC, PingFang SC;
+ font-weight: 600;
+ font-size: 32rpx;
+ color: #ffffff;
+ font-style: normal;
+ text-transform: none;
+ }
+ .avatar {
+ width: 160rpx;
+ height: 160rpx;
+ border-radius: 16rpx;
+ margin-left: 30rpx;
+ }
+ }
+}
+
+.dynamic-list {
+ padding: 86rpx 26rpx 0 26rpx;
+ .list + .list {
+ margin-top: 32rpx;
+ }
+ .list {
+ display: flex;
+ .avatar {
+ width: 96rpx;
+ height: 96rpx;
+ border-radius: 96rpx;
+ flex-shrink: 0;
+ margin-right: 32rpx;
+ }
+ .content {
+ width: 100%;
+ font-family: PingFang SC, PingFang SC;
+ text-align: left;
+ font-style: normal;
+ text-transform: none;
+ display: flex;
+ flex-direction: column;
+ .name {
+ font-weight: bold;
+ font-size: 32rpx;
+ color: #333333;
+ }
+ .text {
+ font-weight: 500;
+ font-size: 28rpx;
+ color: #333333;
+ margin: 16rpx 0;
+ }
+ .img-list {
+ .item-img {
+ width: 410rpx;
+ height: 250rpx;
+ border-radius: 8rpx;
+ }
+ }
+ .address {
+ display: flex;
+ align-items: center;
+ margin: 16rpx 0 14rpx;
+ text {
+ font-weight: 500;
+ font-size: 24rpx;
+ color: #999999;
+ margin-right: 16rpx;
+ &:last-child {
+ font-size: 24rpx;
+ color: #0c587e;
+ }
+ }
+ }
+ .like-box {
+ display: flex;
+ align-items: center;
+ .like {
+ display: flex;
+ align-items: center;
+ margin-right: 86rpx;
+ text {
+ font-weight: 400;
+ font-size: 22rpx;
+ color: #747474;
+ }
+ }
+ }
+ .comment {
+ margin-top: 16rpx;
+ padding: 16rpx 18rpx;
+ background: #f9f9f9;
+ border-radius: 8rpx;
+ .comment-item + .comment-item {
+ margin-top: 16rpx;
+ }
+ .comment-item {
+ text {
+ font-weight: 400;
+ font-size: 28rpx;
+ color: #333333;
+ margin-right: 8rpx;
+ &:last-child {
+ font-weight: 500;
+ font-size: 28rpx;
+ color: #999999;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/pages/discover/styles/index.scss b/pages/discover/styles/index.scss
index 1d7dfc2..384a3cc 100644
--- a/pages/discover/styles/index.scss
+++ b/pages/discover/styles/index.scss
@@ -13,6 +13,27 @@
background: #ffffff;
border-radius: 32rpx 32rpx 0rpx 0rpx;
}
+ .integral-box {
+ width: 354rpx;
+ height: 166rpx;
+ position: absolute;
+ bottom: 82rpx;
+ left: 48rpx;
+ font-family: PingFang SC, PingFang SC;
+ color: #ffffff;
+ font-weight: bold;
+ font-style: normal;
+ text-transform: none;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ text {
+ font-size: 32rpx;
+ &:last-child {
+ font-size: 100rpx;
+ }
+ }
+ }
.left-icon {
width: 354rpx;
height: 166rpx;
diff --git a/pages/my-index/components/card-input.vue b/pages/my-index/components/card-input.vue
new file mode 100644
index 0000000..1e5c8ff
--- /dev/null
+++ b/pages/my-index/components/card-input.vue
@@ -0,0 +1,72 @@
+
+
+
+
+ {{ props.title }}
+
+
+
+
+
diff --git a/pages/my-index/my-index.vue b/pages/my-index/my-index.vue
index e9cff91..9dd662a 100644
--- a/pages/my-index/my-index.vue
+++ b/pages/my-index/my-index.vue
@@ -1,8 +1,14 @@
-
+
账户积分
- 2933
+ {{ userInfo?.totalPoints }}
@@ -50,6 +64,7 @@
v-for="(item, index) in bottomList"
:key="index"
class="item-box"
+ @click="item.url && navigateTo(item.url)"
>
+ import { useAuthUser } from '@/composables/useAuthUser'
+
+ const itemList = [
+ { title: '我的二维码', key: '1', value: '' },
+ { title: 'ID', key: '2', value: 'userId' },
+ { title: '昵称', key: '3', value: 'userName' },
+ { title: '性别', key: '4', value: '' },
+ { title: '手机号码', key: '5', value: 'mobile' },
+ { title: '个性签名', key: '6', value: '' }
+ ]
+
+ const { userInfo } = useAuthUser()
+
+
+
+
+
+
+
+
+
+ 换头像
+
+
+
+
+
+
+ {{ item.title }}
+
+ 这个人很懒,什么也没有
+
+
+
+
+ {{ item.value ? userInfo[item.value] : '' }}
+
+
+
+
+
+
+
+
diff --git a/pages/my-index/styles/index.scss b/pages/my-index/styles/index.scss
new file mode 100644
index 0000000..004e980
--- /dev/null
+++ b/pages/my-index/styles/index.scss
@@ -0,0 +1,70 @@
+page {
+ background: #f9f9f9;
+}
+
+.public-card + .public-card {
+ margin-top: 16rpx;
+}
+
+.public-card {
+ background: #ffffff;
+ border-radius: 16rpx;
+ padding: 20rpx 32rpx;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-family: PingFang SC, PingFang SC;
+ font-style: normal;
+ text-transform: none;
+
+ .left-box,
+ .left-img,
+ .right-box {
+ display: flex;
+ align-items: center;
+ }
+ .left-img {
+ .avatar {
+ width: 96rpx;
+ height: 96rpx;
+ border-radius: 96rpx;
+ margin-right: 16rpx;
+ }
+ .card {
+ width: 48rpx;
+ height: 48rpx;
+ margin-right: 16rpx;
+ }
+ text {
+ font-weight: 500;
+ font-size: 28rpx;
+ color: #333333;
+ }
+ }
+
+ .left-box {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ width: 70%;
+ text {
+ font-weight: 600;
+ font-size: 28rpx;
+ color: #333333;
+ }
+ .text {
+ margin-top: 8rpx;
+ font-size: 24rpx;
+ color: #999999;
+ }
+ }
+ .right-box {
+ align-items: flex-end;
+ .value {
+ font-weight: 600;
+ font-size: 28rpx;
+ color: #999999;
+ margin-right: 6rpx;
+ }
+ }
+}
diff --git a/pages/my-index/wallet/bank-card/card-details.vue b/pages/my-index/wallet/bank-card/card-details.vue
new file mode 100644
index 0000000..3e9cff5
--- /dev/null
+++ b/pages/my-index/wallet/bank-card/card-details.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/my-index/wallet/bank-card/index.vue b/pages/my-index/wallet/bank-card/index.vue
new file mode 100644
index 0000000..022e00f
--- /dev/null
+++ b/pages/my-index/wallet/bank-card/index.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+ +添加银行卡
+
+
+
+
+
diff --git a/pages/my-index/wallet/edit-password.vue b/pages/my-index/wallet/edit-password.vue
new file mode 100644
index 0000000..1cc82be
--- /dev/null
+++ b/pages/my-index/wallet/edit-password.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+ 确认
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/my-index/wallet/index.vue b/pages/my-index/wallet/index.vue
new file mode 100644
index 0000000..6b241c0
--- /dev/null
+++ b/pages/my-index/wallet/index.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+ 我的资产
+ 2222
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
diff --git a/static/images/discover/bean.png b/static/images/discover/bean.png
new file mode 100644
index 0000000..3da802d
Binary files /dev/null and b/static/images/discover/bean.png differ
diff --git a/static/images/discover/calendar.png b/static/images/discover/calendar.png
new file mode 100644
index 0000000..83999dc
Binary files /dev/null and b/static/images/discover/calendar.png differ
diff --git a/static/images/my-index/wallet-bg.png b/static/images/my-index/wallet-bg.png
new file mode 100644
index 0000000..e377016
Binary files /dev/null and b/static/images/my-index/wallet-bg.png differ
diff --git a/static/images/my-index/wx.png b/static/images/my-index/wx.png
new file mode 100644
index 0000000..16cbde8
Binary files /dev/null and b/static/images/my-index/wx.png differ
diff --git a/static/images/my-index/zfb.png b/static/images/my-index/zfb.png
new file mode 100644
index 0000000..9b25b29
Binary files /dev/null and b/static/images/my-index/zfb.png differ
diff --git a/uni_modules/uni-popup/changelog.md b/uni_modules/uni-popup/changelog.md
new file mode 100644
index 0000000..c72474a
--- /dev/null
+++ b/uni_modules/uni-popup/changelog.md
@@ -0,0 +1,102 @@
+## 1.9.11(2025-08-20)
+- 修复 uni-popup-dialog组件设置 borderRadius 不生效的 Bug
+## 1.9.10(2025-07-18)
+- 修复 nvue 下弹窗样式错乱的问题 ,更新依赖 uni-transition 组件
+- 更新 示例取消 borderRadius 属性 ,如需内容圆角,用户应该直接在内容插槽中实现
+## 1.9.9(2025-06-11)
+- 修复 uni-popup-dialog 中 setVal 方法报错的问题
+- 修复 uni-popup-dialog 数据双向绑定问题。
+## 1.9.8(2025-04-16)
+- 修复 更新组件示例 ,解决更新数据或保存项目导致弹窗消失的问题
+## 1.9.7(2025-04-14)
+- 修复 uni-popup-dialog 弹出框在vue3中双向绑定问题
+## 1.9.6(2025-01-08)
+- 修复 示例中过期图片地址
+## 1.9.5(2024-10-15)
+- 修复 微信小程序中的getSystemInfo警告
+## 1.9.2(2024-09-21)
+- 修复 uni-popup在android上的重复点击弹出位置不正确的bug
+## 1.9.1(2024-04-02)
+- 修复 uni-popup-dialog vue3下使用value无法进行绑定的bug(双向绑定兼容旧写法)
+## 1.9.0(2024-03-28)
+- 修复 uni-popup-dialog 双向绑定时初始化逻辑修正
+## 1.8.9(2024-03-20)
+- 修复 uni-popup-dialog 数据输入时修正为双向绑定
+## 1.8.8(2024-02-20)
+- 修复 uni-popup 在微信小程序下出现文字向上闪动的bug
+## 1.8.7(2024-02-02)
+- 新增 uni-popup-dialog 新增属性focus:input模式下,是否自动自动聚焦
+## 1.8.6(2024-01-30)
+- 新增 uni-popup-dialog 新增属性maxLength:限制输入框字数
+## 1.8.5(2024-01-26)
+- 新增 uni-popup-dialog 新增属性showClose:控制关闭按钮的显示
+## 1.8.4(2023-11-15)
+- 新增 uni-popup 支持uni-app-x 注意暂时仅支持 `maskClick` `@open` `@close`
+## 1.8.3(2023-04-17)
+- 修复 uni-popup 重复打开时的 bug
+## 1.8.2(2023-02-02)
+- uni-popup-dialog 组件新增 inputType 属性
+## 1.8.1(2022-12-01)
+- 修复 nvue 下 v-show 报错
+## 1.8.0(2022-11-29)
+- 优化 主题样式
+## 1.7.9(2022-04-02)
+- 修复 弹出层内部无法滚动的bug
+## 1.7.8(2022-03-28)
+- 修复 小程序中高度错误的bug
+## 1.7.7(2022-03-17)
+- 修复 快速调用open出现问题的Bug
+## 1.7.6(2022-02-14)
+- 修复 safeArea 属性不能设置为false的bug
+## 1.7.5(2022-01-19)
+- 修复 isMaskClick 失效的bug
+## 1.7.4(2022-01-19)
+- 新增 cancelText \ confirmText 属性 ,可自定义文本
+- 新增 maskBackgroundColor 属性 ,可以修改蒙版颜色
+- 优化 maskClick属性 更新为 isMaskClick ,解决微信小程序警告的问题
+## 1.7.3(2022-01-13)
+- 修复 设置 safeArea 属性不生效的bug
+## 1.7.2(2021-11-26)
+- 优化 组件示例
+## 1.7.1(2021-11-26)
+- 修复 vuedoc 文字错误
+## 1.7.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-popup](https://uniapp.dcloud.io/component/uniui/uni-popup)
+## 1.6.2(2021-08-24)
+- 新增 支持国际化
+## 1.6.1(2021-07-30)
+- 优化 vue3下事件警告的问题
+## 1.6.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.5.0(2021-06-23)
+- 新增 mask-click 遮罩层点击事件
+## 1.4.5(2021-06-22)
+- 修复 nvue 平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug
+## 1.4.4(2021-06-18)
+- 修复 H5平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug
+## 1.4.3(2021-06-08)
+- 修复 错误的 watch 字段
+- 修复 safeArea 属性不生效的问题
+- 修复 点击内容,再点击遮罩无法关闭的Bug
+## 1.4.2(2021-05-12)
+- 新增 组件示例地址
+## 1.4.1(2021-04-29)
+- 修复 组件内放置 input 、textarea 组件,无法聚焦的问题
+## 1.4.0 (2021-04-29)
+- 新增 type 属性的 left\right 值,支持左右弹出
+- 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗
+- 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色
+- 新增 safeArea 属性,是否适配底部安全区
+- 修复 App\h5\微信小程序底部安全区占位不对的Bug
+- 修复 App 端弹出等待的Bug
+- 优化 提升低配设备性能,优化动画卡顿问题
+- 优化 更简单的组件自定义方式
+## 1.2.9(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+## 1.2.8(2021-02-05)
+- 调整为uni_modules目录规范
+## 1.2.7(2021-02-05)
+- 调整为uni_modules目录规范
+- 新增 支持 PC 端
+- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端
diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js
new file mode 100644
index 0000000..6ef26a2
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js
@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+ name: 'Keypress',
+ props: {
+ disable: {
+ type: Boolean,
+ default: false
+ }
+ },
+ mounted () {
+ const keyNames = {
+ esc: ['Esc', 'Escape'],
+ tab: 'Tab',
+ enter: 'Enter',
+ space: [' ', 'Spacebar'],
+ up: ['Up', 'ArrowUp'],
+ left: ['Left', 'ArrowLeft'],
+ right: ['Right', 'ArrowRight'],
+ down: ['Down', 'ArrowDown'],
+ delete: ['Backspace', 'Delete', 'Del']
+ }
+ const listener = ($event) => {
+ if (this.disable) {
+ return
+ }
+ const keyName = Object.keys(keyNames).find(key => {
+ const keyName = $event.key
+ const value = keyNames[key]
+ return value === keyName || (Array.isArray(value) && value.includes(keyName))
+ })
+ if (keyName) {
+ // 避免和其他按键事件冲突
+ setTimeout(() => {
+ this.$emit(keyName, {})
+ }, 0)
+ }
+ }
+ document.addEventListener('keyup', listener)
+ this.$once('hook:beforeDestroy', () => {
+ document.removeEventListener('keyup', listener)
+ })
+ },
+ render: () => {}
+}
+// #endif
diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue
new file mode 100644
index 0000000..ea93ea5
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue
@@ -0,0 +1,330 @@
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue
new file mode 100644
index 0000000..91370a8
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
diff --git a/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue
new file mode 100644
index 0000000..c8945d5
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/en.json b/uni_modules/uni-popup/components/uni-popup/i18n/en.json
new file mode 100644
index 0000000..7f1bd06
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/i18n/en.json
@@ -0,0 +1,7 @@
+{
+ "uni-popup.cancel": "cancel",
+ "uni-popup.ok": "ok",
+ "uni-popup.placeholder": "pleace enter",
+ "uni-popup.title": "Hint",
+ "uni-popup.shareTitle": "Share to"
+}
diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/index.js b/uni_modules/uni-popup/components/uni-popup/i18n/index.js
new file mode 100644
index 0000000..de7509c
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/i18n/index.js
@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+ en,
+ 'zh-Hans': zhHans,
+ 'zh-Hant': zhHant
+}
diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json
new file mode 100644
index 0000000..5e3003c
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json
@@ -0,0 +1,7 @@
+{
+ "uni-popup.cancel": "取消",
+ "uni-popup.ok": "确定",
+ "uni-popup.placeholder": "请输入",
+ "uni-popup.title": "提示",
+ "uni-popup.shareTitle": "分享到"
+}
diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json
new file mode 100644
index 0000000..13e39eb
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json
@@ -0,0 +1,7 @@
+{
+ "uni-popup.cancel": "取消",
+ "uni-popup.ok": "確定",
+ "uni-popup.placeholder": "請輸入",
+ "uni-popup.title": "提示",
+ "uni-popup.shareTitle": "分享到"
+}
diff --git a/uni_modules/uni-popup/components/uni-popup/keypress.js b/uni_modules/uni-popup/components/uni-popup/keypress.js
new file mode 100644
index 0000000..62dda46
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/keypress.js
@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+ name: 'Keypress',
+ props: {
+ disable: {
+ type: Boolean,
+ default: false
+ }
+ },
+ mounted () {
+ const keyNames = {
+ esc: ['Esc', 'Escape'],
+ tab: 'Tab',
+ enter: 'Enter',
+ space: [' ', 'Spacebar'],
+ up: ['Up', 'ArrowUp'],
+ left: ['Left', 'ArrowLeft'],
+ right: ['Right', 'ArrowRight'],
+ down: ['Down', 'ArrowDown'],
+ delete: ['Backspace', 'Delete', 'Del']
+ }
+ const listener = ($event) => {
+ if (this.disable) {
+ return
+ }
+ const keyName = Object.keys(keyNames).find(key => {
+ const keyName = $event.key
+ const value = keyNames[key]
+ return value === keyName || (Array.isArray(value) && value.includes(keyName))
+ })
+ if (keyName) {
+ // 避免和其他按键事件冲突
+ setTimeout(() => {
+ this.$emit(keyName, {})
+ }, 0)
+ }
+ }
+ document.addEventListener('keyup', listener)
+ // this.$once('hook:beforeDestroy', () => {
+ // document.removeEventListener('keyup', listener)
+ // })
+ },
+ render: () => {}
+}
+// #endif
diff --git a/uni_modules/uni-popup/components/uni-popup/popup.js b/uni_modules/uni-popup/components/uni-popup/popup.js
new file mode 100644
index 0000000..c4e5781
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/popup.js
@@ -0,0 +1,26 @@
+
+export default {
+ data() {
+ return {
+
+ }
+ },
+ created(){
+ this.popup = this.getParent()
+ },
+ methods:{
+ /**
+ * 获取父元素实例
+ */
+ getParent(name = 'uniPopup') {
+ let parent = this.$parent;
+ let parentName = parent.$options.name;
+ while (parentName !== name) {
+ parent = parent.$parent;
+ if (!parent) return false
+ parentName = parent.$options.name;
+ }
+ return parent;
+ },
+ }
+}
diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue b/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue
new file mode 100644
index 0000000..5eb8d5b
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue
new file mode 100644
index 0000000..5af55e0
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue
@@ -0,0 +1,518 @@
+
+
+
+
+
+
diff --git a/uni_modules/uni-popup/package.json b/uni_modules/uni-popup/package.json
new file mode 100644
index 0000000..eb2bb05
--- /dev/null
+++ b/uni_modules/uni-popup/package.json
@@ -0,0 +1,107 @@
+{
+ "id": "uni-popup",
+ "displayName": "uni-popup 弹出层",
+ "version": "1.9.11",
+ "description": " Popup 组件,提供常用的弹层",
+ "keywords": [
+ "uni-ui",
+ "弹出层",
+ "弹窗",
+ "popup",
+ "弹框"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": "",
+ "uni-app": "^4.07",
+ "uni-app-x": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue",
+ "darkmode": "x",
+ "i18n": "x",
+ "widescreen": "x"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-transition"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "x",
+ "aliyun": "x",
+ "alipay": "x"
+ },
+ "client": {
+ "uni-app": {
+ "vue": {
+ "vue2": "√",
+ "vue3": "√"
+ },
+ "web": {
+ "safari": "√",
+ "chrome": "√"
+ },
+ "app": {
+ "vue": "√",
+ "nvue": "√",
+ "android": "√",
+ "ios": "√",
+ "harmony": "√"
+ },
+ "mp": {
+ "weixin": "√",
+ "alipay": "√",
+ "toutiao": "√",
+ "baidu": "√",
+ "kuaishou": "-",
+ "jd": "-",
+ "harmony": "-",
+ "qq": "√",
+ "lark": "-"
+ },
+ "quickapp": {
+ "huawei": "-",
+ "union": "-"
+ }
+ },
+ "uni-app-x": {
+ "web": {
+ "safari": "√",
+ "chrome": "√"
+ },
+ "app": {
+ "android": "√",
+ "ios": "√",
+ "harmony": "√"
+ },
+ "mp": {
+ "weixin": "√"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-popup/readme.md b/uni_modules/uni-popup/readme.md
new file mode 100644
index 0000000..fdad4b3
--- /dev/null
+++ b/uni_modules/uni-popup/readme.md
@@ -0,0 +1,17 @@
+
+
+## Popup 弹出层
+> **组件名:uni-popup**
+> 代码块: `uPopup`
+> 关联组件:`uni-transition`
+
+
+弹出层组件,在应用中弹出一个消息提示窗口、提示框等
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-popup)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
+
+
+
+
+
diff --git a/uni_modules/uni-transition/changelog.md b/uni_modules/uni-transition/changelog.md
new file mode 100644
index 0000000..01bfb58
--- /dev/null
+++ b/uni_modules/uni-transition/changelog.md
@@ -0,0 +1,31 @@
+## 1.3.6(2025-07-18)
+- 修复 nvue 页面,样式错误问题
+## 1.3.5(2025-06-11)
+- 修复 第一次执行不显示动画的问题
+## 1.3.4(2025-04-16)
+- 修复 页面数据更新到底动画复原的问题
+- 修复 示例页面打开报错的问题
+## 1.3.3(2024-04-23)
+- 修复 当元素会受变量影响自动隐藏的bug
+## 1.3.2(2023-05-04)
+- 修复 NVUE 平台报错的问题
+## 1.3.1(2021-11-23)
+- 修复 init 方法初始化问题
+## 1.3.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition)
+## 1.2.1(2021-09-27)
+- 修复 init 方法不生效的 Bug
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.1(2021-05-12)
+- 新增 示例地址
+- 修复 示例项目缺少组件的 Bug
+## 1.1.0(2021-04-22)
+- 新增 通过方法自定义动画
+- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式
+- 优化 动画触发逻辑,使动画更流畅
+- 优化 支持单独的动画类型
+- 优化 文档示例
+## 1.0.2(2021-02-05)
+- 调整为 uni_modules 目录规范
diff --git a/uni_modules/uni-transition/components/uni-transition/createAnimation.js b/uni_modules/uni-transition/components/uni-transition/createAnimation.js
new file mode 100644
index 0000000..8f89b18
--- /dev/null
+++ b/uni_modules/uni-transition/components/uni-transition/createAnimation.js
@@ -0,0 +1,131 @@
+// const defaultOption = {
+// duration: 300,
+// timingFunction: 'linear',
+// delay: 0,
+// transformOrigin: '50% 50% 0'
+// }
+// #ifdef APP-NVUE
+const nvueAnimation = uni.requireNativePlugin('animation')
+// #endif
+class MPAnimation {
+ constructor(options, _this) {
+ this.options = options
+ // 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误
+ this.animation = uni.createAnimation({
+ ...options
+ })
+ this.currentStepAnimates = {}
+ this.next = 0
+ this.$ = _this
+
+ }
+
+ _nvuePushAnimates(type, args) {
+ let aniObj = this.currentStepAnimates[this.next]
+ let styles = {}
+ if (!aniObj) {
+ styles = {
+ styles: {},
+ config: {}
+ }
+ } else {
+ styles = aniObj
+ }
+ if (animateTypes1.includes(type)) {
+ if (!styles.styles.transform) {
+ styles.styles.transform = ''
+ }
+ let unit = ''
+ if(type === 'rotate'){
+ unit = 'deg'
+ }
+ styles.styles.transform += `${type}(${args+unit}) `
+ } else {
+ styles.styles[type] = `${args}`
+ }
+ this.currentStepAnimates[this.next] = styles
+ }
+ _animateRun(styles = {}, config = {}) {
+ let ref = this.$.$refs['ani'].ref
+ if (!ref) return
+ return new Promise((resolve, reject) => {
+ nvueAnimation.transition(ref, {
+ styles,
+ ...config
+ }, res => {
+ resolve()
+ })
+ })
+ }
+
+ _nvueNextAnimate(animates, step = 0, fn) {
+ let obj = animates[step]
+ if (obj) {
+ let {
+ styles,
+ config
+ } = obj
+ this._animateRun(styles, config).then(() => {
+ step += 1
+ this._nvueNextAnimate(animates, step, fn)
+ })
+ } else {
+ this.currentStepAnimates = {}
+ typeof fn === 'function' && fn()
+ this.isEnd = true
+ }
+ }
+
+ step(config = {}) {
+ // #ifndef APP-NVUE
+ this.animation.step(config)
+ // #endif
+ // #ifdef APP-NVUE
+ this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config)
+ this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin
+ this.next++
+ // #endif
+ return this
+ }
+
+ run(fn) {
+ // #ifndef APP-NVUE
+ this.$.animationData = this.animation.export()
+ this.$.timer = setTimeout(() => {
+ typeof fn === 'function' && fn()
+ }, this.$.durationTime)
+ // #endif
+ // #ifdef APP-NVUE
+ this.isEnd = false
+ let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref
+ if(!ref) return
+ this._nvueNextAnimate(this.currentStepAnimates, 0, fn)
+ this.next = 0
+ // #endif
+ }
+}
+
+
+const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d',
+ 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY',
+ 'translateZ'
+]
+const animateTypes2 = ['opacity', 'backgroundColor']
+const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom']
+animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
+ MPAnimation.prototype[type] = function(...args) {
+ // #ifndef APP-NVUE
+ this.animation[type](...args)
+ // #endif
+ // #ifdef APP-NVUE
+ this._nvuePushAnimates(type, args)
+ // #endif
+ return this
+ }
+})
+
+export function createAnimation(option, _this) {
+ if(!_this) return
+ clearTimeout(_this.timer)
+ return new MPAnimation(option, _this)
+}
diff --git a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue
new file mode 100644
index 0000000..7677553
--- /dev/null
+++ b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue
@@ -0,0 +1,292 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-transition/package.json b/uni_modules/uni-transition/package.json
new file mode 100644
index 0000000..0542c52
--- /dev/null
+++ b/uni_modules/uni-transition/package.json
@@ -0,0 +1,112 @@
+{
+ "id": "uni-transition",
+ "displayName": "uni-transition 过渡动画",
+ "version": "1.3.6",
+ "description": "元素的简单过渡动画",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "动画",
+ "过渡",
+ "过渡动画"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": "",
+ "uni-app": "^4.12",
+ "uni-app-x": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue",
+ "darkmode": "x",
+ "i18n": "x",
+ "widescreen": "x"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "x",
+ "aliyun": "x",
+ "alipay": "x"
+ },
+ "client": {
+ "uni-app": {
+ "vue": {
+ "vue2": "√",
+ "vue3": "√"
+ },
+ "web": {
+ "safari": "√",
+ "chrome": "√"
+ },
+ "app": {
+ "vue": "√",
+ "nvue": "√",
+ "android": "√",
+ "ios": "√",
+ "harmony": "√"
+ },
+ "mp": {
+ "weixin": {
+ },
+ "alipay": {
+ },
+ "toutiao": {
+ },
+ "baidu": {
+ },
+ "kuaishou": {
+ },
+ "jd": {
+ },
+ "harmony": "-",
+ "qq": "√",
+ "lark": "-"
+ },
+ "quickapp": {
+ "huawei": "√",
+ "union": "√"
+ }
+ },
+ "uni-app-x": {
+ "web": {
+ "safari": "-",
+ "chrome": "-"
+ },
+ "app": {
+ "android": "-",
+ "ios": "-",
+ "harmony": "-"
+ },
+ "mp": {
+ "weixin": "-"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-transition/readme.md b/uni_modules/uni-transition/readme.md
new file mode 100644
index 0000000..2f8a77e
--- /dev/null
+++ b/uni_modules/uni-transition/readme.md
@@ -0,0 +1,11 @@
+
+
+## Transition 过渡动画
+> **组件名:uni-transition**
+> 代码块: `uTransition`
+
+
+元素过渡动画
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/utils/validate.js b/utils/validate.js
index 02d4ec3..dded517 100644
--- a/utils/validate.js
+++ b/utils/validate.js
@@ -12,6 +12,9 @@ const ID_CARD_REGEX = /(^\d{15}$)|(^\d{18}$)|(^\d{17}[\dXx]$)/
/** 密码强度(至少8位,包含数字和字母) */
const PASSWORD_REGEX = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{8,}$/
+/** 交易密码(6–20 位,必须包含数字 + 字母(大小写均可)) */
+const TRANSACTION_PASSWORD_REGEX = /^(?=.*\d)(?=.*[a-zA-Z]).{6,20}$/
+
/**
* 校验手机号
* @param {string} phone - 待校验的手机号
@@ -82,3 +85,20 @@ export const validateIdCard = idCard => {
}
return { valid: true, message: '' }
}
+
+/**
+ * 校验交易密码
+ * @param {string} password - 待校验的密码
+ * @returns {{ valid: boolean, message: string }}
+ */
+
+export const validateTransactionPassword = (password, name = '密码') => {
+ if (!password) return { valid: false, message: `${name}不能为空` }
+ if (password.length < 6) {
+ return { valid: false, message: `${name}长度不能少于6位` }
+ }
+ if (!TRANSACTION_PASSWORD_REGEX.test(password)) {
+ return { valid: false, message: `${name}需包含字母和数字` }
+ }
+ return { valid: true, message: '' }
+}