通信模块初步实习
This commit is contained in:
parent
7638324bb9
commit
ccabf6c09d
1
acdr-ui/env/.env
vendored
1
acdr-ui/env/.env
vendored
@ -10,6 +10,7 @@ VITE_APP_PUBLIC_BASE=/acdr/
|
|||||||
# VITE_SERVER_BASEURL = 'http://47.99.70.12:28184/api'
|
# VITE_SERVER_BASEURL = 'http://47.99.70.12:28184/api'
|
||||||
# VITE_UPLOAD_BASEURL = 'http://47.99.70.12:28184'
|
# VITE_UPLOAD_BASEURL = 'http://47.99.70.12:28184'
|
||||||
VITE_SERVER_BASEURL = 'http://localhost:28184/api'
|
VITE_SERVER_BASEURL = 'http://localhost:28184/api'
|
||||||
|
VITE_WS_BASEURL = 'ws://localhost:28184/api'
|
||||||
VITE_UPLOAD_BASEURL = 'http://localhost:28184'
|
VITE_UPLOAD_BASEURL = 'http://localhost:28184'
|
||||||
VITE_OSS_BASEURL = 'http://116.204.119.171:9000/linghe'
|
VITE_OSS_BASEURL = 'http://116.204.119.171:9000/linghe'
|
||||||
|
|
||||||
|
40
acdr-ui/src/pages/message/privatechat.vue
Normal file
40
acdr-ui/src/pages/message/privatechat.vue
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<route lang="json5" type="page">
|
||||||
|
{
|
||||||
|
layout: 'default',
|
||||||
|
style: {
|
||||||
|
navigationBarTitleText: '聊天',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</route>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
<text>客服聊天系统</text>
|
||||||
|
<input v-model="message" placeholder="输入消息" />
|
||||||
|
<button @click="sendMessageToServer">发送</button>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import useWebSocket from '@/service/webSocket'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
const { connectWebSocket, sendMessage, closeWebSocket } = useWebSocket()
|
||||||
|
|
||||||
|
const message = ref('')
|
||||||
|
|
||||||
|
const sendMessageToServer = () => {
|
||||||
|
if (message.value.trim() !== '') {
|
||||||
|
sendMessage(message.value)
|
||||||
|
message.value = ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
connectWebSocket() // 组件加载时连接 WebSocket
|
||||||
|
})
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
closeWebSocket() // 组件卸载时关闭 WebSocket 连接
|
||||||
|
})
|
||||||
|
</script>
|
64
acdr-ui/src/service/webSocket.js
Normal file
64
acdr-ui/src/service/webSocket.js
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
import { useUserStore } from '@/store/user'
|
||||||
|
|
||||||
|
export default function useWebSocket() {
|
||||||
|
const userStore = useUserStore()
|
||||||
|
|
||||||
|
let ws = null
|
||||||
|
|
||||||
|
const connectWebSocket = () => {
|
||||||
|
if (!userStore.isLogined) {
|
||||||
|
console.error("用户未登录,无法建立 WebSocket 连接")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const token = userStore.userInfo.token
|
||||||
|
const wsUrl = `${import.meta.env.VITE_WS_BASEURL}/chat/${token}` // 根据你的服务端口和路径
|
||||||
|
|
||||||
|
if (ws) {
|
||||||
|
console.log("WebSocket 已连接")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ws = new WebSocket(wsUrl)
|
||||||
|
|
||||||
|
ws.onopen = () => {
|
||||||
|
console.log("WebSocket 连接成功")
|
||||||
|
}
|
||||||
|
|
||||||
|
ws.onmessage = (event) => {
|
||||||
|
const message = event.data
|
||||||
|
console.log("收到消息:", message)
|
||||||
|
// 这里可以根据需要处理收到的消息,比如显示在聊天窗口
|
||||||
|
}
|
||||||
|
|
||||||
|
ws.onerror = (error) => {
|
||||||
|
console.error("WebSocket 错误:", error)
|
||||||
|
}
|
||||||
|
|
||||||
|
ws.onclose = () => {
|
||||||
|
console.log("WebSocket 连接关闭")
|
||||||
|
ws = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const sendMessage = (message) => {
|
||||||
|
if (!ws || ws.readyState !== WebSocket.OPEN) {
|
||||||
|
console.error("WebSocket 尚未连接,无法发送消息")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ws.send(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
const closeWebSocket = () => {
|
||||||
|
if (ws) {
|
||||||
|
ws.close()
|
||||||
|
ws = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
connectWebSocket,
|
||||||
|
sendMessage,
|
||||||
|
closeWebSocket,
|
||||||
|
}
|
||||||
|
}
|
@ -74,7 +74,7 @@ public class TableToEntityConstructor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
AutoTable("personal", "", "", "",
|
AutoTable("chat", "", "", "",
|
||||||
"acdr_service_name");
|
"acdr_chat_message");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.yskj.acdr.config;
|
||||||
|
|
||||||
|
|
||||||
|
import com.yskj.acdr.utils.SpringContextHolder;
|
||||||
|
import jakarta.websocket.server.ServerEndpointConfig;
|
||||||
|
|
||||||
|
public class MyEndpointConfigurator extends ServerEndpointConfig.Configurator {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException {
|
||||||
|
return SpringContextHolder.getBean(clazz); // 从 Spring 上下文中获取 WebSocket 类的实例
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -44,6 +44,7 @@ public class WebConfig implements WebMvcConfigurer {
|
|||||||
public void addInterceptors(InterceptorRegistry registry) {
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
|
registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
|
||||||
.addPathPatterns("/**")
|
.addPathPatterns("/**")
|
||||||
|
.excludePathPatterns("/chat/**")
|
||||||
.excludePathPatterns("/others/**")
|
.excludePathPatterns("/others/**")
|
||||||
.excludePathPatterns("/public/**")
|
.excludePathPatterns("/public/**")
|
||||||
.excludePathPatterns("/profile/**")
|
.excludePathPatterns("/profile/**")
|
||||||
|
15
acdr/src/main/java/com/yskj/acdr/config/WebSocketConfig.java
Normal file
15
acdr/src/main/java/com/yskj/acdr/config/WebSocketConfig.java
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package com.yskj.acdr.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class WebSocketConfig {
|
||||||
|
// WebSocket 端点自动注册
|
||||||
|
@Bean
|
||||||
|
public ServerEndpointExporter serverEndpointExporter() {
|
||||||
|
return new ServerEndpointExporter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.yskj.acdr.master.chat.chatenum;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.EnumValue;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonValue;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public enum ChatState {
|
||||||
|
READ(1, "已读"),
|
||||||
|
NO_READ(0, "未读");
|
||||||
|
|
||||||
|
@EnumValue
|
||||||
|
private final int value;
|
||||||
|
@JsonValue
|
||||||
|
private final String info;
|
||||||
|
|
||||||
|
ChatState(int value, String info) {
|
||||||
|
this.value = value;
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
package com.yskj.acdr.master.chat.controller;
|
||||||
|
|
||||||
|
import com.yskj.acdr.master.chat.entity.ChatMessage;
|
||||||
|
import com.yskj.acdr.master.chat.service.ChatMessageService;
|
||||||
|
import com.yskj.acdr.common.response.GlobalResponse;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import jakarta.validation.groups.Default;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 前端控制器
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 林河
|
||||||
|
* @since 2024-09-11
|
||||||
|
*/
|
||||||
|
@Api(tags = "通信模块控制器")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/chatMessage")
|
||||||
|
public class ChatMessageController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ChatMessageService service;
|
||||||
|
|
||||||
|
@ApiOperation(value = "分页列表", response = ChatMessage.class)
|
||||||
|
@PostMapping(value = "/page")
|
||||||
|
public GlobalResponse<ChatMessage> list(GlobalResponse<ChatMessage> page) {
|
||||||
|
return service.lambdaQuery().page(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "详情", response = ChatMessage.class)
|
||||||
|
@GetMapping(value = "/info/{id}")
|
||||||
|
public GlobalResponse<ChatMessage> info(@Validated({GetMapping.class}) @PathVariable Long id) {
|
||||||
|
ChatMessage chatMessage = service.getById(id);
|
||||||
|
return GlobalResponse.success(chatMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "新增")
|
||||||
|
@PostMapping(value = "/add")
|
||||||
|
public GlobalResponse<ChatMessage> add(@Validated({PostMapping.class, Default.class}) @RequestBody ChatMessage param) {
|
||||||
|
service.save(param);
|
||||||
|
return GlobalResponse.success("新增成功!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "修改")
|
||||||
|
@PostMapping(value = "/modify")
|
||||||
|
public GlobalResponse<ChatMessage> modify(@Validated({PutMapping.class, Default.class}) @RequestBody ChatMessage param) {
|
||||||
|
service.updateById(param);
|
||||||
|
return GlobalResponse.success("修改成功!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "删除(单个条目)")
|
||||||
|
@GetMapping(value = "/remove/{id}")
|
||||||
|
public GlobalResponse<ChatMessage> remove(@Validated({DeleteMapping.class}) @PathVariable Long id) {
|
||||||
|
service.removeById(id);
|
||||||
|
return GlobalResponse.success("删除(单个条目)!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "删除(多个条目)")
|
||||||
|
@PostMapping(value = "/removes")
|
||||||
|
public GlobalResponse<ChatMessage> removes(@RequestBody List<Long> ids) {
|
||||||
|
service.removeBatchByIds(ids);
|
||||||
|
return GlobalResponse.success("删除(多个条目)!");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,164 @@
|
|||||||
|
package com.yskj.acdr.master.chat.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import cn.dev33.satoken.util.SaFoxUtil;
|
||||||
|
import com.yskj.acdr.common.cache.GlobalRedisCache;
|
||||||
|
import com.yskj.acdr.config.MyEndpointConfigurator;
|
||||||
|
import com.yskj.acdr.master.chat.chatenum.ChatState;
|
||||||
|
import com.yskj.acdr.master.chat.entity.ChatMessage;
|
||||||
|
import com.yskj.acdr.master.chat.entity.WSRes;
|
||||||
|
import com.yskj.acdr.master.chat.service.ChatMessageService;
|
||||||
|
import com.yskj.acdr.master.user.entity.Users;
|
||||||
|
import com.yskj.acdr.master.user.service.UsersService;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.websocket.*;
|
||||||
|
import jakarta.websocket.server.PathParam;
|
||||||
|
import jakarta.websocket.server.ServerEndpoint;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.transaction.PlatformTransactionManager;
|
||||||
|
import org.springframework.transaction.TransactionDefinition;
|
||||||
|
import org.springframework.transaction.TransactionStatus;
|
||||||
|
import org.springframework.transaction.support.DefaultTransactionDefinition;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客服系统或者是宠托师聊天功能实现
|
||||||
|
*/
|
||||||
|
@ServerEndpoint(value = "/chat/{token}", configurator = MyEndpointConfigurator.class)
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class ChatServerEndpoint {
|
||||||
|
|
||||||
|
private Session session;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private UsersService usersService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private GlobalRedisCache<String> redisCache;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ChatMessageService cms;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private PlatformTransactionManager transactionManager; // 注入 PlatformTransactionManager
|
||||||
|
|
||||||
|
private static final Map<Long, Session> sessionMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
private Long userId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 收到客户端消息后调用的方法
|
||||||
|
*/
|
||||||
|
@OnMessage
|
||||||
|
public void onMessage(String message, Session session) throws IOException {
|
||||||
|
try {
|
||||||
|
// 处理消息并对服务进行消息转发
|
||||||
|
Map<String, List<String>> parameter = session.getRequestParameterMap();
|
||||||
|
List<String> userIds = parameter.get("toUserId");
|
||||||
|
if (!userIds.isEmpty()) {
|
||||||
|
// 获取转发消息的toUserId
|
||||||
|
String toUserId = userIds.getFirst();
|
||||||
|
Session toSession = sessionMap.get(Long.parseLong(toUserId));
|
||||||
|
|
||||||
|
// 创建 TransactionDefinition 定义事务的属性
|
||||||
|
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
|
||||||
|
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
|
||||||
|
|
||||||
|
// 开启事务
|
||||||
|
TransactionStatus status = transactionManager.getTransaction(def);
|
||||||
|
|
||||||
|
try {
|
||||||
|
ChatMessage chatMessage = new ChatMessage()
|
||||||
|
.setUserId(userId)
|
||||||
|
.setBeUserId(Long.parseLong(toUserId))
|
||||||
|
.setState(ChatState.NO_READ)
|
||||||
|
.setContent(message);
|
||||||
|
|
||||||
|
// 保存消息到数据库
|
||||||
|
boolean save = cms.save(chatMessage);
|
||||||
|
|
||||||
|
if (save) {
|
||||||
|
// 提交事务
|
||||||
|
transactionManager.commit(status);
|
||||||
|
|
||||||
|
// 如果对方在线,则发送消息
|
||||||
|
if (toSession != null) {
|
||||||
|
sendText(toSession, WSRes.success(chatMessage));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 如果保存失败,回滚事务
|
||||||
|
transactionManager.rollback(status);
|
||||||
|
sendText(session, WSRes.error("发送消息失败,请检查网络连接!"));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 在发生任何异常时回滚事务
|
||||||
|
transactionManager.rollback(status);
|
||||||
|
log.error(e.getMessage());
|
||||||
|
sendText(session, WSRes.error("发送消息失败,请检查网络连接!"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
sendText(session, WSRes.error("发送消息失败,请检查网络连接!"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 连接建立成功时调用的方法
|
||||||
|
*/
|
||||||
|
@OnOpen
|
||||||
|
public void onOpen(Session session, @PathParam("token") String token) throws IOException {
|
||||||
|
this.session = session;
|
||||||
|
|
||||||
|
// 使用 Sa-Token 进行登录检查
|
||||||
|
try {
|
||||||
|
Object loginIdByToken = StpUtil.getLoginIdByToken(token);
|
||||||
|
if (loginIdByToken == null) {
|
||||||
|
sendText(session, WSRes.error("未登录或登录已过期,连接将关闭"));
|
||||||
|
session.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
userId = SaFoxUtil.getValueByType(loginIdByToken, long.class);
|
||||||
|
// 如果登录有效
|
||||||
|
Users users = usersService.getById(userId);
|
||||||
|
sendText(session, WSRes.success("尊敬的%s您好!连接成功,欢迎进入客服系统!".formatted(users.getNickname())));
|
||||||
|
sessionMap.put(userId, session);
|
||||||
|
} catch (Exception e) {
|
||||||
|
sendText(session, WSRes.error("未登录或登录已过期,连接将关闭"));
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送信息方法
|
||||||
|
private void sendText(Session session, String text) {
|
||||||
|
try {
|
||||||
|
session.getBasicRemote().sendText(text);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 连接关闭时调用的方法
|
||||||
|
*/
|
||||||
|
@OnClose
|
||||||
|
public void onClose() {
|
||||||
|
if (userId != null) {
|
||||||
|
sessionMap.remove(userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发生错误时调用的方法
|
||||||
|
*/
|
||||||
|
@OnError
|
||||||
|
public void onError(Session session, Throwable error) {
|
||||||
|
error.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
package com.yskj.acdr.master.chat.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import com.yskj.acdr.master.chat.chatenum.ChatState;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.ToString;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 林河
|
||||||
|
* @since 2024-09-11
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@ToString
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@TableName("acdr_chat_message")
|
||||||
|
@ApiModel(value = "ChatMessage对象", description = "")
|
||||||
|
public class ChatMessage implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ApiModelProperty("消息主键")
|
||||||
|
@TableId(value = "id", type = IdType.ASSIGN_ID)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ApiModelProperty("这个用于储存html格式的数据")
|
||||||
|
@TableField("content")
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
@ApiModelProperty("发送信息用户的id")
|
||||||
|
@TableField(value = "user_id", fill = FieldFill.INSERT)
|
||||||
|
private Long userId;
|
||||||
|
|
||||||
|
@ApiModelProperty("通信用户的id")
|
||||||
|
@TableField("be_user_id")
|
||||||
|
private Long beUserId;
|
||||||
|
|
||||||
|
@ApiModelProperty("创建时间")
|
||||||
|
@TableField(value = "create_time", fill = FieldFill.INSERT)
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
@ApiModelProperty("消息状态,0未读,1已读")
|
||||||
|
@TableField(value = "state")
|
||||||
|
private ChatState state;
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
package com.yskj.acdr.master.chat.entity;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回给前端的消息类
|
||||||
|
*/
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@Data
|
||||||
|
public class WSRes {
|
||||||
|
|
||||||
|
// 默认为成功返回的消息
|
||||||
|
private int code = 1;
|
||||||
|
|
||||||
|
// 错误信息
|
||||||
|
private String message = "";
|
||||||
|
|
||||||
|
// 返回消息体
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
public static String success(String message, String data) {
|
||||||
|
return JSON.toJSONString(new WSRes()
|
||||||
|
.setMessage(message)
|
||||||
|
.setContent(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String success(String message) {
|
||||||
|
return success(message, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> String success(T data) {
|
||||||
|
return success("", JSON.toJSONString(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> String success(String message, T data) {
|
||||||
|
return success(message, JSON.toJSONString(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String error(String errorMsg) {
|
||||||
|
return JSON.toJSONString(new WSRes()
|
||||||
|
.setMessage(errorMsg)
|
||||||
|
.setCode(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String error() {
|
||||||
|
return error("通信失败!");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package com.yskj.acdr.master.chat.mapper;
|
||||||
|
|
||||||
|
import com.yskj.acdr.master.chat.entity.ChatMessage;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Mapper 接口
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 林河
|
||||||
|
* @since 2024-09-11
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface ChatMessageMapper extends BaseMapper<ChatMessage> {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.yskj.acdr.master.chat.mapper.ChatMessageMapper">
|
||||||
|
|
||||||
|
</mapper>
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.yskj.acdr.master.chat.service;
|
||||||
|
|
||||||
|
import com.yskj.acdr.master.chat.entity.ChatMessage;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 服务类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 林河
|
||||||
|
* @since 2024-09-11
|
||||||
|
*/
|
||||||
|
public interface ChatMessageService extends IService<ChatMessage> {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.yskj.acdr.master.chat.service.impl;
|
||||||
|
|
||||||
|
import com.yskj.acdr.master.chat.entity.ChatMessage;
|
||||||
|
import com.yskj.acdr.master.chat.mapper.ChatMessageMapper;
|
||||||
|
import com.yskj.acdr.master.chat.service.ChatMessageService;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 服务实现类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author 林河
|
||||||
|
* @since 2024-09-11
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class ChatMessageServiceImpl extends ServiceImpl<ChatMessageMapper, ChatMessage> implements ChatMessageService {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.yskj.acdr.utils;
|
||||||
|
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class SpringContextHolder implements ApplicationContextAware {
|
||||||
|
|
||||||
|
private static ApplicationContext applicationContext;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationContext(ApplicationContext context) {
|
||||||
|
applicationContext = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T getBean(Class<T> requiredType) {
|
||||||
|
return applicationContext.getBean(requiredType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -14,6 +14,7 @@ server:
|
|||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
max-days: 7
|
max-days: 7
|
||||||
directory: ${path.logs}tomcat\
|
directory: ${path.logs}tomcat\
|
||||||
|
max-http-request-header-size: 8192
|
||||||
|
|
||||||
logging:
|
logging:
|
||||||
charset:
|
charset:
|
||||||
@ -29,7 +30,7 @@ spring:
|
|||||||
date-format: yyyy-MM-dd
|
date-format: yyyy-MM-dd
|
||||||
datasource:
|
datasource:
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://127.0.0.1:3306/acdr?useSSL=FALSE&serverTimezone=Asia/Shanghai&useOldAliasMetadataBehavior=true&rewriteBatchedStatements=true
|
url: jdbc:mysql://127.0.0.1:3306/cwet?useSSL=FALSE&serverTimezone=Asia/Shanghai&useOldAliasMetadataBehavior=true&rewriteBatchedStatements=true
|
||||||
username: root
|
username: root
|
||||||
password: root
|
password: root
|
||||||
# HikariCP连接池
|
# HikariCP连接池
|
||||||
|
@ -14,6 +14,7 @@ server:
|
|||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
max-days: 7
|
max-days: 7
|
||||||
directory: ${path.logs}tomcat\
|
directory: ${path.logs}tomcat\
|
||||||
|
max-http-request-header-size: 8192
|
||||||
|
|
||||||
logging:
|
logging:
|
||||||
charset:
|
charset:
|
||||||
@ -27,7 +28,7 @@ logging:
|
|||||||
spring:
|
spring:
|
||||||
datasource:
|
datasource:
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://127.0.0.1:3306/acdr?useSSL=FALSE&serverTimezone=Asia/Shanghai&useOldAliasMetadataBehavior=true&rewriteBatchedStatements=true
|
url: jdbc:mysql://127.0.0.1:3306/cwet?useSSL=FALSE&serverTimezone=Asia/Shanghai&useOldAliasMetadataBehavior=true&rewriteBatchedStatements=true
|
||||||
username: root
|
username: root
|
||||||
password: root
|
password: root
|
||||||
# HikariCP连接池
|
# HikariCP连接池
|
||||||
|
Loading…
Reference in New Issue
Block a user