Merge remote-tracking branch 'origin/master'

# Conflicts:
#	bwie-modules/bwie-ask/pom.xml
#	bwie-modules/bwie-home/src/main/java/com/bwie/home/controller/HouseController.java
master
Guo YuKun 2024-04-10 17:14:25 +08:00
commit 2470ddb753
36 changed files with 608 additions and 543 deletions

View File

@ -0,0 +1,40 @@
package com.bwie.common.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
*
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("advice")
public class Advice {
@TableId(type = IdType.AUTO)
private Long adviceId; //咨讯
private String adviceTitle; //咨讯标题
private String adviceConment; //咨讯内容
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date adviceTime; //咨讯上传时间
private String adviceCome; //咨讯来源
private Integer adviceStatus; //咨讯状态
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date craeteTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
private Integer isDelete;
}

View File

@ -42,6 +42,7 @@ public class House {
private String serviceIntroduction; //服务介绍
private Integer managerStatus; //房源管理状态
private String source; //数据来源
private Integer houseOldNew; //房型类型 【0-新房 1-二手房 2-出租房】
private Long brokerId; //经纪人id
private Integer isSuccess; //是否交易成功【0-成功 1-失败】
private Integer verify; //是否验真【0-已验真 1-未验真】

View File

@ -8,6 +8,9 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
*/
@Data
@Builder
@AllArgsConstructor

View File

@ -0,0 +1,29 @@
package com.bwie.common.domain.request;
import com.bwie.common.domain.Advice;
import com.bwie.common.domain.House;
import com.bwie.common.domain.User;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class VoIndexList {
private List<House> newHouse;
private List<String> houseImage;
private List<Advice> adviceList;
private List<House> oldHouse;
private List<User> userInfo;
}

View File

@ -18,82 +18,72 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<elasticsearch.version>7.17.0</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.22.110.ALL</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.20</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</dependency>
<!-- 系统公共 依赖 -->
<dependency>
<groupId>com.bwie</groupId>
<artifactId>bwie-common</artifactId>
</dependency>
<dependency>
<groupId>xin.altitude.cms.common</groupId>
<artifactId>ucode-cms-common</artifactId>
<version>1.3.4</version>
</dependency>
<!-- SpringBoot Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.20</version>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<!-- Mysql Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Mybatis 依赖配置 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- Pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -1,6 +1,6 @@
# Tomcat
server:
port: 9003
port: 9004
# Spring
spring:
main:

View File

@ -66,4 +66,21 @@
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -1,14 +0,0 @@
package com.bwie.chat;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class ChatApp {
public static void main(String[] args) {
SpringApplication.run(ChatApp.class);
}
}

View File

@ -0,0 +1,19 @@
package com.bwie.chat;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class ChatApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(ChatApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(ChatApplication.class, args);
}
}

View File

@ -0,0 +1,151 @@
package com.bwie.chat.component;
import com.alibaba.fastjson.JSON;
import com.bwie.chat.config.ThreadPoolExecutorConfig;
import com.bwie.chat.vo.Message;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* websocketstring
*/
@Component
@ServerEndpoint("/socket/{username}")
public class WebSocketServer {
//静态变量,用于记录当前在线连接数,应该把他设计为线程安全
private static AtomicInteger onlineNum=new AtomicInteger();
private final ThreadPoolExecutorConfig thread;
// 存储当前对象
public static final Map<String, Session> sessionMap = new ConcurrentHashMap<>();
public WebSocketServer(ThreadPoolExecutorConfig thread) {
this.thread = thread;
}
public static void addOnlineCount(){
onlineNum.incrementAndGet();
}
public static void subOnlineCount(){
onlineNum.decrementAndGet();
}
public static AtomicInteger getOnlineNum(){
return onlineNum;
}
// 建立连接
/***
* 1.sessionMap
* 2.
*/
@OnOpen
public void onOpen(Session session, @PathParam("username") String username) {
CompletableFuture.supplyAsync(()->{
System.out.println("当前用户名=="+username);
sessionMap.put(username, session);
addOnlineCount();
System.out.println(username+"成功连接,当前人数为"+onlineNum);
// 发送登录人员消息给所有的客户端
sendAllMessage(setUserList());
return "打开连接";
},thread.threadPoolExecutor());
}
//关闭连接
/**
* 1.sessionMap
* 2.
*/
@OnClose
public void onClose(@PathParam("username") String username) {
CompletableFuture.supplyAsync(()->{
sessionMap.remove(username);
subOnlineCount();
System.out.println(username+"断开连接,当前人数为"+onlineNum);
sendAllMessage(setUserList());
return "关闭连接";
},thread.threadPoolExecutor());
}
/**
*
*/
@OnMessage
public void onMessage(String message) {
// 解析消息为java对象
Message msg = JSON.parseObject(message, Message.class);
if(StringUtils.isEmpty(msg.getTo())){
sendAllMessage(JSON.toJSONString(msg));
}else{
Session sessionTo = sessionMap.get(msg.getTo());
sendMessage(message,sessionTo);
}
}
@OnError
public void onError(Session session, Throwable error) {
System.out.println("发生错误");
error.printStackTrace();
}
private String setUserList(){
ArrayList<String> list = new ArrayList<>();
for(String key:sessionMap.keySet()){
list.add(key);
}
Message message = new Message();
message.setUserNames(list);
return JSON.toJSONString(message);
}
// 服务端发送消息给指定客户端
private void sendMessage(String message, Session toSession) {
CompletableFuture.supplyAsync(()->{
try {
synchronized (toSession){
toSession.getBasicRemote().sendText(message);
}
} catch (IOException e) {
e.printStackTrace();
}
return "指定发送";
},thread.threadPoolExecutor());
}
// 服务端发送消息给所有客户端
private void sendAllMessage(String message) {
CompletableFuture.supplyAsync(()->{
for (Session session : sessionMap.values()) {
try {
synchronized (session) {
session.getBasicRemote().sendText(message);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return "系统群发";
},thread.threadPoolExecutor());
}
}

View File

@ -0,0 +1,24 @@
package com.bwie.chat.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 设置允许跨域的路由
registry.addMapping("/**")
// 设置允许跨域请求的域名
.allowedOriginPatterns("*")
// 是否允许证书cookies
.allowCredentials(true)
// 设置允许的方法
.allowedMethods("*")
// 跨域允许时间
.maxAge(3600);
}
}

View File

@ -0,0 +1,40 @@
package com.bwie.chat.config;
import com.bwie.chat.vo.ThreadPoolExecutorProperties;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Log4j2
@Configuration
public class ThreadPoolExecutorConfig {
// @Value("${chat.coreSize}")
// private Integer coreSize;
// @Value("${gmall.coreMax}")
// private Integer coreMax;
private final ThreadPoolExecutorProperties threadPoolExecutorProperties;
public ThreadPoolExecutorConfig(ThreadPoolExecutorProperties threadPoolExecutorProperties) {
this.threadPoolExecutorProperties = threadPoolExecutorProperties;
}
@Bean
public ThreadPoolExecutor threadPoolExecutor(){
// int coreSize = 3 * Runtime.getRuntime().availableProcessors();
// int coreMax = coreSize + 30;
log.info("size:"+threadPoolExecutorProperties.getCoreSize()+"max:"+threadPoolExecutorProperties.getCoreMax());
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(threadPoolExecutorProperties.getCoreSize(), threadPoolExecutorProperties.getCoreMax(), 5, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100));
return threadPoolExecutor;
}
}

View File

@ -4,11 +4,16 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
/**
* 使springboottomcatbeanwarbean
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}

View File

@ -1,39 +0,0 @@
package com.bwie.chat.controller;
import com.bwie.chat.service.ChatServiceImpl;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ChatController {
// @RequestMapping("im")
// public ModelAndView page() {
// return new ModelAndView("ws");
// }
private final ChatServiceImpl chatService;
public ChatController(ChatServiceImpl chatService) {
this.chatService = chatService;
}
/*
* @Description:
* @Method: pushToWeb
* @Param: [message, toUserId]
* @Update:
* @since: 1.0.0
* @Return: org.springframework.http.ResponseEntity<java.lang.String>
*
*/
@RequestMapping("/push")
public ResponseEntity<String> pushToWeb(@RequestParam String message, Long toUserId) throws Exception {
boolean flag = chatService.sendInfo(message, toUserId.toString());
return flag == true ? ResponseEntity.ok("消息推送成功...") :
ResponseEntity.ok("消息推送失败,用户不在线...");
}
}

View File

@ -1,29 +0,0 @@
package com.bwie.chat.entry;
public enum CodeEnum {
// 成功
SERVER_TO(0,"首次连接,推送消息"),
SESSION_ID(1,"连接id"),
MESSAGE(2,"消息"),
ONLINE_USERS(3,"在线用户"),
NOTICE(4,"公告"),
NOT_USERNAME(401,"没有用户名"),
SUCCESS(200,"操作成功");
int code;
String msg;
CodeEnum(int code, String errorMessage) {
this.code = code;
this.msg = errorMessage;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}

View File

@ -1,188 +0,0 @@
//package com.bwie.chat.handle;
//
//import com.bwie.chat.entry.CodeEnum;
//import com.bwie.common.domain.User;
//import com.bwie.common.result.Result;
//import com.mysql.cj.protocol.x.Notice;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.web.socket.*;
//
//import java.io.IOException;
//import java.time.format.DateTimeFormatter;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.stream.Collectors;
//
//@Slf4j
//public class WebScoketHandle implements WebSocketHandler {
// // 存放 sessionId 与 session
// private static Map<String,WebSocketSession> SESSIONS = new ConcurrentHashMap<>();
// // 在线用户列表
// private static List<User> ONLINE_USERS = new ArrayList<>();
// // 消息列表
// private static List <Message> msgList = new ArrayList<>();
// // 公告
// private static Notice notice = new Notice();
//
// /**
// * WebSocket 连接建立后调用的方法,通常用于处理连接建立后的业务逻辑。
// * @param session
// * @throws Exception
// */
// @Override
// public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// log.info("WebSocket 连接已打开:" + session.getId());
// // 获取请求路径 判断是否携带用户名
// String uri = session.getUri().toString();
// // ws://localhost:8080/username=zxwy&id=1
// log.info(uri);
// // 获取id 与 用户名
// String id = uri.substring(uri.lastIndexOf('=')+1);
// uri = uri.substring(0,uri.lastIndexOf('&'));
// String username = uri.substring(uri.lastIndexOf('=')+1);
//
// if ("".equals(username)){
// session.sendMessage(new TextMessage(JsonUtils.toJson(Result.error(CodeEnum.NOT_USERNAME))));
// return;
// }
// User user = new User();
// user.setUsername(username);
// user.setId(Integer.valueOf(id));
//
// // 判断当前用户是否已经连接过
// List<User> onlineUser = ONLINE_USERS.stream()
// .filter(tmp -> tmp.getId()==user.getId())
// .collect(Collectors.toList());
// // 如果存在相同用户已经登录 删除之前登录的session并关闭
// if (onlineUser.size() != 0){
// delSessionById(onlineUser.get(0).getId());
// }
//
// SESSIONS.put(session.getId(),session);
// // 将用户添加到在线列表
// ONLINE_USERS.add(user);
//
// session.getAttributes().put(session.getId(),user);
// session.getAttributes().put("sessionId",session.getId());
//
// // 将连接id推送给前端
// session.sendMessage(new TextMessage(JsonUtils.toJson(Result.set(CodeEnum.SESSION_ID,session.getId(),null))));
// // 推送在线列表
// pushOnlineUser();
// // 推送公告
// pushNotice(session);
// // 首次连接推送所有消息
// session.sendMessage(new TextMessage(JsonUtils.toJson(Result.set(CodeEnum.SERVER_TO,null,msgList))));
// }
//
// /**
// * handleTextMessage: 处理接收到的文本消息。
// * @param session
// * @param message 前端发送的消息
// * @throws Exception
// */
// @Override
// public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
// log.info("收到 WebSocket 消息:" + message.getPayload().toString());
//
// Result result = JsonUtils.parse(message.getPayload().toString(),Result.class);
// userMsg userMsg = JsonUtils.parse(result.getData().toString(), userMsg.class);
// String username = userMsg.getUser().getUsername();
// long id = userMsg.getUser().getId();
// if (username == null || "".equals(username)){
// session.sendMessage(new TextMessage(JsonUtils.toJson(Result.error(CodeEnum.NOT_USERNAME))));
// }
// String mtext = userMsg.getMessageInput();
// // 指令 清空消息
// if (mtext.substring(0,1).equals("$")){
// if (mtext.equals("$clear")&&id==1){
// msgList.removeAll(msgList);
// broadcast(JsonUtils.toJson(Result.set(CodeEnum.SERVER_TO,null,msgList)));
// return;
// }
// // 指令 发送公告
// if (mtext.substring(0,3).equals("$gg")&&id==1){
// notice.setTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")));
// notice.setGg(mtext.substring(3));
// broadcast(JsonUtils.toJson(Result.set(CodeEnum.NOTICE,null,notice)));
// return;
// }
// }
//
//
// // 普通消息
// Message msg = new Message();
// msg.setId(msgList.size());
// msg.setSender(username);
// msg.setTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")));
// msg.setText(mtext);
// // 广播消息给所有连接的客户端
// msgList.add(msg);
// if (msgList.size()==60)
// msgList.remove(0);
// broadcast(JsonUtils.toJson(Result.set(CodeEnum.MESSAGE,session.getId(),msg)));
// }
//
//
//
// @Override
// public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
// log.info("WebSocket 连接错误:" + session.getId() + ", " + exception.getMessage());
// }
//
// @Override
// public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
// log.info("WebSocket 连接已关闭:" + session.getId());
// // 移除session id与websocket连接的映射关系
// User user = (User) session.getAttributes().get(session.getId());
// ONLINE_USERS.remove(user);
// String sessionId = (String) session.getAttributes().get("sessionId");
// if (sessionId != null) {
// SESSIONS.remove(sessionId);
// session.close();
// }
// pushOnlineUser();
// }
//
// @Override
// public boolean supportsPartialMessages() {
// return false;
// }
//
// private void broadcast(String message) throws IOException {
// Set<Map.Entry<String, WebSocketSession>> entries = SESSIONS.entrySet();
// for (Map.Entry<String, WebSocketSession> sessions : entries) {
// if(sessions.getValue().isOpen()){
// sessions.getValue().sendMessage(new TextMessage(message));
// }
// }
// }
//
// // 推送在线列表
// private void pushOnlineUser() throws Exception{
//
// broadcast(JsonUtils.toJson(Result.set(CodeEnum.ONLINE_USERS,null,ONLINE_USERS)));
// }
// // 推送公告
// private void pushNotice(WebSocketSession session) throws Exception{
// session.sendMessage(new TextMessage(JsonUtils.toJson
// (Result.set(CodeEnum.NOTICE,null,notice))));
// }
// private void delSessionById(long id) throws Exception{
// Set<Map.Entry<String, WebSocketSession>> entries = SESSIONS.entrySet();
// for (Map.Entry<String, WebSocketSession> sessions : entries) {
// User user = (User)sessions.getValue().getAttributes().get(sessions.getValue().getId());
// if (user.getId()==id){
// String sessionId = (String) sessions.getValue().getAttributes().get("sessionId");
// if (sessionId != null) {
// SESSIONS.remove(sessionId);
// sessions.getValue().close();
// }
// }
// }
// }
//
//}

View File

@ -1,4 +0,0 @@
package com.bwie.chat.mapper;
public interface ChatMapper {
}

View File

@ -1,6 +0,0 @@
package com.bwie.chat.service;
public interface ChatService {
// public boolean sendInfo(String message, String toUserId);
}

View File

@ -1,170 +0,0 @@
package com.bwie.chat.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @Class: ChatServiceImpl
* @Description:
*/
//@ServerEndpoint("/ws/{userId}")
@Component
public class ChatServiceImpl{
//日志
static Log log = LogFactory.getLog(ChatServiceImpl.class);
//在线数量
private static final AtomicInteger onlineCount = new AtomicInteger(0);
//处理客户端连接socket
private static Map<String, ChatServiceImpl> webSocketMap = new
ConcurrentHashMap<>();
//会话信息
private Session session;
//用户信息
private String userId = "";
/*
* @Description: WebSokcet
* @Method: onOPen
* @Param: [userId, session]
* @Update:
* @since: 1.0.0
* @Return: void
*
*/
@OnOpen
public void onOPen(@PathParam("userId") String userId, Session session) {
//处理session和用户信息
this.session = session;
this.userId = userId;
if (webSocketMap.containsKey(userId)) {
webSocketMap.remove(userId);
webSocketMap.put(userId, this);
} else {
webSocketMap.put(userId, this);
//增加在线人数
addOnlineCount();
}
try {
//处理连接成功消息的发送
sendMessage("Server>>>>远程WebSoket连接成功");
log.info("用户" + userId + "成功连接,当前的在线人数为" +
getOnlineCount());
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* @Description:
* @Method: onClose
* @Param: []
* @Update:
* @since: 1.0.0
* @Return: void
*
*/
@OnClose
public void onClose() {
if (webSocketMap.containsKey(userId)) {
webSocketMap.remove(userId);
subOnlineCount();
}
log.info("用户退出....");
}
public static void subOnlineCount() {
ChatServiceImpl.onlineCount.decrementAndGet();
}
/*
* @Description:
* @Method: onMessage
* @Param: [message, session]
* @Update:
* @since: 1.0.0
* @Return: void
*
*/
@OnMessage
public void onMessage(String message, Session session) {
if (StringUtils.isNotEmpty(message)) {
try {
//解析消息
JSONObject jsonObject = JSON.parseObject(message);
String toUserId = jsonObject.getString("toUserId");
String msg = jsonObject.getString("msg");
if (StringUtils.isNotEmpty(toUserId)&&webSocketMap.containsKey(toUserId)) {
webSocketMap.get(toUserId).sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
* @Description:
* @Method: sendMessage
* @Param: [s]
* @Update:
* @since: 1.0.0
* @Return: void
*
*/
public void sendMessage(String s) throws IOException {
this.session.getBasicRemote().sendText(s);
}
/*
* @Description: 线
* @Method: getOnlineCount
* @Param: []
* @Update:
* @since: 1.0.0
* @Return: java.util.concurrent.atomic.AtomicInteger
*
*/
public static AtomicInteger getOnlineCount() {
return onlineCount;
}
/*
* @Description: 线
* @Method: addOnlineCount
* @Param: []
* @Update:
* @since: 1.0.0
* @Return: void
*
*/
public static void addOnlineCount() {
ChatServiceImpl.onlineCount.incrementAndGet();
}
/*
* @Description:
* @Method: sendInfo
* @Param: [message, userId]
* @Update:
* @since: 1.0.0
* @Return: void
*
*/
public static boolean sendInfo(String message, String userId) throws IOException {
boolean flag=true;
if (StringUtils.isNotEmpty(userId) && webSocketMap.containsKey(userId))
{
webSocketMap.get(userId).sendMessage(message);
} else {
log.error("用户" + userId + "不在线");
flag=false;
}
return flag;
}
}

View File

@ -0,0 +1,20 @@
package com.bwie.chat.vo;
import lombok.Data;
import java.util.List;
@Data
public class Message {
// 时间
private String time;
// 接收方
private String to;
// 发送方
private String from;
// 消息
private String msg;
// 登录用户名
private List<String> userNames;
}

View File

@ -0,0 +1,14 @@
package com.bwie.chat.vo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "chat")
@Data
public class ThreadPoolExecutorProperties {
private Integer coreSize;
private Integer coreMax;
}

View File

@ -0,0 +1,33 @@
# Tomcat
server:
port: 9003
# Spring
spring:
main:
allow-circular-references: true
allow-bean-definition-overriding: true
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
application:
# 应用名称
name: bwie-chat
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 124.221.177.197:8848
config:
# 配置中心地址
server-addr: 124.221.177.197:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
chat:
coreSize: 21
coreMax: 51

View File

@ -53,6 +53,13 @@
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
<!-- xxl-job依赖 -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.1</version>
</dependency>
<!--爬虫jsoup-->
<dependency>
<groupId>org.jsoup</groupId>

View File

@ -1,8 +1,8 @@
package com.bwie.home.controller;
import com.bwie.common.domain.House;
import com.bwie.common.domain.Order;
import com.bwie.common.domain.request.HouseEsRequest;
import com.bwie.common.domain.request.VoIndexList;
import com.bwie.common.result.Result;
import com.bwie.home.job.Reptile;
import com.bwie.home.service.HomeListService;
@ -33,11 +33,7 @@ public class HouseController {
);
}
//添加订单表
@PostMapping("/wayOrdersPayment")
public Result wayOrdersPayment(@RequestBody Order order){
return homeListService.wayOrdersPayment(order);
}
@GetMapping("/shouall")
public Result<List<House>> shouall(){
return homeListService.shouall();
@ -49,18 +45,10 @@ public class HouseController {
return Result.success();
}
@PostMapping("/addTwoHouse")
public Result addTwoHouse(@RequestBody House house){
return homeListService.addTwoHouse(house);
@GetMapping("/index")
public Result<VoIndexList> getIndexList(){
return Result.success(
houseService.getIndexList()
);
}
@GetMapping("/chaId")
public Result<House> chaId(@RequestParam Integer houseId){
return homeListService.chaId(houseId);
}
}

View File

@ -57,7 +57,6 @@ public class ReptileJob {
reptile.reptile(bkUrl);
redisCache.redisTemplate.opsForList().rightPush(url, bkUrl);
} catch (Exception e) {
throw new RuntimeException(e);
}
});

View File

@ -0,0 +1,7 @@
package com.bwie.home.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bwie.common.domain.Advice;
public interface AdviceMapper extends BaseMapper<Advice> {
}

View File

@ -0,0 +1,7 @@
package com.bwie.home.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bwie.common.domain.User;
public interface UserMapper extends BaseMapper<User> {
}

View File

@ -0,0 +1,7 @@
package com.bwie.home.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bwie.common.domain.Advice;
public interface AdviceService extends IService<Advice> {
}

View File

@ -3,6 +3,7 @@ package com.bwie.home.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bwie.common.domain.House;
import com.bwie.common.domain.request.HouseEsRequest;
import com.bwie.common.domain.request.VoIndexList;
import java.util.List;
@ -14,4 +15,10 @@ public interface HouseService extends IService<House> {
* @return
*/
List<HouseEsRequest> getHouseEsList();
/**
*
* @return
*/
VoIndexList getIndexList();
}

View File

@ -0,0 +1,7 @@
package com.bwie.home.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bwie.common.domain.User;
public interface UserService extends IService<User> {
}

View File

@ -0,0 +1,13 @@
package com.bwie.home.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bwie.common.domain.Advice;
import com.bwie.home.mapper.AdviceMapper;
import com.bwie.home.service.AdviceService;
import org.springframework.stereotype.Service;
@Service
public class AdviceServiceImpl extends ServiceImpl<AdviceMapper, Advice>
implements AdviceService {
}

View File

@ -2,20 +2,19 @@ package com.bwie.home.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bwie.common.domain.DictionaryType;
import com.bwie.common.domain.House;
import com.bwie.common.domain.HouseImages;
import com.bwie.common.domain.HouseType;
import com.bwie.common.domain.*;
import com.bwie.common.domain.request.HouseEsRequest;
import com.bwie.common.domain.request.VoIndexList;
import com.bwie.home.mapper.HouseMapper;
import com.bwie.home.service.DictionaryTypeService;
import com.bwie.home.service.HouseImagesService;
import com.bwie.home.service.HouseService;
import com.bwie.home.service.HouseTypeService;
import com.bwie.home.service.*;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;
@Service
@ -25,13 +24,22 @@ public class HouseServiceImpl extends ServiceImpl<HouseMapper, House>
private final HouseTypeService houseTypeService;
private final DictionaryTypeService dictionaryTypeService;
private final HouseImagesService houseImagesService;
private final UserService userService;
private final AdviceService adviceService;
private final Executor executor;
public HouseServiceImpl(HouseTypeService houseTypeService,
DictionaryTypeService dictionaryTypeService,
HouseImagesService houseImagesService) {
HouseImagesService houseImagesService,
UserService userService,
AdviceService adviceService, Executor executor) {
this.houseTypeService = houseTypeService;
this.dictionaryTypeService = dictionaryTypeService;
this.houseImagesService = houseImagesService;
this.userService = userService;
this.adviceService = adviceService;
this.executor = executor;
}
@Override
@ -56,4 +64,63 @@ public class HouseServiceImpl extends ServiceImpl<HouseMapper, House>
return esRequestList;
}
@Override
public VoIndexList getIndexList() {
CountDownLatch countDownLatch = new CountDownLatch(5);
VoIndexList voIndexList = new VoIndexList();
//横幅信息
CompletableFuture<List<HouseImages>> f1 = CompletableFuture.supplyAsync(() -> {
List<HouseImages> list = houseImagesService.list(new LambdaQueryWrapper<HouseImages>().eq(HouseImages::getHouseId, 0));
countDownLatch.countDown();
return list;
}, executor);
// 经纪人信息
CompletableFuture<List<User>> f2 = CompletableFuture.supplyAsync(() -> {
List<User> list = userService.list();
countDownLatch.countDown();
return list;
}, executor);
//咨询
CompletableFuture<List<Advice>> f3 = CompletableFuture.supplyAsync(() -> {
List<Advice> list = adviceService.list();
countDownLatch.countDown();
return list;
}, executor);
//新房
CompletableFuture<List<House>> f4 = CompletableFuture.supplyAsync(() -> {
List<House> list = this.list(new LambdaQueryWrapper<House>().last("LIMIT" + 5));
countDownLatch.countDown();
return list;
}, executor);
//二手房
CompletableFuture<List<House>> f5 = CompletableFuture.supplyAsync(() -> {
List<House> list = this.list(new LambdaQueryWrapper<House>().last("LIMIT" + 5));
countDownLatch.countDown();
return list;
}, executor);
try {
countDownLatch.await();
List<HouseImages> houseImages = f1.get();
List<String> imageList = houseImages.stream().map(HouseImages::getImageAddr).collect(Collectors.toList());
voIndexList.setHouseImage(imageList);//横幅信息
voIndexList.setUserInfo(f2.get());
voIndexList.setAdviceList(f3.get());
// voIndexList.setNewHouse(f4.get());
// voIndexList.setOldHouse(f5.get());
} catch (Exception e) {
throw new RuntimeException(e);
}
return voIndexList;
}
}

View File

@ -0,0 +1,12 @@
package com.bwie.home.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bwie.common.domain.User;
import com.bwie.home.mapper.UserMapper;
import com.bwie.home.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
implements UserService {
}

View File

@ -19,6 +19,7 @@ public class UserController {
@Autowired
private UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@ -29,6 +30,7 @@ public class UserController {
return Result.success(
userService.login(loginRequest)
);
}

View File

@ -16,10 +16,14 @@
<module>bwie-Alipay</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>

View File

@ -25,7 +25,9 @@
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>