From ba94ceae1315174798ae1967ef62268c6d16cd5b Mon Sep 17 00:00:00 2001
From: Codex Assistant <codex@example.com>
Date: 星期一, 06 十月 2025 22:07:06 +0800
Subject: [PATCH] feat: 评审与活动相关改动 - backend(GraphQL): Activity schema 增加 updateActivityState(id, state);实现 resolver/service 仅更新 state=2 作为逻辑删除 - backend(GraphQL): region.graphqls 新增 Query leafRegions - backend(GraphQL): player.graphqls 的 projectReviewApplications 增加可选参数 regionId - backend(Service): listProjectReviewApplications 绑定 regionId 参数,修复 QueryParameterException - frontend(web): 新增 api/activity.js 的 updateActivityState 并接入 activity-list 删除逻辑 - frontend(web): review-list.vue 权限仅校验登录,移除角色限制;查询参数修正为 name/regionId - frontend(web): 删除未引用的 ActivityList.vue - frontend(web): projectReviewNew.js GraphQL 查询增加 name 参数
---
wx/app.js | 200 +++++++++++++++++++++++++++++++++++++++----------
1 files changed, 159 insertions(+), 41 deletions(-)
diff --git a/wx/app.js b/wx/app.js
index f105b87..57d5a4b 100644
--- a/wx/app.js
+++ b/wx/app.js
@@ -276,56 +276,174 @@
// GraphQL璇锋眰灏佽
graphqlRequest(query, variables = {}) {
return new Promise((resolve, reject) => {
- // 纭繚token鐨勪竴鑷存�э細浼樺厛浣跨敤globalData涓殑token锛屽鏋滄病鏈夊垯浠巗torage鑾峰彇
- let token = this.globalData.token
- if (!token) {
- token = wx.getStorageSync('token')
- if (token) {
- this.globalData.token = token // 鍚屾鍒癵lobalData
- }
- }
+ this._makeGraphQLRequest(query, variables, resolve, reject, false)
+ })
+ },
- wx.request({
- url: this.globalData.baseUrl,
- method: 'POST',
- header: {
- 'Content-Type': 'application/json',
- 'Authorization': token ? `Bearer ${token}` : ''
- },
- data: {
- query: query,
- variables: variables
- },
- success: (res) => {
- console.log('GraphQL鍝嶅簲:', res.data)
-
- // 妫�鏌TTP鐘舵�佺爜
- if (res.statusCode !== 200) {
+ // 鍐呴儴GraphQL璇锋眰鏂规硶锛屾敮鎸侀噸璇曟満鍒�
+ _makeGraphQLRequest(query, variables, resolve, reject, isRetry = false) {
+ // 纭繚token鐨勪竴鑷存�э細浼樺厛浣跨敤globalData涓殑token锛屽鏋滄病鏈夊垯浠巗torage鑾峰彇
+ let token = this.globalData.token
+ if (!token) {
+ token = wx.getStorageSync('token')
+ if (token) {
+ this.globalData.token = token // 鍚屾鍒癵lobalData
+ }
+ }
+
+ wx.request({
+ url: this.globalData.baseUrl,
+ method: 'POST',
+ header: {
+ 'Content-Type': 'application/json',
+ 'Authorization': token ? `Bearer ${token}` : ''
+ },
+ data: {
+ query: query,
+ variables: variables
+ },
+ success: (res) => {
+ console.log('GraphQL鍝嶅簲:', res.data)
+
+ // 妫�鏌TTP鐘舵�佺爜
+ if (res.statusCode !== 200) {
+ // 瀵逛簬401鐘舵�佺爜锛屽彲鑳芥槸璁よ瘉閿欒锛岄渶瑕佹鏌ュ搷搴斿唴瀹�
+ if (res.statusCode === 401 && res.data && res.data.errors) {
+ console.log('鏀跺埌401鐘舵�佺爜锛屾鏌ユ槸鍚︿负璁よ瘉閿欒')
+ // 缁х画澶勭悊锛岃涓嬮潰鐨凣raphQL閿欒妫�鏌ラ�昏緫澶勭悊璁よ瘉閿欒
+ } else {
console.error('GraphQL HTTP閿欒:', res.statusCode)
reject(new Error(`HTTP閿欒: ${res.statusCode}`))
return
}
+ }
- // 妫�鏌raphQL閿欒
- if (res.data.errors) {
- console.error('GraphQL閿欒:', res.data.errors)
- reject(new Error(res.data.errors[0]?.message || 'GraphQL璇锋眰閿欒'))
+ // 妫�鏌raphQL閿欒
+ if (res.data && res.data.errors) {
+ console.error('GraphQL閿欒:', res.data.errors)
+
+ // 妫�鏌ユ槸鍚︽槸璁よ瘉閿欒锛坱oken杩囨湡鎴栨棤鏁堬級
+ const authErrors = res.data.errors.filter(error =>
+ error.message && (
+ error.message.includes('娌℃湁鏉冮檺璁块棶') ||
+ error.message.includes('璇峰厛鐧诲綍') ||
+ error.message.includes('UNAUTHORIZED') ||
+ error.extensions?.code === 'UNAUTHORIZED'
+ )
+ )
+
+ if (authErrors.length > 0 && !isRetry) {
+ console.log('馃攧 妫�娴嬪埌璁よ瘉閿欒锛屽皾璇曢噸鏂扮櫥褰�...')
+ // 娓呴櫎杩囨湡鐨勮璇佷俊鎭�
+ this.globalData.token = null
+ this.globalData.userInfo = null
+ this.globalData.sessionKey = null
+ wx.removeStorageSync('token')
+ wx.removeStorageSync('userInfo')
+ wx.removeStorageSync('sessionKey')
+
+ // 閲嶆柊鐧诲綍
+ wx.login({
+ success: (loginRes) => {
+ if (loginRes.code) {
+ console.log('馃攧 閲嶆柊鑾峰彇寰俊code鎴愬姛锛岃皟鐢ㄥ悗绔櫥褰�...')
+ this._retryAfterLogin(loginRes.code, query, variables, resolve, reject)
+ } else {
+ console.error('鉂� 閲嶆柊鑾峰彇寰俊code澶辫触')
+ reject(new Error('閲嶆柊鐧诲綍澶辫触'))
+ }
+ },
+ fail: (err) => {
+ console.error('鉂� 閲嶆柊鐧诲綍澶辫触:', err)
+ reject(new Error('閲嶆柊鐧诲綍澶辫触'))
+ }
+ })
return
}
-
- // 妫�鏌ユ暟鎹�
- if (res.data.data !== undefined) {
- resolve(res.data.data)
- } else {
- console.error('GraphQL鍝嶅簲寮傚父:', res.data)
- reject(new Error('GraphQL鍝嶅簲鏁版嵁寮傚父'))
- }
- },
- fail: (err) => {
- console.error('GraphQL缃戠粶璇锋眰澶辫触:', err)
- reject(new Error('缃戠粶璇锋眰澶辫触'))
+
+ reject(new Error(res.data.errors[0]?.message || 'GraphQL璇锋眰閿欒'))
+ return
}
- })
+
+ // 妫�鏌ユ暟鎹�
+ if (res.data.data !== undefined) {
+ resolve(res.data.data)
+ } else {
+ console.error('GraphQL鍝嶅簲寮傚父:', res.data)
+ reject(new Error('GraphQL鍝嶅簲鏁版嵁寮傚父'))
+ }
+ },
+ fail: (err) => {
+ console.error('GraphQL缃戠粶璇锋眰澶辫触:', err)
+ reject(new Error('缃戠粶璇锋眰澶辫触'))
+ }
+ })
+ },
+
+ // 閲嶆柊鐧诲綍鍚庨噸璇旼raphQL璇锋眰
+ _retryAfterLogin(code, query, variables, resolve, reject) {
+ const that = this
+ const deviceInfo = this.getDeviceInfo()
+ const requestData = {
+ code: code,
+ loginIp: '127.0.0.1', // 灏忕▼搴忔棤娉曡幏鍙栫湡瀹濱P锛屼娇鐢ㄩ粯璁ゅ��
+ deviceInfo: deviceInfo
+ }
+
+ wx.request({
+ url: 'http://localhost:8080/api/auth/wx-login',
+ method: 'POST',
+ header: {
+ 'Content-Type': 'application/json'
+ },
+ data: requestData,
+ success: (res) => {
+ console.log('馃攧 閲嶆柊鐧诲綍鍝嶅簲:', res.data)
+
+ if (res.statusCode !== 200 || res.data.error) {
+ console.error('鉂� 閲嶆柊鐧诲綍澶辫触:', res.data.error || res.data.message)
+ reject(new Error('閲嶆柊鐧诲綍澶辫触'))
+ return
+ }
+
+ // 妫�鏌ュ搷搴旀暟鎹牸寮�
+ let loginResult = null
+ if (res.data.token && res.data.userInfo) {
+ loginResult = res.data
+ } else if (res.data.success && res.data.data) {
+ loginResult = res.data.data
+ }
+
+ if (loginResult && loginResult.token) {
+ console.log('鉁� 閲嶆柊鐧诲綍鎴愬姛锛屾洿鏂皌oken')
+
+ // 淇濆瓨鏂扮殑鐧诲綍淇℃伅
+ try {
+ wx.setStorageSync('token', loginResult.token)
+ wx.setStorageSync('userInfo', loginResult.userInfo)
+ if (loginResult.sessionKey) {
+ wx.setStorageSync('sessionKey', loginResult.sessionKey)
+ }
+ } catch (storageErr) {
+ console.error('鉂� 淇濆瓨閲嶆柊鐧诲綍淇℃伅澶辫触:', storageErr)
+ }
+
+ that.globalData.token = loginResult.token
+ that.globalData.userInfo = loginResult.userInfo
+ that.globalData.sessionKey = loginResult.sessionKey
+
+ // 浣跨敤鏂皌oken閲嶈瘯鍘熷璇锋眰
+ console.log('馃攧 浣跨敤鏂皌oken閲嶈瘯GraphQL璇锋眰...')
+ that._makeGraphQLRequest(query, variables, resolve, reject, true)
+ } else {
+ console.error('鉂� 閲嶆柊鐧诲綍鍝嶅簲鏍煎紡閿欒')
+ reject(new Error('閲嶆柊鐧诲綍鍝嶅簲鏍煎紡閿欒'))
+ }
+ },
+ fail: (err) => {
+ console.error('鉂� 閲嶆柊鐧诲綍缃戠粶璇锋眰澶辫触:', err)
+ reject(new Error('閲嶆柊鐧诲綍缃戠粶璇锋眰澶辫触'))
+ }
})
}
})
\ No newline at end of file
--
Gitblit v1.8.0