前言

📌博主介绍:一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮你把毕设做成作品集。👍👍

毕业设计选题越来越重要,也越来越让同学感到焦虑。(切记先收藏起来)

很多同学不知道该如何确定题目,也不清楚导师真正关注的是什么,导致选题阶段浪费了很多时间。(选题指导)

其实,选题阶段最重要的不是一开始就想一个 “完美题目”,而是先把自己能做什么、感兴趣什么、导师可能认可什么理清楚。很多同学之所以选题困难,往往是因为没有把研究方向、题目来源、实践条件和论文写作要求结合起来考虑。(选题避坑)

如果选题没有做好,后面的开题、调研、实验、写作都会受到影响。因此,建议大家在正式确定题目之前,先多查资料、多和导师沟通,尽量选择一个既有研究价值、又有数据和案例支撑的题目。(有疑问可随时咨询,免费解答)

也可以参考一些优秀的毕业设计题目,帮助自己打开思路,避免走弯路(收藏,收藏,收藏~)

文章最下面,获取源码和数据库

Java选题参考

  • 基于springboot的新农村自建房改造管理系统
  • 在线教育平台系统
  • 健身房管理系统
  • 糖尿病患者智能饮食推荐系统
  • 在线商品库存管理系统
  • 基于springboot的自习室预约系统
  • 基于springboot的在线考试系统设计与实现
  • 校园失物招领与寻物启事智能匹配系统
  • 宠物领养与回访管理系统
  • 基于springboot的海绵课堂管理系统设计与实现
  • 医院患者随访管理系统
  • 个人舌像诊断系统
  • 基于springboot的妇幼保健院专科预约挂号
  • 羽毛球比赛管理系统
  • 小区管理系统
  • 社区养老志愿者管理系统
  • 共享单车运行租赁管理系统
  • 个性化学习助手
  • 大学生跳蚤平台
  • 水质监测系统
  • 天猫智能家电销售数据分析可视化系统
  • 校园二手交易
  • 高校宿舍维修平台
  • 餐厅订单管理系统
  • 基于springboot的旅游智能推荐系统
  • 农村智慧社区系统
  • 基于springboot的游戏账号交易系统
  • 基于springboot的租迹房屋租赁平台
  • 运动方案智能生成与管理系统
  • 网络学习资源管理系统
  • 基于springboot的高校订餐系统
  • 线上零食专卖店系统
  • 基于springboot的学生学业预警与帮扶系统设计与实现
  • 班团一体化管理系统
  • OpenCV的课堂考勤系统
  • 失踪儿童在线求助系统
  • 校园志愿者管理系统
  • 基于springboot的教室设备故障快速报修系统
  • 江苏果尚食品特色农产品销售平台
  • 基于springboot的校园闲置商品智能推荐系统
  • 电商知产维权速办平台
  • 基于springboot的校园招聘系统
  • 基于ssm的社区超市管理系统
  • 面向高校的教学资源访问日志清洗与热门课程推荐系统
  • 汽车报废管理系统
  • 智慧校园评测系统
  • 基于ssm的高校心理援助系统
  • 基于ssm的小区物业居民服务信息系统
  • 社区共享工具平台
  • 突发事件下粮食应急配送中心智能选址系统
  • 智慧文旅个性化推荐与客流调控平台
  • 游戏用户行为分析与个性化游戏推荐系统
  • 商品采购系统
  • 个人财务管理
  • 校园交易平台
  • 酒店管理系统
  • 滑雪场管理系统
  • 图书馆座位预约系统
  • 校园领养网站
  • 校园自习室预约系统
  • 物联网智能硬件电商平台
  • 基于ssm的高校大学生入伍管理系统
  • 高考志愿辅助系统
  • 健身房管理系统
  • 高校智慧学工服务平台
  • 校园社团活动管理系统
  • 抗日宣传网站与制作
  • 企业员工管理系统
  • 企业专利信息管理系统
  • 宠物商店管理系统
  • 进出入管理系统
  • 校园智能膳食管理系统
  • 外卖订餐系统
  • 流浪动物管理系统
  • 公交线路管理系统
  • 健身俱乐部系统
  • 社区公益活动管理系统
  • 智慧养老居家上门服务管理系统
  • 基于ssm的带报修优先级的学生宿舍管理系统
  • 跨境电商产品智能推荐系统
  • 汽车销售管理平台
  • 小微企业商务合同管理系统
  • 基于ssm的个人收支记账系统设计与实现
  • 校园图书借阅管理系统
  • 小学生托管服务系统
  • 健身房管理系统
  • 基于ssm的家具销售平台
  • 部队体能管理系统
  • 贫困山区扶贫救助系统
  • 房屋租赁系统
  • 新疆旅游景点推荐系统
  • 轻量版在线课程学习与刷题平台
  • 烹饪技能学习系统
  • 基于ssm的校园失物招领与寻物启事平台设计与实现
  • 基于ssm的医疗影像归档与浏览系统
  • 企业员工每日办公头条系统
  • 基于ssm的云游安源红个人网站
  • 柒柒酒肆点餐小程序
  • 线上服装销售平台
  • 智慧医疗信息管理平台
  • 基于ssm的加密型个人记账系统
  • 开封木版年画线上平台
  • 个人学习计划管理系统
  • 校园活动报名与签到管理系统
     

数据库参考

CREATE TABLE `upload` (
  `upload_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '上传ID',
  `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件名',
  `path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '访问路径',
  `file` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件路径',
  `display` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '显示顺序',
  `father_id` int(11) DEFAULT '0' COMMENT '父级ID',
  `dir` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件夹',
  `type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件类型',
  PRIMARY KEY (`upload_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文件上传';
insert into `upload` values ('1','movie.mp4','/upload/movie.mp4','',null,'0',null,'video');
DROP TABLE IF EXISTS `logistics_delivery`;
CREATE TABLE `logistics_delivery` (
  `logistics_delivery_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '物流配送ID',
  `order_number` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '订单号',
  `product_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '商品名称',
  `purchase_quantity` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '购买数量',
  `total_transaction_amount` double(10,2) DEFAULT '0.00' COMMENT '交易总额',
  `the_date_of_issuance` date DEFAULT NULL COMMENT '发货日期',
  `delivery_number` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '配送订单',
  `ordinary_users` int(11) DEFAULT '0' COMMENT '普通用户',
  `shipping_address` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '收货地址',
  `delivery_status` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '配送状态',
  `signing_status` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '签收状态',
  `recommend` int(11) NOT NULL DEFAULT '0' COMMENT '智能推荐',
  `contact_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人名字',
  `merchant_id` int(11) DEFAULT NULL COMMENT '商家id',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `courier_type` int(11) NOT NULL DEFAULT '1' COMMENT '配送方式(1:商家配送,2:其他配送)',
  `courier_id` int(11) DEFAULT NULL COMMENT '配送员ID',
  `courier_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '配送员名字',
  `courier_detail` longtext COLLATE utf8mb4_general_ci COMMENT '配送详情',
  PRIMARY KEY (`logistics_delivery_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='物流配送';
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods` (
  `goods_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '产品ID',
  `title` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标题',
  `img` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '封面图:用于显示于产品列表页',
  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述',
  `price_ago` double(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '原价',
  `price` double(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '卖价',
  `sales` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '销量',
  `inventory` int(11) NOT NULL DEFAULT '0' COMMENT '商品库存',
  `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '商品分类',
  `hits` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '点击量',
  `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '正文',
  `img_1` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图1',
  `img_2` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图2',
  `img_3` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图3',
  `img_4` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图4',
  `img_5` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图5',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `customize_field` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '自定义字段',
  `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',
  `user_id` int(11) unsigned DEFAULT '0' COMMENT '添加人',
  `integral` int(11) DEFAULT '0' COMMENT '积分',
  `list_status` smallint(1) DEFAULT '1' COMMENT '上架状态(0:下架;1上架)',
  PRIMARY KEY (`goods_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商品信息';
CREATE TABLE `cart` (
  `cart_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '购物车ID',
  `title` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '标题',
  `img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '图片',
  `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `state` int(1) unsigned NOT NULL DEFAULT '0' COMMENT '状态:使用中,已失效',
  `price` double(8,2) NOT NULL DEFAULT '0.00' COMMENT '单价',
  `price_ago` double(8,2) NOT NULL DEFAULT '0.00' COMMENT '原价',
  `price_count` double(10,2) NOT NULL DEFAULT '0.00' COMMENT '总价',
  `num` int(8) unsigned NOT NULL DEFAULT '1' COMMENT '数量',
  `goods_id` mediumint(8) unsigned NOT NULL COMMENT '商品id',
  `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '未分类' COMMENT '商品分类',
  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述',
  `norms` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '规格',
  PRIMARY KEY (`cart_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='购物车';
DROP TABLE IF EXISTS `message_inform`;
CREATE TABLE `message_inform` (
  `message_inform_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '通知ID',
  `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '通知人ID',
  `title` varchar(255) DEFAULT NULL COMMENT '标题',
  `state` varchar(255) DEFAULT NULL COMMENT '状态',
  `type` varchar(64) DEFAULT NULL COMMENT '分类',
  `content` varchar(255) 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 (`message_inform_id`) USING BTREE,
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='通知记录';
DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
  `order_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  `order_number` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '订单号',
  `goods_id` mediumint(8) unsigned NOT NULL 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 '商品图片',
  `price` double(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '价格',
  `price_ago` double(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '原价',
  `num` int(8) NOT NULL DEFAULT '1' COMMENT '数量',
  `price_count` double(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '总价',
  `norms` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '规格',
  `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '未分类' COMMENT '商品分类',
  `contact_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人姓名',
  `contact_email` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人邮箱',
  `contact_phone` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人手机',
  `contact_address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '收件地址',
  `postal_code` varchar(9) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮政编码',
  `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '买家ID',
  `merchant_id` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '商家ID',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述',
  `state` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '待付款' COMMENT '订单状态:待付款,待发货,待签收,已签收,待退款,已退款,已拒绝,已完成',
  `remark` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '订单备注',
  `delivery_state` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '未配送' COMMENT '发货状态:未配送,已配送',
  `vip_discount` double(10,2) DEFAULT '0.00' COMMENT '折扣',
  `integral` int(11) DEFAULT '0' COMMENT '积分',
  `buy_type` tinyint(2) DEFAULT '1' COMMENT '1-全额购买,2-积分兑换,3-钱包购买',
  `desc` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '其他原因' COMMENT '取消订单原因',
  PRIMARY KEY (`order_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单';
DROP TABLE IF EXISTS `user_group`;
CREATE TABLE `user_group` (
  `group_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户组ID',
  `display` smallint(4) unsigned NOT NULL DEFAULT '100' COMMENT '显示顺序',
  `name` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '名称',
  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '描述',
  `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',
  `register` smallint(1) unsigned 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 '更新时间',
  PRIMARY KEY (`group_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci 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 `notice`;
CREATE TABLE `notice` (
  `notice_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '公告ID',
  `title` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '标题',
  `content` longtext CHARACTER SET utf8 COLLATE utf8_general_ci 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 (`notice_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='公告';

代码参考

* 宠物商城:(PetMall)表控制层
 *
 */
@RestController
@RequestMapping("/pet_mall")
public class PetMallController extends BaseController<PetMall, PetMallService> {

    /**
     * 宠物商城对象
     */
    @Autowired
    public PetMallController(PetMallService service) {
        setService(service);
    }

    @Autowired
    private GoodsService goodsService;


    @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();
        });
        PetMall pet_mall = new PetMall();
            pet_mall.setPlace_of_origin_of_the_product(paramMap.get("place_of_origin_of_the_product")==null?null:String.valueOf(paramMap.get("place_of_origin_of_the_product")));
                        pet_mall.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits"))));
        pet_mall.setCart_title(paramMap.get("cart_title")==null?null:String.valueOf(paramMap.get("cart_title")));
        pet_mall.setCart_img(paramMap.get("cart_img")==null?null:String.valueOf(paramMap.get("cart_img")));
        pet_mall.setCart_description(paramMap.get("cart_description")==null?null:String.valueOf(paramMap.get("cart_description")));
        pet_mall.setCart_price_ago(paramMap.get("cart_price_ago")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_price_ago"))));
        pet_mall.setCart_price(paramMap.get("cart_price")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_price"))));
        pet_mall.setCart_inventory(paramMap.get("cart_inventory")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_inventory"))));
        pet_mall.setCart_type(paramMap.get("cart_type")==null?null:String.valueOf(paramMap.get("cart_type")));
        pet_mall.setCart_content(paramMap.get("cart_content")==null?null:String.valueOf(paramMap.get("cart_content")));
        pet_mall.setCart_img_1(paramMap.get("cart_img_1")==null?null:String.valueOf(paramMap.get("cart_img_1")));
        pet_mall.setCart_img_2(paramMap.get("cart_img_2")==null?null:String.valueOf(paramMap.get("cart_img_2")));
        pet_mall.setCart_img_3(paramMap.get("cart_img_3")==null?null:String.valueOf(paramMap.get("cart_img_3")));
        pet_mall.setCart_img_4(paramMap.get("cart_img_4")==null?null:String.valueOf(paramMap.get("cart_img_4")));
        pet_mall.setCart_img_5(paramMap.get("cart_img_5")==null?null:String.valueOf(paramMap.get("cart_img_5")));
                pet_mall.setListStatus(paramMap.get("list_status")==null?null:Integer.valueOf(String.valueOf(paramMap.get("list_status"))));
        pet_mall.setSku(paramMap.get("sku")==null?null:String.valueOf(paramMap.get("sku")));
                pet_mall.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by"))));
        this.addEntity(pet_mall);
        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();
        });
        PetMall pet_mall = new PetMall();
            pet_mall.setPlace_of_origin_of_the_product(paramMap.get("place_of_origin_of_the_product")==null?null:String.valueOf(paramMap.get("place_of_origin_of_the_product")));
                pet_mall.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits"))));
        pet_mall.setCart_title(paramMap.get("cart_title")==null?null:String.valueOf(paramMap.get("cart_title")));
        pet_mall.setCart_img(paramMap.get("cart_img")==null?null:String.valueOf(paramMap.get("cart_img")));
        pet_mall.setCart_description(paramMap.get("cart_description")==null?null:String.valueOf(paramMap.get("cart_description")));
        pet_mall.setCart_price_ago(paramMap.get("cart_price_ago")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_price_ago"))));
        pet_mall.setCart_price(paramMap.get("cart_price")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_price"))));
        pet_mall.setCart_inventory(paramMap.get("cart_inventory")==null?null:Double.valueOf(String.valueOf(paramMap.get("cart_inventory"))));
        pet_mall.setCart_type(paramMap.get("cart_type")==null?null:String.valueOf(paramMap.get("cart_type")));
        pet_mall.setCart_content(paramMap.get("cart_content")==null?null:String.valueOf(paramMap.get("cart_content")));
        pet_mall.setCart_img_1(paramMap.get("cart_img_1")==null?null:String.valueOf(paramMap.get("cart_img_1")));
        pet_mall.setCart_img_2(paramMap.get("cart_img_2")==null?null:String.valueOf(paramMap.get("cart_img_2")));
        pet_mall.setCart_img_3(paramMap.get("cart_img_3")==null?null:String.valueOf(paramMap.get("cart_img_3")));
        pet_mall.setCart_img_4(paramMap.get("cart_img_4")==null?null:String.valueOf(paramMap.get("cart_img_4")));
        pet_mall.setCart_img_5(paramMap.get("cart_img_5")==null?null:String.valueOf(paramMap.get("cart_img_5")));
                pet_mall.setListStatus(paramMap.get("list_status")==null?null:Integer.valueOf(String.valueOf(paramMap.get("list_status"))));
        pet_mall.setSku(paramMap.get("sku")==null?null:String.valueOf(paramMap.get("sku")));
        this.setEntity(queryMap,configMap,pet_mall);
        System.out.println("宠物商城修改成功");
        return success(1);
    }
    private static final double PURCHASE_WEIGHT = 5.0;     // 购买权重
    private static final double COLLECT_WEIGHT = 3.0;      // 收藏权重
        private static final double CLICK_WEIGHT = 1.0;        // 点击权重
        private static final double COMMENT_WEIGHT = 2.0;      // 评论权重
    /**
     * 协同过滤算法
     */
    @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("")){
						Map<String,String> configMap = service.readConfig(request);
			configMap.computeIfAbsent(FindConfig.PAGE, k -> String.valueOf(1));
			configMap.computeIfAbsent(FindConfig.SIZE, k -> String.valueOf(1));
			configMap.put(FindConfig.ORDER_BY, "goods_id asc");
			List goodsList = goodsService.selectBaseList(goodsService.select(paramMap, configMap));
			Map<String, Object> map = new HashMap<>();
			map.put("list", goodsList);
			map.put("count", goodsList.size());
			return success(map);
			        }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 = buildCartWeightedSql(paramMap.get("user_id"));
												List<Map<String,Object>> hitsSourceList = goodsService.selectMapBaseList(hitsSource);
            if (hitsSourceList != null && hitsSourceList.size() > 0) {
                System.out.println("前5条行为数据: ");
                for (int i = 0; i < Math.min(5, hitsSourceList.size()); i++) {
                    Map<String, Object> item = hitsSourceList.get(i);
                    System.out.println("  商品ID: " + item.get("goods_id") + ", 加权分数: " + item.get("hits_count"));
                }
            }
			            //判断是否为空,代表当前用户暂无点击数据,那么取其他用户的最常点击
            if (hitsSourceList==null || hitsSourceList.size()<=0){
												hitsSource = buildCartWeightedSql(null);
																hitsSourceList = goodsService.selectMapBaseList(hitsSource);
				            }
						String table_name = "goods";
			String table_id = "goods_id";
			String type_name = "type";
			            //二次处理-如果依旧为空则取添加时间前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 = goodsService.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("goods_id")));
						                    }
                }
                //查询该用户点击最大值的种类
                String typeSql = "SELECT " + type_name + " FROM "  + table_name + " WHERE " + table_id + " = " + maxSourceId;
								List<Map<String,Object>> typeList = goodsService.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 = goodsService.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 = goodsService.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 = goodsService.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++) {
																Goods leftMap = (Goods) resultList.get(j);
								Goods rightMap = (Goods) resultList.get(j + 1);
								if (leftMap.getHits()<rightMap.getHits()){
								    Goods 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 = goodsService.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 = goodsService.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;
    }
    /**
    * 构建加权行为SQL
    * @param userId 用户ID(null表示全局)
    * @return 加权SQL
    */
    private String buildCartWeightedSql(String userId) {
        // 用户条件
        String userCondition = (userId != null && !userId.isEmpty()) ? 
            " AND user_id = " + userId : "";
        return "SELECT goods_id, " +
            "(COUNT(CASE WHEN source_type = 'order' THEN 1 END) * " + PURCHASE_WEIGHT + " + " +
            "COUNT(CASE WHEN source_type = 'collect' THEN 1 END) * " + COLLECT_WEIGHT + " + " +
                        "COUNT(CASE WHEN source_type = 'hits' THEN 1 END) * " + CLICK_WEIGHT + " + " +
                        "COUNT(CASE WHEN source_type = 'comment' THEN 1 END) * " + COMMENT_WEIGHT + ") as hits_count " +
            "FROM (" +
            // 购买行为
            "SELECT goods_id, 'order' as source_type FROM `order` WHERE 1=1" + userCondition + " " +
            "UNION ALL " +
            // 收藏行为
            "SELECT source_id as goods_id, 'collect' as source_type FROM collect " +
            "WHERE source_table = 'goods'" + userCondition + " " +
            "UNION ALL " +
                        // 点击行为
            "SELECT source_id as goods_id, 'hits' as source_type FROM hits " +
            "WHERE source_table = 'goods'" + userCondition + " " +
            "UNION ALL " +
                        // 评论行为
            "SELECT source_id as goods_id, 'comment' as source_type FROM comment " +
            "WHERE source_table = 'goods'" + userCondition + " " +
            ") t " +
            "GROUP BY goods_id " +
            "ORDER BY hits_count DESC";

有需要项目源码的同学,

查看下方名片即可联系我。

感谢大家的支持,麻烦关注点赞收藏,

后续持续更新毕设选题和项目代码。🙏🙏

Logo

一站式 AI 云服务平台

更多推荐