feat: refresh UI and add vite ci workflow
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
import { request } from './request'
|
||||
import { MINI_PROGRAM_ID } from '@/config'
|
||||
import { storage, SESSION_KEY, USER_KEY } from '@/utils/storage'
|
||||
|
||||
export async function login() {
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.login({
|
||||
provider: 'weixin',
|
||||
success: async (loginRes) => {
|
||||
try {
|
||||
const res = await request.post('/auth/login', {
|
||||
mini_program_id: MINI_PROGRAM_ID,
|
||||
code: loginRes.code
|
||||
})
|
||||
|
||||
storage.set(SESSION_KEY, res.data.session_key)
|
||||
storage.set(USER_KEY, res.data.user)
|
||||
|
||||
resolve(res.data)
|
||||
} catch (e) {
|
||||
reject(e)
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
reject(err)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
export function getUser() {
|
||||
return storage.get(USER_KEY)
|
||||
}
|
||||
|
||||
export function getSessionKey() {
|
||||
return storage.get(SESSION_KEY)
|
||||
}
|
||||
|
||||
export function isLoggedIn() {
|
||||
return !!getSessionKey()
|
||||
}
|
||||
|
||||
export function logout() {
|
||||
storage.remove(SESSION_KEY)
|
||||
storage.remove(USER_KEY)
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
export * from './auth'
|
||||
export * from './smoke'
|
||||
export * from './profile'
|
||||
@@ -0,0 +1,9 @@
|
||||
import { request } from './request'
|
||||
|
||||
export function getProfile() {
|
||||
return request.get('/smoke/profile')
|
||||
}
|
||||
|
||||
export function updateProfile(data) {
|
||||
return request.post('/smoke/profile', data)
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
import { BASE_URL } from '@/config'
|
||||
import { storage, SESSION_KEY } from '@/utils/storage'
|
||||
import { login as authLogin } from './auth'
|
||||
|
||||
// 是否为 token 失效(HTTP 401 或 body code 401,如 invalid token)
|
||||
function isInvalidToken(res) {
|
||||
if (res.statusCode === 401) return true
|
||||
const body = res.data
|
||||
if (body && body.code === 401) return true
|
||||
return false
|
||||
}
|
||||
|
||||
export const request = {
|
||||
async request(options) {
|
||||
const sessionKey = storage.get(SESSION_KEY)
|
||||
const isRetryAfter401 = options._retryAfter401 === true
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.request({
|
||||
url: BASE_URL + options.url,
|
||||
method: options.method || 'GET',
|
||||
data: options.data,
|
||||
header: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': sessionKey ? `Bearer ${sessionKey}` : ''
|
||||
},
|
||||
success: async (res) => {
|
||||
if (isInvalidToken(res)) {
|
||||
if (isRetryAfter401) {
|
||||
reject(new Error(res.data?.message || 'invalid token'))
|
||||
return
|
||||
}
|
||||
try {
|
||||
await authLogin()
|
||||
const nextOpts = { ...options, _retryAfter401: true }
|
||||
resolve(this.request(nextOpts))
|
||||
} catch (e) {
|
||||
reject(e)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if (res.statusCode !== 200) {
|
||||
uni.showToast({
|
||||
title: res.data?.message || '请求失败',
|
||||
icon: 'none'
|
||||
})
|
||||
reject(new Error(res.data?.message || '请求失败'))
|
||||
return
|
||||
}
|
||||
|
||||
resolve(res.data)
|
||||
},
|
||||
fail: (err) => {
|
||||
uni.showToast({
|
||||
title: '网络错误',
|
||||
icon: 'none'
|
||||
})
|
||||
reject(err)
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
get(url, params) {
|
||||
return this.request({ url, method: 'GET', data: params })
|
||||
},
|
||||
|
||||
post(url, data) {
|
||||
return this.request({ url, method: 'POST', data })
|
||||
},
|
||||
|
||||
put(url, data) {
|
||||
return this.request({ url, method: 'PUT', data })
|
||||
},
|
||||
|
||||
delete(url) {
|
||||
return this.request({ url, method: 'DELETE' })
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
import { request } from './request'
|
||||
|
||||
export function getDashboard(params = {}) {
|
||||
return request.get('/smoke/dashboard', params)
|
||||
}
|
||||
|
||||
export function getHome(params = {}) {
|
||||
return request.get('/smoke/home', params)
|
||||
}
|
||||
|
||||
export function getNextSmokeTime(params = {}) {
|
||||
return request.get('/smoke/next_smoke_time', params)
|
||||
}
|
||||
|
||||
export function getLogs(params = {}) {
|
||||
return request.get('/smoke/logs', params)
|
||||
}
|
||||
|
||||
export function getLatestLogs(limit = 20) {
|
||||
return request.get('/smoke/logs/latest', { limit })
|
||||
}
|
||||
|
||||
export function getLog(id) {
|
||||
return request.get(`/smoke/logs/${id}`)
|
||||
}
|
||||
|
||||
export function createLog(data) {
|
||||
return request.post('/smoke/logs', data)
|
||||
}
|
||||
|
||||
export function updateLog(id, data) {
|
||||
return request.post(`/smoke/logs/${id}`, data)
|
||||
}
|
||||
|
||||
export function deleteLog(id) {
|
||||
return request.delete(`/smoke/logs/${id}`)
|
||||
}
|
||||
|
||||
export function createResistedLog(data) {
|
||||
return request.post('/smoke/logs/resisted', data)
|
||||
}
|
||||
|
||||
export function getAiAdvice(date) {
|
||||
return request.get('/smoke/ai/advice', { date })
|
||||
}
|
||||
|
||||
export function unlockAiAdvice(data) {
|
||||
return request.post('/smoke/ai/advice_unlocks', data)
|
||||
}
|
||||
|
||||
export function getAINextSmokeTime(params = {}) {
|
||||
return request.get('/smoke/ai/next_smoke_time', { mode: 'ai', ...params })
|
||||
}
|
||||
|
||||
export function getAIDailySummary(params = {}) {
|
||||
return request.get('/smoke/ai/daily_summary', params)
|
||||
}
|
||||
|
||||
export function getStats(params = {}) {
|
||||
return request.get('/smoke/stats', params)
|
||||
}
|
||||
|
||||
export function createShare(data = {}) {
|
||||
return request.post('/smoke/share', data)
|
||||
}
|
||||
|
||||
export function getShareData(shareToken, params = {}) {
|
||||
return request.get(`/smoke/share/${shareToken}`, params)
|
||||
}
|
||||
|
||||
export function revokeShare(shareToken) {
|
||||
return request.post(`/smoke/share/${shareToken}/revoke`)
|
||||
}
|
||||
|
||||
// 戒烟计划 API
|
||||
export function generateQuitPlan() {
|
||||
return request.post('/smoke/quit-plan/generate')
|
||||
}
|
||||
|
||||
export function getQuitPlan(params = {}) {
|
||||
return request.get('/smoke/quit-plan', params)
|
||||
}
|
||||
|
||||
export function getQuitPlanDays(planId) {
|
||||
return request.get('/smoke/quit-plan/days', { plan_id: planId })
|
||||
}
|
||||
|
||||
export function resetQuitPlan() {
|
||||
return request.post('/smoke/quit-plan/reset')
|
||||
}
|
||||
Reference in New Issue
Block a user