From 18c9a31761f53dca1c492a0868f0378ebb3461fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=A8=E6=A0=88=E5=B0=8F=E5=AD=A6=E7=94=9F?= <1518079521@qq.com> Date: Sat, 20 Sep 2025 09:08:57 +0800 Subject: [PATCH] up --- uni-app/src/App.vue | 16 +- .../components/diy-form-detail/index.vue | 10 +- .../src/addon/components/diy-form/index.vue | 24 +- .../src/addon/components/diy/group/index.vue | 238 +++--- .../addon/components/diy/group/useDiyGroup.ts | 3 +- uni-app/src/app/api/auth.ts | 9 +- .../app/components/diy/active-cube/index.vue | 8 +- .../components/diy/carousel-search/index.vue | 59 +- .../app/components/diy/float-btn/index.vue | 8 +- .../app/components/diy/form-address/index.vue | 2 +- .../components/diy/form-checkbox/index.vue | 25 +- .../components/diy/form-date-scope/index.vue | 2 +- .../app/components/diy/form-date/index.vue | 4 +- .../app/components/diy/form-email/index.vue | 2 +- .../app/components/diy/form-file/index.vue | 2 +- .../components/diy/form-identity/index.vue | 2 +- .../app/components/diy/form-image/index.vue | 2 +- .../app/components/diy/form-input/index.vue | 2 +- .../components/diy/form-location/index.vue | 8 +- .../app/components/diy/form-mobile/index.vue | 2 +- .../app/components/diy/form-number/index.vue | 2 +- .../app/components/diy/form-radio/index.vue | 35 +- .../app/components/diy/form-submit/index.vue | 16 +- .../app/components/diy/form-table/index.vue | 132 +++- .../components/diy/form-textarea/index.vue | 2 +- .../components/diy/form-time-scope/index.vue | 2 +- .../app/components/diy/form-time/index.vue | 4 +- .../app/components/diy/form-video/index.vue | 4 +- .../components/diy/form-wechat-name/index.vue | 2 +- .../app/components/diy/graphic-nav/index.vue | 6 +- .../app/components/diy/horz-blank/index.vue | 2 +- .../app/components/diy/horz-line/index.vue | 2 +- .../src/app/components/diy/hot-area/index.vue | 4 +- .../app/components/diy/image-ads/index.vue | 34 +- .../app/components/diy/member-info/index.vue | 7 +- .../app/components/diy/member-level/index.vue | 2 +- .../src/app/components/diy/notice/index.vue | 4 +- .../app/components/diy/picture-show/index.vue | 8 +- .../app/components/diy/rich-text/index.vue | 4 +- .../app/components/diy/rubik-cube/index.vue | 217 +++--- uni-app/src/app/components/diy/text/index.vue | 4 +- uni-app/src/app/pages/auth/bind.vue | 32 +- uni-app/src/app/pages/auth/index.vue | 65 +- uni-app/src/app/pages/auth/login.vue | 71 +- uni-app/src/app/pages/auth/register.vue | 54 +- uni-app/src/app/pages/auth/resetpwd.vue | 19 +- uni-app/src/app/pages/index/index.vue | 5 +- uni-app/src/app/pages/member/address_edit.vue | 47 +- uni-app/src/app/pages/member/balance.vue | 15 +- uni-app/src/app/pages/member/commission.vue | 12 +- .../components/personal_form_detail.vue | 5 + uni-app/src/app/pages/member/level.vue | 2 +- uni-app/src/app/pages/member/personal.vue | 18 +- .../src/app/pages/member/personal_form.vue | 3 + uni-app/src/app/pages/member/point.vue | 12 +- uni-app/src/app/pages/member/sign_in.vue | 12 +- uni-app/src/app/pages/setting/index.vue | 10 +- uni-app/src/app/pages/verify/index.vue | 2 +- uni-app/src/app/pages/verify/record.vue | 2 +- uni-app/src/app/stores/diy.ts | 18 +- .../components/area-select/area-select.vue | 102 ++- .../avatar-swiper/avatar-swiper.vue | 191 +++++ .../src/components/barrage/barrage-item.vue | 107 +++ uni-app/src/components/barrage/container.vue | 176 +++++ .../components/bind-mobile/bind-mobile.vue | 7 +- .../components/collect-tip/collect-tip.vue | 83 +++ .../src/components/easy-image/easy-image.vue | 175 +++++ uni-app/src/components/easy-image/fail.png | Bin 0 -> 3500 bytes uni-app/src/components/easy-image/loading.png | Bin 0 -> 2024 bytes .../src/components/firework-effect/README.md | 253 +++++++ .../firework-effect/firework-effect.vue | 155 ++++ .../firework-effect/red-packet-rain.vue | 682 ++++++++++++++++++ .../firework-effect/simple-firework.vue | 378 ++++++++++ .../information-filling.vue | 10 +- .../mescroll/mescroll-uni/wxs/renderjs.js | 18 +- .../src/components/music/music-container.vue | 436 +++++++++++ .../online-service/online-service.vue | 69 ++ uni-app/src/components/pay/pay.vue | 18 +- .../components/share-popup/share-popup.vue | 9 +- .../components/share-poster/share-poster.vue | 65 +- uni-app/src/components/tabbar/tabbar.vue | 1 + .../src/components/top-tabbar/top-tabbar.vue | 102 ++- .../src/components/x-skeleton/x-skeleton.vue | 14 +- uni-app/src/hooks/useDiy.ts | 15 +- uni-app/src/hooks/useDiyForm.ts | 8 +- uni-app/src/hooks/useLocation.ts | 9 +- uni-app/src/hooks/useLogin.ts | 56 +- uni-app/src/hooks/useShare.ts | 205 ++++-- uni-app/src/locale/index.ts | 1 + uni-app/src/locale/language.ts | 32 +- uni-app/src/locale/zh-Hans/common.json | 24 +- uni-app/src/stores/config.ts | 4 +- uni-app/src/stores/member.ts | 21 +- uni-app/src/stores/system.ts | 27 +- uni-app/src/styles/common.scss | 14 + uni-app/src/styles/iconfont.css | 106 ++- uni-app/src/styles/official-iconfont.css | 10 +- uni-app/src/tabbar.json | 3 +- .../uni-transition/uni-transition.vue | 7 +- uni-app/src/utils/common.ts | 196 +++-- uni-app/src/utils/interceptor.ts | 5 +- uni-app/src/utils/wechat.ts | 53 +- 102 files changed, 4314 insertions(+), 858 deletions(-) create mode 100644 uni-app/src/components/avatar-swiper/avatar-swiper.vue create mode 100644 uni-app/src/components/barrage/barrage-item.vue create mode 100644 uni-app/src/components/barrage/container.vue create mode 100644 uni-app/src/components/collect-tip/collect-tip.vue create mode 100644 uni-app/src/components/easy-image/easy-image.vue create mode 100644 uni-app/src/components/easy-image/fail.png create mode 100644 uni-app/src/components/easy-image/loading.png create mode 100644 uni-app/src/components/firework-effect/README.md create mode 100644 uni-app/src/components/firework-effect/firework-effect.vue create mode 100644 uni-app/src/components/firework-effect/red-packet-rain.vue create mode 100644 uni-app/src/components/firework-effect/simple-firework.vue create mode 100644 uni-app/src/components/music/music-container.vue create mode 100644 uni-app/src/components/online-service/online-service.vue diff --git a/uni-app/src/App.vue b/uni-app/src/App.vue index 352ffd556..cfc2b7fd1 100644 --- a/uni-app/src/App.vue +++ b/uni-app/src/App.vue @@ -12,9 +12,18 @@ onLaunch((data: any) => { // 添加初始化拦截器 launchInterceptor() + const systemStore = useSystemStore() + + // 初始化全局数据 + const initGlobalData = () => { + systemStore.systemInfo = uni.getSystemInfoSync(); + systemStore.getMenuButtonInfoFn() + } + + initGlobalData() // #ifdef H5 - uni.getSystemInfoSync().platform == 'ios' && (uni.setStorageSync('initUrl', location.href)) + systemStore.systemInfo.platform == 'ios' && (uni.setStorageSync('initUrl', location.href)) // 传输给后台数据 window.parent.postMessage(JSON.stringify({ @@ -38,12 +47,15 @@ onLaunch((data: any) => { type: 'appOnReady', message: '加载完成' }), '*'); + // 更新全局数据 + initGlobalData() } } catch (e) { console.log('uni-app App.vue 接受数据错误', e) } }, false); + try { uni.hideTabBar() // 隐藏tabbar } catch (e) { @@ -79,7 +91,7 @@ onLaunch((data: any) => { // #endif // 获取初始化数据信息 - useSystemStore().getInitFn(async() => { + useSystemStore().getInitFn(async () => { const configStore = useConfigStore() diff --git a/uni-app/src/addon/components/diy-form-detail/index.vue b/uni-app/src/addon/components/diy-form-detail/index.vue index e0e902ea6..ffdd6df3d 100644 --- a/uni-app/src/addon/components/diy-form-detail/index.vue +++ b/uni-app/src/addon/components/diy-form-detail/index.vue @@ -9,6 +9,7 @@ import { ref, reactive, onMounted } from 'vue'; import diyGroup from '@/addon/components/diy/group/index.vue' import { getFormRecord } from '@/app/api/diy_form'; +import { deepClone } from '@/utils/common' const props = defineProps(['record_id', 'completeLayout']); const emits = defineEmits(['callback']) @@ -17,20 +18,21 @@ const diyFormData: any = reactive({ global: {}, value: [] }) - onMounted(() => { getFormRecord({ record_id: props.record_id }).then((res: any) => { diyFormData.global.completeLayout = props.completeLayout || 'style-1'; - if (res.data.recordsFieldList) { + let recordsFieldList = deepClone(res.data.recordsFieldList) + if (recordsFieldList) { - res.data.recordsFieldList.forEach((item: any) => { + recordsFieldList.forEach((item: any) => { let comp = { id: item.field_key, componentName: item.field_type, pageStyle: '', viewFormDetail: true, // 查看表单详情标识 + componentIsShow: true, field: { name: item.field_name, value: item.handle_field_value, @@ -47,7 +49,7 @@ onMounted(() => { diyFormData.value.push(comp); }) } - emits('callback', res.data.recordsFieldList) + emits('callback', recordsFieldList) loading.value = false; }).catch(() => { loading.value = false; diff --git a/uni-app/src/addon/components/diy-form/index.vue b/uni-app/src/addon/components/diy-form/index.vue index a32becf60..05aa0fbd1 100644 --- a/uni-app/src/addon/components/diy-form/index.vue +++ b/uni-app/src/addon/components/diy-form/index.vue @@ -1,8 +1,21 @@ @@ -30,12 +43,12 @@ const diyFormData: any = reactive({}) onMounted(() => { diy.getData(() => { diyFormData.status = diy.data.status; - if (diyFormData.status) { + if (diyFormData.status && requestData.value.error.length == 0) { diyFormData.title = diy.data.title; diyFormData.global = diy.data.global; if (diyFormData.global) { diyFormData.global.topStatusBar.isShow = false; // 顶部导航栏强制隐藏 - diyFormData.global.bottomTabBarSwitch = false; // 底部导航强制隐藏 + diyFormData.global.bottomTabBar.isShow = false; // 底部导航强制隐藏 } let value: any = []; if (props.form_border == 'none') { @@ -47,7 +60,7 @@ onMounted(() => { value.push(item); } }) - diyFormData.value = value; + diyFormData.value = deepClone(value); diyFormData.componentRefs = null; diyGroupRef.value?.refresh(); watchFormData(); @@ -95,6 +108,7 @@ const watchFormData = () => { const verify = () => { if (!diyFormData.status) return true; if (!diyFormData.value) return true; + if (!requestData.value || requestData.value.error?.length > 0) return true; let allPass = true; // 是否全部通过验证 let componentRefs = diyGroupRef.value.getFormRef().componentRefs; diff --git a/uni-app/src/addon/components/diy/group/index.vue b/uni-app/src/addon/components/diy/group/index.vue index b3e393a80..c6f65ff74 100644 --- a/uni-app/src/addon/components/diy/group/index.vue +++ b/uni-app/src/addon/components/diy/group/index.vue @@ -1,127 +1,130 @@ + + +``` + +### 2. API 说明 + +#### FireworkEffect 组件 + +**Props:** +- `duration`: 特效持续时间(毫秒),默认30000(30秒) +- `noTrail`: 是否禁用拖尾效果(避免黑色阴影),默认true +- `redPacketImages`: 红包图片数组,如:`['/static/images/hongbao1.png']` +- `redPacketUseImages`: 是否使用图片模式,默认false(使用绘制模式) +- `redPacketDensity`: 红包密度(每次生成数量),默认3 +- `redPacketSpeed`: 红包下落速度,默认2 +- `redPacketMinSize`: 红包最小大小(px),默认60 +- `redPacketMaxSize`: 红包最大大小(px),默认100 +- `redPacketMinAmount`: 红包最小金额,默认0.01 +- `redPacketMaxAmount`: 红包最大金额,默认10.00 +- `redPacketClickable`: 是否可点击红包,默认true + +**方法:** +- `handleShowEffect(params)`: 显示特效 + - `params.type`: 特效类型 + - `'simple-firework'`: 简单烟花特效 + - `'red-packet-rain'` 或 `'hongbao'`: 红包雨特效 + - `params.duration`: 自定义持续时间(可选) +### 🚫 解决黑色阴影问题 + +如果您看到黑色阴影,请确保: + +1. **设置 `no-trail="true"`**(默认已启用) +2. **避免使用拖尾效果**,这会产生半透明覆盖 + +```vue + + + + + +``` + +### 📋 注意事项 + +1. 确保页面有足够的渲染性能 +2. 在低端设备上可能需要减少粒子数量 +3. 长时间运行建议定期清理资源 +4. 某些小程序平台可能对 Canvas API 有限制 +5. **只支持 `simple-firework` 类型**,不会阻挡用户操作 + +### 🎁 红包雨详细配置 + +#### 方式一:使用自定义图片 + +```vue + +``` + +#### 方式二:使用代码绘制(默认) + +```vue + +``` + +#### 方式三:使用网络图片 + +```vue + +``` + +### 🖼️ 红包图片要求 + +#### 图片格式 +- **PNG**(推荐,支持透明背景) +- **JPG/JPEG** +- **WebP** + +#### 尺寸建议 +- **推荐尺寸**: 200x160px(宽高比5:4) +- **最小尺寸**: 100x80px +- **最大尺寸**: 400x320px + +#### 文件大小 +- **建议**: 小于100KB +- **最大**: 不超过500KB + +#### 图片准备步骤 +1. 将红包图片放在 `uni-app/public/static/images/` 目录 +2. 文件命名建议:`hongbao1.png`, `hongbao2.png` 等 +3. 确保图片背景透明(PNG格式) +4. 图片内容应该是完整的红包设计 + +### 📏 红包大小控制 + +```vue + +:red-packet-min-size="60" +:red-packet-max-size="80" + + +:red-packet-min-size="80" +:red-packet-max-size="120" + + +:red-packet-min-size="120" +:red-packet-max-size="180" + + +:red-packet-min-size="150" +:red-packet-max-size="200" +``` + +### 🎯 红包点击功能 + +- **点击检测**: 自动检测用户点击的红包 +- **金额显示**: 显示随机金额(在设定范围内) +- **动画效果**: 金额提示向上飘动并淡出 +- **防重复**: 已点击的红包变为半透明,不可重复点击 +- **响应式**: 支持触摸和鼠标点击 + +### 🔧 兼容性 + +- 支持 Vue 2 和 Vue 3 +- 支持 uni-app 各平台(H5、小程序、App) +- 使用传统 Canvas API,兼容性最佳 diff --git a/uni-app/src/components/firework-effect/firework-effect.vue b/uni-app/src/components/firework-effect/firework-effect.vue new file mode 100644 index 000000000..02549af66 --- /dev/null +++ b/uni-app/src/components/firework-effect/firework-effect.vue @@ -0,0 +1,155 @@ + + diff --git a/uni-app/src/components/firework-effect/red-packet-rain.vue b/uni-app/src/components/firework-effect/red-packet-rain.vue new file mode 100644 index 000000000..937a32d7e --- /dev/null +++ b/uni-app/src/components/firework-effect/red-packet-rain.vue @@ -0,0 +1,682 @@ + + + + + diff --git a/uni-app/src/components/firework-effect/simple-firework.vue b/uni-app/src/components/firework-effect/simple-firework.vue new file mode 100644 index 000000000..7cf738f3c --- /dev/null +++ b/uni-app/src/components/firework-effect/simple-firework.vue @@ -0,0 +1,378 @@ + + + + + diff --git a/uni-app/src/components/information-filling/information-filling.vue b/uni-app/src/components/information-filling/information-filling.vue index a8832ce19..3f77eb32c 100644 --- a/uni-app/src/components/information-filling/information-filling.vue +++ b/uni-app/src/components/information-filling/information-filling.vue @@ -20,13 +20,13 @@ - + - - + + diff --git a/uni-app/src/components/mescroll/mescroll-uni/wxs/renderjs.js b/uni-app/src/components/mescroll/mescroll-uni/wxs/renderjs.js index 207f38857..9eeff4cce 100644 --- a/uni-app/src/components/mescroll/mescroll-uni/wxs/renderjs.js +++ b/uni-app/src/components/mescroll/mescroll-uni/wxs/renderjs.js @@ -3,7 +3,7 @@ // https://uniapp.dcloud.io/frame?id=renderjs // 与wxs的me实例一致 -var me = {} +const me = {}; // 初始化window对象的touch事件 (仅初始化一次) if(window && !window.$mescrollRenderInit){ @@ -19,20 +19,20 @@ if(window && !window.$mescrollRenderInit){ window.addEventListener('touchmove', function(e){ if (me.disabled()) return; if (me.getScrollTop() > 0) return; // 需在顶部下拉,才禁止bounce - - var curPoint = me.getPoint(e); // 当前点 - var moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉 + + const curPoint = me.getPoint(e); // 当前点 + const moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉 // 向下拉 if (moveY > 0) { // 可下拉的条件 if (!me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || (me.isUpScrolling && me.isUpBoth))) { // 只有touch在mescroll的view上面,才禁止bounce - var el = e.target; - var isMescrollTouch = false; - while (el && el.tagName && el.tagName !== 'UNI-PAGE-BODY' && el.tagName != "BODY") { - var cls = el.classList; - if (cls && cls.contains('mescroll-render-touch')) { + let el = e.target; + let isMescrollTouch = false; + while (el && el.tagName && el.tagName !== 'UNI-PAGE-BODY' && el.tagName != "BODY") { + const cls = el.classList; + if (cls && cls.contains('mescroll-render-touch')) { isMescrollTouch = true break; } diff --git a/uni-app/src/components/music/music-container.vue b/uni-app/src/components/music/music-container.vue new file mode 100644 index 000000000..da0a6df06 --- /dev/null +++ b/uni-app/src/components/music/music-container.vue @@ -0,0 +1,436 @@ + + + + + + \ No newline at end of file diff --git a/uni-app/src/components/online-service/online-service.vue b/uni-app/src/components/online-service/online-service.vue new file mode 100644 index 000000000..72f4c70b3 --- /dev/null +++ b/uni-app/src/components/online-service/online-service.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/uni-app/src/components/pay/pay.vue b/uni-app/src/components/pay/pay.vue index bad269c34..15f4c6986 100644 --- a/uni-app/src/components/pay/pay.vue +++ b/uni-app/src/components/pay/pay.vue @@ -44,6 +44,10 @@ const prop = defineProps({ default () { return [] } + }, + reformat: { + type: String, + default: '' } }) @@ -165,6 +169,7 @@ const confirmPay = () => { uni.$on('checkIsReturnAfterPayment', () => { const data = uni.getStorageSync('paymenting') if (uni.getStorageSync('paymenting')) { + redirect({ url: '/app/pages/pay/result', param: { @@ -220,8 +225,18 @@ const open = (tradeType: string, tradeId: number, payReturn: string = '', scene: } const emits = defineEmits(['close', 'confirm']) + const toPayResult = () => { emits('confirm') + // console.log(prop.reformat) + if(prop.reformat){ + redirect({ + url: prop.reformat, + mode: 'redirectTo' + }) + return + } + redirect({ url: '/app/pages/pay/result', param: { trade_type: payInfo.value?.trade_type, trade_id: payInfo.value?.trade_id }, @@ -237,7 +252,8 @@ const handleClose = () => { } defineExpose({ - open + open, + payInfo }) diff --git a/uni-app/src/components/share-popup/share-popup.vue b/uni-app/src/components/share-popup/share-popup.vue index 7f7149bcf..dd04b5c87 100644 --- a/uni-app/src/components/share-popup/share-popup.vue +++ b/uni-app/src/components/share-popup/share-popup.vue @@ -23,7 +23,7 @@ - 取消分享 + 取消分享 @@ -45,6 +45,7 @@