feat:bug修改
This commit is contained in:
1 parent
fe226a8cb5
commit
a9d66d4f4a
19 files changed
+2212
-1863
No files matched your search
@@ -0,0 +1,84 @@
|
||||
<svg width="375" height="700" viewBox="0 0 375 700" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<!-- 阴影滤镜 -->
|
||||
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
|
||||
<feDropShadow dx="0" dy="4" stdDeviation="10" flood-color="#000000" flood-opacity="0.1"/>
|
||||
</filter>
|
||||
|
||||
<!-- 背景渐变 -->
|
||||
<linearGradient id="bgGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" stop-color="#EBF4FF" />
|
||||
<stop offset="100%" stop-color="#F2F4FF" />
|
||||
</linearGradient>
|
||||
|
||||
<!-- 柔光球 -->
|
||||
<filter id="blurFilter">
|
||||
<feGaussianBlur in="SourceGraphic" stdDeviation="40" />
|
||||
</filter>
|
||||
|
||||
<!-- 心形路径 (复用) -->
|
||||
<path id="heart" d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" />
|
||||
|
||||
<!-- 圆形剪切路径 (用于Logo) -->
|
||||
<clipPath id="logoClip">
|
||||
<circle cx="187.5" cy="150" r="34" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
|
||||
<!-- 1. 背景 -->
|
||||
<rect width="100%" height="100%" fill="url(#bgGradient)" />
|
||||
<!-- 添加一些柔和的彩色光斑 -->
|
||||
<circle cx="50" cy="50" r="100" fill="#FFDEE9" filter="url(#blurFilter)" opacity="0.5" />
|
||||
<circle cx="375" cy="700" r="150" fill="#B5FFFC" filter="url(#blurFilter)" opacity="0.3" />
|
||||
|
||||
<!-- 2. 左上角图标 -->
|
||||
<g transform="translate(20, 40)">
|
||||
<defs>
|
||||
<clipPath id="smallLogoClip">
|
||||
<rect width="48" height="48" rx="14" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<image href="data:image/png;base64,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 truncated
|
||||
</g>
|
||||
|
||||
<!-- 3. 中间卡片区域 -->
|
||||
<!-- 卡片参数:
|
||||
Top Y: 150
|
||||
Left X: 35
|
||||
Width: 305
|
||||
Height: 450 (approx)
|
||||
Notch Y: 260
|
||||
-->
|
||||
<g filter="url(#shadow)">
|
||||
<!-- 卡片主体路径 -->
|
||||
<path fill="#FFFFFF" d="
|
||||
M 65 150
|
||||
L 147.5 150
|
||||
A 40 40 0 0 1 227.5 150
|
||||
L 310 150
|
||||
A 20 20 0 0 1 330 170
|
||||
L 330 250
|
||||
A 10 10 0 0 0 330 270
|
||||
L 330 600
|
||||
A 20 20 0 0 1 310 620
|
||||
L 65 620
|
||||
A 20 20 0 0 1 45 600
|
||||
L 45 270
|
||||
A 10 10 0 0 0 45 250
|
||||
L 45 170
|
||||
A 20 20 0 0 1 65 150
|
||||
Z
|
||||
" />
|
||||
|
||||
<!-- Logo 图片 -->
|
||||
<image href="data:image/png;base64,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 truncated
|
||||
</g>
|
||||
|
||||
<!-- 4. 卡片上的文字和虚线 -->
|
||||
<!-- 文字: 我的推广码 -->
|
||||
<text x="187.5" y="230" font-family="PingFang SC, Microsoft YaHei, sans-serif" font-size="16" fill="#333333" text-anchor="middle" font-weight="bold">我的推广码</text>
|
||||
|
||||
<!-- 虚线 -->
|
||||
<line x1="55" y1="260" x2="320" y2="260" stroke="#EEEEEE" stroke-width="2" stroke-dasharray="6,6" />
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 19 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.9 KiB |
@@ -12,83 +12,6 @@
|
||||
}
|
||||
},
|
||||
"pages": [
|
||||
// {
|
||||
// "path": "pages/index/index",
|
||||
// "aliasPath": "/",
|
||||
// "style": {
|
||||
// "navigationBarTitleText": "首页",
|
||||
// "enablePullDownRefresh": true
|
||||
// },
|
||||
// "meta": {
|
||||
// "auth": false,
|
||||
// "sync": true,
|
||||
// "title": "首页",
|
||||
// "group": "商城"
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// "path": "pages/index/user",
|
||||
// "style": {
|
||||
// "navigationBarTitleText": "个人中心",
|
||||
// "enablePullDownRefresh": true
|
||||
// },
|
||||
// "meta": {
|
||||
// "sync": true,
|
||||
// "title": "个人中心",
|
||||
// "group": "商城"
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// "path": "pages/index/category",
|
||||
// "style": {
|
||||
// "navigationBarTitleText": "商品分类"
|
||||
// },
|
||||
// "meta": {
|
||||
// "sync": true,
|
||||
// "title": "商品分类",
|
||||
// "group": "商城"
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// "path": "pages/index/cart",
|
||||
// "style": {
|
||||
// "navigationBarTitleText": "购物车"
|
||||
// },
|
||||
// "meta": {
|
||||
// "sync": true,
|
||||
// "title": "购物车",
|
||||
// "group": "商城"
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// "path": "pages/index/login",
|
||||
// "style": {
|
||||
// "navigationBarTitleText": "登录"
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// "path": "pages/index/search",
|
||||
// "style": {
|
||||
// "navigationBarTitleText": "搜索"
|
||||
// },
|
||||
// "meta": {
|
||||
// "sync": true,
|
||||
// "title": "搜索",
|
||||
// "group": "商城"
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// "path": "pages/index/page",
|
||||
// "style": {
|
||||
// "navigationBarTitleText": ""
|
||||
// },
|
||||
// "meta": {
|
||||
// "auth": false,
|
||||
// "sync": true,
|
||||
// "title": "自定义页面",
|
||||
// "group": "商城"
|
||||
// }
|
||||
// },
|
||||
// #ifdef MP-WEIXIN
|
||||
{
|
||||
"path": "pages/wechat-tabbar/index",
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
<template>
|
||||
<wd-config-provider theme="dark">
|
||||
<view class="bg-color-theme rounded-1 flex justify-between items-center p-x-2 p-y-1">
|
||||
<view class="flex-col">
|
||||
<view class="flex items-center">
|
||||
<image class="size-44rpx mr-2" src="@/static/weixin-black.png" mode="aspectFill" />
|
||||
<text class="text-black">{{ user.member.wechatNum || '*************' }}</text>
|
||||
</view>
|
||||
<view v-if="!user?.userOperationStatus?.isLookWechat" class="text-xs c-black tracking-0.2">
|
||||
<text>成为</text>
|
||||
<text class="text-base font-bold font-italic"> VIP </text>
|
||||
<text>免费解锁</text>
|
||||
</view>
|
||||
<view v-else>
|
||||
<text class="text-black text-xs">已解锁对方微信</text>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="!user?.userOperationStatus?.isLookWechat" class="rounded-1 px-4 py-1 bg-#333 active:bg-#222"
|
||||
@click="doWeChatBtn">
|
||||
解锁
|
||||
</view>
|
||||
<view v-else class="rounded-1 px-4 py-1 bg-#333 active:bg-#222" @click="doWeChatBtn">
|
||||
查看
|
||||
</view>
|
||||
</view>
|
||||
<wd-message-box selector="operateMessage" />
|
||||
<wd-popup custom-class="custom-wechat-popup" :z-index="999" v-model="visibleWechat">
|
||||
<view class="min-w-70vw w-full overflow-hidden p-y-50rpx">
|
||||
<view v-if="!user?.userOperationStatus?.isLookWechat" class="flex-col justify-center items-center">
|
||||
<image class="size-150rpx bg-#333 rounded-full mr-1" :src="user.member?.memberAvatar"
|
||||
mode="aspectFill" />
|
||||
<view
|
||||
class="inline-flex items-center justify-center bg-color-theme-dark m-t-30rpx p-x-10 p-y-1 rounded-full">
|
||||
<image class="size-44rpx mr-2" src="@/static/weixin-black.png" mode="aspectFill" />
|
||||
<text class="text-black text-xs">{{ user.member.wechatNum || '*************' }}</text>
|
||||
</view>
|
||||
<view class="flex justify-center items-center m-t-30rpx text-color-theme">
|
||||
<text class="iconfont icon-weixin" />
|
||||
</view>
|
||||
<text class="text-color-theme text-xs m-t-30rpx">今日vip特权已使用{{ lookWechatDetail.todayCount }}/{{
|
||||
lookWechatDetail.todayCountTotal }}次</text>
|
||||
<view class="m-t-30rpx p-x-10 p-y-1.5 bg-color-theme-dark text-xs rounded-full"
|
||||
@tap="doSubmitUnlockWechat">
|
||||
<text class="text-black text-xs">使用VIP特权免费解锁</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex-col justify-center items-center" v-else>
|
||||
<view class="inline-flex items-center justify-center">
|
||||
<view class="size-50rpx bg-color-theme-dark flex justify-center items-center mr-1 rounded-full">
|
||||
<image class="size-44rpx" src="@/static/weixin-black.png" mode="aspectFill" />
|
||||
</view>
|
||||
<text class="text-color-theme text-xs">{{ user.member.wechatNum || '*************'
|
||||
}}</text>
|
||||
</view>
|
||||
<view class="flex-col justify-center items-center m-t-15rpx text-color-theme text-xs">
|
||||
<view>解锁微信只能展示24小时</view>
|
||||
<view>添加备注"荷塘月色App"会快速通过哟</view>
|
||||
</view>
|
||||
<text class="text-color-theme text-xs m-t-30rpx">今日vip特权已使用{{ lookWechatDetail.todayCount }}/{{
|
||||
lookWechatDetail.todayCountTotal }}次</text>
|
||||
<view class="m-t-30rpx p-x-10 p-y-1.5 bg-color-theme-dark text-xs rounded-full"
|
||||
@tap="copyWechatNum">
|
||||
复制微信号
|
||||
</view>
|
||||
<view class="m-t-30rpx text-xs" @tap="wechatJb">
|
||||
<text>搜索不到微信?点击【</text>
|
||||
<text class="underline underline-1 underline-solid">立即举报</text>
|
||||
<text>】退还次数</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</wd-popup>
|
||||
</wd-config-provider>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed, onMounted } from 'vue';
|
||||
|
||||
import { useMessage } from '@/uni_modules/wot-design-uni';
|
||||
// @ts-ignore
|
||||
import sheep from '@/sheep';
|
||||
import RecentApi from '@/sheep/api/member/recent';
|
||||
|
||||
const props = defineProps({
|
||||
user: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
|
||||
const userInfo = computed(() => sheep.$store('user').userInfo);
|
||||
|
||||
const operateMessage = useMessage('operateMessage');
|
||||
|
||||
const visibleWechat = ref(false)
|
||||
// 解锁微信次数
|
||||
const lookWechatDetail = ref<any>({});
|
||||
// 用户微信信息
|
||||
const userWechatInfo = reactive({
|
||||
wechatNum: '',
|
||||
wechatQrCode: '',
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
lookWechatCount()
|
||||
})
|
||||
|
||||
// 解锁微信
|
||||
const doWeChatBtn = async () => {
|
||||
console.log("user:", props.user);
|
||||
if (!props.user?.memberId) return uni.showToast({ title: '用户id不存在', icon: 'none' });
|
||||
const vip = userInfo.value?.memberVip.vip;
|
||||
// 如果不是vip
|
||||
if (!vip) {
|
||||
operateMessage
|
||||
.confirm({
|
||||
title: '获取VIP特权',
|
||||
msg: '请先开通VIP会员',
|
||||
confirmButtonText: '获取会员',
|
||||
zIndex: 9999,
|
||||
})
|
||||
.then(() => {
|
||||
uni.navigateTo({
|
||||
url: '/pages/profile/apply-vip',
|
||||
});
|
||||
})
|
||||
.catch(() => { });
|
||||
return;
|
||||
}
|
||||
visibleWechat.value = true
|
||||
};
|
||||
|
||||
// 执行解锁微信
|
||||
const doSubmitUnlockWechat = async () => {
|
||||
try {
|
||||
const { code, data } = await RecentApi.unlockWeChat({ memberId: props.user?.memberId });
|
||||
if (code === 0) {
|
||||
uni.showToast({ title: '解锁成功', icon: 'none' });
|
||||
Object.assign(userWechatInfo, data);
|
||||
// getDetail()
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("|执行解锁微信|,意外的错误:error", error);
|
||||
}
|
||||
}
|
||||
|
||||
// 查询解锁微信次数
|
||||
const lookWechatCount = async () => {
|
||||
const { data = null } = await RecentApi.lookWechatCount({});
|
||||
lookWechatDetail.value = data ?? {};
|
||||
}
|
||||
|
||||
// 复制微信号
|
||||
const copyWechatNum = () => {
|
||||
uni.setClipboardData({
|
||||
data: userWechatInfo.wechatNum,
|
||||
showToast: false,
|
||||
success: () => {
|
||||
uni.showToast({ title: '微信号已复制', icon: 'success' });
|
||||
visibleWechat.value = false
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
// 找不到微信举报
|
||||
const wechatJb = async () => {
|
||||
try {
|
||||
const { code, data, msg } = await RecentApi.createWecahtErrorAuth({
|
||||
memberId: props.user?.memberId
|
||||
})
|
||||
if (code != 0) {
|
||||
uni.showToast({ title: msg ?? '举报失败', icon: "none" });
|
||||
return
|
||||
}
|
||||
uni.showToast({ title: '举报成功', icon: "success" });
|
||||
} catch (error) {
|
||||
console.log("|找不到微信举报|,意外的错误:error", error);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
+98
-74
@@ -1,96 +1,120 @@
|
||||
<template>
|
||||
<wd-config-provider theme="dark">
|
||||
<wd-navbar title="城市" safeAreaInsetTop :bordered="false">
|
||||
<wd-config-provider class="flex-col h-full" theme="dark">
|
||||
<wd-navbar title="城市选择" safeAreaInsetTop :bordered="false">
|
||||
<template #left>
|
||||
<uni-icons type="back" size="30" color="#D29E52" @click="back"></uni-icons>
|
||||
</template>
|
||||
</wd-navbar>
|
||||
|
||||
<view class="px-3 text-sm">热门城市</view>
|
||||
<view class="flex items-center justify-between m-t-30rpx p-x-25rpx p-r-30px">
|
||||
<view class="flex items-center" @click="openSystemGPS">
|
||||
<uni-icons type="location" size="22" color="#D29E52"></uni-icons>
|
||||
<text class="truncate text-sm">{{ userCity?.t || '未选择' }}</text>
|
||||
</view>
|
||||
<view class="text-sm">当前位置</view>
|
||||
</view>
|
||||
<view class="p-x-30rpx text-sm m-t-30rpx">热门城市</view>
|
||||
<view class="flex flex-wrap gap-3 py-3 px-4">
|
||||
<text
|
||||
v-for="(item, index) in hotCity"
|
||||
:key="index"
|
||||
class="bg-color-light text-color-theme px-2 rounded-1"
|
||||
@click.stop="selectHot(item)"
|
||||
>
|
||||
<text v-for="(item, index) in hotCity" :key="index" class="bg-color-light text-color-theme px-2 rounded-1"
|
||||
@click.stop="selectHot(item)">
|
||||
{{ item.t }}
|
||||
</text>
|
||||
</view>
|
||||
|
||||
<view style="height: calc(100vh - 150px)">
|
||||
<wd-index-bar sticky>
|
||||
<view v-for="(item, index) in useCityIndex()" :key="index">
|
||||
<wd-index-anchor :index="item.letter" />
|
||||
<wd-cell
|
||||
border
|
||||
clickable
|
||||
v-for="city in item.data"
|
||||
:key="city.v"
|
||||
:title="city.t"
|
||||
@click="select(city)"
|
||||
/>
|
||||
</view>
|
||||
</wd-index-bar>
|
||||
</view>
|
||||
<wd-index-bar class="flex-1 overflow-hidden">
|
||||
<view v-for="(item, index) in useCityIndex()" :key="index">
|
||||
<wd-index-anchor :index="item.letter" />
|
||||
<wd-cell border clickable v-for="city in item.data" :key="city.v" :title="city.t" @click="select(city)" />
|
||||
</view>
|
||||
</wd-index-bar>
|
||||
</wd-config-provider>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
const hotCity = [
|
||||
{ t: '北京', v: 1 },
|
||||
{ t: '上海', v: 2 },
|
||||
{ t: '嘉兴', v: 3 },
|
||||
{ t: '杭州', v: 4 },
|
||||
];
|
||||
import { computed, ref } from 'vue';
|
||||
|
||||
const hotCity = [
|
||||
{ t: '北京', v: 1 },
|
||||
{ t: '上海', v: 2 },
|
||||
{ t: '嘉兴', v: 3 },
|
||||
{ t: '杭州', v: 4 },
|
||||
];
|
||||
|
||||
const userCity = computed(() => {
|
||||
const selectCity = sheep.$store('user').userCity
|
||||
if (selectCity && selectCity.t) return selectCity
|
||||
const currentLocation = sheep.$store('user')?.userInfo?.currentLocation
|
||||
if (!currentLocation) return null
|
||||
const city = {
|
||||
v: null,
|
||||
t: currentLocation.city,
|
||||
lng: String(currentLocation.lng),
|
||||
lat: String(currentLocation.lat),
|
||||
}
|
||||
sheep.$store('user').setUserCity(city);
|
||||
return city
|
||||
});
|
||||
</script>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { getCurrentInstance } from 'vue';
|
||||
import useCityIndex, { type cityItem } from '@/sheep/hooks/use-city-index';
|
||||
// @ts-ignore
|
||||
import sheep from '@/sheep';
|
||||
import RecentApi from '@/sheep/api/member/recent';
|
||||
import { getCurrentInstance } from 'vue';
|
||||
import useCityIndex, { type cityItem } from '@/sheep/hooks/use-city-index';
|
||||
// @ts-ignore
|
||||
import sheep from '@/sheep';
|
||||
import RecentApi from '@/sheep/api/member/recent';
|
||||
|
||||
const instance: any = getCurrentInstance()?.proxy;
|
||||
const eventChannel = instance.getOpenerEventChannel();
|
||||
const instance: any = getCurrentInstance()?.proxy;
|
||||
const eventChannel = instance.getOpenerEventChannel();
|
||||
|
||||
// 选择热门城市
|
||||
const selectHot = (v: cityItem) => {
|
||||
sheep.$store('user').setUserCity(v);
|
||||
eventChannel.emit('changeCity');
|
||||
back();
|
||||
};
|
||||
// 选择热门城市
|
||||
const selectHot = (v: cityItem) => {
|
||||
sheep.$store('user').setUserCity(v);
|
||||
eventChannel.emit('changeCity');
|
||||
back();
|
||||
};
|
||||
|
||||
const select = (v: cityItem) => {
|
||||
sheep.$store('user').setUserCity(v);
|
||||
uni.getLocation({
|
||||
geocode: true,
|
||||
success: (res) => {
|
||||
const params = {
|
||||
lat: String(res.latitude),
|
||||
lon: String(res.longitude),
|
||||
province: res.address?.province ?? '',
|
||||
city: v?.t ?? '',
|
||||
district: res.address?.district ?? '',
|
||||
address: res.address?.street ?? '',
|
||||
};
|
||||
RecentApi.updateUserLocation(params);
|
||||
},
|
||||
fail: (err) => {
|
||||
const params = {
|
||||
lat: '0',
|
||||
lon: '0',
|
||||
city: v?.t ?? '',
|
||||
};
|
||||
RecentApi.updateUserLocation(params);
|
||||
},
|
||||
});
|
||||
eventChannel.emit('changeCity');
|
||||
back();
|
||||
};
|
||||
const openSystemGPS = () => {
|
||||
|
||||
function back() {
|
||||
uni.navigateBack();
|
||||
}
|
||||
}
|
||||
|
||||
const select = (v: cityItem) => {
|
||||
sheep.$store('user').setUserCity(v);
|
||||
uni.getLocation({
|
||||
geocode: true,
|
||||
success: (res) => {
|
||||
const params = {
|
||||
lat: String(res.latitude),
|
||||
lon: String(res.longitude),
|
||||
province: res.address?.province ?? '',
|
||||
city: v?.t ?? '',
|
||||
district: res.address?.district ?? '',
|
||||
address: res.address?.street ?? '',
|
||||
};
|
||||
RecentApi.updateUserLocation(params);
|
||||
},
|
||||
fail: (err) => {
|
||||
const params = {
|
||||
lat: '0',
|
||||
lon: '0',
|
||||
city: v?.t ?? '',
|
||||
};
|
||||
RecentApi.updateUserLocation(params);
|
||||
},
|
||||
});
|
||||
eventChannel.emit('changeCity');
|
||||
back();
|
||||
};
|
||||
|
||||
function back() {
|
||||
uni.navigateBack();
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.wd-index-bar__sidebar {
|
||||
.wd-index-bar__index {
|
||||
width: 40rpx;
|
||||
padding: 0 !important;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -436,8 +436,7 @@ const goChat = async () => {
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
uni.navigateTo({ url: '/pages/message/chat-box?chatIdx=' + chatIdx });
|
||||
uni.navigateTo({ url: `/pages/message/chat-box?chatIdx=${chatIdx}&memberId=${userDetail.value.memberId}` });
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
<view class="relative flex w-full items-center">
|
||||
<input class="h-100rpx w-full rounded-50rpx bg-color-light px-40rpx text-32rpx text-white" type="number"
|
||||
placeholder="验证码" placeholder-style="color: rgba(255, 255, 255, 0.6)" v-model="smsCode" maxlength="4" />
|
||||
<view class="absolute right-20rpx text-12px flex-row-center">
|
||||
<wd-button @click="handleGetCode" :disabled="isTiming" size="medium">
|
||||
<view class="absolute right-20rpx text-12px flex-row-center z-200">
|
||||
<wd-button @click.stop.prevent="handleGetCode" :disabled="isTiming" size="medium">
|
||||
<text>获取验证码</text><text v-if="isTiming"> ({{ countDown }}s)</text>
|
||||
</wd-button>
|
||||
</view>
|
||||
|
||||
+1358
-1437
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,79 @@
|
||||
<template>
|
||||
<view class="bg-[#323232] p-x-4 p-y-4 rounded-b-3">
|
||||
<view class="flex-col gap-10rpx">
|
||||
<view class="flex items-center">
|
||||
<text class="iconfont icon-gerenxinxi color-#D29E52 w-40rpx"></text>
|
||||
<view class="flex items-center font-size-24rpx m-l-5rpx">
|
||||
<text>基本资料:</text>
|
||||
<text>{{ user?.member?.memberAge }}岁</text>
|
||||
<text v-if="user?.member?.memberHeight" class="w-1px h-20rpx bg-white m-x-6rpx"></text>
|
||||
<text v-if="user?.member?.memberHeight">{{ user?.member?.memberHeight }}cm</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex items-center">
|
||||
<text class="iconfont icon-chengshi1 color-#D29E52 w-40rpx"></text>
|
||||
<view class="flex items-center font-size-24rpx m-l-5rpx">
|
||||
<text>所在城市:</text>
|
||||
<text>{{ user?.member?.memberCity }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex items-center">
|
||||
<text class="iconfont icon-anquan color-#D29E52 w-40rpx"></text>
|
||||
<view class="flex justify-center items-center bg-blue color-black rounded-full p-x-1 m-l-5rpx">
|
||||
<text class="iconfont icon-a-ziyuan592 font-size-20rpx"></text>
|
||||
<text class="font-size-16rpx m-l-5rpx">已认证</text>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="photoListUrls.length" class="flex items-start m-t-5rpx">
|
||||
<text class="iconfont icon-tupian color-#D29E52 w-40rpx"></text>
|
||||
<view class="flex items-center m-l-5rpx">
|
||||
<image class="size-100rpx rounded-1 mr-2 mb-1" v-for="(item, index) in photoListUrls" :key="index"
|
||||
:src="item" mode="aspectFill" @click="previewPhoto(index)" />
|
||||
</view>
|
||||
</view>
|
||||
<view v-else class="flex items-center m-t-5rpx">
|
||||
<text class="iconfont icon-tupian color-#D29E52 w-40rpx"></text>
|
||||
<view class="font-size-24rpx c-#949494">相册暂无照片</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="m-t-20rpx">
|
||||
<UserLookWechat :user="user" />
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue';
|
||||
|
||||
import UserLookWechat from '@/pages/components/user-look-wechat.vue'
|
||||
|
||||
const props = defineProps({
|
||||
user: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
|
||||
const photoListUrls = computed(
|
||||
() =>
|
||||
props.user?.memberPhotoList
|
||||
?.filter((i) => i.resourceType === 'IMAGE')
|
||||
.map((item) => item.address) || [],
|
||||
);
|
||||
|
||||
// 相册预览
|
||||
const previewPhoto = (current: number) => {
|
||||
uni.previewImage({
|
||||
current,
|
||||
urls: photoListUrls.value,
|
||||
indicator: 'number',
|
||||
});
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.iconfont {
|
||||
line-height: 1em !important;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,9 @@
|
||||
<template>
|
||||
<view class="h-45px flex justify-center items-center p-x-0.5 text-center bg-[#3A3842] font-size-22rpx">
|
||||
请勿通过平台进行非法交易,如被举报核实将作封号处理。任何私下交易行为,请谨慎判断,以防人身或财产损失
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
|
||||
</script>
|
||||
@@ -1,109 +1,85 @@
|
||||
<template>
|
||||
<scroll-list
|
||||
class="h-full"
|
||||
:loadMoreStatus="loadMoreStatus"
|
||||
@refresh="refreshList"
|
||||
@loadMore="listLoadMore"
|
||||
:scroll-top="scrollTop"
|
||||
>
|
||||
<swiper
|
||||
class="h-300rpx mt-2"
|
||||
indicator-dots
|
||||
indicator-color="#777"
|
||||
indicator-active-color="#F9C26F"
|
||||
autoplay
|
||||
circular
|
||||
>
|
||||
<scroll-list class="h-full" :loadMoreStatus="loadMoreStatus" @refresh="refreshList" @loadMore="listLoadMore"
|
||||
:scroll-top="scrollTop">
|
||||
<swiper class="h-300rpx mt-2" indicator-dots indicator-color="#777" indicator-active-color="#F9C26F" autoplay
|
||||
circular>
|
||||
<swiper-item v-for="(item, index) in bannerList" :key="index" class="text-center">
|
||||
<image
|
||||
class="w-90% h-full rounded-20rpx"
|
||||
:src="item.picUrl"
|
||||
mode="aspectFill"
|
||||
@click="clickSwiperImage(item.url)"
|
||||
/>
|
||||
<image class="w-90% h-full rounded-20rpx" :src="item.picUrl" mode="aspectFill"
|
||||
@click="clickSwiperImage(item.url)" />
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
|
||||
<view v-if="isRefreshing" class="flex px-4 py-4" v-for="index in 3" :key="index">
|
||||
<wd-skeleton :row-col="[{ size: '50px', type: 'circle' }]" animation="flashed" />
|
||||
<wd-skeleton
|
||||
:custom-style="{ width: '100%', marginLeft: '12px' }"
|
||||
animation="flashed"
|
||||
theme="paragraph"
|
||||
/>
|
||||
<wd-skeleton :custom-style="{ width: '100%', marginLeft: '12px' }" animation="flashed" theme="paragraph" />
|
||||
</view>
|
||||
<moment-card
|
||||
v-else-if="listData.length"
|
||||
v-for="item in listData"
|
||||
:data="item"
|
||||
@detail="goDetail(item)"
|
||||
/>
|
||||
<moment-card v-else-if="listData.length" v-for="item in listData" :data="item" @detail="goDetail(item)" />
|
||||
<wd-status-tip v-else image="content" tip="暂无内容" />
|
||||
</scroll-list>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, onMounted, reactive, ref, watch } from 'vue';
|
||||
// @ts-ignore
|
||||
import sheep from '@/sheep';
|
||||
import ScrollList from '@/sheep/components/scroll-list/scroll-list.vue';
|
||||
import MomentCard from '@/sheep/components/moment-card/moment-card.vue';
|
||||
import useScroll from '@/sheep/hooks/use-scroll';
|
||||
import RecentApi from '@/sheep/api/member/recent';
|
||||
import { computed, onMounted, reactive, ref, watch } from 'vue';
|
||||
// @ts-ignore
|
||||
import sheep from '@/sheep';
|
||||
import ScrollList from '@/sheep/components/scroll-list/scroll-list.vue';
|
||||
import MomentCard from '@/sheep/components/moment-card/moment-card.vue';
|
||||
import useScroll from '@/sheep/hooks/use-scroll';
|
||||
import RecentApi from '@/sheep/api/member/recent';
|
||||
|
||||
const props = defineProps<{
|
||||
scene: string;
|
||||
}>();
|
||||
const props = defineProps<{
|
||||
scene: string;
|
||||
}>();
|
||||
|
||||
const scrollTop = ref(1);
|
||||
const userCity = computed(() => sheep.$store('user').userCity);
|
||||
const params = reactive({
|
||||
scene: props.scene,
|
||||
province: '',
|
||||
city: userCity.value.t,
|
||||
memberId: '',
|
||||
const scrollTop = ref(1);
|
||||
const userCity = computed(() => sheep.$store('user').userCity);
|
||||
const params = reactive({
|
||||
scene: props.scene,
|
||||
province: '',
|
||||
city: userCity.value.t,
|
||||
memberId: '',
|
||||
});
|
||||
const { isRefreshing, listData, loadMoreStatus, refreshList, listLoadMore } = useScroll(
|
||||
RecentApi.quickPage,
|
||||
params,
|
||||
);
|
||||
const bannerList = ref<any>([]);
|
||||
|
||||
onMounted(() => {
|
||||
refreshList();
|
||||
getBannerList();
|
||||
});
|
||||
|
||||
// 获取轮播图
|
||||
const getBannerList = async () => {
|
||||
const { code, data = null } = await RecentApi.getBannerList();
|
||||
if (code !== 0) return;
|
||||
bannerList.value = data ?? [];
|
||||
};
|
||||
|
||||
watch(
|
||||
() => userCity.value,
|
||||
async (city) => {
|
||||
params.city = city.t;
|
||||
await refreshList();
|
||||
scrollTop.value = 0;
|
||||
},
|
||||
);
|
||||
|
||||
// 点击轮播图
|
||||
const clickSwiperImage = (url: string) => {
|
||||
uni.navigateTo({
|
||||
url,
|
||||
});
|
||||
const { isRefreshing, listData, loadMoreStatus, refreshList, listLoadMore } = useScroll(
|
||||
RecentApi.quickPage,
|
||||
params,
|
||||
);
|
||||
const bannerList = ref<any>([]);
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
refreshList();
|
||||
getBannerList();
|
||||
});
|
||||
|
||||
// 获取轮播图
|
||||
const getBannerList = async () => {
|
||||
const { code, data = null } = await RecentApi.getBannerList();
|
||||
if (code !== 0) return;
|
||||
bannerList.value = data ?? [];
|
||||
};
|
||||
|
||||
watch(
|
||||
() => userCity.value,
|
||||
async (city) => {
|
||||
params.city = city.t;
|
||||
await refreshList();
|
||||
scrollTop.value = 0;
|
||||
// 查看用户详情
|
||||
const goDetail = (user: any) => {
|
||||
uni.navigateTo({
|
||||
url: `/pages/home/detail?memberId=${user.memberId}`,
|
||||
success: function (res) {
|
||||
res.eventChannel.emit('viewRecordType', 'RECENT');
|
||||
},
|
||||
);
|
||||
|
||||
// 点击轮播图
|
||||
const clickSwiperImage = (url: string) => {
|
||||
uni.navigateTo({
|
||||
url,
|
||||
});
|
||||
};
|
||||
|
||||
// 查看用户详情
|
||||
const goDetail = (user: any) => {
|
||||
uni.navigateTo({
|
||||
url: `/pages/home/detail?memberId=${user.memberId}`,
|
||||
success: function (res) {
|
||||
res.eventChannel.emit('viewRecordType', 'RECENT');
|
||||
},
|
||||
});
|
||||
};
|
||||
});
|
||||
};
|
||||
</script>
|
||||
+27
-35
@@ -13,9 +13,8 @@
|
||||
</view>
|
||||
</template>
|
||||
</wd-navbar>
|
||||
|
||||
<swiper :current="current" style="height: calc(100vh - 44rpx - 100rpx)"
|
||||
@change="(e) => (current = e.detail.current)" :duration="200" disable-touch>
|
||||
@change="(e) => (current = e.detail.current)" :duration="200">
|
||||
<swiper-item v-for="(item, index) in segmentedItems" :key="index">
|
||||
<scroll-user :scene="item['search-action']" />
|
||||
</swiper-item>
|
||||
@@ -52,6 +51,7 @@ import { computed, ref } from 'vue';
|
||||
import segmented from '@/sheep/components/segmented/segmented.vue';
|
||||
import RecentApi from '@/sheep/api/member/recent';
|
||||
import ScrollUser from './components/scroll-user.vue';
|
||||
import { requestPermission, gotoAppPermissionSetting } from "@/sheep/util/permission"
|
||||
// @ts-ignore
|
||||
import sheep from '@/sheep';
|
||||
import { onLoad, onShow } from '@dcloudio/uni-app';
|
||||
@@ -59,7 +59,20 @@ import { onLoad, onShow } from '@dcloudio/uni-app';
|
||||
const current = ref(0);
|
||||
const segmentedItems = ref([]);
|
||||
const isOpenGPS = ref(true);
|
||||
const userCity = computed(() => sheep.$store('user').userCity);
|
||||
const userCity = computed(() => {
|
||||
const selectCity = sheep.$store('user').userCity
|
||||
if (selectCity && selectCity.t) return selectCity
|
||||
const currentLocation = sheep.$store('user')?.userInfo?.currentLocation
|
||||
if (!currentLocation) return null
|
||||
const city = {
|
||||
v: null,
|
||||
t: currentLocation.city,
|
||||
lng: String(currentLocation.lng),
|
||||
lat: String(currentLocation.lat),
|
||||
}
|
||||
sheep.$store('user').setUserCity(city);
|
||||
return city
|
||||
});
|
||||
|
||||
onLoad(async () => {
|
||||
// 获取顶部导航栏tab菜单
|
||||
@@ -78,6 +91,7 @@ const getLocation = () => {
|
||||
uni.getLocation({
|
||||
geocode: true,
|
||||
success: (res) => {
|
||||
console.log("位置授权:", res);
|
||||
const params = {
|
||||
lat: String(res.latitude),
|
||||
lon: String(res.longitude),
|
||||
@@ -95,39 +109,17 @@ const getLocation = () => {
|
||||
});
|
||||
};
|
||||
|
||||
const openSystemGPS = () => {
|
||||
const openSystemGPS = async () => {
|
||||
// #ifdef APP-PLUS || MP-WEIXIN
|
||||
const system = uni.getSystemInfoSync();
|
||||
if (system.platform === 'android') {
|
||||
// 安卓手机授权之后还需打开定位服务功能GPS
|
||||
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)) {
|
||||
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 if (system.platform == 'ios') {
|
||||
// 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);
|
||||
}
|
||||
},
|
||||
});
|
||||
const permissionStatus = await requestPermission("location")
|
||||
console.log("APP授权:", permissionStatus);
|
||||
// 已拒绝|受限
|
||||
if (permissionStatus === 'denied') {
|
||||
gotoAppPermissionSetting()
|
||||
}
|
||||
// 已授权
|
||||
if (permissionStatus === 'granted') {
|
||||
isOpenGPS.value = true;
|
||||
}
|
||||
// #endif
|
||||
// #ifdef H5
|
||||
|
||||
@@ -13,13 +13,8 @@
|
||||
</template>
|
||||
</wd-navbar>
|
||||
|
||||
<swiper
|
||||
:current="current"
|
||||
style="height: calc(100vh - 44rpx - 100rpx)"
|
||||
@change="(e) => (current = e.detail.current)"
|
||||
:duration="200"
|
||||
disable-touch
|
||||
>
|
||||
<swiper :current="current" style="height: calc(100vh - 44rpx - 100rpx)"
|
||||
@change="(e) => (current = e.detail.current)" :duration="200" disable-touch>
|
||||
<swiper-item v-for="(item, index) in segmentedItems" :key="index">
|
||||
<scroll-moment :scene="item['search-action']" />
|
||||
</swiper-item>
|
||||
@@ -28,20 +23,20 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue';
|
||||
import segmented from '@/sheep/components/segmented/segmented.vue';
|
||||
import ScrollMoment from './components/scroll-moment.vue';
|
||||
import { onLoad } from '@dcloudio/uni-app';
|
||||
import RecentApi from '@/sheep/api/member/recent';
|
||||
import { ref } from 'vue';
|
||||
import segmented from '@/sheep/components/segmented/segmented.vue';
|
||||
import ScrollMoment from './components/scroll-moment.vue';
|
||||
import { onLoad } from '@dcloudio/uni-app';
|
||||
import RecentApi from '@/sheep/api/member/recent';
|
||||
|
||||
const current = ref(0);
|
||||
const segmentedItems = ref([]);
|
||||
const current = ref(0);
|
||||
const segmentedItems = ref([]);
|
||||
|
||||
onLoad(async () => {
|
||||
// 获取顶部导航栏tab菜单
|
||||
const { data } = await RecentApi.getDynamicTabMenu();
|
||||
if (data && data.length > 0) {
|
||||
segmentedItems.value = data;
|
||||
}
|
||||
});
|
||||
onLoad(async () => {
|
||||
// 获取顶部导航栏tab菜单
|
||||
const { data } = await RecentApi.getDynamicTabMenu();
|
||||
if (data && data.length > 0) {
|
||||
segmentedItems.value = data;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -220,7 +220,7 @@ const getTradeConfig = async () => {
|
||||
if (data.brokerageWithdrawMinPrice !== undefined) {
|
||||
state.rule[1].title = `邀请奖励满${fen2yuanSimple(
|
||||
data.brokerageWithdrawMinPrice,
|
||||
)}元可提现,3个月工作日内到账`;
|
||||
)}元可提现,2个工作日内到账`;
|
||||
}
|
||||
if (data.brokerageFirstPercent !== undefined) {
|
||||
state.rule[0].title = `通过链接/二维码邀请用户首次充值,可获得${data.brokerageFirstPercent || 50
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
<view class="flex-col justify-center bg-[#1E1E1E] rounded-lg mx-20rpx px-30rpx py-30rpx mb-20rpx">
|
||||
<view class="flex justify-between items-center mb-10rpx">
|
||||
<text class="text-white text-base font-bold">礼物提现</text>
|
||||
<text class="text-[#D29E52] text-lg font-bold">{{ fen2yuan(item.txPrice) }} 元</text>
|
||||
<view class="flex justify-center items-center">
|
||||
<text class="text-[#D29E52] text-lg font-bold">{{ fen2yuanSimple(item.txPrice) }}元</text>
|
||||
<text class="text-white text-lg font-bold">({{ fen2yuanSimple(item.txYdPrice) }}缘豆)</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex justify-between items-center">
|
||||
<text class="text-[#999999] text-xs">
|
||||
|
||||
@@ -6,8 +6,9 @@
|
||||
<navigator open-type="navigateBack" hover-class="navigator-hover">
|
||||
<uni-icons type="back" size="30" color="#D29E52"></uni-icons>
|
||||
</navigator>
|
||||
<navigator url="/pages/wechat/pages/withraw-record" open-type="navigate"
|
||||
hover-class="navigator-hover">
|
||||
<navigator
|
||||
:url="pageType == 'yj' ? '/pages/wechat/pages/withraw-record' : '/pages/wechat/pages/gift/gift-record'"
|
||||
open-type="navigate" hover-class="navigator-hover">
|
||||
<view
|
||||
class="flex items-center rounded-full h-44rpx bg-color-theme py-1 px-2 text-black text-sm">
|
||||
历史记录
|
||||
|
||||
@@ -1,28 +1,23 @@
|
||||
<template>
|
||||
<view class="border-1 border-b-solid border-#444444 px-4 py-4">
|
||||
<view class="mb-1 flex items-center" @click="detail">
|
||||
<image
|
||||
:src="member.memberAvatar"
|
||||
class="mr-3 size-120rpx rounded-full bg-#333333"
|
||||
mode="aspectFill"
|
||||
/>
|
||||
<image :src="member.memberAvatar" class="mr-3 size-120rpx rounded-full bg-#333333" mode="aspectFill" />
|
||||
<view class="flex-1 overflow-hidden">
|
||||
<view class="flex justify-between items-center">
|
||||
<text class="text-base truncate">{{ member?.memberNickname }}</text>
|
||||
<view class="flex items-center">
|
||||
<text class="text-base truncate">{{ member?.memberNickname }}</text>
|
||||
<view class="flex my-1 ml-15rpx">
|
||||
<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>
|
||||
</view>
|
||||
</view>
|
||||
<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>
|
||||
</view>
|
||||
<view class="mt-1 text-xs c-gray">
|
||||
<text v-if="member.memberSex">{{ getGender(member.memberSex) }}</text>
|
||||
<text v-if="member.memberSex && member.memberAge">·</text>
|
||||
@@ -35,14 +30,8 @@
|
||||
<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
|
||||
v-for="(pic, index) in data.coverPic?.split(',')"
|
||||
:key="index"
|
||||
:src="pic"
|
||||
class="size-260rpx rounded-10rpx bg-#333333"
|
||||
mode="aspectFill"
|
||||
@click="previewImage(pic)"
|
||||
/>
|
||||
<image v-for="(pic, index) in data.coverPic?.split(',')" :key="index" :src="pic"
|
||||
class="size-260rpx rounded-10rpx bg-#333333" mode="aspectFill" @click="previewImage(pic)" />
|
||||
<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" />
|
||||
@@ -74,112 +63,112 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
// @ts-nocheck
|
||||
import RecentApi from '@/sheep/api/member/recent';
|
||||
import { computed, onMounted, reactive, ref } from 'vue';
|
||||
import { formatDate } from '@/sheep/util/index';
|
||||
import { getGender } from '@/sheep/util/index';
|
||||
import useConfigStore from '@/chat-store/configStore.js';
|
||||
import useChatStore from '@/chat-store/chatStore.js';
|
||||
import useFriendStore from '@/chat-store/friendStore.js';
|
||||
import request from '@/common/request';
|
||||
// @ts-nocheck
|
||||
import RecentApi from '@/sheep/api/member/recent';
|
||||
import { computed, onMounted, reactive, ref } from 'vue';
|
||||
import { formatDate } from '@/sheep/util/index';
|
||||
import { getGender } from '@/sheep/util/index';
|
||||
import useConfigStore from '@/chat-store/configStore.js';
|
||||
import useChatStore from '@/chat-store/chatStore.js';
|
||||
import useFriendStore from '@/chat-store/friendStore.js';
|
||||
import request from '@/common/request';
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
data: any;
|
||||
showLike?: boolean;
|
||||
showChat?: boolean;
|
||||
}>(),
|
||||
{
|
||||
showLike: true,
|
||||
showChat: true,
|
||||
},
|
||||
);
|
||||
const emit = defineEmits<(e: 'detail') => void>();
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
data: any;
|
||||
showLike?: boolean;
|
||||
showChat?: boolean;
|
||||
}>(),
|
||||
{
|
||||
showLike: true,
|
||||
showChat: true,
|
||||
},
|
||||
);
|
||||
const emit = defineEmits<(e: 'detail') => void>();
|
||||
|
||||
const member = computed(() => props.data.member || {});
|
||||
const member = computed(() => props.data.member || {});
|
||||
|
||||
const isLike = ref(props.data.recentOperationStatus?.isLike);
|
||||
const operationTotal = ref(props.data.operationTotal?.likeTotal || 0);
|
||||
const params = reactive({
|
||||
memberId: member.value.memberId, // 被操作的用户id
|
||||
memberRecentId: props.data.id, // 当前朋友圈的编号,不能为空
|
||||
// 朋友圈操作类型,不能为空
|
||||
action: '',
|
||||
// RECENT_LIKE-朋友圈-点赞
|
||||
// RECENT_SHIELD-朋友圈-屏蔽
|
||||
// RECENT_REPORT-朋友圈-举报
|
||||
const isLike = ref(props.data.recentOperationStatus?.isLike);
|
||||
const operationTotal = ref(props.data.operationTotal?.likeTotal || 0);
|
||||
const params = reactive({
|
||||
memberId: member.value.memberId, // 被操作的用户id
|
||||
memberRecentId: props.data.id, // 当前朋友圈的编号,不能为空
|
||||
// 朋友圈操作类型,不能为空
|
||||
action: '',
|
||||
// RECENT_LIKE-朋友圈-点赞
|
||||
// RECENT_SHIELD-朋友圈-屏蔽
|
||||
// RECENT_REPORT-朋友圈-举报
|
||||
});
|
||||
|
||||
// 图片预览
|
||||
const previewImage = (img: string) => {
|
||||
uni.previewImage({
|
||||
urls: [img],
|
||||
});
|
||||
};
|
||||
|
||||
// 图片预览
|
||||
const previewImage = (img: string) => {
|
||||
uni.previewImage({
|
||||
urls: [img],
|
||||
});
|
||||
};
|
||||
// 喜欢
|
||||
const handleLike = async () => {
|
||||
params.action = 'RECENT_LIKE';
|
||||
const { code } = await RecentApi.recentOperate(params);
|
||||
if (code !== 0) return;
|
||||
|
||||
// 喜欢
|
||||
const handleLike = async () => {
|
||||
params.action = 'RECENT_LIKE';
|
||||
const { code } = await RecentApi.recentOperate(params);
|
||||
if (code !== 0) return;
|
||||
isLike.value = !isLike.value;
|
||||
isLike.value ? operationTotal.value++ : operationTotal.value--;
|
||||
};
|
||||
|
||||
isLike.value = !isLike.value;
|
||||
isLike.value ? operationTotal.value++ : operationTotal.value--;
|
||||
};
|
||||
// 打招呼 私聊
|
||||
const goChat = async () => {
|
||||
if (!member.value.memberId) return uni.showToast({ title: '用户不存在' });
|
||||
const { code } = await RecentApi.chatAddFriend({
|
||||
friendUserId: member.value.memberId,
|
||||
});
|
||||
if (code !== 0) return uni.showToast({ title: '好友添加失败', icon: 'error' });
|
||||
|
||||
// 打招呼 私聊
|
||||
const goChat = async () => {
|
||||
if (!member.value.memberId) return uni.showToast({ title: '用户不存在' });
|
||||
const { code } = await RecentApi.chatAddFriend({
|
||||
friendUserId: member.value.memberId,
|
||||
});
|
||||
if (code !== 0) return uni.showToast({ title: '好友添加失败', icon: 'error' });
|
||||
const friendStore = useFriendStore();
|
||||
const configStore = useConfigStore();
|
||||
const chatStore = useChatStore();
|
||||
|
||||
const friendStore = useFriendStore();
|
||||
const configStore = useConfigStore();
|
||||
const chatStore = useChatStore();
|
||||
request({
|
||||
url: '/user/find/' + member.value.memberId,
|
||||
method: 'GET',
|
||||
}).then((user: any) => {
|
||||
let friendInfo = user;
|
||||
|
||||
request({
|
||||
url: '/user/find/' + member.value.memberId,
|
||||
method: 'GET',
|
||||
}).then((user: any) => {
|
||||
let friendInfo = user;
|
||||
const friend = {
|
||||
id: friendInfo.id,
|
||||
nickName: friendInfo.nickName,
|
||||
headImage: friendInfo.headImageThumb,
|
||||
online: friendInfo.online,
|
||||
deleted: false,
|
||||
};
|
||||
friendStore.addFriend(friend);
|
||||
|
||||
const friend = {
|
||||
id: friendInfo.id,
|
||||
nickName: friendInfo.nickName,
|
||||
headImage: friendInfo.headImageThumb,
|
||||
online: friendInfo.online,
|
||||
deleted: false,
|
||||
};
|
||||
friendStore.addFriend(friend);
|
||||
const chat: any = {
|
||||
type: 'PRIVATE',
|
||||
targetId: friendInfo.id,
|
||||
showName: friendInfo.nickName,
|
||||
headImage: friendInfo.headImageThumb,
|
||||
isDnd: friendInfo.isDnd,
|
||||
};
|
||||
chatStore.openChat(chat);
|
||||
const chatIdx = chatStore.findChatIdx(chat);
|
||||
|
||||
const chat: any = {
|
||||
type: 'PRIVATE',
|
||||
targetId: friendInfo.id,
|
||||
showName: friendInfo.nickName,
|
||||
headImage: friendInfo.headImageThumb,
|
||||
isDnd: friendInfo.isDnd,
|
||||
};
|
||||
chatStore.openChat(chat);
|
||||
const chatIdx = chatStore.findChatIdx(chat);
|
||||
// 防止初始化期间进入会话导致的消息不刷新
|
||||
if (!configStore.appInit || chatStore.loading) {
|
||||
uni.showToast({
|
||||
title: '正在初始化页面,请稍后...',
|
||||
icon: 'none',
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 防止初始化期间进入会话导致的消息不刷新
|
||||
if (!configStore.appInit || chatStore.loading) {
|
||||
uni.showToast({
|
||||
title: '正在初始化页面,请稍后...',
|
||||
icon: 'none',
|
||||
});
|
||||
return;
|
||||
}
|
||||
uni.navigateTo({ url: '/pages/message/chat-box?chatIdx=' + chatIdx });
|
||||
});
|
||||
};
|
||||
|
||||
uni.navigateTo({ url: '/pages/message/chat-box?chatIdx=' + chatIdx });
|
||||
});
|
||||
};
|
||||
|
||||
// 详情
|
||||
const detail = () => {
|
||||
emit('detail');
|
||||
};
|
||||
// 详情
|
||||
const detail = () => {
|
||||
emit('detail');
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,138 @@
|
||||
type PermissionId = 'location';
|
||||
/**
|
||||
* 权限请求状态
|
||||
* - none: 未请求
|
||||
* - granted: 已授权
|
||||
* - denied: 已拒绝|受限
|
||||
* - prompt: 未授权
|
||||
*/
|
||||
type RequestStatus = 'granted' | 'denied' | 'prompt';
|
||||
|
||||
/**
|
||||
* 跳转应用权限设置页面
|
||||
*/
|
||||
export const gotoAppPermissionSetting = () => {
|
||||
const system = uni.getSystemInfoSync();
|
||||
console.log('system:', system);
|
||||
if (system.platform === 'ios') {
|
||||
// @ts-ignore
|
||||
const UIApplication = plus.ios.import('UIApplication');
|
||||
const application2 = UIApplication.sharedApplication();
|
||||
// @ts-ignore
|
||||
const NSURL2 = plus.ios.import('NSURL');
|
||||
const setting2 = NSURL2.URLWithString('app-settings:');
|
||||
application2.openURL(setting2);
|
||||
plus.ios.deleteObject(setting2);
|
||||
plus.ios.deleteObject(NSURL2);
|
||||
plus.ios.deleteObject(application2);
|
||||
}
|
||||
if (system.platform == 'android') {
|
||||
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();
|
||||
// @ts-ignore
|
||||
const intent = new Intent();
|
||||
// @ts-ignore
|
||||
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
||||
// @ts-ignore
|
||||
const uri = Uri.fromParts('package', mainActivity.getPackageName(), null);
|
||||
intent.setData(uri);
|
||||
// @ts-ignore
|
||||
mainActivity.startActivity(intent);
|
||||
}
|
||||
};
|
||||
|
||||
export const requestPermission = (permissionId: PermissionId): Promise<RequestStatus> => {
|
||||
const system = uni.getSystemInfoSync();
|
||||
if (system.platform === 'android') {
|
||||
return requestAndroid(permissionId);
|
||||
}
|
||||
if (system.platform === 'ios') {
|
||||
return requestIos(permissionId);
|
||||
}
|
||||
return Promise.resolve('denied');
|
||||
};
|
||||
|
||||
/******************************** ios相关 ********************************/
|
||||
|
||||
const requestIos = (permissionId: PermissionId): Promise<RequestStatus> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
switch (permissionId) {
|
||||
case 'location':
|
||||
resolve(iosLocation());
|
||||
break;
|
||||
default:
|
||||
resolve('denied');
|
||||
break;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 请求ios定位权限
|
||||
* @returns 权限请求状态
|
||||
*/
|
||||
const iosLocation = (): RequestStatus => {
|
||||
let result: RequestStatus = 'denied';
|
||||
// @ts-ignore
|
||||
const cllocationManger = plus.ios.import('CLLocationManager');
|
||||
const enable = cllocationManger.locationServicesEnabled();
|
||||
const status = cllocationManger.authorizationStatus();
|
||||
if (!enable) {
|
||||
result = 'denied';
|
||||
} else if (status === 0) {
|
||||
result = 'prompt';
|
||||
} else if (status === 3 || status === 4) {
|
||||
result = 'granted';
|
||||
} else {
|
||||
result = 'denied';
|
||||
}
|
||||
plus.ios.deleteObject(cllocationManger);
|
||||
return result;
|
||||
};
|
||||
|
||||
/******************************** andorid相关 ********************************/
|
||||
|
||||
/**
|
||||
* 请求android权限
|
||||
*/
|
||||
const requestAndroid = (permissionID: PermissionId): Promise<RequestStatus> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
let androidPermissionKey = '';
|
||||
switch (permissionID) {
|
||||
case 'location':
|
||||
androidPermissionKey = 'android.permission.ACCESS_FINE_LOCATION';
|
||||
break;
|
||||
}
|
||||
if (!androidPermissionKey) {
|
||||
resolve('denied');
|
||||
}
|
||||
plus.android.requestPermissions(
|
||||
[permissionID],
|
||||
function (resultObj) {
|
||||
let result: RequestStatus = 'denied';
|
||||
for (let i = 0; i < resultObj.granted.length; i++) {
|
||||
const grantedPermission = resultObj.granted[i];
|
||||
console.log('已获取的权限:');
|
||||
result = 'granted';
|
||||
}
|
||||
for (let i = 0; i < resultObj.deniedPresent.length; i++) {
|
||||
const deniedPresentPermission = resultObj.deniedPresent[i];
|
||||
console.log('拒绝本次申请的权限:');
|
||||
result = 'denied';
|
||||
}
|
||||
for (let i = 0; i < resultObj.deniedAlways.length; i++) {
|
||||
const deniedAlwaysPermission = resultObj.deniedAlways[i];
|
||||
console.log('永久拒绝申请的权限:');
|
||||
result = 'denied';
|
||||
}
|
||||
resolve(result);
|
||||
},
|
||||
function (error) {
|
||||
console.error(`|请求android权限|${permissionID}:`, error);
|
||||
resolve('denied');
|
||||
},
|
||||
);
|
||||
});
|
||||
};
|
||||
@@ -1,8 +1,8 @@
|
||||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 5079650 */
|
||||
src: url('//at.alicdn.com/t/c/font_5079650_0eztc033f38b.woff2?t=1765772507380') format('woff2'),
|
||||
url('//at.alicdn.com/t/c/font_5079650_0eztc033f38b.woff?t=1765772507380') format('woff'),
|
||||
url('//at.alicdn.com/t/c/font_5079650_0eztc033f38b.ttf?t=1765772507380') format('truetype');
|
||||
src: url('//at.alicdn.com/t/c/font_5079650_ql5o5wq6mdh.woff2?t=1767594984419') format('woff2'),
|
||||
url('//at.alicdn.com/t/c/font_5079650_ql5o5wq6mdh.woff?t=1767594984419') format('woff'),
|
||||
url('//at.alicdn.com/t/c/font_5079650_ql5o5wq6mdh.ttf?t=1767594984419') format('truetype');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
@@ -13,6 +13,42 @@
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-a-ziyuan592:before {
|
||||
content: "\e78e";
|
||||
}
|
||||
|
||||
.icon-renzheng1:before {
|
||||
content: "\e6a1";
|
||||
}
|
||||
|
||||
.icon-anquan1:before {
|
||||
content: "\e663";
|
||||
}
|
||||
|
||||
.icon-tupian:before {
|
||||
content: "\e662";
|
||||
}
|
||||
|
||||
.icon-anquan:before {
|
||||
content: "\ec4d";
|
||||
}
|
||||
|
||||
.icon-chengshi:before {
|
||||
content: "\e665";
|
||||
}
|
||||
|
||||
.icon-gerenxinxi:before {
|
||||
content: "\e64c";
|
||||
}
|
||||
|
||||
.icon-chengshi1:before {
|
||||
content: "\e66e";
|
||||
}
|
||||
|
||||
.icon-icon-phone:before {
|
||||
content: "\e657";
|
||||
}
|
||||
|
||||
.icon-weixin:before {
|
||||
content: "\e63d";
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user