feat:设置微信;人脸识别页;相册上传修改;样式小调整

This commit is contained in:
ctw committed 2025-11-29 14:50:42 +08:00
1 parent 158d012eff
commit 4fc92459a0
19 files changed
+527 -376

No files matched your search

+243 -228
View File
@@ -1,239 +1,254 @@
{
"name": "荷塘月色",
"appid": "__UNI__5B53E65",
"description": "聊天交友app",
"versionName": "2025.10",
"versionCode": 0,
"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" : "2025.10",
"versionCode" : 0,
"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"
}
},
"modules" : {
"Payment" : {},
"Share" : {},
"VideoPlayer" : {},
"OAuth" : {},
"Camera" : {},
"Geolocation" : {}
},
"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\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_MOCK_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.GET_TASKS\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.READ_SMS\"/>",
"<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>",
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
"<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
"<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SMS\"/>",
"<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\"/>"
],
"minSdkVersion" : 21,
"schemes" : "shopro",
"excludePermissions" : [
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>"
]
},
"ios" : {
"urlschemewhitelist" : [ "baidumap", "iosamap" ],
"dSYMs" : false,
"privacyDescription" : {
"NSPhotoLibraryUsageDescription" : "需要同意访问您的相册选取图片才能完善该条目",
"NSPhotoLibraryAddUsageDescription" : "需要同意访问您的相册才能保存该图片",
"NSCameraUsageDescription" : "需要同意访问您的摄像头拍摄照片才能完善该条目",
"NSUserTrackingUsageDescription" : "开启追踪并不会获取您在其它站点的隐私信息,该行为仅用于标识设备,保障服务安全和提升浏览体验"
},
"urltypes" : "shopro",
"capabilities" : {
"entitlements" : {
"com.apple.developer.associated-domains" : [ "applinks:shopro.sheepjs.com" ]
}
},
"idfa" : true
},
"sdkConfigs" : {
"speech" : {},
"ad" : {},
"oauth" : {
"apple" : {},
"weixin" : {
"appid" : "wxae7a0c156da9383b",
"UniversalLinks" : "https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
}
},
"payment" : {
"weixin" : {
"__platform__" : [ "ios", "android" ],
"appid" : "wxae7a0c156da9383b",
"UniversalLinks" : "https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
},
"alipay" : {
"__platform__" : [ "ios", "android" ]
}
},
"share" : {
"weixin" : {
"appid" : "wxae7a0c156da9383b",
"UniversalLinks" : "https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
}
},
"maps" : {},
"geolocation" : {
"system" : {
"__platform__" : [ "ios", "android" ]
}
}
},
"orientation" : [ "portrait-primary" ],
"splashscreen" : {
"androidStyle" : "default",
"iosStyle" : "common",
"useOriginalMsgbox" : true,
"android" : {
"hdpi" : "C:/Users/20513/Pictures/login-bg.png",
"xhdpi" : "C:/Users/20513/Pictures/login-bg.png",
"xxhdpi" : "C:/Users/20513/Pictures/login-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"
},
"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"
}
}
}
},
"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" : {}
}
}
}
},
"safearea": {
"bottom": {
"offset": "none"
}
},
"modules": {
"Payment": {},
"Share": {},
"VideoPlayer": {},
"OAuth": {},
"Camera": {},
"Geolocation": {}
},
"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\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_MOCK_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.GET_TASKS\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.READ_SMS\"/>",
"<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>",
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
"<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
"<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SMS\"/>",
"<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\"/>"
],
"minSdkVersion": 21,
"schemes": "shopro",
"excludePermissions": [
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>"
"quickapp" : {},
"quickapp-native" : {
"icon" : "/static/logo.png",
"package" : "com.example.demo",
"features" : [
{
"name" : "system.clipboard"
}
]
},
"ios": {
"urlschemewhitelist": ["baidumap", "iosamap"],
"dSYMs": false,
"privacyDescription": {
"NSPhotoLibraryUsageDescription": "需要同意访问您的相册选取图片才能完善该条目",
"NSPhotoLibraryAddUsageDescription": "需要同意访问您的相册才能保存该图片",
"NSCameraUsageDescription": "需要同意访问您的摄像头拍摄照片才能完善该条目",
"NSUserTrackingUsageDescription": "开启追踪并不会获取您在其它站点的隐私信息,该行为仅用于标识设备,保障服务安全和提升浏览体验"
},
"quickapp-webview" : {
"icon" : "/static/logo.png",
"package" : "com.example.demo",
"minPlatformVersion" : 1070,
"versionName" : "1.0.0",
"versionCode" : 100
},
"mp-weixin" : {
"appid" : "wx66186af0759f47c9",
"setting" : {
"urlCheck" : false,
"minified" : true,
"postcss" : true
},
"urltypes": "shopro",
"capabilities": {
"entitlements": {
"com.apple.developer.associated-domains": ["applinks:shopro.sheepjs.com"]
}
"optimization" : {
"subPackages" : true
},
"idfa": true
},
"sdkConfigs": {
"speech": {},
"ad": {},
"oauth": {
"apple": {},
"weixin": {
"appid": "wxae7a0c156da9383b",
"UniversalLinks": "https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
}
"plugins" : {},
"lazyCodeLoading" : "requiredComponents",
"usingComponents" : {},
"permission" : {},
"requiredPrivateInfos" : [ "chooseAddress" ]
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"mp-jd" : {
"usingComponents" : true
},
"h5" : {
"darkmode" : true,
"template" : "index.html",
"router" : {
"mode" : "history",
"base" : "/"
},
"payment": {
"weixin": {
"__platform__": ["ios", "android"],
"appid": "wxae7a0c156da9383b",
"UniversalLinks": "https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
},
"alipay": {
"__platform__": ["ios", "android"]
}
"sdkConfigs" : {
"maps" : {}
},
"share": {
"weixin": {
"appid": "wxae7a0c156da9383b",
"UniversalLinks": "https://shopro.sheepjs.com/uni-universallinks/__UNI__082C0BA/"
}
"async" : {
"timeout" : 20000
},
"maps": {},
"geolocation": {
"system": {
"__platform__": ["ios", "android"]
}
"title" : "聊天交友",
"optimization" : {
"treeShaking" : {
"enable" : true
}
}
},
"orientation": ["portrait-primary"],
"splashscreen": {
"androidStyle": "default",
"iosStyle": "common",
"useOriginalMsgbox": true,
"android": {
"hdpi": "C:/Users/20513/Pictures/login-bg.png",
"xhdpi": "C:/Users/20513/Pictures/login-bg.png",
"xxhdpi": "C:/Users/20513/Pictures/login-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"
},
"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"
}
}
}
},
"nativePlugins": {}
},
"quickapp": {},
"quickapp-native": {
"icon": "/static/logo.png",
"package": "com.example.demo",
"features": [
{
"name": "system.clipboard"
}
]
},
"quickapp-webview": {
"icon": "/static/logo.png",
"package": "com.example.demo",
"minPlatformVersion": 1070,
"versionName": "1.0.0",
"versionCode": 100
},
"mp-weixin": {
"appid": "wx66186af0759f47c9",
"setting": {
"urlCheck": false,
"minified": true,
"postcss": true
},
"optimization": {
"subPackages": true
},
"plugins": {},
"lazyCodeLoading": "requiredComponents",
"usingComponents": {},
"permission": {},
"requiredPrivateInfos": ["chooseAddress"]
},
"mp-alipay": {
"usingComponents": true
},
"mp-baidu": {
"usingComponents": true
},
"mp-toutiao": {
"usingComponents": true
},
"mp-jd": {
"usingComponents": true
},
"h5": {
"darkmode": true,
"template": "index.html",
"router": {
"mode": "history",
"base": "/"
},
"sdkConfigs": {
"maps": {}
},
"async": {
"timeout": 20000
},
"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"
}
+14
View File
@@ -226,6 +226,13 @@
"navigationStyle": "custom"
}
},
{
"path": "face-verify",
"style": {
"navigationBarTitleText": "人脸认证",
"navigationStyle": "custom"
}
},
{
"path": "recharge",
"style": {
@@ -247,6 +254,13 @@
"navigationStyle": "custom"
}
},
{
"path": "set-wechat",
"style": {
"navigationBarTitleText": "设置微信",
"navigationStyle": "custom"
}
},
{
"path": "about",
"style": {
+1 -6
View File
@@ -4,7 +4,6 @@
:loadMoreStatus="loadMoreStatus"
@refresh="refreshList"
@loadMore="listLoadMore"
@scroll="scroll"
:scroll-top="scrollTop"
>
<view v-if="isRefreshing" class="py-2 px-4" v-for="index in 4" :key="index">
@@ -49,7 +48,7 @@
scene: string;
}>();
const scrollTop = ref(0);
const scrollTop = ref(1);
const userCity = computed(() => sheep.$store('user').userCity);
const params = reactive({
scene: props.scene,
@@ -75,10 +74,6 @@
},
);
const scroll = (e: any) => {
scrollTop.value = e.detail.scrollTop;
};
const detail = (user: any) => {
uni.navigateTo({
url: `/pages/home/detail?memberId=${user.memberId}`,
+2 -1
View File
@@ -15,7 +15,8 @@
<template #right>
<view class="flex items-center">
<view class="py-1 px-2 text-xs bg-color-theme-dark rounded-full mr-3">
{{ userDetail.member?.memberCity || userDetail.issueCity }}
{{ userDetail.member?.memberCity ? userDetail.member?.memberCity + ' · ' : '' }}
{{ userDetail.distance?.toFixed(2) }}km
</view>
<uni-icons type="more-filled" size="28" color="#ffcd32"></uni-icons>
</view>
@@ -4,7 +4,6 @@
:loadMoreStatus="loadMoreStatus"
@refresh="refreshList"
@loadMore="listLoadMore"
@scroll="scroll"
:scroll-top="scrollTop"
>
<swiper
@@ -60,7 +59,7 @@
scene: string;
}>();
const scrollTop = ref(0);
const scrollTop = ref(1);
const userCity = computed(() => sheep.$store('user').userCity);
const params = reactive({
scene: props.scene,
@@ -86,10 +85,6 @@
},
);
const scroll = (e: any) => {
scrollTop.value = e.detail.scrollTop;
};
// 查看用户详情
const goDetail = (user: any) => {
uni.navigateTo({
+4 -9
View File
@@ -16,10 +16,10 @@
</template>
</wd-navbar>
<scroll-view scroll-y style="height: calc(100dvh - 44px)">
<scroll-view scroll-y style="height: calc(100dvh - 88px)">
<wd-textarea v-model="params.description" :maxlength="1000" clearable show-word-limit />
<wd-tabs v-model="activeTab">
<wd-tab title="发图片">
<wd-tab title="发图文">
<view class="px-4 py-8">
<wd-upload
v-model:file-list="params.coverPic"
@@ -33,7 +33,7 @@
/>
</view>
</wd-tab>
<wd-tab title="发视频">
<wd-tab v-if="false" title="发视频">
<view class="px-4 py-8">
<wd-upload
v-model:file-list="params.coverVideo"
@@ -58,10 +58,6 @@
:column-change="columnChange"
@confirm="areaPickerConfirm"
/>
<wd-cell title="详细地址" vertical>
<wd-input v-model.trim="params.issueAddress" :maxlength="20" show-word-limit />
</wd-cell>
<view class="h-100" />
</scroll-view>
</wd-config-provider>
</template>
@@ -90,7 +86,6 @@
issueProvince: '',
issueCity: '',
issueDistrict: '',
issueAddress: '',
});
const coverPic = computed(() => {
return params.coverPic.map((item: any) => JSON.parse(item.response).data);
@@ -161,7 +156,7 @@
// 发布朋友圈
const publishMoments = async () => {
if (!params.description || !params.issueProvince || !params.issueAddress)
if (!params.description || !params.issueProvince)
return uni.showToast({ title: '请填写内容', icon: 'error' });
if (!params.coverPic || !params.coverPic.length)
return uni.showToast({ title: '请上传图片', icon: 'error' });
+9 -9
View File
@@ -10,7 +10,7 @@
<scroll-view style="height: calc(100dvh - 88px)" scroll-y>
<view
class="mx-4 p-4 rounded-2 bg-#000 b-4 b-solid b-t-#ffcd32/80 b-l-#ffcd32/60 b-r-#ffcd32/60 b-b-#ffcd32/40"
class="mx-4 p-4 rounded-2 bg-gradient-to-b from-#111 to-#222 b-4 b-solid b-t-#ffcd32/60 b-l-#ffcd32/40 b-r-#ffcd32/40 b-b-#ffcd32/20"
>
<view class="text-color-theme-dark font-900 font-italic text-xl mb-1">VIP</view>
<view class="flex-col-center mb-4">
@@ -26,7 +26,7 @@
<scroll-view scroll-x class="w-full" :show-scrollbar="false">
<view class="flex">
<view
v-for="(item, index) in openTypeList"
v-for="item in openTypeList"
:key="item.id"
class="mr-3 ml-1 my-1"
@click="curOpenTypeId = item.id"
@@ -40,9 +40,9 @@
]"
>
<view class="mt-2 text-sm text-#ffffff">{{ item.title }}</view>
<view class="mt-1 text-lg font-900 text-color-theme-dark"
>¥{{ fen2yuan(item.preferentialPrice) }}</view
>
<view class="mt-1 text-lg font-900 text-color-theme-dark">
¥{{ fen2yuan(item.preferentialPrice) }}
</view>
<view class="mt-1 text-sm line-through text-gray">
¥{{ fen2yuan(item.originalPrice) }}
</view>
@@ -80,13 +80,13 @@
<!-- 协议 -->
<view class="mt-4 px-4 text-xs text-gray leading-relaxed text-center">
开通即视为同意
<text class="text-color-theme-dark">《VIP会员服务协议》</text>
<text class="text-color-theme-dark">《VIP会员协议》</text>
和
<text class="text-color-theme-dark">《自动续费协议》</text>
<text class="text-color-theme-dark">《会员充值协议》</text>
</view>
<!-- v-if="openTypeList?.length" -->
<view
v-if="openTypeList.length"
class="mt-4 w-2/3 mx-auto py-2 text-center rounded-full bg-color-theme-dark text-black text-sm active:bg-color-theme"
@click="handleOpenVip"
>
@@ -142,7 +142,7 @@
{ title: '专属身份标识', desc: '昵称后展示 VIP 标识,提升可信度' },
];
const payMethod = ref<'alipay' | 'wechat'>('alipay'); // 支付方式:alipay / wechat
const openTypeList = ref<OpenTypeItem[]>(); // 会员类型列表
const openTypeList = ref<OpenTypeItem[]>([]); // 会员类型列表
const curOpenTypeId = ref<number>(); // 当前选择的会员类型id
const currentOpenType = computed<OpenTypeItem | undefined>(() =>
openTypeList.value?.find((item) => item.id === curOpenTypeId.value),
+1 -1
View File
@@ -9,7 +9,7 @@
hover-class="navigator-hover"
>
<wd-icon name="add-circle1" size="18px" />
<text class="text-28rpx">上传相册</text>
<text class="text-28rpx ml-1">上传相册</text>
</navigator>
</view>
+37
View File
@@ -0,0 +1,37 @@
<template>
<wd-config-provider theme="dark">
<wd-navbar title="实人认证" safeAreaInsetTop :bordered="false">
<template #left>
<navigator open-type="navigateBack" hover-class="navigator-hover">
<uni-icons type="back" size="22" color="#ffcd32" />
</navigator>
</template>
</wd-navbar>
<view class="bg-color-theme-dark" @click="faceVerify">人脸认证</view>
</wd-config-provider>
</template>
<script setup lang="ts">
const faceVerify = () => {
// #ifdef APP-PLUS
const aliyunVerify = uni.requireNativePlugin('AP-FaceDetectModule');
let metaInfo = aliyunVerify.getMetaInfo();
let p = uni.getSystemInfoSync().platform;
if (p === 'ios') {
metaInfo = JSON.stringify(metaInfo);
}
console.log('metaInfo', metaInfo);
aliyunVerify.verify(
{
certifyId: '<替换生成的certifyId>',
extParams: { '<扩展参数key>': '<扩展参数value>' },
},
function (response: any) {
console.log(response);
},
);
// #endif
};
</script>
+1 -1
View File
@@ -1,6 +1,6 @@
<template>
<wd-config-provider theme="dark" :theme-vars="themeVars">
<wd-navbar title="发布动态" safeAreaInsetTop :bordered="false">
<wd-navbar title="问题反馈" safeAreaInsetTop :bordered="false">
<template #left>
<navigator open-type="navigateBack" hover-class="navigator-hover">
<uni-icons type="back" size="30" color="#ffcd32"></uni-icons>
+9 -9
View File
@@ -39,25 +39,25 @@
<view class="flex justify-around my-4 text-base">
<view class="flex flex-col items-center" @click="goLike(0)">
<text class="text-color-theme font-600 text-lg">{{ recentTotal.likeItTotal }}</text>
<text class="text-color-theme text-xs">我喜欢</text>
<text class="text-color-theme text-sm">我喜欢</text>
</view>
<view class="flex flex-col items-center" @click="goLike(1)">
<text class="text-color-theme font-600 text-lg">{{ recentTotal.likeMeTotal }}</text>
<text class="text-color-theme text-xs">喜欢我</text>
<text class="text-color-theme text-sm">喜欢我</text>
</view>
<navigator url="/pages/profile/recharge" open-type="navigate" hover-class="navigator-hover">
<view class="flex flex-col items-center">
<text class="text-color-theme font-600 text-lg">{{ fen2yuan(wallet.balance) }}</text>
<text class="text-color-theme text-xs">钱包</text>
<text class="text-color-theme text-sm">钱包</text>
</view>
</navigator>
</view>
<!-- 开通vip -->
<view
class="text-color-theme-dark mx-4 p-3 rounded-2 bg-#000 b-4 b-solid b-t-#ffcd32/80 b-l-#ffcd32/60 b-r-#ffcd32/60 b-b-#ffcd32/40 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-#ffcd32/60 b-l-#ffcd32/40 b-r-#ffcd32/40 b-b-#ffcd32/20 flex justify-between"
>
<view class="font-900 font-italic text-lg">VIP</view>
<view class="font-900 font-italic text-xl">VIP</view>
<view class="flex items-center">
<text class="text-xs">尊享vip免费特权</text>
<navigator
@@ -65,7 +65,7 @@
open-type="navigate"
hover-class="navigator-hover"
>
<text class="ml-2 px-2 py-1 rounded-full text-sm bg-color-theme text-black">
<text class="ml-4 px-4 py-1 rounded-full text-24rpx bg-color-theme text-black">
立即开通
</text>
</navigator>
@@ -220,11 +220,11 @@
const MenuCellList = [
{ title: '我的收益', value: '', icon: 'wallet', to: '' },
{ title: '访客记录', value: '', icon: 'dong', to: '/pages/profile/view-record' },
{ title: '认证中心', value: '', icon: 'user', to: '' },
{ title: '认证中心', value: '', icon: 'user', to: '/pages/profile/face-verify' },
{ title: '我的动态', value: '', icon: 'star', to: '/pages/profile/my-moment' },
{ title: '我的评价', value: '', icon: 'view-module', to: '', click: lookMyEvaluation },
{ title: '问题反馈', value: '', icon: 'backtop-rectangle', to: '', click: goFeedback },
{ title: '客服助手', value: '', icon: 'service', to: '' },
{ title: '问题反馈√', value: '', icon: 'backtop-rectangle', to: '', click: goFeedback },
// { title: '客服助手', value: '', icon: 'service', to: '' },
{ title: '关注公众号√', value: '获取最新消息', icon: 'qrcode', to: '', click: subOfficial },
{ title: '设置√', value: '', icon: 'setting1', to: '/pages/profile/setting' },
];
+2 -1
View File
@@ -10,7 +10,7 @@
<scroll-view style="height: calc(100dvh - 88px)" scroll-y>
<view
class="mx-4 p-4 rounded-2 bg-#000 b-4 b-solid b-t-#ffcd32/80 b-l-#ffcd32/60 b-r-#ffcd32/60 b-b-#ffcd32/40"
class="mx-4 p-4 rounded-2 bg-gradient-to-b from-#111 to-#222 b-4 b-solid b-t-#ffcd32/60 b-l-#ffcd32/40 b-r-#ffcd32/40 b-b-#ffcd32/20"
>
<view class="text-color-theme-dark font-900 font-italic text-xl mb-1">VIP</view>
<view class="flex-col-center mb-4">
@@ -129,6 +129,7 @@
const { code } = await RecentApi.walletRecharge({ packageId: item.id });
if (code !== 0) return uni.showToast({ title: '购买失败', icon: 'fail' });
uni.showToast({ title: '购买成功', icon: 'success' });
await getWallet();
})
.catch(() => {});
};
+55
View File
@@ -0,0 +1,55 @@
<template>
<wd-config-provider theme="dark" :theme-vars="themeVars">
<wd-navbar title="设置微信" safeAreaInsetTop :bordered="false">
<template #left>
<navigator open-type="navigateBack" hover-class="navigator-hover">
<uni-icons type="back" size="30" color="#ffcd32"></uni-icons>
</navigator>
</template>
</wd-navbar>
<view class="text-base mx-4 my-2">微信号</view>
<view class="mx-4 rounded-3">
<wd-input
v-model.trim="params.wechatNum"
placeholder="填写我的微信号"
clearable
:maxlength="20"
:focus="true"
/>
</view>
<view class="text-base mx-4 my-2">上传我的微信二维码</view>
<view class="px-4">
<s-uploader v-model:url="params.wechatQrCode" fileMediatype="image" limit="1" mode="grid" />
</view>
<view
class="mt-80rpx w-1/3 mx-auto rounded-full bg-color-theme-dark text-base text-center py-2 active:bg-color-theme"
@click="saveWeChat"
>
保 存
</view>
</wd-config-provider>
</template>
<script setup lang="ts">
import RecentApi from '@/sheep/api/member/recent';
import { reactive, ref } from 'vue';
const themeVars = reactive({
darkBackground2: '#333',
});
const params = reactive({
wechatNum: '',
wechatQrCode: '',
});
const saveWeChat = async () => {
if (!params.wechatNum || !params.wechatQrCode)
return uni.showToast({ title: '请填写内容', icon: 'error' });
const { code } = await RecentApi.updateWeChatInfo(params);
if (code !== 0) return;
uni.showToast({ title: '保存成功', icon: 'success' });
uni.navigateBack();
};
</script>
+41 -15
View File
@@ -8,19 +8,44 @@
</template>
</wd-navbar>
<wd-cell title="消息推送" value="消息推送" ellipsis>
<wd-switch v-model="params.isPush" inactive-color="#777" @change="change" size="20" />
</wd-cell>
<wd-cell title="首页隐身" value="首页隐身" ellipsis>
<wd-switch v-model="params.homeHide" inactive-color="#777" @change="change" size="20" />
</wd-cell>
<wd-cell title="隐私保护" value="隐私保护" ellipsis>
<wd-switch v-model="params.privacySecure" inactive-color="#777" @change="change" size="20" />
</wd-cell>
<wd-cell title="短信通知" value="短信通知" ellipsis>
<wd-switch v-model="params.shortNote" inactive-color="#777" @change="change" size="20" />
</wd-cell>
<wd-cell title="关于" value="" is-link ellipsis to="/pages/profile/about" />
<wd-cell-group>
<wd-cell title="手机号" :value="mobile" />
<wd-cell title="设置微信" is-link ellipsis to="/pages/profile/set-wechat" />
<wd-cell title="客服邮箱" value="1@1.com" is-link ellipsis />
<wd-cell title="消息推送" value="消息推送" ellipsis>
<wd-switch
v-model="params.isPush"
inactive-color="#777"
@change="settingChange"
size="20"
/>
</wd-cell>
<wd-cell title="首页隐身" value="首页隐身" ellipsis>
<wd-switch
v-model="params.homeHide"
inactive-color="#777"
@change="settingChange"
size="20"
/>
</wd-cell>
<wd-cell title="隐私保护" value="隐私保护" ellipsis>
<wd-switch
v-model="params.privacySecure"
inactive-color="#777"
@change="settingChange"
size="20"
/>
</wd-cell>
<wd-cell title="短信通知" value="短信通知" ellipsis>
<wd-switch
v-model="params.shortNote"
inactive-color="#777"
@change="settingChange"
size="20"
/>
</wd-cell>
<wd-cell title="关于应用" value="" is-link ellipsis to="/pages/profile/about" />
</wd-cell-group>
<view
class="mt-40rpx rounded-full bg-color-theme-dark text-base text-center py-2 mx-8 active:bg-color-theme"
@@ -35,7 +60,7 @@
<script setup lang="ts">
import RecentApi from '@/sheep/api/member/recent';
import { onLoad } from '@dcloudio/uni-app';
import { reactive } from 'vue';
import { computed, reactive } from 'vue';
import { useMessage } from '@/uni_modules/wot-design-uni';
// @ts-ignore
import sheep from '@/sheep';
@@ -48,6 +73,7 @@
privacySecure: true,
shortNote: true,
});
const mobile = computed(() => sheep.$store('user').userInfo?.mobile);
onLoad(async () => {
const { code, data } = await RecentApi.getSetting();
@@ -58,7 +84,7 @@
params.shortNote = data.shortNote;
});
const change = async () => {
const settingChange = async () => {
await RecentApi.updateSetting(params);
};
+34 -53
View File
@@ -10,33 +10,19 @@
<view class="mx-5 my-3 flex justify-between text-color-theme">
<text>图片</text>
<text>{{ imageFileList?.length || 0 }}/10</text>
<text>{{ imageFileList?.length || 0 }}/20</text>
</view>
<view class="px-4">
<wd-upload
v-model:file-list="imageFileList"
:action="baseUrl + apiPath + '/infra/file/upload'"
:header="header"
image-mode="aspectFill"
:upload-method="customUpload"
accept="image"
multiple
:limit="10"
:max-size="500000"
:before-remove="beforeRemove"
/>
</view>
<view class="mx-5 my-3 flex justify-between text-color-theme">
<text>视频</text>
<text>{{ videoFileList?.length || 0 }}/10</text>
</view>
<view class="px-4">
<wd-upload
v-model:file-list="videoFileList"
image-mode="aspectFill"
:upload-method="customUpload"
accept="video"
multiple
:limit="10"
:max-size="2000000"
:limit="20"
:max-size="3000000"
@success="uploadSuccess"
:before-remove="beforeRemove"
/>
</view>
@@ -47,19 +33,25 @@
</template>
<script setup lang="ts">
import { computed, ref, watch } from 'vue';
import { ref, watch } from 'vue';
import useAblum from './use-ablum';
import type {
UploadFile,
UploadMethod,
} from '@/uni_modules/wot-design-uni/components/wd-upload/types';
// @ts-ignore
import FileApi from '@/sheep/api/infra/file';
import type { UploadFile } from '@/uni_modules/wot-design-uni/components/wd-upload/types';
import { useMessage, useToast } from '@/uni_modules/wot-design-uni';
// @ts-ignore
import { baseUrl, apiPath, tenantId } from '@/sheep/config';
// @ts-ignore
import { getAccessToken } from '@/sheep/request';
import RecentApi from '@/sheep/api/member/recent';
const header = {
Accept: '*/*',
'tenant-id': tenantId,
Authorization: 'Bearer ' + getAccessToken(),
};
const messageBox = useMessage();
const toast = useToast();
const { ablumList } = useAblum();
const { ablumList, getUserAlbum } = useAblum();
const imageFileList = ref<UploadFile[]>([]);
const videoFileList = ref<UploadFile[]>([]);
@@ -67,47 +59,36 @@
watch(
() => ablumList.value,
(val) => {
imageFileList.value = val
.filter((item) => item.resourceType === '1')
.map((item) => ({ url: item.address, id: item.id }));
videoFileList.value = val
.filter((item) => item.resourceType === 'VIDEO')
.map((item) => ({ url: item.address, id: item.id }));
imageFileList.value = val.map((item) => ({ url: item.address, id: item.id }));
},
{ immediate: true },
);
const customUpload: UploadMethod = async (file, formData, options) => {
const { code, data, msg } = await FileApi.uploadFile(file.url);
if (code !== 0) {
return options.onError(msg, file, formData);
}
options.onSuccess(data, file, formData);
const uploadSuccess = async ({ file }: any) => {
await RecentApi.saveUserAlbum({
address: JSON.parse(file.response).data,
resourceType: 'IMAGE',
});
await getUserAlbum();
};
// 移除确认
const beforeRemove = ({ file, fileList, resolve }: any) => {
console.log(file, fileList, resolve);
messageBox
.confirm({
msg: '是否移除',
title: '提示',
})
.then(() => {
toast.success('移除成功');
resolve(true);
.then(async () => {
const { code } = await RecentApi.deleteUserAlbum(file.id);
if (code === 0) {
resolve(true);
return toast.success('移除成功');
}
toast.error('移除失败');
})
.catch(() => {
// toast.show('取消删除操作');
});
resolve(true);
};
const images = computed(() => {
return imageFileList.value.map((item) => ({ address: item.url, resourceType: 'IMAGE' }));
});
const videos = computed(() => {
return imageFileList.value.map((item) => ({ address: item.url, resourceType: 'VIDEO' }));
});
</script>
+5 -1
View File
@@ -7,7 +7,11 @@ export default function useAblum() {
// 获取用户相册
const getUserAlbum = async () => {
const { data = null } = await RecentApi.getUserAlbum({ pageNo: 1, pageSize: 20 });
const { data = null } = await RecentApi.getUserAlbum({
pageNo: 1,
pageSize: 20,
resourceType: 'IMAGE',
});
ablumList.value = data.list ?? [];
};
+16 -4
View File
@@ -150,7 +150,7 @@ const RecentApi = {
},
});
},
// 保存用户相册
// 保存用户相册单个照片资源
saveUserAlbum: (data: any) => {
return request({
url: '/member/photo/upload',
@@ -162,15 +162,15 @@ const RecentApi = {
},
});
},
// 移除用户相册
// 删除用户相册单个照片
deleteUserAlbum: (id: any) => {
return request({
url: '/member/photo/delete',
method: 'GET',
method: 'DELETE',
params: { id },
custom: {
showLoading: true,
loadingMsg: '操作中',
loadingMsg: '删除中',
},
});
},
@@ -290,6 +290,18 @@ const RecentApi = {
},
});
},
// 更新用户设置
updateWeChatInfo: (data: any) => {
return request({
url: '/member/user/update-wechat',
method: 'PUT',
data,
custom: {
showLoading: true,
loadingMsg: '保存中',
},
});
},
};
export default RecentApi;
@@ -3,21 +3,25 @@
<view class="mb-1 flex items-center" @click="detail">
<image
:src="member.memberAvatar"
class="mr-3 size-100rpx rounded-full bg-#333333"
class="mr-3 size-120rpx rounded-full bg-#333333"
mode="aspectFill"
/>
<view class="flex-1">
<view class="flex-1 overflow-hidden">
<view class="flex justify-between items-center">
<view class="flex items-center">
<text class="mr-4 text-base">{{ member?.memberNickname }}</text>
<view
class="inline-flex items-center px-1 text-20rpx text-black rounded-1 bg-color-theme-dark"
>
<wd-icon name="discount-filled" size="12px" color="#000"></wd-icon>
<text>真人认证</text>
</view>
<text class="text-base truncate">{{ member?.memberNickname }}</text>
<text class="text-22rpx c-gray whitespace-nowrap">
{{ formatDate(data.createTime, 'YYYY-MM-DD HH:mm') }}
</text>
</view>
<view class="flex my-1">
<view
v-for="(item, index) in data.memberTagList"
:key="index"
class="mr-2 flex items-center px-1 text-18rpx text-black rounded-4rpx bg-color-theme-dark"
>
<wd-icon name="discount-filled" size="10px" color="#000" />
<text class="whitespace-nowrap">{{ item.tagTitle }}</text>
</view>
<text class="text-22rpx c-gray">{{ formatDate(data.createTime) }}</text>
</view>
<view class="mt-1 text-xs c-gray">
{{ getGender(member.memberSex) }}·{{ member.memberAge }}岁
@@ -26,7 +30,7 @@
</view>
</view>
</view>
<view class="mb-30rpx pl-130rpx">
<view class="mb-30rpx pl-140rpx">
<text class="leading-[1.5] text-white">{{ data.description }}</text>
<view class="mt-20rpx flex flex-wrap gap-20rpx">
<image
@@ -37,7 +41,7 @@
mode="aspectFill"
@click="previewImage(pic)"
/>
<template v-for="video in data.coverVideo?.split(',')">
<template v-if="false" v-for="video in data.coverVideo?.split(',')">
<!-- #ifdef APP-PLUS -->
<su-video class="size-260rpx rounded-10rpx bg-#333333" :src="video" />
<!-- #endif -->
@@ -47,9 +51,9 @@
</template>
</view>
</view>
<view class="mb-2 flex items-center pl-130rpx text-xs text-white/70">
<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.issueProvince }} {{ data.issueCity }} {{ data.issueAddress }}</text>
<text> {{ data.issueCity }} · {{ data.distance.toFixed(2) }}km </text>
</view>
<view class="flex gap-60rpx pl-130rpx text-white">
<view class="flex items-center gap-10rpx text-sm">
+33 -17
View File
@@ -5,49 +5,65 @@
:src="data.coverPic?.split(',')[0]"
mode="aspectFill"
/>
<view class="flex-1">
<view class="flex justify-between items-center">
<text class="text-size-base">{{ member.memberNickname }}</text>
<text class="py-1 px-2 rounded-full text-xs bg-color-theme-dark">
{{ member.appRefreshDate ? member.appRefreshDate + '在线' : '离线' }}
<view class="flex-1 overflow-hidden">
<view class="flex justify-between items-center mt-2">
<text class="text-sm truncate">{{ member.memberNickname }}</text>
<text class="py-4rpx px-2 rounded-full text-22rpx bg-color-theme-dark whitespace-nowrap">
{{
member.appRefreshDate
? formatDate(member.appRefreshDate, 'MM-DD HH:mm前') + ' 在线'
: '离线'
}}
</text>
</view>
<view
v-for="(item, index) in data.memberTagList"
:key="index"
class="mt-2 inline-flex px-2 py-1 text-xs c-black rounded-1 bg-color-theme-dark mr-2"
class="mt-2 inline-flex px-1 py-6rpx text-18rpx c-black rounded-4rpx bg-color-theme-dark mr-2"
>
<wd-icon name="discount-filled" size="16px" color="#000"></wd-icon>
<wd-icon name="discount-filled" size="10px" color="#000" />
<text>{{ item.tagTitle }}</text>
</view>
<view class="mt-2 flex flex-wrap gap-3">
<text class="bg-#333 text-color-theme-dark text-xs px-2 py-1 rounded-1">
{{ getGender(member.memberSex) }}·{{ member.memberAge }}岁
<text class="bg-#333 text-color-theme-dark text-22rpx px-1 py-4rpx rounded-1">
{{ getGender(member.memberSex) }} · {{ member.memberAge || 0 }}岁
</text>
<text class="bg-#333 text-color-theme-dark text-xs px-2 py-1 rounded-1">
<text
v-if="member.memberHeight"
class="bg-#333 text-color-theme-dark text-22rpx px-1 py-4rpx rounded-1"
>
{{ member.memberHeight }}cm
</text>
<text class="bg-#333 text-color-theme-dark text-xs px-2 py-1 rounded-1">
<text
v-if="member.memberWeight"
class="bg-#333 text-color-theme-dark text-22rpx px-1 py-4rpx rounded-1"
>
{{ member.memberWeight }}kg
</text>
<text class="bg-#333 text-color-theme-dark text-xs px-2 py-1 rounded-1">
<text
v-if="member.memberOcc"
class="bg-#333 text-color-theme-dark text-22rpx px-1 py-4rpx rounded-1"
>
{{ member.memberOcc }}
</text>
<text class="bg-#333 text-color-theme-dark text-xs px-2 py-1 rounded-1">
{{ data.location?.distance }}
</text>
<text class="bg-#333 text-color-theme-dark text-xs px-2 py-1 rounded-1">
{{ member.memberCity || data.issueCity }}
<text
v-if="data.distance"
class="bg-#333 text-color-theme-dark text-22rpx px-1 py-4rpx rounded-1"
>
{{ data.distance.toFixed(2) }}km
</text>
</view>
</view>
</view>
<view class="h-1rpx bg-#333 ml-30 mr-4"></view>
</template>
<script setup lang="ts">
import { computed } from 'vue';
// @ts-ignore
import { getGender } from '@/sheep/util/index';
// @ts-ignore
import { formatDate } from '@/sheep/util/index';
const props = defineProps<{
data?: any;