Jelajahi Sumber

建群管理后台

wangqifan 3 tahun lalu
induk
melakukan
e04fdc7de1

+ 5 - 0
src/main/java/com/izouma/nineth/domain/netease/Team.java

@@ -29,6 +29,9 @@ public class Team extends BaseEntityNoID {
     @Column(columnDefinition = "TEXT")
     @Convert(converter = StringArrayConverter.class)
     private List<String> admins;
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = StringArrayConverter.class)
+    private List<String> banned;
     private String       announcement;
     private String       intro;
     private String       msg;
@@ -46,4 +49,6 @@ public class Team extends BaseEntityNoID {
     @Transient
     private NeteaseMessage lastMsg;
 
+    private boolean mute;
+
 }

+ 53 - 1
src/main/java/com/izouma/nineth/service/netease/TeamService.java

@@ -68,7 +68,7 @@ public class TeamService {
         params.put("members", JSONObject.toJSONString(team.getMembers()));
         params.put("joinmode", "0");
         params.put("custom", team.getCustom().toString());
-        params.put("msg", "欢迎加入大厅测试群~~");
+        params.put("msg", team.getMsg());
         String result = neteaseUserService
                 .httpPost("team/create.action", "application/x-www-form-urlencoded;charset=utf-8", params);
         JSONObject jsonObject = JSON.parseObject(result);
@@ -81,6 +81,58 @@ public class TeamService {
         return teamRepo.save(team);
     }
 
+    public Team update(Team team) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("tid", team.getTid());
+        params.put("tname", team.getName());
+        params.put("owner", team.getOwnerid());
+        params.put("announcement", team.getAnnouncement());
+        params.put("intro", team.getIntro());
+        params.put("icon", "0");
+        String result = neteaseUserService
+                .httpPost("team/update.action", "application/x-www-form-urlencoded;charset=utf-8", params);
+        JSONObject jsonObject = JSON.parseObject(result);
+        Integer code = jsonObject.getInteger("code");
+        if (code != 200) {
+            throw new BusinessException("注册出错,请核查后重新注册");
+        }
+        return teamRepo.save(team);
+    }
+
+    public void mute(Long tid) {
+        Map<String, Object> params = new HashMap<>();
+        Team team = teamRepo.findById(tid).orElseThrow(new BusinessException("暂无"));
+        params.put("tid", tid);
+        params.put("owner", team.getOwnerid());
+        params.put("muteType", 1);
+        String result = neteaseUserService
+                .httpPost("team/muteTlistAll.action", "application/x-www-form-urlencoded;charset=utf-8", params);
+        JSONObject jsonObject = JSON.parseObject(result);
+        Integer code = jsonObject.getInteger("code");
+        if (code != 200) {
+            throw new BusinessException("禁言操作出错");
+        }
+        team.setMute(true);
+        teamRepo.save(team);
+    }
+
+    public void cancelMute(Long tid) {
+        Map<String, Object> params = new HashMap<>();
+        Team team = teamRepo.findById(tid).orElseThrow(new BusinessException("暂无"));
+        params.put("tid", tid);
+        params.put("owner", team.getOwnerid());
+        params.put("muteType", 0);
+        String result = neteaseUserService
+                .httpPost("team/muteTlistAll.action", "application/x-www-form-urlencoded;charset=utf-8", params);
+        JSONObject jsonObject = JSON.parseObject(result);
+        Integer code = jsonObject.getInteger("code");
+        if (code != 200) {
+            throw new BusinessException("禁言操作出错");
+        }
+        team.setMute(false);
+        teamRepo.save(team);
+    }
+
     public Team invite(String id, String tid) {
         List<String> ids = new ArrayList<>();
         ids.add(id);

+ 21 - 10
src/main/java/com/izouma/nineth/web/netease/TeamController.java

@@ -12,6 +12,7 @@ import com.izouma.nineth.utils.excel.ExcelUtils;
 import freemarker.template.utility.RichObjectWrapper;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
@@ -25,16 +26,26 @@ public class TeamController extends BaseController {
     private TeamService teamService;
     private TeamRepo    teamRepo;
 
-    //@PreAuthorize("hasRole('ADMIN')")
-//    @PostMapping("/save")
-//    public Team save(@RequestBody Team record) {
-//        if (record.getId() != null) {
-//            Team orig = teamRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
-//            ObjUtils.merge(orig, record);
-//            return teamRepo.save(orig);
-//        }
-//        return teamRepo.save(record);
-//    }
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Team save(@RequestBody Team record) {
+        if (record.getTid() != null) {
+            return teamService.update(record);
+        }
+        return teamService.create(record);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/mute/{id}")
+    public void mute(@PathVariable Long id) {
+        teamService.mute(id);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/cancelMute/{id}")
+    public void cancelMute(@PathVariable Long id) {
+        teamService.cancelMute(id);
+    }
 
     @PostMapping("/create")
     public Team create(@RequestParam Team team) {

+ 25 - 20
src/main/vue/src/views/TeamEdit.vue

@@ -13,41 +13,41 @@
                          size="small"
                          style="max-width: 500px;">
                         <el-form-item prop="tid" label="tid">
-                                    <el-input-number type="number" v-model="formData.tid"></el-input-number>
+                                    <el-input-number type="number" v-model="formData.tid" disabled></el-input-number>
                         </el-form-item>
                         <el-form-item prop="name" label="群名">
                                     <el-input v-model="formData.name"></el-input>
                         </el-form-item>
                         <el-form-item prop="ownerid" label="群主id">
-                                    <el-input v-model="formData.ownerid"></el-input>
-                        </el-form-item>
-                        <el-form-item prop="members" label="群成员列表">
-                                    <el-input v-model="formData.members"></el-input>
-                        </el-form-item>
-                        <el-form-item prop="admins" label="管理员列表">
-                                    <el-input v-model="formData.admins"></el-input>
+                                    <el-input v-model="formData.ownerid" :disabled="!canEdit"></el-input>
                         </el-form-item>
+<!--                        <el-form-item prop="members" label="群成员列表">-->
+<!--                                    <el-input v-model="formData.members"></el-input>-->
+<!--                        </el-form-item>-->
+<!--                        <el-form-item prop="admins" label="管理员列表">-->
+<!--                                    <el-input v-model="formData.admins"></el-input>-->
+<!--                        </el-form-item>-->
                         <el-form-item prop="announcement" label="公告">
-                                    <el-input v-model="formData.announcement"></el-input>
+                                    <el-input type="textarea" v-model="formData.announcement"></el-input>
                         </el-form-item>
                         <el-form-item prop="intro" label="介绍">
-                                    <el-input v-model="formData.intro"></el-input>
+                                    <el-input type="textarea" v-model="formData.intro"></el-input>
                         </el-form-item>
                         <el-form-item prop="msg" label="邀请信息">
-                                    <el-input v-model="formData.msg"></el-input>
-                        </el-form-item>
-                        <el-form-item prop="custom" label="群组分类">
-                                    <el-input v-model="formData.custom"></el-input>
+                                    <el-input type="textarea" v-model="formData.msg" :disabled="!canEdit"></el-input>
                         </el-form-item>
+<!--                        <el-form-item prop="custom" label="群组分类">-->
+<!--                                    <el-input v-model="formData.custom"></el-input>-->
+<!--                        </el-form-item>-->
                         <el-form-item prop="icon" label="图标">
                                     <single-upload v-model="formData.icon"></single-upload>
                         </el-form-item>
-                        <el-form-item prop="collectionId" label="藏品id">
-                                    <el-input-number type="number" v-model="formData.collectionId"></el-input-number>
-                        </el-form-item>
-                        <el-form-item prop="password" label="密码">
-                                    <el-input v-model="formData.password"></el-input>
-                        </el-form-item>
+<!--                        <el-form-item prop="collectionId" label="藏品id">-->
+<!--                                    <el-input-number type="number" v-model="formData.collectionId"></el-input-number>-->
+<!--                        </el-form-item>-->
+<!--                        <el-form-item prop="password" label="密码">-->
+<!--                                    <el-input v-model="formData.password"></el-input>-->
+<!--                        </el-form-item>-->
                     <el-form-item class="form-submit">
                         <el-button @click="onSave" :loading="saving" type="primary">
                             保存
@@ -78,6 +78,11 @@
                     });
             }
         },
+        computed: {
+            canEdit() {
+                return !!!this.$route.query.id;
+            }
+        },
         data() {
             return {
                 saving: false,

+ 164 - 144
src/main/vue/src/views/TeamList.vue

@@ -1,22 +1,24 @@
 <template>
-    <div  class="list-view">
+    <div class="list-view">
         <page-title>
-            <el-button @click="addRow" type="primary" icon="el-icon-plus" :disabled="fetchingData || downloading" class="filter-item">
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" :disabled="fetchingData || downloading"
+                       class="filter-item">
                 新增
             </el-button>
-            <el-button @click="download" icon="el-icon-upload2" :loading="downloading" :disabled="fetchingData" class="filter-item">
+            <el-button @click="download" icon="el-icon-upload2" :loading="downloading" :disabled="fetchingData"
+                       class="filter-item">
                 导出
             </el-button>
         </page-title>
         <div class="filters-container">
             <el-input
-                    placeholder="搜索..."
-                    v-model="search"
-                    clearable
-                    class="filter-item search"
-                    @keyup.enter.native="getData"
+                placeholder="搜索..."
+                v-model="search"
+                clearable
+                class="filter-item search"
+                @keyup.enter.native="getData"
             >
-                <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
+                <el-button @click="getData" slot="append" icon="el-icon-search"></el-button>
             </el-input>
         </div>
         <el-table :data="tableData" row-key="id" ref="table"
@@ -27,57 +29,51 @@
             <el-table-column v-if="multipleMode" align="center" type="selection"
                              width="50">
             </el-table-column>
-            <el-table-column prop="id" label="ID" width="100">
+            <el-table-column prop="tid" label="tid"
+            >
+            </el-table-column>
+            <el-table-column prop="name" label="群名" width="150"
+            >
+            </el-table-column>
+            <el-table-column prop="ownerid" label="群主id"
+            >
             </el-table-column>
-                                <el-table-column prop="tid" label="tid"
->
-                    </el-table-column>
-                    <el-table-column prop="name" label="群名"
->
-                    </el-table-column>
-                    <el-table-column prop="ownerid" label="群主id"
->
-                    </el-table-column>
-                    <el-table-column prop="members" label="群成员列表"
->
-                    </el-table-column>
-                    <el-table-column prop="admins" label="管理员列表"
->
-                    </el-table-column>
-                    <el-table-column prop="announcement" label="公告"
->
-                    </el-table-column>
-                    <el-table-column prop="intro" label="介绍"
->
-                    </el-table-column>
-                    <el-table-column prop="msg" label="邀请信息"
->
-                    </el-table-column>
-                    <el-table-column prop="custom" label="群组分类"
->
-                    </el-table-column>
-                    <el-table-column prop="icon" label="图标"
->
-                            <template slot-scope="{row}">
-                                <el-image style="width: 30px; height: 30px"
-                                          :src="row.icon" fit="cover"
-                                          :preview-src-list="[row.icon]"></el-image>
-                            </template>
-                    </el-table-column>
-                    <el-table-column prop="collectionId" label="藏品id"
->
-                    </el-table-column>
-                    <el-table-column prop="password" label="密码"
->
-                    </el-table-column>
+            <el-table-column prop="members" label="群成员列表"
+            >
+            </el-table-column>
+            <el-table-column prop="announcement" label="公告"
+                             show-tooltip-when-overflow
+            >
+            </el-table-column>
+            <el-table-column prop="intro" label="介绍"
+                             show-tooltip-when-overflow
+            >
+            </el-table-column>
+            <el-table-column prop="msg" label="邀请信息"
+                             show-tooltip-when-overflow
+            >
+            </el-table-column>
+            <el-table-column prop="icon" label="图标"
+            >
+                <template slot-scope="{row}">
+                    <el-image style="width: 30px; height: 30px"
+                              :src="row.icon" fit="cover"
+                              :preview-src-list="[row.icon]"></el-image>
+                </template>
+            </el-table-column>
+            <!--            <el-table-column prop="collectionId" label="藏品id"-->
+            <!--            >-->
+            <!--            </el-table-column>-->
             <el-table-column
-                    label="操作"
-                    align="center"
-                    fixed="right"
-                    width="150">
+                label="操作"
+                align="center"
+                fixed="right"
+                width="250">
                 <template slot-scope="{row}">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
-                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                    <el-button @click="mute(row)" v-if="row.mute === false" type="danger" size="mini" plain>群禁言</el-button>
+                    <el-button @click="cancelMute(row)" v-if="row.mute === true" size="mini" plain>解除禁言</el-button>
+                    <!--                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>-->
                 </template>
             </el-table-column>
         </el-table>
@@ -101,101 +97,125 @@
     </div>
 </template>
 <script>
-    import { mapState } from "vuex";
-    import pageableTable from "@/mixins/pageableTable";
+import {mapState} from "vuex";
+import pageableTable from "@/mixins/pageableTable";
 
-    export default {
-        name: 'TeamList',
-        mixins: [pageableTable],
-        data() {
-            return {
-                multipleMode: false,
-                search: "",
-                url: "/team/all",
-                downloading: false,
-            }
+export default {
+    name: 'TeamList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: "",
+            url: "/team/all",
+            downloading: false,
+        }
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return {search: this.search, query: {del: false}};
         },
-        computed: {
-            selection() {
-                return this.$refs.table.selection.map(i => i.id);
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
             }
         },
-        methods: {
-            beforeGetData() {
-                return { search: this.search, query: { del: false } };
-            },
-            toggleMultipleMode(multipleMode) {
-                this.multipleMode = multipleMode;
-                if (!multipleMode) {
-                    this.$refs.table.clearSelection();
+        addRow() {
+            this.$router.push({
+                path: "/teamEdit",
+                query: {
+                    ...this.$route.query
                 }
-            },
-            addRow() {
-                this.$router.push({
-                    path: "/teamEdit",
-                    query: {
-                        ...this.$route.query
-                    }
-                });
-            },
-            editRow(row) {
-                this.$router.push({
-                    path: "/teamEdit",
-                    query: {
-                    id: row.id
-                    }
-                });
-            },
-            download() {
-                this.downloading = true;
-                this.$axios
-                    .get("/team/excel", { 
-                        responseType: "blob",
-                        params: { size: 10000 }
-                    })
-                    .then(res => {
-                        console.log(res);
-                        this.downloading = false;
-                        const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
-                        const link = document.createElement("a");
-                        link.href = downloadUrl;
-                        link.setAttribute(
-                            "download",
-                            res.headers["content-disposition"].split("filename=")[1]
-                        );
-                        document.body.appendChild(link);
-                        link.click();
-                        link.remove();
-                    })
-                    .catch(e => {
-                        console.log(e);
-                        this.downloading = false;
-                        this.$message.error(e.error);
-                    });
-            },
-            operation1() {
-                this.$notify({
-                    title: '提示',
-                    message: this.selection
-                });
-            },
-            operation2() {
-                this.$message('操作2');
-            },
-            deleteRow(row) {
-                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
-                    return this.$http.post(`/team/del/${row.id}`)
-                }).then(() => {
-                    this.$message.success('删除成功');
-                    this.getData();
-                }).catch(e => {
-                    if (e !== 'cancel') {
-                        this.$message.error(e.error);
-                    }
+            });
+        },
+        mute(row) {
+            this.$alert('禁言后用户无法发言,确认要禁言么?', '警告', {type: 'error'}).then(() => {
+                return this.$http.post(`/team/mute/${row.tid}`)
+            }).then(() => {
+                this.$message.success('禁言成功');
+                this.getData();
+            }).catch(e => {
+                if (e !== 'cancel') {
+                    this.$message.error(e.error);
+                }
+            })
+        },
+        cancelMute(row) {
+            this.$alert('解除禁言所有非封禁用户可以正常发言?', '警告', {type: 'error'}).then(() => {
+                return this.$http.post(`/team/cancelMute/${row.tid}`)
+            }).then(() => {
+                this.$message.success('解禁成功');
+                this.getData();
+            }).catch(e => {
+                if (e !== 'cancel') {
+                    this.$message.error(e.error);
+                }
+            })
+        },
+        editRow(row) {
+            this.$router.push({
+                path: "/teamEdit",
+                query: {
+                    id: row.tid
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get("/team/excel", {
+                    responseType: "blob",
+                    params: {size: 10000}
                 })
-            },
-        }
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement("a");
+                    link.href = downloadUrl;
+                    link.setAttribute(
+                        "download",
+                        res.headers["content-disposition"].split("filename=")[1]
+                    );
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                return this.$http.post(`/team/del/${row.id}`)
+            }).then(() => {
+                this.$message.success('删除成功');
+                this.getData();
+            }).catch(e => {
+                if (e !== 'cancel') {
+                    this.$message.error(e.error);
+                }
+            })
+        },
     }
+}
 </script>
 <style lang="less" scoped>
 </style>