初步完成merchant和admin不同role的展示内容逻辑
This commit is contained in:
@@ -1,16 +1,43 @@
|
||||
ak-req.uts:144
|
||||
POST http://119.146.131.237:9126/auth/v1/signup 500 (Internal Server Error)
|
||||
register.uvue:221 📝 注册返回结果:
|
||||
UTSJSONObject2 {code: '23505', message: 'duplicate key value violates unique constraint "ak_users_email_key"', detail: 'Key (email)=(admin@163.com) already exists.', _resolveKeyPath: ƒ, _getValue: ƒ, …}
|
||||
code
|
||||
|
||||
list.uvue:526 Coupon list initializing and fetching data...
|
||||
13
|
||||
role.uts:59 [AdminRole] 未能获取到有效的管理端角色,准备安全降级...
|
||||
role.uts:59 [AdminRole] 未能获取到有效的管理端角色,准备安全降级...
|
||||
login.uvue:373 signIn result:
|
||||
AkSupaSignInResult {access_token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmO…xzZX0.YFcXQloKqsalFsOktCsDQUWPwvP8d_B58ss_SznxwZs', refresh_token: 'gdsl27rjhn62', expires_at: 1773284440, user: UTSJSONObject2, token_type: 'bearer', …}
|
||||
access_token
|
||||
:
|
||||
"23505"
|
||||
detail
|
||||
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmOTkyZGZmYS1hOGZkLTQ1YmItODY3MC02ZmVlNWE1YWU4NGQiLCJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNzczMjg0NDQwLCJpYXQiOjE3NzMyODA4NDAsImVtYWlsIjoiYWRtaW5AMTYzLmNvbSIsInBob25lIjoiIiwiYXBwX21ldGFkYXRhIjp7InByb3ZpZGVyIjoiZW1haWwiLCJwcm92aWRlcnMiOlsiZW1haWwiXX0sInVzZXJfbWV0YWRhdGEiOnsiZW1haWwiOiJhZG1pbkAxNjMuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInBob25lX3ZlcmlmaWVkIjpmYWxzZSwic3ViIjoiZjk5MmRmZmEtYThmZC00NWJiLTg2NzAtNmZlZTVhNWFlODRkIiwidXNlcl9yb2xlIjoibWVyY2hhbnQifSwicm9sZSI6ImF1dGhlbnRpY2F0ZWQiLCJhYWwiOiJhYWwxIiwiYW1yIjpbeyJtZXRob2QiOiJwYXNzd29yZCIsInRpbWVzdGFtcCI6MTc3MzI4MDg0MH1dLCJzZXNzaW9uX2lkIjoiMTJhMmEyZjgtZWU1ZC00OWZjLWIwOTAtOTBlNmIzNWMxZGJhIiwiaXNfYW5vbnltb3VzIjpmYWxzZX0.YFcXQloKqsalFsOktCsDQUWPwvP8d_B58ss_SznxwZs"
|
||||
expires_at
|
||||
:
|
||||
"Key (email)=(admin@163.com) already exists."
|
||||
message
|
||||
1773284440
|
||||
expires_in
|
||||
:
|
||||
"duplicate key value violates unique constraint \"ak_users_email_key\""
|
||||
3600
|
||||
raw
|
||||
:
|
||||
UTSJSONObject2
|
||||
access_token
|
||||
:
|
||||
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmOTkyZGZmYS1hOGZkLTQ1YmItODY3MC02ZmVlNWE1YWU4NGQiLCJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNzczMjg0NDQwLCJpYXQiOjE3NzMyODA4NDAsImVtYWlsIjoiYWRtaW5AMTYzLmNvbSIsInBob25lIjoiIiwiYXBwX21ldGFkYXRhIjp7InByb3ZpZGVyIjoiZW1haWwiLCJwcm92aWRlcnMiOlsiZW1haWwiXX0sInVzZXJfbWV0YWRhdGEiOnsiZW1haWwiOiJhZG1pbkAxNjMuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInBob25lX3ZlcmlmaWVkIjpmYWxzZSwic3ViIjoiZjk5MmRmZmEtYThmZC00NWJiLTg2NzAtNmZlZTVhNWFlODRkIiwidXNlcl9yb2xlIjoibWVyY2hhbnQifSwicm9sZSI6ImF1dGhlbnRpY2F0ZWQiLCJhYWwiOiJhYWwxIiwiYW1yIjpbeyJtZXRob2QiOiJwYXNzd29yZCIsInRpbWVzdGFtcCI6MTc3MzI4MDg0MH1dLCJzZXNzaW9uX2lkIjoiMTJhMmEyZjgtZWU1ZC00OWZjLWIwOTAtOTBlNmIzNWMxZGJhIiwiaXNfYW5vbnltb3VzIjpmYWxzZX0.YFcXQloKqsalFsOktCsDQUWPwvP8d_B58ss_SznxwZs"
|
||||
expires_at
|
||||
:
|
||||
1773284440
|
||||
expires_in
|
||||
:
|
||||
3600
|
||||
refresh_token
|
||||
:
|
||||
"gdsl27rjhn62"
|
||||
token_type
|
||||
:
|
||||
"bearer"
|
||||
user
|
||||
:
|
||||
UTSJSONObject2 {id: 'f992dffa-a8fd-45bb-8670-6fee5a5ae84d', aud: 'authenticated', role: 'authenticated', email: 'admin@163.com', email_confirmed_at: '2026-03-12T01:25:56.424096Z', …}
|
||||
weak_password
|
||||
:
|
||||
null
|
||||
forEach
|
||||
:
|
||||
ƒ forEach(callback)
|
||||
@@ -52,4 +79,205 @@ _resolveKeyPath
|
||||
ƒ _resolveKeyPath(keyPath)
|
||||
[[Prototype]]
|
||||
:
|
||||
Object
|
||||
Object
|
||||
refresh_token
|
||||
:
|
||||
"gdsl27rjhn62"
|
||||
token_type
|
||||
:
|
||||
"bearer"
|
||||
user
|
||||
:
|
||||
UTSJSONObject2 {id: 'f992dffa-a8fd-45bb-8670-6fee5a5ae84d', aud: 'authenticated', role: 'authenticated', email: 'admin@163.com', email_confirmed_at: '2026-03-12T01:25:56.424096Z', …}
|
||||
$UTSMetadata$
|
||||
:
|
||||
(...)
|
||||
[[Prototype]]
|
||||
:
|
||||
UTSType
|
||||
login.uvue:176 🔍 开始校验商家端角色 -> UID: f992dffa-a8fd-45bb-8670-6fee5a5ae84d, Email: admin@163.com
|
||||
login.uvue:186 ✅ 按 auth_id 匹配成功,role: admin
|
||||
login.uvue:449 登录错误: Error: 您还没有注册商家端账户,快去注册一个
|
||||
at login.uvue:403:10
|
||||
at Generator.next (<anonymous>)
|
||||
login.uvue:373 signIn result:
|
||||
AkSupaSignInResult {access_token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmO…xzZX0.0RArWcn148XkRpW9C0vwboAcvpem4KRz6-OO0vAE4RU', refresh_token: 'kgzfaeokz4r2', expires_at: 1773284456, user: UTSJSONObject2, token_type: 'bearer', …}
|
||||
access_token
|
||||
:
|
||||
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmOTkyZGZmYS1hOGZkLTQ1YmItODY3MC02ZmVlNWE1YWU4NGQiLCJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNzczMjg0NDU2LCJpYXQiOjE3NzMyODA4NTYsImVtYWlsIjoiYWRtaW5AMTYzLmNvbSIsInBob25lIjoiIiwiYXBwX21ldGFkYXRhIjp7InByb3ZpZGVyIjoiZW1haWwiLCJwcm92aWRlcnMiOlsiZW1haWwiXX0sInVzZXJfbWV0YWRhdGEiOnsiZW1haWwiOiJhZG1pbkAxNjMuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInBob25lX3ZlcmlmaWVkIjpmYWxzZSwic3ViIjoiZjk5MmRmZmEtYThmZC00NWJiLTg2NzAtNmZlZTVhNWFlODRkIiwidXNlcl9yb2xlIjoibWVyY2hhbnQifSwicm9sZSI6ImF1dGhlbnRpY2F0ZWQiLCJhYWwiOiJhYWwxIiwiYW1yIjpbeyJtZXRob2QiOiJwYXNzd29yZCIsInRpbWVzdGFtcCI6MTc3MzI4MDg1Nn1dLCJzZXNzaW9uX2lkIjoiN2NlZWYwZjQtNmNlOS00ZDE5LWJjYmItNzFhNDVmOTRiZTI2IiwiaXNfYW5vbnltb3VzIjpmYWxzZX0.0RArWcn148XkRpW9C0vwboAcvpem4KRz6-OO0vAE4RU"
|
||||
expires_at
|
||||
:
|
||||
1773284456
|
||||
expires_in
|
||||
:
|
||||
3600
|
||||
raw
|
||||
:
|
||||
UTSJSONObject2
|
||||
access_token
|
||||
:
|
||||
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmOTkyZGZmYS1hOGZkLTQ1YmItODY3MC02ZmVlNWE1YWU4NGQiLCJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNzczMjg0NDU2LCJpYXQiOjE3NzMyODA4NTYsImVtYWlsIjoiYWRtaW5AMTYzLmNvbSIsInBob25lIjoiIiwiYXBwX21ldGFkYXRhIjp7InByb3ZpZGVyIjoiZW1haWwiLCJwcm92aWRlcnMiOlsiZW1haWwiXX0sInVzZXJfbWV0YWRhdGEiOnsiZW1haWwiOiJhZG1pbkAxNjMuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInBob25lX3ZlcmlmaWVkIjpmYWxzZSwic3ViIjoiZjk5MmRmZmEtYThmZC00NWJiLTg2NzAtNmZlZTVhNWFlODRkIiwidXNlcl9yb2xlIjoibWVyY2hhbnQifSwicm9sZSI6ImF1dGhlbnRpY2F0ZWQiLCJhYWwiOiJhYWwxIiwiYW1yIjpbeyJtZXRob2QiOiJwYXNzd29yZCIsInRpbWVzdGFtcCI6MTc3MzI4MDg1Nn1dLCJzZXNzaW9uX2lkIjoiN2NlZWYwZjQtNmNlOS00ZDE5LWJjYmItNzFhNDVmOTRiZTI2IiwiaXNfYW5vbnltb3VzIjpmYWxzZX0.0RArWcn148XkRpW9C0vwboAcvpem4KRz6-OO0vAE4RU"
|
||||
expires_at
|
||||
:
|
||||
1773284456
|
||||
expires_in
|
||||
:
|
||||
3600
|
||||
refresh_token
|
||||
:
|
||||
"kgzfaeokz4r2"
|
||||
token_type
|
||||
:
|
||||
"bearer"
|
||||
user
|
||||
:
|
||||
UTSJSONObject2 {id: 'f992dffa-a8fd-45bb-8670-6fee5a5ae84d', aud: 'authenticated', role: 'authenticated', email: 'admin@163.com', email_confirmed_at: '2026-03-12T01:25:56.424096Z', …}
|
||||
weak_password
|
||||
:
|
||||
null
|
||||
forEach
|
||||
:
|
||||
ƒ forEach(callback)
|
||||
get
|
||||
:
|
||||
ƒ get(key)
|
||||
getAny
|
||||
:
|
||||
ƒ getAny(key, defaultValue)
|
||||
getArray
|
||||
:
|
||||
ƒ getArray(key, defaultValue)
|
||||
getBoolean
|
||||
:
|
||||
ƒ getBoolean(key, defaultValue)
|
||||
getJSON
|
||||
:
|
||||
ƒ getJSON(key, defaultValue)
|
||||
getNumber
|
||||
:
|
||||
ƒ getNumber(key, defaultValue)
|
||||
getString
|
||||
:
|
||||
ƒ getString(key, defaultValue)
|
||||
set
|
||||
:
|
||||
ƒ set(key, value)
|
||||
toJSON
|
||||
:
|
||||
undefined
|
||||
toMap
|
||||
:
|
||||
ƒ toMap()
|
||||
_getValue
|
||||
:
|
||||
ƒ _getValue(keyPath, defaultValue)
|
||||
_resolveKeyPath
|
||||
:
|
||||
ƒ _resolveKeyPath(keyPath)
|
||||
[[Prototype]]
|
||||
:
|
||||
Object
|
||||
refresh_token
|
||||
:
|
||||
"kgzfaeokz4r2"
|
||||
token_type
|
||||
:
|
||||
"bearer"
|
||||
user
|
||||
:
|
||||
UTSJSONObject2
|
||||
app_metadata
|
||||
:
|
||||
UTSJSONObject2 {provider: 'email', providers: Array(1), toJSON: undefined, _resolveKeyPath: ƒ, _getValue: ƒ, …}
|
||||
aud
|
||||
:
|
||||
"authenticated"
|
||||
confirmed_at
|
||||
:
|
||||
"2026-03-12T01:25:56.424096Z"
|
||||
created_at
|
||||
:
|
||||
"2026-03-12T01:25:56.397092Z"
|
||||
email
|
||||
:
|
||||
"admin@163.com"
|
||||
email_confirmed_at
|
||||
:
|
||||
"2026-03-12T01:25:56.424096Z"
|
||||
id
|
||||
:
|
||||
"f992dffa-a8fd-45bb-8670-6fee5a5ae84d"
|
||||
identities
|
||||
:
|
||||
[UTSJSONObject2]
|
||||
is_anonymous
|
||||
:
|
||||
false
|
||||
last_sign_in_at
|
||||
:
|
||||
"2026-03-12T02:00:56.659679275Z"
|
||||
phone
|
||||
:
|
||||
""
|
||||
role
|
||||
:
|
||||
"authenticated"
|
||||
updated_at
|
||||
:
|
||||
"2026-03-12T02:00:56.667158Z"
|
||||
user_metadata
|
||||
:
|
||||
UTSJSONObject2 {email: 'admin@163.com', email_verified: true, phone_verified: false, sub: 'f992dffa-a8fd-45bb-8670-6fee5a5ae84d', user_role: 'merchant', …}
|
||||
forEach
|
||||
:
|
||||
ƒ forEach(callback)
|
||||
get
|
||||
:
|
||||
ƒ get(key)
|
||||
getAny
|
||||
:
|
||||
ƒ getAny(key, defaultValue)
|
||||
getArray
|
||||
:
|
||||
ƒ getArray(key, defaultValue)
|
||||
getBoolean
|
||||
:
|
||||
ƒ getBoolean(key, defaultValue)
|
||||
getJSON
|
||||
:
|
||||
ƒ getJSON(key, defaultValue)
|
||||
getNumber
|
||||
:
|
||||
ƒ getNumber(key, defaultValue)
|
||||
getString
|
||||
:
|
||||
ƒ getString(key, defaultValue)
|
||||
set
|
||||
:
|
||||
ƒ set(key, value)
|
||||
toJSON
|
||||
:
|
||||
undefined
|
||||
toMap
|
||||
:
|
||||
ƒ toMap()
|
||||
_getValue
|
||||
:
|
||||
ƒ _getValue(keyPath, defaultValue)
|
||||
_resolveKeyPath
|
||||
:
|
||||
ƒ _resolveKeyPath(keyPath)
|
||||
[[Prototype]]
|
||||
:
|
||||
Object
|
||||
$UTSMetadata$
|
||||
:
|
||||
(...)
|
||||
[[Prototype]]
|
||||
:
|
||||
UTSType
|
||||
login.uvue:176 🔍 开始校验商家端角色 -> UID: f992dffa-a8fd-45bb-8670-6fee5a5ae84d, Email: admin@163.com
|
||||
login.uvue:186 ✅ 按 auth_id 匹配成功,role: admin
|
||||
login.uvue:449 登录错误: Error: 您还没有注册商家端账户,快去注册一个
|
||||
at login.uvue:403:10
|
||||
at Generator.next (<anonymous>)
|
||||
|
||||
@@ -175,65 +175,54 @@ const isLoading = ref<boolean>(false)
|
||||
* 【核心函数】:登录成功后,多条件校验是否为商家角色
|
||||
* 优先级: session_uid (auth_id) -> id -> normalized email
|
||||
*/
|
||||
const checkMerchantAccess = async (uid: string, rawEmail: string) : Promise<string | null> => {
|
||||
const email = rawEmail.trim().toLowerCase()
|
||||
console.log(`🔍 开始校验商家端角色 -> UID: ${uid}, Email: ${email}`)
|
||||
const checkAdminOrMerchantAccess = async (uid: string, rawEmail: string) : Promise<UTSJSONObject | null> => {
|
||||
const email = rawEmail.trim().toLowerCase()
|
||||
console.log(`🔍 开始校验后台或商家端角色 -> UID: ${uid}, Email: ${email}`)
|
||||
|
||||
try {
|
||||
// 1. 尝试按 auth_id 查询
|
||||
let res = await supa.from('ak_users').select('id, role').eq('auth_id', uid).execute()
|
||||
let dataArray = res.data
|
||||
if (Array.isArray(dataArray) && dataArray.length > 0) {
|
||||
const obj = dataArray[0] as UTSJSONObject
|
||||
const role = obj.getString('role')
|
||||
const id = obj.getString('id')
|
||||
console.log('✅ 按 auth_id 匹配成功,role:', role)
|
||||
if (role === 'merchant' && id != null) return id
|
||||
return null
|
||||
}
|
||||
const parseRoleData = (dataArray: any | null): UTSJSONObject | null => {
|
||||
if (Array.isArray(dataArray) && dataArray.length > 0) {
|
||||
const obj = dataArray[0] as UTSJSONObject
|
||||
const role = obj.getString('role')
|
||||
const id = obj.getString('id')
|
||||
console.log('✅ 匹配成功,role:', role)
|
||||
if ((role === 'merchant' || role === 'admin') && id != null) {
|
||||
return { id, role } as UTSJSONObject
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
// 2. 尝试按 id 查询 (兼容老数据)
|
||||
res = await supa.from('ak_users').select('id, role').eq('id', uid).execute()
|
||||
dataArray = res.data
|
||||
if (Array.isArray(dataArray) && dataArray.length > 0) {
|
||||
const obj = dataArray[0] as UTSJSONObject
|
||||
const role = obj.getString('role')
|
||||
const id = obj.getString('id')
|
||||
console.log('✅ 按 id 匹配成功,role:', role)
|
||||
if (role === 'merchant' && id != null) return id
|
||||
return null
|
||||
}
|
||||
try {
|
||||
// 1. 尝试按 auth_id 查询
|
||||
let res = await supa.from('ak_users').select('id, role').eq('auth_id', uid).execute()
|
||||
let parsed = parseRoleData(res.data)
|
||||
if (parsed != null) return parsed
|
||||
|
||||
// 3. 尝试按 email 兜底查询
|
||||
if (email !== '') {
|
||||
res = await supa.from('ak_users').select('id, role').eq('email', email).execute()
|
||||
dataArray = res.data
|
||||
|
||||
if (Array.isArray(dataArray) && dataArray.length > 0) {
|
||||
// 如果按邮箱查出来多条,可能存在脏数据,只取第一条并记录日志
|
||||
if (dataArray.length > 1) {
|
||||
console.error('⚠️ 警告: 按 email 查到多条 ak_users 记录,取第一条校验。Email:', email)
|
||||
}
|
||||
const obj = dataArray[0] as UTSJSONObject
|
||||
const role = obj.getString('role')
|
||||
const id = obj.getString('id')
|
||||
console.log('✅ 按 email 匹配成功,role:', role)
|
||||
if (role === 'merchant' && id != null) return id
|
||||
return null
|
||||
}
|
||||
}
|
||||
// 2. 尝试按 id 查询 (兼容老数据)
|
||||
res = await supa.from('ak_users').select('id, role').eq('id', uid).execute()
|
||||
parsed = parseRoleData(res.data)
|
||||
if (parsed != null) return parsed
|
||||
|
||||
console.error('❌ 未能在 ak_users 中找到该用户的任何记录')
|
||||
// 查无此人,跑出自定义错误以与普通系统报错区分
|
||||
throw new Error('NOT_REGISTERED')
|
||||
} catch (e) {
|
||||
console.error('❌ 查询角色过程异常:', e)
|
||||
if (e instanceof Error && e.message === 'NOT_REGISTERED') {
|
||||
throw new Error('您还没有注册商家端账户,快去注册一个')
|
||||
}
|
||||
// 真实的查询异常/RLS异常抛出,防止误会为"未注册"
|
||||
throw new Error('商家身份校验失败,请联系管理员检查用户数据')
|
||||
}
|
||||
// 3. 尝试按 email 兜底查询
|
||||
if (email !== '') {
|
||||
res = await supa.from('ak_users').select('id, role').eq('email', email).execute()
|
||||
const dataArray = res.data
|
||||
if (Array.isArray(dataArray) && dataArray.length > 1) {
|
||||
console.error('⚠️ 警告: 按 email 查到多条 ak_users 记录,取第一条校验。Email:', email)
|
||||
}
|
||||
parsed = parseRoleData(dataArray)
|
||||
if (parsed != null) return parsed
|
||||
}
|
||||
|
||||
console.error('❌ 未能在 ak_users 中找到该用户的有效角色记录')
|
||||
throw new Error('NOT_REGISTERED')
|
||||
} catch (e) {
|
||||
console.error('❌ 查询角色过程异常:', e)
|
||||
if (e instanceof Error && e.message === 'NOT_REGISTERED') {
|
||||
throw new Error('该账户无后台或商家端权限,请联系管理员核对')
|
||||
}
|
||||
throw new Error('后台身份校验失败,请联系管理员检查用户数据')
|
||||
}
|
||||
}
|
||||
|
||||
const codeDisabled = ref<boolean>(false)
|
||||
@@ -400,15 +389,22 @@ const handleLogin = async () => {
|
||||
const sessionUser = result.user
|
||||
let sessionUid = sessionUser?.getString('id') ?? ''
|
||||
|
||||
const merchantId = await checkMerchantAccess(sessionUid, account.value)
|
||||
if (merchantId == null) {
|
||||
await supa.signOut()
|
||||
logout()
|
||||
throw new Error('您还没有注册商家端账户,快去注册一个')
|
||||
}
|
||||
const accessData = await checkAdminOrMerchantAccess(sessionUid, account.value)
|
||||
if (accessData == null) {
|
||||
await supa.signOut()
|
||||
logout()
|
||||
throw new Error('该账户无后台或商家端权限')
|
||||
}
|
||||
|
||||
// 存入商家ID
|
||||
uni.setStorageSync('merchant_id', merchantId)
|
||||
const currRole = accessData.getString('role')
|
||||
const currId = accessData.getString('id')
|
||||
uni.setStorageSync('adminRole', currRole)
|
||||
|
||||
if (currRole === 'merchant') {
|
||||
uni.setStorageSync('merchant_id', currId)
|
||||
} else {
|
||||
uni.removeStorageSync('merchant_id')
|
||||
}
|
||||
} else {
|
||||
uni.showToast({ title: '手机号密码登录功能开发中', icon: 'none' })
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user