mirror of
https://gitee.com/niucloud-team/niucloud-admin.git
synced 2026-01-25 12:38:10 +00:00
update uni-app
This commit is contained in:
parent
94c19e2ee3
commit
2ebaa66ec3
3
uni-app/.babelrc
Normal file
3
uni-app/.babelrc
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"presets": ["@babel/preset-env"]
|
||||
}
|
||||
@ -6,20 +6,14 @@ VITE_APP_BASE_URL=''
|
||||
# 图片服务器地址
|
||||
VITE_IMG_DOMAIN=''
|
||||
|
||||
# 本地开发时站点id
|
||||
VITE_SITE_ID = ''
|
||||
|
||||
# 本地存储时token的参数名
|
||||
VITE_REQUEST_STORAGE_TOKEN_KEY='wapToken'
|
||||
|
||||
# 请求时header中token的参数名
|
||||
VITE_REQUEST_HEADER_TOKEN_KEY='token'
|
||||
|
||||
# 请求时header中站点的参数名
|
||||
VITE_REQUEST_HEADER_SITEID_KEY='site-id'
|
||||
|
||||
# 请求时header中来源场景的参数名
|
||||
VITE_REQUEST_HEADER_CHANNEL_KEY='channel'
|
||||
|
||||
# 应用版本
|
||||
VITE_APP_VERSION='1.0.1'
|
||||
VITE_APP_VERSION='1.0.1'
|
||||
@ -6,18 +6,12 @@ VITE_APP_BASE_URL=''
|
||||
# 图片服务器地址
|
||||
VITE_IMG_DOMAIN=''
|
||||
|
||||
# 站点id 仅在编译为小程序时生效
|
||||
VITE_SITE_ID = ''
|
||||
|
||||
# 本地存储时token的参数名
|
||||
VITE_REQUEST_STORAGE_TOKEN_KEY='wapToken'
|
||||
|
||||
# 请求时header中token的参数名
|
||||
VITE_REQUEST_HEADER_TOKEN_KEY='token'
|
||||
|
||||
# 请求时header中站点的参数名
|
||||
VITE_REQUEST_HEADER_SITEID_KEY='site-id'
|
||||
|
||||
# 请求时header中来源场景的参数名
|
||||
VITE_REQUEST_HEADER_CHANNEL_KEY='channel'
|
||||
|
||||
|
||||
25
uni-app/.gitignore
vendored
25
uni-app/.gitignore
vendored
@ -1,4 +1,21 @@
|
||||
/node_modules
|
||||
/.vite
|
||||
/.hbuilderx
|
||||
/unpackage
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
@ -1,29 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
/**
|
||||
* 文章列表
|
||||
*/
|
||||
export function getArticleList(params: Record<string, any>) {
|
||||
return request.get('article/article', params)
|
||||
}
|
||||
|
||||
/**
|
||||
* 文章列表
|
||||
*/
|
||||
export function getArticleAll(params: Record<string, any>) {
|
||||
return request.get('article/article/all', params)
|
||||
}
|
||||
|
||||
/**
|
||||
* 文章详情
|
||||
*/
|
||||
export function getArticleDetail(id: number) {
|
||||
return request.get(`article/article/${id}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 文章分类
|
||||
*/
|
||||
export function getArticleCategory() {
|
||||
return request.get('article/category')
|
||||
}
|
||||
@ -1,22 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
/**
|
||||
* 获取自定义页面信息
|
||||
*/
|
||||
export function getDiyInfo(params : Record<string, any>) {
|
||||
return request.get('diy/diy', params)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取底部导航信息
|
||||
*/
|
||||
export function getTabbarInfo() {
|
||||
return request.get('diy/tabbar')
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取页面分享信息
|
||||
*/
|
||||
export function getShareInfo(params : Record<string, any>) {
|
||||
return request.get('diy/share', params)
|
||||
}
|
||||
@ -1,145 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export function getMemberInfo() {
|
||||
return request.get('member/member')
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取积分流水
|
||||
*/
|
||||
export function getPointList(data : AnyObject) {
|
||||
return request.get('member/account/point', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取不可提现余额流水
|
||||
*/
|
||||
export function getBalanceList(data : AnyObject) {
|
||||
return request.get('member/account/balance', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取可提现余额流水
|
||||
*/
|
||||
export function getMoneyList(data : AnyObject) {
|
||||
return request.get('member/account/money', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 会员信息修改
|
||||
*/
|
||||
export function modifyMember(data : AnyObject) {
|
||||
return request.put(`member/modify/${data.field}`, data, { showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 发起充值
|
||||
*/
|
||||
export function createRecharge(data : AnyObject) {
|
||||
return request.post('order/recharge', data, { showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 充值记录列表
|
||||
*/
|
||||
export function getRechargeList(data : AnyObject) {
|
||||
return request.get('order/recharge', data, { showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 充值记录详情
|
||||
*/
|
||||
export function getRechargeDetail(id:number) {
|
||||
return request.get(`order/recharge/${id}`, {}, { showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录会员绑定手机号
|
||||
*/
|
||||
export function bindMobile(data : AnyObject) {
|
||||
return request.put('member/mobile', data, { showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 提现转账方式
|
||||
*/
|
||||
export function cashOutTransferType() {
|
||||
return request.get('member/cash_out/transfertype')
|
||||
}
|
||||
|
||||
/**
|
||||
* 提现配置
|
||||
*/
|
||||
export function cashOutConfig() {
|
||||
return request.get('member/cash_out/config')
|
||||
}
|
||||
|
||||
/**
|
||||
* 申请余额提现
|
||||
*/
|
||||
export function cashOutApply(data : AnyObject) {
|
||||
return request.post('member/cash_out/apply', data, { showSuccessMessage: true, showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取提现账户信息
|
||||
*/
|
||||
export function getCashoutAccountInfo(data : AnyObject) {
|
||||
return request.get(`member/cashout_account/${data.account_id}`, {})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取首条提现账户信息
|
||||
*/
|
||||
export function getFirstCashoutAccountInfo(data : AnyObject) {
|
||||
return request.get('member/cashout_account/firstinfo', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取提现账户列表
|
||||
*/
|
||||
export function getCashoutAccountList(data : AnyObject) {
|
||||
return request.get(`member/cashout_account`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取提现记录列表
|
||||
*/
|
||||
export function getCashOutList(data : AnyObject) {
|
||||
return request.get(`member/cash_out`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取提现记录详情
|
||||
*/
|
||||
export function getCashOutDetail(id : number) {
|
||||
return request.get(`member/cash_out/${id}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加提现账户
|
||||
*/
|
||||
export function addCashoutAccount(data : AnyObject) {
|
||||
return request.post('member/cashout_account', data, { showSuccessMessage: true, showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加提现账户
|
||||
*/
|
||||
export function editCashoutAccount(data : AnyObject) {
|
||||
return request.put(`member/cashout_account/${data.account_id}`, data, { showSuccessMessage: true, showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除提现账户
|
||||
*/
|
||||
export function deleteCashoutAccount(accountId: number) {
|
||||
return request.delete(`member/cashout_account/${accountId}`, { showSuccessMessage: true, showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 佣金信息
|
||||
*/
|
||||
export function getCommissionList(data : AnyObject) {
|
||||
return request.get(`member/account/commission`, data)
|
||||
}
|
||||
@ -1,15 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
/**
|
||||
* 支付
|
||||
*/
|
||||
export function pay(data : AnyObject) {
|
||||
return request.post(`pay`, data, { showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取支付信息
|
||||
*/
|
||||
export function getPayInfo(tradeType : string, tradeId : number) {
|
||||
return request.get(`pay/info/${tradeType}/${tradeId}`, {}, { showErrorMessage: true })
|
||||
}
|
||||
@ -1,132 +0,0 @@
|
||||
<template>
|
||||
<view :style="warpCss">
|
||||
<view v-for="(item,index) in articleList" :key="item.id"
|
||||
:class="['item flex align-center p-[20rpx]',{'border-solid border-t-0 border-l-0 border-r-0 border-b border-gray-200 mb-[20rpx]': articleList.length-1 !== index}] "
|
||||
@click="toLink(item.id)" :style="itemCss">
|
||||
<u--image width="260rpx" height="200rpx" :src="img(item.image)" v-if="item.image" model="aspectFill">
|
||||
<template #error>
|
||||
<u-icon name="photo" color="#999" size="50"></u-icon>
|
||||
</template>
|
||||
</u--image>
|
||||
<view class="flex-1 flex flex-col justify-between ml-[20rpx]">
|
||||
<view class="text-[32rpx] leading-[1.3] multi-hidden mt-[4rpx]">{{item.title}}</view>
|
||||
<view class="text-[28rpx] using-hidden mb-[auto] mt-[20rpx] text-gray-500">{{item.summary}}</view>
|
||||
<view class="text-[24rpx] text-gray-400 flex justify-between mt-[10rpx]">
|
||||
<text>{{item.create_time}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
// 文章
|
||||
import { ref, computed, watch } from 'vue';
|
||||
import { redirect, img } from '@/utils/common';
|
||||
import useDiyStore from '@/stores/diy';
|
||||
import { getArticleAll } from '@/api/article';
|
||||
|
||||
const props = defineProps(['component', 'index', 'pullDownRefresh']);
|
||||
const diyStore = useDiyStore();
|
||||
const articleList = ref<Array<any>>([]);
|
||||
|
||||
const diyComponent = computed(() => {
|
||||
if (diyStore.mode == 'decorate') {
|
||||
return diyStore.value[props.index];
|
||||
} else {
|
||||
return props.component;
|
||||
}
|
||||
})
|
||||
|
||||
const warpCss = computed(() => {
|
||||
var style = '';
|
||||
if (diyComponent.value.componentBgColor) style += 'background-color:' + diyComponent.value.componentBgColor + ';';
|
||||
if (diyComponent.value.topRounded) style += 'border-top-left-radius:' + diyComponent.value.topRounded * 2 + 'rpx;';
|
||||
if (diyComponent.value.topRounded) style += 'border-top-right-radius:' + diyComponent.value.topRounded * 2 + 'rpx;';
|
||||
if (diyComponent.value.bottomRounded) style += 'border-bottom-left-radius:' + diyComponent.value.bottomRounded * 2 + 'rpx;';
|
||||
if (diyComponent.value.bottomRounded) style += 'border-bottom-right-radius:' + diyComponent.value.bottomRounded * 2 + 'rpx;';
|
||||
return style;
|
||||
})
|
||||
|
||||
const itemCss = computed(() => {
|
||||
var style = '';
|
||||
if (diyComponent.value.elementBgColor) style += 'background-color:' + diyComponent.value.elementBgColor + ';';
|
||||
if (diyComponent.value.topElementRounded) style += 'border-top-left-radius:' + diyComponent.value.topElementRounded * 2 + 'rpx;';
|
||||
if (diyComponent.value.topElementRounded) style += 'border-top-right-radius:' + diyComponent.value.topElementRounded * 2 + 'rpx;';
|
||||
if (diyComponent.value.bottomElementRounded) style += 'border-bottom-left-radius:' + diyComponent.value.bottomElementRounded * 2 + 'rpx;';
|
||||
if (diyComponent.value.bottomElementRounded) style += 'border-bottom-right-radius:' + diyComponent.value.bottomElementRounded * 2 + 'rpx;';
|
||||
return style;
|
||||
})
|
||||
|
||||
watch(
|
||||
() => props.pullDownRefresh,
|
||||
(newValue, oldValue) => {
|
||||
// 处理下拉刷新业务
|
||||
}
|
||||
)
|
||||
|
||||
const getArticleListFn = () => {
|
||||
interface dataStructure {
|
||||
ids ?: Array<number>,
|
||||
limit ?: number
|
||||
}
|
||||
let data : dataStructure = {};
|
||||
|
||||
if (diyComponent.value.sources == "diy")
|
||||
data.ids = diyComponent.value.articleIds;
|
||||
else
|
||||
data.limit = diyComponent.value.count;
|
||||
|
||||
interface takeDataStructure {
|
||||
data : Array<Object>,
|
||||
msg : string,
|
||||
code : number
|
||||
}
|
||||
getArticleAll(data).then((res : takeDataStructure) => {
|
||||
articleList.value = res.data;
|
||||
});
|
||||
}
|
||||
|
||||
const refresh = () => {
|
||||
if (diyStore.mode == 'decorate') {
|
||||
let obj = {
|
||||
image: "",
|
||||
summary: "文章摘要",
|
||||
title: "文章标题",
|
||||
create_time: "2023-03-28 09:00:00"
|
||||
};
|
||||
articleList.value.push(obj);
|
||||
articleList.value.push(obj);
|
||||
} else {
|
||||
getArticleListFn();
|
||||
}
|
||||
}
|
||||
|
||||
refresh();
|
||||
const toLink = (id : string) => {
|
||||
redirect({ url: '/pages/article/detail', param: { id } })
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
/* 单行超出隐藏 */
|
||||
.using-hidden {
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 1;
|
||||
-webkit-box-orient: vertical;
|
||||
white-space: break-spaces;
|
||||
}
|
||||
|
||||
/* 多行超出隐藏 */
|
||||
.multi-hidden {
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
</style>
|
||||
@ -1,91 +0,0 @@
|
||||
<template>
|
||||
<view class="diy-group" id="componentList">
|
||||
|
||||
<view v-for="(component, index) in data.value" :key="component.id"
|
||||
@click="diyStore.changeCurrentIndex(index, component)" class="draggable-element relative cursor-move"
|
||||
:class="{ selected: diyStore.currentIndex == index,decorate : diyStore.mode == 'decorate' }"
|
||||
:style="component.pageStyle">
|
||||
|
||||
<template v-if="component.componentName == 'Article'">
|
||||
<diy-article :component="component" :index="index"
|
||||
:pullDownRefresh="props.pullDownRefresh"></diy-article>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'GraphicNav'">
|
||||
<diy-graphic-nav :component="component" :index="index"
|
||||
:pullDownRefresh="props.pullDownRefresh"></diy-graphic-nav>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'HorzBlank'">
|
||||
<diy-horz-blank :component="component" :index="index"
|
||||
:pullDownRefresh="props.pullDownRefresh"></diy-horz-blank>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'ImageAds'">
|
||||
<diy-image-ads :component="component" :index="index"
|
||||
:pullDownRefresh="props.pullDownRefresh"></diy-image-ads>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'MemberInfo'">
|
||||
<diy-member-info :component="component" :index="index"
|
||||
:pullDownRefresh="props.pullDownRefresh"></diy-member-info>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'Text'">
|
||||
<diy-text :component="component" :index="index" :pullDownRefresh="props.pullDownRefresh"></diy-text>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'RubikCube'">
|
||||
<diy-rubik-cube :component="component" :index="index" :pullDownRefresh="props.pullDownRefresh"></diy-rubik-cube>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'HotArea'">
|
||||
<diy-hot-area :component="component" :index="index" :pullDownRefresh="props.pullDownRefresh"></diy-hot-area>
|
||||
</template>
|
||||
</view>
|
||||
<template v-if="diyStore.mode != 'decorate' && data.global.bottomTabBarSwitch">
|
||||
<view class="pt-[20rpx]"></view>
|
||||
<tabbar />
|
||||
</template>
|
||||
</view>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import useDiyStore from '@/stores/diy';
|
||||
import { onMounted, nextTick, computed, ref, watch } from 'vue';
|
||||
import Sortable from 'sortablejs';
|
||||
import { range } from 'lodash-es';
|
||||
const props = defineProps(['data', 'pullDownRefresh']);
|
||||
const diyStore = useDiyStore();
|
||||
|
||||
const data = computed(() => {
|
||||
if (diyStore.mode == 'decorate') {
|
||||
return diyStore;
|
||||
} else {
|
||||
return props.data;
|
||||
}
|
||||
})
|
||||
|
||||
onMounted(() => {
|
||||
// #ifdef H5
|
||||
if (diyStore.mode == 'decorate') {
|
||||
var el = document.getElementById('componentList');
|
||||
const sortable = Sortable.create(el, {
|
||||
group: 'draggable-element',
|
||||
animation: 200,
|
||||
// 结束拖拽
|
||||
onEnd: event => {
|
||||
let temp = diyStore.value[event.oldIndex!];
|
||||
diyStore.value.splice(event.oldIndex!, 1);
|
||||
diyStore.value.splice(event.newIndex!, 0, temp);
|
||||
|
||||
nextTick(() => {
|
||||
sortable.sort(
|
||||
range(diyStore.value.length).map(value => {
|
||||
return value.toString();
|
||||
})
|
||||
);
|
||||
|
||||
diyStore.postMessage(event.newIndex, diyStore.value[event.newIndex]);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
// #endif
|
||||
});
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
@import './index.scss';
|
||||
</style>
|
||||
@ -1,13 +0,0 @@
|
||||
<template>
|
||||
<view class="fixed-group">
|
||||
<template v-if="props.data.global.component == 'demo-index'">
|
||||
<fixed-demo-index :data="props.data" :pullDownRefresh="props.pullDownRefresh"></fixed-demo-index>
|
||||
</template>
|
||||
</view>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
const props = defineProps(['data', 'pullDownRefresh']);
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
@import './index.scss';
|
||||
</style>
|
||||
@ -15,7 +15,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"><!--app-html--></div>
|
||||
<script type="module" src="/main.js"></script>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
<script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,3 +0,0 @@
|
||||
{
|
||||
"index": "Index"
|
||||
}
|
||||
@ -1,31 +0,0 @@
|
||||
{
|
||||
// pages.json 中文标题
|
||||
"pages.index.index": "",
|
||||
"pages.index.close": "站点已关闭",
|
||||
"pages.index.nosite": "站点不存在",
|
||||
"pages.index.develop": "开发环境配置",
|
||||
"pages.index.diy": "",
|
||||
"pages.article.list": "资讯中心",
|
||||
"pages.article.detail": "文章详情",
|
||||
"pages.auth.agreement": "协议",
|
||||
"pages.auth.bind": "绑定手机号",
|
||||
"pages.auth.login": "登录",
|
||||
"pages.auth.register": "注册",
|
||||
"pages.auth.resetpwd": "找回密码",
|
||||
"pages.member.account": "会员账户",
|
||||
"pages.member.account_edit": "编辑会员账户",
|
||||
"pages.member.apply_cash_out": "申请提现",
|
||||
"pages.member.balance": "我的余额",
|
||||
"pages.member.cash_out": "提现记录",
|
||||
"pages.member.cash_out_detail": "提现详情",
|
||||
"pages.member.commission": "我的佣金",
|
||||
"pages.member.detailed_account": "流水明细",
|
||||
"pages.member.index": "",
|
||||
"pages.member.personal": "个人资料",
|
||||
"pages.member.recharge_record": "充值记录",
|
||||
"pages.member.recharge_record_detail": "充值详情",
|
||||
"pages.pay.browser": "支付",
|
||||
"pages.pay.result": "支付结果",
|
||||
"pages.setting.index": "设置",
|
||||
"pages.webview.index": ""
|
||||
}
|
||||
@ -1,49 +0,0 @@
|
||||
{
|
||||
"requestFail": "请求失败",
|
||||
"notInDomainList": "不在request 合法域名列表中",
|
||||
"currency": "¥",
|
||||
"getSmsCode": "获取验证码",
|
||||
"smsCodeChangeText": "秒后重新获取",
|
||||
"captchaTitle": "请完成验证",
|
||||
"confirm": "确认",
|
||||
"cancel": "取消",
|
||||
"save": "保存",
|
||||
"delete": "删除",
|
||||
"captchaPlaceholder": "请输入验证码",
|
||||
"mobilePlaceholder": "请输入手机号码",
|
||||
"mobileError": "请输入正确的手机号",
|
||||
"codePlaceholder": "请输入手机验证码",
|
||||
"memberCenter": "个人中心",
|
||||
"userAgreement": "用户协议",
|
||||
"privacyAgreement": "隐私协议",
|
||||
"nickname": "昵称",
|
||||
"nicknamePlaceholder": "请输入昵称",
|
||||
"headimg": "头像",
|
||||
"headimgPlaceholder": "请设置头像",
|
||||
"getAvatarNickname": "获取您的昵称头像",
|
||||
"getAvatarNicknameTips": "获取用户头像、昵称完善个人资料,主要用于向用户提供具有辨识度的用户中心界面",
|
||||
"point": "积分",
|
||||
"balance": "余额",
|
||||
"login": "登录",
|
||||
"register": "注册",
|
||||
"complete": "完成",
|
||||
"close": "关闭",
|
||||
"pay": {
|
||||
"orderInfo": "订单信息",
|
||||
"confirmPay": "确认支付",
|
||||
"payTitle": "确认付款",
|
||||
"notHavePayType": "没有可用的支付方式",
|
||||
"notObtainedInfo": "未获取到支付信息",
|
||||
"paymentDocuments": "该支付单据",
|
||||
"paySuccess": "支付成功",
|
||||
"payFail": "支付失败",
|
||||
"completePay": "已完成支付",
|
||||
"incompletePay": "未完成支付",
|
||||
"getting": "获取支付结果中"
|
||||
},
|
||||
"myBalance": "我的余额",
|
||||
"myPoint": "我的积分",
|
||||
"customerService": "联系客服",
|
||||
"siteClose": "站点已关闭",
|
||||
"noSite": "站点不存在"
|
||||
}
|
||||
@ -1,5 +0,0 @@
|
||||
{
|
||||
"detail": "文章详情",
|
||||
"abstract": "摘要",
|
||||
"loadingText": "正在加载"
|
||||
}
|
||||
@ -1,7 +0,0 @@
|
||||
{
|
||||
"list": "文章列表",
|
||||
"noData": "~ 暂无数据 ~",
|
||||
"all": "全部",
|
||||
"end": "-- 到底了 --",
|
||||
"searchPlaceholder": "请输入搜索关键词"
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
import App from './App'
|
||||
|
||||
import { createSSRApp } from 'vue'
|
||||
import * as Pinia from 'pinia'
|
||||
import locale from './locale'
|
||||
import uviewPlus from 'uview-plus'
|
||||
import '@/styles/index.scss'
|
||||
import 'virtual:windi.css'
|
||||
import { uniStorage } from './utils/storage'
|
||||
|
||||
export function createApp() {
|
||||
const app = createSSRApp(App)
|
||||
app.use(Pinia.createPinia())
|
||||
app.use(locale)
|
||||
app.use(uviewPlus)
|
||||
uniStorage()
|
||||
return {
|
||||
app,
|
||||
Pinia
|
||||
}
|
||||
}
|
||||
23618
uni-app/package-lock.json
generated
23618
uni-app/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,16 +1,84 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"lodash-es": "^4.17.21",
|
||||
"sortablejs": "^1.15.0",
|
||||
"uview-plus": "^3.1.29",
|
||||
"vue-i18n": "^9.2.2",
|
||||
"weixin-js-sdk": "^1.6.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@dcasia/mini-program-tailwind-webpack-plugin": "^1.5.6",
|
||||
"@rollup/plugin-commonjs": "^24.0.1",
|
||||
"@types/sortablejs": "^1.15.0",
|
||||
"vite-plugin-windicss": "^1.8.10",
|
||||
"windicss": "^3.5.6"
|
||||
}
|
||||
}
|
||||
"name": "uni-preset-vue",
|
||||
"version": "0.0.0",
|
||||
"scripts": {
|
||||
"dev:app": "uni -p app",
|
||||
"dev:app-android": "uni -p app-android",
|
||||
"dev:app-ios": "uni -p app-ios",
|
||||
"dev:custom": "uni -p",
|
||||
"dev:h5": "uni",
|
||||
"dev:h5:ssr": "uni --ssr",
|
||||
"dev:mp-alipay": "uni -p mp-alipay",
|
||||
"dev:mp-baidu": "uni -p mp-baidu",
|
||||
"dev:mp-jd": "uni -p mp-jd",
|
||||
"dev:mp-kuaishou": "uni -p mp-kuaishou",
|
||||
"dev:mp-lark": "uni -p mp-lark",
|
||||
"dev:mp-qq": "uni -p mp-qq",
|
||||
"dev:mp-toutiao": "uni -p mp-toutiao",
|
||||
"dev:mp-weixin": "uni -p mp-weixin",
|
||||
"dev:quickapp-webview": "uni -p quickapp-webview",
|
||||
"dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei",
|
||||
"dev:quickapp-webview-union": "uni -p quickapp-webview-union",
|
||||
"build:app": "uni build -p app",
|
||||
"build:app-android": "uni build -p app-android",
|
||||
"build:app-ios": "uni build -p app-ios",
|
||||
"build:custom": "uni build -p",
|
||||
"build:h5": "uni build",
|
||||
"build:h5:ssr": "uni build --ssr",
|
||||
"build:mp-alipay": "uni build -p mp-alipay",
|
||||
"build:mp-baidu": "uni build -p mp-baidu",
|
||||
"build:mp-jd": "uni build -p mp-jd",
|
||||
"build:mp-kuaishou": "uni build -p mp-kuaishou",
|
||||
"build:mp-lark": "uni build -p mp-lark",
|
||||
"build:mp-qq": "uni build -p mp-qq",
|
||||
"build:mp-toutiao": "uni build -p mp-toutiao",
|
||||
"build:mp-weixin": "uni build -p mp-weixin",
|
||||
"build:quickapp-webview": "uni build -p quickapp-webview",
|
||||
"build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
|
||||
"build:quickapp-webview-union": "uni build -p quickapp-webview-union",
|
||||
"type-check": "vue-tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@dcloudio/uni-app": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-app-plus": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-components": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-h5": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-mp-alipay": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-mp-baidu": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-mp-jd": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-mp-kuaishou": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-mp-lark": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-mp-qq": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-mp-toutiao": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-mp-weixin": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-quickapp-webview": "3.0.0-3080720230703001",
|
||||
"html2canvas": "^1.4.1",
|
||||
"image-tools": "^1.4.0",
|
||||
"lodash-es": "^4.17.21",
|
||||
"pinia": "^2.0.36",
|
||||
"qrcode": "^1.5.1",
|
||||
"sortablejs": "^1.15.0",
|
||||
"uview-plus": "^3.1.29",
|
||||
"vue": "^3.3.0",
|
||||
"vue-i18n": "^9.2.2",
|
||||
"weixin-js-sdk": "^1.6.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@dcasia/mini-program-tailwind-webpack-plugin": "^1.5.6",
|
||||
"@dcloudio/types": "^3.3.2",
|
||||
"@dcloudio/uni-automator": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-cli-shared": "3.0.0-3080720230703001",
|
||||
"@dcloudio/uni-stacktracey": "3.0.0-3080720230703001",
|
||||
"@dcloudio/vite-plugin-uni": "3.0.0-3080720230703001",
|
||||
"@rollup/plugin-commonjs": "^24.0.1",
|
||||
"@types/qrcode": "^1.5.0",
|
||||
"@types/sortablejs": "^1.15.0",
|
||||
"@vue/tsconfig": "^0.1.3",
|
||||
"sass": "^1.54.5",
|
||||
"typescript": "^4.9.4",
|
||||
"vite": "4.0.4",
|
||||
"vite-plugin-windicss": "^1.8.10",
|
||||
"vue-tsc": "^1.0.24",
|
||||
"windicss": "^3.5.6"
|
||||
}
|
||||
}
|
||||
@ -1,66 +0,0 @@
|
||||
<template>
|
||||
<view class="bg-white">
|
||||
<block v-if="!loading">
|
||||
<view class="border-solid border-t-0 border-l-0 border-r-0 border-b-[1px] border-gray-200 p-[10px]">
|
||||
<view class="text-[16px]">
|
||||
{{articleDetail.title}}
|
||||
</view>
|
||||
<view class="flex align-center justify-between text-[12px] text-gray-400 mt-[15px]">
|
||||
<text>{{articleDetail.create_time}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="mx-[10px] my-[10px] bg-gray-100 p-[8px] text-[14px] rounded-[5px] leading-[1.3]">
|
||||
{{t('abstract')}}:{{articleDetail.summary}}
|
||||
</view>
|
||||
<view class="px-[10px] pd-[10px]">
|
||||
<u-parse :content="articleDetail.content" :tagStyle="style"></u-parse>
|
||||
</view>
|
||||
</block>
|
||||
<u-loading-page bg-color="rgb(248,248,248)" :loading="loading" fontSize="16" color="#333"
|
||||
:loadingText="t('loadingText')"></u-loading-page>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { reactive, ref } from 'vue'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { t } from '@/locale'
|
||||
import { getArticleDetail } from '@/api/article';
|
||||
import { useShare } from '@/hooks/useShare'
|
||||
|
||||
const { setShare, onShareAppMessage, onShareTimeline } = useShare()
|
||||
onShareAppMessage()
|
||||
onShareTimeline()
|
||||
|
||||
let articleDetail = ref<Array<any>>([]);
|
||||
let loading = ref<boolean>(true);
|
||||
let style = {
|
||||
h2: 'margin-bottom: 15px;',
|
||||
p: 'margin-bottom: 10px;line-height: 1.5;',
|
||||
img: 'margin: 10px 0;',
|
||||
};
|
||||
onLoad((option) => {
|
||||
loading.value = true;
|
||||
getArticleDetail(option.id).then((res) => {
|
||||
articleDetail.value = res.data;
|
||||
loading.value = false;
|
||||
let share = {
|
||||
title: articleDetail.value.title,
|
||||
desc: articleDetail.value.intro,
|
||||
url: articleDetail.value.image
|
||||
}
|
||||
uni.setNavigationBarTitle({
|
||||
title: articleDetail.value.title
|
||||
})
|
||||
setShare({
|
||||
wechat: {
|
||||
...share
|
||||
},
|
||||
weapp: {
|
||||
...share
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
</script>
|
||||
<style lang="scss" scoped></style>
|
||||
@ -1,166 +0,0 @@
|
||||
<template>
|
||||
<view class="bg-gray-100 min-h-[100vh]">
|
||||
<view class="fixed top-0 inset-x-0 z-10">
|
||||
<view
|
||||
class='p-[10px] bg-white border-solid border-t-0 border-l-0 border-r-0 border-b-[1px] border-gray-200'>
|
||||
<u-search :placeholder="t('searchPlaceholder')" actionText :actionStyle="{'width':0,'margin':0}"
|
||||
v-model="articleTitle" @clickIcon="searchFn"></u-search>
|
||||
</view>
|
||||
<scroll-view :scroll-x="true" :enable-flex="true"
|
||||
class="nav-list bg-white align-center px-[10px] box-border">
|
||||
<view class="flex scroll-view-wrap">
|
||||
<view
|
||||
:class="['nav-item text-[14px] mx-[5px] h-[30px] leading-[30px] my-[5px] border-t-0 border-l-0 border-r-0',{'border-solid border-b-[2px] active': currCategoryId==item.category_id}]"
|
||||
@click="loadCategory(item.category_id)" v-for="(item,index) in categoryList"
|
||||
:key="item.category_id">
|
||||
{{item.name}}
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
|
||||
<mescroll-body ref="mescrollRef" @init="mescrollInit" top="220rpx" @down="downCallback" @up="getArticleListFn">
|
||||
<view v-for="(item,index) in articleList" :key="item.id"
|
||||
:class="['bg-white flex align-center p-[10px]',{'border-solid border-t-0 border-l-0 border-r-0 border-b-[1px] border-gray-200': articleList.length-1 !== index}] "
|
||||
@click="toLink(item.id)">
|
||||
<u--image width="260rpx" height="200rpx" :src="img(item.image)" v-if="item.image" model="aspectFill">
|
||||
<template #error>
|
||||
<u-icon name="photo" color="#999" size="50"></u-icon>
|
||||
</template>
|
||||
</u--image>
|
||||
<view class="flex-1 flex flex-col justify-between ml-[10px]">
|
||||
<view class="text-[16px] leading-[1.3] multi-hidden mt-[2px]">{{item.title}}</view>
|
||||
<view class="text-[14px] using-hidden mb-[auto] mt-[10px] text-gray-500">{{item.summary}}</view>
|
||||
<view class="text-[12px] text-gray-400 flex justify-between mb-[5px]">
|
||||
<text class="">{{item.create_time}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<mescroll-empty v-if="!articleList.length && loading"></mescroll-empty>
|
||||
</mescroll-body>
|
||||
<tabbar />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { reactive, ref, onMounted } from 'vue'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { t } from '@/locale'
|
||||
import { redirect, img } from '@/utils/common';
|
||||
import { getArticleList, getArticleCategory } from '@/api/article';
|
||||
import MescrollBody from '@/components/mescroll/mescroll-body/mescroll-body.vue';
|
||||
import MescrollEmpty from '@/components/mescroll/mescroll-empty/mescroll-empty.vue';
|
||||
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
|
||||
import { onPageScroll, onReachBottom } from '@dcloudio/uni-app';
|
||||
const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom);
|
||||
import { useShare } from '@/hooks/useShare'
|
||||
|
||||
const { setShare, onShareAppMessage, onShareTimeline } = useShare()
|
||||
setShare()
|
||||
onShareAppMessage()
|
||||
onShareTimeline()
|
||||
|
||||
let categoryList = ref<Array<Object>>([]);
|
||||
let articleList = ref<Array<any>>([]);
|
||||
let currCategoryId = ref<number | string>('');
|
||||
let articleTitle = ref<string>('');
|
||||
let mescrollRef = ref(null);
|
||||
let loading = ref<boolean>(false);
|
||||
|
||||
interface acceptingDataStructure {
|
||||
data : acceptingDataItemStructure,
|
||||
msg : string,
|
||||
code : number
|
||||
}
|
||||
interface acceptingDataItemStructure {
|
||||
data : object,
|
||||
[propName : string] : number | string | object
|
||||
}
|
||||
onLoad(async () => {
|
||||
await getArticleCategory().then((res : acceptingDataStructure) => {
|
||||
const initData = { name: t("all"), category_id: '' };
|
||||
categoryList.value.push(initData);
|
||||
categoryList.value = categoryList.value.concat(res.data.data);
|
||||
});
|
||||
})
|
||||
|
||||
interface mescrollStructure {
|
||||
num : number,
|
||||
size : number,
|
||||
endSuccess : Function,
|
||||
[propName : string] : any
|
||||
}
|
||||
const getArticleListFn = (mescroll : mescrollStructure) => {
|
||||
loading.value = false;
|
||||
let data : object = {
|
||||
category_id: currCategoryId.value,
|
||||
title: articleTitle.value,
|
||||
page: mescroll.num,
|
||||
limit: mescroll.size
|
||||
};
|
||||
|
||||
getArticleList(data).then((res : acceptingDataStructure) => {
|
||||
let newArr = (res.data.data as Array<Object>);
|
||||
//设置列表数据
|
||||
if (mescroll.num == 1) {
|
||||
articleList.value = []; //如果是第一页需手动制空列表
|
||||
}
|
||||
articleList.value = articleList.value.concat(newArr);
|
||||
mescroll.endSuccess(newArr.length);
|
||||
loading.value = true;
|
||||
}).catch(() => {
|
||||
loading.value = true;
|
||||
mescroll.endErr(); // 请求失败, 结束加载
|
||||
})
|
||||
}
|
||||
|
||||
const loadCategory = (id : string) => {
|
||||
currCategoryId.value = id;
|
||||
getMescroll().resetUpScroll();
|
||||
}
|
||||
|
||||
const searchFn = () => {
|
||||
getMescroll().resetUpScroll();
|
||||
}
|
||||
|
||||
const toLink = (id : string) => {
|
||||
redirect({ url: '/pages/article/detail', param: { id } })
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
setTimeout(() => {
|
||||
getMescroll().optUp.textNoMore = t("end");
|
||||
}, 500)
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.nav-item.active {
|
||||
color: $u-primary;
|
||||
}
|
||||
|
||||
.scroll-view-wrap {
|
||||
word-break: keep-all;
|
||||
}
|
||||
|
||||
/* 单行超出隐藏 */
|
||||
.using-hidden {
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 1;
|
||||
-webkit-box-orient: vertical;
|
||||
white-space: break-spaces;
|
||||
}
|
||||
|
||||
/* 多行超出隐藏 */
|
||||
.multi-hidden {
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
</style>
|
||||
@ -1,16 +0,0 @@
|
||||
<template>
|
||||
<view class="w-screen h-screen flex flex-col items-center justify-center">
|
||||
<u-empty
|
||||
:icon="img('static/resource/images/site/close.png')"
|
||||
:text="t('siteClose')"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { img } from '@/utils/common'
|
||||
import { t } from '@/locale'
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
@ -1,16 +0,0 @@
|
||||
<template>
|
||||
<view class="w-screen h-screen flex flex-col items-center justify-center">
|
||||
<u-empty
|
||||
:icon="img('static/resource/images/site/close.png')"
|
||||
:text="t('noSite')"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { img } from '@/utils/common'
|
||||
import { t } from '@/locale'
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
@ -2,15 +2,16 @@
|
||||
import { onLaunch, onShow, onHide } from '@dcloudio/uni-app'
|
||||
import manifest from '@/manifest.json'
|
||||
import { redirectInterceptor, launchInterceptor } from '@/utils/interceptor'
|
||||
import { getToken, isWeixinBrowser, getSiteId } from '@/utils/common'
|
||||
import { getToken, isWeixinBrowser } from '@/utils/common'
|
||||
import useMemberStore from '@/stores/member'
|
||||
import useConfigStore from '@/stores/config'
|
||||
import useSystemStore from '@/stores/system'
|
||||
import { useLogin } from '@/hooks/useLogin'
|
||||
import { language } from '@/locale'
|
||||
import { language } from './locale'
|
||||
|
||||
// #ifdef H5
|
||||
if (import.meta.env.VITE_APP_DEBUG) { new window.VConsole() }
|
||||
if (import.meta.env.VITE_APP_DEBUG) {
|
||||
new window.VConsole()
|
||||
}
|
||||
// #endif
|
||||
|
||||
onLaunch(async (data) => {
|
||||
@ -22,16 +23,33 @@
|
||||
// #ifdef H5
|
||||
uni.getSystemInfoSync().platform == 'ios' && (uni.setStorageSync('initUrl', location.href))
|
||||
|
||||
// 缺少站点id,拦截
|
||||
if (process.env.NODE_ENV == 'development' && (getSiteId(uni.getStorageSync('wap_site_id') || import.meta.env.VITE_SITE_ID) === '')) return;
|
||||
// 传输给后台数据
|
||||
window.parent.postMessage(JSON.stringify({
|
||||
type: 'appOnLaunch',
|
||||
message: '初始化加载完成'
|
||||
}), '*');
|
||||
|
||||
// 监听父页面发来的消息
|
||||
window.addEventListener('message', event => {
|
||||
try {
|
||||
let data = JSON.parse(event.data);
|
||||
if (data.type == 'appOnReady') {
|
||||
window.parent.postMessage(JSON.stringify({
|
||||
type: 'appOnReady',
|
||||
message: '加载完成'
|
||||
}), '*');
|
||||
}
|
||||
} catch (e) {
|
||||
console.log('uniapp app接受数据错误', e)
|
||||
}
|
||||
}, false);
|
||||
|
||||
// #endif
|
||||
|
||||
const configStore = useConfigStore()
|
||||
configStore.getTabbarConfig()
|
||||
await configStore.getLoginConfig()
|
||||
|
||||
useSystemStore().getSitenfo()
|
||||
|
||||
// 隐藏tabbar
|
||||
uni.hideTabBar()
|
||||
|
||||
@ -72,7 +90,7 @@
|
||||
</script>
|
||||
|
||||
<style>
|
||||
uni-page-head {
|
||||
display: none!important;
|
||||
}
|
||||
uni-page-head {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@ -3,15 +3,15 @@ import request from '@/utils/request'
|
||||
/**
|
||||
* 用户名登录
|
||||
*/
|
||||
export function usernameLogin(data : AnyObject) {
|
||||
return request.get('login', data, { showErrorMessage: true })
|
||||
export function usernameLogin(data: AnyObject) {
|
||||
return request.get('login', data, {showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 手机验证码登录
|
||||
*/
|
||||
export function mobileLogin(data : AnyObject) {
|
||||
return request.post('login/mobile', data, { showErrorMessage: true })
|
||||
export function mobileLogin(data: AnyObject) {
|
||||
return request.post('login/mobile', data, {showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
@ -31,47 +31,47 @@ export function logout() {
|
||||
/**
|
||||
* 用户名注册
|
||||
*/
|
||||
export function usernameRegister(data : AnyObject) {
|
||||
export function usernameRegister(data: AnyObject) {
|
||||
let url = 'register'
|
||||
data.pid && (url += `?pid=${data.pid}`)
|
||||
return request.post(url, data, { showErrorMessage: true })
|
||||
return request.post(url, data, {showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 手机号注册
|
||||
*/
|
||||
export function mobileRegister(data : AnyObject) {
|
||||
export function mobileRegister(data: AnyObject) {
|
||||
let url = 'register/mobile'
|
||||
data.pid && (url += `?pid=${data.pid}`)
|
||||
return request.post(url, data, { showErrorMessage: true })
|
||||
return request.post(url, data, {showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信公众号授权登录
|
||||
*/
|
||||
export function wechatLogin(data : AnyObject) {
|
||||
export function wechatLogin(data: AnyObject) {
|
||||
return request.post('wechat/login', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信公众号授权登录
|
||||
*/
|
||||
export function weappLogin(data : AnyObject) {
|
||||
export function weappLogin(data: AnyObject) {
|
||||
return request.post('weapp/login', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 绑定手机号
|
||||
*/
|
||||
export function bind(data : AnyObject) {
|
||||
export function bind(data: AnyObject) {
|
||||
let url = 'bind'
|
||||
data.pid && (url += `?pid=${data.pid}`)
|
||||
return request.post(url, data, { showErrorMessage: true })
|
||||
return request.post(url, data, {showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 记录会员访问日志
|
||||
*/
|
||||
export function memberLog(data : AnyObject) {
|
||||
return request.post('member/log', data, { showErrorMessage: false })
|
||||
export function memberLog(data: AnyObject) {
|
||||
return request.post('member/log', data, {showErrorMessage: false})
|
||||
}
|
||||
22
uni-app/src/app/api/diy.ts
Normal file
22
uni-app/src/app/api/diy.ts
Normal file
@ -0,0 +1,22 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
/**
|
||||
* 获取自定义页面信息
|
||||
*/
|
||||
export function getDiyInfo(params: Record<string, any>) {
|
||||
return request.get('diy/diy', params)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取底部导航信息
|
||||
*/
|
||||
export function getTabbarInfo() {
|
||||
return request.get('diy/tabbar')
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取页面分享信息
|
||||
*/
|
||||
export function getShareInfo(params: Record<string, any>) {
|
||||
return request.get('diy/share', params)
|
||||
}
|
||||
169
uni-app/src/app/api/member.ts
Normal file
169
uni-app/src/app/api/member.ts
Normal file
@ -0,0 +1,169 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export function getMemberInfo() {
|
||||
return request.get('member/member')
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取积分流水
|
||||
*/
|
||||
export function getPointList(data: AnyObject) {
|
||||
return request.get('member/account/point', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取不可提现余额流水
|
||||
*/
|
||||
export function getBalanceList(data: AnyObject) {
|
||||
return request.get('member/account/balance', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取可提现余额流水
|
||||
*/
|
||||
export function getMoneyList(data: AnyObject) {
|
||||
return request.get('member/account/money', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 会员信息修改
|
||||
*/
|
||||
export function modifyMember(data: AnyObject) {
|
||||
return request.put(`member/modify/${data.field}`, data, {showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 发起充值
|
||||
*/
|
||||
export function createRecharge(data: AnyObject) {
|
||||
return request.post('recharge/recharge', data, {showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 充值记录列表
|
||||
*/
|
||||
export function getRechargeList(data: AnyObject) {
|
||||
return request.get('recharge/recharge', data, {showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 充值记录详情
|
||||
*/
|
||||
export function getRechargeDetail(id: number) {
|
||||
return request.get(`recharge/recharge/${id}`, {}, {showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录会员绑定手机号
|
||||
*/
|
||||
export function bindMobile(data: AnyObject) {
|
||||
return request.put('member/mobile', data, {showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 提现转账方式
|
||||
*/
|
||||
export function cashOutTransferType() {
|
||||
return request.get('member/cash_out/transfertype')
|
||||
}
|
||||
|
||||
/**
|
||||
* 提现配置
|
||||
*/
|
||||
export function cashOutConfig() {
|
||||
return request.get('member/cash_out/config')
|
||||
}
|
||||
|
||||
/**
|
||||
* 申请余额提现
|
||||
*/
|
||||
export function cashOutApply(data: AnyObject) {
|
||||
return request.post('member/cash_out/apply', data, {showSuccessMessage: true, showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取提现账户信息
|
||||
*/
|
||||
export function getCashoutAccountInfo(data: AnyObject) {
|
||||
return request.get(`member/cashout_account/${data.account_id}`, {})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取首条提现账户信息
|
||||
*/
|
||||
export function getFirstCashoutAccountInfo(data: AnyObject) {
|
||||
return request.get('member/cashout_account/firstinfo', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取提现账户列表
|
||||
*/
|
||||
export function getCashoutAccountList(data: AnyObject) {
|
||||
return request.get(`member/cashout_account`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取提现记录列表
|
||||
*/
|
||||
export function getCashOutList(data: AnyObject) {
|
||||
return request.get(`member/cash_out`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取提现记录详情
|
||||
*/
|
||||
export function getCashOutDetail(id: number) {
|
||||
return request.get(`member/cash_out/${id}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加提现账户
|
||||
*/
|
||||
export function addCashoutAccount(data: AnyObject) {
|
||||
return request.post('member/cashout_account', data, {showSuccessMessage: true, showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加提现账户
|
||||
*/
|
||||
export function editCashoutAccount(data: AnyObject) {
|
||||
return request.put(`member/cashout_account/${data.account_id}`, data, {
|
||||
showSuccessMessage: true,
|
||||
showErrorMessage: true
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除提现账户
|
||||
*/
|
||||
export function deleteCashoutAccount(accountId: number) {
|
||||
return request.delete(`member/cashout_account/${accountId}`, {showSuccessMessage: true, showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 佣金信息
|
||||
*/
|
||||
export function getCommissionList(data: AnyObject) {
|
||||
return request.get(`member/account/commission`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加收藏
|
||||
*/
|
||||
export function setCollect(data: AnyObject){
|
||||
return request.post(`member/collect`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询收藏(单条)
|
||||
*/
|
||||
export function getCollect(data: AnyObject){
|
||||
return request.get(`member/collect`, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消收藏
|
||||
*/
|
||||
export function deleteCollect(id: number){
|
||||
return request.delete(`member/collect/${id}`)
|
||||
}
|
||||
15
uni-app/src/app/api/pay.ts
Normal file
15
uni-app/src/app/api/pay.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
/**
|
||||
* 支付
|
||||
*/
|
||||
export function pay(data: AnyObject) {
|
||||
return request.post(`pay`, data, {showErrorMessage: true})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取支付信息
|
||||
*/
|
||||
export function getPayInfo(tradeType: string, tradeId: number) {
|
||||
return request.get(`pay/info/${tradeType}/${tradeId}`, {}, {showErrorMessage: true})
|
||||
}
|
||||
@ -4,82 +4,82 @@ import request from '@/utils/request'
|
||||
* 获取验证码
|
||||
*/
|
||||
export function getCaptcha() {
|
||||
return request.get('captcha', {}, { showErrorMessage: true })
|
||||
return request.get('captcha', {}, { showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信公众号授权码
|
||||
*/
|
||||
export function getWechatAuthCode(data : AnyObject) {
|
||||
return request.get('wechat/codeurl', data)
|
||||
return request.get('wechat/codeurl', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 同步微信信息
|
||||
*/
|
||||
export function wechatSync(data : AnyObject) {
|
||||
return request.post('wechat/sync', data)
|
||||
return request.post('wechat/sync', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取协议信息
|
||||
*/
|
||||
export function getAgreementInfo(key : string) {
|
||||
return request.get(`agreement/${key}`)
|
||||
return request.get(`agreement/${key}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置密码
|
||||
*/
|
||||
export function resetPassword(data : AnyObject) {
|
||||
return request.post(`password/reset`, data, { showErrorMessage: true })
|
||||
return request.post(`password/reset`, data, { showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送短信验证码
|
||||
*/
|
||||
export function sendSms(data : AnyObject) {
|
||||
return request.post(`send/mobile/${data.type}`, data, { showErrorMessage: true })
|
||||
return request.post(`send/mobile/${data.type}`, data, { showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信jssdk config
|
||||
*/
|
||||
export function getWechatSkdConfig(data : AnyObject) {
|
||||
return request.get('wechat/jssdkconfig', data)
|
||||
return request.get('wechat/jssdkconfig', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传图片
|
||||
*/
|
||||
export function uploadImage(data : AnyObject) {
|
||||
return request.upload('file/image', data, { showErrorMessage: true })
|
||||
return request.upload('file/image', data, { showErrorMessage: true })
|
||||
}
|
||||
|
||||
/**
|
||||
* 拉取图片
|
||||
*/
|
||||
export function fetchImage(data : AnyObject) {
|
||||
return request.post('file/image/fetch', data)
|
||||
return request.post('file/image/fetch', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 拉取base64图片
|
||||
*/
|
||||
export function fetchBase64Image(data : AnyObject) {
|
||||
return request.post('file/image/base64', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取站点信息
|
||||
*/
|
||||
export function getSiteInfo() {
|
||||
return request.get('site')
|
||||
return request.post('file/image/base64', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信小程序订阅消息模板id
|
||||
*/
|
||||
export function getWeappTemplateId(keys: string) {
|
||||
return request.get('weapp/subscribemsg', { keys })
|
||||
export function getWeappTemplateId(keys : string) {
|
||||
return request.get('weapp/subscribemsg', { keys })
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取手机端首页列表
|
||||
*/
|
||||
export function getWapIndexList(data : AnyObject) {
|
||||
return request.get('wap_index', data)
|
||||
}
|
||||
120
uni-app/src/app/components/diy/addon-list/index.vue
Normal file
120
uni-app/src/app/components/diy/addon-list/index.vue
Normal file
@ -0,0 +1,120 @@
|
||||
<template>
|
||||
<view :style="warpCss">
|
||||
<view v-for="(item,index) in list" :key="item.id"
|
||||
:class="['item flex align-center p-[20rpx] mb-[20rpx]',{'border-solid border-t-0 border-l-0 border-r-0 border-b border-gray-200': list.length-1 !== index}] "
|
||||
@click="toLink(item.url)">
|
||||
<u--image width="120rpx" height="120rpx" :src="img(item.icon)" v-if="item.icon"
|
||||
class="rounded-md overflow-hidden" model="aspectFill">
|
||||
<template #error>
|
||||
<u-icon name="photo" color="#999" size="60"></u-icon>
|
||||
</template>
|
||||
</u--image>
|
||||
<view class="flex-1 flex flex-col justify-center ml-[20rpx]">
|
||||
<view class="text-sm leading-[1.3] using-hidden">{{item.title}}</view>
|
||||
<view class="text-xs text-[#999] mt-[8rpx] leading-[1.6] multi-hidden">{{item.desc}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
// 应用列表
|
||||
import { ref, computed, watch, onMounted } from 'vue';
|
||||
import { redirect, img } from '@/utils/common';
|
||||
import useDiyStore from '@/app/stores/diy';
|
||||
import { getWapIndexList } from '@/app/api/system';
|
||||
|
||||
const props = defineProps(['component', 'index', 'pullDownRefresh']);
|
||||
const diyStore = useDiyStore();
|
||||
|
||||
const diyComponent = computed(() => {
|
||||
if (diyStore.mode == 'decorate') {
|
||||
return diyStore.value[props.index];
|
||||
} else {
|
||||
return props.component;
|
||||
}
|
||||
})
|
||||
|
||||
const warpCss = computed(() => {
|
||||
var style = '';
|
||||
if (diyComponent.value.componentBgColor) style += 'background-color:' + diyComponent.value.componentBgColor + ';';
|
||||
if (diyComponent.value.topRounded) style += 'border-top-left-radius:' + diyComponent.value.topRounded * 2 + 'rpx;';
|
||||
if (diyComponent.value.topRounded) style += 'border-top-right-radius:' + diyComponent.value.topRounded * 2 + 'rpx;';
|
||||
if (diyComponent.value.bottomRounded) style += 'border-bottom-left-radius:' + diyComponent.value.bottomRounded * 2 + 'rpx;';
|
||||
if (diyComponent.value.bottomRounded) style += 'border-bottom-right-radius:' + diyComponent.value.bottomRounded * 2 + 'rpx;';
|
||||
return style;
|
||||
})
|
||||
|
||||
const list = ref([])
|
||||
|
||||
watch(
|
||||
() => props.pullDownRefresh,
|
||||
(newValue, oldValue) => {
|
||||
// 处理下拉刷新业务
|
||||
}
|
||||
)
|
||||
|
||||
onMounted(() => {
|
||||
refresh();
|
||||
// 装修模式下刷新
|
||||
if (diyStore.mode == 'decorate') {
|
||||
watch(
|
||||
() => diyComponent.value,
|
||||
(newValue, oldValue) => {
|
||||
if (newValue && newValue.componentName == 'AddonList') {
|
||||
refresh();
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
});
|
||||
|
||||
const refresh = () => {
|
||||
// 装修模式下设置默认图
|
||||
if (diyStore.mode == 'decorate') {
|
||||
diyComponent.value.list.forEach((item : any, index) => {
|
||||
if (item.icon == '') {
|
||||
item.icon = 'static/resource/images/diy/figure.png';
|
||||
}
|
||||
if (item.title == '') {
|
||||
item.title = '应用名称';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (diyComponent.value.list.length == 0) {
|
||||
getWapIndexList().then((res) => {
|
||||
list.value = res.data;
|
||||
})
|
||||
} else {
|
||||
list.value = diyComponent.value.list;
|
||||
}
|
||||
}
|
||||
|
||||
const toLink = (url : string) => {
|
||||
redirect({ url })
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
/* 单行超出隐藏 */
|
||||
.using-hidden {
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 1;
|
||||
-webkit-box-orient: vertical;
|
||||
white-space: break-spaces;
|
||||
}
|
||||
|
||||
/* 多行超出隐藏 */
|
||||
.multi-hidden {
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
</style>
|
||||
@ -1,9 +1,16 @@
|
||||
<template>
|
||||
<view :style="warpCss">
|
||||
<div v-if="diyComponent.navTitle" class="py-[30rpx] px-[32rpx] text-[30rpx]"
|
||||
:style="{fontWeight: diyComponent.font.weight,color:diyComponent.font.color}">
|
||||
{{diyComponent.navTitle}}
|
||||
</div>
|
||||
<view class="flex items-center justify-between py-[30rpx] px-[32rpx]">
|
||||
<view v-if="diyComponent.navTitle" class="text-[30rpx]"
|
||||
:style="{fontWeight: diyComponent.font.weight,color:diyComponent.font.color}">
|
||||
{{diyComponent.navTitle}}
|
||||
</view>
|
||||
<app-link v-if="diyComponent.subNavTitle" :data="diyComponent.subNavTitleLink" class="flex items-baseline"
|
||||
:style="{ color: diyComponent.subNavColor}">
|
||||
<text class="text-[26rpx] mr-[4rpx]">{{diyComponent.subNavTitle}}</text>
|
||||
<text class="text-sm iconfont iconxiangyoujiantou"></text>
|
||||
</app-link>
|
||||
</view>
|
||||
<view v-if="diyComponent.layout == 'vertical'" class="graphic-nav">
|
||||
<view class="graphic-nav-item" v-for="(item, index) in diyComponent.list" :key="item.id">
|
||||
|
||||
@ -121,7 +128,7 @@
|
||||
// 图文导航
|
||||
import { ref, onMounted, watch, computed } from 'vue';
|
||||
import { img, diyRedirect, currRoute, getToken } from '@/utils/common';
|
||||
import useDiyStore from '@/stores/diy';
|
||||
import useDiyStore from '@/app/stores/diy';
|
||||
import { useLogin } from '@/hooks/useLogin';
|
||||
|
||||
const props = defineProps(['component', 'index', 'pullDownRefresh']);
|
||||
@ -217,7 +224,7 @@
|
||||
|
||||
const redirectTo = (link : any) => {
|
||||
if (link.url) {
|
||||
if (currRoute() == 'pages/member/index' && !getToken()) {
|
||||
if (currRoute() == '/app/pages/member/index' && !getToken()) {
|
||||
useLogin().setLoginBack({ url: link.url })
|
||||
return;
|
||||
}
|
||||
@ -13,7 +13,6 @@
|
||||
cursor: move;
|
||||
border-style: dotted;
|
||||
}
|
||||
|
||||
&.selected:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
83
uni-app/src/app/components/diy/group/index.vue
Normal file
83
uni-app/src/app/components/diy/group/index.vue
Normal file
@ -0,0 +1,83 @@
|
||||
<template>
|
||||
<view class="diy-group" id="componentList">
|
||||
<view v-for="(component, index) in data.value" :key="component.id"
|
||||
@click="diyStore.changeCurrentIndex(index, component)" class="draggable-element relative cursor-move"
|
||||
:class="{ selected: diyStore.currentIndex == index,decorate : diyStore.mode == 'decorate' }" :style="component.pageStyle">
|
||||
<template v-if="component.componentName == 'AddonList'">
|
||||
<diy-addon-list :component="component" :index="index" :pullDownRefresh="props.pullDownRefresh"></diy-addon-list>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'GraphicNav'">
|
||||
<diy-graphic-nav :component="component" :index="index" :pullDownRefresh="props.pullDownRefresh"></diy-graphic-nav>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'HorzBlank'">
|
||||
<diy-horz-blank :component="component" :index="index" :pullDownRefresh="props.pullDownRefresh"></diy-horz-blank>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'HotArea'">
|
||||
<diy-hot-area :component="component" :index="index" :pullDownRefresh="props.pullDownRefresh"></diy-hot-area>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'ImageAds'">
|
||||
<diy-image-ads :component="component" :index="index" :pullDownRefresh="props.pullDownRefresh"></diy-image-ads>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'MemberInfo'">
|
||||
<diy-member-info :component="component" :index="index" :pullDownRefresh="props.pullDownRefresh"></diy-member-info>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'RubikCube'">
|
||||
<diy-rubik-cube :component="component" :index="index" :pullDownRefresh="props.pullDownRefresh"></diy-rubik-cube>
|
||||
</template>
|
||||
<template v-if="component.componentName == 'Text'">
|
||||
<diy-text :component="component" :index="index" :pullDownRefresh="props.pullDownRefresh"></diy-text>
|
||||
</template>
|
||||
</view>
|
||||
<template v-if="diyStore.mode == '' && data.global.bottomTabBarSwitch">
|
||||
<view class="pt-[20rpx]"></view>
|
||||
<tabbar />
|
||||
</template>
|
||||
</view>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import useDiyStore from '@/app/stores/diy';
|
||||
import { onMounted, nextTick, computed, ref,watch } from 'vue';
|
||||
import Sortable from 'sortablejs';
|
||||
import { range } from 'lodash-es';
|
||||
const props = defineProps(['data','pullDownRefresh']);
|
||||
const diyStore = useDiyStore();
|
||||
|
||||
const data = computed(() => {
|
||||
if (diyStore.mode == 'decorate') {
|
||||
return diyStore;
|
||||
} else {
|
||||
return props.data;
|
||||
}
|
||||
})
|
||||
|
||||
onMounted(() => {
|
||||
// #ifdef H5
|
||||
if (diyStore.mode == 'decorate') {
|
||||
var el = document.getElementById('componentList');
|
||||
const sortable = Sortable.create(el, {
|
||||
group: 'draggable-element',
|
||||
animation: 200,
|
||||
// 结束拖拽
|
||||
onEnd: event => {
|
||||
let temp = diyStore.value[event.oldIndex!];
|
||||
diyStore.value.splice(event.oldIndex!, 1);
|
||||
diyStore.value.splice(event.newIndex!, 0, temp);
|
||||
|
||||
nextTick(() => {
|
||||
sortable.sort(
|
||||
range(diyStore.value.length).map(value => {
|
||||
return value.toString();
|
||||
})
|
||||
);
|
||||
|
||||
diyStore.postMessage(event.newIndex, diyStore.value[event.newIndex]);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
// #endif
|
||||
});
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
@import './index.scss';
|
||||
</style>
|
||||
@ -6,7 +6,7 @@
|
||||
<script setup lang="ts">
|
||||
// 辅助空白
|
||||
import { computed, watch } from 'vue';
|
||||
import useDiyStore from '@/stores/diy';
|
||||
import useDiyStore from '@/app/stores/diy';
|
||||
|
||||
const props = defineProps(['component', 'index', 'pullDownRefresh']);
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
<script setup lang="ts">
|
||||
// 热区
|
||||
import { computed, watch, onMounted } from 'vue';
|
||||
import useDiyStore from '@/stores/diy';
|
||||
import useDiyStore from '@/app/stores/diy';
|
||||
import { img } from '@/utils/common';
|
||||
|
||||
const props = defineProps(['component', 'index', 'pullDownRefresh']);
|
||||
@ -25,7 +25,7 @@
|
||||
// 图片广告
|
||||
import { ref, onMounted, watch, computed } from 'vue';
|
||||
import { img } from '@/utils/common';
|
||||
import useDiyStore from '@/stores/diy';
|
||||
import useDiyStore from '@/app/stores/diy';
|
||||
|
||||
const props = defineProps(['component', 'index', 'pullDownRefresh']);
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
UID:{{ info.member_no }}</view>
|
||||
</view>
|
||||
<view class="set-icon flex items-center absolute right-0 top-2">
|
||||
<app-link url="/pages/setting/index">
|
||||
<app-link url="/app/pages/setting/index">
|
||||
<text class="iconfont iconshezhi text-[1.6rem] ml-[10rpx]"
|
||||
:style="{ color : diyComponent.textColor }"></text>
|
||||
</app-link>
|
||||
@ -25,7 +25,7 @@
|
||||
</view>
|
||||
</view>
|
||||
<view class="set-icon flex items-center absolute right-0 top-2">
|
||||
<app-link url="/pages/setting/index">
|
||||
<app-link url="/app/pages/setting/index">
|
||||
<text class="iconfont iconshezhi text-[1.6rem] ml-[10rpx]"
|
||||
:style="{ color : diyComponent.textColor }"></text>
|
||||
</app-link>
|
||||
@ -35,22 +35,22 @@
|
||||
<view class="flex m-[30rpx] mb-0 py-[30rpx] items-center">
|
||||
<view class="flex-1 text-center">
|
||||
<view class="font-bold">
|
||||
<app-link :url="(info ? '/pages/member/balance' : '')"
|
||||
<app-link :url="(info ? '/app/pages/member/balance' : '')"
|
||||
:style="{ color : diyComponent.textColor }">{{ money }}</app-link>
|
||||
</view>
|
||||
<view class="text-sm mt-[10rpx]">
|
||||
<app-link :url="(info ? '/pages/member/balance' : '')"
|
||||
<app-link :url="(info ? '/app/pages/member/balance' : '')"
|
||||
:style="{ color : diyComponent.textColor }">{{ t('balance') }}</app-link>
|
||||
</view>
|
||||
</view>
|
||||
<view class="border-solid border-white border-l border-b-0 border-t-0 border-r-0 h-[60rpx]"></view>
|
||||
<view class="flex-1 text-center">
|
||||
<view class="font-bold">
|
||||
<app-link :url="(info ? '/pages/member/point' : '')"
|
||||
<app-link :url="(info ? '/app/pages/member/point' : '')"
|
||||
:style="{ color : diyComponent.textColor }">{{ parseInt(info?.point) || 0 }}</app-link>
|
||||
</view>
|
||||
<view class="text-sm mt-[10rpx]">
|
||||
<app-link :url="(info ? '/pages/member/point' : '')"
|
||||
<app-link :url="(info ? '/app/pages/member/point' : '')"
|
||||
:style="{ color : diyComponent.textColor }">{{ t('point') }}</app-link>
|
||||
</view>
|
||||
</view>
|
||||
@ -69,8 +69,8 @@
|
||||
import { useLogin } from '@/hooks/useLogin'
|
||||
import { img, isWeixinBrowser, redirect, urlDeconstruction, moneyFormat } from '@/utils/common'
|
||||
import { t } from '@/locale'
|
||||
import { wechatSync } from '@/api/system'
|
||||
import useDiyStore from '@/stores/diy'
|
||||
import { wechatSync } from '@/app/api/system'
|
||||
import useDiyStore from '@/app/stores/diy'
|
||||
|
||||
const props = defineProps(['component', 'index', 'pullDownRefresh']);
|
||||
|
||||
@ -89,7 +89,7 @@
|
||||
if (diyComponent.value.componentBgColor) style += 'background-color:' + diyComponent.value.componentBgColor + ';';
|
||||
if (diyComponent.value.bgUrl) {
|
||||
style += 'background-image:url(' + img(diyComponent.value.bgUrl) + ');';
|
||||
style += 'background-size: 100%;';
|
||||
style += 'background-size: cover;';
|
||||
style += 'background-repeat: no-repeat;';
|
||||
}
|
||||
if (diyComponent.value.topRounded) style += 'border-top-left-radius:' + diyComponent.value.topRounded * 2 + 'rpx;';
|
||||
@ -143,7 +143,7 @@
|
||||
})
|
||||
|
||||
const toLogin = () => {
|
||||
useLogin().setLoginBack({ url: '/pages/member/index' })
|
||||
useLogin().setLoginBack({ url: '/app/pages/member/index' })
|
||||
}
|
||||
|
||||
const infoFill = ref(false)
|
||||
@ -156,7 +156,7 @@
|
||||
if (isWeixinBrowser()) {
|
||||
useLogin().getAuthCode('snsapi_userinfo')
|
||||
} else {
|
||||
redirect({ url: '/pages/member/personal' })
|
||||
redirect({ url: '/app/pages/member/personal' })
|
||||
}
|
||||
// #endif
|
||||
}
|
||||
@ -5,7 +5,7 @@
|
||||
<template v-if="diyComponent.mode == 'row1-lt-of2-rt'">
|
||||
<view class="template-left">
|
||||
<app-link :data="diyComponent.list[0].link" :class="['item', diyComponent.mode]"
|
||||
:style="{ marginRight: diyComponent.imageGap * 2 + 'rpx', width: diyComponent.list[0].imgWidth, height: diyComponent.list[0].imgHeight + 'px' }">
|
||||
:style="{width: diyComponent.list[0].imgWidth, height: diyComponent.list[0].imgHeight + 'px' }">
|
||||
<image :src="img(diyComponent.list[0].imageUrl)" mode="scaleToFill"
|
||||
:style="diyComponent.list[0].pageItemStyle" :show-menu-by-longpress="true"></image>
|
||||
</app-link>
|
||||
@ -72,7 +72,7 @@
|
||||
<script setup lang="ts">
|
||||
// 魔方
|
||||
import { onMounted, computed, watch } from 'vue';
|
||||
import useDiyStore from '@/stores/diy';
|
||||
import useDiyStore from '@/app/stores/diy';
|
||||
import { img } from '@/utils/common';
|
||||
|
||||
const props = defineProps(['component', 'index', 'pullDownRefresh']);
|
||||
@ -40,7 +40,7 @@
|
||||
// 标题
|
||||
import { ref, computed, watch } from 'vue';
|
||||
import { redirect, img } from '@/utils/common';
|
||||
import useDiyStore from '@/stores/diy';
|
||||
import useDiyStore from '@/app/stores/diy';
|
||||
|
||||
const props = defineProps(['component', 'index', 'pullDownRefresh']);
|
||||
const diyStore = useDiyStore();
|
||||
13
uni-app/src/app/components/fixed/group/index.vue
Normal file
13
uni-app/src/app/components/fixed/group/index.vue
Normal file
@ -0,0 +1,13 @@
|
||||
<template>
|
||||
<view class="fixed-group">
|
||||
<template v-if="props.data.global.component == 'demo-index'">
|
||||
<fixed-demo-index :data="props.data" :pullDownRefresh="props.pullDownRefresh"></fixed-demo-index>
|
||||
</template>
|
||||
</view>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
const props = defineProps(['data','pullDownRefresh']);
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
@import './index.scss';
|
||||
</style>
|
||||
@ -35,8 +35,8 @@
|
||||
import { t } from '@/locale'
|
||||
import useMemberStore from '@/stores/member'
|
||||
import { img } from '@/utils/common'
|
||||
import { modifyMember } from '@/api/member'
|
||||
import { fetchBase64Image } from '@/api/system'
|
||||
import { modifyMember } from '@/app/api/member'
|
||||
import { fetchBase64Image } from '@/app/api/system'
|
||||
|
||||
const show = ref(false)
|
||||
const loading = ref(false)
|
||||
@ -2,8 +2,6 @@
|
||||
"developTitle":"开发环境配置",
|
||||
"baseUrl":"API请求地址",
|
||||
"imgUrl":"图片服务器地址",
|
||||
"siteId":"站点ID(VITE_SITE_ID)",
|
||||
"siteIdPlaceholder": "请输入站点ID",
|
||||
"pleaseEnterNumber":"请输入数字",
|
||||
"maximumCannotExceed":"最大不能超过"
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
<script lang="ts" setup>
|
||||
import { ref } from 'vue'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { getAgreementInfo } from '@/api/system'
|
||||
import { getAgreementInfo } from '@/app/api/system'
|
||||
|
||||
const agreement = ref(null)
|
||||
|
||||
@ -31,10 +31,10 @@
|
||||
</u-checkbox-group>
|
||||
<view class="text-xs text-gray-400 flex flex-wrap">
|
||||
{{ t('agreeTips') }}
|
||||
<app-link url="/pages/auth/agreement?key=service">
|
||||
<app-link url="/app/pages/auth/agreement?key=service">
|
||||
<text class="text-primary">《{{ t('userAgreement') }}》</text>
|
||||
</app-link>
|
||||
<app-link url="/pages/auth/agreement?key=privacy">
|
||||
<app-link url="/app/pages/auth/agreement?key=privacy">
|
||||
<text class="text-primary">《{{ t('privacyAgreement') }}》</text>
|
||||
</app-link>
|
||||
</view>
|
||||
@ -60,8 +60,8 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed } from 'vue'
|
||||
import { t } from '@/locale'
|
||||
import { bind } from '@/api/auth'
|
||||
import { bindMobile } from '@/api/member'
|
||||
import { bind } from '@/app/api/auth'
|
||||
import { bindMobile } from '@/app/api/member'
|
||||
import useMemberStore from '@/stores/member'
|
||||
import useConfigStore from '@/stores/config'
|
||||
import { useLogin } from '@/hooks/useLogin'
|
||||
@ -129,7 +129,7 @@
|
||||
request(formData).then((res) => {
|
||||
if (info.value) {
|
||||
memberStore.getMemberInfo()
|
||||
redirect({ url: '/pages/member/personal', mode: 'redirectTo' })
|
||||
redirect({ url: '/app/pages/member/personal', mode: 'redirectTo' })
|
||||
} else {
|
||||
memberStore.setToken(res.data.token)
|
||||
useLogin().handleLoginBack()
|
||||
@ -158,7 +158,7 @@
|
||||
uni.hideLoading()
|
||||
if (info.value) {
|
||||
memberStore.getMemberInfo()
|
||||
redirect({ url: '/pages/member/personal', mode: 'redirectTo' })
|
||||
redirect({ url: '/app/pages/member/personal', mode: 'redirectTo' })
|
||||
} else {
|
||||
memberStore.setToken(res.data.token)
|
||||
useLogin().handleLoginBack()
|
||||
@ -47,10 +47,10 @@
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex text-xs justify-between mt-[20rpx] text-gray-400">
|
||||
<app-link url="/pages/auth/register">{{ t('noAccount') }}
|
||||
<app-link url="/app/pages/auth/register">{{ t('noAccount') }}
|
||||
<text class="text-primary">{{ t('toRegister') }}</text>
|
||||
</app-link>
|
||||
<app-link url="/pages/auth/resetpwd">{{ t('resetpwd') }}</app-link>
|
||||
<app-link url="/app/pages/auth/resetpwd">{{ t('resetpwd') }}</app-link>
|
||||
</view>
|
||||
<view class="mt-[80rpx]">
|
||||
<u-button type="primary" :loading="loading" :loadingText="t('logining')" @click="handleLogin">
|
||||
@ -62,11 +62,11 @@
|
||||
</view>
|
||||
<view class="text-xs py-[50rpx] flex justify-center w-full" v-if="configStore.login.agreement_show">
|
||||
{{ t('agreeTips') }}
|
||||
<app-link url="/pages/auth/agreement?key=service">
|
||||
<app-link url="/app/pages/auth/agreement?key=service">
|
||||
<text class="text-primary">{{ t('userAgreement') }}</text>
|
||||
</app-link>
|
||||
{{ t('and') }}
|
||||
<app-link url="/pages/auth/agreement?key=privacy">
|
||||
<app-link url="/app/pages/auth/agreement?key=privacy">
|
||||
<text class="text-primary">{{ t('privacyAgreement') }}</text>
|
||||
</app-link>
|
||||
</view>
|
||||
@ -75,7 +75,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed } from 'vue'
|
||||
import { usernameLogin, mobileLogin } from '@/api/auth'
|
||||
import { usernameLogin, mobileLogin } from '@/app/api/auth'
|
||||
import useMemberStore from '@/stores/member'
|
||||
import useConfigStore from '@/stores/config'
|
||||
import { useLogin } from '@/hooks/useLogin'
|
||||
@ -66,7 +66,7 @@
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex text-xs justify-between mt-[20rpx] text-gray-400">
|
||||
<app-link url="/pages/auth/login">{{ t('haveAccount') }},<text
|
||||
<app-link url="/app/pages/auth/login">{{ t('haveAccount') }},<text
|
||||
class="text-primary">{{ t('toLogin') }}</text>
|
||||
</app-link>
|
||||
</view>
|
||||
@ -80,11 +80,11 @@
|
||||
</view>
|
||||
<view class="text-xs py-[50rpx] flex justify-center w-full" v-if="configStore.login.agreement_show">
|
||||
{{ t('registerAgreeTips') }}
|
||||
<app-link url="/pages/auth/agreement?key=service">
|
||||
<app-link url="/app/pages/auth/agreement?key=service">
|
||||
<text class="text-primary">{{ t('userAgreement') }}</text>
|
||||
</app-link>
|
||||
{{ t('and') }}
|
||||
<app-link url="/pages/auth/agreement?key=privacy">
|
||||
<app-link url="/app/pages/auth/agreement?key=privacy">
|
||||
<text class="text-primary">{{ t('privacyAgreement') }}</text>
|
||||
</app-link>
|
||||
</view>
|
||||
@ -93,7 +93,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed } from 'vue'
|
||||
import { usernameRegister, mobileRegister } from '@/api/auth'
|
||||
import { usernameRegister, mobileRegister } from '@/app/api/auth'
|
||||
import useMemberStore from '@/stores/member'
|
||||
import useConfigStore from '@/stores/config'
|
||||
import { useLogin } from '@/hooks/useLogin'
|
||||
@ -53,7 +53,7 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive } from 'vue'
|
||||
import { t } from '@/locale'
|
||||
import { resetPassword } from '@/api/system'
|
||||
import { resetPassword } from '@/app/api/system'
|
||||
import { redirect } from '@/utils/common'
|
||||
|
||||
const formData = reactive({
|
||||
@ -118,7 +118,7 @@
|
||||
loading.value = true
|
||||
|
||||
resetPassword(formData).then((res : responseResult) => {
|
||||
redirect({ url: '/pages/auth/login', mode: 'redirectTo' })
|
||||
redirect({ url: '/app/pages/auth/login', mode: 'redirectTo' })
|
||||
}).catch(() => {
|
||||
loading.value = false
|
||||
})
|
||||
@ -9,10 +9,6 @@
|
||||
<text class="mb-[10rpx]">{{ t('imgUrl') }}</text>
|
||||
<text class="text-sm">{{formData.imgUrl}}</text>
|
||||
</view>
|
||||
<view class="mb-[40rpx] flex flex-col">
|
||||
<text class="mb-[20rpx]">{{ t('siteId') }}</text>
|
||||
<u-input v-model="formData.siteId" clearable :placeholder="t('siteIdPlaceholder')" />
|
||||
</view>
|
||||
<u-button type="primary" @click="save" class="mt-[80rpx]">
|
||||
{{ t('confirm') }}
|
||||
</u-button>
|
||||
@ -21,35 +17,18 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed } from 'vue'
|
||||
import { img, redirect, getSiteId } from '@/utils/common'
|
||||
import { img, redirect } from '@/utils/common'
|
||||
import { t } from '@/locale'
|
||||
import manifestJson from '@/manifest.json'
|
||||
|
||||
const formData = reactive({
|
||||
siteId: '',
|
||||
baseUrl: import.meta.env.VITE_APP_BASE_URL || `${location.origin}/api/`,
|
||||
imgUrl: import.meta.env.VITE_IMG_DOMAIN
|
||||
})
|
||||
|
||||
const save = () => {
|
||||
if (formData.siteId.length == 0) {
|
||||
uni.showToast({ title: t('siteIdPlaceholder'), icon: 'none' });
|
||||
return;
|
||||
}
|
||||
var reg = /^[0-9]+$/;
|
||||
if (!reg.test(formData.siteId)) {
|
||||
uni.showToast({ title: t('pleaseEnterNumber'), icon: 'none' });
|
||||
return;
|
||||
}
|
||||
// if (formData.siteId > 9999999) {
|
||||
// uni.showToast({ title: t('maximumCannotExceed') + '9999999', icon: 'none' });
|
||||
// return;
|
||||
// }
|
||||
|
||||
uni.setStorageSync('wap_site_id', formData.siteId);
|
||||
|
||||
let url = uni.getStorageSync('develop_before_path') || '/pages/index/index';
|
||||
if (url == '/pages/index/develop') url = '/pages/index/index';
|
||||
let url = uni.getStorageSync('develop_before_path') || '/app/pages/index/index';
|
||||
if (url == '/app/pages/index/develop') url = '/app/pages/index/index';
|
||||
url = url.replace('/','')
|
||||
|
||||
uni.removeStorageSync('develop_before_path');
|
||||
@ -2,7 +2,7 @@
|
||||
<view>
|
||||
<u-loading-page :loading="loading" loadingText="" bg-color="#f7f7f7"></u-loading-page>
|
||||
|
||||
<view v-show="!loading">
|
||||
<view v-show="!loading">
|
||||
|
||||
<!-- 自定义模板渲染 -->
|
||||
<view class="diy-template-wrap bg-index" v-if="data.pageMode != 'fixed'"
|
||||
@ -26,10 +26,10 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed } from 'vue';
|
||||
import { onLoad, onShow, onPullDownRefresh } from '@dcloudio/uni-app';
|
||||
import { getDiyInfo } from '@/api/diy';
|
||||
import useDiyStore from '@/stores/diy';
|
||||
import { getDiyInfo } from '@/app/api/diy';
|
||||
import useDiyStore from '@/app/stores/diy';
|
||||
import { useShare } from '@/hooks/useShare'
|
||||
import { img } from '@/utils/common';
|
||||
import { img, redirect } from '@/utils/common';
|
||||
|
||||
const { setShare, onShareAppMessage, onShareTimeline } = useShare()
|
||||
onShareAppMessage()
|
||||
@ -39,6 +39,11 @@
|
||||
const diyStore = useDiyStore();
|
||||
const pullDownRefresh = ref(0)
|
||||
|
||||
const id = ref(0)
|
||||
const name = ref('')
|
||||
const template = ref('')
|
||||
|
||||
// 自定义页面 数据
|
||||
const diyData = reactive({
|
||||
pageMode: 'diy',
|
||||
title: '',
|
||||
@ -54,9 +59,6 @@
|
||||
}
|
||||
})
|
||||
|
||||
const id = ref(0)
|
||||
const name = ref('')
|
||||
|
||||
onLoad(option => {
|
||||
// #ifdef H5
|
||||
// 装修模式
|
||||
@ -67,6 +69,7 @@
|
||||
// #endif
|
||||
id.value = option.id || '';
|
||||
name.value = option.name || '';
|
||||
template.value = option.template || '';
|
||||
});
|
||||
|
||||
// 监听下拉刷新事件
|
||||
@ -82,10 +85,11 @@
|
||||
} else {
|
||||
getDiyInfo({
|
||||
id: id.value,
|
||||
name: name.value
|
||||
name: name.value,
|
||||
template: template.value
|
||||
}).then((res : any) => {
|
||||
if (res.data.value) {
|
||||
let data = res.data;
|
||||
let data = res.data;
|
||||
if (data.value) {
|
||||
diyData.pageMode = data.mode;
|
||||
diyData.title = data.title;
|
||||
|
||||
@ -104,15 +108,19 @@
|
||||
});
|
||||
uni.setNavigationBarTitle({
|
||||
title: diyData.title
|
||||
})
|
||||
});
|
||||
loading.value = false;
|
||||
|
||||
let share = res.data.share ? JSON.parse(res.data.share) : null;
|
||||
setShare(share);
|
||||
} else if (data.mode == 'other') {
|
||||
// 跳转到其他页面
|
||||
redirect({ url: data.page })
|
||||
}
|
||||
|
||||
let share = res.data.share ? JSON.parse(res.data.share) : null;
|
||||
setShare(share);
|
||||
|
||||
loading.value = false;
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
@ -26,10 +26,10 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed } from 'vue';
|
||||
import { onLoad, onShow, onPullDownRefresh } from '@dcloudio/uni-app';
|
||||
import { getDiyInfo } from '@/api/diy';
|
||||
import useDiyStore from '@/stores/diy';
|
||||
import { getDiyInfo } from '@/app/api/diy';
|
||||
import useDiyStore from '@/app/stores/diy';
|
||||
import { useShare } from '@/hooks/useShare'
|
||||
import { img } from '@/utils/common';
|
||||
import { img, redirect } from '@/utils/common';
|
||||
|
||||
const { setShare, onShareAppMessage, onShareTimeline } = useShare()
|
||||
setShare();
|
||||
@ -39,6 +39,8 @@
|
||||
const loading = ref(true);
|
||||
const diyStore = useDiyStore();
|
||||
const pullDownRefresh = ref(0)
|
||||
const name = ref('DIY_INDEX')
|
||||
const template = ref('')
|
||||
|
||||
// 自定义页面 数据
|
||||
const diyData = reactive({
|
||||
@ -64,6 +66,7 @@
|
||||
loading.value = false;
|
||||
}
|
||||
// #endif
|
||||
template.value = option.template || '';
|
||||
});
|
||||
|
||||
// 监听下拉刷新事件
|
||||
@ -78,10 +81,11 @@
|
||||
diyStore.init();
|
||||
} else {
|
||||
getDiyInfo({
|
||||
name: 'DIY_INDEX'
|
||||
name: name.value,
|
||||
template: template.value
|
||||
}).then((res : any) => {
|
||||
if (res.data.value) {
|
||||
let data = res.data;
|
||||
let data = res.data;
|
||||
if (data.value) {
|
||||
diyData.pageMode = data.mode;
|
||||
diyData.title = data.title;
|
||||
|
||||
@ -100,10 +104,13 @@
|
||||
});
|
||||
uni.setNavigationBarTitle({
|
||||
title: diyData.title
|
||||
})
|
||||
});
|
||||
loading.value = false;
|
||||
} else if (data.mode == 'other') {
|
||||
// 跳转到其他页面
|
||||
redirect({ url: data.page })
|
||||
}
|
||||
|
||||
loading.value = false;
|
||||
});
|
||||
}
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
<view v-else class="text-sm text-gray-subtitle mt-[10rpx]">{{ item.account_no }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="p-[30rpx] bg-white mx-[32rpx] my-[20rpx] rounded flex" @click="redirect({ url: '/pages/member/account_edit', param: { type: accountType, mode } })">
|
||||
<view class="p-[30rpx] bg-white mx-[32rpx] my-[20rpx] rounded flex" @click="redirect({ url: '/app/pages/member/account_edit', param: { type: accountType, mode } })">
|
||||
<u-icon name="plus" color="#333" size="16"></u-icon>
|
||||
<text class="text-sm ml-[10rpx] flex-1">{{ accountType == 'bank' ? t('addBankCard') : t('addAlipayAccount') }}</text>
|
||||
<u-icon name="arrow-right" color="#333" size="14"></u-icon>
|
||||
@ -27,7 +27,7 @@
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { redirect } from '@/utils/common'
|
||||
import { getCashoutAccountList } from '@/api/member'
|
||||
import { getCashoutAccountList } from '@/app/api/member'
|
||||
import MescrollBody from '@/components/mescroll/mescroll-body/mescroll-body.vue'
|
||||
import useMescroll from '@/components/mescroll/hooks/useMescroll.js'
|
||||
import { onPageScroll, onReachBottom, onLoad } from '@dcloudio/uni-app'
|
||||
@ -69,8 +69,8 @@
|
||||
}
|
||||
|
||||
const handleClick = (data: AnyObject) => {
|
||||
if (mode.value == 'get') redirect({ url: '/pages/member/account_edit', param: { id: data.account_id, type: accountType.value, mode: mode.value } })
|
||||
else redirect({ url: '/pages/member/apply_cash_out', param: { account_id: data.account_id, type: accountType.value } })
|
||||
if (mode.value == 'get') redirect({ url: '/app/pages/member/account_edit', param: { id: data.account_id, type: accountType.value, mode: mode.value } })
|
||||
else redirect({ url: '/app/pages/member/apply_cash_out', param: { account_id: data.account_id, type: accountType.value } })
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -72,7 +72,7 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, computed, reactive } from 'vue'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { getCashoutAccountInfo, addCashoutAccount, editCashoutAccount, deleteCashoutAccount } from '@/api/member'
|
||||
import { getCashoutAccountInfo, addCashoutAccount, editCashoutAccount, deleteCashoutAccount } from '@/app/api/member'
|
||||
import { t } from '@/locale'
|
||||
import { redirect } from '@/utils/common'
|
||||
|
||||
@ -135,8 +135,8 @@
|
||||
loading.value = true
|
||||
|
||||
save(formData).then((res) => {
|
||||
if (mode.value == 'get') redirect({ url: '/pages/member/account', param: { type: formData.account_type, mode: mode.value } })
|
||||
else redirect({ url: '/pages/member/apply_cash_out', param: { account_id: res.data, type: formData.account_type } })
|
||||
if (mode.value == 'get') redirect({ url: '/app/pages/member/account', param: { type: formData.account_type, mode: mode.value } })
|
||||
else redirect({ url: '/app/pages/member/apply_cash_out', param: { account_id: res.data, type: formData.account_type } })
|
||||
}).catch(() => {
|
||||
loading.value = false
|
||||
})
|
||||
@ -145,7 +145,7 @@
|
||||
|
||||
const handleDelete = () => {
|
||||
deleteCashoutAccount(formData.account_id).then(() => {
|
||||
redirect({ url: '/pages/member/account', mode: 'redirectTo' })
|
||||
redirect({ url: '/app/pages/member/account', mode: 'redirectTo' })
|
||||
})
|
||||
}
|
||||
</script>
|
||||
@ -46,7 +46,7 @@
|
||||
<view>{{ t('cashOutToAlipay') }}</view>
|
||||
<view class="text-[#bbb] text-[26rpx] mt-[16rpx]">
|
||||
<view v-if="alipayAccountInfo">
|
||||
{{ t('cashOutTo') }}{{ t('alipayAccountNo') }}{{ alipayAccountInfo.account_no }} <text class="text-black" @click="redirect({ url: '/pages/member/account', param: { type: 'alipay', mode: 'select' } })">{{ t('replace') }}</text>
|
||||
{{ t('cashOutTo') }}{{ t('alipayAccountNo') }}{{ alipayAccountInfo.account_no }} <text class="text-black" @click="redirect({ url: '/app/pages/member/account', param: { type: 'alipay', mode: 'select' } })">{{ t('replace') }}</text>
|
||||
</view>
|
||||
<view v-else>
|
||||
{{ t('cashOutToAlipayTips') }}
|
||||
@ -54,7 +54,7 @@
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex items-center">
|
||||
<u-button :plain="true" type="primary" shape="circle" :custom-style="{height: '56rpx'}" v-if="!alipayAccountInfo" @click="redirect({ url: '/pages/member/account', param: { type: 'alipay', mode: 'select' } })">{{ t('toAdd') }}</u-button>
|
||||
<u-button :plain="true" type="primary" shape="circle" :custom-style="{height: '56rpx'}" v-if="!alipayAccountInfo" @click="redirect({ url: '/app/pages/member/account', param: { type: 'alipay', mode: 'select' } })">{{ t('toAdd') }}</u-button>
|
||||
<view v-else @click="applyData.transfer_type = 'alipay'">
|
||||
<text class="iconfont iconduigou text-[40rpx] text-primary"
|
||||
v-if="applyData.transfer_type == 'alipay'"></text>
|
||||
@ -75,7 +75,7 @@
|
||||
<view>{{ t('cashOutToBank') }}</view>
|
||||
<view class="text-[#bbb] text-[26rpx] mt-[16rpx]">
|
||||
<view v-if="bankAccountInfo">
|
||||
{{ t('cashOutTo') }}{{ bankAccountInfo.bank_name }}{{ t('debitCard') }}{{ bankAccountInfo.account_no.substring(bankAccountInfo.account_no.length - 4) }} <text class="text-black" @click="redirect({ url: '/pages/member/account', param: { type: 'bank', mode: 'select' } })">{{ t('replace') }}</text>
|
||||
{{ t('cashOutTo') }}{{ bankAccountInfo.bank_name }}{{ t('debitCard') }}{{ bankAccountInfo.account_no.substring(bankAccountInfo.account_no.length - 4) }} <text class="text-black" @click="redirect({ url: '/app/pages/member/account', param: { type: 'bank', mode: 'select' } })">{{ t('replace') }}</text>
|
||||
</view>
|
||||
<view v-else>
|
||||
{{ t('cashOutToBankTips') }}
|
||||
@ -83,7 +83,7 @@
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex items-center">
|
||||
<u-button :plain="true" type="primary" shape="circle" :custom-style="{height: '56rpx'}" v-if="!bankAccountInfo" @click="redirect({ url: '/pages/member/account', param: { type: 'bank', mode: 'select' } })">{{ t('toAdd') }}</u-button>
|
||||
<u-button :plain="true" type="primary" shape="circle" :custom-style="{height: '56rpx'}" v-if="!bankAccountInfo" @click="redirect({ url: '/app/pages/member/account', param: { type: 'bank', mode: 'select' } })">{{ t('toAdd') }}</u-button>
|
||||
<view v-else @click="applyData.transfer_type = 'bank'">
|
||||
<text class="iconfont iconduigou text-[40rpx] text-primary"
|
||||
v-if="applyData.transfer_type == 'bank'"></text>
|
||||
@ -100,7 +100,7 @@
|
||||
@click="cashOut"></u-button>
|
||||
</view>
|
||||
|
||||
<view class="mt-[40rpx] text-center text-sm" @click="redirect({ url: '/pages/member/cash_out'})">
|
||||
<view class="mt-[40rpx] text-center text-sm" @click="redirect({ url: '/app/pages/member/cash_out'})">
|
||||
{{t('cashOutList')}}
|
||||
</view>
|
||||
</view>
|
||||
@ -113,7 +113,7 @@
|
||||
import { t } from '@/locale'
|
||||
import { moneyFormat, redirect, img } from '@/utils/common'
|
||||
import useMemberStore from '@/stores/member'
|
||||
import { cashOutConfig, cashOutApply, getFirstCashoutAccountInfo, getCashoutAccountInfo } from '@/api/member'
|
||||
import { cashOutConfig, cashOutApply, getFirstCashoutAccountInfo, getCashoutAccountInfo } from '@/app/api/member'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
|
||||
const pageLoading = ref(true)
|
||||
@ -188,7 +188,7 @@
|
||||
|
||||
//全部提现
|
||||
const allMoney = () => {
|
||||
applyData.apply_money = moneyFormat(cashOutMoney)
|
||||
applyData.apply_money = moneyFormat(cashOutMoney.value)
|
||||
}
|
||||
|
||||
// 清空提现金额
|
||||
@ -265,7 +265,7 @@
|
||||
|
||||
cashOutApply(applyData)
|
||||
.then(res => {
|
||||
redirect({ url: '/pages/member/cash_out' })
|
||||
redirect({ url: '/app/pages/member/cash_out' })
|
||||
})
|
||||
.catch(() => {
|
||||
loading.value = false
|
||||
@ -11,14 +11,14 @@
|
||||
<view class="text">{{t('accountBalance')}}</view>
|
||||
<view class="money-wrap">
|
||||
<view class="money-item"
|
||||
@click="redirect({ url: '/pages/member/detailed_account', param: { type : 'balance' } })">
|
||||
@click="redirect({ url: '/app/pages/member/detailed_account', param: { type : 'balance' } })">
|
||||
<view class="money">
|
||||
{{ moneyFormat(memberStore.info?.balance)|| '0.00' }}
|
||||
</view>
|
||||
<view class="text leading-none">{{ t('balance') }}</view>
|
||||
</view>
|
||||
<view class="money-item"
|
||||
@click="redirect({ url: '/pages/member/detailed_account', param: { type : 'money' } })">
|
||||
@click="redirect({ url: '/app/pages/member/detailed_account', param: { type : 'money' } })">
|
||||
<view class="money">
|
||||
{{ moneyFormat(memberStore.info?.money)|| '0.00' }}
|
||||
</view>
|
||||
@ -29,44 +29,21 @@
|
||||
</view>
|
||||
|
||||
<view class="account-info-btn">
|
||||
<u-button type="primary" shape="circle" class="btn"
|
||||
<!-- <u-button type="primary" shape="circle" class="btn"
|
||||
:customStyle="{backgroundColor: '#FE4E50',color: '#fff', borderColor: '#FE4E50',width: 'calc(100vw - 64rpx)'}"
|
||||
@click="topUpFn">
|
||||
<img class="max-w-[36rpx] max-h-[36rpx] mr-1" :src="img('static/resource/images/member/reset.png')"
|
||||
alt="">
|
||||
<image class="max-w-[36rpx] max-h-[36rpx] mr-1" :src="img('static/resource/images/member/reset.png')"/>
|
||||
<text>{{t('recharge')}}</text>
|
||||
</u-button>
|
||||
</u-button> -->
|
||||
<u-button v-if="cashOutConfigObj.is_open == 1" type="primary" :plain="true" shape="circle" class="btn"
|
||||
:customStyle="{backgroundColor: '#fff',color: '#FE4E50', borderColor: '#FE4E50',width: 'calc(100vw - 64rpx)'}"
|
||||
@click="applyCashOut">
|
||||
<img class="max-w-[36rpx] max-h-[36rpx] mr-1"
|
||||
:src="img('static/resource/images/member/withdraw_deposit.png')" alt="">
|
||||
<image class="max-w-[36rpx] max-h-[36rpx] mr-1"
|
||||
:src="img('static/resource/images/member/withdraw_deposit.png')" />
|
||||
<text>{{t('cashOut')}}</text>
|
||||
</u-button>
|
||||
</view>
|
||||
|
||||
<!-- 充值 -->
|
||||
<u-popup :show="topUpShow" mode="center" :round="10" @close="closePopup" :closeable="true">
|
||||
<view class="w-80 px-3 pb-4 pt-7 box-border">
|
||||
<u--input :placeholder="t('rechargeAmountPlaceholder')" v-model="rechargeAmount" border="bottom"
|
||||
type="number" clearable>
|
||||
</u--input>
|
||||
<view class="top-up-wrap flex flex-wrap justify-around mt-3">
|
||||
<view v-for="(item,index) in rechargePackage" :key="index"
|
||||
:class="['top-up-item w-22 box-border border-1 text-center rounded mt-2 py-3 px-4 border-gray-400 border-solid',{'border-primary text-primary':rechargeAmount == item}]"
|
||||
@click="rechargeAmount = item">
|
||||
<text>{{item}}{{t('yuan')}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="mt-5 px-2">
|
||||
<u-button type="primary" shape="circle" :loading="rechargeLoading" :text="t('clickRecharge')"
|
||||
@click="recharge"></u-button>
|
||||
</view>
|
||||
<view class="mt-[20rpx] text-center text-sm"
|
||||
@click="redirect({ url: '/pages/member/recharge_record' })">{{t('rechargeRecord')}}</view>
|
||||
</view>
|
||||
</u-popup>
|
||||
|
||||
<pay ref="payRef" @close="rechargeLoading = false"></pay>
|
||||
</view>
|
||||
</template>
|
||||
@ -75,24 +52,12 @@
|
||||
import { ref, reactive } from 'vue'
|
||||
import { t } from '@/locale'
|
||||
import { moneyFormat, redirect, img } from '@/utils/common';
|
||||
import { createRecharge, cashOutConfig } from '@/api/member';
|
||||
import { cashOutConfig } from '@/app/api/member';
|
||||
import { onShow } from '@dcloudio/uni-app';
|
||||
import useMemberStore from '@/stores/member'
|
||||
|
||||
const memberStore = useMemberStore(),
|
||||
topUpShow = ref<boolean>(false);
|
||||
const memberStore = useMemberStore();
|
||||
|
||||
const topUpFn = () => {
|
||||
topUpShow.value = true;
|
||||
}
|
||||
|
||||
const closePopup = () => {
|
||||
topUpShow.value = false;
|
||||
}
|
||||
|
||||
const rechargePackage = ref([20, 30, 50, 100, 200, 300])
|
||||
|
||||
const rechargeAmount = ref<string | number>("");
|
||||
const rechargeLoading = ref(false)
|
||||
|
||||
const payRef = ref(null)
|
||||
@ -122,34 +87,12 @@
|
||||
})
|
||||
})
|
||||
|
||||
/**
|
||||
* 发起充值
|
||||
*/
|
||||
const recharge = () => {
|
||||
if (uni.$u.test.isEmpty(rechargeAmount.value)) {
|
||||
uni.showToast({ title: t('rechargeAmountPlaceholder'), icon: 'none' })
|
||||
return
|
||||
}
|
||||
if (!uni.$u.test.amount(rechargeAmount.value) || rechargeAmount.value <= 0) {
|
||||
uni.showToast({ title: t('rechargeAmountError'), icon: 'none' })
|
||||
return
|
||||
}
|
||||
if (rechargeLoading.value) return
|
||||
rechargeLoading.value = true
|
||||
|
||||
createRecharge({ recharge_money: rechargeAmount.value }).then(res => {
|
||||
payRef.value?.open(res.data.trade_type, res.data.trade_id)
|
||||
}).catch(() => {
|
||||
rechargeLoading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
const applyCashOut = () => {
|
||||
uni.setStorageSync('cashOutAccountType', 'money')
|
||||
redirect({ url: '/pages/member/apply_cash_out' })
|
||||
redirect({ url: '/app/pages/member/apply_cash_out' })
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/styles/account_info.scss';
|
||||
@import '@/app/styles/account_info.scss';
|
||||
</style>
|
||||
@ -21,7 +21,7 @@
|
||||
import { reactive, ref } from 'vue'
|
||||
import { t } from '@/locale'
|
||||
import { redirect, img } from '@/utils/common';
|
||||
import { getCashOutList } from '@/api/member';
|
||||
import { getCashOutList } from '@/app/api/member';
|
||||
import MescrollBody from '@/components/mescroll/mescroll-body/mescroll-body.vue';
|
||||
import MescrollEmpty from '@/components/mescroll/mescroll-empty/mescroll-empty.vue';
|
||||
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
|
||||
@ -67,10 +67,10 @@ const getCashOutListFn = (mescroll)=>{
|
||||
}
|
||||
|
||||
const toDetailFn = (data)=>{
|
||||
redirect({ url: '/pages/member/cash_out_detail', param: { id: data.id }});
|
||||
redirect({ url: '/app/pages/member/cash_out_detail', param: { id: data.id }});
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import '@/styles/member_record_list.scss';
|
||||
@import '@/app/styles/member_record_list.scss';
|
||||
</style>
|
||||
@ -51,7 +51,7 @@ import { reactive, ref } from 'vue'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { t } from '@/locale'
|
||||
import { redirect, img } from '@/utils/common';
|
||||
import { getCashOutDetail } from '@/api/member';
|
||||
import { getCashOutDetail } from '@/app/api/member';
|
||||
|
||||
let cashOutInfo = ref({});
|
||||
let loading = ref<boolean>(false);
|
||||
@ -73,5 +73,5 @@ const getCashoutAccountListFn = (id) => {
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import '@/styles/member_record_detail.scss';
|
||||
@import '@/app/styles/member_record_detail.scss';
|
||||
</style>
|
||||
@ -5,10 +5,10 @@
|
||||
:style="{ background: 'url(' + img('static/resource/images/member/balance_bg.png') + ') no-repeat 95% 30% / auto 250rpx, linear-gradient(314deg, #FE7849 0%, #FF1959 100%)'}">
|
||||
<view class="name">{{t('commissionInfo')}}</view>
|
||||
<view class="content">
|
||||
<view class="money" @click="redirect({ url: '/pages/member/detailed_account', param: { type : 'commission' } })">
|
||||
<view class="money" @click="redirect({ url: '/app/pages/member/detailed_account', param: { type : 'commission' } })">
|
||||
{{ memberStore.info ? moneyFormat(memberStore.info.commission) : 0.00 }}
|
||||
</view>
|
||||
<view class="text" @click="redirect({ url: '/pages/member/detailed_account', param: { type : 'commission' } })">{{t('accountCommission')}}</view>
|
||||
<view class="text" @click="redirect({ url: '/app/pages/member/detailed_account', param: { type : 'commission' } })">{{t('accountCommission')}}</view>
|
||||
<view class="money-wrap">
|
||||
<view class="money-item">
|
||||
<view class="money">
|
||||
@ -30,7 +30,7 @@
|
||||
<u-button type="primary" :plain="true" shape="circle" class="btn"
|
||||
:customStyle="{backgroundColor: '#fff',color: '#FE4E50', borderColor: '#FE4E50',width: 'calc(100vw - 64rpx)'}"
|
||||
@click="applyCashOut">
|
||||
<img class="max-w-[36rpx] max-h-[36rpx] mr-1" :src="img('static/resource/images/member/withdraw_deposit.png')" alt="">
|
||||
<image class="max-w-[36rpx] max-h-[36rpx] mr-1" :src="img('static/resource/images/member/withdraw_deposit.png')" />
|
||||
<text>{{t('cashOut')}}</text>
|
||||
</u-button>
|
||||
</view>
|
||||
@ -44,10 +44,10 @@
|
||||
const memberStore = useMemberStore();
|
||||
const applyCashOut = ()=> {
|
||||
uni.setStorageSync('cashOutAccountType', 'commission')
|
||||
redirect({ url: '/pages/member/apply_cash_out' })
|
||||
redirect({ url: '/app/pages/member/apply_cash_out' })
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import '@/styles/account_info.scss';
|
||||
@import '@/app/styles/account_info.scss';
|
||||
</style>
|
||||
@ -20,7 +20,7 @@
|
||||
import MescrollBody from '@/components/mescroll/mescroll-body/mescroll-body.vue';
|
||||
import MescrollEmpty from '@/components/mescroll/mescroll-empty/mescroll-empty.vue';
|
||||
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
|
||||
import { getBalanceList, getMoneyList, getCommissionList} from '@/api/member';
|
||||
import { getBalanceList, getMoneyList, getCommissionList} from '@/app/api/member';
|
||||
import { onPageScroll, onReachBottom, onLoad, onShow } from '@dcloudio/uni-app';
|
||||
const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom);
|
||||
|
||||
@ -79,5 +79,5 @@
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import '@/styles/member_record_list.scss';
|
||||
@import '@/app/styles/member_record_list.scss';
|
||||
</style>
|
||||
@ -26,15 +26,17 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed } from 'vue'
|
||||
import { onLoad, onShow, onPullDownRefresh } from '@dcloudio/uni-app'
|
||||
import { getDiyInfo } from '@/api/diy'
|
||||
import useDiyStore from '@/stores/diy'
|
||||
import { getDiyInfo } from '@/app/api/diy'
|
||||
import useDiyStore from '@/app/stores/diy'
|
||||
import useMemberStore from '@/stores/member'
|
||||
import { img } from '@/utils/common';
|
||||
import { img, redirect } from '@/utils/common';
|
||||
|
||||
const loading = ref(true);
|
||||
const diyStore = useDiyStore();
|
||||
const pullDownRefresh = ref(0)
|
||||
const name = ref('DIY_MEMBER_INDEX')
|
||||
|
||||
// 自定义页面 数据
|
||||
const diyData = reactive({
|
||||
pageMode: 'diy',
|
||||
title: '',
|
||||
@ -72,10 +74,10 @@
|
||||
diyStore.init();
|
||||
} else {
|
||||
getDiyInfo({
|
||||
name: 'DIY_MEMBER_INDEX'
|
||||
name: name.value
|
||||
}).then((res : any) => {
|
||||
if (res.data.value) {
|
||||
let data = res.data;
|
||||
let data = res.data;
|
||||
if (data.value) {
|
||||
diyData.pageMode = data.mode;
|
||||
diyData.title = data.title;
|
||||
|
||||
@ -94,9 +96,12 @@
|
||||
});
|
||||
uni.setNavigationBarTitle({
|
||||
title: diyData.title
|
||||
})
|
||||
});
|
||||
loading.value = false;
|
||||
} else if (data.mode == 'other') {
|
||||
// 跳转到其他页面
|
||||
redirect({ url: data.page })
|
||||
}
|
||||
loading.value = false;
|
||||
});
|
||||
}
|
||||
useMemberStore().getMemberInfo()
|
||||
@ -25,7 +25,7 @@
|
||||
<template #value>
|
||||
<view v-if="info.mobile">{{ mobileConceal(info.mobile) }}</view>
|
||||
<view>
|
||||
<app-link url="/pages/auth/bind">
|
||||
<app-link url="/app/pages/auth/bind">
|
||||
<u-button type="primary" :plain="true" :text="t('bindMobile')" shape="circle"
|
||||
size="mini"></u-button>
|
||||
</app-link>
|
||||
@ -67,8 +67,8 @@
|
||||
import { t } from '@/locale'
|
||||
import useMemberStore from '@/stores/member'
|
||||
import { img, mobileConceal } from '@/utils/common'
|
||||
import { modifyMember } from '@/api/member'
|
||||
import { fetchBase64Image, uploadImage } from '@/api/system'
|
||||
import { modifyMember } from '@/app/api/member'
|
||||
import { fetchBase64Image, uploadImage } from '@/app/api/system'
|
||||
|
||||
const memberStore = useMemberStore()
|
||||
const info = computed(() => memberStore.info)
|
||||
@ -16,7 +16,7 @@ import { reactive, ref } from 'vue'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { t } from '@/locale'
|
||||
import { redirect, img } from '@/utils/common';
|
||||
import { getPointList } from '@/api/member';
|
||||
import { getPointList } from '@/app/api/member';
|
||||
import MescrollBody from '@/components/mescroll/mescroll-body/mescroll-body.vue';
|
||||
import MescrollEmpty from '@/components/mescroll/mescroll-empty/mescroll-empty.vue';
|
||||
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
|
||||
@ -1,15 +1,15 @@
|
||||
<template>
|
||||
<view class="w-screen h-screen flex flex-col items-center" v-if="payInfo">
|
||||
<view class="w-screen bg-[#fff] flex flex-col items-center" v-if="payInfo">
|
||||
<view class="flex-1 flex flex-col items-center w-full pt-[100rpx]">
|
||||
<text class="iconfont text-2xl"
|
||||
:class="payInfo.status==2 ? 'text-primary iconduigou' : 'iconzhifushibai text-red'"></text>
|
||||
<view class=" text-sm">{{ payInfo.status == 2 ? t('pay.paySuccess') : t('pay.payFail') }}</view>
|
||||
<view class="text-xl font-bold pt-[30rpx]">
|
||||
<image v-if="payInfo.status==2" class="max-w-[144rpx] max-h-[88rpx]" :src="img('static/resource/images/result/pay_succeed.png')"/>
|
||||
<image v-else class="max-w-[144rpx] max-h-[88rpx]" :src="img('static/resource/images/result/pay_error.png')"/>
|
||||
<view class=" text-[32rpx] font-bold mt-[22rpx]">{{ payInfo.status == 2 ? t('pay.paySuccess') : t('pay.payFail') }}</view>
|
||||
<view class="text-[40rpx] font-bold mt-[40rpx] text-[#FF4646]">
|
||||
<text class="text-base">{{ t('currency') }}</text>
|
||||
<text>{{ moneyFormat(payInfo.money) }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="pb-[200rpx] w-[240rpx]">
|
||||
<view class="pb-[80rpx] pt-[40rpx] w-[240rpx]">
|
||||
<u-button type="primary" :text="payInfo.status == 2 ? t('complete') : t('close')"
|
||||
:plain="true" @click="complete"></u-button>
|
||||
</view>
|
||||
@ -25,9 +25,9 @@
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { getPayInfo as getPayInfoApi } from '@/api/pay'
|
||||
import { getPayInfo as getPayInfoApi } from '@/app/api/pay'
|
||||
import { t } from '@/locale'
|
||||
import { redirect, moneyFormat } from '@/utils/common'
|
||||
import { redirect, img, moneyFormat } from '@/utils/common'
|
||||
import { getFirstPage } from '@/utils/pages'
|
||||
|
||||
const payInfo = ref<AnyObject | null>(null)
|
||||
@ -69,8 +69,14 @@
|
||||
}
|
||||
|
||||
const complete = () => {
|
||||
redirect({ url: getFirstPage(), param: { code: payInfo.value?.out_trade_no }, mode: 'redirectTo' })
|
||||
const payReturn = decodeURIComponent(uni.getStorageSync('payReturn'))
|
||||
if (payReturn) redirect({ url: payReturn, mode: 'redirectTo' })
|
||||
else redirect({ url: getFirstPage(), param: { code: payInfo.value?.out_trade_no }, mode: 'redirectTo' })
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
<style lang="scss" scoped>
|
||||
body{
|
||||
background-color: #F7F7F7;
|
||||
}
|
||||
</style>
|
||||
@ -3,15 +3,15 @@
|
||||
<view class="h-[30rpx]"></view>
|
||||
<view class="m-[30rpx] bg-white rounded-md overflow-hidden px-[20rpx] py-[10rpx]">
|
||||
<u-cell-group :border="false">
|
||||
<u-cell :title="t('personalSettings')" :is-link="true" url="/pages/member/personal"></u-cell>
|
||||
<u-cell :title="t('personalSettings')" :is-link="true" url="/app/pages/member/personal"></u-cell>
|
||||
<u-cell :title="t('switchLang')" :is-link="true" :value="lang" @click="langSheetShow = true"></u-cell>
|
||||
<u-cell :title="t('version')" :value="version"></u-cell>
|
||||
</u-cell-group>
|
||||
</view>
|
||||
<view class="m-[30rpx] bg-white rounded-md overflow-hidden px-[20rpx] py-[10rpx]">
|
||||
<u-cell-group :border="false">
|
||||
<u-cell :title="t('userAgreement')" :is-link="true" url="/pages/auth/agreement?key=service"></u-cell>
|
||||
<u-cell :title="t('privacyAgreement')" :is-link="true" url="/pages/auth/agreement?key=privacy"></u-cell>
|
||||
<u-cell :title="t('userAgreement')" :is-link="true" url="/app/pages/auth/agreement?key=service"></u-cell>
|
||||
<u-cell :title="t('privacyAgreement')" :is-link="true" url="/app/pages/auth/agreement?key=privacy"></u-cell>
|
||||
</u-cell-group>
|
||||
</view>
|
||||
<!-- #ifdef H5 -->
|
||||
@ -9,6 +9,7 @@ interface Diy {
|
||||
title : string,
|
||||
pageBgColor : string, // 页面背景颜色
|
||||
bottomTabBarSwitch : boolean, // 底部导航开关
|
||||
bgUrl: string
|
||||
},
|
||||
// 组件集合
|
||||
value : any[]
|
||||
@ -25,7 +25,7 @@
|
||||
const toRedirect = () => {
|
||||
if (Object.keys(prop.data).length) {
|
||||
if (!prop.data.url) return;
|
||||
if (currRoute() == 'pages/member/index' && !getToken()) {
|
||||
if (currRoute() == 'app/pages/member/index' && !getToken()) {
|
||||
useLogin().setLoginBack({ url: prop.data.url })
|
||||
return;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user