Browse Source

增加同步成员功能

hushuyu 6 months ago
parent
commit
e549a80258

+ 9 - 0
src/api/project.js

@@ -67,6 +67,14 @@ function deleteForkProject(projectId) {
   });
 }
 
+function syncProjectMembers(projectId) {
+  return axios.post(`${prefix}/syncMembers`, null, {
+    params: {
+      projectId,
+    }
+  });
+}
+
 function findAllPublicProjectsGroupByCourse() {
   return axios.get(`${prefix}/findAllPublicGroupByCourse`);
 }
@@ -82,6 +90,7 @@ const projectAPIs = {
   updateCourseProjectState,
   forkProject,
   deleteForkProject,
+  syncProjectMembers,
   findAllPublicProjectsGroupByCourse,
 };
 

+ 31 - 2
src/views/CourseDetailPage/tabs/ProjectTab/ProjectLongCard.vue

@@ -24,7 +24,10 @@
         <el-button v-if="isPublic&&!isTeacher" size="small" type="primary" @click.stop="$emit('fork')">
           Fork
         </el-button>
-        <el-button v-if="canDeleteFork" size="small" type="danger" plain @click.stop="handleDeleteFork">
+        <el-button v-if="isPrivate" size="small" type="success" plain :loading="syncingMembers" @click.stop="handleSyncMembers">
+          同步成员
+        </el-button>
+        <el-button v-if="isPrivate" size="small" type="danger" plain @click.stop="handleDeleteFork">
           删除
         </el-button>
       </div>
@@ -56,7 +59,7 @@ export default {
       type: Boolean,
       default: false,
     },
-    canDeleteFork: {
+    isPrivate: {
       type: Boolean,
       default: false,
     }
@@ -65,6 +68,7 @@ export default {
   data() {
     return {
       members: [],
+      syncingMembers: false,
     };
   },
   computed:{
@@ -82,6 +86,31 @@ export default {
     }
   },
   methods: {
+    async refreshMembers() {
+      const res = (await this.$apis.findProjectMembers(this.project.id)).data;
+      if (!res.code) {
+        this.members = res.data;
+      }
+    },
+
+    async handleSyncMembers() {
+      if (this.syncingMembers) {
+        return;
+      }
+      this.syncingMembers = true;
+      try {
+        const res = (await this.$apis.syncProjectMembers(this.project.id)).data;
+        if (res.code) {
+          ElMessage.error(res.message);
+          return;
+        }
+        await this.refreshMembers();
+        ElMessage.success("同步成员成功!");
+      } finally {
+        this.syncingMembers = false;
+      }
+    },
+
     async handleDeleteFork() {
       try {
         await ElMessageBox.confirm(

+ 1 - 1
src/views/CourseDetailPage/tabs/ProjectTab/ProjectTab.vue

@@ -27,7 +27,7 @@
           </div>
           <div v-else>
             <project-long-card v-for="item in projects.private" :key="'project'+item.id"
-                               :project="item" :is-teacher="isCreator" :can-delete-fork="true"
+                               :project="item" :is-teacher="isCreator" :is-private="true"
                                @switch="handleSwitchProject(item.id)"
                                @delete="handleDeleteForkProject(item.id)"/>
           </div>