Compare commits
3 Commits
638300113b
...
67addd582f
Author | SHA1 | Date |
---|---|---|
|
67addd582f | |
|
e895e5619c | |
|
401d8ac4ca |
11
src/App.vue
11
src/App.vue
|
@ -46,13 +46,16 @@ onMounted(() => {
|
||||||
watch(
|
watch(
|
||||||
() => wxStore.userid,
|
() => wxStore.userid,
|
||||||
(newVal) => {
|
(newVal) => {
|
||||||
if (newVal && !ab98UserStore.isLogin) {
|
const isLogin = ab98UserStore.isLogin;
|
||||||
tokenLogin(ab98UserStore.tokenLogin, newVal).then(res => {
|
if (newVal) {
|
||||||
|
tokenLogin(ab98UserStore.tokenLogin, newVal, wxStore.openid).then(res => {
|
||||||
if (res?.code === 0 && res.data?.success) {
|
if (res?.code === 0 && res.data?.success) {
|
||||||
ab98UserStore.setTel(res.data.tel)
|
ab98UserStore.setTel(res.data.tel)
|
||||||
ab98UserStore.setUserInfo(res.data)
|
ab98UserStore.setUserInfo(res.data)
|
||||||
ab98UserStore.setIsLogin(true)
|
if (!isLogin) {
|
||||||
router.push('/')
|
ab98UserStore.setIsLogin(true)
|
||||||
|
router.push('/')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,10 +55,10 @@ export function logoutApi(token: string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** ab98Token登录 */
|
/** ab98Token登录 */
|
||||||
export function tokenLogin(token: string, userid: string) {
|
export function tokenLogin(token: string, userid: string, openid: string) {
|
||||||
return request<ApiResponseData<LoginData>>({
|
return request<ApiResponseData<LoginData>>({
|
||||||
url: '/wx/login/tokenLogin',
|
url: '/wx/login/tokenLogin',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: { token, userid }
|
params: { token, userid, openid }
|
||||||
})
|
})
|
||||||
}
|
}
|
|
@ -57,4 +57,5 @@ export type VerifySmsParams = {
|
||||||
/** 验证码 */
|
/** 验证码 */
|
||||||
vcode: string
|
vcode: string
|
||||||
userid: string
|
userid: string
|
||||||
|
openid: string
|
||||||
}
|
}
|
|
@ -8,6 +8,7 @@ export interface CabinetDetailDTO {
|
||||||
export interface CellInfoDTO {
|
export interface CellInfoDTO {
|
||||||
cellId: number
|
cellId: number
|
||||||
pinNo: number
|
pinNo: number
|
||||||
|
stock: number
|
||||||
product?: ProductInfoDTO
|
product?: ProductInfoDTO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,15 @@
|
||||||
<div class="product-list">
|
<div class="product-list">
|
||||||
<van-cell v-for="locker in lockerList" :key="locker.lockerId" class="product-item">
|
<van-cell v-for="locker in lockerList" :key="locker.lockerId" class="product-item">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<van-image width="80" height="80"
|
<div class="image-container">
|
||||||
:src="locker.coverImg ? locker.coverImg : `${publicPath}` + 'img/product-image.svg'" fit="cover"
|
<van-image width="80" height="80"
|
||||||
radius="4" class="product-image">
|
:src="locker.coverImg ? locker.coverImg : `${publicPath}` + 'img/product-image.svg'" fit="cover"
|
||||||
</van-image>
|
radius="4" class="product-image" :style="{ filter: locker.stock === 0 ? 'grayscale(100%)' : 'none' }">
|
||||||
|
</van-image>
|
||||||
|
<div v-if="locker.stock >= 0" class="stock-overlay">
|
||||||
|
库存: {{ locker.stock }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<!-- <div v-else class="status-overlay">
|
<!-- <div v-else class="status-overlay">
|
||||||
<svg width="80" height="80" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
<svg width="80" height="80" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
||||||
<rect x="5" y="5" width="90" height="90" rx="10" fill="#E8F5E9" stroke="#81C784"
|
<rect x="5" y="5" width="90" height="90" rx="10" fill="#E8F5E9" stroke="#81C784"
|
||||||
|
@ -77,6 +82,7 @@ interface CabinetItem {
|
||||||
interface LockerItem {
|
interface LockerItem {
|
||||||
lockerId: number
|
lockerId: number
|
||||||
lockerNumber: number
|
lockerNumber: number
|
||||||
|
stock: number
|
||||||
status: 0 | 1
|
status: 0 | 1
|
||||||
statusClass: 'available' | 'occupied'
|
statusClass: 'available' | 'occupied'
|
||||||
goodsName?: string
|
goodsName?: string
|
||||||
|
@ -109,6 +115,7 @@ const updateLockerList = (cabinet: CabinetDetailDTO) => {
|
||||||
lockerList.value = cabinet.cells.map(cell => ({
|
lockerList.value = cabinet.cells.map(cell => ({
|
||||||
lockerId: cell.cellId,
|
lockerId: cell.cellId,
|
||||||
lockerNumber: cell.pinNo,
|
lockerNumber: cell.pinNo,
|
||||||
|
stock: cell.stock,
|
||||||
status: cell.product ? 1 : 0,
|
status: cell.product ? 1 : 0,
|
||||||
statusClass: cell.product ? 'occupied' : 'available',
|
statusClass: cell.product ? 'occupied' : 'available',
|
||||||
goodsName: cell.product?.goodsName,
|
goodsName: cell.product?.goodsName,
|
||||||
|
@ -152,6 +159,24 @@ loadCabinetDetail()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
.image-container {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stock-overlay {
|
||||||
|
position: absolute;
|
||||||
|
right: 4px;
|
||||||
|
bottom: 4px;
|
||||||
|
background-color: rgba(0, 0, 0, 0.6);
|
||||||
|
color: white;
|
||||||
|
padding: 2px 6px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
.cabinet-container {
|
.cabinet-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
height: calc(100vh - var(--van-tabbar-height));
|
height: calc(100vh - var(--van-tabbar-height));
|
||||||
|
|
|
@ -111,7 +111,8 @@ const handleSubmit = async () => {
|
||||||
token: userStore.token,
|
token: userStore.token,
|
||||||
tel: form.value.tel,
|
tel: form.value.tel,
|
||||||
vcode: form.value.vcode,
|
vcode: form.value.vcode,
|
||||||
userid: wxStore.userid
|
userid: wxStore.userid,
|
||||||
|
openid: wxStore.openid
|
||||||
})
|
})
|
||||||
|
|
||||||
if (data.success) {
|
if (data.success) {
|
||||||
|
|
|
@ -9,7 +9,8 @@ const STORAGE_KEYS = {
|
||||||
USERID: 'ab98_userid',
|
USERID: 'ab98_userid',
|
||||||
REGISTERED: 'ab98_registered',
|
REGISTERED: 'ab98_registered',
|
||||||
TEL: 'ab98_tel',
|
TEL: 'ab98_tel',
|
||||||
TOKEN: 'ab98_token'
|
TOKEN: 'ab98_token',
|
||||||
|
LOGIN_CODE: 'ab98_login_code'
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -39,9 +40,12 @@ export const useAb98UserStore = defineStore("ab98User", () => {
|
||||||
const token = ref<string>(storedToken ? decodeURIComponent(storedToken) : "");
|
const token = ref<string>(storedToken ? decodeURIComponent(storedToken) : "");
|
||||||
|
|
||||||
const tokenLogin = ref<string>("");
|
const tokenLogin = ref<string>("");
|
||||||
|
// 登录验证码
|
||||||
|
const loginCode = '1'; // 默认验证码
|
||||||
// 用户登录状态
|
// 用户登录状态
|
||||||
const isLogin = ref<boolean>(false);
|
const isLogin = ref<boolean>(false);
|
||||||
isLogin.value = tel.value ? true : false;
|
const storedLoginCode = localStorage.getItem(STORAGE_KEYS.LOGIN_CODE);
|
||||||
|
isLogin.value = tel.value && storedLoginCode === String(loginCode) ? true : false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新用户基本信息
|
* 更新用户基本信息
|
||||||
|
@ -60,6 +64,7 @@ export const useAb98UserStore = defineStore("ab98User", () => {
|
||||||
localStorage.setItem(STORAGE_KEYS.REGISTERED, JSON.stringify(data.registered))
|
localStorage.setItem(STORAGE_KEYS.REGISTERED, JSON.stringify(data.registered))
|
||||||
tel.value = data.tel
|
tel.value = data.tel
|
||||||
localStorage.setItem(STORAGE_KEYS.TEL, encodeURIComponent(data.tel))
|
localStorage.setItem(STORAGE_KEYS.TEL, encodeURIComponent(data.tel))
|
||||||
|
localStorage.setItem(STORAGE_KEYS.LOGIN_CODE, encodeURIComponent(loginCode))
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -80,6 +85,7 @@ export const useAb98UserStore = defineStore("ab98User", () => {
|
||||||
tel.value = ""
|
tel.value = ""
|
||||||
localStorage.removeItem(STORAGE_KEYS.TEL)
|
localStorage.removeItem(STORAGE_KEYS.TEL)
|
||||||
localStorage.removeItem(STORAGE_KEYS.TOKEN)
|
localStorage.removeItem(STORAGE_KEYS.TOKEN)
|
||||||
|
localStorage.removeItem(STORAGE_KEYS.LOGIN_CODE)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue