sunkean 3 лет назад
Родитель
Сommit
925caaa130

+ 44 - 16
src/main/java/com/izouma/nineth/domain/PublicScreenChat.java

@@ -2,7 +2,7 @@ package com.izouma.nineth.domain;
 
 import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
-import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.ChatType;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -10,6 +10,8 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
 import javax.persistence.Transient;
 import java.time.LocalDateTime;
 
@@ -20,30 +22,28 @@ import java.time.LocalDateTime;
 @ApiModel("元宇宙用户聊天信息")
 public class PublicScreenChat extends BaseEntity {
 
-    @ApiModelProperty("发送方昵称")
-    @ExcelProperty("发送方昵称")
-    @Searchable
+    @ApiModelProperty("消息发送方昵称")
+    @ExcelProperty("消息发送方昵称")
     private String nickname;
 
-    @ApiModelProperty("发送方用户id")
-    @ExcelProperty("发送方用户id")
-    @Searchable
+    @ApiModelProperty("消息发送方用户id")
+    @ExcelProperty("消息发送方用户id")
     private String userId;
 
-    @ApiModelProperty("勋章等级")
-    @ExcelProperty("勋章等级")
+    @ApiModelProperty("消息发送方勋章等级")
+    @ExcelProperty("消息发放送勋章等级")
     private int level;
 
-    @ApiModelProperty("境界")
-    @ExcelProperty("境界")
+    @ApiModelProperty("消息发送方境界")
+    @ExcelProperty("消息发送方境界")
     private String realm;
 
-    @ApiModelProperty("头衔")
-    @ExcelProperty("头衔")
+    @ApiModelProperty("消息发送方头衔")
+    @ExcelProperty("消息发送方头衔")
     private String title;
 
-    @ApiModelProperty("头像")
-    @ExcelProperty("头像")
+    @ApiModelProperty("消息发送方头像")
+    @ExcelProperty("消息发送方头像")
     private String avatar;
 
     @ApiModelProperty("消息内容")
@@ -62,7 +62,7 @@ public class PublicScreenChat extends BaseEntity {
     @ExcelIgnore
     private int recall;
 
-    @ApiModelProperty("类型 1:直播 2:元宇宙聊天")
+    @ApiModelProperty("类型 1:元宇宙聊天 2:直播")
     @ExcelIgnore
     private int type;
 
@@ -72,4 +72,32 @@ public class PublicScreenChat extends BaseEntity {
 
     @Transient
     private boolean myself;
+
+    @ApiModelProperty("消息类型")
+    @Enumerated(EnumType.STRING)
+    private ChatType chatType;
+
+    @ApiModelProperty("消息接受方昵称")
+    @ExcelProperty("消息接受方昵称")
+    private String toUserNickname;
+
+    @ApiModelProperty("消息接收方用户id")
+    @ExcelProperty("消息接收方用户id")
+    private Long toUserId;
+
+    @ApiModelProperty("消息接收方勋章等级")
+    @ExcelProperty("消息接收方勋章等级")
+    private int toUserLevel;
+
+    @ApiModelProperty("消息接收方境界")
+    @ExcelProperty("消息接收方境界")
+    private String toUserRealm;
+
+    @ApiModelProperty("消息接收方头衔")
+    @ExcelProperty("消息接收方头衔")
+    private String toUserTitle;
+
+    @ApiModelProperty("消息接收方头像")
+    @ExcelProperty("消息接收方头像")
+    private String toUserAvatar;
 }

+ 20 - 0
src/main/java/com/izouma/nineth/enums/ChatType.java

@@ -0,0 +1,20 @@
+package com.izouma.nineth.enums;
+
+public enum ChatType {
+
+    DEFAULT("默认"),
+
+    PUBLIC("公频聊天"),
+
+    PRIVATE("私聊");
+
+    private final String description;
+
+    ChatType(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 146 - 123
src/main/vue/src/views/PublicScreenChatList.vue

@@ -1,133 +1,156 @@
 <template>
-	<div class="list-view">
-		<page-title>
-			<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"
-			>
-				<el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
-			</el-input>
-		</div>
-		<el-table
-			:data="tableData"
-			row-key="id"
-			ref="table"
-			header-row-class-name="table-header-row"
-			header-cell-class-name="table-header-cell"
-			row-class-name="table-row"
-			cell-class-name="table-cell"
-			:height="tableHeight"
-			v-loading="fetchingData"
-		>
-			<el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
-			<el-table-column prop="nickname" align="center" label="用户昵称"> </el-table-column>
-			<el-table-column prop="userId" align="center" label="用户id"> </el-table-column>
-			<el-table-column prop="avatar" align="center" label="头像">
-				<template slot-scope="{ row }">
-					<el-image
-						style="width: 30px; height: 30px"
-						:src="row.avatar"
-						fit="cover"
-						:preview-src-list="[row.avatar]"
-					>
-					</el-image>
-				</template>
-			</el-table-column>
-			<el-table-column prop="level" align="center" label="等级"> </el-table-column>
-			<el-table-column prop="realm" align="center" label="境界"> </el-table-column>
-			<el-table-column prop="title" align="center" label="头衔"> </el-table-column>
-			<el-table-column prop="messageInfo" align="center" width="800" label="消息内容"> </el-table-column>
-			<el-table-column prop="illegal" align="center" label="是否合法">
-				<template slot-scope="{ row }">
-					<el-tag :type="row.illegal ? '' : 'info'"> {{ row.illegal }} </el-tag>
-				</template>
-			</el-table-column>
-			<el-table-column prop="time" align="center" width="200" label="消息发送时间"> </el-table-column>
-		</el-table>
-		<div class="pagination-wrapper">
-			<el-pagination
-				background
-				@size-change="onSizeChange"
-				@current-change="onCurrentChange"
-				:current-page="page"
-				:page-sizes="[10, 20, 30, 40, 50]"
-				:page-size="pageSize"
-				layout="total, sizes, prev, pager, next, jumper"
-				:total="totalElements"
-			>
-			</el-pagination>
-		</div>
-	</div>
+    <div class="list-view">
+        <page-title>
+            <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"
+            >
+                <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
+            </el-input>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+            v-loading="fetchingData"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="userId" align="center" label="发送方用户id"> </el-table-column>
+            <el-table-column prop="nickname" align="center" label="发送方昵称"> </el-table-column>
+            <el-table-column prop="avatar" align="center" label="发送方头像">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px"
+                        :src="row.avatar"
+                        fit="cover"
+                        :preview-src-list="[row.avatar]"
+                    >
+                    </el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="time" align="center" width="200" label="消息发送时间"> </el-table-column>
+            <el-table-column prop="chatType" align="center" label="类型" :formatter="typeFormatter"> </el-table-column>
+            <el-table-column prop="messageInfo" align="center" width="800" label="消息内容"> </el-table-column>
+            <el-table-column prop="toUserId" align="center" label="接收方用户id"> </el-table-column>
+            <el-table-column prop="toUserNickname" align="center" label="接收方昵称"> </el-table-column>
+            <el-table-column prop="toUserAvatar" align="center" label="接收方头像">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px"
+                        :src="row.avatar"
+                        fit="cover"
+                        :preview-src-list="[row.avatar]"
+                    >
+                    </el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="illegal" align="center" label="是否合法">
+                <template slot-scope="{ row }">
+                    <el-tag :type="row.illegal ? '' : 'info'"> {{ row.illegal }} </el-tag>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
 </template>
 <script>
 import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
 
 export default {
-	name: 'PublicScreenChatList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/publicScreenChat/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		beforeGetData() {
-			return { search: this.search, query: { del: false, type: 1 } };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/publicScreenChat/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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);
-				});
-		}
-	}
+    name: 'PublicScreenChatList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            typeOptions: [
+                { label: '默认', value: 'DEFAULT' },
+                { label: '公频聊天', value: 'PUBLIC' },
+                { label: '私聊', value: 'PRIVATE' }
+            ],
+            multipleMode: false,
+            search: '',
+            url: '/publicScreenChat/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        typeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.typeOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return { search: this.search, query: { del: false, type: 1 } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/publicScreenChat/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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);
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>