49 Commits

Author SHA1 Message Date
anonymous 1e1011b317 chore: 更换链接 2025-01-18 16:16:56 +08:00
anonymous d460f35007 update REMADE.md 2025-01-17 09:14:46 +08:00
zzzzzak 79b6ce1136 refactor: 余额明细修复 2025-01-16 23:34:50 +08:00
anonymous 23d94407c2 fix: bug 2025-01-16 14:58:24 +08:00
anonymous 05a8cb58d7 fix: bug 2025-01-16 14:09:35 +08:00
anonymous 778d318c7e fix: 修复低端android显示异常 2025-01-16 14:05:29 +08:00
anonymous 8b6922cfbe fix: 修改身份证规则 2025-01-15 09:59:06 +08:00
anonymous ff3640b062 refactor: 修改样式 2025-01-15 08:25:02 +08:00
anonymous e5508fe898 feat: 下载地址 2025-01-15 08:18:22 +08:00
zzzzzak 9354840543 refactor: 修改样式 2025-01-14 23:28:49 +08:00
anonymous 19a8d3c20a chore: 更新app地址 2025-01-14 14:33:37 +08:00
zzzzzak 51e34e4a42 fix: 修改域名 2025-01-13 21:44:22 +08:00
zzzzzak dabaa18dfd fix: 更新公告 2025-01-13 21:32:51 +08:00
zzzzzak 6e330c698e feat: 官方联系方式修改 2025-01-13 21:16:20 +08:00
anonymous 6114c6442c refactor: 修改下载地址 2025-01-13 16:58:00 +08:00
anonymous 3e5fc69c35 refactor: 修改样式 2025-01-13 08:21:31 +08:00
zzzzzak 5c864a8c63 更新 index.vue 2025-01-12 17:12:49 +08:00
anonymous 659dc92c90 feat: 修改文本 2025-01-12 17:04:48 +08:00
zzzzzak cf1900c5ed 更新 index.vue 2025-01-12 16:54:57 +08:00
zzzzzak cf54b39ad1 更新 index.vue 2025-01-12 16:48:14 +08:00
zzzzzak 7159a3148f 更新 index.vue 2025-01-12 16:27:05 +08:00
zzzzzak 0024d0f4e1 更新 index.vue 2025-01-12 12:02:01 +08:00
zzzzzak bfeb64196d 更新 index.vue 2025-01-12 11:32:43 +08:00
anonymous c3ff2e3f4f fix: 修改文本 2025-01-11 21:39:00 +08:00
anonymous cac565506d fix: 修复bug 2025-01-11 12:07:07 +08:00
anonymous 25c045418d fix: bug 2025-01-11 11:25:14 +08:00
anonymous 7d8eb755f1 fix: bug 2025-01-11 11:15:41 +08:00
anonymous 4be8749cf5 fix: bug 2025-01-11 11:11:56 +08:00
anonymous 59d47ec9f5 feat: 上线前调整 2025-01-11 10:51:24 +08:00
anonymous fb7552192b fix: bug 2025-01-11 10:25:43 +08:00
anonymous 859bea7d0e feat: 修改字段 2025-01-10 21:25:45 +08:00
anonymous 23afc0fb91 feat: 修改文本 2025-01-10 20:30:40 +08:00
anonymous af8e85c483 feat: 上线前修改 2025-01-10 20:07:36 +08:00
anonymous 348d06eadb fix: 上线前修改 2025-01-10 19:13:58 +08:00
anonymous 17eb27bfa6 fix: 上线前修改 2025-01-10 19:00:32 +08:00
anonymous 5da0adfab2 refactor: 更新下载app地址 2025-01-10 08:54:01 +08:00
anonymous a2a3c09731 fix: 上线前修改 2025-01-09 20:27:02 +08:00
anonymous 7ad24e1444 fix: 上线前修改 2025-01-09 20:23:04 +08:00
anonymous 246c28e5d0 feat: 修改样式 2025-01-09 17:30:30 +08:00
anonymous 8f089b4bbd fix: 修改文本 2025-01-09 17:27:19 +08:00
anonymous a3eeed7273 refactor: 移除身份证照片 2025-01-09 17:24:25 +08:00
anonymous 2a620b5a0f fix: 身份证校验 2025-01-09 17:03:28 +08:00
anonymous 1f28b06a5c fix: bug 2025-01-09 16:59:51 +08:00
anonymous 79debee112 fix: 修改字段错误 2025-01-09 16:54:22 +08:00
anonymous 4ee9f70fcc refactor: 取消横向滚动条 2025-01-09 16:48:38 +08:00
anonymous 5ba0155b0b refactor: 修改验证码 2025-01-09 16:06:52 +08:00
anonymous ffb887f3bf feat: 对接完接口 2025-01-09 15:47:16 +08:00
anonymous e70ca852d8 feat: 对接部分接口 2025-01-09 10:45:10 +08:00
anonymous 21d8f75f6a feat: 前端重构 2025-01-07 18:04:40 +08:00
69 changed files with 1387 additions and 579 deletions
+2 -1
View File
@@ -97,6 +97,7 @@
"useId": true, "useId": true,
"useModel": true, "useModel": true,
"useTemplateRef": true, "useTemplateRef": true,
"useListPageRequest": true "useListPageRequest": true,
"useCaptcha": true
} }
} }
+1
View File
@@ -40,6 +40,7 @@
"commitlint", "commitlint",
"dcloudio", "dcloudio",
"iconfont", "iconfont",
"Kefu",
"qrcode", "qrcode",
"refresherrefresh", "refresherrefresh",
"scrolltolower", "scrolltolower",
+1 -1
View File
@@ -5,5 +5,5 @@
</p> </p>
<h1 align="center"> <h1 align="center">
<a href="https://github.com/feige996/unibest" target="_blank">unibest - 最好的 uniapp 开发框架</a> <a href="https://github.com/feige996/unibest" target="_blank">x-4</a>
</h1> </h1>
Vendored
+3 -3
View File
@@ -1,5 +1,5 @@
VITE_APP_TITLE = 'unibest' VITE_APP_TITLE = 'unibest'
VITE_APP_PORT = 9000 VITE_APP_PORT = 9001
VITE_UNI_APPID = 'H57F2ACE4' VITE_UNI_APPID = 'H57F2ACE4'
VITE_WX_APPID = 'wxa2abb91f64032a2b' VITE_WX_APPID = 'wxa2abb91f64032a2b'
@@ -7,8 +7,8 @@ VITE_WX_APPID = 'wxa2abb91f64032a2b'
# h5部署网站的base,配置到 manifest.config.ts 里的 h5.router.base # h5部署网站的base,配置到 manifest.config.ts 里的 h5.router.base
VITE_APP_PUBLIC_BASE=/ VITE_APP_PUBLIC_BASE=/
VITE_SERVER_BASEURL = 'https://mapi.foxmail555.cc' VITE_SERVER_BASEURL = 'https://api.qmbz.cc'
VITE_UPLOAD_BASEURL = 'https://ukw0y1.laf.run/upload' VITE_UPLOAD_BASEURL = 'https://api.qmbz.cc/api/common/upload'
# h5是否需要配置代理 # h5是否需要配置代理
VITE_APP_PROXY=false VITE_APP_PROXY=false
+2 -16
View File
@@ -1,23 +1,9 @@
{ {
"name": "马尔代夫国际钱包", "name": "全民参保",
"type": "commonjs", "type": "commonjs",
"version": "2.5.3", "version": "2.5.3",
"description": "unibest - 最好的 uniapp 开发模板", "description": "全民参保",
"author": {
"name": "feige996",
"zhName": "菲鸽",
"email": "1020103647@qq.com",
"github": "https://github.com/feige996",
"gitee": "https://gitee.com/feige996"
},
"license": "MIT", "license": "MIT",
"repository": "https://github.com/feige996/unibest",
"repository-gitee": "https://gitee.com/feige996/unibest",
"repository-deprecated": "https://github.com/codercup/unibest",
"bugs": {
"url": "https://github.com/feige996/unibest/issues"
},
"homepage": "https://feige996.github.io/unibest/",
"engines": { "engines": {
"node": ">=18", "node": ">=18",
"pnpm": ">=7.30" "pnpm": ">=7.30"
+7 -8
View File
@@ -32,19 +32,18 @@ export default defineUniPages({
pagePath: 'pages/index/index', pagePath: 'pages/index/index',
text: '首页', text: '首页',
}, },
{
iconPath: 'static/tabbar/invest.png',
selectedIconPath: 'static/tabbar/investHL.png',
pagePath: 'pages/invest/index',
text: '保障',
},
{ {
iconPath: 'static/tabbar/house.png', iconPath: 'static/tabbar/house.png',
selectedIconPath: 'static/tabbar/houseHL.png', selectedIconPath: 'static/tabbar/houseHL.png',
pagePath: 'pages/invite/index', pagePath: 'pages/invite/index',
text: '邀请好友', text: '社区',
}, },
// {
// iconPath: 'static/tabbar/invest.png',
// selectedIconPath: 'static/tabbar/investHL.png',
// pagePath: 'pages/invest/index',
// text: '理财',
// },
{ {
iconPath: 'static/tabbar/personal.png', iconPath: 'static/tabbar/personal.png',
selectedIconPath: 'static/tabbar/personalHL.png', selectedIconPath: 'static/tabbar/personalHL.png',
+4 -1
View File
@@ -36,7 +36,7 @@ const userStore = useUserStore()
/* 覆盖 uniapp 自带rpx效果 */ /* 覆盖 uniapp 自带rpx效果 */
html { html {
font-family: 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-family: 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 16px !important; // font-size: 16px !important;
} }
/* stylelint-disable-next-line selector-type-no-unknown */ /* stylelint-disable-next-line selector-type-no-unknown */
#app { #app {
@@ -131,4 +131,7 @@ uni-modal {
} }
} }
} }
::-webkit-scrollbar {
display: none;
}
</style> </style>
+1 -1
View File
@@ -23,7 +23,7 @@ defineProps({
bg-gray-100 bg-gray-100
class="h-full w-full" class="h-full w-full"
mode="aspectFill" mode="aspectFill"
:src="src ?? DefaultAavatar" :src="src ? src : DefaultAavatar"
/> />
</div> </div>
</template> </template>
+15 -4
View File
@@ -15,16 +15,27 @@
<script lang="ts" setup> <script lang="ts" setup>
import { getLastPage } from '@/utils' import { getLastPage } from '@/utils'
const title = getLastPage().$page.meta.navigationBar.titleText const props = defineProps({
titleColor: {
type: String,
default: '#fff',
},
title: {
type: String,
default: '',
},
})
const title = computed(() => {
return props.title || getLastPage().$page.meta.navigationBar.titleText
})
const showBack = getCurrentPages().length > 1 const showBack = getCurrentPages().length > 1
const handleClickLeft = () => { const handleClickLeft = () => {
uni.navigateBack() uni.navigateBack()
} }
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
:deep(.wd-navbar) { :deep(.wd-navbar) {
--wot-navbar-title-font-size: 32rpx; --wot-navbar-color: v-bind('titleColor');
// --wot-navbar-title-font-weight: 400;
} }
</style> </style>
+15
View File
@@ -0,0 +1,15 @@
const baseUrl = import.meta.env.VITE_SERVER_BASEURL
export const useCaptcha = () => {
const t = ref(Date.now())
const codeUrl = computed(() => {
return baseUrl + '/api/index/captcha?t=' + t.value
})
const refreshCode = () => {
t.value = Date.now()
}
onMounted(() => {
refreshCode()
})
return { codeUrl, t, refreshCode }
}
+11 -2
View File
@@ -50,23 +50,32 @@ function useListPageRequest(
...getPagingParams.value, ...getPagingParams.value,
...customParams, ...customParams,
}) })
console.log(data)
data.forEach((item: any) => { data.forEach((item: any) => {
if (String(item.createtime).length < 11) {
item.createtime = item.createtime * 1000
}
item.createtime = formatTime(item.createtime) item.createtime = formatTime(item.createtime)
item.image = getImageUrl(item.image) item.image = getImageUrl(item.image)
}) })
// totalPage.value = data.count ? Math.ceil(data.count / pagingParams.value.limit!) : 0 // totalPage.value = data.count ? Math.ceil(data.count / pagingParams.value.limit!) : 0
// 如果当前是第一页,则清空列表,否则追加数据
if (getPagingParams.value.page === 1) {
list.value = []
}
list.value.push(...data) list.value.push(...data)
} }
const onReload = async (params?: AnyObject) => { const onReload = async (params?: AnyObject) => {
// 如果当前是第一页,则清空列表
if (getPagingParams.value.page === 1) {
list.value = []
}
loading.value = true loading.value = true
pagingParams.value.page = 1 pagingParams.value.page = 1
if (params) { if (params) {
customParams = params customParams = params
} }
try { try {
list.value = []
await loadData() await loadData()
} finally { } finally {
loading.value = false loading.value = false
+6 -1
View File
@@ -56,7 +56,12 @@ function uploadFile<T>({ tempFilePath, formData, data, error, loading }) {
name: 'file', name: 'file',
formData, formData,
success: (uploadFileRes) => { success: (uploadFileRes) => {
data.value = uploadFileRes.data as T try {
data.value = JSON.parse(uploadFileRes.data).data.fullurl as T
} catch (e) {
console.log(e)
data.value = uploadFileRes.data as T
}
}, },
fail: (err) => { fail: (err) => {
console.error('uni.uploadFile err->', err) console.error('uni.uploadFile err->', err)
+1 -1
View File
@@ -4,7 +4,7 @@
* 可以设置路由白名单,或者黑名单,看业务需要选哪一个 * 可以设置路由白名单,或者黑名单,看业务需要选哪一个
* 我这里应为大部分都可以随便进入,所以使用黑名单 * 我这里应为大部分都可以随便进入,所以使用黑名单
*/ */
import { getUserInfoAPI } from '@/service' import { getRealNameAuthAPI, getUserInfoAPI } from '@/service'
import { useUserStore } from '@/store' import { useUserStore } from '@/store'
import { import {
getNotNeedLoginPages as _getNotNeedLoginPages, getNotNeedLoginPages as _getNotNeedLoginPages,
+79
View File
@@ -0,0 +1,79 @@
<route lang="json5">
{
style: {
navigationBarTitleText: '资金明细',
navigationBarBackgroundColor: '#fff',
navigationStyle: 'custom',
},
}
</route>
<script lang="ts" setup>
import NavBar from '@/components/NavBar.vue'
import { getMyAssetAPI } from '@/service'
import { useUserStore } from '@/store'
const { list: assetList } = useListPageRequest(getMyAssetAPI)
</script>
<template>
<view class="asset-page pt-15 relative">
<NavBar />
<!-- <view class="flex justify-around">
<view
v-for="(tabItem, index) in tabList"
@click="tabIndex = index"
:key="tabItem.value"
class="flex items-center bg-#DEEBFF text-#3B81F3 rounded-full justify-center py-4 px-10"
:class="{ 'btn-gradient text-white': tabIndex === index }"
>
<view class="text-14">{{ tabItem.label }}</view>
</view>
</view> -->
<view class="relative z-1 mt-10 main-content pt-30 pb-30 rounded-t-15">
<view class="mb-15 px-25">资金明细</view>
<template v-if="assetList.length">
<view
class="flex px-25 py-12 border-b items-center border-#3333331A border-b-solid"
v-for="item in assetList"
:key="item.id"
>
<image src="/static/images/page-sub/invite-icon.png" class="w-48 h-48" />
<view class="flex flex-col flex-1 ml-15">
<view class="text-14 text-#333">{{ item.memo }}</view>
<view class="text-12 mt-4 text-#333">{{ item.createtime }}</view>
</view>
<view class="flex flex-col items-end">
<view class="text-17 font-bold text-gradient">{{ item.money }}</view>
</view>
</view>
</template>
<template v-else>
<wd-status-tip image="content" tip="暂无数据" />
</template>
</view>
<!-- <view class="mx-15 text-16 font-bold text-#333">我的资产</view>
<view
class="mt-15 mx-15 rounded-20 text-#476FFF main-content p-15 rounded-10 shadow-[0_5px_30px_rgba(149,195,255,0.4)]"
>
<view class="text-14 text-#6784C7">总投资金</view>
<view class="text-35 mt-10 font-bold">{{ detailInfo.suminvest }}</view>
</view>
<view class="text-16 mx-15 mb-15 font-bold text-#333 mt-30">资产记录</view>
-->
</view>
</template>
<style scoped>
.asset-page {
background-image: url('@/static/images/assets-bg.jpg');
background-repeat: no-repeat;
background-position: top center;
background-size: 100%;
}
.main-content {
background-color: #ffffff;
/* backdrop-filter: blur(60px); */
}
</style>
+78 -35
View File
@@ -1,35 +1,90 @@
<route lang="json5"> <route lang="json5">
{ {
style: { style: {
navigationBarTitleText: '我的资产', navigationBarTitleText: '资金明细',
navigationBarBackgroundColor: '#fff', navigationBarBackgroundColor: '#fff',
navigationStyle: 'custom',
}, },
} }
</route> </route>
<script lang="ts" setup> <script lang="ts" setup>
import NavBar from '@/components/NavBar.vue'
import { getMyAssetAPI } from '@/service' import { getMyAssetAPI } from '@/service'
import { useUserStore } from '@/store' import { useUserStore } from '@/store'
const userStore = useUserStore() const userStore = useUserStore()
const detailInfo = ref({ const tabList = computed(() => {
point: 1, return [
score: 1000, { label: '我的余额', value: 1, money: userStore.userInfo?.money },
suminvest: '10000', { label: '社保金余额', value: 2, money: userStore.userInfo?.moneyjiu },
{ label: '养老金余额', value: 3, money: userStore.userInfo?.moneyold },
{ label: '团队佣金余额', value: 4, money: userStore.userInfo?.moneyyong },
]
}) })
const { list: assetList } = useListPageRequest((params) => const tabIndex = ref(0)
getMyAssetAPI(params).then((res) => {
detailInfo.value = res.data const { list: assetList, onReload } = useListPageRequest(
res.data.data = res.data.list (params) =>
return res.data getMyAssetAPI(params).then((res) => {
}), return res
}),
{
autoRequest: false,
},
) )
onLoad((options) => {
tabIndex.value = Number(options.tabIndex ?? 0)
onReload({
flagdata: unref(tabList)[tabIndex.value].value,
})
})
</script> </script>
<template> <template>
<view class="min-h-screen py-15"> <view class="asset-page pt-15 relative">
<view class="mx-15 text-16 font-bold text-#333">我的资产</view> <NavBar :title="tabList[tabIndex].label" />
<!-- <view class="flex justify-around">
<view
v-for="(tabItem, index) in tabList"
@click="tabIndex = index"
:key="tabItem.value"
class="flex items-center bg-#DEEBFF text-#3B81F3 rounded-full justify-center py-4 px-10"
:class="{ 'btn-gradient text-white': tabIndex === index }"
>
<view class="text-14">{{ tabItem.label }}</view>
</view>
</view> -->
<view class="mt-30 p-15 text-white">
<view class="text-17">{{ tabList[tabIndex].label }}</view>
<view class="text-30">{{ tabList[tabIndex].money }}</view>
</view>
<view class="relative z-1 mt-10 main-content pt-30 pb-30 rounded-t-15">
<view class="mb-15 px-25">{{ tabList[tabIndex].label }}明细</view>
<template v-if="assetList.length">
<view
class="flex px-25 py-12 border-b items-center border-#3333331A border-b-solid"
v-for="item in assetList"
:key="item.id"
>
<image src="/static/images/page-sub/invite-icon.png" class="w-48 h-48" />
<view class="flex flex-col flex-1 ml-15">
<view class="text-14 text-#333">{{ item.memo }}</view>
<view class="text-12 mt-4 text-#333">{{ item.createtime }}</view>
</view>
<view class="flex flex-col items-end">
<view class="text-17 font-bold text-gradient">{{ item.money }}</view>
</view>
</view>
</template>
<template v-else>
<wd-status-tip image="content" tip="暂无数据" />
</template>
</view>
<!-- <view class="mx-15 text-16 font-bold text-#333">我的资产</view>
<view <view
class="mt-15 mx-15 rounded-20 text-#476FFF main-content p-15 rounded-10 shadow-[0_5px_30px_rgba(149,195,255,0.4)]" class="mt-15 mx-15 rounded-20 text-#476FFF main-content p-15 rounded-10 shadow-[0_5px_30px_rgba(149,195,255,0.4)]"
> >
@@ -37,31 +92,19 @@ const { list: assetList } = useListPageRequest((params) =>
<view class="text-35 mt-10 font-bold">{{ detailInfo.suminvest }}</view> <view class="text-35 mt-10 font-bold">{{ detailInfo.suminvest }}</view>
</view> </view>
<view class="text-16 mx-15 mb-15 font-bold text-#333 mt-30">资产记录</view> <view class="text-16 mx-15 mb-15 font-bold text-#333 mt-30">资产记录</view>
<view -->
class="flex px-15 py-8 border-b items-center border-#E5E5E5 border-b-solid"
v-for="item in assetList"
:key="item.id"
>
<image src="/static/images/page-sub/invite-icon.png" class="w-32 h-32 self-center" />
<view class="flex flex-col flex-1 ml-15">
<view class="text-14 text-#333">{{ item.memo }}</view>
<!-- <view class="text-12 mt-10 text-#999">奖励</view> -->
<view class="text-12 mt-10 text-#999">{{ item.createtime }}</view>
</view>
<view class="flex flex-col items-end">
<view class="text-14 font-bold text-#FF5F5F">{{ item.money }}</view>
<!-- <view class="text-14 mt-10 py-4 px-10 bg-#71C78A1A text-#71C78A">已到账</view> -->
</view>
</view>
</view> </view>
</template> </template>
<style> <style scoped>
.main-content { .asset-page {
background-image: url('@/static/images/page-sub/team/main-bg.png'); background-image: url('@/static/images/assets-bg.jpg');
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: top center;
background-size: 100% 100%; background-size: 100%;
}
.main-content {
background-color: #ffffff;
/* backdrop-filter: blur(60px); */
} }
</style> </style>
+37 -14
View File
@@ -8,7 +8,7 @@
</route> </route>
<template> <template>
<view class="min-h-screen pb-100"> <view class="min-h-screen pb-100">
<NavBar> <NavBar :title="title" title-color="#333">
<template #right> <template #right>
<image <image
@click="onWithdrawalDetail" @click="onWithdrawalDetail"
@@ -17,26 +17,39 @@
/> />
</template> </template>
</NavBar> </NavBar>
<view class="p-15"> <view
class="m-15 text-white flex rounded-tl-10 rounded-br-10 justify-between items-center p-15 bg-[linear-gradient(90deg,rgba(59,129,243,0.5),#3B81F3)]"
>
<view class="text-14">{{ type === 0 ? '养老金' : '团队佣金' }}余额</view>
<view class="text-17 font-bold">
{{ type === 0 ? userStore.userInfo?.moneyold : userStore.userInfo?.moneyyong }}
</view>
</view>
<view class="p-15 bg-white shadow-[0_-2px_3px_rgba(10,68,245,0.1)] rounded-10">
<view class="mt-15"> <view class="mt-15">
<view class="flex items-center justify-between">
<view class="text-14 text-#333">我的股数</view>
<view class="text-12 text-#999">可转换股数{{ userStore.userInfo.score }}</view>
</view>
<view <view
class="flex items-center text-14 mt-15 text-#333 p-16 shadow-[0_0_10px_rgba(10,68,245,0.1)] rounded-10" class="flex items-center text-14 mt-15 text-#333 p-16 shadow-[0_0_10px_rgba(10,68,245,0.1)] rounded-10"
> >
<input <input
v-model="convertNum" v-model="convertNum"
type="number" type="number"
placeholder="请输入股数" placeholder="转出金额"
class="text-14 text-#333 flex-1" class="text-14 text-#333 flex-1"
/> />
<view class="text-12 text-gradient" @click="convertNum = userStore.userInfo.score"> <view
class="text-12 text-gradient"
@click="
convertNum = type === 0 ? userStore.userInfo?.moneyold : userStore.userInfo?.moneyyong
"
>
全部 全部
</view> </view>
</view> </view>
<view class="text-12 text-#889BC6 mt-15">马尔代夫股权每股价值500元</view> <view class="text-14 text-#889BC6 mt-30">提现说明TIPS</view>
<view class="text-12 text-#889BC6 mt-15">
<view>1如遇到系统结算繁忙转换将会延迟到账</view>
<view class="mt-4">2提现将会提现至您的工商银行卡;</view>
</view>
</view> </view>
</view> </view>
<view <view
@@ -47,7 +60,7 @@
class="btn-gradient flex-1 text-center text-white rounded-full text-14 px-30 py-10" class="btn-gradient flex-1 text-center text-white rounded-full text-14 px-30 py-10"
@click="onSubmit" @click="onSubmit"
> >
确认转换至余额 确认转换至{{ type === 0 ? '余额' : '养老金' }}
</view> </view>
</view> </view>
</view> </view>
@@ -56,7 +69,7 @@
<script setup lang="ts"> <script setup lang="ts">
import NavBar from '@/components/NavBar.vue' import NavBar from '@/components/NavBar.vue'
import { convertScoreAPI } from '@/service' import { convertScoreAPI, getOldMoneyTransferAPI, getYongMoneyTransferAPI } from '@/service'
import { useUserStore } from '@/store' import { useUserStore } from '@/store'
import { mergeStep, showModal } from '@/utils' import { mergeStep, showModal } from '@/utils'
@@ -66,19 +79,29 @@ const convertNum = ref('')
const onWithdrawalDetail = () => { const onWithdrawalDetail = () => {
uni.navigateTo({ uni.navigateTo({
url: '/pages-sub/asset/index', url: `/pages-sub/asset/index?tabIndex=${type.value ? 3 : 2}`,
}) })
} }
const onSubmit = mergeStep(async () => { const onSubmit = mergeStep(async () => {
await showModal('确认转换?') await showModal('确认转换?')
await convertScoreAPI({ const request = type.value === 0 ? getOldMoneyTransferAPI : getYongMoneyTransferAPI
score: convertNum.value, await request({
money: convertNum.value,
}) })
await showModal('转换成功') await showModal('转换成功')
userStore.loadUserInfo() userStore.loadUserInfo()
onWithdrawalDetail() onWithdrawalDetail()
}) })
const type = ref(0)
onLoad((options) => {
type.value = Number(options.type ?? 0)
})
const title = computed(() => {
return type.value === 0 ? '养老金转余额' : '团队佣金转养老金'
})
</script> </script>
<style scoped></style> <style scoped></style>
+46
View File
@@ -0,0 +1,46 @@
<route lang="json5" type="page">
{
style: {
navigationBarTitleText: '热点新闻',
},
}
</route>
<template>
<view class="hot-news-page min-h-screen p-15">
<view class="bg-#fff rounded-10 px-15 py-15" v-if="newsList.length > 0">
<view
class="flex mb-15"
v-for="item in newsList"
:key="item.id"
@click="handleNewsDetail(item.id)"
>
<image class="w-85 h-85 rounded-10" :src="item.image" mode="aspectFill" />
<view class="ml-15 flex-1 flex flex-col justify-between">
<view text-14>{{ item.name }}</view>
<view class="text-12 text-#999">{{ formatTime(item.createtime) }}</view>
</view>
</view>
</view>
<wd-status-tip v-else image="content" tip="暂无内容" />
</view>
</template>
<script setup lang="ts">
import { getIntroductionAPI } from '@/service'
import { formatTime } from '@/utils'
const { list: newsList } = useListPageRequest((params) =>
getIntroductionAPI({ type: 1, ...params }),
)
const handleNewsDetail = (id: number) => {
uni.navigateTo({
url: `/pages-sub/news-detail/index?id=${id}`,
})
}
</script>
<style scoped>
.hot-news-page {
background: #f7f7f7;
}
</style>
+15 -6
View File
@@ -3,27 +3,36 @@
style: { style: {
navigationBarTitleText: '投资记录', navigationBarTitleText: '投资记录',
navigationBarBackgroundColor: '#fff', navigationBarBackgroundColor: '#fff',
navigationStyle: 'custom',
}, },
} }
</route> </route>
<script setup lang="ts"> <script setup lang="ts">
import NavBar from '@/components/NavBar.vue'
import { getInvestmentRecordAPI } from '@/service' import { getInvestmentRecordAPI } from '@/service'
const { list: investmentRecordList } = useListPageRequest(getInvestmentRecordAPI) const { list: investmentRecordList } = useListPageRequest(getInvestmentRecordAPI)
function getType(item) {
return Number(item.typedata) === 2 ? '投保' : '投资'
}
</script> </script>
<template> <template>
<view class="min-h-screen pb-100"> <view
<template v-if="investmentRecordList.length"> class="min-h-screen pb-100"
style="background: linear-gradient(180deg, #3a90f2 0%, #f7f7f7 100%)"
>
<NavBar />
<view class="mt-15" v-if="investmentRecordList.length">
<view <view
class="flex px-15 py-8 border-b border-#E5E5E5 border-b-solid" class="flex px-15 py-8 mb-1 bg-#ffffff"
v-for="item in investmentRecordList" v-for="item in investmentRecordList"
:key="item.id" :key="item.id"
> >
<image src="/static/images/page-sub/money-icon.png" class="w-32 h-32 self-center" /> <image src="/static/images/page-sub/money-icon.png" class="w-32 h-32 self-center" />
<view class="flex flex-col flex-1 justify-between ml-15"> <view class="flex flex-col flex-1 justify-between ml-15">
<view class="text-14 text-#333">{{ item.name }}</view> <view class="text-14 text-#333">{{ item.name }}</view>
<view class="text-12 text-#999">投资</view> <view class="text-12 text-#999">{{ getType(item) }}</view>
<view class="text-12 text-#999">{{ item.createtime }}</view> <view class="text-12 text-#999">{{ item.createtime }}</view>
</view> </view>
@@ -33,11 +42,11 @@ const { list: investmentRecordList } = useListPageRequest(getInvestmentRecordAPI
class="text-14 mt-18 py-4 px-10 bg-#71C78A1A text-#71C78A" class="text-14 mt-18 py-4 px-10 bg-#71C78A1A text-#71C78A"
v-if="Number(item.status) === 1" v-if="Number(item.status) === 1"
> >
投资成功 {{ getType(item) }}成功
</view> </view>
</view> </view>
</view> </view>
</template> </view>
<template v-else> <template v-else>
<wd-status-tip image="content" tip="暂无内容" /> <wd-status-tip image="content" tip="暂无内容" />
</template> </template>
+1 -1
View File
@@ -66,7 +66,7 @@ const onLottery = () => {
<style lang="scss" scoped> <style lang="scss" scoped>
.invite-page { .invite-page {
background-image: url('@/static/images/page-sub/invite-bg.png'); background-image: url('@/static/images/page-sub/invite-bg.jpg');
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: top; background-position: top;
background-size: 100%; background-size: 100%;
+1 -1
View File
@@ -118,7 +118,7 @@ const onEnd = () => {
</view> </view>
</view> </view>
</template> </template>
<style> <style scoped>
.lottery-item { .lottery-item {
&.mask { &.mask {
&::after { &::after {
+1 -1
View File
@@ -27,6 +27,6 @@ onLoad(async (options) => {
</view> </view>
</view> </view>
<image class="w-full mt-15" mode="widthFix" :src="getImageUrl(newsDetail.image)" /> <image class="w-full mt-15" mode="widthFix" :src="getImageUrl(newsDetail.image)" />
<view class="text-14 text-gray-600 mt-15">{{ newsDetail.content }}</view> <view class="text-14 text-gray-600 mt-15" v-html="newsDetail.content" />
</view> </view>
</template> </template>
+49
View File
@@ -0,0 +1,49 @@
<route lang="json5" type="page">
{
style: {
navigationBarTitleText: '最新时讯',
navigationStyle: 'custom',
},
}
</route>
<template>
<view class="news-page">
<NavBar />
<view class="py-15" v-if="newsList.length > 0">
<view
class="bg-white rounded-10 overflow-hidden p-15 mx-15 mb-15"
v-for="item in newsList"
:key="item.id"
@click="handleNewsDetail(item.id)"
>
<image class="rounded-10 w-full h-160" :src="item.image" mode="aspectFill" />
<view class="mt-10 flex-1 flex flex-col justify-between">
<view class="text-14">{{ item.name }}</view>
<view class="text-12 text-#999 mt-10">{{ item.source }}</view>
</view>
</view>
</view>
<wd-status-tip v-else image="content" tip="暂无内容" />
</view>
</template>
<script setup lang="ts">
import NavBar from '@/components/NavBar.vue'
import { getIntroductionAPI } from '@/service'
const { list: newsList } = useListPageRequest((params) =>
getIntroductionAPI({ type: 1, ...params }),
)
const handleNewsDetail = (id: number) => {
uni.navigateTo({
url: `/pages-sub/news-detail/index?id=${id}`,
})
}
</script>
<style scoped>
.news-page {
background: linear-gradient(180deg, #3a90f2 0%, #f7f7f7 100%);
}
</style>
+27 -16
View File
@@ -16,29 +16,40 @@ import VueQrcode from '@chenfengyuan/vue-qrcode'
<template> <template>
<view class="official-community-page"> <view class="official-community-page">
<NavBar /> <NavBar />
<view class="p-15 text-center bg-white rounded-10 m-15 shadow-[0_0_10px_rgba(0,0,0,0.1)]"> <view
<view class="text-16 font-bold text-#333">扫码进入</view> class="relative px-15 text-center bg-white rounded-10 m-15 shadow-[0_0_10px_rgba(0,0,0,0.1)]"
<wd-icon name="arrow-down" color="#333" size="18px"></wd-icon> >
<view class="btn-gradient rounded-full w-fit mx-auto text-16 text-white py-10 px-15"> <image
微聊总群50101011 class="w-full mx-auto"
</view> src="@/static/images/page-sub/official-community/image-1.jpg"
<VueQrcode class="!w-270 !h-270 mx-auto" :value="'qrcodeValue'" :options="{ size: 600 }" /> mode="widthFix"
/>
<a
href="https://doudlj.org/joinchat/Jol7Vt58a2aCrjsXm9D_LA"
class="absolute bottom-15 left-50% -translate-x-1/2"
>
点击进入
</a>
</view> </view>
<view class="p-15 text-center bg-white rounded-10 m-15 shadow-[0_0_10px_rgba(0,0,0,0.1)]"> <view
<view class="text-16 font-bold text-#333">扫码进入</view> class="relative px-15 text-center bg-white rounded-10 m-15 shadow-[0_0_10px_rgba(0,0,0,0.1)]"
<wd-icon name="arrow-down" color="#333" size="18px"></wd-icon> >
<view class="btn-gradient rounded-full w-fit mx-auto text-16 text-white py-10 px-15"> <image
QQ群2群1011101011 class="w-full mx-auto"
</view> src="@/static/images/page-sub/official-community/image-2.jpg"
<VueQrcode class="!w-270 !h-270 mx-auto" :value="'qrcodeValue'" :options="{ size: 600 }" /> mode="widthFix"
/>
<a href="https://doudlj.org/NiPing95" class="absolute bottom-15 left-50% -translate-x-1/2">
点击进入
</a>
</view> </view>
</view> </view>
</template> </template>
<style> <style scoped>
.official-community-page { .official-community-page {
min-height: 100vh; min-height: 100vh;
padding-bottom: 100rpx; padding-bottom: 50px;
background-image: url('@/static/images/bg.png'); background-image: url('@/static/images/bg.png');
background-position: top; background-position: top;
background-size: cover; background-size: cover;
+65 -8
View File
@@ -38,6 +38,36 @@
v-model="form.cardnum" v-model="form.cardnum"
/> />
</view> </view>
<!-- <view class="py-15 text-14">
<view class="flex items-center">
<image src="@/static/images/page-sub/realname/realname-card.png" class="w-20 h-20" />
<view class="ml-8">证件照片</view>
</view>
<view
class="flex items-center justify-center mt-15 rounded-10 bg-#F1F9FC h-168 w-full"
@click="onUploadZCardImage"
>
<view v-if="!zcardimage" class="text-center">
<image src="@/static/images/page-sub/realname/upload-icon.png" class="w-40 h-40" />
<view class="text-14 text-#999 mt-10">点击上传身份证正面</view>
</view>
<view v-else class="flex items-center">
<image :src="zcardimage" class="w-315 h-168" mode="aspectFit" />
</view>
</view>
<view
class="flex items-center justify-center mt-15 rounded-10 bg-#F1F9FC h-168 w-full"
@click="onUploadFCardImage"
>
<view v-if="!fcardimage" class="text-center">
<image src="@/static/images/page-sub/realname/upload-icon.png" class="w-40 h-40" />
<view class="text-14 text-#999 mt-10">点击上传身份证反面</view>
</view>
<view v-else class="flex items-center">
<image :src="fcardimage" class="w-315 h-168" mode="aspectFit" />
</view>
</view>
</view> -->
</view> </view>
<view class="fixed bottom-0 left-0 right-0 pb-safe"> <view class="fixed bottom-0 left-0 right-0 pb-safe">
<button class="btn-gradient text-white rounded-full m-15 text-16" @click="onSubmit"> <button class="btn-gradient text-white rounded-full m-15 text-16" @click="onSubmit">
@@ -54,8 +84,11 @@
mode="aspectFit" mode="aspectFit"
/> />
<view class="text-center mt-15 text-14 text-#999">您的实名认证正在审核中请耐心等待</view> <view class="text-center mt-15 text-14 text-#999">您的实名认证正在审核中请耐心等待</view>
<button class="btn-gradient px-30 text-white rounded-full m-15 text-16" @click="onBack"> <button
返回 class="btn-gradient px-30 text-white rounded-full m-15 text-16"
@click="userStore.logout"
>
退出登录
</button> </button>
</template> </template>
<template v-else-if="Number(realnameInfo.status) === 2"> <template v-else-if="Number(realnameInfo.status) === 2">
@@ -65,7 +98,7 @@
mode="aspectFit" mode="aspectFit"
/> />
<view class="text-center mt-15 text-14 text-#999">恭喜您实名认证成功</view> <view class="text-center mt-15 text-14 text-#999">恭喜您实名认证成功</view>
<button class="btn-gradient px-30 text-white rounded-full m-15 text-16" @click="onBack"> <button class="btn-gradient px-30 text-white rounded-full m-15 text-16" @click="onGoHome">
返回 返回
</button> </button>
</template> </template>
@@ -90,9 +123,11 @@
<script setup lang="ts"> <script setup lang="ts">
import { getRealNameAuthAPI, realNameAuthAPI } from '@/service' import { getRealNameAuthAPI, realNameAuthAPI } from '@/service'
import { useUserStore } from '@/store' import { useUserStore } from '@/store'
import { showModal } from '@/utils' import { mergeStep, showModal } from '@/utils'
import { ref } from 'vue' import { ref } from 'vue'
const userStore = useUserStore()
const form = ref({ const form = ref({
realname: '', realname: '',
cardnum: '', cardnum: '',
@@ -102,18 +137,40 @@ const onBack = () => {
uni.navigateBack() uni.navigateBack()
} }
const onSubmit = async () => { const onSubmit = mergeStep(async () => {
if (!form.value.realname || !form.value.cardnum) { if (!/^[\u4e00-\u9fa5·]{2,8}$/.test(form.value.realname)) {
await showModal('请填写完整信息') await showModal('姓名格式错误')
return return
} }
await realNameAuthAPI(form.value)
if (!/^\d{17}[\d|x]$/i.test(form.value.cardnum)) {
await showModal('身份证号格式错误')
return
}
// if (!zcardimage.value || !fcardimage.value) {
// await showModal('请上传身份证照片')
// return
// }
await realNameAuthAPI({
...form.value,
// zcardimage: zcardimage.value,
// fcardimage: fcardimage.value,
})
await showModal('提交成功,请耐心等待审核!') await showModal('提交成功,请耐心等待审核!')
realnameInfo.value = await getRealNameAuthAPI().then((res) => { realnameInfo.value = await getRealNameAuthAPI().then((res) => {
return res.data return res.data
}) })
})
const onGoHome = () => {
uni.reLaunch({
url: '/',
})
} }
// const { data: zcardimage, run: onUploadZCardImage } = useUpload()
// const { data: fcardimage, run: onUploadFCardImage } = useUpload()
const realnameInfo = ref(null) const realnameInfo = ref(null)
onLoad(async () => { onLoad(async () => {
realnameInfo.value = await getRealNameAuthAPI().then((res) => { realnameInfo.value = await getRealNameAuthAPI().then((res) => {
+1 -1
View File
@@ -123,7 +123,7 @@ watch(
<style lang="scss" scoped> <style lang="scss" scoped>
.team-page { .team-page {
min-height: 100vh; min-height: 100vh;
padding-bottom: 100rpx; padding-bottom: 50px;
background-image: url('@/static/images/bg.png'); background-image: url('@/static/images/bg.png');
background-position: top; background-position: top;
background-size: cover; background-size: cover;
+50 -45
View File
@@ -8,55 +8,60 @@
</route> </route>
<template> <template>
<view class="min-h-screen pb-100"> <view class="min-h-screen pb-100">
<view <template v-if="list.length > 0">
class="flex px-15 py-8 border-b border-#E5E5E5 border-b-solid" <view
v-for="item in list" class="flex px-15 py-8 border-b border-#E5E5E5 border-b-solid"
:key="item.id" v-for="item in list"
> :key="item.id"
<image >
src="/static/images/invest/alipay-icon.png" <image
class="w-32 h-32 self-center" src="/static/images/invest/alipay-icon.png"
v-if="item.typedata === '支付宝'" class="w-32 h-32 self-center"
/> v-if="item.typedata === '支付宝'"
<image />
src="/static/images/invest/wechat-icon.png" <image
class="w-32 h-32 self-center" src="/static/images/invest/wechat-icon.png"
v-if="item.typedata === '微信'" class="w-32 h-32 self-center"
/> v-if="item.typedata === '微信'"
<image />
src="/static/images/invest/unionpay-icon.png" <image
class="w-32 h-32 self-center" src="/static/images/invest/unionpay-icon.png"
v-if="item.typedata === '银联'" class="w-32 h-32 self-center"
/> v-if="item.typedata === '银联'"
/>
<view class="flex flex-col flex-1 justify-between ml-15"> <view class="flex flex-col flex-1 justify-between ml-15">
<view class="text-14 text-#333">{{ item.typedata }}</view> <view class="text-14 text-#333">{{ item.typedata }}</view>
<view class="text-12 text-#999">提现</view> <view class="text-12 text-#999">提现</view>
<view class="text-12 text-#999">{{ item.createtime }}</view> <view class="text-12 text-#999">{{ item.createtime }}</view>
</view> </view>
<view class="flex flex-col items-end"> <view class="flex flex-col items-end">
<view class="text-16 text-#FF5F5F">{{ item.money }}</view> <view class="text-16 text-#FF5F5F">{{ item.money }}</view>
<view <view
class="text-14 mt-18 py-4 px-10 bg-#99999990 text-#fff" class="text-14 mt-18 py-4 px-10 bg-#99999990 text-#fff"
v-if="Number(item.status) === 1" v-if="Number(item.status) === 1"
> >
审核中 审核中
</view> </view>
<view <view
class="text-14 mt-18 py-4 px-10 bg-#71C78A1A text-#71C78A" class="text-14 mt-18 py-4 px-10 bg-#71C78A1A text-#71C78A"
v-if="Number(item.status) === 2" v-if="Number(item.status) === 2"
> >
提现成功 提现成功
</view> </view>
<view <view
class="text-14 mt-18 py-4 px-10 bg-#FF5F5F90 text-#fff" class="text-14 mt-18 py-4 px-10 bg-#FF5F5F90 text-#fff"
v-if="Number(item.status) === 3" v-if="Number(item.status) === 3"
> >
提现失败 提现失败
</view>
</view> </view>
</view> </view>
</view> </template>
<template v-else>
<wd-status-tip image="content" tip="暂无内容" />
</template>
</view> </view>
</template> </template>
+16 -61
View File
@@ -8,7 +8,7 @@
</route> </route>
<template> <template>
<view class="min-h-screen pb-100"> <view class="min-h-screen pb-100">
<NavBar> <NavBar title-color="#333">
<template #right> <template #right>
<image <image
@click="onWithdrawalDetail" @click="onWithdrawalDetail"
@@ -17,7 +17,13 @@
/> />
</template> </template>
</NavBar> </NavBar>
<view class="p-15"> <view
class="m-15 text-white flex rounded-tl-10 rounded-br-10 justify-between items-center p-15 bg-[linear-gradient(90deg,rgba(59,129,243,0.5),#3B81F3)]"
>
<view class="text-14">钱包余额</view>
<view class="text-17 font-bold">{{ userStore.userInfo?.money }}</view>
</view>
<view class="p-15 bg-white shadow-[0_-2px_3px_rgba(10,68,245,0.1)] rounded-10">
<view class="mt-15"> <view class="mt-15">
<view class="text-14 text-#333">提现金额</view> <view class="text-14 text-#333">提现金额</view>
<view <view
@@ -29,48 +35,26 @@
placeholder="请输入提现金额" placeholder="请输入提现金额"
class="text-14 text-#333 flex-1" class="text-14 text-#333 flex-1"
/> />
<view class="text-12 text-#04A9F9" @click="form.money = userStore.userInfo.money"> <view class="text-12 text-#04A9F9" @click="form.money = userStore.userInfo?.money">
全部 全部
</view> </view>
</view> </view>
<view class="text-12 text-#889BC6 mt-15">当前余额{{ userStore.userInfo.money }}</view> <view class="text-14 text-#889BC6 mt-30">提现说明TIPS</view>
</view> <view class="text-12 text-#889BC6 mt-15">
<view>1如遇到系统结算繁忙结算将会延迟到账</view>
<view class="mt-50"> <view class="mt-4">2提现将会提现至您的工商银行卡;</view>
<view class="text-14 text-#333">收款方式</view>
<view
class="flex items-center text-14 mt-15 text-#333 p-16 shadow-[0_0_10px_rgba(10,68,245,0.1)] rounded-10"
@click="onSelectPayType"
>
<view class="flex-1">
{{ typeName ? `${typeName}${currentBank?.banknum}` : '请选择收款方式' }}
</view>
<wd-icon name="arrow-right" size="16px"></wd-icon>
</view>
</view>
<view class="mt-50">
<view class="text-14 text-#333">交易密码</view>
<view class="text-14 mt-15 text-#333 p-16 shadow-[0_0_10px_rgba(10,68,245,0.1)] rounded-10">
<input
v-model="form.tpassword"
type="password"
placeholder="请输入交易密码"
class="text-14 text-#333"
/>
</view> </view>
</view> </view>
</view> </view>
<view <view
class="bg-white fixed bottom-0 left-0 right-0 px-15 py-10 shadow-[0_0_10px_rgba(10,68,245,0.1)]" class="bg-white fixed bottom-0 left-0 right-0 px-15 py-10 shadow-[0_0_10px_rgba(10,68,245,0.1)]"
> >
<view class="flex items-center pb-safe"> <view class="pb-safe">
<view class="text-gradient flex-1 text-14">到账CNY:{{ form.money ?? '0' }}</view>
<view <view
class="btn-gradient text-center text-white rounded-full text-14 px-30 py-10" class="btn-gradient text-center text-white rounded-full text-14 px-30 py-10"
@click="onSubmit" @click="onSubmit"
> >
申请提现 提现
</view> </view>
</view> </view>
</view> </view>
@@ -87,8 +71,6 @@ const userStore = useUserStore()
const form = ref({ const form = ref({
money: '', money: '',
bankid: '6',
tpassword: '',
}) })
const onWithdrawalDetail = () => { const onWithdrawalDetail = () => {
@@ -97,22 +79,6 @@ const onWithdrawalDetail = () => {
}) })
} }
const typeName = computed(() => {
return ['支付宝', '微信', '银行卡'][Number(unref(currentBank)?.typedata) - 1]
})
const currentBank = ref<any>(null)
const onSelectPayType = () => {
uni.$once('withdrawal-type', (data: any) => {
form.value.bankid = data.id
console.log(data)
currentBank.value = data
})
uni.navigateTo({
url: '/pages-sub/withdrawal-type/index?type=select',
})
}
const onSubmit = async () => { const onSubmit = async () => {
if (!form.value.money) { if (!form.value.money) {
return uni.showToast({ return uni.showToast({
@@ -120,18 +86,7 @@ const onSubmit = async () => {
icon: 'none', icon: 'none',
}) })
} }
if (!form.value.bankid) {
return uni.showToast({
title: '请选择收款方式',
icon: 'none',
})
}
if (!form.value.tpassword) {
return uni.showToast({
title: '请输入交易密码',
icon: 'none',
})
}
await showModal('确认提现?') await showModal('确认提现?')
await submitWithdrawalAPI(form.value) await submitWithdrawalAPI(form.value)
await showModal('提交成功') await showModal('提交成功')
+41 -9
View File
@@ -29,11 +29,17 @@
"pagePath": "pages/index/index", "pagePath": "pages/index/index",
"text": "首页" "text": "首页"
}, },
{
"iconPath": "static/tabbar/invest.png",
"selectedIconPath": "static/tabbar/investHL.png",
"pagePath": "pages/invest/index",
"text": "保障"
},
{ {
"iconPath": "static/tabbar/house.png", "iconPath": "static/tabbar/house.png",
"selectedIconPath": "static/tabbar/houseHL.png", "selectedIconPath": "static/tabbar/houseHL.png",
"pagePath": "pages/invite/index", "pagePath": "pages/invite/index",
"text": "邀请好友" "text": "社区"
}, },
{ {
"iconPath": "static/tabbar/personal.png", "iconPath": "static/tabbar/personal.png",
@@ -59,21 +65,21 @@
"navigationBarTitleText": "忘记密码", "navigationBarTitleText": "忘记密码",
"navigationStyle": "custom" "navigationStyle": "custom"
}, },
"notNeedLogin": false "notNeedLogin": true
}, },
{ {
"path": "pages/invest/index", "path": "pages/invest/index",
"type": "page", "type": "page",
"style": { "style": {
"navigationStyle": "custom", "navigationStyle": "custom",
"navigationBarTitleText": "投资理财" "navigationBarTitleText": "保障"
} }
}, },
{ {
"path": "pages/invite/index", "path": "pages/invite/index",
"type": "page", "type": "page",
"style": { "style": {
"navigationBarTitleText": "邀请好友", "navigationBarTitleText": "社区",
"navigationBarBackgroundColor": "#fff", "navigationBarBackgroundColor": "#fff",
"navigationStyle": "custom" "navigationStyle": "custom"
} }
@@ -85,7 +91,7 @@
"navigationBarTitleText": "登录", "navigationBarTitleText": "登录",
"navigationStyle": "custom" "navigationStyle": "custom"
}, },
"notNeedLogin": false "notNeedLogin": true
}, },
{ {
"path": "pages/my/index", "path": "pages/my/index",
@@ -102,7 +108,7 @@
"navigationBarTitleText": "注册", "navigationBarTitleText": "注册",
"navigationStyle": "custom" "navigationStyle": "custom"
}, },
"notNeedLogin": false "notNeedLogin": true
} }
], ],
"subPackages": [ "subPackages": [
@@ -113,8 +119,18 @@
"path": "asset/index", "path": "asset/index",
"type": "page", "type": "page",
"style": { "style": {
"navigationBarTitleText": "我的资产", "navigationBarTitleText": "资金明细",
"navigationBarBackgroundColor": "#fff" "navigationBarBackgroundColor": "#fff",
"navigationStyle": "custom"
}
},
{
"path": "asset-detail/index",
"type": "page",
"style": {
"navigationBarTitleText": "资金明细",
"navigationBarBackgroundColor": "#fff",
"navigationStyle": "custom"
} }
}, },
{ {
@@ -132,6 +148,13 @@
"navigationBarTitleText": "分包页面 标题" "navigationBarTitleText": "分包页面 标题"
} }
}, },
{
"path": "hot-news/index",
"type": "page",
"style": {
"navigationBarTitleText": "热点新闻"
}
},
{ {
"path": "introduction/index", "path": "introduction/index",
"type": "page", "type": "page",
@@ -145,7 +168,8 @@
"type": "page", "type": "page",
"style": { "style": {
"navigationBarTitleText": "投资记录", "navigationBarTitleText": "投资记录",
"navigationBarBackgroundColor": "#fff" "navigationBarBackgroundColor": "#fff",
"navigationStyle": "custom"
} }
}, },
{ {
@@ -182,6 +206,14 @@
"navigationStyle": "custom" "navigationStyle": "custom"
} }
}, },
{
"path": "news/index",
"type": "page",
"style": {
"navigationBarTitleText": "最新时讯",
"navigationStyle": "custom"
}
},
{ {
"path": "news-detail/index", "path": "news-detail/index",
"type": "page", "type": "page",
+3 -4
View File
@@ -4,11 +4,11 @@
navigationBarTitleText: '忘记密码', navigationBarTitleText: '忘记密码',
navigationStyle: 'custom', navigationStyle: 'custom',
}, },
notNeedLogin: false, notNeedLogin: true,
} }
</route> </route>
<template> <template>
<view class="login-container relative"> <view class="login-container pb-50 relative">
<NavBar /> <NavBar />
<view class="pt-45"> <view class="pt-45">
<view class="mx-15 px-15 shadow-[0_0_10px_rgba(10,68,245,0.1)] rounded-10"> <view class="mx-15 px-15 shadow-[0_0_10px_rgba(10,68,245,0.1)] rounded-10">
@@ -112,11 +112,10 @@ onLoad(() => {
}) })
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.login-container { .login-container {
box-sizing: border-box; box-sizing: border-box;
min-height: 100vh; min-height: 100vh;
padding-bottom: 200rpx;
background-image: url('@/static/images/login-bg.png'); background-image: url('@/static/images/login-bg.png');
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: cover; background-size: cover;
+135 -65
View File
@@ -8,52 +8,79 @@
} }
</route> </route>
<template> <template>
<view class="home-page"> <view class="home-page pb-50">
<NavBar /> <NavBar />
<image <template v-if="userStore.userInfo?.banknum">
class="mx-auto block w-345 h-170 mt-15 rounded-10 overflow-hidden" <view class="main-container w-345 h-185 mx-auto rounded-14 px-20 pt-70 text-12">
src="@/static/images/home/main-bg.png" <Avatar class="absolute right-45 top-100 w-70 h-70" />
mode="aspectFill" <view>姓名{{ userStore.userInfo?.realname }}</view>
/> <view class="mt-10">社会保障号码{{ userStore.userInfo?.banknum.substring(0, 4) }}</view>
<view class="flex bg-#F5F9FF py-15 rounded-10 m-15 border-2 border-white border-solid"> <view class="mt-15">中国工商银行卡号</view>
<view class="flex-1 flex flex-col items-center" @click="handleIntroduction"> <view class="mt-5 text-14 text-#333">
<image class="w-30 h-30" src="@/static/images/home/nav-1.png" mode="aspectFill" /> <!-- 每四位数字插入空格 -->
<text class="mt-8 text-14 text-#333">简介</text> {{ userStore.userInfo?.banknum.replace(/(\d{4})(?=\d)/g, '$1 ') }}
</view>
</view> </view>
<!-- <view class="flex-1 flex flex-col items-center" @click="handleInvite"> </template>
<image class="w-30 h-30" src="@/static/images/home/nav-2.png" mode="aspectFill" /> <template v-else>
<text class="mt-8 text-14 text-#333">抽奖转盘</text> <view class="main-container w-345 h-185 mx-auto rounded-14 px-20 pt-70 text-12">
</view> --> <view>姓名***</view>
<view class="flex-1 flex flex-col items-center" @click="handleReward"> <view class="mt-15">社会保障号码***</view>
<image class="w-30 h-30" src="@/static/images/home/nav-2.png" mode="aspectFill" /> <view class="mt-15">中国工商银行卡号**************</view>
<text class="mt-8 text-14 text-#333">奖励制度</text> </view>
<view
class="mt-15 btn-gradient w-345 h-45 leading-45 mx-auto text-white rounded-full text-center"
@click="handleOpenAccount"
>
开通个人养老账号
</view>
</template>
<view class="flex bg-white py-15 rounded-10 m-15 border-2 border-white border-solid">
<view class="flex-1 flex flex-col items-center" @click="handleInvite">
<image class="w-30 h-30" src="@/static/images/home/nav-1.png" mode="aspectFill" />
<text class="mt-8 text-14 text-#333">社区</text>
</view> </view>
<view class="flex-1 flex flex-col items-center" @click="handleDownload"> <view class="flex-1 flex flex-col items-center" @click="handleDownload">
<image class="w-30 h-30" src="@/static/images/home/nav-2.png" mode="aspectFill" /> <image class="w-30 h-30" src="@/static/images/home/nav-4.png" mode="aspectFill" />
<text class="mt-8 text-14 text-#333">下载APP</text> <text class="mt-8 text-14 text-#333">下载APP</text>
</view> </view>
<view class="flex-1 flex flex-col items-center" @click="handleOfficialCommunity">
<image class="w-30 h-30" src="@/static/images/home/nav-2.png" mode="aspectFill" />
<text class="mt-8 text-14 text-#333">官方群聊</text>
</view>
<view class="flex-1 flex flex-col items-center" @click="handleOfficialCommunity"> <view class="flex-1 flex flex-col items-center" @click="handleOfficialCommunity">
<image class="w-30 h-30" src="@/static/images/home/nav-3.png" mode="aspectFill" /> <image class="w-30 h-30" src="@/static/images/home/nav-3.png" mode="aspectFill" />
<text class="mt-8 text-14 text-#333">官方社群</text> <text class="mt-8 text-14 text-#333">在线客服</text>
</view> </view>
</view> </view>
<view class="bg-white pt-15 px-15 rounded-10 m-15">
<view class="flex bg-white py-8 px-15 rounded-10 m-15 items-center"> <view class="flex justify-between items-center">
<view class="text-14 text-#333">系统公告</view> <view class="text-14 text-#333">最新时讯</view>
<view class="flex-1"> <!-- <view class="text-12 text-#999" @click="handleNews">查看全部</view> -->
<wd-notice-bar
color="#999999"
background-color="transparent"
:text="announcementList.map((item) => item.name)"
/>
</view> </view>
<swiper
indicator-active-color="#3B81F3"
indicator-color="rgba(0,0,0,0.1)"
indicator-dots
autoplay
circular
class="h-240 mt-10"
>
<swiper-item v-for="item in newsList" :key="item.id">
<video class="w-full h-160" :src="item.image" mode="aspectFill" />
</swiper-item>
</swiper>
</view> </view>
<view class="bg-white py-15 px-15 rounded-10 m-15"> <view class="bg-white py-15 px-15 rounded-10 m-15">
<view class="text-14 text-#333">热点新闻</view> <view class="flex justify-between items-center">
<view class="text-14 text-#333">热点新闻</view>
<view class="text-12 text-#999" @click="handleHotNews">查看全部</view>
</view>
<view <view
class="flex mt-15" class="flex mt-15"
v-for="item in newsList" v-for="item in hotNewsList"
:key="item.id" :key="item.id"
@click="handleNewsDetail(item.id)" @click="handleNewsDetail(item.id)"
> >
@@ -64,14 +91,26 @@
</view> </view>
</view> </view>
</view> </view>
<wd-popup v-model="showRealName" custom-style="border-radius:32rpx;"> <wd-popup :lockScroll="false" v-model="showNotice" custom-style="border-radius:0.2rem;">
<view class="p-15 w-345"> <view class="px-30 py-30 w-330 h-457 notice-container rounded-20 flex flex-col">
<text class="custom-txt">实名立即送5000股马尔代夫股权</text> <view class="text-18 font-bold pb-15 text-center">系统公告</view>
<view class="py-15 flex-1 overflow-y-auto">
<view
v-for="(item, index) in announcementList"
:key="item.id"
class="border-b-1 border-b-gray-300 border-b-solid py-15"
>
<view class="whitespace-nowrap text-14 font-bold text-gradient text-center">
公告{{ ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十'][index] }}
</view>
<view class="mt-12 text-14 text-#333 flex-1" v-html="item.content"></view>
</view>
</view>
<view <view
@click="handleRealName" @click="showNotice = false"
class="mt-15 btn-gradient rounded-full text-center text-14 text-white py-15 mt-15" class="btn-gradient rounded-full text-center text-14 text-white py-8 mt-15"
> >
去认证 确定
</view> </view>
</view> </view>
</wd-popup> </wd-popup>
@@ -79,23 +118,26 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import Avatar from '@/components/Avatar.vue'
import NavBar from '@/components/NavBar.vue' import NavBar from '@/components/NavBar.vue'
import { downloadAppAPI, getIntroductionAPI, getRealNameAuthAPI } from '@/service' import {
downloadAppAPI,
getIntroductionAPI,
getOpenPersonalAccountAPI,
getRealNameAuthAPI,
} from '@/service'
import { useUserStore } from '@/store'
import { showModal } from '@/utils' import { showModal } from '@/utils'
defineOptions({ defineOptions({
name: 'Home', name: 'Home',
}) })
const { list: newsList } = useListPageRequest((params) => // 热门咨询
const { list: hotNewsList } = useListPageRequest((params) =>
getIntroductionAPI({ type: 1, ...params }), getIntroductionAPI({ type: 1, ...params }),
) )
// 系统公告
const { list: announcementList } = useListPageRequest((params) =>
getIntroductionAPI({ type: 2, ...params }),
)
const handleIntroduction = () => { const handleIntroduction = () => {
uni.navigateTo({ uni.navigateTo({
url: '/pages-sub/introduction/index', url: '/pages-sub/introduction/index',
@@ -109,7 +151,7 @@ const handleNewsDetail = (id: number) => {
} }
const handleInvite = () => { const handleInvite = () => {
uni.navigateTo({ uni.switchTab({
url: '/pages/invite/index', url: '/pages/invite/index',
}) })
} }
@@ -124,38 +166,66 @@ const handleDownload = () => {
downloadAppAPI() downloadAppAPI()
} }
const handleReward = () => { const showNotice = ref(false)
showModal(
`1.注册立即送5000股马尔代夫股权;\n
2.每股马尔代夫股权价值500元;\n
3.每邀请一人可以获得20股马尔代夫股权`,
{
title: '奖励制度',
confirmText: '我知道了',
},
)
}
const showRealName = ref(false) const handleNews = () => {
const handleRealName = () => {
uni.navigateTo({ uni.navigateTo({
url: '/pages-sub/realname/index', url: '/pages-sub/news/index',
}) })
} }
onLoad(async () => { const handleHotNews = () => {
const res = await getRealNameAuthAPI() uni.navigateTo({
if (!res.data) { url: '/pages-sub/hot-news/index',
showRealName.value = true })
}
// 系统公告
const { list: announcementList } = useListPageRequest((params) =>
getIntroductionAPI({ type: 2, ...params }),
)
// 最新时讯
const { list: newsList } = useListPageRequest((params) =>
getIntroductionAPI({ type: 3, ...params }),
)
watch(
() => announcementList.value.length,
(newVal) => {
if (newVal > 0) {
showNotice.value = true
}
},
)
onShow(() => {
if (announcementList.value.length) {
showNotice.value = true
} }
}) })
const userStore = useUserStore()
const handleOpenAccount = async () => {
await getOpenPersonalAccountAPI()
await showModal('开通个人养老账户成功')
userStore.loadUserInfo()
// showModal('开通个人养老账户时,需邀请一名用户')
}
</script> </script>
<style> <style scoped>
.home-page { .home-page {
min-height: 100vh; min-height: 100vh;
padding-bottom: 100rpx; background-image: url('@/static/images/home/bg.jpg');
background-image: url('@/static/images/bg.png'); background-position: top;
background-size: cover;
}
.main-container {
background-image: url('@/static/images/home/main-bg.jpg');
background-position: top;
background-size: cover;
}
.notice-container {
background-image: url('@/static/images/home/notice-bg.jpg');
background-position: top; background-position: top;
background-size: cover; background-size: cover;
} }
+183 -83
View File
@@ -3,55 +3,139 @@
{ {
style: { style: {
navigationStyle: 'custom', navigationStyle: 'custom',
navigationBarTitleText: '投资理财', navigationBarTitleText: '保障',
}, },
} }
</route> </route>
<template> <template>
<view class="invest-page"> <view class="invest-page">
<NavBar> <NavBar />
<template #right> <view class="py-20 flex flex-col mx-15 rounded-20 main-content text-white">
<view @click="onGoInvestDetail" class="text-14 text-#486CCF">投资明细</view> <view class="text-14 pl-15">保险概览</view>
</template> <view class="flex mt-30">
</NavBar> <view class="flex-1 text-center">
<view class="flex mt-30 flex-col mx-15 rounded-10 px-40 py-32 main-content"> <view class="text-14">全部</view>
<view class="text-14 text-#6784C7">我的投资金</view> <view class="text-16 font-bold mt-15">
<view class="text-35 leading-35 mt-10 text-#BE7143 font-bold"> {{ userStore.userInfo?.yanglao + userStore.userInfo?.yiliao }}
{{ userStore.userInfo?.money }} </view>
</view>
<view class="flex-1 text-center">
<view class="text-14">养老</view>
<view class="text-16 font-bold mt-15">{{ userStore.userInfo?.yanglao }}</view>
</view>
<view class="flex-1 text-center">
<view class="text-14">医疗</view>
<view class="text-16 font-bold mt-15">{{ userStore.userInfo?.yiliao }}</view>
</view>
</view> </view>
</view> </view>
<view class="mt-100"> <view class="flex p-15 mt-15">
<view <view
v-for="item in investmentList" v-for="item in tabList"
:key="item.id" :key="item.value"
class="invest-item relative flex flex-col items-center pt-15" class="px-24 mr-15 bg-#DEEBFF text-#3B81F3 py-4 rounded-full text-14"
:class="{ 'btn-gradient text-white': item.value === tabValue }"
@click="tabValue = item.value"
> >
<view class="text-15 text-#3F88F6">{{ item.name }}</view> {{ item.title }}
<view class="flex w-full mt-15">
<view class="flex-1 text-center">
<view class="text-22 text-#333 font-bold">{{ item.money }}</view>
<view class="text-12 mt-4 text-blue-red">投资金额</view>
</view>
<view class="flex-1 text-center">
<view class="text-22 text-#FF3B30 font-bold">{{ item.dividend }}</view>
<view class="text-12 mt-4 text-blue-red">每日分红</view>
</view>
</view>
<view
class="text-center px-50 absolute bottom-0 left-0 text-12 text-#fff rounded-full py-8 bg-blue-red"
@click="onInvest(item)"
>
立即投资
</view>
<view
class="text-center px-16 absolute bottom-13 right-33 text-12 text-#fff rounded-br-10 rounded-tl-10 py-4 bg-blue-red"
>
{{ item.label }}
</view>
</view> </view>
</view> </view>
<wd-action-sheet v-model="showPayType" :panels="panels" @select="onSelectPayType" />
<view>
<template v-if="tabValue === 1">
<view
v-for="item in investmentList"
:key="item.id"
class="p-15 bg-white rounded-20 mx-auto w-345 relative mb-15"
>
<view class="flex">
<image
class="rounded-10 w-100 h-100"
mode="aspectFill"
:src="getImageUrl(item.leftimage)"
/>
<view class="flex-1 ml-15">
<view class="text-15 text-#333 font-bold">{{ item.name }}</view>
<view class="w-200 flex flex-wrap items-center mt-5">
<view
class="px-14 mr-5 mb-5 py-2 whitespace-nowrap text-12 text-#D6A165 rounded-2 bg-#FFEBD4"
v-for="(tag, index) in item.labeltag.split(',')"
:key="tag"
:class="{
'!text-#3B81F3 !bg-#D4E8FF': index % 2 === 1,
}"
>
{{ tag }}
</view>
</view>
<view class="text-12 mt-15 text-#999" v-html="item.content"></view>
</view>
</view>
<view class="flex items-center mt-15">
<view class="flex-1 text-center">
<view class="text-15 text-#FF3B30">{{ item.dividend }}(%)</view>
<view class="text-14 text-#999">日收益</view>
</view>
<view class="text-#D9D9D9">|</view>
<view class="flex-1 text-center">
<view class="text-15 text-#FF3B30">{{ item.days }}()</view>
<view class="text-14 text-#999">周期</view>
</view>
</view>
<view
class="mt-15 px-30 text-center text-15 text-white rounded-full py-8 btn-gradient"
@click="onInvest(item)"
>
购买{{ item.money }}
</view>
</view>
</template>
<template v-else>
<view
v-for="item in investmentList"
:key="item.id"
class="p-15 bg-white rounded-20 mx-auto w-345 relative mb-15"
>
<view class="flex">
<image
class="rounded-10 w-100 h-100"
mode="aspectFill"
:src="getImageUrl(item.leftimage)"
/>
<view class="flex-1 ml-15">
<view class="text-15 text-#333 font-bold">{{ item.name }}</view>
<view class="text-12 mt-15 text-#999" v-html="item.content" />
</view>
</view>
<view
class="text-center text-15 text-white rounded-full py-8 border-#3B81F3 border-1 border-solid mt-15"
>
<text class="text-gradient" @click="onShowRights(item)">查看权益</text>
</view>
<view
class="text-center text-15 text-white rounded-full py-8 btn-gradient mt-15"
@click="onInvest(item)"
>
我要投保{{ item.money }}
</view>
</view>
</template>
</view>
<wd-popup
v-model="showRightConfig.show"
:title="`${showRightConfig.data?.name}权益`"
custom-style="border-radius: 0.2rem"
>
<view>
<image
class="w-345 h-345"
:src="getImageUrl(showRightConfig.data?.rightimage)"
mode="widthFix"
/>
</view>
</wd-popup>
</view> </view>
</template> </template>
@@ -62,28 +146,37 @@ import WechatIcon from '@/static/images/invest/wechat-icon.png'
import UnionpayIcon from '@/static/images/invest/unionpay-icon.png' import UnionpayIcon from '@/static/images/invest/unionpay-icon.png'
import { getInvestmentListAPI, submitInvestAPI } from '@/service' import { getInvestmentListAPI, submitInvestAPI } from '@/service'
import { useUserStore } from '@/store' import { useUserStore } from '@/store'
import { mergeStep, showModal } from '@/utils' import { getImageUrl, mergeStep, showModal } from '@/utils'
defineOptions({ defineOptions({
name: 'Home', name: 'Home',
}) })
const showPayType = ref(false)
const panels = ref([
{
iconUrl: WechatIcon,
title: '微信支付',
},
{
iconUrl: AlipayIcon,
title: '支付宝支付',
},
{
iconUrl: UnionpayIcon,
title: '银联支付',
},
])
const { list: investmentList } = useListPageRequest(getInvestmentListAPI) const tabList = [
{
value: 1,
title: '养老',
},
{
value: 2,
title: '医疗',
},
]
const tabValue = ref(1)
const { list: investmentList, onReload } = useListPageRequest((params) =>
getInvestmentListAPI({
...params,
type: tabValue.value,
}),
)
watch(
() => tabValue.value,
() => {
onReload()
},
)
const userStore = useUserStore() const userStore = useUserStore()
@@ -93,50 +186,57 @@ const onGoInvestDetail = () => {
}) })
} }
const onSelectPayType = ({ item, index }: any) => { const showRightConfig = ref({
console.log(item, index) show: false,
alert(item.title) data: null,
})
watch(
() => showRightConfig.value.show,
(val) => {
if (!val) {
showRightConfig.value.data = null
}
},
)
const onShowRights = (item: any) => {
showRightConfig.value = {
show: true,
data: item,
}
} }
const onInvest = mergeStep(async (item: any) => { const onInvest = mergeStep(async (item: any) => {
await showModal('确认投资?') try {
await submitInvestAPI({ await submitInvestAPI({
investid: item.id, investid: item.id,
type: 3, type: 3,
}) })
} catch (error) {
if (error?.data?.msg.includes('邀请')) {
return uni.switchTab({
url: '/pages/invite/index',
})
}
return
}
await userStore.loadUserInfo() await userStore.loadUserInfo()
uni.showToast({ uni.showToast({
title: '投资成功', title: tabValue.value === 2 ? '投保成功' : '投资成功',
icon: 'none', icon: 'none',
}) })
}) })
</script> </script>
<style> <style scoped>
.invest-page { .invest-page {
min-height: 100vh; min-height: 100vh;
padding-bottom: 100px; padding-bottom: 100px;
background-color: #ebbf92; background-image: url('@/static/images/home/bg.jpg');
background-image: url('@/static/images/invest/bg.png'); background-position: top;
background-repeat: no-repeat; background-size: cover;
background-attachment: fixed;
background-position: top -80rpx center;
background-size: 100%;
}
.invest-item {
width: 690rpx;
height: 352rpx;
margin: 0 auto 30rpx;
background-image: url('@/static/images/invest/item-bg.png');
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
} }
.main-content { .main-content {
background-image: url('@/static/images/invest/main-bg.png'); background: linear-gradient(90deg, #71a4f8 0%, #3b81f3 103.83%);
background-repeat: no-repeat;
background-position: center;
background-size: 100% 100%;
} }
.bg-blue-red { .bg-blue-red {
background-image: linear-gradient(90.02deg, #8bb9ff 0.02%, #be4343 100.27%); background-image: linear-gradient(90.02deg, #8bb9ff 0.02%, #be4343 100.27%);
+169 -28
View File
@@ -1,7 +1,7 @@
<route lang="json5"> <route lang="json5">
{ {
style: { style: {
navigationBarTitleText: '邀请好友', navigationBarTitleText: '社区',
navigationBarBackgroundColor: '#fff', navigationBarBackgroundColor: '#fff',
navigationStyle: 'custom', navigationStyle: 'custom',
}, },
@@ -12,6 +12,13 @@
import NavBar from '@/components/NavBar.vue' import NavBar from '@/components/NavBar.vue'
import VueQrcode from '@chenfengyuan/vue-qrcode' import VueQrcode from '@chenfengyuan/vue-qrcode'
import { useUserStore } from '@/store' import { useUserStore } from '@/store'
import Avatar from '@/components/Avatar.vue'
import {
getCommunityInviteFirstAPI,
getCommunityInviteRewardAPI,
getCommunityMyInviteAPI,
} from '@/service'
import { showModal } from '@/utils'
const userStore = useUserStore() const userStore = useUserStore()
@@ -23,45 +30,178 @@ const onCopy = (code: string) => {
data: code, data: code,
}) })
} }
const onLottery = () => { const inviteData = ref({
uni.navigateTo({ num: 0,
url: '/pages-sub/lottery/index', performance: 0,
})
const { list } = useListPageRequest((params) => {
return getCommunityMyInviteAPI(params).then((res) => {
inviteData.value.num = res.data.num
inviteData.value.performance = res.data.performance
res.data.data = res.data.list
return res.data
}) })
})
const inviteInfo = ref<any>(null)
const loadInviteInfo = async () => {
const { data } = await getCommunityInviteFirstAPI()
inviteInfo.value = data
// inviteInfo.value = {
// num: 10,
// isuserauth: 1,
// realrewards: '200',
// jianglitiaojian: {
// '10': '3000',
// '20': '5000',
// '30': '15000',
// '40': '30000',
// '50': '50000',
// },
// open: 1,
// }
}
onShow(async () => {
await loadInviteInfo()
})
const taskList = computed(() => {
if (!inviteInfo.value) return []
// const inviteTask = Object.keys(inviteInfo.value.jianglitiaojian)
// const inviteTaskList = inviteTask.map((key) => ({
// title: `邀请${key}人(${inviteInfo.value.num}/${key})`,
// desc: `每月额外领取${inviteInfo.value.jianglitiaojian[key]}元社保金`,
// level: key,
// status: Number(inviteInfo.value.num) >= Number(key),
// open: false,
// }))
// // 查找最后一个完成的任务,并设置open为true
// const lastCompletedTask = inviteTaskList.findLast((item) => item.status)
// if (lastCompletedTask) {
// lastCompletedTask.open = inviteInfo.value.open
// }
return [
{
title: '注册实名',
desc: `领取${inviteInfo.value.realrewards}元社保金`,
// status: inviteInfo.value.isuserauth,
status: false,
open: false,
},
// {
// title: '签到有礼',
// desc: `每日签到送${inviteInfo.value.qiandaojiang}元社保金`,
// status: false,
// open: false,
// },
{
title: '邀请有礼',
desc: `每邀请1人并实名认证获得${inviteInfo.value.yaoqingjiang}元养老金`,
status: 0,
open: false,
},
// ...inviteTaskList,
]
})
async function onGetReward(level) {
await getCommunityInviteRewardAPI({ level })
showModal('领取成功')
await loadInviteInfo()
} }
</script> </script>
<template> <template>
<view class="pb-100 min-h-screen invite-page"> <view class="pb-100 min-h-screen invite-page">
<NavBar /> <NavBar />
<view class="flex justify-center mt-80"> <view class="flex items-center mt-228 mx-auto w-345 bg-#FFFFFFE5 p-15 rounded-20">
<view class="text-white btn-gradient rounded-full px-30 py-10 text-14">邀请好友</view> <view class="text-center">
<!-- <view class="ml-15 bg-white rounded-full px-30 py-10 text-14" @click="onLottery"> <view class="mt-15 rounded-10 overflow-hidden flex bg-#FFFFFF50 p-10 shadow">
<text class="text-gradient">幸运大转盘</text> <VueQrcode
</view> --> class="!w-100 !h-100 rounded-10"
</view> :value="qrcodeValue"
<view class="flex flex-col items-center mt-180"> :options="{ size: 200 }"
<view />
class="flex items-center text-16 text-#333 bg-[rgba(255,255,255,0.8)] rounded-full px-15 py-4 text-12 mt-8" </view>
> <view class="text-10 text-#333 mt-4">分享二维码给好友</view>
<view> </view>
邀请码 <view class="text-center p-15">
<text class="font-bold">{{ userStore.userInfo?.invitecode }}</text> <view class="text-14 text-#333">邀请码{{ userStore.userInfo?.invitecode }}</view>
<view
class="mt-8 btn-gradient text-white rounded-full px-15 w-160 py-8 text-14 text-center"
@click="onCopy(userStore.userInfo?.invitecode)"
>
复制邀请码
</view> </view>
<view <view
class="btn-gradient text-white rounded-full px-15 py-4 text-12 ml-10" class="mt-8 btn-gradient text-white rounded-full px-15 w-160 py-8 text-14 text-center"
@click="onCopy('99999')" @click="onCopy(qrcodeValue)"
> >
复制 复制推广链接
</view> </view>
</view> </view>
<view class="mt-15 rounded-10 overflow-hidden flex"> </view>
<VueQrcode :value="qrcodeValue" :options="{ size: 200 }" /> <view class="mt-70 w-345 mx-auto">
</view>
<view <view
class="btn-gradient text-white rounded-full text-14 px-30 py-8 mt-30" class="bg-#F3F8FF rounded-10 border-#3B81F3 border-2 border-solid p-15 flex items-start"
@click="onCopy(qrcodeValue)" v-for="item of taskList"
:key="item.title"
> >
复制邀请链接 <view class="flex-1">
<view class="text-15 text-#333 font-500">{{ item.title }}</view>
<view class="text-12 text-#333 mt-8">{{ item.desc }}</view>
</view>
<view>
<view
class="w-fit ml-auto mr-0 bg-#C4F7C4 rounded-4 px-10 py-4 leading-12 text-#62C162 text-12 mb-8"
v-if="item.status"
>
已完成
</view>
<view
class="w-fit ml-auto mr-0 bg-#F3CB3B33 rounded-4 px-10 py-4 leading-12 text-#FFA600 text-12"
v-if="item.open"
@click="onGetReward(item.level)"
>
领取社保金
</view>
</view>
</view>
</view>
<view class="bg-#FFFFFFE5 rounded-20 mt-30 w-345 mx-auto p-15 flex">
<view class="flex-1 text-center">
<view class="text-18 text-#333">团队人数</view>
<view class="text-gradient text-18 mt-8">{{ inviteData.num }}</view>
<view class="font-500 text-14 mt-4">直推人数</view>
</view>
<view class="flex-1 text-center">
<!-- <view class="text-18 text-#333">我的佣金</view> -->
<view class="text-18 text-#333 h-25"></view>
<view class="text-gradient text-18 mt-8">{{ inviteData.performance }}</view>
<view class="font-500 text-14 mt-4">直推业绩</view>
</view>
</view>
<view class="mt-15 w-345 mx-auto">
<view class="ml-15 text-18 text-white">团队成员{{ inviteData.num }}/</view>
<view class="mt-15 bg-white px-15 pt-15 pb-4 rounded-10" v-for="item of list" :key="item.id">
<view class="flex items-center">
<Avatar :src="item.avatar" class="w-50 h-50" mode="aspectFill" />
<view class="ml-15 flex-1">
<view class="text-15 text-#333">{{ item.nickname }}</view>
<view class="text-12 text-#333 mt-10">{{ item.jointime }}</view>
</view>
</view>
<view class="flex mt-16 py-8">
<view class="flex-1 text-center">
<view class="text-gradient">{{ item.yiliao }}</view>
<view class="text-15 text-#333">医疗</view>
</view>
<view class="flex-1 text-center">
<view class="text-gradient">{{ item.yanglao }}</view>
<view class="text-15 text-#333">养老</view>
</view>
</view>
</view> </view>
</view> </view>
</view> </view>
@@ -69,9 +209,10 @@ const onLottery = () => {
<style lang="scss" scoped> <style lang="scss" scoped>
.invite-page { .invite-page {
background-image: url('@/static/images/page-sub/invite-bg.png'); background-color: #000139;
background-image: url('@/static/images/page-sub/invite-bg.jpg');
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: top; background-position: top -40px center;
background-size: 100%; background-size: 100%;
} }
</style> </style>
+55 -21
View File
@@ -4,35 +4,55 @@
navigationBarTitleText: '登录', navigationBarTitleText: '登录',
navigationStyle: 'custom', navigationStyle: 'custom',
}, },
notNeedLogin: false, notNeedLogin: true,
} }
</route> </route>
<template> <template>
<view class="login-container relative"> <view class="login-container relative pt-44">
<NavBar /> <!-- <NavBar title-color="#333" /> -->
<view class="mt-44 text-28 pl-32 text-gradient" style="-webkit-background-clip: text"> <!-- <view class="text-28 pl-32 text-gradient" style="-webkit-background-clip: text">登录</view> -->
登录 <image
</view> class="w-100 mx-auto block h-100"
src="@/static/images/login/logo.png"
mode="aspectFit"
/>
<view class="pt-45"> <view class="pt-45">
<view class="mx-15 px-15 shadow-[0_0_10px_rgba(10,68,245,0.1)] rounded-10"> <view class="mx-15 px-15 shadow-[0_0_10px_rgba(10,68,245,0.1)] rounded-10">
<view class="flex items-center py-15"> <view class="flex items-center py-15">
<image class="w-24 h-24" src="@/static/images/login/phone.png" mode="aspectFit" /> <view class="text-gradient">手机号</view>
<input <input
type="text" type="text"
v-model="formData.account" v-model="formData.account"
placeholder-class="text-#889BC6" placeholder-class="text-#889BC6"
class="text-right flex-1 text-14" class="text-right flex-1 text-14"
placeholder="请输入用户名" placeholder="请输入手机号"
/> />
</view> </view>
<view class="flex items-center py-15"> <view class="flex items-center py-15">
<image class="w-24 h-24" src="@/static/images/login/password.png" mode="aspectFit" /> <view class="text-gradient">密码</view>
<input <input
placeholder-class="text-#889BC6" placeholder-class="text-#889BC6"
type="password" type="password"
v-model="formData.password" v-model="formData.password"
class="text-right flex-1 text-14" class="text-right flex-1 text-14"
placeholder="请输入登录密码" placeholder="请输入密码"
/>
</view>
<view class="flex items-center py-15">
<view class="text-gradient">验证码</view>
<input
v-model="formData.captcha"
placeholder-class="text-#889BC6"
type="text"
class="text-right flex-1 text-14"
placeholder="请输入验证码"
/>
<img
:src="codeUrl"
class="w-100 h-30 ml-15 bg-gray-400"
mode="widthFix"
@click="refreshCode"
/> />
</view> </view>
</view> </view>
@@ -64,12 +84,16 @@ const userStore = useUserStore()
const formData = ref({ const formData = ref({
account: '', account: '',
password: '', password: '',
captcha: '',
}) })
const { codeUrl, t: captchaT, refreshCode } = useCaptcha()
let redirect = '/' let redirect = '/'
onLoad((options) => { onLoad((options) => {
redirect = options.redirect ?? '/' redirect = options.redirect ?? '/'
}) })
onShow(refreshCode)
const handleLogin = async () => { const handleLogin = async () => {
if (!formData.value.account || !formData.value.password) { if (!formData.value.account || !formData.value.password) {
@@ -78,15 +102,25 @@ const handleLogin = async () => {
icon: 'none', icon: 'none',
}) })
} }
const { if (!formData.value.captcha) {
data: { return uni.showToast({
userinfo: { token }, title: '请输入验证码',
}, icon: 'none',
} = await loginUserAPI(formData.value) })
userStore.setToken(token) }
uni.reLaunch({ try {
url: redirect, const {
}) data: {
userinfo: { token },
},
} = await loginUserAPI({ ...formData.value, t: captchaT.value })
userStore.setToken(token)
uni.reLaunch({
url: redirect,
})
} catch (error) {
refreshCode()
}
} }
const handleRegister = () => { const handleRegister = () => {
@@ -110,11 +144,11 @@ onLoad(() => {
}) })
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.login-container { .login-container {
box-sizing: border-box; box-sizing: border-box;
min-height: 100vh; min-height: 100vh;
padding-bottom: 200rpx; padding-bottom: 50px;
background-image: url('@/static/images/login-bg.png'); background-image: url('@/static/images/login-bg.png');
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: cover; background-size: cover;
+159 -89
View File
@@ -10,97 +10,87 @@
<template> <template>
<view class="my-page"> <view class="my-page">
<NavBar /> <NavBar />
<view class="flex flex-col items-center justify-center mt-30"> <view class="flex mt-50 text-white px-15 items-center">
<Avatar class="w-80 h-80 mx-auto" :src="getImageUrl(userStore.userInfo.avatar)" /> <!-- <Avatar class="w-60 h-60" :src="getImageUrl(userStore.userInfo?.avatar)" /> -->
<view class="text-16 mt-10">{{ userStore.userInfo.nickname }}</view> <Avatar class="w-60 h-60" />
<view class="text-12 mt-8">账号{{ userStore.userInfo.username }}</view> <view class="ml-15 flex-1">
</view> <view class="text-16">
<view class="flex justify-center text-center mt-15 items-center px-30"> {{ userStore.userInfo?.realname ?? userStore.userInfo?.nickname }}
<view class="flex-1"> </view>
<view class="text-30 font-bold">{{ Number(userStore.userInfo.money) }}</view> <view class="text-12 mt-8">账号{{ userStore.userInfo?.username }}</view>
<view class="text-14 mt-10 text-#3B81F3">我的余额</view>
</view> </view>
<view class="w-50 h-50 relative"> <view
<image class="flex border-#50D0FF border-1 border-solid items-center justify-center h-32 w-100 btn-gradient rounded-full text-center text-14 text-white"
class="w-100 h-100 absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2" @click="handleSignIn"
src="@/static/images/my/translate.png" >
mode="aspectFit" <image class="w-30 h-26 mt-5" src="@/static/images/my/sign-icon.png" mode="widthFix" />
/> <view class="ml-5">签到</view>
</view>
<view class="flex-1">
<view class="text-30 font-bold">{{ Number(userStore.userInfo.score) }}</view>
<view class="text-14 mt-10 text-#3B81F3">我的股数</view>
</view> </view>
</view> </view>
<view class="flex px-15 mt-15"> <view class="grid grid-cols-2 gap-10 px-15 mt-15">
<view <view class="px-15 py-10 rounded-10 bg-#FFFFFF33" @click="handleAsset(0)">
class="flex py-30 justify-center items-center rounded-tl-10 rounded-br-10 flex-1 bg-[linear-gradient(180deg,#D9EBFF,#9EDAFF)] border-1 border-#5FAEFF80 border-solid" <view class="flex text-white text-12">我的余额</view>
@click="handleWithdrawal" <view class="text-20 text-gradient font-bold">{{ userStore.userInfo?.money }}</view>
> <view
<image class="w-40 h-40" src="@/static/images/my/withdrawal.png" mode="aspectFit" /> class="btn-gradient w-fit rounded-full text-center text-12 text-white py-2 px-15 mt-8"
<view class="text-white text-14 px-15 py-5 ml-15 rounded-full btn-gradient">提现</view> @click.stop="handleWithdrawal"
>
提现
</view>
</view> </view>
<view <view class="px-15 py-10 rounded-10 bg-#FFFFFF33" @click="handleAsset(2)">
class="ml-10 flex py-30 justify-center items-center rounded-tl-10 rounded-br-10 flex-1 bg-[linear-gradient(180deg,#D9EBFF,#9EDAFF)] border-1 border-#5FAEFF80 border-solid" <view class="flex text-white text-12">养老金余额</view>
@click="handleConvert" <view class="text-20 text-gradient font-bold">{{ userStore.userInfo?.moneyold }}</view>
> <view
<image class="w-40 h-40" src="@/static/images/my/top-up.png" mode="aspectFit" /> class="btn-gradient w-fit rounded-full text-center text-12 text-white py-2 px-15 mt-8"
<view class="text-white text-14 px-15 py-5 ml-15 rounded-full btn-gradient">转换</view> @click.stop="handleConvert(0)"
>
转至我的余额
</view>
</view>
<view class="px-15 py-10 rounded-10 bg-#FFFFFF33" @click="handleAsset(1)">
<view class="flex text-white text-12">社保金余额</view>
<view class="text-20 text-gradient font-bold">{{ userStore.userInfo?.moneyjiu }}</view>
</view>
<view class="px-15 py-10 rounded-10 bg-#FFFFFF33" @click="handleAsset(3)">
<view class="flex text-white text-12">团队佣金</view>
<view class="text-20 text-gradient font-bold">{{ userStore.userInfo?.moneyyong }}</view>
<view
class="btn-gradient w-fit rounded-full text-center text-12 text-white py-2 px-15 mt-8"
@click.stop="handleConvert(1)"
>
转至养老金
</view>
</view> </view>
</view> </view>
<image <view class="mt-15 rounded-30 bg-white p-15">
class="w-330 h-123 mx-auto mt-15 block" <image
src="@/static/images/my/recommend.png" class="w-345 h-146 mx-auto block"
mode="aspectFill" src="@/static/images/my/recommend.jpg"
@click="handleInvite" mode="widthFix"
/> @click="handleInvite"
/>
<view class="mt-15 grid grid-cols-2 gap-10 p-15"> <view class="mt-15 grid grid-cols-2 gap-10">
<view <view
@click="handleTeam" @click="item.handle"
class="flex items-center justify-center rounded-tl-10 rounded-br-10 bg-[linear-gradient(45deg,#EFF7FF,#D1E8FF)] p-15 border border-#BEDCFF border-solid" class="flex items-center justify-center rounded-tl-10 rounded-br-10 bg-[linear-gradient(45deg,#EFF7FF,#D1E8FF)] p-15 border border-#BEDCFF border-solid"
> v-for="item in commonList"
<image class="w-24 h-24" src="@/static/images/my/team.png" mode="aspectFit" /> :key="item.title"
<view class="text-14 text-#333 ml-10">我的邀请</view> >
</view> <image class="w-24 h-24" :src="item.icon" mode="aspectFit" />
<view <view class="text-14 text-#333 ml-10">{{ item.title }}</view>
@click="handleAsset" </view>
class="flex items-center justify-center rounded-tl-10 rounded-br-10 bg-[linear-gradient(45deg,#EFF7FF,#D1E8FF)] p-15 border border-#BEDCFF border-solid"
>
<image class="w-24 h-24" src="@/static/images/my/house.png" mode="aspectFit" />
<view class="text-14 text-#333 ml-10">我的资产</view>
</view> </view>
<view <view
@click="handleRealName" class="mt-50 mx-auto w-294 btn-gradient rounded-full text-center text-14 text-white py-15 mt-15"
class="flex items-center justify-center rounded-tl-10 rounded-br-10 bg-[linear-gradient(45deg,#EFF7FF,#D1E8FF)] p-15 border border-#BEDCFF border-solid" @click="handleLogout"
> >
<image class="w-24 h-24" src="@/static/images/my/realname.png" mode="aspectFit" /> 退出登录
<view class="text-14 text-#333 ml-10">实名认证</view>
</view> </view>
<view
@click="handleBankCard"
class="flex items-center justify-center rounded-tl-10 rounded-br-10 bg-[linear-gradient(45deg,#EFF7FF,#D1E8FF)] p-15 border border-#BEDCFF border-solid"
>
<image class="w-24 h-24" src="@/static/images/my/card.png" mode="aspectFit" />
<view class="text-14 text-#333 ml-10">我的银行卡</view>
</view>
<view
@click="downloadAppAPI"
class="flex items-center justify-center rounded-tl-10 rounded-br-10 bg-[linear-gradient(45deg,#EFF7FF,#D1E8FF)] p-15 border border-#BEDCFF border-solid"
>
<image class="w-24 h-24" src="@/static/images/my/download.png" mode="aspectFit" />
<view class="text-14 text-#333 ml-10">下载APP</view>
</view>
</view>
<view
class="mt-50 mx-auto w-294 btn-gradient rounded-full text-center text-14 text-white py-15 mt-15"
@click="handleLogout"
>
退出登录
</view> </view>
</view> </view>
</template> </template>
@@ -109,9 +99,19 @@
import Avatar from '@/components/Avatar.vue' import Avatar from '@/components/Avatar.vue'
import NavBar from '@/components/NavBar.vue' import NavBar from '@/components/NavBar.vue'
import { loginRoute } from '@/interceptors/route' import { loginRoute } from '@/interceptors/route'
import { downloadAppAPI } from '@/service' import { downloadAppAPI, getCommunityInviteFirstAPI, getSignInAPI } from '@/service'
import { useUserStore } from '@/store/user' import { useUserStore } from '@/store/user'
import { getImageUrl } from '@/utils' import { getImageUrl, showModal } from '@/utils'
import CommonIcon1 from '@/static/images/my/common-icon-1.png'
import CommonIcon2 from '@/static/images/my/common-icon-2.png'
import CommonIcon3 from '@/static/images/my/common-icon-3.png'
import CommonIcon4 from '@/static/images/my/common-icon-4.png'
import CommonIcon5 from '@/static/images/my/common-icon-5.png'
import CommonIcon6 from '@/static/images/my/common-icon-6.png'
import CommonIcon7 from '@/static/images/my/common-icon-7.png'
import CommonIcon8 from '@/static/images/my/common-icon-8.png'
import CommonIcon9 from '@/static/images/my/common-icon-9.png'
const userStore = useUserStore() const userStore = useUserStore()
@@ -128,9 +128,10 @@ const handleWithdrawalDetail = () => {
} }
const handleWithdrawal = () => { const handleWithdrawal = () => {
uni.navigateTo({ return showModal('暂未开放')
url: '/pages-sub/withdrawal/index', // uni.navigateTo({
}) // url: '/pages-sub/withdrawal/index',
// })
} }
const handleTeam = () => { const handleTeam = () => {
@@ -145,9 +146,15 @@ const handleRealName = () => {
}) })
} }
const handleAsset = () => { const handleAsset = (index = 0) => {
uni.navigateTo({ uni.navigateTo({
url: '/pages-sub/asset/index', url: `/pages-sub/asset/index?tabIndex=${index}`,
})
}
const handleAssetDetail = () => {
uni.navigateTo({
url: '/pages-sub/asset-detail/index',
}) })
} }
@@ -163,19 +170,82 @@ const handleInvite = () => {
}) })
} }
const handleConvert = () => { const handleConvert = (type) => {
if (type === 0) {
return showModal('提前申请领取养老金')
}
uni.navigateTo({ uni.navigateTo({
url: '/pages-sub/convert/index', url: `/pages-sub/convert/index?type=${type}`,
}) })
} }
const handleSignIn = async () => {
await getSignInAPI()
const { data } = await getCommunityInviteFirstAPI()
if (data.qiandaojiang) {
showModal('签到成功,获得' + data.qiandaojiang + '元社保金')
} else {
showModal('签到成功')
}
userStore.loadUserInfo()
}
const handleKefu = () => {
uni.navigateTo({
url: '/pages-sub/official-community/index',
})
}
const handleInvestDetail = () => {
uni.navigateTo({
url: '/pages-sub/invest-detail/index',
})
}
const commonList = [
{
title: '投保记录',
icon: CommonIcon5,
handle: handleInvestDetail,
},
{
title: '资金明细',
icon: CommonIcon6,
handle: handleAssetDetail,
},
{
title: '申请理赔',
icon: CommonIcon7,
handle: handleKefu,
},
{
title: '我的社区',
icon: CommonIcon4,
handle: handleInvite,
},
{
title: '在线客服',
icon: CommonIcon9,
handle: handleKefu,
},
{
title: 'APP下载',
icon: CommonIcon3,
handle: downloadAppAPI,
},
{
title: '官方群聊',
icon: CommonIcon1,
handle: handleKefu,
},
]
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.my-page { .my-page {
min-height: 100vh; min-height: 100vh;
padding-bottom: 100rpx; background-image: url('@/static/images/my/my-bg.jpg');
background-image: url('@/static/images/bg.png'); background-position: top -40px center;
background-position: top;
background-size: cover; background-size: cover;
} }
</style> </style>
+26 -43
View File
@@ -4,7 +4,7 @@
navigationBarTitleText: '注册', navigationBarTitleText: '注册',
navigationStyle: 'custom', navigationStyle: 'custom',
}, },
notNeedLogin: false, notNeedLogin: true,
} }
</route> </route>
@@ -22,8 +22,8 @@ const form = ref({
password: '', password: '',
retpassword: '', retpassword: '',
invitecode: '', invitecode: '',
tpassword: '', // tpassword: '',
rettpassword: '', // rettpassword: '',
}) })
let redirect = '/' let redirect = '/'
@@ -54,27 +54,14 @@ const handleRegister = mergeStep(async () => {
}) })
return return
} }
if (!form.value.tpassword) {
if (!form.value.invitecode) {
uni.showToast({ uni.showToast({
title: '请输入支付密码', title: '请输入邀请码',
icon: 'none', icon: 'none',
}) })
return return
} }
if (form.value.tpassword !== form.value.rettpassword) {
uni.showToast({
title: '两次输入的支付密码不一致',
icon: 'none',
})
return
}
// if (!form.value.invitecode) {
// uni.showToast({
// title: '请输入邀请码',
// icon: 'none',
// })
// return
// }
const { const {
data: { data: {
userinfo: { token }, userinfo: { token },
@@ -98,10 +85,15 @@ onLoad(async (options) => {
<template> <template>
<view class="login-container relative"> <view class="login-container relative">
<NavBar /> <NavBar />
<image
class="mt-30 w-86 rounded-full mx-auto block h-86"
src="@/static/images/login/logo.png"
mode="aspectFit"
/>
<view class="pt-45"> <view class="pt-45">
<view class="mx-15 px-15 shadow-[0_0_10px_rgba(10,68,245,0.1)] rounded-10"> <view class="mx-15 bg-white px-15 shadow-[0_0_10px_rgba(10,68,245,0.1)] rounded-10">
<view class="flex items-center py-15"> <view class="flex items-center py-15">
<image class="w-24 h-24" src="@/static/images/login/phone.png" mode="aspectFit" /> <view class="text-gradient">手机号</view>
<input <input
v-model="form.username" v-model="form.username"
type="text" type="text"
@@ -111,7 +103,7 @@ onLoad(async (options) => {
/> />
</view> </view>
<view class="flex items-center py-15"> <view class="flex items-center py-15">
<image class="w-24 h-24" src="@/static/images/login/password.png" mode="aspectFit" /> <view class="text-gradient">登录密码</view>
<input <input
v-model="form.password" v-model="form.password"
placeholder-class="text-#889BC6" placeholder-class="text-#889BC6"
@@ -121,7 +113,7 @@ onLoad(async (options) => {
/> />
</view> </view>
<view class="flex items-center py-15"> <view class="flex items-center py-15">
<image class="w-24 h-24" src="@/static/images/login/password.png" mode="aspectFit" /> <view class="text-gradient">确认登录密码</view>
<input <input
v-model="form.retpassword" v-model="form.retpassword"
placeholder-class="text-#889BC6" placeholder-class="text-#889BC6"
@@ -130,28 +122,19 @@ onLoad(async (options) => {
placeholder="请再次输入登录密码" placeholder="请再次输入登录密码"
/> />
</view> </view>
<view class="flex items-center py-15"> <!-- <view class="flex items-center py-15">
<image class="w-24 h-24" src="@/static/images/login/password.png" mode="aspectFit" /> <view class="text-gradient">验证码</view>
<input <input
v-model="form.tpassword" v-model="form.invitecode"
placeholder-class="text-#889BC6" placeholder-class="text-#889BC6"
type="password" type="text"
class="text-right flex-1 text-14" class="text-right flex-1 text-14"
placeholder="请输入支付密码" placeholder="请输入验证码"
/> />
</view> <image class="w-60 h-24 ml-15 bg-gray-400" mode="aspectFit" />
</view> -->
<view class="flex items-center py-15"> <view class="flex items-center py-15">
<image class="w-24 h-24" src="@/static/images/login/password.png" mode="aspectFit" /> <view class="text-gradient">邀请码</view>
<input
v-model="form.rettpassword"
placeholder-class="text-#889BC6"
type="password"
class="text-right flex-1 text-14"
placeholder="请再次输入支付密码"
/>
</view>
<view class="flex items-center py-15">
<image class="w-24 h-24" src="@/static/images/login/invite.png" mode="aspectFit" />
<input <input
v-model="form.invitecode" v-model="form.invitecode"
placeholder-class="text-#889BC6" placeholder-class="text-#889BC6"
@@ -171,12 +154,12 @@ onLoad(async (options) => {
</view> </view>
</template> </template>
<style lang="scss"> <style lang="scss" scoped>
.login-container { .login-container {
box-sizing: border-box; box-sizing: border-box;
min-height: 100vh; min-height: 100vh;
padding-bottom: 200rpx; padding-bottom: 50px;
background-image: url('@/static/images/login-bg.png'); background-image: url('@/static/images/register-bg.jpg');
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: cover; background-size: cover;
} }
+55 -2
View File
@@ -96,7 +96,7 @@ export const getMyTeamAPI = (data) =>
// 我的资产 // 我的资产
export const getMyAssetAPI = (data) => export const getMyAssetAPI = (data) =>
http({ http({
url: '/api/user/myassets', url: '/api/user/moneyloglist',
method: 'POST', method: 'POST',
data, data,
}) })
@@ -151,5 +151,58 @@ export const getWithdrawalRecordAPI = (data) =>
// 下载APP // 下载APP
export const downloadAppAPI = () => { export const downloadAppAPI = () => {
location.href = 'https://tiktok-test.gbnorg.com/7885922.apk' location.href = 'https://r2.maldiveswallet.vip/app/qmbz-3.apk'
} }
// 社区我的邀请
export const getCommunityMyInviteAPI = (data) =>
http({
url: '/api/user/inviteelist',
method: 'POST',
data,
})
// 领取奖励第一步
export const getCommunityInviteFirstAPI = () =>
http({
url: '/api/user/rewardone',
method: 'POST',
})
// 领取救济金
export const getCommunityInviteRewardAPI = (data) =>
http({
url: '/api/user/rewardtwo',
method: 'POST',
data,
})
// 签到功能
export const getSignInAPI = () =>
http({
url: '/api/user/signin',
method: 'POST',
})
// 开通个人养老账户
export const getOpenPersonalAccountAPI = () =>
http({
url: '/api/user/activateold',
method: 'POST',
})
// 养老金转入余额
export const getOldMoneyTransferAPI = (data) =>
http({
url: '/api/user/yangout',
method: 'POST',
data,
})
// 佣金转入养老金
export const getYongMoneyTransferAPI = (data) =>
http({
url: '/api/user/tuanduiout',
method: 'POST',
data,
})
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 951 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 734 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

+11 -1
View File
@@ -1,4 +1,4 @@
import { getUserInfoAPI, logoutUserAPI } from '@/service' import { getRealNameAuthAPI, getUserInfoAPI, logoutUserAPI } from '@/service'
import { mergeStep } from '@/utils' import { mergeStep } from '@/utils'
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { ref } from 'vue' import { ref } from 'vue'
@@ -12,6 +12,16 @@ export const useUserStore = defineStore(
const loadUserInfo = mergeStep(async () => { const loadUserInfo = mergeStep(async () => {
const res = await getUserInfoAPI() const res = await getUserInfoAPI()
userInfo.value = res.data.userinfo userInfo.value = res.data.userinfo
getRealNameAuthAPI().then((res) => {
if (Number(res.data?.status) !== 2) {
uni.reLaunch({
url: '/pages-sub/realname/index',
})
}
userInfo.value.realname = res.data.realname
return res.data
})
}) })
const setUserInfo = (val: IUserInfo) => { const setUserInfo = (val: IUserInfo) => {
+2
View File
@@ -75,6 +75,7 @@ declare global {
const triggerRef: typeof import('vue')['triggerRef'] const triggerRef: typeof import('vue')['triggerRef']
const unref: typeof import('vue')['unref'] const unref: typeof import('vue')['unref']
const useAttrs: typeof import('vue')['useAttrs'] const useAttrs: typeof import('vue')['useAttrs']
const useCaptcha: typeof import('../hooks/useCaptcha')['useCaptcha']
const useCssModule: typeof import('vue')['useCssModule'] const useCssModule: typeof import('vue')['useCssModule']
const useCssVars: typeof import('vue')['useCssVars'] const useCssVars: typeof import('vue')['useCssVars']
const useId: typeof import('vue')['useId'] const useId: typeof import('vue')['useId']
@@ -172,6 +173,7 @@ declare module 'vue' {
readonly triggerRef: UnwrapRef<typeof import('vue')['triggerRef']> readonly triggerRef: UnwrapRef<typeof import('vue')['triggerRef']>
readonly unref: UnwrapRef<typeof import('vue')['unref']> readonly unref: UnwrapRef<typeof import('vue')['unref']>
readonly useAttrs: UnwrapRef<typeof import('vue')['useAttrs']> readonly useAttrs: UnwrapRef<typeof import('vue')['useAttrs']>
readonly useCaptcha: UnwrapRef<typeof import('../hooks/useCaptcha')['useCaptcha']>
readonly useCssModule: UnwrapRef<typeof import('vue')['useCssModule']> readonly useCssModule: UnwrapRef<typeof import('vue')['useCssModule']>
readonly useCssVars: UnwrapRef<typeof import('vue')['useCssVars']> readonly useCssVars: UnwrapRef<typeof import('vue')['useCssVars']>
readonly useId: UnwrapRef<typeof import('vue')['useId']> readonly useId: UnwrapRef<typeof import('vue')['useId']>
+4 -1
View File
@@ -12,14 +12,17 @@ interface NavigateToOptions {
"/pages/my/index" | "/pages/my/index" |
"/pages/register/index" | "/pages/register/index" |
"/pages-sub/asset/index" | "/pages-sub/asset/index" |
"/pages-sub/asset-detail/index" |
"/pages-sub/convert/index" | "/pages-sub/convert/index" |
"/pages-sub/demo/index" | "/pages-sub/demo/index" |
"/pages-sub/hot-news/index" |
"/pages-sub/introduction/index" | "/pages-sub/introduction/index" |
"/pages-sub/invest-detail/index" | "/pages-sub/invest-detail/index" |
"/pages-sub/invest-immediately/index" | "/pages-sub/invest-immediately/index" |
"/pages-sub/invest-result/index" | "/pages-sub/invest-result/index" |
"/pages-sub/invite/index" | "/pages-sub/invite/index" |
"/pages-sub/lottery/index" | "/pages-sub/lottery/index" |
"/pages-sub/news/index" |
"/pages-sub/news-detail/index" | "/pages-sub/news-detail/index" |
"/pages-sub/official-community/index" | "/pages-sub/official-community/index" |
"/pages-sub/realname/index" | "/pages-sub/realname/index" |
@@ -32,7 +35,7 @@ interface NavigateToOptions {
interface RedirectToOptions extends NavigateToOptions {} interface RedirectToOptions extends NavigateToOptions {}
interface SwitchTabOptions { interface SwitchTabOptions {
url: "/pages/index/index" | "/pages/invite/index" | "/pages/my/index" url: "/pages/index/index" | "/pages/invest/index" | "/pages/invite/index" | "/pages/my/index"
} }
type ReLaunchOptions = NavigateToOptions | SwitchTabOptions; type ReLaunchOptions = NavigateToOptions | SwitchTabOptions;
+1 -1
View File
@@ -84,7 +84,7 @@ export const getAllPages = (key = 'notNeedLogin') => {
...pages ...pages
.filter((page) => { .filter((page) => {
if (!key) return false if (!key) return false
return page[key] === false return page[key] === true
}) })
.map((page) => ({ .map((page) => ({
...page, ...page,
+2 -2
View File
@@ -78,11 +78,11 @@ export default defineConfig({
], ],
['pt-safe', { 'padding-top': 'env(safe-area-inset-top)' }], ['pt-safe', { 'padding-top': 'env(safe-area-inset-top)' }],
['pb-safe', { 'padding-bottom': 'env(safe-area-inset-bottom)' }], ['pb-safe', { 'padding-bottom': 'env(safe-area-inset-bottom)' }],
['btn-gradient', { background: 'linear-gradient(90deg,#95C3FF,#4D72F6)' }], ['btn-gradient', { background: 'linear-gradient(90deg,#3B81F3,#50D0FF)' }],
[ [
'text-gradient', 'text-gradient',
{ {
'background-image': 'linear-gradient(90deg,#95C3FF,#4D72F6 30%)', 'background-image': 'linear-gradient(90deg,#3B81F3,#50D0FF)',
'background-clip': 'text', 'background-clip': 'text',
color: 'transparent', color: 'transparent',
}, },
+6 -2
View File
@@ -113,12 +113,16 @@ export default ({ command, mode }) => {
css: { css: {
postcss: { postcss: {
plugins: [ plugins: [
autoprefixer(), autoprefixer({
overrideBrowserslist: ['Android >= 4.0', 'iOS >= 8'],
}),
viewport({ viewport({
mobileUnit: 'rem',
appSelector: '#app', appSelector: '#app',
selectorBlackList: ['uni-'],
viewportWidth: 375, viewportWidth: 375,
maxDisplayWidth: 600, maxDisplayWidth: 600,
rootContainingBlockSelectorList: ['van-tabbar', 'van-popup'], // rootContainingBlockSelectorList: ['wd-navbar__title'],
border: true, border: true,
}), }),
], ],