This commit is contained in:
dzc committed 2025-12-03 14:37:51 +08:00
commit 40af8bef5e
11 files changed
+466 -75

No files matched your search

+56 -29
View File
@@ -92,23 +92,23 @@
</view>
<view class="m-4">
<view class="my-2 text-base">评价1+</view>
<view class="my-2 text-base">评价</view>
<view class="flex justify-around flex-wrap text-color-theme text-base">
<view class="bg-color-dark flex items-center px-2 py-1 mb-2 rounded-2 gap-2">
<text>身材</text>
<uni-rate :value="2" :touchable="false" :readonly="true" size="18" />
<uni-rate v-model="rating.scoreSc" size="18" />
</view>
<view class="bg-color-dark flex items-center px-2 py-1 mb-2 rounded-2 gap-2">
<text>颜值</text>
<uni-rate :value="2" :touchable="false" :readonly="true" size="18" />
<uni-rate v-model="rating.scoreSk" size="18" />
</view>
<view class="bg-color-dark flex items-center px-2 py-1 mb-2 rounded-2 gap-2">
<text>耐心</text>
<uni-rate :value="2" :touchable="false" :readonly="true" size="18" />
<uni-rate v-model="rating.scoreNx" size="18" />
</view>
<view class="bg-color-dark flex items-center px-2 py-1 mb-2 rounded-2 gap-2">
<text>有趣</text>
<uni-rate :value="2" :touchable="false" :readonly="true" size="18" />
<uni-rate v-model="rating.scoreYq" size="18" />
</view>
</view>
</view>
@@ -143,7 +143,7 @@
@click="handleLike"
>
<uni-icons
v-if="userDetail.operationStatus.isLike"
v-if="userDetail.operationStatus?.isLike"
type="heart-filled"
size="24"
color="#D29E52"
@@ -170,7 +170,7 @@
import ScrollList from '@/sheep/components/scroll-list/scroll-list.vue';
import useScroll from '@/sheep/hooks/use-scroll';
import RecentApi from '@/sheep/api/member/recent';
import { onLoad } from '@dcloudio/uni-app';
import { onHide, onUnload, onLoad } from '@dcloudio/uni-app';
import { getGender } from '@/sheep/util/index';
import sheep from '@/sheep';
import useConfigStore from '@/chat-store/configStore.js';
@@ -189,6 +189,13 @@
city: userCity.value.t,
memberId: '',
});
// 评价
const rating = reactive({
scoreSc: 0, // 身材评分
scoreNx: 0, // 耐心评分
scoreSk: 0, // 爽快评分
scoreYq: 0, // 有趣评分
});
const photoListUrls = computed(() =>
userDetail.value.memberPhotoList
@@ -200,17 +207,20 @@
const { memberId } = options;
if (!memberId) return uni.showToast({ title: '参数错误', icon: 'none' });
params.memberId = memberId;
const { data = null } = await RecentApi.getRecentDetail({ id: memberId });
userDetail.value = data ?? {};
await getDetail();
// const instance: any = getCurrentInstance()?.proxy;
// const eventChannel = instance.getOpenerEventChannel();
// eventChannel.on('recentDetail', function (user: any) {
// userDetail.value = user;
// });
});
// 获取用户详情
const getDetail = async () => {
const { data = null } = await RecentApi.getRecentDetail({ id: params.memberId });
userDetail.value = data ?? {};
};
onMounted(() => {
refreshList();
});
@@ -310,23 +320,24 @@
// 拉黑 举报
async function actionSelect({ item, index }) {
if (index === 0) {
await RecentApi.recentOperate({
memberId: userDetail.value.member.memberId,
memberRecentId: userDetail.value.id,
action: 'MEMBER_SHIELD',
});
return;
}
if (index === 1) {
await RecentApi.recentOperate({
memberId: userDetail.value.member.memberId,
memberRecentId: userDetail.value.id,
action: 'MEMBER_REPORT',
reportType: '1',
});
return;
switch (index) {
case 0:
const { code } = await RecentApi.recentOperate({
memberId: userDetail.value.member.memberId,
action: 'MEMBER_SHIELD',
});
if (code === 0) {
uni.showToast({ title: '拉黑成功', icon: 'none' });
}
break;
case 1:
await RecentApi.recentOperate({
memberId: userDetail.value.member.memberId,
action: 'MEMBER_REPORT',
});
if (code === 0) {
uni.showToast({ title: '举报成功', icon: 'none' });
}
}
}
@@ -334,8 +345,24 @@
const handleLike = async () => {
await RecentApi.recentOperate({
memberId: userDetail.value.member.memberId,
memberRecentId: userDetail.value.id,
action: 'MEMBER_COLLECT',
});
await getDetail();
};
// 评价
const rate = async () => {
await RecentApi.recentOperate({
memberId: userDetail.value.member.memberId,
action: 'MEMBER_RATING',
...rating,
});
};
onHide(() => {
rate();
});
onUnload(() => {
rate();
});
</script>
+2
View File
@@ -224,6 +224,7 @@
closable
custom-style="height: 600rpx;overflow: hidden;"
safe-area-inset-bottom
@close="this.$refs.fileUpload.show()"
>
<view class="h-110rpx flex items-center justify-between px-3">
<view>礼物</view>
@@ -1180,6 +1181,7 @@
this.giftList = data?.filter((i) => i.status == '2') ?? [];
}
this.giftShow = true;
this.$refs.fileUpload.hide();
},
// 赠送礼物
giveGift(item) {
+379 -27
View File
@@ -1,58 +1,295 @@
<template>
<wd-config-provider theme="dark">
<wd-navbar title="实人认证" safeAreaInsetTop :bordered="false">
<wd-navbar
:title="userInfoStore.sex == 2 ? '魅力女生认证' : '精英男士认证'"
safeAreaInsetTop
:bordered="false"
>
<template #left>
<navigator open-type="navigateBack" hover-class="navigator-hover">
<uni-icons type="back" size="22" color="#D29E52" />
<uni-icons type="back" size="30" color="#D29E52" />
</navigator>
</template>
</wd-navbar>
<view class="flex-row-center mt-300rpx mb-200rpx">
<s-uploader
v-model:url="avatarImage"
fileMediatype="image"
limit="1"
mode="grid"
:imageStyles="{ width: '268rpx', height: '268rpx' }"
/>
<!-- v-if="userInfoStore.sex == 2" -->
<view v-if="false" class="py-6 h-[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-show="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"
>
<input
class="h-100rpx mx-8 my-4 rounded-50rpx bg-color-light px-40rpx text-32rpx text-color-theme"
:value="userinfo.height ? userinfo.height + 'cm' : ''"
type="text"
placeholder="请选择身高"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
/>
</wd-picker>
<wd-picker
v-model="userinfo.weight"
:columns="columnsWeight"
label="体重"
title="体重"
align-right
:default-value="60"
>
<input
class="h-100rpx mx-8 my-4 rounded-50rpx bg-color-light px-40rpx text-32rpx text-color-theme"
:value="userinfo.weight ? userinfo.weight + 'kg' : ''"
type="text"
placeholder="请选择体重"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
/>
</wd-picker>
<wd-picker
v-model="userinfo.occ"
:columns="columnsOcc"
label="从事职业"
title="从事职业"
align-right
>
<input
class="h-100rpx mx-8 my-4 rounded-50rpx bg-color-light px-40rpx text-32rpx text-color-theme"
:value="userinfo.occ"
type="text"
placeholder="请选择职业"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
/>
</wd-picker>
<textarea
class="h-200rpx mx-8 my-4 rounded-10rpx bg-color-light p-10rpx text-28rpx text-color-theme"
v-model="userinfo.description"
:maxlength="100"
placeholder="个人简介(100字以内)"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
/>
</view>
<view v-show="stepActive === 1">
<view class="text-xl my-2 mx-8 c-#FCFBFE">请上传3-5张最美的照片</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="5"
:max-size="3000000"
/>
</view>
</view>
<view v-show="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.wechatNum"
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' }"
/>
</view>
<view class="text-sm mx-8 text-color-theme">
请上传与上方微信匹配的微信二维码以便客服核实
</view>
<view class="text-sm mx-8 text-color-theme">匹配不通过将不会认证通过哦~</view>
</view>
<view v-show="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 justify-between items-center">
<s-uploader
class="flex-1"
v-model:url="girlAuthPic"
fileMediatype="image"
limit="1"
mode="grid"
:imageStyles="{ width: '268rpx', height: '268rpx' }"
/>
<view class="flex-1 text-sm mx-8 text-color-theme">确保本人头像,才能通过审核</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()"
>
<input
class="h-100rpx mx-8 my-4 rounded-50rpx bg-color-light px-40rpx text-32rpx text-color-theme"
:value="formatDate(userinfo.birthday, 'YYYY-MM-DD')"
type="text"
placeholder="请选择生日"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
/>
</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"
/>
<input
class="h-100rpx mx-8 my-4 rounded-50rpx bg-color-light px-40rpx text-32rpx text-color-theme"
value="位置权限 未允许"
type="text"
placeholder="位置权限"
placeholder-style="color: rgba(255, 255, 255, 0.6)"
disabled
/>
</view>
<view
v-if="stepActive < 3"
class="size-100rpx rounded-full mx-auto bg-color-light mt-6 text-center line-height-100rpx active:bg-color"
@click="stepActive++"
>
<uni-icons type="arrow-right" color="#D29E52" size="36" />
</view>
<view
v-else
class="mx-auto mt-6 w-200rpx rounded-full p-3 text-center bg-color-theme-dark active:bg-color-theme"
@click="girlFaceVerify"
>
开始认证
</view>
</view>
<view
class="mx-auto mt-30 w-200rpx rounded-full p-4 text-center bg-color-theme-dark active:bg-color-theme"
@click="faceVerify"
>
人脸认证
<!-- v-if="userInfoStore.sex == 1" -->
<view class="py-6 h-[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="boyAuthPic"
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="boyFaceVerify"
>
开始认证
</view>
<view class="text-sm mx-8 mt-6 text-color-theme text-center">
为保护您的隐私,您的信息只有认证过的女生可以看到,请放心认证
</view>
</view>
</wd-config-provider>
</template>
<script setup lang="ts">
// @ts-nocheck
import RecentApi from '@/sheep/api/member/recent';
import SUploader from '@/sheep/components/s-uploader/s-uploader.vue';
import { ref } from 'vue';
import { computed, reactive, ref } from 'vue';
import sheep from '@/sheep/index';
import { baseUrl, apiPath, tenantId } from '@/sheep/config';
import { getAccessToken } from '@/sheep/request';
import { formatDate } from '@/sheep/helper/utils';
const avatarImage = ref('');
const userInfoStore = computed(() => sheep.$store('user').userInfo);
const stepActive = ref(0);
const imageFileList = ref([]);
// 用户信息
const userinfo = reactive<any>({
avatar: '',
nickname: '',
birthday: '',
height: '',
weight: '',
occ: '',
description: '',
photo: [],
});
// 微信信息
const wxInfo = reactive({
wechatNum: '',
wechatQrCode: '',
});
const girlAuthPic = ref(''); // 认证图片 女
const boyAuthPic = ref(''); // 认证图片 男
const header = {
Accept: '*/*',
'tenant-id': tenantId,
Authorization: 'Bearer ' + getAccessToken(),
};
// 人脸认证 女
const girlFaceVerify = async () => {
// #ifndef APP-PLUS
uni.showToast({ title: '当前设备不支持', icon: 'error' });
// #endif
const faceVerify = async () => {
// #ifdef APP-PLUS
const aliyunVerify = uni.requireNativePlugin('AP-FaceDetectModule');
let metaInfo = aliyunVerify.getMetaInfo();
metaInfo = JSON.stringify(metaInfo);
const metaInfo = JSON.stringify(aliyunVerify.getMetaInfo());
let p = uni.getSystemInfoSync().platform;
if (p === 'ios') {
}
console.log('参数:', {
authPic: avatarImage.value,
authPic: girlAuthPic.value,
metaInfoJson: metaInfo,
});
const { code, data } = await RecentApi.createManFaceVerify({
authPic: avatarImage.value,
metaInfoJson: metaInfo,
});
console.log('创建人脸认证response:', data);
// const { code, data } = await RecentApi.createGirlFaceVerify({
// authPic: girlAuthPic.value,
// metaInfoJson: metaInfo,
// });
// console.log('创建人脸认证response:', data);
// aliyunVerify.verify(
// {
@@ -61,12 +298,127 @@
// },
// function (response: any) {
// console.log(response);
// uni.navigateBack();
// },
// );
// #endif
};
// 人脸认证 男
const boyFaceVerify = async () => {
// #ifndef APP-PLUS
uni.showToast({ title: '当前设备不支持' });
uni.showToast({ title: '当前设备不支持', icon: 'error' });
// #endif
// #ifdef APP-PLUS
if (!boyAuthPic.value) return uni.showToast({ title: '请先上传人脸照片', icon: 'error' });
const aliyunVerify = uni.requireNativePlugin('AP-FaceDetectModule');
const metaInfo = JSON.stringify(aliyunVerify.getMetaInfo());
console.log('参数:', {
authPic: boyAuthPic.value,
metaInfoJson: metaInfo,
});
// 查询用户人脸认证
const { code, data } = await RecentApi.getFaceVerify();
if (code === 0) {
const { bizId: certifyId } = data;
verify(certifyId);
} else {
// 创建人脸认证
const {
code,
data: { bizId },
} = await RecentApi.createBoyFaceVerify({
authPic: boyAuthPic.value,
metaInfoJson: metaInfo,
});
if (code === 0) {
console.log('创建人脸认证接口response:', data);
verify(bizId);
}
}
// #endif
};
const verify = (certifyId: string) => {
if (!certifyId) return uni.showToast({ title: 'certifyId不存在', icon: 'none' });
const p = uni.getSystemInfoSync().platform;
if (p === 'ios') {
}
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:
uni.showToast({ title: '您已认证成功', icon: 'none' });
break;
case 1001:
uni.showToast({ title: '系统错误', icon: 'none' });
break;
case 1003:
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' });
}
},
);
};
</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>
+9 -1
View File
@@ -14,7 +14,15 @@
</view>
<view class="text-base mx-4 my-2">图片</view>
<view class="px-4">
<s-uploader v-model:url="params.pic" fileMediatype="image" limit="1" mode="grid" />
<s-uploader
v-model:url="params.pic"
fileMediatype="image"
limit="1"
mode="grid"
:imageStyles="{
border: { width: '6rpx', color: '#D29E52' },
}"
/>
</view>
<view
v-if="!isSubmit"
+1 -1
View File
@@ -8,7 +8,7 @@
</template>
<template #right>
<navigator url="/pages/moments/publish" open-type="navigate" hover-class="navigator-hover">
<view class="bg-color-theme px-3 py-1 rounded-full c-black h-1/2 line-height-normal">
<view class="bg-color-theme px-2 py-1 rounded-full c-black h-44rpx text-sm">
发布动态
</view>
</navigator>
+13 -1
View File
@@ -351,7 +351,7 @@ const RecentApi = {
});
},
// 创建男性人脸认证
createManFaceVerify: (data: any) => {
createBoyFaceVerify: (data: any) => {
return request({
url: '/member/com-auth/create-man-auth',
method: 'POST',
@@ -362,6 +362,18 @@ const RecentApi = {
},
});
},
// 查询用户人脸认证
getFaceVerify: (params: any) => {
return request({
url: '/member/com-auth/get',
method: 'GET',
params,
custom: {
showLoading: true,
loadingMsg: '加载中',
},
});
},
};
export default RecentApi;
@@ -53,12 +53,12 @@
</view>
<view class="mb-4 flex items-center pl-130rpx text-xs text-white/70">
<uni-icons type="location" size="16" color="#B5B4BC"></uni-icons>
<text> {{ data.issueCity }} · {{ data.distance.toFixed(2) }}km </text>
<text> {{ data.issueCity }} · {{ data.distance?.toFixed(2) || 0 }}km </text>
</view>
<view class="flex gap-60rpx pl-130rpx text-white">
<view class="flex items-center gap-10rpx text-sm">
<uni-icons
v-if="isLike"
v-if="isLike || data.operationStatus?.isLike"
type="heart-filled"
size="22"
color="#D29E52"
@@ -108,16 +108,6 @@
// RECENT_LIKE-朋友圈-点赞
// RECENT_SHIELD-朋友圈-屏蔽
// RECENT_REPORT-朋友圈-举报
// reportType: '1', // 举报类型
// MEMBER_COLLECT-用户-收藏
// MEMBER_SHIELD-用户-屏蔽
// MEMBER_REPORT-用户-举报
// MEMBER_RATING-用户-评价
// scoreSc: 0, // 身材评分
// scoreNx: 0, // 耐心评分
// scoreSk: 0, // 爽快评分
// scoreYq: 0, // 有趣评分
});
// 图片预览
@@ -657,8 +657,8 @@
justify-content: center;
}
.add-icon {
width: 57rpx;
height: 49rpx;
width: 100rpx;
height: 100rpx;
}
.file-subtitle {
position: absolute;
@@ -221,7 +221,7 @@
bottom: 0;
left: 0;
margin: 5px;
border: 1px #eee solid;
border: 1px #d29e52 solid;
border-radius: 5px;
overflow: hidden;
}
@@ -292,7 +292,7 @@
height: 26px;
width: 26px;
border-radius: 50%;
background-color: rgba(0, 0, 0, 0.5);
background-color: #d29e52;
z-index: 2;
transform: rotate(-45deg);
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 709 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB