feat:登录注册完成
This commit is contained in:
34
src/utils/api-error.ts
Normal file
34
src/utils/api-error.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import type { ApiResponse } from '@/types/api'
|
||||
|
||||
export class ApiError extends Error {
|
||||
code?: number
|
||||
|
||||
constructor(message: string, code?: number) {
|
||||
super(message)
|
||||
this.name = 'ApiError'
|
||||
this.code = code
|
||||
}
|
||||
}
|
||||
|
||||
export function isApiSuccess(body: ApiResponse): boolean {
|
||||
if (body.code === undefined) return true
|
||||
return body.code === 200 || body.code === 0
|
||||
}
|
||||
|
||||
export function unwrapApiData<T>(body: ApiResponse<T> & Record<string, unknown>): T {
|
||||
if (body.data !== undefined && body.data !== null) {
|
||||
return body.data as T
|
||||
}
|
||||
return body as T
|
||||
}
|
||||
|
||||
export function getErrorMessage(err: unknown, fallback = '请求失败'): string {
|
||||
if (err instanceof ApiError) return err.message
|
||||
if (err instanceof Error && err.message) return err.message
|
||||
if (err && typeof err === 'object' && 'data' in err) {
|
||||
const data = (err as { data?: ApiResponse }).data
|
||||
if (data?.msg) return data.msg
|
||||
if (data?.message) return data.message
|
||||
}
|
||||
return fallback
|
||||
}
|
||||
66
src/utils/static-assets.ts
Normal file
66
src/utils/static-assets.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
/** 设计稿静态图标(src/static) */
|
||||
import logoCenter from '@/static/logo-center@2x.png'
|
||||
import iconPhone from '@/static/icon-phone@2x.png'
|
||||
import iconCode from '@/static/icon-code@2x.png'
|
||||
import iconChecked from '@/static/icon-checked@2x.png'
|
||||
import iconPassword from '@/static/路径.png'
|
||||
import iconHomeSelector from '@/static/图标 4.png'
|
||||
import iconHomeArrow from '@/static/组 9.png'
|
||||
import iconNotify from '@/static/组 27.png'
|
||||
import iconDeviceEmpty from '@/static/图标 8.png'
|
||||
import iconDeviceNameEdit from '@/static/图标 9.png'
|
||||
import iconBindComplete from '@/static/组 41@2x.png'
|
||||
import iconBluetooth from '@/static/蓝牙-F.png'
|
||||
import iconBindDiscover from '@/static/组 281@2x.png'
|
||||
import iconBindPair from '@/static/组 286@2x.png'
|
||||
import iconBindSecure from '@/static/组 291@2x.png'
|
||||
import iconScanDevice from '@/static/组 600@2x.png'
|
||||
import iconScanDeviceAction from '@/static/组 468@2x.png'
|
||||
import iconScanDeviceActionDisabled from '@/static/组 476@2x.png'
|
||||
import tabDevice from '@/static/tab-device-active.png'
|
||||
import tabDeviceActive from '@/static/tab-device.png'
|
||||
import tabMine from '@/static/tab-mine-active.png'
|
||||
import tabMineActive from '@/static/tab-mine.png'
|
||||
|
||||
export const staticAssets = {
|
||||
/** 组 15106@2x.png — 登录区中心大图标 */
|
||||
logo: logoCenter,
|
||||
/** 手机号@2x.png */
|
||||
iconPhone,
|
||||
/** 验证码@2x.png */
|
||||
iconCode,
|
||||
/** 选中@2x.png */
|
||||
iconChecked,
|
||||
/** 路径.png — 密码框 */
|
||||
iconPassword,
|
||||
/** 图标 4.png — 首页「我的家」 */
|
||||
iconHomeSelector,
|
||||
/** 组 9.png — 「我的家」下拉箭头 */
|
||||
iconHomeArrow,
|
||||
/** 组 27.png — 设备页右上角通知 */
|
||||
iconNotify,
|
||||
/** 图标 8.png — 设备空状态中心图标 */
|
||||
iconDeviceEmpty,
|
||||
/** 图标 9.png — 完成配置「设备名称」编辑 */
|
||||
iconDeviceNameEdit,
|
||||
/** 组 41@2x.png — 完成配置成功示意图 */
|
||||
iconBindComplete,
|
||||
/** 蓝牙-F.png — 添加设备页蓝牙示意图 */
|
||||
iconBluetooth,
|
||||
/** 组 281@2x.png — 添加设备「发现附近设备」 */
|
||||
iconBindDiscover,
|
||||
/** 组 286@2x.png — 添加设备「快速配对连接」 */
|
||||
iconBindPair,
|
||||
/** 组 291@2x.png — 添加设备「本地安全控制」 */
|
||||
iconBindSecure,
|
||||
/** 组 600@2x.png — 扫描设备页示意图 */
|
||||
iconScanDevice,
|
||||
/** 组 468@2x.png — 发现设备列表「可添加」箭头 */
|
||||
iconScanDeviceAction,
|
||||
/** 组 476@2x.png — 发现设备列表「不可添加」箭头 */
|
||||
iconScanDeviceActionDisabled,
|
||||
tabDevice,
|
||||
tabDeviceActive,
|
||||
tabMine,
|
||||
tabMineActive,
|
||||
} as const
|
||||
11
src/utils/validate.ts
Normal file
11
src/utils/validate.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
export function isValidPhone(phone: string): boolean {
|
||||
return /^1\d{10}$/.test(phone.trim())
|
||||
}
|
||||
|
||||
export function isValidSmsCode(code: string): boolean {
|
||||
return /^\d{4,6}$/.test(code.trim())
|
||||
}
|
||||
|
||||
export function isValidPassword(password: string): boolean {
|
||||
return password.length >= 6 && password.length <= 32
|
||||
}
|
||||
Reference in New Issue
Block a user