From b00e35c31c1b81af48bc0e92cfc41cdaee02fe4e Mon Sep 17 00:00:00 2001 From: Sparkfreeman <2440444538@qq.com> Date: Wed, 3 Jul 2024 15:58:37 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=86=99=E4=BA=86=E7=82=B9=20=E8=BF=98?= =?UTF-8?q?=E6=B2=A1debug=20=E8=AF=B6=E5=98=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/meetingManagement.js | 36 +++-- src/services/meetingService.js | 30 +++++ src/store/meetingManagement.js | 69 +++++++--- src/views/meeting-management/AddMeeting.vue | 53 ++++++++ src/views/meeting-management/EditMeeting.vue | 61 +++++++++ .../meeting-management/MeetingManagement.vue | 123 ++++++++++++++++++ 6 files changed, 349 insertions(+), 23 deletions(-) create mode 100644 src/views/meeting-management/AddMeeting.vue create mode 100644 src/views/meeting-management/EditMeeting.vue create mode 100644 src/views/meeting-management/MeetingManagement.vue diff --git a/src/router/meetingManagement.js b/src/router/meetingManagement.js index 6aac70c..0d688a5 100644 --- a/src/router/meetingManagement.js +++ b/src/router/meetingManagement.js @@ -1,9 +1,29 @@ -// import MeetingList from '../views/meeting-management/MeetingList.vue' -// import MeetingDetail from '../views/meeting-management/MeetingDetail.vue' -// import MeetingEdit from '../views/meeting-management/MeetingEdit.vue' +import { createRouter, createWebHistory } from 'vue-router'; +import MeetingManagement from '../views/meeting-management/MeetingManagement.vue'; +import AddMeeting from '../views/meeting-management/AddMeeting.vue'; +import EditMeeting from '../views/meeting-management/EditMeeting.vue'; -export default [ - // { path: '/meetings', component: MeetingList }, - // { path: '/meetings/:id', component: MeetingDetail }, - // { path: '/meetings/:id/edit', component: MeetingEdit } -] +const routes = [ + { + path: '/Meeting', + name: 'MeetingManagement', + component: MeetingManagement + }, + { + path: '/Meeting/add', + name: 'AddMeeting', + component: AddMeeting + }, + { + path: '/Meeting/edit/:id', + name: 'EditMeeting', + component: EditMeeting + } +]; + +const router = createRouter({ + history: createWebHistory(process.env.BASE_URL), + routes +}); + +export default router; \ No newline at end of file diff --git a/src/services/meetingService.js b/src/services/meetingService.js index e69de29..3b63be3 100644 --- a/src/services/meetingService.js +++ b/src/services/meetingService.js @@ -0,0 +1,30 @@ +import axios from 'axios'; + +const API_URL = 'http://localhost:8080/meetings'; + +class MeetingService { + getAllMeetings() { + return axios.get(`${API_URL}/listAll`); + } + + getMeetingById(id) { + // 使用 POST 方法并传递请求体 + return axios.post(`${API_URL}/getMeetingById`, { id }); + } + + createMeeting(meeting) { + return axios.post(`${API_URL}/addMeeting`, meeting); + } + + updateMeeting(id, meeting) { + // 使用 POST 方法而不是 PUT 方法 + return axios.post(`${API_URL}/updateMeeting`, meeting); + } + + deleteMeeting(id) { + // 使用 POST 方法并传递请求体 + return axios.post(`${API_URL}/deleteMeeting`, { id }); + } +} + +export default new MeetingService(); \ No newline at end of file diff --git a/src/store/meetingManagement.js b/src/store/meetingManagement.js index 147e57a..b6e0ad1 100644 --- a/src/store/meetingManagement.js +++ b/src/store/meetingManagement.js @@ -1,27 +1,66 @@ +import MeetingService from '../services/meetingService'; + const state = { - meetings: [] -} + meetings: [], + currentMeeting: null +}; const mutations = { setMeetings(state, meetings) { - state.meetings = meetings + state.meetings = meetings; + }, + setCurrentMeeting(state, meeting) { + state.currentMeeting = meeting; } -} +}; const actions = { - fetchMeetings({ commit }) { - // 模拟API调用 - const meetings = [ - { id: 1, title: 'Meeting 1' }, - { id: 2, title: 'Meeting 2' } - ] - commit('setMeetings', meetings) + async fetchMeetings({ commit }) { + try { + const response = await MeetingService.getAllMeetings(); + commit('setMeetings', response.data); + } catch (error) { + console.error('Failed to fetch meetings:', error); + } + }, + async fetchMeetingById({ commit }, id) { + try { + const response = await MeetingService.getMeetingById(id); + commit('setCurrentMeeting', response.data); + } catch (error) { + console.error('Failed to fetch meeting:', error); + } + }, + async createMeeting({ dispatch }, meeting) { + try { + await MeetingService.createMeeting(meeting); + dispatch('fetchMeetings'); + } catch (error) { + console.error('Failed to create meeting:', error); + } + }, + async updateMeeting({ dispatch }, meeting) { + try { + await MeetingService.updateMeeting(meeting.id, meeting); + dispatch('fetchMeetings'); + } catch (error) { + console.error('Failed to update meeting:', error); + } + }, + async deleteMeeting({ dispatch }, id) { + try { + await MeetingService.deleteMeeting(id); + dispatch('fetchMeetings'); + } catch (error) { + console.error('Failed to delete meeting:', error); + } } -} +}; const getters = { - allMeetings: state => state.meetings -} + allMeetings: state => state.meetings, + currentMeeting: state => state.currentMeeting +}; export default { namespaced: true, @@ -29,4 +68,4 @@ export default { mutations, actions, getters -} +}; \ No newline at end of file diff --git a/src/views/meeting-management/AddMeeting.vue b/src/views/meeting-management/AddMeeting.vue new file mode 100644 index 0000000..51bd0a8 --- /dev/null +++ b/src/views/meeting-management/AddMeeting.vue @@ -0,0 +1,53 @@ + + + \ No newline at end of file diff --git a/src/views/meeting-management/EditMeeting.vue b/src/views/meeting-management/EditMeeting.vue new file mode 100644 index 0000000..fd9197d --- /dev/null +++ b/src/views/meeting-management/EditMeeting.vue @@ -0,0 +1,61 @@ + + + \ No newline at end of file diff --git a/src/views/meeting-management/MeetingManagement.vue b/src/views/meeting-management/MeetingManagement.vue new file mode 100644 index 0000000..f442d47 --- /dev/null +++ b/src/views/meeting-management/MeetingManagement.vue @@ -0,0 +1,123 @@ + + + + + \ No newline at end of file From 4b0c7ec534d00a62f44a2730d1bbb5919b93fb6f Mon Sep 17 00:00:00 2001 From: Sparkfreeman <2440444538@qq.com> Date: Wed, 3 Jul 2024 20:18:30 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=9B=9E=E6=BB=9A=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/background.jpg | Bin 0 -> 21608 bytes src/assets/avatar.jpg | Bin 0 -> 18944 bytes src/router/authentication.js | 44 ++++- src/router/meetingManagement.js | 15 +- src/store/authentication.js | 45 +++-- src/views/authentication/Login.vue | 121 ++++++++++++ src/views/authentication/ManageProfile.vue | 219 +++++++++++++++++++++ src/views/authentication/Profile.vue | 144 ++++++++++++++ src/views/authentication/Register.vue | 161 +++++++++++++++ 9 files changed, 714 insertions(+), 35 deletions(-) create mode 100644 public/background.jpg create mode 100644 src/assets/avatar.jpg create mode 100644 src/views/authentication/Login.vue create mode 100644 src/views/authentication/ManageProfile.vue create mode 100644 src/views/authentication/Profile.vue create mode 100644 src/views/authentication/Register.vue diff --git a/public/background.jpg b/public/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30819530ed03c94fc279926fa5bac62c7c870c01 GIT binary patch literal 21608 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

A_cXou~ovmgw>zVvqszl(AyeNVhVB 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 { + if (to.matched.some(record => record.meta.requiresAuth)) { + if (!store.getters['authentication/isAuthenticated']) { + next('/login'); + } else { + next(); + } + } else { + next(); + } +}); + +export default routes; diff --git a/src/router/meetingManagement.js b/src/router/meetingManagement.js index 0d688a5..236ca5e 100644 --- a/src/router/meetingManagement.js +++ b/src/router/meetingManagement.js @@ -1,7 +1,7 @@ -import { createRouter, createWebHistory } from 'vue-router'; -import MeetingManagement from '../views/meeting-management/MeetingManagement.vue'; -import AddMeeting from '../views/meeting-management/AddMeeting.vue'; -import EditMeeting from '../views/meeting-management/EditMeeting.vue'; +// meetingManagementRoutes.js +import MeetingManagement from "/src/views/meeting-management/MeetingManagement.vue"; +import AddMeeting from "/src/views/meeting-management/AddMeeting.vue"; +import EditMeeting from "/src/views/meeting-management/EditMeeting.vue"; const routes = [ { @@ -21,9 +21,4 @@ const routes = [ } ]; -const router = createRouter({ - history: createWebHistory(process.env.BASE_URL), - routes -}); - -export default router; \ No newline at end of file +export default routes; \ No newline at end of file diff --git a/src/store/authentication.js b/src/store/authentication.js index 77ff04e..429d1fb 100644 --- a/src/store/authentication.js +++ b/src/store/authentication.js @@ -1,30 +1,43 @@ +import axios from 'axios'; + const state = { - user: null -} + isAuthenticated: false, + token: null, +}; const mutations = { - setUser(state, user) { - state.user = user - } -} + setUser(state, {token}) { + state.isAuthenticated = true; + state.token = token; + }, + clearUser(state) { + state.isAuthenticated = false; + state.token = null; + }, +}; const actions = { - login({ commit }, user) { - commit('setUser', user) + async login({commit}, credentials) { + const response = await axios.post('/api/login', credentials); + if (response.status === 200) { + commit('setUser', {token: response.data.token}); + } + return response; }, - logout({ commit }) { - commit('setUser', null) - } -} + logout({commit}) { + commit('clearUser'); + }, +}; const getters = { - isAuthenticated: state => !!state.user -} + isAuthenticated: (state) => state.isAuthenticated, + token: (state) => state.token, +}; export default { namespaced: true, state, mutations, actions, - getters -} + getters, +}; diff --git a/src/views/authentication/Login.vue b/src/views/authentication/Login.vue new file mode 100644 index 0000000..143a251 --- /dev/null +++ b/src/views/authentication/Login.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/views/authentication/ManageProfile.vue b/src/views/authentication/ManageProfile.vue new file mode 100644 index 0000000..6dba704 --- /dev/null +++ b/src/views/authentication/ManageProfile.vue @@ -0,0 +1,219 @@ + + + + + + diff --git a/src/views/authentication/Profile.vue b/src/views/authentication/Profile.vue new file mode 100644 index 0000000..807057e --- /dev/null +++ b/src/views/authentication/Profile.vue @@ -0,0 +1,144 @@ + + + + + + diff --git a/src/views/authentication/Register.vue b/src/views/authentication/Register.vue new file mode 100644 index 0000000..98f810d --- /dev/null +++ b/src/views/authentication/Register.vue @@ -0,0 +1,161 @@ + + + + + From e4a21e1c6c39ac3097cb70df557f3f77e5d528c3 Mon Sep 17 00:00:00 2001 From: Sparkfreeman <2440444538@qq.com> Date: Thu, 4 Jul 2024 00:12:46 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=9B=9E=E6=BB=9A=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/meetingService.js | 12 ++-- src/store/meetingManagement.js | 22 +++++++- src/views/authentication/Login.vue | 4 +- src/views/authentication/Register.vue | 61 +++++---------------- src/views/meeting-management/AddMeeting.vue | 10 +++- 5 files changed, 48 insertions(+), 61 deletions(-) diff --git a/src/services/meetingService.js b/src/services/meetingService.js index 3b63be3..7d69bfe 100644 --- a/src/services/meetingService.js +++ b/src/services/meetingService.js @@ -1,29 +1,29 @@ import axios from 'axios'; -const API_URL = 'http://localhost:8080/meetings'; +//const API_URL = 'http://localhost:8080/meetings'; class MeetingService { getAllMeetings() { - return axios.get(`${API_URL}/listAll`); + return axios.get(`/api/meetings/listAll`); } getMeetingById(id) { // 使用 POST 方法并传递请求体 - return axios.post(`${API_URL}/getMeetingById`, { id }); + return axios.post(`/api/meetings/getMeetingById`, { id }); } createMeeting(meeting) { - return axios.post(`${API_URL}/addMeeting`, meeting); + return axios.post(`/api/meetings/addMeeting`, meeting); } updateMeeting(id, meeting) { // 使用 POST 方法而不是 PUT 方法 - return axios.post(`${API_URL}/updateMeeting`, meeting); + return axios.post(`/api/meetings/updateMeeting`, meeting); } deleteMeeting(id) { // 使用 POST 方法并传递请求体 - return axios.post(`${API_URL}/deleteMeeting`, { id }); + return axios.post(`/api/meetings/deleteMeeting`, { id }); } } diff --git a/src/store/meetingManagement.js b/src/store/meetingManagement.js index b6e0ad1..866f7f2 100644 --- a/src/store/meetingManagement.js +++ b/src/store/meetingManagement.js @@ -33,15 +33,31 @@ const actions = { }, async createMeeting({ dispatch }, meeting) { try { - await MeetingService.createMeeting(meeting); + const formattedMeeting = { + name: meeting.name, + organizer: meeting.organizer, + startTime: meeting.startTime, + endTime: meeting.endTime, + content: meeting.content, + status: 'Scheduled' // 确保状态为 'Scheduled' + }; + await MeetingService.createMeeting(formattedMeeting); dispatch('fetchMeetings'); } catch (error) { console.error('Failed to create meeting:', error); } }, - async updateMeeting({ dispatch }, meeting) { + async editMeeting({ dispatch }, meeting) { try { - await MeetingService.updateMeeting(meeting.id, meeting); + const formattedMeeting = { + name: meeting.name, + organizer: meeting.organizer, + startTime: meeting.startTime, + endTime: meeting.endTime, + content: meeting.content, + status: 'Scheduled' // 确保状态为 'Scheduled' + }; + await MeetingService.updateMeeting(meeting.id, formattedMeeting); dispatch('fetchMeetings'); } catch (error) { console.error('Failed to update meeting:', error); diff --git a/src/views/authentication/Login.vue b/src/views/authentication/Login.vue index 143a251..caac4f9 100644 --- a/src/views/authentication/Login.vue +++ b/src/views/authentication/Login.vue @@ -16,14 +16,14 @@ const handleLogin = async () => { console.log('Logging in with', { username: username.value, password: password.value, rememberMe: rememberMe.value }); try { - const response = await store.dispatch('authentication/login', { + const response = await axios.post('/api/users/login', { username: username.value, password: password.value, }); if (response.status === 200) { ElMessage.success('登录成功'); - router.push('/profile'); + await router.push('/profile'); } else { ElMessage.error('登录失败,请稍后再试'); } diff --git a/src/views/authentication/Register.vue b/src/views/authentication/Register.vue index 98f810d..8653431 100644 --- a/src/views/authentication/Register.vue +++ b/src/views/authentication/Register.vue @@ -1,17 +1,16 @@ @@ -80,20 +62,13 @@ const getVerificationCode = async () => { - - - - - - 验证码 + 注册 - 返回登录 + 返回登录 @@ -137,14 +112,6 @@ h2 { width: 100%; } -.verification-button { - width: 120px; /* 确保按钮宽度合适 */ - display: flex; - justify-content: center; - align-items: center; - padding: 0; /* 去除默认内边距 */ -} - .el-button { width: 100%; padding: 0.75rem; @@ -158,4 +125,4 @@ h2 { .el-button--primary:hover { background-color: #0056b3; } - + \ No newline at end of file diff --git a/src/views/meeting-management/AddMeeting.vue b/src/views/meeting-management/AddMeeting.vue index 51bd0a8..3c2fef0 100644 --- a/src/views/meeting-management/AddMeeting.vue +++ b/src/views/meeting-management/AddMeeting.vue @@ -35,15 +35,19 @@ export default { startTime: '', endTime: '', content: '', - status: 'Active' + status: 'Scheduled' // 确保状态为 'Scheduled' } }; }, methods: { ...mapActions('meetingManagement', ['createMeeting']), async submitForm() { - await this.createMeeting(this.meeting); - this.$router.push({ name: 'MeetingManagement' }); + try { + await this.createMeeting(this.meeting); + this.$router.push({ name: 'MeetingManagement' }); + } catch (error) { + console.error('Failed to create meeting:', error); + } }, cancel() { this.$router.push({ name: 'MeetingManagement' }); From 4f33e9c8ca1da3fd07380adfd2c5b363c2295477 Mon Sep 17 00:00:00 2001 From: Sparkfreeman <2440444538@qq.com> Date: Thu, 4 Jul 2024 16:45:59 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=9C=89=E9=97=AE=E9=A2=98=EF=BC=8C=E5=AF=BC=E5=87=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=9C=AA=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/meetingService.js | 20 +++- src/store/meetingManagement.js | 8 ++ .../meeting-management/MeetingManagement.vue | 91 +++++++++++++------ 3 files changed, 88 insertions(+), 31 deletions(-) diff --git a/src/services/meetingService.js b/src/services/meetingService.js index 7d69bfe..07b988e 100644 --- a/src/services/meetingService.js +++ b/src/services/meetingService.js @@ -1,7 +1,5 @@ import axios from 'axios'; -//const API_URL = 'http://localhost:8080/meetings'; - class MeetingService { getAllMeetings() { return axios.get(`/api/meetings/listAll`); @@ -17,14 +15,28 @@ class MeetingService { } updateMeeting(id, meeting) { - // 使用 POST 方法而不是 PUT 方法 - return axios.post(`/api/meetings/updateMeeting`, meeting); + // Convert meeting object to a map + const meetingMap = { + id: id, + name: meeting.name, + organizer: meeting.organizer, + startTime: meeting.startTime, + endTime: meeting.endTime, + content: meeting.content, + status: meeting.status + }; + return axios.post(`/api/meetings/updateMeeting`, meetingMap); } deleteMeeting(id) { // 使用 POST 方法并传递请求体 return axios.post(`/api/meetings/deleteMeeting`, { id }); } + + searchMeetings(params) { + // 使用 POST 方法并传递请求体 + return axios.post(`/api/meetings/searchMeetings`, params); + } } export default new MeetingService(); \ No newline at end of file diff --git a/src/store/meetingManagement.js b/src/store/meetingManagement.js index 866f7f2..56e1aea 100644 --- a/src/store/meetingManagement.js +++ b/src/store/meetingManagement.js @@ -23,6 +23,14 @@ const actions = { console.error('Failed to fetch meetings:', error); } }, + async searchMeetings({ commit }, params) { + try { + const response = await MeetingService.searchMeetings(params); + commit('setMeetings', response.data); + } catch (error) { + console.error('Failed to search meetings:', error); + } + }, async fetchMeetingById({ commit }, id) { try { const response = await MeetingService.getMeetingById(id); diff --git a/src/views/meeting-management/MeetingManagement.vue b/src/views/meeting-management/MeetingManagement.vue index f442d47..7c91729 100644 --- a/src/views/meeting-management/MeetingManagement.vue +++ b/src/views/meeting-management/MeetingManagement.vue @@ -1,6 +1,11 @@