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/pages/message/message.js | 609 +++++--------------------------------------------------
1 files changed, 56 insertions(+), 553 deletions(-)
diff --git a/wx/pages/message/message.js b/wx/pages/message/message.js
index 9b36d57..e390706 100644
--- a/wx/pages/message/message.js
+++ b/wx/pages/message/message.js
@@ -1,587 +1,90 @@
// pages/message/message.js
const app = getApp()
-const { graphqlRequest, formatDate, formatRelativeTime } = require('../../lib/utils')
Page({
data: {
- loading: false,
- refreshing: false,
- loadingMore: false,
- hasMore: true,
-
- // 娑堟伅鍒楄〃
messages: [],
-
- // 鍒嗛〉鍙傛暟
- pagination: {
- page: 1,
- limit: 20,
- total: 0
- },
-
- // 绛涢�夋潯浠�
- filter: {
- type: 'ALL', // ALL, SYSTEM, ACTIVITY, JUDGE, ORGANIZER
- status: 'ALL' // ALL, READ, UNREAD
- },
-
- // 绛涢�夐�夐」
- typeOptions: [
- { value: 'ALL', label: '鍏ㄩ儴娑堟伅' },
- { value: 'SYSTEM', label: '绯荤粺閫氱煡' },
- { value: 'ACTIVITY', label: '娲诲姩娑堟伅' },
- { value: 'JUDGE', label: '璇勫娑堟伅' },
- { value: 'ORGANIZER', label: '涓诲姙鏂规秷鎭�' }
- ],
-
- statusOptions: [
- { value: 'ALL', label: '鍏ㄩ儴鐘舵��' },
- { value: 'UNREAD', label: '鏈' },
- { value: 'READ', label: '宸茶' }
- ],
-
- // 鏄剧ず绛涢�夐潰鏉�
- showFilter: false,
-
- // 缁熻鏁版嵁
- stats: {
- total: 0,
- unread: 0
- },
-
- // 閫夋嫨妯″紡
- selectMode: false,
- selectedMessages: [],
-
- // 娑堟伅绫诲瀷鍥炬爣鏄犲皠
- typeIcons: {
- 'SYSTEM': '馃敂',
- 'ACTIVITY': '馃幆',
- 'JUDGE': '鈿栵笍',
- 'ORGANIZER': '馃懃',
- 'REGISTRATION': '馃摑',
- 'RESULT': '馃弳',
- 'REMINDER': '鈴�'
- }
+ loading: false
},
onLoad() {
this.loadMessages()
- this.loadMessageStats()
},
onShow() {
- // 椤甸潰鏄剧ず鏃跺埛鏂版湭璇绘暟閲�
- this.loadMessageStats()
- // 鍒濆鍖栬嚜瀹氫箟 tabbar
- if (typeof this.getTabBar === 'function' && this.getTabBar()) {
- this.getTabBar().init()
- }
+ this.loadMessages()
},
onPullDownRefresh() {
- this.refreshMessages()
- },
-
- onReachBottom() {
- if (this.data.hasMore && !this.data.loadingMore) {
- this.loadMoreMessages()
- }
+ this.loadMessages()
},
// 鍔犺浇娑堟伅鍒楄〃
- async loadMessages(reset = true) {
- try {
- if (reset) {
- this.setData({
- loading: true,
- pagination: { ...this.data.pagination, page: 1 }
- })
- }
-
- const { filter, pagination } = this.data
-
- const query = `
- query GetMessages($input: MessageQueryInput!) {
- messages(input: $input) {
- items {
- id
- type
- title
- content
- isRead
- createdAt
- data
- relatedActivity {
- id
- title
- }
- }
- pagination {
- total
- page
- limit
- hasMore
- }
- }
+ loadMessages() {
+ // 妫�鏌ョ敤鎴锋槸鍚﹀凡鐧诲綍锛屽鏋済lobalData涓病鏈夛紝灏濊瘯浠庢湰鍦板瓨鍌ㄦ仮澶�
+ let userInfo = app.globalData.userInfo
+ if (!userInfo || !userInfo.userId) {
+ console.log('globalData涓病鏈塽serInfo锛屽皾璇曚粠鏈湴瀛樺偍鎭㈠')
+ try {
+ const storedUserInfo = wx.getStorageSync('userInfo')
+ if (storedUserInfo && storedUserInfo.userId) {
+ console.log('浠庢湰鍦板瓨鍌ㄦ仮澶島serInfo鎴愬姛')
+ app.globalData.userInfo = storedUserInfo
+ userInfo = storedUserInfo
}
- `
-
- const input = {
- type: filter.type === 'ALL' ? null : filter.type,
- status: filter.status === 'ALL' ? null : filter.status,
- page: pagination.page,
- limit: pagination.limit
+ } catch (error) {
+ console.error('浠庢湰鍦板瓨鍌ㄦ仮澶島serInfo澶辫触:', error)
}
-
- const result = await graphqlRequest(query, { input })
-
- if (result && result.messages) {
- const { items, pagination: newPagination } = result.messages
-
- // 涓烘瘡涓秷鎭坊鍔犻�変腑鐘舵��
- const processedItems = items.map(item => ({
- ...item,
- isSelected: this.data.selectedMessages.indexOf(item.id) > -1
- }))
-
- this.setData({
- messages: reset ? processedItems : [...this.data.messages, ...processedItems],
- pagination: newPagination,
- hasMore: newPagination.hasMore
- })
- }
- } catch (error) {
- console.error('鍔犺浇娑堟伅澶辫触:', error)
+ }
+
+ if (!userInfo || !userInfo.userId) {
+ console.error('鐢ㄦ埛鏈櫥褰曟垨userId涓嶅瓨鍦�')
wx.showToast({
- title: '鍔犺浇澶辫触',
- icon: 'error'
- })
- } finally {
- this.setData({
- loading: false,
- refreshing: false,
- loadingMore: false
- })
- wx.stopPullDownRefresh()
- }
- },
-
- // 鍒锋柊娑堟伅
- async refreshMessages() {
- this.setData({ refreshing: true })
- await this.loadMessages(true)
- await this.loadMessageStats()
- },
-
- // 鍔犺浇鏇村娑堟伅
- async loadMoreMessages() {
- if (!this.data.hasMore || this.data.loadingMore) return
-
- this.setData({
- loadingMore: true,
- pagination: {
- ...this.data.pagination,
- page: this.data.pagination.page + 1
- }
- })
-
- await this.loadMessages(false)
- },
-
- // 鍔犺浇娑堟伅缁熻
- async loadMessageStats() {
- try {
- const query = `
- query GetMessageStats {
- messageStats {
- total
- unread
- }
- }
- `
-
- const result = await graphqlRequest(query)
-
- if (result && result.messageStats) {
- this.setData({
- stats: result.messageStats
- })
-
- // 鏇存柊搴曢儴瀵艰埅鏍忕殑鏈鏁伴噺
- if (typeof this.getTabBar === 'function' && this.getTabBar()) {
- this.getTabBar().setData({
- unreadCount: result.messageStats.unread
- })
- }
- }
- } catch (error) {
- console.error('鍔犺浇娑堟伅缁熻澶辫触:', error)
- }
- },
-
- // 娑堟伅鐐瑰嚮
- async onMessageTap(e) {
- const { id, index } = e.currentTarget.dataset
- const message = this.data.messages[index]
-
- // 濡傛灉鏄�夋嫨妯″紡锛屽垏鎹㈤�夋嫨鐘舵��
- if (this.data.selectMode) {
- this.toggleMessageSelection(id)
- return
- }
-
- // 鏍囪涓哄凡璇�
- if (!message.isRead) {
- await this.markAsRead(id, index)
- }
-
- // 鏍规嵁娑堟伅绫诲瀷澶勭悊璺宠浆
- this.handleMessageAction(message)
- },
-
- // 澶勭悊娑堟伅鍔ㄤ綔
- handleMessageAction(message) {
- const { type, data, relatedActivity } = message
-
- switch (type) {
- case 'ACTIVITY':
- if (relatedActivity && relatedActivity.id) {
- wx.navigateTo({
- url: `/pages/activity/detail?id=${relatedActivity.id}`
- })
- }
- break
- case 'REGISTRATION':
- if (data && data.registrationId) {
- wx.navigateTo({
- url: `/pages/profile/registration-detail?id=${data.registrationId}`
- })
- }
- break
- case 'JUDGE':
- if (data && data.submissionId) {
- wx.navigateTo({
- url: `/pages/judge/review?id=${data.submissionId}`
- })
- }
- break
- case 'ORGANIZER':
- if (relatedActivity && relatedActivity.id) {
- wx.navigateTo({
- url: `/pages/organizer/activity-detail?id=${relatedActivity.id}`
- })
- }
- break
- default:
- // 鏄剧ず娑堟伅璇︽儏
- this.showMessageDetail(message)
- break
- }
- },
-
- // 鏄剧ず娑堟伅璇︽儏
- showMessageDetail(message) {
- wx.showModal({
- title: message.title,
- content: message.content,
- showCancel: false,
- confirmText: '鐭ラ亾浜�'
- })
- },
-
- // 鏍囪涓哄凡璇�
- async markAsRead(messageId, index) {
- try {
- const mutation = `
- mutation MarkMessageAsRead($id: ID!) {
- markMessageAsRead(id: $id) {
- success
- }
- }
- `
-
- const result = await graphqlRequest(mutation, { id: messageId })
-
- if (result && result.markMessageAsRead.success) {
- // 鏇存柊鏈湴鏁版嵁
- const messages = [...this.data.messages]
- messages[index].isRead = true
-
- this.setData({ messages })
-
- // 鏇存柊缁熻鏁版嵁
- this.setData({
- 'stats.unread': Math.max(0, this.data.stats.unread - 1)
- })
- }
- } catch (error) {
- console.error('鏍囪宸茶澶辫触:', error)
- }
- },
-
- // 鎵归噺鏍囪涓哄凡璇�
- async markAllAsRead() {
- try {
- wx.showLoading({ title: '澶勭悊涓�...' })
-
- const mutation = `
- mutation MarkAllMessagesAsRead {
- markAllMessagesAsRead {
- success
- count
- }
- }
- `
-
- const result = await graphqlRequest(mutation)
-
- if (result && result.markAllMessagesAsRead.success) {
- // 鍒锋柊娑堟伅鍒楄〃
- await this.refreshMessages()
-
- wx.showToast({
- title: '宸插叏閮ㄦ爣璁颁负宸茶',
- icon: 'success'
- })
- }
- } catch (error) {
- console.error('鎵归噺鏍囪宸茶澶辫触:', error)
- wx.showToast({
- title: '鎿嶄綔澶辫触',
- icon: 'error'
- })
- } finally {
- wx.hideLoading()
- }
- },
-
- // 鍒犻櫎娑堟伅
- async deleteMessage(messageId) {
- try {
- const mutation = `
- mutation DeleteMessage($id: ID!) {
- deleteMessage(id: $id) {
- success
- }
- }
- `
-
- const result = await graphqlRequest(mutation, { id: messageId })
-
- if (result && result.deleteMessage.success) {
- // 浠庡垪琛ㄤ腑绉婚櫎
- const messages = this.data.messages.filter(msg => msg.id !== messageId)
- this.setData({ messages })
-
- wx.showToast({
- title: '鍒犻櫎鎴愬姛',
- icon: 'success'
- })
- }
- } catch (error) {
- console.error('鍒犻櫎娑堟伅澶辫触:', error)
- wx.showToast({
- title: '鍒犻櫎澶辫触',
- icon: 'error'
- })
- }
- },
-
- // 闀挎寜娑堟伅
- onMessageLongPress(e) {
- const { id } = e.currentTarget.dataset
-
- wx.showActionSheet({
- itemList: ['鏍囪涓哄凡璇�', '鍒犻櫎娑堟伅'],
- success: (res) => {
- switch (res.tapIndex) {
- case 0:
- this.markAsRead(id)
- break
- case 1:
- wx.showModal({
- title: '纭鍒犻櫎',
- content: '纭畾瑕佸垹闄よ繖鏉℃秷鎭悧锛�',
- success: (modalRes) => {
- if (modalRes.confirm) {
- this.deleteMessage(id)
- }
- }
- })
- break
- }
- }
- })
- },
-
- // 鍒囨崲绛涢�夐潰鏉�
- onToggleFilter() {
- this.setData({
- showFilter: !this.data.showFilter
- })
- },
-
- // 绛涢�夋潯浠舵敼鍙�
- onFilterChange(e) {
- const { type, value } = e.currentTarget.dataset
-
- this.setData({
- [`filter.${type}`]: value,
- showFilter: false
- })
-
- // 閲嶆柊鍔犺浇娑堟伅
- this.loadMessages(true)
- },
-
- // 鍒囨崲閫夋嫨妯″紡
- onToggleSelectMode() {
- this.setData({
- selectMode: !this.data.selectMode,
- selectedMessages: []
- })
- },
-
- // 鍒囨崲娑堟伅閫夋嫨鐘舵��
- toggleMessageSelection(messageId) {
- const selectedMessages = [...this.data.selectedMessages]
- const index = selectedMessages.indexOf(messageId)
-
- if (index > -1) {
- selectedMessages.splice(index, 1)
- } else {
- selectedMessages.push(messageId)
- }
-
- // 鍚屾椂鏇存柊娑堟伅鐨刬sSelected瀛楁
- const messages = this.data.messages.map(msg => ({
- ...msg,
- isSelected: selectedMessages.indexOf(msg.id) > -1
- }))
-
- this.setData({
- selectedMessages,
- messages
- })
- },
-
- // 鍏ㄩ��/鍙栨秷鍏ㄩ��
- onToggleSelectAll() {
- const { messages, selectedMessages } = this.data
- const allSelected = selectedMessages.length === messages.length
- const newSelectedMessages = allSelected ? [] : messages.map(msg => msg.id)
-
- // 鍚屾椂鏇存柊娑堟伅鐨刬sSelected瀛楁
- const updatedMessages = messages.map(msg => ({
- ...msg,
- isSelected: !allSelected
- }))
-
- this.setData({
- selectedMessages: newSelectedMessages,
- messages: updatedMessages
- })
- },
-
- // 鎵归噺鍒犻櫎閫変腑娑堟伅
- async onDeleteSelected() {
- const { selectedMessages } = this.data
-
- if (selectedMessages.length === 0) {
- wx.showToast({
- title: '璇烽�夋嫨瑕佸垹闄ょ殑娑堟伅',
+ title: '璇峰厛鐧诲綍',
icon: 'error'
})
return
}
+
+ this.setData({ loading: true })
- wx.showModal({
- title: '纭鍒犻櫎',
- content: `纭畾瑕佸垹闄ら�変腑鐨� ${selectedMessages.length} 鏉℃秷鎭悧锛焋,
- success: async (res) => {
- if (res.confirm) {
- try {
- wx.showLoading({ title: '鍒犻櫎涓�...' })
-
- const mutation = `
- mutation DeleteMessages($ids: [ID!]!) {
- deleteMessages(ids: $ids) {
- success
- count
- }
- }
- `
-
- const result = await graphqlRequest(mutation, { ids: selectedMessages })
-
- if (result && result.deleteMessages.success) {
- // 鍒锋柊娑堟伅鍒楄〃
- await this.refreshMessages()
-
- this.setData({
- selectMode: false,
- selectedMessages: []
- })
-
- wx.showToast({
- title: `宸插垹闄� ${result.deleteMessages.count} 鏉℃秷鎭痐,
- icon: 'success'
- })
- }
- } catch (error) {
- console.error('鎵归噺鍒犻櫎澶辫触:', error)
- wx.showToast({
- title: '鍒犻櫎澶辫触',
- icon: 'error'
- })
- } finally {
- wx.hideLoading()
- }
+ const query = `
+ query GetMessagesByUserId($userId: Long!) {
+ getMessagesByUserId(userId: $userId) {
+ id
+ userId
+ content
+ wxMsgSuccess
+ wxMsgErrCount
+ state
+ createTime
+ updateTime
}
}
- })
- },
+ `
- // 鑾峰彇娑堟伅绫诲瀷鍥炬爣
- getTypeIcon(type) {
- return this.data.typeIcons[type] || '馃摠'
- },
-
- // 鑾峰彇娑堟伅绫诲瀷鏂囨湰
- getTypeText(type) {
- const typeMap = {
- 'SYSTEM': '绯荤粺閫氱煡',
- 'ACTIVITY': '娲诲姩娑堟伅',
- 'JUDGE': '璇勫娑堟伅',
- 'ORGANIZER': '涓诲姙鏂规秷鎭�',
- 'REGISTRATION': '鎶ュ悕娑堟伅',
- 'RESULT': '缁撴灉閫氱煡',
- 'REMINDER': '鎻愰啋娑堟伅'
+ const variables = {
+ userId: userInfo.userId
}
- return typeMap[type] || '娑堟伅'
+
+ app.graphqlRequest(query, variables)
+ .then(data => {
+ console.log('娑堟伅鏁版嵁:', data)
+ this.setData({
+ messages: data.getMessagesByUserId || [],
+ loading: false
+ })
+ wx.stopPullDownRefresh()
+ })
+ .catch(error => {
+ console.error('鍔犺浇娑堟伅澶辫触:', error)
+ wx.showToast({
+ title: '鍔犺浇澶辫触',
+ icon: 'error'
+ })
+ this.setData({ loading: false })
+ wx.stopPullDownRefresh()
+ })
},
- // 鏍煎紡鍖栨椂闂�
- formatTime(dateString) {
- const now = new Date()
- const date = new Date(dateString)
- const diff = now.getTime() - date.getTime()
-
- // 涓�澶╁唴鏄剧ず鐩稿鏃堕棿
- if (diff < 24 * 60 * 60 * 1000) {
- return formatRelativeTime(dateString)
- }
-
- // 瓒呰繃涓�澶╂樉绀哄叿浣撴棩鏈�
- return formatDate(dateString, 'MM-DD HH:mm')
- },
-
- // 鍒嗕韩椤甸潰
- onShareAppMessage() {
- return {
- title: '钃夋槗鍒� - 娑堟伅涓績',
- path: '/pages/index/index'
- }
- }
})
\ No newline at end of file
--
Gitblit v1.8.0