修改首页获取地理权限逻辑和添加用户信息修改接口
This commit is contained in:
6
env/.env
vendored
6
env/.env
vendored
@ -8,7 +8,7 @@ VITE_WX_APPID = 'wxa2abb91f64032a2b'
|
|||||||
VITE_APP_PUBLIC_BASE = '/h5'
|
VITE_APP_PUBLIC_BASE = '/h5'
|
||||||
|
|
||||||
# 登录页面
|
# 登录页面
|
||||||
VITE_LOGIN_URL = '/pages/login/mobile'
|
VITE_LOGIN_URL = '/pages/my/my'
|
||||||
# 第一个请求地址
|
# 第一个请求地址
|
||||||
VITE_SERVER_BASEURL = 'https://cz.stnav.com'
|
VITE_SERVER_BASEURL = 'https://cz.stnav.com'
|
||||||
|
|
||||||
@ -25,6 +25,6 @@ VITE_API_SECONDARY_URL = 'https://cz.stnav.com'
|
|||||||
VITE_WX_SERVICE_ACCOUNT_APPID = 'wx0224f558e3b3f499'
|
VITE_WX_SERVICE_ACCOUNT_APPID = 'wx0224f558e3b3f499'
|
||||||
|
|
||||||
# 默认地址
|
# 默认地址
|
||||||
VITE_DEFAULT_LONGITUDE = 113.665412
|
VITE_DEFAULT_LONGITUDE = 121.473629
|
||||||
VITE_DEFAULT_LATITUDE = 34.757975
|
VITE_DEFAULT_LATITUDE = 31.230393
|
||||||
VITE_DEFAULT_ADDRESS = '上海市'
|
VITE_DEFAULT_ADDRESS = '上海市'
|
||||||
@ -46,3 +46,34 @@ export function getTeaSpecialist(data: ITeaSpecialistParams) {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 经纬度转换为城市
|
||||||
|
*/
|
||||||
|
export interface ILocationToCityParams {
|
||||||
|
latitude: number
|
||||||
|
longitude: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getLocationToCity(data: ILocationToCityParams) {
|
||||||
|
return http.Post<{
|
||||||
|
message: string
|
||||||
|
result: {
|
||||||
|
ad_info: {
|
||||||
|
province: string
|
||||||
|
city: string
|
||||||
|
district: string
|
||||||
|
adcode: string
|
||||||
|
},
|
||||||
|
location: {
|
||||||
|
lat: number
|
||||||
|
lng: number
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}>('/api/common/cityAddress',
|
||||||
|
data,
|
||||||
|
{
|
||||||
|
meta: { ignoreAuth: true }
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
@ -48,3 +48,25 @@ export interface IUserCouponListResult {
|
|||||||
no_use: Array<any>
|
no_use: Array<any>
|
||||||
use: Array<any>
|
use: Array<any>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户信息接口返回
|
||||||
|
*/
|
||||||
|
export interface IUserResult {
|
||||||
|
id: number
|
||||||
|
sn: number
|
||||||
|
sex: "未知" | "男" | "女"
|
||||||
|
account: string
|
||||||
|
nickname: string
|
||||||
|
real_name: string
|
||||||
|
avatar: string
|
||||||
|
collect_count: number
|
||||||
|
coupon_count: number
|
||||||
|
create_time: string
|
||||||
|
has_auth: boolean
|
||||||
|
has_password: boolean
|
||||||
|
member: number
|
||||||
|
mobile: string
|
||||||
|
user_money: string
|
||||||
|
version: string
|
||||||
|
}
|
||||||
@ -1,13 +1,13 @@
|
|||||||
import { http } from '@/http/alova'
|
import { http } from '@/http/alova'
|
||||||
import type { IUserAddressListResult, IUserAddressDetailsResult, IUserCouponListResult } from '@/api/types/user'
|
import type { IUserAddressListResult, IUserAddressDetailsResult, IUserCouponListResult } from '@/api/types/user'
|
||||||
import type { IOrderListResult } from '@/api/types/order'
|
import type { IOrderListResult } from '@/api/types/order'
|
||||||
|
import type { IUserResult } from '@/api/types/user'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取用户个人信息
|
* 获取用户个人信息
|
||||||
*/
|
*/
|
||||||
export function getUserInfo() {
|
export function getUserInfo() {
|
||||||
return http.Post('/api/user/info')
|
return http.Post<IUserResult>('/api/user/info')
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -131,3 +131,15 @@ export interface IGetUserMoneyLogParams {
|
|||||||
export function getUserMoneyLog(data: IGetUserMoneyLogParams) {
|
export function getUserMoneyLog(data: IGetUserMoneyLogParams) {
|
||||||
return http.Post<IOrderListResult>('/api/user/moneyLogList', data)
|
return http.Post<IOrderListResult>('/api/user/moneyLogList', data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改用户信息
|
||||||
|
*/
|
||||||
|
export interface IUpdateUserInfoParams {
|
||||||
|
field: string,
|
||||||
|
value: string | number
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateUserInfo(data: IUpdateUserInfoParams) {
|
||||||
|
return http.Post('/api/user/setInfo', data)
|
||||||
|
}
|
||||||
|
|||||||
@ -442,6 +442,10 @@
|
|||||||
OrderDetail.handleInit()
|
OrderDetail.handleInit()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
onUnload(() => {
|
||||||
|
uni.$off('refreshOrderDetail')
|
||||||
|
})
|
||||||
|
|
||||||
const OrderDetail = {
|
const OrderDetail = {
|
||||||
// 获取订单详情
|
// 获取订单详情
|
||||||
handleInit: async () => {
|
handleInit: async () => {
|
||||||
|
|||||||
@ -21,11 +21,13 @@
|
|||||||
<view class="flex items-center">
|
<view class="flex items-center">
|
||||||
<view class="mr-10rpx">
|
<view class="mr-10rpx">
|
||||||
<wd-upload
|
<wd-upload
|
||||||
|
:header="{'token': tk}"
|
||||||
:file-list="fileList"
|
:file-list="fileList"
|
||||||
:limit="1"
|
:limit="1"
|
||||||
image-mode="scaleToFill"
|
image-mode="scaleToFill"
|
||||||
:action="action">
|
:action="action"
|
||||||
<wd-img width="64rpx" height="64rpx" :src="`${OSS}icon/icon_avatar.png`" mode="aspectFill" round />
|
@success="Profile.handleUploadSuccess">
|
||||||
|
<wd-img width="64rpx" height="64rpx" :src="user.avatar" mode="aspectFill" round />
|
||||||
</wd-upload>
|
</wd-upload>
|
||||||
</view>
|
</view>
|
||||||
<wd-icon name="arrow-right" size="32rpx" color="#C0C4CC" />
|
<wd-icon name="arrow-right" size="32rpx" color="#C0C4CC" />
|
||||||
@ -39,7 +41,7 @@
|
|||||||
<view class="flex justify-end">
|
<view class="flex justify-end">
|
||||||
<view class="flex items-center">
|
<view class="flex items-center">
|
||||||
<view class="font-400 text-[#303133] text-30rpx leading-42rpx">
|
<view class="font-400 text-[#303133] text-30rpx leading-42rpx">
|
||||||
王小伟
|
{{ user.nickname }}
|
||||||
</view>
|
</view>
|
||||||
<view>
|
<view>
|
||||||
<wd-icon name="arrow-right" size="32rpx" color="#C0C4CC" />
|
<wd-icon name="arrow-right" size="32rpx" color="#C0C4CC" />
|
||||||
@ -54,7 +56,7 @@
|
|||||||
<view class="flex justify-end">
|
<view class="flex justify-end">
|
||||||
<view class="flex items-center">
|
<view class="flex items-center">
|
||||||
<view class="font-400 text-[#303133] text-30rpx leading-42rpx">
|
<view class="font-400 text-[#303133] text-30rpx leading-42rpx">
|
||||||
+86 155****5456
|
+86 {{ maskedMobile }}
|
||||||
</view>
|
</view>
|
||||||
<view>
|
<view>
|
||||||
<wd-icon name="arrow-right" size="32rpx" color="#C0C4CC" />
|
<wd-icon name="arrow-right" size="32rpx" color="#C0C4CC" />
|
||||||
@ -124,34 +126,92 @@
|
|||||||
import {toast} from '@/utils/toast'
|
import {toast} from '@/utils/toast'
|
||||||
import { useUserStore } from '@/store'
|
import { useUserStore } from '@/store'
|
||||||
import { router } from '@/utils/tools'
|
import { router } from '@/utils/tools'
|
||||||
|
import { getUserInfo, updateUserInfo } from '@/api/user'
|
||||||
|
import type { IUserResult } from '@/api/types/user'
|
||||||
|
|
||||||
const OSS = inject('OSS')
|
const OSS = inject('OSS')
|
||||||
const showLogoutPopup = ref<boolean>(false) // 是否显示退出登录弹出框
|
const showLogoutPopup = ref<boolean>(false) // 是否显示退出登录弹出框
|
||||||
|
|
||||||
// 上传文件
|
// 上传文件
|
||||||
const fileList = ref<any[]>([])
|
const fileList = ref<any[]>([])
|
||||||
const action = 'https://www.mocky.io/v2/5cc8019d300000980a055e76' // 仅做测试使用,实际请换成真实上传接口
|
const action = 'https://cz.stnav.com/api/upload/image' // 仅做测试使用,实际请换成真实上传接口
|
||||||
|
|
||||||
// 修改昵称
|
// 修改昵称
|
||||||
const showEditNicknamePopup = ref<boolean>(false) // 是否显示退款详情弹出框
|
const showEditNicknamePopup = ref<boolean>(false) // 是否显示退款详情弹出框
|
||||||
const nickname = ref<string>('') // 昵称
|
const nickname = ref<string>('') // 昵称
|
||||||
|
|
||||||
|
// 用户信息相关
|
||||||
|
const user = ref<IUserResult>({
|
||||||
|
id: 0,
|
||||||
|
sn: 0,
|
||||||
|
sex: "未知",
|
||||||
|
account: "",
|
||||||
|
nickname: "",
|
||||||
|
real_name: "",
|
||||||
|
avatar: "",
|
||||||
|
collect_count: 0,
|
||||||
|
coupon_count: 0,
|
||||||
|
create_time: "",
|
||||||
|
has_auth: false,
|
||||||
|
has_password: false,
|
||||||
|
member: 0,
|
||||||
|
mobile: "",
|
||||||
|
user_money: "0.00",
|
||||||
|
version: ""
|
||||||
|
})
|
||||||
|
|
||||||
|
const tk = ref<string>('') // 用户token
|
||||||
|
|
||||||
|
onLoad(() => {
|
||||||
|
const userStore = useUserStore()
|
||||||
|
const { token } = userStore.userInfo
|
||||||
|
tk.value = token
|
||||||
|
|
||||||
|
Profile.handleInit()
|
||||||
|
})
|
||||||
|
|
||||||
const Profile = {
|
const Profile = {
|
||||||
// 图片选择/删除
|
/**
|
||||||
handleChange: (e: any) => {
|
* 初始化用户信息
|
||||||
console.log("🚀 ~ e:", e)
|
*/
|
||||||
|
handleInit: () => {
|
||||||
|
getUserInfo().then(res => {
|
||||||
|
user.value = res
|
||||||
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
// 保存昵称
|
handleUploadSuccess: async (e: any) => {
|
||||||
handleSaveNickname: () => {
|
try {
|
||||||
|
const response = JSON.parse(e.file.response)
|
||||||
|
if (response.code) {
|
||||||
|
const avatarUrl = response.data.uri
|
||||||
|
await updateUserInfo({ field: 'avatar', value: avatarUrl })
|
||||||
|
user.value.avatar = avatarUrl
|
||||||
|
toast.info('头像上传成功')
|
||||||
|
} else {
|
||||||
|
throw new Error('上传失败')
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
toast.info('上传失败')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存昵称
|
||||||
|
*/
|
||||||
|
handleSaveNickname: async () => {
|
||||||
if (!nickname.value) {
|
if (!nickname.value) {
|
||||||
toast.info('请输入昵称')
|
toast.info('请输入昵称')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await updateUserInfo({ field: 'nickname', value: nickname.value })
|
||||||
|
showEditNicknamePopup.value = false
|
||||||
|
user.value.nickname = nickname.value
|
||||||
toast.info('昵称修改成功')
|
toast.info('昵称修改成功')
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
// 修改手机号
|
// 修改手机号
|
||||||
handleToEditMobile: () => {
|
handleToEditMobile: () => {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
@ -169,6 +229,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 掩码处理手机号
|
||||||
|
*/
|
||||||
|
const maskedMobile = computed(() => {
|
||||||
|
if (!user.value.mobile) return ''
|
||||||
|
// 只处理11位手机号
|
||||||
|
return user.value.mobile.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2')
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
|||||||
@ -27,19 +27,19 @@ export const getUrlCode = (): { [key: string]: string | undefined } => {
|
|||||||
*/
|
*/
|
||||||
export async function snsapiBaseAuthorize() {
|
export async function snsapiBaseAuthorize() {
|
||||||
// TODO 测试代码
|
// TODO 测试代码
|
||||||
// wxSnsapiBaseLogin({code: '011ganGa10NGEK0reKGa1l3rpS2ganGX'}).then((res: IUserInfoVo) => {
|
wxSnsapiBaseLogin({code: '081fXl0w3YeN563rel1w37QK751fXl0l'}).then((res: IUserInfoVo) => {
|
||||||
// console.log("登录成功 ~ snsapiBaseAuthorize ~ res:", res)
|
console.log("登录成功 ~ snsapiBaseAuthorize ~ res:", res)
|
||||||
// // 映射 IUserLogin 到 IUserInfoVo
|
// 映射 IUserLogin 到 IUserInfoVo
|
||||||
// useUserStore().setUserInfo(res)
|
useUserStore().setUserInfo(res)
|
||||||
// uni.$emit('loginSuccess')
|
uni.$emit('loginSuccess')
|
||||||
|
|
||||||
// }).catch(err => {
|
}).catch(err => {
|
||||||
// // 失败就重新授权
|
// 失败就重新授权
|
||||||
// uni.setStorageSync('wechatCode', 0)
|
uni.setStorageSync('wechatCode', 0)
|
||||||
// console.log('请求失败', err)
|
console.log('请求失败', err)
|
||||||
// })
|
})
|
||||||
|
|
||||||
// return
|
return
|
||||||
|
|
||||||
let local = window.location.href // 获取页面url
|
let local = window.location.href // 获取页面url
|
||||||
let appid = import.meta.env.VITE_WX_SERVICE_ACCOUNT_APPID // 公众号的APPID
|
let appid = import.meta.env.VITE_WX_SERVICE_ACCOUNT_APPID // 公众号的APPID
|
||||||
@ -62,22 +62,22 @@ export async function snsapiBaseAuthorize() {
|
|||||||
uni.setStorageSync('wechatCode',code)
|
uni.setStorageSync('wechatCode',code)
|
||||||
// 使用code换取用户信息(同步写法)
|
// 使用code换取用户信息(同步写法)
|
||||||
uni.showLoading({title: '登录中...'})
|
uni.showLoading({title: '登录中...'})
|
||||||
try {
|
// try {
|
||||||
const res: IUserInfoVo = await wxSnsapiBaseLogin({code})
|
// const res: IUserInfoVo = await wxSnsapiBaseLogin({code})
|
||||||
console.log("登录成功 ~ snsapiBaseAuthorize ~ res:", res)
|
// console.log("登录成功 ~ snsapiBaseAuthorize ~ res:", res)
|
||||||
useUserStore().setUserInfo(res)
|
// useUserStore().setUserInfo(res)
|
||||||
// if (!res.mobile) {
|
// // if (!res.mobile) {
|
||||||
// // 如果没有绑定手机号的话需要去绑定手机号
|
// // // 如果没有绑定手机号的话需要去绑定手机号
|
||||||
// toast.info('请先绑定手机号')
|
// // toast.info('请先绑定手机号')
|
||||||
// router.navigateTo('/pages/login/mobile', 500)
|
// // router.navigateTo('/pages/login/mobile', 500)
|
||||||
// } else {
|
// // } else {
|
||||||
uni.$emit('loginSuccess')
|
// uni.$emit('loginSuccess')
|
||||||
|
// // }
|
||||||
|
// uni.hideLoading()
|
||||||
|
// } catch (err) {
|
||||||
|
// uni.setStorageSync('wechatCode', 0)
|
||||||
|
// uni.hideLoading()
|
||||||
|
// console.log('请求失败', err)
|
||||||
// }
|
// }
|
||||||
uni.hideLoading()
|
|
||||||
} catch (err) {
|
|
||||||
uni.setStorageSync('wechatCode', 0)
|
|
||||||
uni.hideLoading()
|
|
||||||
console.log('请求失败', err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -118,6 +118,7 @@
|
|||||||
{
|
{
|
||||||
"path": "pages/index/detail",
|
"path": "pages/index/detail",
|
||||||
"type": "page",
|
"type": "page",
|
||||||
|
"needLogin": "true",
|
||||||
"layout": "default",
|
"layout": "default",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationStyle": "custom"
|
"navigationStyle": "custom"
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
<route lang="jsonc" type="page">
|
<route lang="jsonc" type="page">
|
||||||
{
|
{
|
||||||
|
"needLogin": "true",
|
||||||
"layout": "default",
|
"layout": "default",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationStyle": "custom"
|
"navigationStyle": "custom"
|
||||||
|
|||||||
@ -157,7 +157,7 @@
|
|||||||
import TeaSpecialistLevel from '@/components/TeaSpecialistLevel.vue'
|
import TeaSpecialistLevel from '@/components/TeaSpecialistLevel.vue'
|
||||||
import {wxGetLocation} from '@/utils/jwexin'
|
import {wxGetLocation} from '@/utils/jwexin'
|
||||||
import {TeaSpecialistLevelValue} from '@/utils/teaSpecialist'
|
import {TeaSpecialistLevelValue} from '@/utils/teaSpecialist'
|
||||||
import {getDecorate, getTeaSpecialistLevels, getTeaSpecialist} from '@/api/home'
|
import {getDecorate, getTeaSpecialistLevels, getTeaSpecialist, getLocationToCity} from '@/api/home'
|
||||||
import {getCity} from '@/api/city'
|
import {getCity} from '@/api/city'
|
||||||
import type { IIndexListResult } from '@/api/types/home'
|
import type { IIndexListResult } from '@/api/types/home'
|
||||||
import { router } from '@/utils/tools'
|
import { router } from '@/utils/tools'
|
||||||
@ -177,14 +177,10 @@
|
|||||||
auto: true,
|
auto: true,
|
||||||
textNoMore: '~ 已经到底啦 ~', //无更多数据的提示
|
textNoMore: '~ 已经到底啦 ~', //无更多数据的提示
|
||||||
}
|
}
|
||||||
const latitude = ref<number>(import.meta.env.VITE_DEFAULT_LATITUDE) // 纬度
|
const latitude = ref<number>(0) // 纬度
|
||||||
const longitude = ref<number>(import.meta.env.VITE_DEFAULT_LONGITUDE) // 经度
|
const longitude = ref<number>(0) // 经度
|
||||||
|
|
||||||
// 经纬度缓存过期处理(1小时)
|
// 经纬度缓存过期处理(1小时)
|
||||||
const LOCATION_EXPIRE_KEY = 'location_expire_time'
|
|
||||||
const LOCATION_EXPIRE_MS = 30 * 24 * 60 * 60 * 1000 // 1个月
|
|
||||||
const LOCATION_DENY_KEY = 'location_deny_time'
|
|
||||||
const LOCATION_DENY_INTERVAL = 60 * 1000 // 1分钟
|
|
||||||
const defaultCity = ref<string>(import.meta.env.VITE_DEFAULT_ADDRESS) // 默认城市
|
const defaultCity = ref<string>(import.meta.env.VITE_DEFAULT_ADDRESS) // 默认城市
|
||||||
const list = ref<Array<any>>([]) // 茶艺师列表
|
const list = ref<Array<any>>([]) // 茶艺师列表
|
||||||
const teaSpecialistName = ref<string>('') // 茶艺师名称
|
const teaSpecialistName = ref<string>('') // 茶艺师名称
|
||||||
@ -197,8 +193,69 @@
|
|||||||
TeaSpecialistLevels.push(...res)
|
TeaSpecialistLevels.push(...res)
|
||||||
})
|
})
|
||||||
|
|
||||||
// 检查缓存是否过期,超时则重新授权
|
// 1. 检查经纬度缓存是否有效
|
||||||
await Index.handleEnsureLocationAuth()
|
const expire = uni.getStorageSync('location_expire_time')
|
||||||
|
const cacheLat = uni.getStorageSync('latitude')
|
||||||
|
const cacheLng = uni.getStorageSync('longitude')
|
||||||
|
const cacheCity= uni.getStorageSync('city')
|
||||||
|
if (expire && Date.now() < expire && cacheLat && cacheLng) {
|
||||||
|
// 缓存有效,直接用缓存
|
||||||
|
latitude.value = cacheLat
|
||||||
|
longitude.value = cacheLng
|
||||||
|
defaultCity.value = cacheCity || import.meta.env.VITE_DEFAULT_ADDRESS
|
||||||
|
} else {
|
||||||
|
// 2. 检查拒绝授权时间,30秒内不再弹窗
|
||||||
|
const denyTime = uni.getStorageSync('location_deny_time')
|
||||||
|
if (denyTime && Date.now() - denyTime < 5 * 1000) {
|
||||||
|
// 拒绝后30秒内,使用默认经纬度和城市
|
||||||
|
latitude.value = import.meta.env.VITE_DEFAULT_LATITUDE
|
||||||
|
longitude.value = import.meta.env.VITE_DEFAULT_LONGITUDE
|
||||||
|
defaultCity.value = import.meta.env.VITE_DEFAULT_ADDRESS
|
||||||
|
} else {
|
||||||
|
// 3. 请求地理位置授权
|
||||||
|
await new Promise((resolve) => {
|
||||||
|
wxGetLocation(async (res) => {
|
||||||
|
if (res === 'end') {
|
||||||
|
// 不处理
|
||||||
|
resolve(true)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res && res.latitude && res.longitude) {
|
||||||
|
latitude.value = res.latitude
|
||||||
|
longitude.value = res.longitude
|
||||||
|
|
||||||
|
// 如果授权成功则获取城市名称
|
||||||
|
const locRes = await getLocationToCity({latitude: res.latitude, longitude: res.longitude})
|
||||||
|
if (locRes && locRes.message === "Success") {
|
||||||
|
uni.setStorageSync('latitude', locRes.result.location.lat)
|
||||||
|
uni.setStorageSync('longitude', locRes.result.location.lng)
|
||||||
|
uni.setStorageSync('city', locRes.result.ad_info.city)
|
||||||
|
defaultCity.value = locRes.result.ad_info.city || import.meta.env.VITE_DEFAULT_ADDRESS
|
||||||
|
} else {
|
||||||
|
uni.setStorageSync('latitude', res.latitude)
|
||||||
|
uni.setStorageSync('longitude', res.longitude)
|
||||||
|
}
|
||||||
|
|
||||||
|
uni.setStorageSync('location_expire_time', Date.now() + 30 * 24 * 60 * 60 * 1000)
|
||||||
|
|
||||||
|
Index.handleGetCityList()
|
||||||
|
Index.handleSearch()
|
||||||
|
} else {
|
||||||
|
// 授权失败或拒绝,缓存拒绝时间30秒
|
||||||
|
uni.setStorageSync('location_deny_time', Date.now())
|
||||||
|
// 使用默认经纬度和城市
|
||||||
|
latitude.value = import.meta.env.VITE_DEFAULT_LATITUDE
|
||||||
|
longitude.value = import.meta.env.VITE_DEFAULT_LONGITUDE
|
||||||
|
defaultCity.value = import.meta.env.VITE_DEFAULT_ADDRESS
|
||||||
|
Index.handleGetCityList()
|
||||||
|
Index.handleSearch()
|
||||||
|
}
|
||||||
|
resolve(true)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// getDecorate({id: 1}).then((res: any) => {
|
// getDecorate({id: 1}).then((res: any) => {
|
||||||
// const data = JSON.parse(res.data)
|
// const data = JSON.parse(res.data)
|
||||||
@ -228,8 +285,11 @@
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
// 获取城市列表
|
// 获取城市列表
|
||||||
handleGetCityList: () => {
|
handleGetCityList: () => {
|
||||||
|
console.log("🚀 ~ latitude.value2:", latitude.value, longitude.value)
|
||||||
|
|
||||||
getCity({latitude: latitude.value, longitude: longitude.value}).then((res: any) => {
|
getCity({latitude: latitude.value, longitude: longitude.value}).then((res: any) => {
|
||||||
cityColumns.value = res.area_list.map(item => {
|
cityColumns.value = res.area_list.map(item => {
|
||||||
return {
|
return {
|
||||||
@ -240,74 +300,6 @@
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
// 设置经纬度缓存
|
|
||||||
handleSetLocationCache: (lat: number, lng: number) => {
|
|
||||||
uni.setStorageSync('latitude', lat)
|
|
||||||
uni.setStorageSync('longitude', lng)
|
|
||||||
uni.setStorageSync(LOCATION_EXPIRE_KEY, Date.now() + LOCATION_EXPIRE_MS)
|
|
||||||
},
|
|
||||||
|
|
||||||
// 检查经纬度缓存是否过期
|
|
||||||
handleCheckLocationCache: () => {
|
|
||||||
const expire = uni.getStorageSync(LOCATION_EXPIRE_KEY)
|
|
||||||
if (expire && Date.now() > expire) {
|
|
||||||
uni.removeStorageSync('latitude')
|
|
||||||
uni.removeStorageSync('longitude')
|
|
||||||
uni.removeStorageSync(LOCATION_EXPIRE_KEY)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
},
|
|
||||||
|
|
||||||
// 初始化经纬度
|
|
||||||
handleEnsureLocationAuth: async () => {
|
|
||||||
// 检查缓存是否过期
|
|
||||||
if (!Index.handleCheckLocationCache()) {
|
|
||||||
// 超时,重新获取授权
|
|
||||||
await Index.handleRequestLocationAuth()
|
|
||||||
} else {
|
|
||||||
const lat = uni.getStorageSync('latitude')
|
|
||||||
const lng = uni.getStorageSync('longitude')
|
|
||||||
if (lat && lng) {
|
|
||||||
latitude.value = lat
|
|
||||||
longitude.value = lng
|
|
||||||
} else {
|
|
||||||
await Index.handleRequestLocationAuth()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// 定位授权弹窗逻辑
|
|
||||||
handleRequestLocationAuth: async () => {
|
|
||||||
// 检查上次弹窗时间,1分钟内不再弹
|
|
||||||
const lastDeny = uni.getStorageSync(LOCATION_DENY_KEY)
|
|
||||||
if (lastDeny && Date.now() - lastDeny < LOCATION_DENY_INTERVAL) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
await wxGetLocation((res) => {
|
|
||||||
console.log("🚀 ~ res:", res)
|
|
||||||
if (res) {
|
|
||||||
latitude.value = res.latitude
|
|
||||||
longitude.value = res.longitude
|
|
||||||
}
|
|
||||||
|
|
||||||
Index.handleSetLocationCache(latitude.value, longitude.value)
|
|
||||||
Index.handleSearch()
|
|
||||||
Index.handleGetCityList()
|
|
||||||
})
|
|
||||||
} catch (e) {
|
|
||||||
// 用户拒绝授权,记录弹窗时间
|
|
||||||
uni.setStorageSync(LOCATION_DENY_KEY, Date.now())
|
|
||||||
// 可选:弹窗提示
|
|
||||||
uni.showModal({
|
|
||||||
title: '提示',
|
|
||||||
content: '需要获取您的地理位置以提供更好的服务,请在授权弹窗中允许定位。',
|
|
||||||
showCancel: false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// 选择城市
|
// 选择城市
|
||||||
handleSelectCity: (e: any) => {
|
handleSelectCity: (e: any) => {
|
||||||
cityValue.value = e.value
|
cityValue.value = e.value
|
||||||
|
|||||||
@ -25,16 +25,16 @@
|
|||||||
<!-- 账号昵称显示 -->
|
<!-- 账号昵称显示 -->
|
||||||
<view class="ml-60rpx flex items-center">
|
<view class="ml-60rpx flex items-center">
|
||||||
<view>
|
<view>
|
||||||
<wd-img width="120rpx" height="120rpx" :src="`${OSS}icon/icon_avatar.png`" mode="aspectFill" round />
|
<wd-img width="120rpx" height="120rpx" :src="isLogin ? user.avatar : `${OSS}icon/icon_avatar.png`" mode="aspectFill" round />
|
||||||
</view>
|
</view>
|
||||||
<view class="flex-1 ml-22rpx flex justify-between items-center" @click="My.handleToProfile">
|
<view class="flex-1 ml-22rpx flex justify-between items-center" @click="My.handleToProfile">
|
||||||
<!-- <view class="flex-1 ml-22rpx flex justify-between items-center"> -->
|
<!-- <view class="flex-1 ml-22rpx flex justify-between items-center"> -->
|
||||||
<view>
|
<view>
|
||||||
<view class="text-[#303133] text-36rpx leading-50rpx ml-8rpx">{{ isLogin ? userInfo.nickname : '立即登录' }}</view>
|
<view class="text-[#303133] text-36rpx leading-50rpx ml-8rpx">{{ isLogin ? user.nickname : '立即登录' }}</view>
|
||||||
<view v-if="isLogin" class="flex justify-center items-center vip-bg mt-10rpx" >
|
<view v-if="isLogin" class="flex justify-center items-center vip-bg mt-10rpx" >
|
||||||
<!-- 会员显示图标 -->
|
<!-- 会员显示图标 -->
|
||||||
<view v-if="isVip" class="flex items-center mr-12rpx">
|
<view v-if="isVip" class="flex items-center mr-12rpx">
|
||||||
<wd-img width="36rpx" height="36rpx" mode="aspectFill" :src="userInfo.avatar" round></wd-img>
|
<wd-img width="36rpx" height="36rpx" mode="aspectFill" :src="`${OSS}icon/icon_crown.png`" round></wd-img>
|
||||||
</view>
|
</view>
|
||||||
<!-- 这里要根据用户身份显示不同的文字 -->
|
<!-- 这里要根据用户身份显示不同的文字 -->
|
||||||
<view class="text-24rpx text-[#675649] leading-34rpx flex items-center">茶址会员</view>
|
<view class="text-24rpx text-[#675649] leading-34rpx flex items-center">茶址会员</view>
|
||||||
@ -272,17 +272,20 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
handleInitUserInfo: (code: string = '') => {
|
handleInitUserInfo: (code: string = '') => {
|
||||||
|
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
if (code && !userStore.userInfo.token) {
|
if (code && !userStore.userInfo.token) {
|
||||||
// 这里是微信授权之后跳转回到本页面获取到code但是没有登录状态的话需要进行登录操作
|
// 这里是微信授权之后跳转回到本页面获取到code但是没有登录状态的话需要进行登录操作
|
||||||
snsapiBaseAuthorize()
|
snsapiBaseAuthorize()
|
||||||
} else if (userStore.isLoggedIn) {
|
} else if (userStore.isLoggedIn) {
|
||||||
|
|
||||||
userInfo.value = userStore.userInfo
|
userInfo.value = userStore.userInfo
|
||||||
isLogin.value = userStore.isLoggedIn
|
isLogin.value = userStore.isLoggedIn
|
||||||
|
|
||||||
// 获取用户详情信息接口
|
// 获取用户详情信息接口
|
||||||
getUserInfo().then(res => {
|
getUserInfo().then(res => {
|
||||||
user.value = res
|
user.value = res
|
||||||
|
console.log("🚀 ~ user.value:", user.value)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -7,6 +7,8 @@
|
|||||||
import { useUserStore } from '@/store'
|
import { useUserStore } from '@/store'
|
||||||
import { tabbarStore } from '@/tabbar/store'
|
import { tabbarStore } from '@/tabbar/store'
|
||||||
import { needLoginPages as _needLoginPages, getLastPage, getNeedLoginPages } from '@/utils'
|
import { needLoginPages as _needLoginPages, getLastPage, getNeedLoginPages } from '@/utils'
|
||||||
|
import { router } from '@/utils/tools'
|
||||||
|
import { toast } from '@/utils/toast'
|
||||||
|
|
||||||
// TODO Check
|
// TODO Check
|
||||||
const loginRoute = import.meta.env.VITE_LOGIN_URL
|
const loginRoute = import.meta.env.VITE_LOGIN_URL
|
||||||
@ -53,7 +55,9 @@ export const navigateToInterceptor = {
|
|||||||
}
|
}
|
||||||
tabbarStore.restorePrevIdx()
|
tabbarStore.restorePrevIdx()
|
||||||
const redirectRoute = `${loginRoute}?redirect=${encodeURIComponent(url)}`
|
const redirectRoute = `${loginRoute}?redirect=${encodeURIComponent(url)}`
|
||||||
uni.navigateTo({ url: redirectRoute })
|
// uni.navigateTo({ url: redirectRoute })
|
||||||
|
toast.info('请先登录')
|
||||||
|
router.switchTab(redirectRoute, 500)
|
||||||
return false
|
return false
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,12 +65,13 @@ export async function wxGetLocation(callback: (res: any) => void ) {
|
|||||||
console.log('授权失败:' + res)
|
console.log('授权失败:' + res)
|
||||||
},
|
},
|
||||||
complete:function(res){
|
complete:function(res){
|
||||||
console.log(res)
|
|
||||||
if (res.errMsg === 'getLocation:cancel') {
|
if (res.errMsg === 'getLocation:cancel') {
|
||||||
// 用户拒绝授权
|
// 用户拒绝授权
|
||||||
uni.setStorageSync('location_deny_time', Date.now())
|
uni.setStorageSync('location_deny_time', Date.now())
|
||||||
}
|
|
||||||
callback(false)
|
callback(false)
|
||||||
|
} else {
|
||||||
|
callback('end')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user