同步uni-app

This commit is contained in:
CQ 2025-11-13 09:42:44 +08:00
parent 57d110237b
commit 16a8825962
20 changed files with 8205 additions and 1000 deletions

View File

@ -7,9 +7,9 @@ import useConfigStore from '@/stores/config'
import useSystemStore from '@/stores/system'
import { useLogin } from '@/hooks/useLogin'
import { useShare } from '@/hooks/useShare'
import { useLocation } from '@/hooks/useLocation'
const locationVal = useLocation(true);
onLaunch((data: any) => {
//
launchInterceptor()
const systemStore = useSystemStore()

View File

@ -1,15 +1,16 @@
<template>
<view class="diy-group" id="componentList">
<top-tabbar v-if="data.global && Object.keys(data.global).length && data.global.topStatusBar && data.global.topStatusBar.isShow"
<top-tabbar
v-if="data.global && Object.keys(data.global).length && data.global.topStatusBar && data.global.topStatusBar.isShow"
:scrollBool="diyGroup.componentsScrollBool.TopTabbar" ref="topTabbarRef" :data="data.global" />
<pop-ads v-if="data.global && Object.keys(data.global).length && data.global.popWindow && data.global.popWindow.show" ref="popAbsRef" :data="data.global" />
<pop-ads
v-if="data.global && Object.keys(data.global).length && data.global.popWindow && data.global.popWindow.show"
ref="popAbsRef" :data="data.global" />
<template v-for="(component, index) in data.value" :key="component.id">
<view
v-show="component.componentIsShow"
@click="diyStore.changeCurrentIndex(index, component)"
:class="diyGroup.getComponentClass(index,component)" :style="component.pageStyle"
>
<view class="relative" :style="{ marginTop : component.margin.top < 0 ? (component.margin.top * 2) + 'rpx' : '0', marginBottom : component.margin.bottom < 0 ? (component.margin.bottom * 2) + 'rpx' : '0' }">
<view v-show="component.componentIsShow" @click="diyStore.changeCurrentIndex(index, component)"
:class="diyGroup.getComponentClass(index,component)" :style="component.pageStyle">
<view class="relative"
:style="{ marginTop : component.margin.top < 0 ? (component.margin.top * 2) + 'rpx' : '0', marginBottom : component.margin.bottom < 0 ? (component.margin.bottom * 2) + 'rpx' : '0' }">
<!-- 装修模式下设置负上边距后超出的内容禁止选中设置 -->
<view v-if="diyGroup.isShowPlaceHolder(index,component)" class="absolute w-full z-1"
@ -56,7 +57,8 @@
<diy-float-btn :component="component" :global="data.global" :index="index" />
</template>
<template v-if="component.componentName == 'CarouselSearch'">
<diy-carousel-search :scrollBool="diyGroup.componentsScrollBool.CarouselSearch" :component="component" :global="data.global" :index="index" />
<diy-carousel-search :scrollBool="diyGroup.componentsScrollBool.CarouselSearch"
:component="component" :global="data.global" :index="index" />
</template>
<template v-if="component.componentName == 'PictureShow'">
<diy-picture-show :component="component" :global="data.global" :index="index" />
@ -65,61 +67,80 @@
<diy-form-submit :component="component" :global="data.global" :index="index" />
</template>
<template v-if="component.componentName == 'FormInput'">
<diy-form-input ref="diyFormInputRef" :component="component" :global="data.global" :index="index" />
<diy-form-input ref="diyFormInputRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormTextarea'">
<diy-form-textarea ref="diyFormTextareaRef" :component="component" :global="data.global" :index="index" />
<diy-form-textarea ref="diyFormTextareaRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormIdentity'">
<diy-form-identity ref="diyFormIdentityRef" :component="component" :global="data.global" :index="index" />
<diy-form-identity ref="diyFormIdentityRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormEmail'">
<diy-form-email ref="diyFormEmailRef" :component="component" :global="data.global" :index="index" />
<diy-form-email ref="diyFormEmailRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormMobile'">
<diy-form-mobile ref="diyFormMobileRef" :component="component" :global="data.global" :index="index" />
<diy-form-mobile ref="diyFormMobileRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormWechatName'">
<diy-form-wechat-name ref="diyFormWechatNameRef" :component="component" :global="data.global" :index="index" />
<diy-form-wechat-name ref="diyFormWechatNameRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormNumber'">
<diy-form-number ref="diyFormNumberRef" :component="component" :global="data.global" :index="index" />
<diy-form-number ref="diyFormNumberRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormRadio'">
<diy-form-radio ref="diyFormRadioRef" :component="component" :global="data.global" :index="index" />
<diy-form-radio ref="diyFormRadioRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormCheckbox'">
<diy-form-checkbox ref="diyFormCheckboxRef" :component="component" :global="data.global" :index="index" />
<diy-form-checkbox ref="diyFormCheckboxRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormTable'">
<diy-form-table ref="diyFormTableRef" :component="component" :global="data.global" :index="index" />
<diy-form-table ref="diyFormTableRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormDate'">
<diy-form-date ref="diyFormDateRef" :component="component" :global="data.global" :index="index" />
<diy-form-date ref="diyFormDateRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormDateScope'">
<diy-form-date-scope ref="diyFormDateScopeRef" :component="component" :global="data.global" :index="index" />
<diy-form-date-scope ref="diyFormDateScopeRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormTime'">
<diy-form-time ref="diyFormTimeRef" :component="component" :global="data.global" :index="index" />
<diy-form-time ref="diyFormTimeRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormTimeScope'">
<diy-form-time-scope ref="diyFormTimeScopeRef" :component="component" :global="data.global" :index="index" />
<diy-form-time-scope ref="diyFormTimeScopeRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormLocation'">
<diy-form-location ref="diyFormLocationRef" :component="component" :global="data.global" :index="index" />
<diy-form-location ref="diyFormLocationRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormAddress'">
<diy-form-address ref="diyFormAddressRef" :component="component" :global="data.global" :index="index" />
<diy-form-address ref="diyFormAddressRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormImage'">
<diy-form-image ref="diyFormImageRef" :component="component" :global="data.global" :index="index" />
<diy-form-image ref="diyFormImageRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormVideo'">
<diy-form-video ref="diyFormVideoRef" :component="component" :global="data.global" :index="index" />
<diy-form-video ref="diyFormVideoRef" :component="component" :global="data.global"
:index="index" />
</template>
<template v-if="component.componentName == 'FormFile'">
<diy-form-file ref="diyFormFileRef" :component="component" :global="data.global" :index="index" />
<diy-form-file ref="diyFormFileRef" :component="component" :global="data.global"
:index="index" />
</template>
@ -127,13 +148,13 @@
</view>
</view>
</template>
<template v-if="diyStore.mode == '' && data.global && diyGroup.showCopyright.value && data.global.copyright && data.global.copyright.isShow">
<copy-right />
<template v-if="data.global && diyGroup.showCopyright.value && data.global.copyright && data.global.copyright.isShow">
<copy-right :textColor="data.global.copyright.textColor" />
</template>
<template v-if="diyStore.mode == '' && data.global && data.global.bottomTabBar && data.global.bottomTabBar.isShow">
<view class="pt-[20rpx]"></view>
<tabbar :addon="data.global.bottomTabBar.designNav.key" />
<tabbar :addon="data.global.bottomTabBar.designNav?.key" />
</template>
</view>
</template>
@ -155,6 +176,7 @@ const getFormRef = () => {
const diyStore = useDiyStore();
const diyGroup = useDiyGroup({
...props,
getFormRef

View File

@ -102,7 +102,6 @@ export function useDiyGroup(params: any = {}) {
}
// 新增:页面加载完成后,显示版权
showCopyright.value = true;
console.log('组件加载完成', showCopyright.value);
}, 500)
});

View File

@ -27,3 +27,87 @@ export function getShareInfo(params: Record<string, any>) {
export function getMemberFormRecord() {
return request.get('diy/form/member_record')
}
/**
*
*/
export function getGoodsComponents(params: Record<string, any>) {
return request.get(`home_service/goods/components`, params)
}
/**
*
* @param orderId
* @returns
*/
export function getFirstCard(orderId: number) {
return request.get(`home_service/member/firstCard`)
}
/**
*
*/
export function getGoodsCategoryList(params: Record<string, any>) {
return request.get(`home_service/goods/category/list`, params)
}
/**
*
*/
export function getCardComponents(params: Record<string, any>) {
return request.get(`home_service/card/components`, params)
}
/**
*
* @param orderId
* @returns
*/
export function getCouponCard(orderId: number) {
return request.get(`home_service/member/memberDiscountCount`)
}
/**
*
* @param params
* @returns
*/
export function getTechnicianInfo(params: Record<string, any>) {
return request.get(`home_service/technician/info`,params,{ showErrorMessage: false })
}
/**
*
* @returns
*/
export function getStoreInfo() {
return request.get('home_service/store/info',{},{ showErrorMessage: false })
}
/**
*
* @param params
* @returns
*/
export function getTechnicianApply() {
return request.get(`home_service/technician/apply`)
}
/**
*
* @param params
* @returns
*/
export function getStoreApply() {
return request.get(`home_service/member/store/application`)
}

View File

@ -7,9 +7,20 @@ export function pay(data : AnyObject) {
return request.post(`pay`, data, { showErrorMessage: true })
}
/**
*
*/
export function testPay(data : AnyObject) {
return request.get(`home_service/pay/pay`, data, { showErrorMessage: true })
}
/**
*
*/
export function getPayInfo(tradeType : string, tradeId : number, params: Record<string, any>) {
return request.get(`pay/info/${tradeType}/${tradeId}`, params, { showErrorMessage: true })
}

View File

@ -17,12 +17,19 @@
import { t } from '@/locale'
import { img } from '@/utils/common';
import { ref } from 'vue';
import { onLoad } from '@dcloudio/uni-app';
const sendMessageTitle = ref('')
const sendMessagePath = ref('')
const sendMessageImg = ref('')
sendMessageImg.value = img('static/resource/images/member/contact_service.png')
onLoad((data: any) => {
data.send_title && (sendMessageTitle.value = data.send_title)
data.send_path && (sendMessagePath.value = decodeURIComponent(data.send_path))
data.send_img && (sendMessageImg.value = decodeURIComponent(data.send_img))
})
</script>
<style lang="scss" scoped>

View File

@ -47,6 +47,7 @@ const useDiyStore = defineStore('diy', {
copyright:{
control: true, // 是否允许展示编辑
isShow: false, // 是否显示
textColor: '#ccc',
},
bgUrl: ''
},

View File

@ -1,18 +1,25 @@
<template>
<view class="flex flex-col justify-center items-center p-[30rpx] ">
<view>
<template v-if="diyStore.mode == 'decorate'">
<view class="flex flex-col justify-center items-center p-[30rpx] text-[22rpx]" :style="{ color:textColor}">
示例版权信息
</view>
</template>
<tempalte v-else>
<view class="flex flex-col justify-center items-center p-[30rpx]" :style="{ color:textColor}">
<img :src="img(systemStore.copyright.logo)" mode="heightFix" class="max-h-[60rpx]" v-if="systemStore.copyright?.logo" />
<view class="text-[#666] text-[22rpx] mt-[20rpx]" v-if="systemStore.copyright?.copyright_desc" @click="systemStore.copyright?.copyright_link && redirect({ url: systemStore.copyright.copyright_link})">
<view class="text-[22rpx] mt-[20rpx]" v-if="systemStore.copyright?.copyright_desc" @click="systemStore.copyright?.copyright_link && redirect({ url: systemStore.copyright.copyright_link})">
{{ systemStore.copyright.copyright_desc }}
</view>
<view class="text-[#666] text-[22rpx] mt-[20rpx]" v-if="systemStore.copyright?.icp">
<view class="text-[22rpx] mt-[20rpx]" v-if="systemStore.copyright?.icp">
备案号{{ systemStore.copyright.icp }}
</view>
<view class="text-[#666] text-[22rpx] mt-[20rpx] flex items-center" v-if="systemStore.copyright?.gov_record" @click="systemStore.copyright?.gov_url && redirect({ url: systemStore.copyright.gov_url})">
<view class="text-[22rpx] mt-[20rpx] flex items-center" v-if="systemStore.copyright?.gov_record" @click="systemStore.copyright?.gov_url && redirect({ url: systemStore.copyright.gov_url})">
<img :src="img('static/resource/images/copy_right.png')" mode="heightFix" class="w-[28rpx] h-[28rpx] mr-[10rpx]" />
{{ systemStore.copyright.gov_record }}
</view>
<!-- <view class="h-[100rpx]"></view> -->
</view>
</tempalte>
</view>
</template>
@ -21,6 +28,16 @@ import { ref, nextTick } from 'vue'
import { redirect,img } from '@/utils/common'
import useSystemStore from '@/stores/system';
const systemStore = useSystemStore()
import useDiyStore from '@/app/stores/diy';
const diyStore = useDiyStore();
const prop = defineProps({
textColor: {
type: String,
default: '#ccc'
},
})
</script>

View File

@ -10,7 +10,9 @@
:send-message-title="props.sendMessageTitle"
:send-message-path="props.sendMessagePath"
:send-message-img="props.sendMessageImg"
:show-message-card="true">
:show-message-card="true"
@contact="handleContact"
>
</button>
<u-popup :show="popupShow" @close="popupShow = false" mode="center" :round="5" :safeAreaInsetBottom="false">
@ -33,6 +35,7 @@
<script setup lang="ts">
import { ref, computed } from 'vue'
import useSystemStore from '@/stores/system'
import { redirect } from '@/utils/common';
const props = defineProps({
sendMessageTitle: {
@ -70,6 +73,12 @@ const callPhone = () => {
});
}
const handleContact = (e) => {
if (e.detail && e.detail.path) {
redirect({ mode: 'redirectTo', url: e.detail.path, param: e.detail.query || {} })
}
}
defineExpose({})
</script>

View File

@ -25,7 +25,7 @@
</view>
</scroll-view>
<view class="btn-wrap">
<button class="primary-btn-bg btn" hover-class="none" :loading="loading" @click="confirmPay">{{ t('pay.confirmPay') }}</button>
<button class="primary-btn-bg bg-[var(--primary-color)] btn" hover-class="none" :loading="loading" @click="confirmPay">{{ t('pay.confirmPay') }}</button>
</view>
</view>
</u-popup>
@ -34,7 +34,7 @@
<script setup lang="ts">
import { ref } from 'vue'
import { t } from '@/locale'
import { getPayInfo, pay } from '@/app/api/pay'
import { getPayInfo, pay,testPay } from '@/app/api/pay'
import { img, redirect, isWeixinBrowser, moneyFormat } from '@/utils/common'
import wechat from '@/utils/wechat'

View File

@ -113,6 +113,7 @@ const props = defineProps({
const emits = defineEmits(['close'])
const sharePopupShow = ref(false);
const posterType = ref(props.posterType)
//
const copyUrl = () => {
@ -134,7 +135,8 @@ const copyUrl = () => {
});
}
const openShare = () => {
const openShare = (data: any) => {
posterType.value = data?.type || posterType.value || ''
sharePopupShow.value = true
loadPoster();
}
@ -154,7 +156,7 @@ const loadPoster = () => {
isPosterImg.value = false;
let obj = {
id: props.posterId,
type: props.posterType,
type: posterType.value,
param: props.posterParam
}
let startTime = Date.parse(new Date());

View File

@ -45,7 +45,7 @@
<script setup lang="ts">
import { ref, computed, onMounted, getCurrentInstance, nextTick } from 'vue';
import { redirect, img } from '@/utils/common';
import { redirect, img ,currRoute} from '@/utils/common';
import useSystemStore from '@/stores/system';
import useDiyStore from '@/app/stores/diy';
import { useLocation } from '@/hooks/useLocation'
@ -192,7 +192,9 @@ if (componentsScrollVal) {
let pages = getCurrentPages();
const isBackShow = computed(() => {
let bool = false;
if (props.isBack) {
if (props.isBack && pages.length > 1) {
bool = true;
} else if (currRoute() == 'app/pages/auth/index') {
bool = true;
}
return bool;

View File

@ -12,6 +12,7 @@ import { getWechatAuthCode } from '@/app/api/system'
import useMemberStore from '@/stores/member'
import useConfigStore from '@/stores/config'
import useSystemStore from '@/stores/system'
import { ref } from 'vue'
export function useLogin() {
/**
@ -84,20 +85,44 @@ export function useLogin() {
/**
*
*/
const handleLoginBack = () => {
const ler = ref(0)
const handleLoginBack = (e) => {
ler.value = e
uni.removeStorageSync('autoLoginLock')
uni.getStorage({
key: 'loginBack',
success: (res: any) => {
if(ler.value == 1){
redirect({
url:'/addon/home_service/technician/pages/member/index',
mode: 'redirectTo'
})
}else if(ler.value == 2){
redirect({
url:'/addon/home_service/store/pages/member/index',
mode: 'redirectTo'
})
}else{
res ? redirect(
{
...res.data,
mode: 'redirectTo'
}
) : redirect({ url: '/app/pages/index/index', mode: 'switchTab' })
}
},
fail: (res) => {
console.log(ler.value)
if(ler.value==1){
redirect({ url:'/addon/home_service/technician/pages/member/index', mode: 'switchTab' })
}else if(ler.value==2){
redirect({ url:'/addon/home_service/store/pages/member/index', mode: 'switchTab' })
}else{
redirect({ url:'/app/pages/index/index', mode: 'switchTab' })
}
}
})
}

View File

@ -155,5 +155,8 @@
"shop_fenxiao.orderNo": "订单号",
"shop_giftcard.actualPayment": "实付款",
"shop_giftcard.orderClose": "关闭订单",
"shop_giftcard.orderNo": "订单号"
"shop_giftcard.orderNo": "订单号",
"notHave": "无",
"onceCard": "次卡",
"cardUnit": "张"
}

View File

@ -75,11 +75,7 @@
"desc" : "为了更好地为您提供服务"
}
},
"requiredPrivateInfos": [
"chooseLocation",
"getLocation",
"chooseAddress"
],
"requiredPrivateInfos" : [ "chooseLocation", "getLocation", "chooseAddress" ],
"__usePrivacyCheck__" : true
},
"mp-alipay" : {

View File

@ -1,8 +1,9 @@
@font-face {
font-family: "iconfont"; /* Project id 3952239 */
src: url('https://at.alicdn.com/t/c/font_3952239_yxckpayhvp.woff2?t=1755857288182') format('woff2'),
url('https://at.alicdn.com/t/c/font_3952239_yxckpayhvp.woff?t=1755857288182') format('woff'),
url('https://at.alicdn.com/t/c/font_3952239_yxckpayhvp.ttf?t=1755857288182') format('truetype');
font-family: "iconfont";
/* Project id 3952239 */
src: url('//at.alicdn.com/t/c/font_3952239_waynfpfdr5.woff2?t=1762225321119') format('woff2'),
url('//at.alicdn.com/t/c/font_3952239_waynfpfdr5.woff?t=1762225321119') format('woff'),
url('//at.alicdn.com/t/c/font_3952239_waynfpfdr5.ttf?t=1762225321119') format('truetype');
}
.iconfont {
@ -13,6 +14,54 @@
-moz-osx-font-smoothing: grayscale;
}
.icondingdanzhongxinPC-3:before {
content: "\e7af";
}
.iconshangchuantupian:before {
content: "\e6e9";
}
.iconnew_icon_bianjiqi_chexiao_keyong:before {
content: "\e64a";
}
.iconnew_icon_bianjiqi_zhongzuo_keyong:before {
content: "\e64b";
}
.iconbiaotizhengwenqiehuan:before {
content: "\e6e2";
}
.iconjuyouduiqi:before {
content: "\e6e6";
}
.iconbianjiqifengexian:before {
content: "\e6eb";
}
.iconbianjiqijuzhongduiqi:before {
content: "\e6ec";
}
.iconzitijiacu:before {
content: "\ec83";
}
.iconzitixiahuaxian:before {
content: "\ec85";
}
.iconzitixieti:before {
content: "\ec86";
}
.icont:before {
content: "\eb24";
}
.iconjiahaoV6xx1:before {
content: "\e7cc";
}

View File

@ -2,9 +2,10 @@ import { getTabbarPages } from './pages'
import useDiyStore from '@/app/stores/diy'
import useMemberStore from '@/stores/member'
import useSystemStore from '@/stores/system'
import wechat from '@/utils/wechat'
import useConfigStore from '@/stores/config'
import { getNeedLoginPages } from '@/utils/pages'
import { useLocation } from '@/hooks/useLocation'
/**
*
*/
@ -90,7 +91,6 @@ export const redirect = (redirect: any) => {
if (newLogin) {
uni.setStorage({ key: 'loginBack', data: { url: originalUrl } });
}
switch (mode) {
case 'switchTab':
uni.switchTab({

View File

@ -4,6 +4,7 @@ import { redirect, getToken, getSiteId,currRoute, setThemeColor } from '@/utils/
import { memberLog } from '@/app/api/auth'
import { useShare } from '@/hooks/useShare'
/**
*
*/
@ -24,7 +25,10 @@ export const redirectInterceptor = (route: { path: string, query: object }) => {
// #endif
// #ifdef MP
route.path.indexOf('addon') != -1 && language.loadAllLocaleMessages('addon', uni.getLocale())
try {
language.loadAllLocaleMessages('addon', uni.getLocale())
} catch (e) {
}
// #endif
// 校验是否需要登录

6974
uni-app/yarn.lock Normal file

File diff suppressed because it is too large Load Diff