前言
✨ **博主介绍:**一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮你把毕设做成作品集。👍👍
👇精彩专栏 推荐订阅👇
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️
系统实现
前台普通用户功能实现
用户注册模块
普通用户在访问系统首页后,可选择点击"注册"按钮,进入相应的注册页面。在该页面中,用户需完成所有注册信息必填项,点击页面下方的"注册"按钮。系统在接收到表单数据并完成验证后,若信息无误,将提示注册成功,并在自动跳转至系统的登录界面,以便用户立即进行登录操作。注册界面如下图所示。

注册界面
用户登录模块
用户在登录界面点击"登录"按钮后,需输入用户名、密码以及验证码以完成身份验证操作。系统在前端会自动对所输入信息进行有效性校验,同时检查该用户是否已通过后台审核流程。若审核通过且信息无误,则系统将允许用户成功登录并跳转至相应的功能界面;反之页面会弹出相应的提示信息,提醒用户重新输入或检查相关信息的正确性。登录界面如下图所示。

登录界面
前台首页模块
作为用户进入系统的第一入口,首页展示轮播图、热门会议室、基于协同过滤算法的个性化推荐。界面布局清晰,突出高频功能,便于用户快速发现和预订会议室。前台首页界面如下图所示。

首页界面
新闻资讯模块
新闻资讯界面展示各类新闻动态,支持按资讯分类筛选,每条新闻可点击查看详情。提供搜索与分页功能,满足用户获取组织内外信息的需求。新闻资讯界面如下图所示。

新闻资讯界面
在线聊天模块
在线聊天界面提供用户之间的实时通信功能,支持添加好友、创建或加入群组,实现点对点或群组文字聊天。界面包含联系人列表、聊天窗口和消息记录,适用于会议协作前的沟通协调,是团队用户高频使用的社交功能。在线聊天界面如下图所示。

在线聊天界面
会议室信息模块
会议室信息界面展示所有会议室,支持按类型、位置、容纳人数等条件筛选。点击任一会议室可进入详情页,查看设备清单、使用规则、用户评论,并执行预约、点赞、收藏等核心操作,是用户使用最频繁的功能页面之一。会议室信息界面如下图所示。

会议室信息界面

会议室预约界面
智能客服模块
智能客服界面独立于好友聊天,是一个固定客服入口,通常为悬浮按钮,用户点击后可与系统内置的智能客服对话。该客服基于预设知识库或简单NLP规则,自动回答常见问题,不涉及用户间通信,专注于系统服务引导。智能客服界面如下图所示。

智能客服界面
个人中心模块
个人中心界面:整合用户所有个人事务,包括预约记录、取消/修改申请进度、收藏与点赞列表、账户设置、好友管理等。采用侧边栏导航,结构清晰,支持一键操作,是用户管理自身行为的核心枢纽。界面如下图所示。

个人中心界面
后台管理员功能实现
数据分析模块
数据分析界面集中展示关键指标,并嵌入可视化图表,辅以操作日志快捷入口,帮助管理员快速掌握系统运行全貌。数据分析界面如下图所示。

数据分析界面
角色管理模块
角色管理界面提供角色列表及权限分配面板,支持新增、编辑角色,并通过复选框勾选菜单与操作权限,实现权限控制,保障系统安全。角色管理界面如下图所示。

角色管理界面
预约时段管理模块
预约时段管理界面设置每个会议室的每日可用时间段,支持批量配置与节假日关闭策略,确保预约规则统一且可维护。预约时段管理界面如下图所示。

预约时段管理界面
会议室信息管理模块
会议室信息管理界面提供会议室增删改查功能,支持上传图片、填写设备清单与使用规则,表单字段完整,是管理员维护资源数据的主要操作界面。会议室信息管理界面如下图所示。

会议室信息管理界面
预约信息管理模块
预约信息管理界面列出所有待审核的新预约申请,显示申请人、会议室、时间、事由等信息,支持"通过"或"拒绝"操作并填写审核意见,是管理员日常高频处理任务之一。预约信息管理界面如下图所示。

预约信息管理界面
取消信息管理模块
取消信息管理界面集中展示用户提交的取消请求,管理员可查看原预约详情及取消原因,审核通过后自动释放会议室资源,防止无效占用。取消信息管理界面如下图所示。

取消信息管理界面
修改信息管理模块
修改信息管理界面呈现用户发起的预约变更申请,管理员需评估新时段是否冲突,并决定是否批准,确保调度合理性。修改信息管理界面如下图所示。

修改信息管理界面
新闻管理模块
新闻管理界面包含"资讯分类"和"新闻内容"两个子模块,支持富文本编辑、封面上传、分类绑定与发布状态控制,便于管理员高效运营资讯内容。新闻管理界面如下图所示。

新闻管理界面
数据库参考
sql
CREATE TABLE `user_chat_group` (
`user_chat_group_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`group_id` int(255) DEFAULT NULL COMMENT '群聊ID',
`group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '群聊名称',
`user_id` int(11) DEFAULT NULL COMMENT '用户ID',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`user_chat_group_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT COMMENT='聊天用户群聊';
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article` (
`article_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章id',
`title` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标题',
`type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '文章分类',
`hits` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '点击数',
`praise_len` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '来源',
`url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '来源地址',
`tag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签',
`content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '正文',
`img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '封面图',
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '文章描述',
PRIMARY KEY (`article_id`,`title`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章';
DROP TABLE IF EXISTS `access_token`;
CREATE TABLE `access_token` (
`token_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '临时访问牌ID',
`token` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '临时访问牌',
`info` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '信息',
`maxage` int(2) NOT NULL DEFAULT '2' COMMENT '最大寿命:默认2小时',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`user_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '用户编号',
PRIMARY KEY (`token_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='登陆访问时长';
DROP TABLE IF EXISTS `code_token`;
CREATE TABLE `code_token` (
`code_token_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '验证码ID',
`token` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '令牌',
`code` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '验证码',
`expire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '失效时间',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`code_token_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT COMMENT='验证码';
DROP TABLE IF EXISTS `collect`;
CREATE TABLE `collect` (
`collect_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '收藏ID',
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '收藏人ID',
`source_table` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源表',
`source_field` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源字段',
`source_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '来源ID',
`title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '标题',
`img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '封面',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`collect_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='收藏';
DROP TABLE IF EXISTS `user_chat_friend`;
CREATE TABLE `user_chat_friend` (
`user_chat_friend_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_id` int(11) NOT NULL COMMENT '用户ID',
`friend_user_id` int(11) NOT NULL COMMENT '用户好友ID',
`friend_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '好友名称',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`user_chat_friend_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT COMMENT='聊天用户好友';
DROP TABLE IF EXISTS `user_chat_read`;
CREATE TABLE `user_chat_read` (
`user_chat_read_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'ID',
`user_id` int(11) DEFAULT NULL COMMENT '接收人ID',
`send_user_id` int(11) DEFAULT NULL COMMENT '发送人ID',
`group_id` int(11) DEFAULT NULL COMMENT '群聊ID',
`type` int(11) DEFAULT NULL COMMENT '类型1-点对点消息,2-群聊消息',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '时间',
`message` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '消息',
PRIMARY KEY (`user_chat_read_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT COMMENT='聊天用户消息';
代码参考
java
package com.project.demo.controller;
import com.project.demo.entity.AppointmentPeriod;
import com.project.demo.service.AppointmentPeriodService;
import com.alibaba.fastjson.JSON;
import com.project.demo.controller.base.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.util.StringUtils;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 预约时段:(AppointmentPeriod)表控制层
*
*/
@RestController
@RequestMapping("/appointment_period")
public class AppointmentPeriodController extends BaseController<AppointmentPeriod, AppointmentPeriodService> {
/**
* 预约时段对象
*/
@Autowired
public AppointmentPeriodController(AppointmentPeriodService service) {
setService(service);
}
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Map<String,Object> paramMap = service.readBody(request.getReader());
paramMap.entrySet().removeIf(entry -> {
Object value = entry.getValue();
return value instanceof String && ((String) value).isEmpty();
});
AppointmentPeriod appointment_period = new AppointmentPeriod();
appointment_period.setAppointment_period(paramMap.get("appointment_period")==null?null:String.valueOf(paramMap.get("appointment_period")));
appointment_period.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by"))));
this.addEntity(appointment_period);
System.out.println("预约时段新增成功");
return success(1);
}
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
Map<String,String> queryMap = service.readQuery(request);
Map<String,String> configMap = service.readConfig(request);
Map<String,Object> paramMap = service.readBody(request.getReader());
paramMap.entrySet().removeIf(entry -> {
Object value = entry.getValue();
return value instanceof String && ((String) value).isEmpty();
});
AppointmentPeriod appointment_period = new AppointmentPeriod();
appointment_period.setAppointment_period(paramMap.get("appointment_period")==null?null:String.valueOf(paramMap.get("appointment_period")));
this.setEntity(queryMap,configMap,appointment_period);
System.out.println("预约时段修改成功");
return success(1);
}
}
package com.project.demo.controller;
import com.project.demo.entity.MeetingRoomInformation;
import com.project.demo.service.MeetingRoomInformationService;
import com.alibaba.fastjson.JSON;
import com.project.demo.controller.base.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.util.StringUtils;
import com.project.demo.constant.FindConfig;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 会议室信息:(MeetingRoomInformation)表控制层
*
*/
@RestController
@RequestMapping("/meeting_room_information")
public class MeetingRoomInformationController extends BaseController<MeetingRoomInformation, MeetingRoomInformationService> {
/**
* 会议室信息对象
*/
@Autowired
public MeetingRoomInformationController(MeetingRoomInformationService service) {
setService(service);
}
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Map<String,Object> paramMap = service.readBody(request.getReader());
paramMap.entrySet().removeIf(entry -> {
Object value = entry.getValue();
return value instanceof String && ((String) value).isEmpty();
});
MeetingRoomInformation meeting_room_information = new MeetingRoomInformation();
meeting_room_information.setMeeting_room_name(paramMap.get("meeting_room_name")==null?null:String.valueOf(paramMap.get("meeting_room_name")));
meeting_room_information.setType_of_meeting_room(paramMap.get("type_of_meeting_room")==null?null:String.valueOf(paramMap.get("type_of_meeting_room")));
meeting_room_information.setConference_room_status(paramMap.get("conference_room_status")==null?null:String.valueOf(paramMap.get("conference_room_status")));
meeting_room_information.setLocation_of_conference_room(paramMap.get("location_of_conference_room")==null?null:String.valueOf(paramMap.get("location_of_conference_room")));
meeting_room_information.setAccommodfrom(paramMap.get("accommodfrom")==null?null:String.valueOf(paramMap.get("accommodfrom")));
meeting_room_information.setCover_image(paramMap.get("cover_image")==null?null:String.valueOf(paramMap.get("cover_image")));
meeting_room_information.setUse_rules(paramMap.get("use_rules")==null?null:String.valueOf(paramMap.get("use_rules")));
meeting_room_information.setEquipment_summary(paramMap.get("equipment_summary")==null?null:String.valueOf(paramMap.get("equipment_summary")));
meeting_room_information.setConference_room_introduction(paramMap.get("conference_room_introduction")==null?null:String.valueOf(paramMap.get("conference_room_introduction")));
meeting_room_information.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits"))));
meeting_room_information.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len"))));
meeting_room_information.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len"))));
meeting_room_information.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len"))));
meeting_room_information.setReservation_information_limit_times(paramMap.get("reservation_information_limit_times")==null?null:String.valueOf(paramMap.get("reservation_information_limit_times")));
meeting_room_information.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by"))));
this.addEntity(meeting_room_information);
System.out.println("会议室信息新增成功");
return success(1);
}
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
Map<String,String> queryMap = service.readQuery(request);
Map<String,String> configMap = service.readConfig(request);
Map<String,Object> paramMap = service.readBody(request.getReader());
paramMap.entrySet().removeIf(entry -> {
Object value = entry.getValue();
return value instanceof String && ((String) value).isEmpty();
});
MeetingRoomInformation meeting_room_information = new MeetingRoomInformation();
meeting_room_information.setMeeting_room_name(paramMap.get("meeting_room_name")==null?null:String.valueOf(paramMap.get("meeting_room_name")));
meeting_room_information.setType_of_meeting_room(paramMap.get("type_of_meeting_room")==null?null:String.valueOf(paramMap.get("type_of_meeting_room")));
meeting_room_information.setConference_room_status(paramMap.get("conference_room_status")==null?null:String.valueOf(paramMap.get("conference_room_status")));
meeting_room_information.setLocation_of_conference_room(paramMap.get("location_of_conference_room")==null?null:String.valueOf(paramMap.get("location_of_conference_room")));
meeting_room_information.setAccommodfrom(paramMap.get("accommodfrom")==null?null:String.valueOf(paramMap.get("accommodfrom")));
meeting_room_information.setCover_image(paramMap.get("cover_image")==null?null:String.valueOf(paramMap.get("cover_image")));
meeting_room_information.setUse_rules(paramMap.get("use_rules")==null?null:String.valueOf(paramMap.get("use_rules")));
meeting_room_information.setEquipment_summary(paramMap.get("equipment_summary")==null?null:String.valueOf(paramMap.get("equipment_summary")));
meeting_room_information.setConference_room_introduction(paramMap.get("conference_room_introduction")==null?null:String.valueOf(paramMap.get("conference_room_introduction")));
meeting_room_information.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits"))));
meeting_room_information.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len"))));
meeting_room_information.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len"))));
meeting_room_information.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len"))));
meeting_room_information.setReservation_information_limit_times(paramMap.get("reservation_information_limit_times")==null?null:String.valueOf(paramMap.get("reservation_information_limit_times")));
this.setEntity(queryMap,configMap,meeting_room_information);
System.out.println("会议室信息修改成功");
return success(1);
}
/**
* 协同过滤算法
*/
@RequestMapping("/get_hits_list")
public Map<String, Object> getHits(HttpServletRequest request) {
Map<String,String> paramMap = service.readQuery(request);
if (paramMap.get("user_id")==null||paramMap.get("user_id").equals("")){
return this.getList(request);
}else{
try {
if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){
paramMap.put("examine_state", URLDecoder.decode(paramMap.get("examine_state"), "UTF-8"));
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//查询该用户常点击
String hitsSource = "SELECT COUNT( hits_id ) AS hits_count, source_id FROM hits WHERE source_table = 'meeting_room_information' AND user_id = "+paramMap.get("user_id")+" GROUP BY source_id";
List<Map<String,Object>> hitsSourceList = service.selectMapBaseList(hitsSource);
//判断是否为空,代表当前用户暂无点击数据,那么取其他用户的最常点击
if (hitsSourceList==null || hitsSourceList.size()<=0){
hitsSource = "SELECT COUNT( hits_id ) AS hits_count, source_id FROM hits WHERE source_table = 'meeting_room_information' GROUP BY source_id";
hitsSourceList = service.selectMapBaseList(hitsSource);
}
String table_name = "meeting_room_information";
String table_id = "meeting_room_information_id";
String type_name = "type_of_meeting_room";
//二次处理-如果依旧为空则取添加时间前12条数据
if (hitsSourceList==null || hitsSourceList.size()<=0){
String sql = "SELECT * FROM " + table_name;
if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){
sql = sql + " where examine_state = '"+paramMap.get("examine_state")+"'";
}
sql = sql + " ORDER BY create_time DESC LIMIT 0,12";
List list = service.selectBaseList(sql);
Map<String, Object> map=new HashMap<>();
map.put("list",list);
map.put("count",list.size());
return success(map);
}else {
//对用户点击量进行排序取得最大值
double max = 0.0;
int maxSourceId = 0;
for (Map<String,Object> map:hitsSourceList) {
double hitsCount = Double.parseDouble(String.valueOf(map.get("hits_count")));
if (hitsCount > max){
max = hitsCount;
maxSourceId = Integer.parseInt(String.valueOf(map.get("source_id")));
}
}
//查询该用户点击最大值的种类
String typeSql = "SELECT " + type_name + " FROM " + table_name + " WHERE " + table_id + " = " + maxSourceId;
List<Map<String,Object>> typeList = service.selectMapBaseList(typeSql);
//如果为空则取添加时间前12条数据
if (typeList==null || typeList.size()<=0){
String sql = "SELECT * FROM " + table_name;
if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){
sql = sql + " where examine_state = '"+paramMap.get("examine_state")+"'";
}
sql = sql + " ORDER BY create_time DESC LIMIT 0,12";
List list = service.selectBaseList(sql);
Map<String, Object> map=new HashMap<>();
map.put("list",list);
map.put("count",list.size());
return success(map);
}else {
String typeName = String.valueOf(typeList.get(0).get(type_name));
//查询该种类的数据
String sql = "SELECT * FROM " + table_name + " WHERE " + type_name + " = '"+typeName+"'" ;
if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){
sql = sql + " and examine_state = '"+paramMap.get("examine_state")+"' ORDER BY create_time DESC limit 0,12";
}else {
sql = sql + " ORDER BY create_time DESC limit 0,12";
}
List resultList = service.selectBaseList(sql);
//如果为空则取添加时间前12条数据
if (resultList==null || resultList.size()<=0){
sql = "SELECT * FROM " + table_name;
if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){
sql = sql + " where examine_state = '"+paramMap.get("examine_state")+"'";
}
sql = sql + " ORDER BY create_time DESC LIMIT 0,12";
List list = service.selectBaseList(sql);
Map<String, Object> map=new HashMap<>();
map.put("list",list);
map.put("count",list.size());
return success(map);
}else {
//对结果排序-冒泡排序
for (int i = resultList.size() - 1; i > 0; i--) {
// 是否发生交换
boolean swapped = false;
for (int j = 0; j < i; j++) {
MeetingRoomInformation leftMap = (MeetingRoomInformation) resultList.get(j);
MeetingRoomInformation rightMap = (MeetingRoomInformation) resultList.get(j + 1);
if (leftMap.getHits()<rightMap.getHits()){
MeetingRoomInformation temp = rightMap;
rightMap = leftMap;
leftMap = temp;
swapped = true;
}
}
if (!swapped) {
// 没有发生交换,则说明数组已有序,停止冒泡
break;
}
}
//判断是否有12条-如果不足则计算其他类型和用户当前点击最多的余弦相似度,依次往下取得数据
if (resultList.size()<12) {
String typeCosSql = "SELECT " + type_name + " FROM " + table_name + " WHERE " + type_name + " <> '" + typeName + "' GROUP BY " + type_name;
List<Map<String, Object>> typeCosList = service.selectMapBaseList(typeCosSql);
if (typeCosList != null && typeCosList.size() > 0) {
for (Map<String, Object> typeCos : typeCosList) {
typeCos.put("cosSim", calculateCosineSimilarity(typeName, String.valueOf(typeCos.get(type_name))));
}
//冒泡根据相似度排序
for (int i = typeCosList.size() - 1; i > 0; i--) {
// 是否发生交换
boolean swapped = false;
for (int j = 0; j < i; j++) {
Map<String, Object> leftMap = typeCosList.get(j);
Map<String, Object> rightMap = typeCosList.get(j + 1);
if (Double.parseDouble(String.valueOf(leftMap.get("cosSim" ))) < Double.parseDouble(String.valueOf(rightMap.get("cosSim" )))) {
Map<String, Object> temp = rightMap;
rightMap = leftMap;
leftMap = temp;
swapped = true;
}
}
if (!swapped) {
// 没有发生交换,则说明数组已有序,停止冒泡
break;
}
}
//逐条加入数据
for (Map<String, Object> typeCos : typeCosList) {
sql = "SELECT * FROM " + table_name + " WHERE " + type_name + " = '" + String.valueOf(typeCos.get(type_name)) + "'";
if (paramMap.get("examine_state")!=null && !paramMap.get("examine_state").equals("")){
sql = sql + " and examine_state = '"+paramMap.get("examine_state")+"'";
}
sql = sql + " ORDER BY create_time DESC LIMIT 0," + (12 - resultList.size());
List list = service.selectBaseList(sql);
if (list != null && list.size() > 0) {
resultList.addAll(list);
}
if (resultList.size() >= 12) {
break;
}
}
}
}
Map<String, Object> map=new HashMap<>();
map.put("list",resultList);
map.put("count",resultList.size());
return success(map);
}
}
}
}
}
/**
* 计算余弦相似度
*/
private double calculateCosineSimilarity(String text1, String text2) {
// 将文本分词并转换为向量表示
Map<Character, Integer> wordCount1 = getWordCount(text1);
Map<Character, Integer> wordCount2 = getWordCount(text2);
double dotProduct = 0.0;
double magnitude1 = 0.0;
double magnitude2 = 0.0;
for (Character word : wordCount1.keySet()) {
int count1 = wordCount1.get(word);
int count2 = wordCount2.getOrDefault(word, 0);
dotProduct += count1 * count2;
magnitude1 += Math.pow(count1, 2);
}
for (Integer count : wordCount2.values()) {
magnitude2 += Math.pow(count, 2);
}
magnitude1 = Math.sqrt(magnitude1);
magnitude2 = Math.sqrt(magnitude2);
if (magnitude1 == 0.0 || magnitude2 == 0.0) {
return 0.0;
}
return dotProduct / (magnitude1 * magnitude2);
}
private static Map<Character, Integer> getWordCount(String text) {
Map<Character, Integer> wordCount = new HashMap<>();
for (char c : text.toCharArray()) {
wordCount.put(c, wordCount.getOrDefault(c, 0) + 1);
}
return wordCount;
}
}
前端: 基于Vue.js框架构建用户界面,使用HTML5、CSS3和JavaScript实现页面结构与交互逻辑,通过Vue Router管理路由,Vuex或Pinia维护全局状态。采用Element UI或Vant组件库快速搭建界面,Axios封装HTTP请求实现与后端的数据通信。
**后端:**基于springboot框架搭建,遵循Controller-Service-Mapper三层架构。Controller层接收前端请求并校验参数,Service层处理核心业务逻辑,Mapper层通过MyBatis或MyBatis-Plus完成数据库操作。使用Spring Security或Shiro结合JWT实现用户认证与权限控制。
**数据库:**采用MySQL存储持久化数据,Redis缓存热点信息以提升系统性能。
开发工具: 使用IDEA开发后端,VSCode或HBuilderX开发前端,Git进行版本管理,Maven和npm分别管理前后端依赖。
源码获取
私信联系我即可~
大家点赞、收藏、关注、评论啦
👇精彩专栏 推荐订阅👇
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️