# Conflicts:
#	src/pages/profile/recharge-record.vue
#	src/pages/tabbar/profile.vue
This commit is contained in:
dzc committed 2025-12-15 15:40:46 +08:00
commit 00a7a4815a
17 files changed
+1164 -838

No files matched your search

+167 -185
View File
@@ -1,39 +1,39 @@
{
"name": "荷塘月色",
"appid": "__UNI__5B53E65",
"description": "聊天交友app",
"versionName": "0.0.0",
"versionCode": 1,
"transformPx": false,
"app-plus": {
"usingComponents": true,
"nvueCompiler": "uni-app",
"nvueStyleCompiler": "uni-app",
"compilerVersion": 3,
"nvueLaunchMode": "fast",
"splashscreen": {
"alwaysShowBeforeRender": true,
"waiting": true,
"autoclose": true,
"delay": 0
"name" : "荷塘月色",
"appid" : "__UNI__5B53E65",
"description" : "聊天交友app",
"versionName" : "0.0.0",
"versionCode" : 1,
"transformPx" : false,
"app-plus" : {
"usingComponents" : true,
"nvueCompiler" : "uni-app",
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"nvueLaunchMode" : "fast",
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
"safearea": {
"bottom": {
"offset": "none"
"safearea" : {
"bottom" : {
"offset" : "none"
}
},
"modules": {
"Payment": {},
"Share": {},
"VideoPlayer": {},
"OAuth": {},
"Camera": {},
"Geolocation": {},
"FaceID": {}
"modules" : {
"Payment" : {},
"Share" : {},
"VideoPlayer" : {},
"OAuth" : {},
"Camera" : {},
"Geolocation" : {},
"FaceID" : {}
},
"distribute": {
"android": {
"permissions": [
"distribute" : {
"android" : {
"permissions" : [
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
@@ -66,202 +66,184 @@
"<uses-permission android:name=\"android.permission.WRITE_SMS\"/>",
"<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\"/>"
],
"minSdkVersion": 21,
"schemes": "荷塘月色",
"excludePermissions": [
"minSdkVersion" : 21,
"schemes" : "荷塘月色",
"excludePermissions" : [
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>"
]
},
"ios": {
"urlschemewhitelist": [
"baidumap",
"iosamap"
],
"dSYMs": false,
"privacyDescription": {
"NSPhotoLibraryUsageDescription": "需要同意访问您的相册选取图片才能完善该条目",
"NSPhotoLibraryAddUsageDescription": "需要同意访问您的相册才能保存该图片",
"NSCameraUsageDescription": "需要同意访问您的摄像头拍摄照片才能完善该条目",
"NSUserTrackingUsageDescription": "开启追踪并不会获取您在其它站点的隐私信息,该行为仅用于标识设备,保障服务安全和提升浏览体验"
"ios" : {
"urlschemewhitelist" : [ "baidumap", "iosamap" ],
"dSYMs" : false,
"privacyDescription" : {
"NSPhotoLibraryUsageDescription" : "需要同意访问您的相册选取图片才能完善该条目",
"NSPhotoLibraryAddUsageDescription" : "需要同意访问您的相册才能保存该图片",
"NSCameraUsageDescription" : "需要同意访问您的摄像头拍摄照片才能完善该条目",
"NSUserTrackingUsageDescription" : "开启追踪并不会获取您在其它站点的隐私信息,该行为仅用于标识设备,保障服务安全和提升浏览体验"
},
"urltypes": "荷塘月色",
"capabilities": {
"entitlements": {
"com.apple.developer.associated-domains": [
"applinks:shopro.sheepjs.com"
]
"urltypes" : "荷塘月色",
"capabilities" : {
"entitlements" : {
"com.apple.developer.associated-domains" : [ "applinks:shopro.sheepjs.com" ]
}
},
"idfa": true
"idfa" : true
},
"sdkConfigs": {
"speech": {},
"ad": {},
"oauth": {},
"payment": {
"weixin": {
"__platform__": [
"ios",
"android"
],
"appid": "wx2b4e4d3feff8267f",
"UniversalLinks": "https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
"sdkConfigs" : {
"speech" : {},
"ad" : {},
"oauth" : {},
"payment" : {
"weixin" : {
"__platform__" : [ "ios", "android" ],
"appid" : "wxae7a0c156da9383b",
"UniversalLinks" : "https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
},
"alipay": {
"__platform__": [
"ios",
"android"
]
"alipay" : {
"__platform__" : [ "ios", "android" ]
}
},
"share": {
"weixin": {
"appid": "wx2b4e4d3feff8267f",
"UniversalLinks": "https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
"share" : {
"weixin" : {
"appid" : "wxae7a0c156da9383b",
"UniversalLinks" : "https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
}
},
"maps": {},
"geolocation": {
"system": {
"__platform__": [
"ios",
"android"
]
"maps" : {},
"geolocation" : {
"system" : {
"__platform__" : [ "ios", "android" ]
}
}
},
"orientation": [
"portrait-primary"
],
"splashscreen": {
"androidStyle": "default",
"iosStyle": "common",
"useOriginalMsgbox": true,
"android": {
"hdpi": "unpackage/res/icons/1024x1024.png",
"xhdpi": "unpackage/res/icons/1024x1024.png",
"xxhdpi": "unpackage/res/icons/1024x1024.png"
"orientation" : [ "portrait-primary" ],
"splashscreen" : {
"androidStyle" : "default",
"iosStyle" : "common",
"useOriginalMsgbox" : true,
"android" : {
"hdpi" : "unpackage/res/icons/launch-bg.png",
"xhdpi" : "unpackage/res/icons/launch-bg.png",
"xxhdpi" : "unpackage/res/icons/launch-bg.png"
}
},
"icons": {
"android": {
"hdpi": "unpackage/res/icons/72x72.png",
"xhdpi": "unpackage/res/icons/96x96.png",
"xxhdpi": "unpackage/res/icons/144x144.png",
"xxxhdpi": "unpackage/res/icons/192x192.png"
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi" : "unpackage/res/icons/192x192.png"
},
"ios": {
"appstore": "unpackage/res/icons/1024x1024.png",
"ipad": {
"app": "unpackage/res/icons/76x76.png",
"app@2x": "unpackage/res/icons/152x152.png",
"notification": "unpackage/res/icons/20x20.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"proapp@2x": "unpackage/res/icons/167x167.png",
"settings": "unpackage/res/icons/29x29.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"spotlight": "unpackage/res/icons/40x40.png",
"spotlight@2x": "unpackage/res/icons/80x80.png"
"ios" : {
"appstore" : "unpackage/res/icons/1024x1024.png",
"ipad" : {
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"notification" : "unpackage/res/icons/20x20.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
},
"iphone": {
"app@2x": "unpackage/res/icons/120x120.png",
"app@3x": "unpackage/res/icons/180x180.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"notification@3x": "unpackage/res/icons/60x60.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"settings@3x": "unpackage/res/icons/87x87.png",
"spotlight@2x": "unpackage/res/icons/80x80.png",
"spotlight@3x": "unpackage/res/icons/120x120.png"
"iphone" : {
"app@2x" : "unpackage/res/icons/120x120.png",
"app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png"
}
}
}
},
"nativePlugins": {
"AP-FaceDetectModule": {
"__plugin_info__": {
"name": "AP-FaceDetectModule",
"description": "阿里云金融级实人认证SDK",
"platforms": "Android,iOS",
"url": "",
"android_package_name": "",
"ios_bundle_id": "",
"isCloud": false,
"bought": -1,
"pid": "",
"parameters": {}
"nativePlugins" : {
"AP-FaceDetectModule" : {
"__plugin_info__" : {
"name" : "AP-FaceDetectModule",
"description" : "阿里云金融级实人认证SDK",
"platforms" : "Android,iOS",
"url" : "",
"android_package_name" : "",
"ios_bundle_id" : "",
"isCloud" : false,
"bought" : -1,
"pid" : "",
"parameters" : {}
}
}
}
},
"quickapp": {},
"quickapp-native": {
"icon": "/static/logo.png",
"package": "com.example.demo",
"features": [
"quickapp" : {},
"quickapp-native" : {
"icon" : "/static/logo.png",
"package" : "com.example.demo",
"features" : [
{
"name": "system.clipboard"
"name" : "system.clipboard"
}
]
},
"quickapp-webview": {
"icon": "/static/logo.png",
"package": "com.example.demo",
"minPlatformVersion": 1070,
"versionName": "1.0.0",
"versionCode": 100
"quickapp-webview" : {
"icon" : "/static/logo.png",
"package" : "com.example.demo",
"minPlatformVersion" : 1070,
"versionName" : "1.0.0",
"versionCode" : 100
},
"mp-weixin": {
"appid": "wx2b4e4d3feff8267f",
"setting": {
"urlCheck": false,
"minified": true,
"postcss": true
"mp-weixin" : {
"appid" : "wx66186af0759f47c9",
"setting" : {
"urlCheck" : false,
"minified" : true,
"postcss" : true
},
"optimization": {
"subPackages": true
"optimization" : {
"subPackages" : true
},
"plugins": {},
"lazyCodeLoading": "requiredComponents",
"usingComponents": {},
"permission": {},
"requiredPrivateInfos": [
"chooseAddress"
]
"plugins" : {},
"lazyCodeLoading" : "requiredComponents",
"usingComponents" : {},
"permission" : {},
"requiredPrivateInfos" : [ "chooseAddress" ]
},
"mp-alipay": {
"usingComponents": true
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu": {
"usingComponents": true
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao": {
"usingComponents": true
"mp-toutiao" : {
"usingComponents" : true
},
"mp-jd": {
"usingComponents": true
"mp-jd" : {
"usingComponents" : true
},
"h5": {
"darkmode": true,
"template": "index.html",
"router": {
"mode": "history",
"base": "/"
"h5" : {
"darkmode" : true,
"template" : "index.html",
"router" : {
"mode" : "history",
"base" : "/"
},
"sdkConfigs": {
"maps": {}
"sdkConfigs" : {
"maps" : {}
},
"async": {
"timeout": 20000
"async" : {
"timeout" : 20000
},
"title": "聊天交友",
"optimization": {
"treeShaking": {
"enable": true
"title" : "聊天交友",
"optimization" : {
"treeShaking" : {
"enable" : true
}
}
},
"vueVersion": "3",
"_spaceID": "192b4892-5452-4e1d-9f09-eee1ece40639",
"locale": "zh-Hans",
"fallbackLocale": "zh-Hans"
}
"vueVersion" : "3",
"_spaceID" : "192b4892-5452-4e1d-9f09-eee1ece40639",
"locale" : "zh-Hans",
"fallbackLocale" : "zh-Hans"
}
+33 -2
View File
@@ -281,15 +281,46 @@
},
{
"path": "verify-status",
"style": {
"navigationBarTitleText": "人脸认证状态",
"navigationStyle": "custom"
}
},
{
"path": "face-verify/boy-verify",
"style": {
"navigationBarTitleText": "人脸认证",
"navigationStyle": "custom"
}
},
{
"path": "face-verify",
"path": "face-verify/girl-verify-1",
"style": {
"navigationBarTitleText": "人脸认证",
"navigationBarTitleText": "人脸认证-1",
"navigationStyle": "custom",
"app-plus": {
"softinputMode": "adjustResize"
}
}
},
{
"path": "face-verify/girl-verify-2",
"style": {
"navigationBarTitleText": "人脸认证-2",
"navigationStyle": "custom"
}
},
{
"path": "face-verify/girl-verify-3",
"style": {
"navigationBarTitleText": "人脸认证-3",
"navigationStyle": "custom"
}
},
{
"path": "face-verify/girl-verify-4",
"style": {
"navigationBarTitleText": "人脸认证-4",
"navigationStyle": "custom"
}
},
@@ -1,5 +1,6 @@
<template>
<view
@click="emits('click')"
class="h-100rpx mx-8 my-4 rounded-50rpx bg-color-light px-40rpx text-32rpx text-color-theme flex items-center"
>
<view v-if="title" class="text-center truncate">{{ title }}</view>
@@ -13,4 +14,5 @@
title: string;
value: string;
}>();
const emits = defineEmits<{ (e: 'click'): void }>();
</script>
-509
View File
@@ -1,509 +0,0 @@
<template>
<wd-config-provider theme="dark">
<wd-navbar
:title="
userInfoStore.sex == 2 ? '魅力女生认证' : userInfoStore.sex == 1 ? '精英男士认证' : ''
"
safeAreaInsetTop
fixed
placeholder
:bordered="false"
style="z-index: 999"
>
<template #left>
<navigator open-type="navigateBack" hover-class="navigator-hover">
<uni-icons type="back" size="30" color="#D29E52" />
</navigator>
</template>
</wd-navbar>
<!-- 女 认证 -->
<view v-if="userInfoStore.sex == 2" class="pt-20" style="height: calc(100vh - 44rpx - 200rpx)">
<wd-steps :active="stepActive" align-center>
<wd-step v-for="index in 4" :key="index" />
</wd-steps>
<view class="h-30rpx"></view>
<view v-if="stepActive === 0">
<view class="text-xl my-2 mx-8 c-#FCFBFE">完善详细资料(必填)</view>
<view class="text-sm my-2 mx-8 c-#949494">认真填写,展现你的魅力~</view>
<view class="h-60rpx"></view>
<wd-picker
v-model="userinfo.height"
:columns="columnsHeight"
label="身高"
title="身高"
align-right
:default-value="180"
>
<capsule-cell title="身高" :value="userinfo.height ? userinfo.height + 'cm' : ''" />
</wd-picker>
<wd-picker
v-model="userinfo.weight"
:columns="columnsWeight"
label="体重"
title="体重"
align-right
:default-value="60"
>
<capsule-cell title="体重" :value="userinfo.weight ? userinfo.weight + 'kg' : ''" />
</wd-picker>
<wd-picker
v-model="userinfo.occ"
:columns="columnsOcc"
label="从事职业"
title="从事职业"
align-right
>
<capsule-cell title="职业" :value="userinfo.occ" />
</wd-picker>
<textarea
class="h-200rpx w-78% mx-auto my-4 rounded-10rpx bg-color-light p-24rpx text-32rpx text-color-theme"
v-model="userinfo.description"
:maxlength="100"
placeholder="个人简介(100字以内)"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
/>
</view>
<view v-if="stepActive === 1">
<view class="text-xl my-2 mx-8 c-#FCFBFE">请上传3-9张最美的照片</view>
<view class="text-sm my-2 mx-8 c-#949494">请上传本人真实照片,更容易受到男士青睐</view>
<view class="h-60rpx"></view>
<view class="mx-8">
<wd-upload
v-model:file-list="imageFileList"
:action="baseUrl + apiPath + '/infra/file/upload'"
:header="header"
image-mode="aspectFill"
accept="image"
multiple
:limit="9"
:max-size="3000000"
@success="uploadSuccess"
:before-remove="beforeRemove"
/>
</view>
</view>
<view v-if="stepActive === 2">
<view class="text-xl my-2 mx-8 c-#FCFBFE">添加联系方式</view>
<view class="text-sm my-2 mx-8 c-#949494">
我们会保护你的隐私,联系方式只展示给审核人员和付费后的VIP男生
</view>
<view class="h-60rpx"></view>
<input
class="h-100rpx mx-8 my-4 rounded-50rpx bg-color-light px-40rpx text-32rpx text-color-theme"
v-model="wxInfo.wechatNumber"
type="text"
placeholder="请输入您的微信号"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
:maxlength="20"
/>
<view class="flex-row-center my-6">
<s-uploader
v-model:url="wxInfo.wechatQrcode"
fileMediatype="image"
limit="1"
mode="grid"
:imageStyles="{
width: '268rpx',
height: '268rpx',
border: { width: '6rpx', color: '#D29E52', radius: '50rpx' },
}"
/>
</view>
<view class="text-sm mx-8 text-color-theme">
请上传与上方微信匹配的微信二维码以便客服核实
</view>
<view class="text-sm mx-8 text-color-theme">匹配不通过将不会认证通过哦~</view>
</view>
<view v-if="stepActive === 3">
<view class="text-xl my-2 mx-8 c-#FCFBFE">基本资料</view>
<view class="text-sm my-2 mx-8 c-#949494">上传清晰的五官头像,让更多用户发现你~</view>
<view class="h-60rpx"></view>
<view class="mx-8 flex items-center">
<s-uploader
class="flex-1"
v-model:url="userinfo.avatar"
fileMediatype="image"
limit="1"
mode="grid"
:imageStyles="{
width: '268rpx',
height: '268rpx',
border: { width: '6rpx', color: '#D29E52', radius: '50rpx' },
}"
/>
<view class="flex-1 flex-col-center">
<image class="w-160rpx h-180rpx" src="@/static/face-auth-prompt.png" mode="aspectFit" />
<view class="text-xs text-color-theme">确保本人头像</view>
<view class="text-xs text-color-theme">才能通过审核哦</view>
</view>
</view>
<wd-datetime-picker
v-model="userinfo.birthday"
label="生日"
title="生日"
type="date"
align-right
:default-value="Date.now()"
:min-date="new Date(1980, 1, 1).getTime()"
:max-date="Date.now()"
>
<capsule-cell title="生日" :value="formatDate(userinfo.birthday, 'YYYY-MM-DD')" />
</wd-datetime-picker>
<input
class="h-100rpx mx-8 my-4 rounded-50rpx bg-color-light px-40rpx text-32rpx text-color-theme"
v-model="userinfo.nickname"
type="text"
placeholder="请输入昵称"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
:maxlength="10"
/>
<capsule-cell title="位置权限" :value="'未允许'" />
</view>
<view class="flex-row-center mt-6 gap-8">
<view
v-if="stepActive > 0"
class="size-160rpx rounded-full bg-color-light text-center line-height-160rpx active:bg-color"
@click="stepActive--"
>
<uni-icons type="arrow-left" color="#D29E52" size="44" />
</view>
<view
v-if="stepActive < 3"
class="size-160rpx rounded-full bg-color-light text-center line-height-160rpx active:bg-color"
@click="nextStep"
>
<uni-icons type="arrow-right" color="#D29E52" size="44" />
</view>
</view>
<view
v-if="stepActive === 3"
class="mx-auto mt-6 w-200rpx rounded-full p-3 text-center bg-color-theme-dark active:bg-color-theme"
@click="createFaceVerify"
>
开始认证
</view>
</view>
<!-- 男 认证 -->
<view v-if="userInfoStore.sex == 1" class="py-10" style="height: calc(100vh - 44px - 50px)">
<view class="text-xl my-2 mx-8 c-#FCFBFE">基本资料</view>
<view class="text-sm my-2 mx-8 c-#949494">上传本人头像,女生更放心与你见面~</view>
<view class="h-60rpx"></view>
<view class="flex-col-center">
<s-uploader
v-model:url="userinfo.avatar"
fileMediatype="image"
limit="1"
mode="grid"
:imageStyles="{
width: '268rpx',
height: '268rpx',
border: { width: '6rpx', color: '#D29E52', radius: '50rpx' },
}"
/>
<image class="w-260rpx" src="@/static/face-auth-prompt.png" mode="aspectFit" />
</view>
<view
class="mx-auto w-200rpx rounded-full p-3 text-center bg-color-theme-dark active:bg-color-theme"
@click="createFaceVerify"
>
开始认证
</view>
<view class="text-sm mx-8 mt-6 text-color-theme text-center">
为保护您的隐私,您的信息只有认证过的女生可以看到,请放心认证
</view>
</view>
<wd-message-box />
</wd-config-provider>
</template>
<script setup lang="ts">
import RecentApi from '@/sheep/api/member/recent';
import SUploader from '@/sheep/components/s-uploader/s-uploader.vue';
import { computed, reactive, ref, watch } from 'vue';
// @ts-ignore
import sheep from '@/sheep/index';
// @ts-ignore
import { baseUrl, apiPath, tenantId } from '@/sheep/config';
// @ts-ignore
import { getAccessToken } from '@/sheep/request';
// @ts-ignore
import { formatDate } from '@/sheep/helper/utils';
import CapsuleCell from './components/capsule-cell.vue';
import { onLoad } from '@dcloudio/uni-app';
// @ts-ignore
import UserApi from '@/sheep/api/member/user';
import useAblum from './use-ablum';
import { useMessage } from '@/uni_modules/wot-design-uni';
const userInfoStore = computed(() => sheep.$store('user').userInfo);
const messageBox = useMessage();
const { ablumList, getUserAlbum } = useAblum();
const stepActive = ref(0);
const imageFileList = ref([]);
// 用户信息
const userinfo = reactive<any>({
avatar: '',
nickname: '',
birthday: '',
height: '',
weight: '',
occ: '',
description: '',
photo: [],
});
// 微信信息
const wxInfo = reactive({
wechatNumber: '',
wechatQrcode: '',
});
watch(
() => ablumList.value,
(val) => {
imageFileList.value = val.map((item: any) => ({ url: item.address, id: item.id }));
},
{ immediate: true },
);
const header = {
Accept: '*/*',
'tenant-id': tenantId,
Authorization: 'Bearer ' + getAccessToken(),
};
const uploadSuccess = async ({ file }: any) => {
await RecentApi.saveUserAlbum({
address: JSON.parse(file.response).data,
resourceType: 'IMAGE',
});
await getUserAlbum();
};
// 相册移除确认
const beforeRemove = ({ file, fileList, resolve }: any) => {
messageBox
.confirm({
msg: '是否移除',
title: '提示',
})
.then(async () => {
const { code } = await RecentApi.deleteUserAlbum(file.id);
if (code === 0) {
await getUserAlbum();
resolve(true);
}
});
};
onLoad(async () => {
const { data } = await UserApi.getUserInfo();
Object.assign(userinfo, {
avatar: data.avatar,
birthday: data.birthday ?? '',
description: data.description,
height: data.height ?? '',
weight: data.weight ?? '',
mobile: data.mobile,
nickname: data.nickname,
occ: data.occ ?? '',
sex: data.sex,
});
});
// 下一步
const nextStep = () => {
if (validate()) stepActive.value++;
};
// 创建人脸认证
const createFaceVerify = async () => {
// #ifndef APP-PLUS
uni.showToast({ title: '当前设备不支持', icon: 'error' });
// #endif
// #ifdef APP-PLUS
if (!userinfo.avatar) return uni.showToast({ title: '请先上传人脸照片', icon: 'error' });
const aliyunVerify = uni.requireNativePlugin('AP-FaceDetectModule');
const metaInfo = JSON.stringify(aliyunVerify.getMetaInfo());
let fvData = null;
if (userInfoStore.value.sex == 2) {
// 创建女生人脸认证
const { code, data } = await RecentApi.createGirlFaceVerify({
memberHeight: userinfo.height,
memberWeight: userinfo.weight,
memberWechatNumber: wxInfo.wechatNumber,
memberOcc: userinfo.occ,
memberDesc: userinfo.description,
authPic: userinfo.avatar,
metaInfoJson: metaInfo,
});
console.log('女 创建人脸认证接口responseData:', code, data);
if (code !== 0)
return uni.showToast({ title: '请上传包含人脸的头像', icon: 'none', duration: 6000 });
fvData = data;
}
if (userInfoStore.value.sex == 1) {
// 创建男生人脸认证
const { code, data } = await RecentApi.createBoyFaceVerify({
authPic: userinfo.avatar,
metaInfoJson: metaInfo,
});
console.log('男 创建人脸认证接口responseData:', code, data);
if (code !== 0)
return uni.showToast({ title: '请上传包含人脸的头像', icon: 'none', duration: 6000 });
fvData = data;
}
verify(fvData.bizId, fvData.id);
// #endif
};
/**
* @param certifyId 阿里人脸认证id
* @param authId 发起认证的id
*/
const verify = (certifyId: string, authId: string) => {
if (!certifyId) return uni.showToast({ title: 'certifyId不存在', icon: 'none' });
if (!authId) return uni.showToast({ title: 'authId不存在', icon: 'none' });
// const p = uni.getSystemInfoSync().platform;
// if (p === 'ios') {
// }
console.log('certifyId', certifyId);
const aliyunVerify = uni.requireNativePlugin('AP-FaceDetectModule');
aliyunVerify.verify(
{
certifyId,
useMsgBox: true,
extParams: null,
},
function (response: any) {
console.log('认证结果', response);
switch (response.code) {
case 2006:
uni.showToast({
title: '认证不通过,请上传与您本人人脸相同的头像图片',
icon: 'none',
duration: 10000,
});
break;
case 1000:
UserApi.updateUser(userinfo).then(() => {
const { code, data } = RecentApi.createWecahtAuth(wxInfo); // 创建微信认证
console.log('创建微信认证response:', code, data);
sheep.$store('user').getInfo(); // 认证完成再次获取用户信息
uni.showToast({ title: '您已认证成功', icon: 'none' });
setTimeout(() => {
uni.navigateBack();
}, 300);
});
break;
case 1001:
RecentApi.cancelFaceVerify({ authId });
uni.showToast({ title: '系统错误', icon: 'none' });
break;
case 1003:
RecentApi.cancelFaceVerify({ authId });
uni.showToast({ title: '验证中断', icon: 'none' });
break;
case 2002:
uni.showToast({ title: '网络错误', icon: 'none' });
break;
case 2003:
uni.showToast({ title: '客户端设备时间错误', icon: 'none' });
break;
default:
uni.showToast({ title: '未知错误', icon: 'none' });
}
},
);
};
const validate = () => {
switch (stepActive.value) {
case 0:
if (userinfo.height && userinfo.weight && userinfo.occ && userinfo.description) {
return true;
} else {
uni.showToast({ title: '请填写完整信息', icon: 'none' });
return false;
}
case 1:
if (imageFileList.value.length > 2 && imageFileList.value.length < 10) {
return true;
} else {
uni.showToast({ title: '请上传照片', icon: 'none' });
return false;
}
case 2:
if (wxInfo.wechatNumber && wxInfo.wechatQrcode) {
return true;
} else {
uni.showToast({ title: '请完善微信信息', icon: 'none' });
return false;
}
case 3:
if (userinfo.birthday && userinfo.nickname) {
return true;
} else {
uni.showToast({ title: '请完善微信信息', icon: 'none' });
return false;
}
default:
return true;
}
};
</script>
<script lang="ts">
// 身高选择器选项
const columnsHeight = Array.from({ length: 100 }, (_, i) => ({
label: i + 100 + 'cm',
value: i + 100,
})).reverse();
// 体重选择器选项
const columnsWeight = Array.from({ length: 80 }, (_, i) => ({
label: i + 20 + 'kg',
value: i + 20,
}));
// 职业选择器选项
const columnsOcc = [
{ text: '互联网', value: '互联网' },
{ text: '金融', value: '金融' },
{ text: '娱乐', value: '娱乐' },
{ text: 'CEO', value: 'CEO' },
{ text: '高管', value: '高管' },
{ text: '投资人', value: '投资人' },
{ text: '学生', value: '学生' },
{ text: '其他', value: '其他' },
{ text: '老师', value: '老师' },
{ text: '白领', value: '白领' },
{ text: '模特', value: '模特' },
{ text: '主播', value: '主播' },
{ text: '幼师', value: '幼师' },
{ text: 'coser', value: 'coser' },
{ text: '空乘', value: '空乘' },
{ text: '公关', value: '公关' },
{ text: '护士', value: '护士' },
];
</script>
@@ -0,0 +1,63 @@
import RecentApi from '@/sheep/api/member/recent';
// @ts-ignore
import sheep from '@/sheep/index';
/**
* @param certifyId 阿里人脸认证id
* @param authId 发起认证的id
*/
const verify = (certifyId: string, authId: string) => {
if (!certifyId) return uni.showToast({ title: 'certifyId不存在', icon: 'none' });
if (!authId) return uni.showToast({ title: 'authId不存在', icon: 'none' });
// const p = uni.getSystemInfoSync().platform;
// if (p === 'ios') {
// }
console.log('certifyId', certifyId);
const aliyunVerify = uni.requireNativePlugin('AP-FaceDetectModule');
aliyunVerify.verify(
{
certifyId,
useMsgBox: true,
extParams: null,
},
function (response: any) {
console.log('认证结果', response);
switch (response.code) {
case 2006:
uni.showToast({
title: '认证不通过,请上传与您本人人脸相同的头像图片',
icon: 'none',
duration: 10000,
});
break;
case 1000:
sheep.$store('user').getInfo(); // 认证完成再次获取用户信息
uni.showToast({ title: '您已认证成功', icon: 'none' });
setTimeout(() => {
uni.navigateBack();
}, 300);
break;
case 1001:
RecentApi.cancelFaceVerify({ authId });
uni.showToast({ title: '系统错误', icon: 'none' });
break;
case 1003:
RecentApi.cancelFaceVerify({ authId });
uni.showToast({ title: '验证中断', icon: 'none' });
break;
case 2002:
uni.showToast({ title: '网络错误', icon: 'none' });
break;
case 2003:
uni.showToast({ title: '客户端设备时间错误', icon: 'none' });
break;
default:
uni.showToast({ title: '未知错误', icon: 'none' });
}
},
);
};
export default verify;
@@ -0,0 +1,116 @@
<template>
<wd-config-provider theme="dark">
<wd-navbar
title="精英男士认证"
safeAreaInsetTop
fixed
placeholder
:bordered="false"
style="z-index: 999"
>
<template #left>
<navigator open-type="navigateBack" hover-class="navigator-hover">
<uni-icons type="back" size="30" color="#D29E52" />
</navigator>
</template>
</wd-navbar>
<view class="pt-20" style="height: calc(100vh - 44rpx - 200rpx)">
<view class="text-xl my-2 mx-8 c-#FCFBFE">基本资料</view>
<view class="text-sm my-2 mx-8 c-#949494">上传本人头像,女生更放心与你见面~</view>
<view class="h-60rpx"></view>
<view class="flex-col-center">
<s-uploader
v-model:url="userinfo.avatar"
fileMediatype="image"
limit="1"
mode="grid"
:imageStyles="{
width: '268rpx',
height: '268rpx',
border: { width: '6rpx', color: '#D29E52', radius: '50rpx' },
}"
/>
<image class="w-260rpx" src="@/static/face-auth-prompt.png" mode="aspectFit" />
</view>
<view
class="mx-auto w-200rpx rounded-full p-3 text-center bg-color-theme-dark active:bg-color-theme"
@click="createFaceVerify"
>
开始认证
</view>
<view class="text-sm mx-8 mt-6 text-color-theme text-center">
为保护您的隐私,您的信息只有认证过的女生可以看到,请放心认证
</view>
</view>
</wd-config-provider>
</template>
<script setup lang="ts">
import RecentApi from '@/sheep/api/member/recent';
import { onLoad } from '@dcloudio/uni-app';
// @ts-ignore
import UserApi from '@/sheep/api/member/user';
import { reactive } from 'vue';
import verify from './ali-face-verify';
// 用户信息
const userinfo = reactive<any>({
avatar: '',
nickname: '',
birthday: '',
height: '',
weight: '',
occ: '',
description: '',
photo: [],
});
onLoad(async () => {
uni.showLoading({ title: '加载中...' });
const { data } = await UserApi.getUserInfo();
Object.assign(userinfo, {
avatar: data.avatar,
birthday: data.birthday ?? '',
description: data.description,
height: data.height ?? '',
weight: data.weight ?? '',
mobile: data.mobile,
nickname: data.nickname,
occ: data.occ ?? '',
sex: data.sex,
});
uni.hideLoading();
});
// 创建人脸认证
const createFaceVerify = async () => {
// #ifndef APP-PLUS
uni.showToast({ title: '当前设备不支持', icon: 'error' });
// #endif
// #ifdef APP-PLUS
if (!userinfo.avatar) return uni.showToast({ title: '请先上传人脸照片', icon: 'error' });
const aliyunVerify = uni.requireNativePlugin('AP-FaceDetectModule');
const metaInfo = JSON.stringify(aliyunVerify.getMetaInfo());
// 创建男生人脸认证
const { code, data } = await RecentApi.createBoyFaceVerify({
authPic: userinfo.avatar,
metaInfoJson: metaInfo,
});
console.log('男 创建人脸认证接口responseData:', code, data);
if (code !== 0)
return uni.showToast({ title: '请上传包含人脸的头像', icon: 'none', duration: 6000 });
const { code: userResCode } = await UserApi.updateUser(userinfo);
if (userResCode !== 0) return;
verify(data.bizId, data.id);
// #endif
};
</script>
@@ -0,0 +1,151 @@
<template>
<wd-config-provider theme="dark">
<wd-navbar
title="魅力女生认证"
safeAreaInsetTop
fixed
placeholder
:bordered="false"
style="z-index: 999"
>
<template #left>
<navigator open-type="navigateBack" hover-class="navigator-hover">
<uni-icons type="back" size="30" color="#D29E52" />
</navigator>
</template>
</wd-navbar>
<view class="pt-20" style="height: calc(100vh - 44rpx - 200rpx)">
<wd-steps :active="0" align-center>
<wd-step v-for="index in 4" :key="index" />
</wd-steps>
<view class="h-30rpx"></view>
<view class="text-xl my-2 mx-8 c-#FCFBFE">完善详细资料(必填)</view>
<view class="text-sm my-2 mx-8 c-#949494">认真填写,展现你的魅力~</view>
<view class="h-60rpx"></view>
<wd-picker
v-model="userinfo.height"
:columns="columnsHeight"
label="身高"
title="身高"
align-right
:default-value="180"
>
<capsule-cell title="身高" :value="userinfo.height ? userinfo.height + 'cm' : ''" />
</wd-picker>
<wd-picker
v-model="userinfo.weight"
:columns="columnsWeight"
label="体重"
title="体重"
align-right
:default-value="60"
>
<capsule-cell title="体重" :value="userinfo.weight ? userinfo.weight + 'kg' : ''" />
</wd-picker>
<wd-picker
v-model="userinfo.occ"
:columns="columnsOcc"
label="从事职业"
title="从事职业"
align-right
>
<capsule-cell title="职业" :value="userinfo.occ" />
</wd-picker>
<textarea
class="h-200rpx w-78% mx-auto my-4 rounded-10rpx bg-color-light p-24rpx text-32rpx text-color-theme"
v-model="userinfo.description"
:maxlength="100"
placeholder="个人简介(100字以内)"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
/>
<view
class="size-160rpx rounded-full bg-color-light text-center mx-auto line-height-160rpx active:bg-color"
@click="nextStep"
>
<uni-icons type="arrow-right" color="#D29E52" size="44" />
</view>
</view>
</wd-config-provider>
</template>
<script setup lang="ts">
import { onShow } from '@dcloudio/uni-app';
import { reactive } from 'vue';
// @ts-ignore
import UserApi from '@/sheep/api/member/user';
import CapsuleCell from '../components/capsule-cell.vue';
// 用户信息
const userinfo = reactive<any>({
avatar: '',
nickname: '',
birthday: '',
height: '',
weight: '',
occ: '',
description: '',
photo: [],
});
onShow(async () => {
uni.showLoading({ title: '加载中...' });
const { data } = await UserApi.getUserInfo();
Object.assign(userinfo, {
avatar: data.avatar,
birthday: data.birthday ?? '',
description: data.description,
height: data.height ?? '',
weight: data.weight ?? '',
mobile: data.mobile,
nickname: data.nickname,
occ: data.occ ?? '',
sex: data.sex,
});
uni.hideLoading();
});
const nextStep = async () => {
if (userinfo.height && userinfo.weight && userinfo.occ && userinfo.description) {
const { code } = await UserApi.updateUser(userinfo);
if (code !== 0) return;
return uni.redirectTo({ url: '/pages/profile/face-verify/girl-verify-2' });
}
uni.showToast({ title: '请填写完整信息', icon: 'none' });
};
</script>
<script lang="ts">
// 身高选择器选项
const columnsHeight = Array.from({ length: 100 }, (_, i) => ({
label: i + 100 + 'cm',
value: i + 100,
})).reverse();
// 体重选择器选项
const columnsWeight = Array.from({ length: 80 }, (_, i) => ({
label: i + 20 + 'kg',
value: i + 20,
}));
// 职业选择器选项
const columnsOcc = [
{ text: '互联网', value: '互联网' },
{ text: '金融', value: '金融' },
{ text: '娱乐', value: '娱乐' },
{ text: 'CEO', value: 'CEO' },
{ text: '高管', value: '高管' },
{ text: '投资人', value: '投资人' },
{ text: '学生', value: '学生' },
{ text: '其他', value: '其他' },
{ text: '老师', value: '老师' },
{ text: '白领', value: '白领' },
{ text: '模特', value: '模特' },
{ text: '主播', value: '主播' },
{ text: '幼师', value: '幼师' },
{ text: 'coser', value: 'coser' },
{ text: '空乘', value: '空乘' },
{ text: '公关', value: '公关' },
{ text: '护士', value: '护士' },
];
</script>
@@ -0,0 +1,112 @@
<template>
<wd-config-provider theme="dark">
<wd-navbar
title="魅力女生认证"
safeAreaInsetTop
fixed
placeholder
:bordered="false"
style="z-index: 999"
>
<template #left>
<navigator open-type="navigateBack" hover-class="navigator-hover">
<uni-icons type="back" size="30" color="#D29E52" />
</navigator>
</template>
</wd-navbar>
<view class="pt-20" style="height: calc(100vh - 44rpx - 200rpx)">
<wd-steps :active="1" align-center>
<wd-step v-for="index in 4" :key="index" />
</wd-steps>
<view class="h-30rpx"></view>
<view class="text-xl my-2 mx-8 c-#FCFBFE">请上传3-9张最美的照片</view>
<view class="text-sm my-2 mx-8 c-#949494">请上传本人真实照片,更容易受到男士青睐</view>
<view class="h-60rpx"></view>
<view class="mx-8 mb-8">
<wd-upload
v-model:file-list="imageFileList"
:action="baseUrl + apiPath + '/infra/file/upload'"
:header="header"
image-mode="aspectFill"
accept="image"
multiple
:limit="9"
:max-size="3000000"
@success="uploadSuccess"
:before-remove="beforeRemove"
/>
</view>
<view
class="size-160rpx rounded-full bg-color-light text-center mx-auto line-height-160rpx active:bg-color"
@click="nextStep"
>
<uni-icons type="arrow-right" color="#D29E52" size="44" />
</view>
</view>
</wd-config-provider>
</template>
<script setup lang="ts">
// @ts-ignore
import { baseUrl, apiPath, tenantId } from '@/sheep/config';
// @ts-ignore
import { getAccessToken } from '@/sheep/request';
import RecentApi from '@/sheep/api/member/recent';
import { useMessage } from '@/uni_modules/wot-design-uni';
import useAblum from '../use-ablum';
import { ref, watch } from 'vue';
const messageBox = useMessage();
const { ablumList, getUserAlbum } = useAblum();
const imageFileList = ref([]);
watch(
() => ablumList.value,
(val) => {
imageFileList.value = val.map((item: any) => ({ url: item.address, id: item.id }));
},
{ immediate: true },
);
const header = {
Accept: '*/*',
'tenant-id': tenantId,
Authorization: 'Bearer ' + getAccessToken(),
};
const uploadSuccess = async ({ file }: any) => {
await RecentApi.saveUserAlbum({
address: JSON.parse(file.response).data,
resourceType: 'IMAGE',
});
await getUserAlbum();
};
// 相册移除确认
const beforeRemove = ({ file, fileList, resolve }: any) => {
messageBox
.confirm({
msg: '是否移除',
title: '提示',
})
.then(async () => {
const { code } = await RecentApi.deleteUserAlbum(file.id);
if (code === 0) {
await getUserAlbum();
resolve(true);
}
});
};
const nextStep = () => {
if (imageFileList.value.length > 2 && imageFileList.value.length < 10) {
return uni.redirectTo({ url: '/pages/profile/face-verify/girl-verify-3' });
}
uni.showToast({ title: '请上传照片', icon: 'none' });
};
</script>
@@ -0,0 +1,85 @@
<template>
<wd-config-provider theme="dark">
<wd-navbar
title="魅力女生认证"
safeAreaInsetTop
fixed
placeholder
:bordered="false"
style="z-index: 999"
>
<template #left>
<navigator open-type="navigateBack" hover-class="navigator-hover">
<uni-icons type="back" size="30" color="#D29E52" />
</navigator>
</template>
</wd-navbar>
<view class="pt-20" style="height: calc(100vh - 44rpx - 200rpx)">
<wd-steps :active="2" align-center>
<wd-step v-for="index in 4" :key="index" />
</wd-steps>
<view class="h-30rpx"></view>
<view class="text-xl my-2 mx-8 c-#FCFBFE">添加联系方式</view>
<view class="text-sm my-2 mx-8 c-#949494">
我们会保护你的隐私,联系方式只展示给审核人员和付费后的VIP男生
</view>
<view class="h-60rpx"></view>
<input
class="h-100rpx mx-8 my-4 rounded-50rpx bg-color-light px-40rpx text-32rpx text-color-theme"
v-model="wxInfo.wechatNumber"
type="text"
placeholder="请输入您的微信号"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
:maxlength="20"
/>
<view class="flex-row-center my-6">
<s-uploader
v-model:url="wxInfo.wechatQrcode"
fileMediatype="image"
limit="1"
mode="grid"
:imageStyles="{
width: '268rpx',
height: '268rpx',
border: { width: '6rpx', color: '#D29E52', radius: '50rpx' },
}"
/>
</view>
<view class="text-sm mx-8 text-color-theme">
请上传与上方微信匹配的微信二维码以便客服核实
</view>
<view class="text-sm mx-8 text-color-theme">匹配不通过将不会认证通过哦~</view>
<view
class="size-160rpx rounded-full bg-color-light text-center mx-auto my-8 line-height-160rpx active:bg-color"
@click="nextStep"
>
<uni-icons type="arrow-right" color="#D29E52" size="44" />
</view>
</view>
</wd-config-provider>
</template>
<script setup lang="ts">
import RecentApi from '@/sheep/api/member/recent';
import { reactive } from 'vue';
// 微信信息
const wxInfo = reactive({
wechatNumber: '',
wechatQrcode: '',
});
const nextStep = async () => {
if (wxInfo.wechatNumber && wxInfo.wechatQrcode) {
const { code, data } = await RecentApi.createWecahtAuth(wxInfo); // 创建微信认证
console.log('创建微信认证response:', code, data);
if (code !== 0) return;
return uni.redirectTo({ url: '/pages/profile/face-verify/girl-verify-4' });
}
uni.showToast({ title: '请完善微信信息', icon: 'none' });
};
</script>
@@ -0,0 +1,186 @@
<template>
<wd-config-provider theme="dark">
<wd-navbar
title="魅力女生认证"
safeAreaInsetTop
fixed
placeholder
:bordered="false"
style="z-index: 999"
>
<template #left>
<navigator open-type="navigateBack" hover-class="navigator-hover">
<uni-icons type="back" size="30" color="#D29E52" />
</navigator>
</template>
</wd-navbar>
<view class="pt-20" style="height: calc(100vh - 44rpx - 200rpx)">
<wd-steps :active="3" align-center>
<wd-step v-for="index in 4" :key="index" />
</wd-steps>
<view class="h-30rpx"></view>
<view class="text-xl my-2 mx-8 c-#FCFBFE">基本资料</view>
<view class="text-sm my-2 mx-8 c-#949494">上传清晰的五官头像,让更多用户发现你~</view>
<view class="h-60rpx"></view>
<view class="mx-8 flex items-center">
<s-uploader
class="flex-1"
v-model:url="userinfo.avatar"
fileMediatype="image"
limit="1"
mode="grid"
:imageStyles="{
width: '268rpx',
height: '268rpx',
border: { width: '6rpx', color: '#D29E52', radius: '50rpx' },
}"
/>
<view class="flex-1 flex-col-center">
<image class="w-160rpx h-180rpx" src="@/static/face-auth-prompt.png" mode="aspectFit" />
<view class="text-xs text-color-theme">确保本人头像</view>
<view class="text-xs text-color-theme">才能通过审核哦</view>
</view>
</view>
<wd-datetime-picker
v-model="userinfo.birthday"
label="生日"
title="生日"
type="date"
align-right
:default-value="Date.now()"
:min-date="new Date(1980, 1, 1).getTime()"
:max-date="Date.now()"
>
<capsule-cell title="生日" :value="formatDate(userinfo.birthday, 'YYYY-MM-DD')" />
</wd-datetime-picker>
<input
class="h-100rpx mx-8 my-4 rounded-50rpx bg-color-light px-40rpx text-32rpx text-color-theme"
v-model="userinfo.nickname"
type="text"
placeholder="请输入昵称"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
:maxlength="10"
/>
<capsule-cell
title="位置权限"
:value="locationAuth ? '已允许' : '未允许'"
@click="openLocationAuth"
/>
<view
class="mx-auto mt-6 w-200rpx rounded-full p-3 text-center bg-color-theme-dark active:bg-color-theme"
@click="createFaceVerify"
>
开始认证
</view>
</view>
</wd-config-provider>
</template>
<script setup lang="ts">
import { onLoad, onShow } from '@dcloudio/uni-app';
import CapsuleCell from '../components/capsule-cell.vue';
// @ts-ignore
import { formatDate } from '@/sheep/helper/utils';
import { reactive, ref } from 'vue';
// @ts-ignore
import UserApi from '@/sheep/api/member/user';
import RecentApi from '@/sheep/api/member/recent';
import verify from './ali-face-verify';
// @ts-ignore
import checkOpenGPSService from './openSettings.js';
// 用户信息
const userinfo = reactive<any>({
avatar: '',
nickname: '',
birthday: '',
height: '',
weight: '',
occ: '',
description: '',
photo: [],
});
const locationAuth = ref(false);
onLoad(async () => {
uni.showLoading({ title: '加载中...' });
const { data } = await UserApi.getUserInfo();
Object.assign(userinfo, {
avatar: data.avatar,
birthday: data.birthday ?? '',
description: data.description,
height: data.height ?? '',
weight: data.weight ?? '',
mobile: data.mobile,
nickname: data.nickname,
occ: data.occ ?? '',
sex: data.sex,
});
uni.hideLoading();
checkOpenGPSService();
});
onShow(() => {
uni.getLocation({
type: 'wgs84',
success: async (res) => {
locationAuth.value = true;
const params = {
lat: String(res.latitude),
lon: String(res.longitude),
province: res.address?.province ?? '',
city: res.address?.city ?? '',
district: res.address?.district ?? '',
address: res.address?.street ?? '',
};
await RecentApi.updateUserLocation(params);
},
fail: () => {
locationAuth.value = false;
},
});
});
const openLocationAuth = () => {
if (locationAuth.value) return;
checkOpenGPSService();
};
const createFaceVerify = async () => {
// #ifndef APP-PLUS
uni.showToast({ title: '当前设备不支持', icon: 'error' });
// #endif
if (!userinfo.birthday || !userinfo.nickname)
return uni.showToast({ title: '请完善信息', icon: 'none' });
if (!locationAuth.value) return uni.showToast({ title: '请先授权位置权限', icon: 'none' });
// #ifdef APP-PLUS
if (!userinfo.avatar) return uni.showToast({ title: '请先上传人脸照片', icon: 'error' });
const aliyunVerify = uni.requireNativePlugin('AP-FaceDetectModule');
const metaInfo = JSON.stringify(aliyunVerify.getMetaInfo());
// 创建女生人脸认证
const { code, data } = await RecentApi.createGirlFaceVerify({
memberHeight: userinfo.height,
memberWeight: userinfo.weight,
// memberWechatNumber: wxInfo.wechatNumber,
memberOcc: userinfo.occ,
memberDesc: userinfo.description,
authPic: userinfo.avatar,
metaInfoJson: metaInfo,
});
console.log('女 创建人脸认证接口responseData:', code, data);
if (code !== 0)
return uni.showToast({ title: '请上传包含人脸的头像', icon: 'none', duration: 6000 });
verify(data.bizId, data.id);
// #endif
};
</script>
@@ -0,0 +1,69 @@
let system = uni.getSystemInfoSync();
const checkOpenGPSService = () => {
if (system.platform === 'android') {
plus.android.requestPermissions(
['android.permission.ACCESS_FINE_LOCATION'],
function ({ granted, deniedPresent, deniedAlways }) {
if (granted.length) {
const context = plus.android.importClass('android.content.Context');
const locationManager = plus.android.importClass('android.location.LocationManager');
const main = plus.android.runtimeMainActivity();
const mainSvr = main.getSystemService(context.LOCATION_SERVICE);
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
uni.showModal({
title: '提示',
content: '请打开定位服务功能',
success(res) {
if (res.confirm) {
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
const Intent = plus.android.importClass('android.content.Intent');
const Settings = plus.android.importClass('android.provider.Settings');
const intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
main.startActivity(intent); // 打开系统设置GPS服务页面
}
}
},
});
}
}
if (deniedPresent.length || deniedAlways.length) {
uni.showToast({ title: '请打开位置权限设置', icon: 'none' });
setTimeout(() => {
const Intent = plus.android.importClass('android.content.Intent');
const Settings = plus.android.importClass('android.provider.Settings');
const Uri = plus.android.importClass('android.net.Uri');
const mainActivity = plus.android.runtimeMainActivity();
const intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
const uri = Uri.fromParts('package', mainActivity.getPackageName(), null);
intent.setData(uri);
mainActivity.startActivity(intent);
}, 1000);
}
},
function (error) {
console.log(error);
},
);
} else if (system.platform == 'ios') {
// 苹果打开对应的通知栏
uni.showModal({
title: '定位权限开启提醒',
content: '未开启定位,请前往设置!',
confirmText: '去设置',
success: function (res) {
if (res.confirm) {
const app = plus.ios.invoke('UIApplication', 'sharedApplication');
const setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');
plus.ios.invoke(app, 'openURL:', setting);
plus.ios.deleteObject(setting);
plus.ios.deleteObject(app);
}
},
});
}
};
export default checkOpenGPSService;
+24 -26
View File
@@ -24,39 +24,22 @@
<view v-else>待认证</view>
</view>
<navigator url="/pages/profile/face-verify" open-type="navigate" hover-class="navigator-hover">
<view class="flex-row-center mt-40">
<wd-button size="large" :disabled="authData?.authStatus == '2'">
{{ authData?.authStatus == '3' ? '重新认证' : '开始认证' }}
</wd-button>
</view>
</navigator>
<button @click="test">测试按钮</button>
<view class="flex-row-center mt-40">
<wd-button size="large" :disabled="authData?.authStatus == '2'" @click="goAuth">
{{ authData?.authStatus == '3' ? '重新认证' : '开始认证' }}
</wd-button>
</view>
</wd-config-provider>
</template>
<script setup lang="ts">
import RecentApi from '@/sheep/api/member/recent';
import { onShow } from '@dcloudio/uni-app';
import { ref } from 'vue';
import { computed, ref } from 'vue';
// @ts-ignore
import sheep from '@/sheep/index';
const test = () => {
const system = uni.getSystemInfoSync();
if (system.platform === 'android') {
const context: any = plus.android.importClass('android.content.Context');
const locationManager: any = plus.android.importClass('android.location.LocationManager');
const main: any = plus.android.runtimeMainActivity();
const mainSvr = main.getSystemService(context.LOCATION_SERVICE);
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
const Intent: any = plus.android.importClass('android.content.Intent');
const Settings: any = plus.android.importClass('android.provider.Settings');
const intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
main.startActivity(intent); // 打开系统设置GPS服务页面
} else {
console.log('GPS功能已开启');
}
}
};
const userInfo = computed(() => sheep.$store('user').userInfo);
const authData = ref<any>({});
@@ -73,4 +56,19 @@
if (code !== 0) return uni.showToast({ title: '查询用户人脸认证失败', icon: 'none' });
authData.value = data;
};
const goAuth = () => {
// 女 认证
if (userInfo.value.sex == 2)
uni.navigateTo({
url: '/pages/profile/face-verify/girl-verify-1',
});
// 男 认证
if (userInfo.value.sex == 1) {
uni.navigateTo({
url: '/pages/profile/face-verify/boy-verify',
});
}
};
</script>
+149 -109
View File
@@ -15,8 +15,11 @@
<scroll-view class="h-[calc(100vh-144rpx)]" scroll-y>
<!-- 个人信息 -->
<view class="flex items-center p-6">
<image :src="userInfo.avatar" class="mr-4 size-100px rounded-full bg-#333 border border-amber border-solid"
mode="aspectFill" />
<image
:src="userInfo.avatar"
class="mr-4 size-100px rounded-full bg-#333 border border-amber border-solid"
mode="aspectFill"
/>
<view class="flex-1">
<view class="mb-1 text-base">
<text>{{ userInfo.nickname }}</text>
@@ -24,13 +27,18 @@
</view>
<view class="mb-2 text-xs text-#ffffff80 flex items-center">
<text>ID: {{ userInfo.id }}</text>
<view v-if="userInfo.memberVip?.vip"
class="text-20rpx ml-2 flex-row-center bg-color-theme-dark px-1 rounded-1">
<view
v-if="userInfo.memberVip?.vip"
class="text-20rpx ml-2 flex-row-center bg-color-theme-dark px-1 rounded-1"
>
<uni-icons type="vip-filled" size="14" />
<text class="text-color-dark ml-1">VIP</text>
</view>
</view>
<text v-if="userCity?.t" class="bg-#333 text-color-theme-dark text-xs px-2 py-1 rounded-1 truncate">
<text
v-if="userCity?.t"
class="bg-#333 text-color-theme-dark text-xs px-2 py-1 rounded-1 truncate"
>
{{ userCity?.t || '' }}
</text>
</view>
@@ -51,7 +59,11 @@
<text class="text-color-theme text-sm">喜欢我</text>
</view>
<view class="flex-1">
<navigator url="/pages/profile/recharge" open-type="navigate" hover-class="navigator-hover">
<navigator
url="/pages/profile/recharge"
open-type="navigate"
hover-class="navigator-hover"
>
<view class="flex-col-center">
<text class="text-color-theme font-600 text-lg">
{{ fen2yuanSimple(userWallet.balance) }}
@@ -64,20 +76,24 @@
<!-- 开通vip -->
<view
class="text-color-theme-dark mx-4 p-4 rounded-2 bg-gradient-to-b from-#111 to-#222 b-4 b-solid b-t-#D29E52/60 b-l-#D29E52/40 b-r-#D29E52/40 b-b-#D29E52/20 flex justify-between">
class="text-color-theme-dark mx-4 p-4 rounded-2 bg-gradient-to-b from-#111 to-#222 b-4 b-solid b-t-#D29E52/60 b-l-#D29E52/40 b-r-#D29E52/40 b-b-#D29E52/20 flex justify-between"
>
<view class="font-900 font-italic text-xl">VIP</view>
<view class="flex items-center">
<text class="text-xs">尊享vip免费特权</text>
<navigator url="/pages/profile/apply-vip" open-type="navigate" hover-class="navigator-hover">
<text v-if="!userInfo.memberVip?.vip"
class="ml-4 px-4 py-1 rounded-full text-24rpx bg-color-theme text-black">
<navigator
v-if="!userInfo.memberVip?.vip"
url="/pages/profile/apply-vip"
open-type="navigate"
hover-class="navigator-hover"
>
<text class="ml-4 px-4 py-1 rounded-full text-24rpx bg-color-theme text-black">
立即开通
</text>
<text v-else class="ml-4 px-2 py-1 rounded-1 text-24rpx bg-color-theme text-black">
VIP 开通成功
</text>
</navigator>
<text v-else class="ml-4 px-2 py-1 rounded-1 text-24rpx bg-color-theme text-black">
VIP 开通成功
</text>
</view>
</view>
@@ -94,7 +110,11 @@
<text class="text-xs ml-2">邀请福利</text>
<text class="text-20rpx ml-4 mt-2rpx">邀请用户领会员</text>
</view>
<navigator url="/pages/wechat-tabbar/index" open-type="navigate" hover-class="navigator-hover">
<navigator
url="/pages/wechat-tabbar/index"
open-type="navigate"
hover-class="navigator-hover"
>
<view class="bg-color-theme text-xs rounded-full py-1 px-3">查看福利</view>
</navigator>
</view>
@@ -103,14 +123,29 @@
<!-- 菜单 -->
<view class="mt-2 mx-1">
<wd-cell-group>
<wd-cell v-for="(item, index) in MenuCellList" :key="index" :title="item.title" :value="item.value"
icon-size="24" :icon="item.icon" is-link ellipsis :to="item.to" @click="item.onClick" />
<wd-cell
v-for="(item, index) in MenuCellList"
:key="index"
:title="item.title"
:value="item.value"
icon-size="24"
:icon="item.icon"
is-link
ellipsis
:to="item.to"
@click="item.onClick"
/>
</wd-cell-group>
</view>
<view class="h-100rpx"></view>
</scroll-view>
<wd-popup v-model="myEvaluationShow" custom-style="border-radius:32rpx;" closable :safe-area-inset-bottom="true">
<wd-popup
v-model="myEvaluationShow"
custom-style="border-radius:32rpx;"
closable
:safe-area-inset-bottom="true"
>
<view class="w-90vw h-400rpx flex-col-center gap-4 flex-wrap">
<view class="text-color-theme text-lg">
<text>我的评价</text>
@@ -141,106 +176,111 @@
</view>
</view>
</wd-popup>
<wd-curtain v-model="curtainShow"
<wd-curtain
v-model="curtainShow"
src="https://img20.360buyimg.com/da/jfs/t1/141592/25/8861/261559/5f68d8c1E33ed78ab/698ad655bfcfbaed.png"
close-position="top-right" :width="300" close-on-click-modal show-menu-by-longpress />
close-position="top-right"
:width="300"
close-on-click-modal
show-menu-by-longpress
/>
</wd-config-provider>
</template>
<script setup lang="ts">
import { computed, reactive, ref } from 'vue';
import UserAblum from './components/user-ablum.vue';
import useAblum from '../profile/use-ablum';
// @ts-ignore
import sheep from '@/sheep';
import RecentApi from '@/sheep/api/member/recent';
import { onShow } from '@dcloudio/uni-app';
// @ts-ignore
import { fen2yuanSimple } from '@/sheep/hooks/useGoods';
import { computed, reactive, ref } from 'vue';
import UserAblum from './components/user-ablum.vue';
import useAblum from '../profile/use-ablum';
// @ts-ignore
import sheep from '@/sheep';
import RecentApi from '@/sheep/api/member/recent';
import { onShow } from '@dcloudio/uni-app';
// @ts-ignore
import { fen2yuanSimple } from '@/sheep/hooks/useGoods';
const { ablumList } = useAblum();
const { ablumList } = useAblum();
// 统计信息
const recentTotal = ref({
memberRecentId: null,
bizType: null,
likeTotal: 0,
likeItTotal: 0,
likeMeTotal: 0,
reportTotal: 0,
shieldTotal: 0,
collectTotal: 0,
userLikeItTotal: 0,
userLikeMeTotal: 0,
});
// 我的评价数据
const myEvaluation = reactive({
scoreSc: 0,
scoreNx: 0,
scoreSk: 0,
scoreYq: 0,
avgScore: 0,
evaluateCount: 0,
});
const myEvaluationShow = ref(false); // 我的评价弹窗
const curtainShow = ref(false); // 关注公众号弹窗
const userInfo = computed(() => sheep.$store('user').userInfo);
const userCity = computed(() => sheep.$store('user').userCity);
const userWallet = computed(() => sheep.$store('user').userWallet);
const userGenderImageSrc = computed(() => {
const sex = userInfo.value.sex;
if (sex === 1) return '/static/gender-man.png';
if (sex === 2) return '/static/gender-woman.png';
return '';
});
onShow(async () => {
const { data: totalData } = await RecentApi.recentTotal();
recentTotal.value = totalData ?? {};
});
// type: 0-我喜欢 1-喜欢我
const goLike = (type: 0 | 1) => {
uni.navigateTo({
url: `/pages/profile/like?type=${type}`,
// 统计信息
const recentTotal = ref({
memberRecentId: null,
bizType: null,
likeTotal: 0,
likeItTotal: 0,
likeMeTotal: 0,
reportTotal: 0,
shieldTotal: 0,
collectTotal: 0,
userLikeItTotal: 0,
userLikeMeTotal: 0,
});
};
// 查看我的评价
const lookMyEvaluation = async () => {
const { data = null } = await RecentApi.myEvaluate();
if (data) {
Object.assign(myEvaluation, data);
myEvaluationShow.value = true;
return;
}
uni.showToast({ title: '查看失败', icon: 'none' });
};
// 关注公众号
const subOfficial = () => {
curtainShow.value = true;
};
// 问题反馈
const goFeedback = () => {
uni.navigateTo({
url: '/pages/profile/feedback',
// 我的评价数据
const myEvaluation = reactive({
scoreSc: 0,
scoreNx: 0,
scoreSk: 0,
scoreYq: 0,
avgScore: 0,
evaluateCount: 0,
});
};
const myEvaluationShow = ref(false); // 我的评价弹窗
const curtainShow = ref(false); // 关注公众号弹窗
// 菜单
const MenuCellList = [
{ title: '我的收益', value: '', icon: 'wallet', to: '/pages/wechat-tabbar/index' },
{ title: '访客记录√', value: '', icon: 'browse', to: '/pages/profile/view-record' },
{ title: '认证中心', value: '', icon: 'user', to: '/pages/profile/verify-status' },
{ title: '我的动态√', value: '', icon: 'star', to: '/pages/profile/my-moment' },
{ title: '我的评价√', value: '', icon: 'view-module', to: '', onClick: lookMyEvaluation },
{ title: '问题反馈√', value: '', icon: 'backtop-rectangle', to: '', onClick: goFeedback },
// { title: '客服助手', value: '', icon: 'service', to: '' },
{ title: '关注公众号√', value: '获取最新消息', icon: 'qrcode', to: '', onClick: subOfficial },
{ title: '设置√', value: '', icon: 'setting1', to: '/pages/profile/setting' },
];
const userInfo = computed(() => sheep.$store('user').userInfo);
const userCity = computed(() => sheep.$store('user').userCity);
const userWallet = computed(() => sheep.$store('user').userWallet);
const userGenderImageSrc = computed(() => {
const sex = userInfo.value.sex;
if (sex === 1) return '/static/gender-man.png';
if (sex === 2) return '/static/gender-woman.png';
return '';
});
onShow(async () => {
const { data: totalData } = await RecentApi.recentTotal();
recentTotal.value = totalData ?? {};
});
// type: 0-我喜欢 1-喜欢我
const goLike = (type: 0 | 1) => {
uni.navigateTo({
url: `/pages/profile/like?type=${type}`,
});
};
// 查看我的评价
const lookMyEvaluation = async () => {
const { data = null } = await RecentApi.myEvaluate();
if (data) {
Object.assign(myEvaluation, data);
myEvaluationShow.value = true;
return;
}
uni.showToast({ title: '查看失败', icon: 'none' });
};
// 关注公众号
const subOfficial = () => {
curtainShow.value = true;
};
// 问题反馈
const goFeedback = () => {
uni.navigateTo({
url: '/pages/profile/feedback',
});
};
// 菜单
const MenuCellList = [
{ title: '我的收益', value: '', icon: 'wallet', to: '/pages/wechat-tabbar/index' },
{ title: '访客记录', value: '', icon: 'browse', to: '/pages/profile/view-record' },
{ title: '认证中心', value: '', icon: 'user', to: '/pages/profile/verify-status' },
{ title: '我的动态', value: '', icon: 'star', to: '/pages/profile/my-moment' },
{ title: '我的评价', value: '', icon: 'view-module', to: '', onClick: lookMyEvaluation },
{ title: '问题反馈', value: '', icon: 'backtop-rectangle', to: '', onClick: goFeedback },
// { title: '客服助手', value: '', icon: 'service', to: '' },
{ title: '关注公众号', value: '获取最新消息', icon: 'qrcode', to: '', onClick: subOfficial },
{ title: '设置', value: '', icon: 'setting1', to: '/pages/profile/setting' },
];
</script>
+2 -2
View File
@@ -40,7 +40,7 @@ const RecentApi = {
method: 'POST',
data,
custom: {
showLoading: true,
showLoading: false,
},
});
},
@@ -525,7 +525,7 @@ const RecentApi = {
params,
custom: {
showLoading: true,
loadingMsg: '正在取消',
loadingMsg: '取消认证',
},
});
},
+1 -1
View File
@@ -20,7 +20,7 @@ const UserApi = {
data,
custom: {
auth: true,
showSuccess: true,
showSuccess: false,
successMsg: '保存成功',
},
});
+4 -4
View File
@@ -12,9 +12,9 @@ export default function useScroll(fetch: (...arg: any) => Promise<any>, params:
const loadData = async (isRefresh: boolean = false) => {
try {
if (pageParams.pageNo === 1) {
uni.showLoading({ title: '加载中...' });
}
// if (pageParams.pageNo === 1) {
// uni.showLoading({ title: '加载中...' });
// }
if (isRefresh) {
isRefreshing.value = true;
pageParams.pageNo = 1;
@@ -37,7 +37,7 @@ export default function useScroll(fetch: (...arg: any) => Promise<any>, params:
console.error('加载数据失败:', error);
} finally {
isRefreshing.value = false;
uni.hideLoading();
// uni.hideLoading();
}
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB