# CarAppBackend **Repository Path**: haiming236/car-app-backend ## Basic Information - **Project Name**: CarAppBackend - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-30 - **Last Updated**: 2025-09-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 中央仓库地址: https://mvnrepository.com/ ## api文档 - http://localhost:8089/api/docs json格式 - http://localhost:8089/api/swagger html格式 #自定义swagger前端请求路径,输入http:127.0.0.1:8080/test会自动重定向到swagger页面 # 工具类 https://doc.hutool.cn/ ![img.png](img.png) JWT的工作流程 1、用户进入登录页,输入用户名、密码,进行登录; 2、服务器验证登录鉴权,如果改用户合法,根据用户的信息和服务器的规则生成 JWT Token 3、服务器将该 token 以 json 形式返回(不一定要json形式,这里说的是一种常见的做法) 4、用户得到 token,存在 localStorage、cookie 或其它数据存储形式中。以后用户请求 /protected 中的 API 时,在请求的 header 中加入 Authorization: Bearer xxxx(token)。此处注意token之前有一个7字符长度的 Bearer。 5、服务器端对此 token 进行检验,如果合法就解析其中内容,根据其拥有的权限和自己的业务逻辑给出对应的响应结果。 6、用户取得结果 用户表 ```sql CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID,主键,自增', phone VARCHAR(20) UNIQUE COMMENT '手机号,唯一,用作账户', password VARCHAR(255) COMMENT '密码,通常需要加密存储', nickname VARCHAR(16) COMMENT '用户昵称', openid VARCHAR(60) UNIQUE COMMENT '绑定的微信 OpenID', gender TINYINT DEFAULT 1 COMMENT '性别,1男、0女、2保密', avatar VARCHAR(100) COMMENT '头像URL', email VARCHAR(30) COMMENT '邮箱,唯一', role TINYINT DEFAULT 0 COMMENT '用户角色 0-普通用户 1-管理员 2-超级管理员', member_id VARCHAR(30) UNIQUE COMMENT '会员id', status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0被锁定,1正常,2删除', updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ); -- country VARCHAR(50) COMMENT '国家', -- 添加索引以提高查询效率 CREATE INDEX idx_phone_number ON users (phone_number); CREATE INDEX idx_email ON users (email); CREATE INDEX idx_role ON users (role); CREATE INDEX idx_status ON users (status); ``` 反馈表 ```sql CREATE TABLE `feedback` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', `type` VARCHAR(20) NOT NULL COMMENT '反馈类型:如Bug报告、功能建议、投诉、其他', `content` VARCHAR(255) NOT NULL COMMENT '反馈内容,详细描述', `contact` VARCHAR(20) DEFAULT NULL COMMENT '联系方式:手机号/邮箱/微信等,可空', `status` TINYINT NOT NULL DEFAULT 0 COMMENT '反馈状态:0-待解决, 1-已解决', `reply` VARCHAR(100) DEFAULT NULL COMMENT '回复内容:管理员对反馈的回复', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '反馈时间', `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户反馈表'; ``` -- 创建 brand 表 (品牌表) ```sql CREATE TABLE `brand` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '品牌ID', `brand` VARCHAR(10) NOT NULL COMMENT '品牌简称', `name` VARCHAR(26) NOT NULL COMMENT '品牌中文名', `logo` VARCHAR(200) COMMENT '品牌LOGO地址', `alphabet` CHAR(1) COMMENT '品牌字母标识', `country` VARCHAR(26) COMMENT '品牌所属国家', `hot` TINYINT DEFAULT 0 COMMENT '1热门,0不热门', PRIMARY KEY (`id`), UNIQUE (`brand`) -- 添加唯一索引 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='汽车品牌表'; ``` -- 创建 series 表 (车系表) ```sql CREATE TABLE `series` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '车系ID', `brand` VARCHAR(10) NOT NULL COMMENT '所属品牌ID', `name` VARCHAR(30) NOT NULL COMMENT '车系中文名', `english` VARCHAR(20) COMMENT '车系英文名', PRIMARY KEY (`id`), INDEX `idx_brand` (`brand`), CONSTRAINT `fk_series_brand` FOREIGN KEY (`brand`) REFERENCES `brand` (`brand`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='汽车车系表'; ``` -- 创建 model 表 (车型表) -- 已存在,此处作为参考 ```sql CREATE TABLE `model` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '车型ID', `series_id` INT NOT NULL COMMENT '所属车系ID', `name` VARCHAR(100) NOT NULL COMMENT '车型全称', `year` YEAR COMMENT '年款', `price` DECIMAL(10, 2) COMMENT '官方指导价(万元)', PRIMARY KEY (`id`), INDEX `idx_series_id` (`series_id`), CONSTRAINT `fk_model_series` FOREIGN KEY (`series_id`) REFERENCES `series` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='汽车车型表'; ``` -- 创建 configs 表 (选车配置字典表) ```sql CREATE TABLE `configs` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '配置ID', `name` VARCHAR(50) NOT NULL UNIQUE COMMENT '配置名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='车辆配置字典表'; ``` -- 创建 cars 表 (二手车主表) ```sql CREATE TABLE `cars` ( `car_id` INT NOT NULL AUTO_INCREMENT COMMENT '车辆唯一ID', `brand` VARCHAR(26) NOT NULL COMMENT '品牌中文名', `series` VARCHAR(100) NOT NULL COMMENT '车系中文名', `title` VARCHAR(100) NOT NULL COMMENT '车辆标题', `car_number` VARCHAR(8) UNIQUE COMMENT '车辆编号', `vin` VARCHAR(25) UNIQUE COMMENT '车架号(VIN)', `seller_type` TINYINT NOT NULL COMMENT '车主类型:1=个人车,2=车商,3=自营车', `sales_region` TINYINT NOT NULL DEFAULT 1 COMMENT '销售地区:1=国内,2=出口', `model_id` INT COMMENT '车型ID,关联 model 表', `price` DECIMAL(12, 2) NOT NULL COMMENT '销售价格(元)', `manufacture_year` YEAR NOT NULL COMMENT '制造年份', `manufacture_month` TINYINT NOT NULL COMMENT '制造月份(1-12)', `mileage` INT NOT NULL COMMENT '里程(公里)', `exterior` VARCHAR(10) COMMENT '外观颜色', `interior` VARCHAR(10) COMMENT '内饰颜色', `seats` TINYINT COMMENT '座位数', `transfer_count` TINYINT COMMENT '过户次数', `registration` DATE COMMENT '上牌日期', `displacement` DECIMAL(4, 2) COMMENT '排量(升)', `kilometer` INT COMMENT '续航里程(公里)', `power` TINYINT NOT NULL COMMENT '动力类型:1=纯电,2=汽油,3=油电混合,4=增程,5=柴油', `drive` TINYINT COMMENT '驱动方式:1=前驱,2=后驱,3=四驱', `transmission` TINYINT COMMENT '变速器:1=自动挡,2=手动挡', `config` VARCHAR(255) COMMENT '选车配置,多个配置以逗号分隔', `level` TINYINT COMMENT '车辆级别:1=SUV,2=轿车,3=小型车', `report` VARCHAR(255) COMMENT '检测报告URL', `condition_desc` VARCHAR(255) COMMENT '车况说明', `publisher_id` INT NOT NULL COMMENT '发布人ID', `pub_name` VARCHAR(20) COMMENT '发布人姓名', `pub_phone` VARCHAR(20) COMMENT '发布人手机号', `province` VARCHAR(50) COMMENT '车源省份', `city` VARCHAR(50) COMMENT '车源城市', `district` VARCHAR(50) COMMENT '车源区县', `status` TINYINT NOT NULL DEFAULT 0 COMMENT '汽车状态:0=未上架,1=已上架,2=已下架', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`car_id`), INDEX `idx_vin` (`vin`), INDEX `idx_model_id` (`model_id`), INDEX `idx_status_created` (`status`, `created_at`), INDEX `idx_publisher_id` (`publisher_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='二手车主表'; ``` -- 创建 car_media 表 (车辆图片和视频表) ```sql CREATE TABLE car_media ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', car_id INT NOT NULL COMMENT '关联车辆ID', type TINYINT(1) DEFAULT 1 COMMENT '媒体类型 1-图片,2-视频', url VARCHAR(255) NOT NULL COMMENT '资源URL', order_index INT DEFAULT 1 COMMENT '图片显示顺序', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间', FOREIGN KEY (car_id) REFERENCES cars(car_id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='车辆图片和视频'; ``` -- 创建 car_config 表 (车辆配置关联表) ```sql CREATE TABLE `car_config` ( `car_id` BIGINT NOT NULL COMMENT '车辆ID', `config_id` INT NOT NULL COMMENT '配置ID', PRIMARY KEY (`car_id`, `config_id`), INDEX `idx_config_id` (`config_id`), CONSTRAINT `fk_config_car` FOREIGN KEY (`car_id`) REFERENCES `cars` (`car_id`) ON DELETE CASCADE, CONSTRAINT `fk_config_config` FOREIGN KEY (`config_id`) REFERENCES `configs` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='车辆配置关联表'; ``` 用户收藏表 ```sql CREATE TABLE `favorite` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键ID', `user_id` INT NOT NULL COMMENT '用户ID', `car_id` INT NOT NULL COMMENT '车辆ID', `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '收藏时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_user_car` (`user_id`, `car_id`), -- 防止重复收藏 INDEX `idx_user_id` (`user_id`), INDEX `idx_car_id` (`car_id`), CONSTRAINT `fk_fav_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_fav_car` FOREIGN KEY (`car_id`) REFERENCES `cars` (`car_id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户收藏车辆表'; ``` 会话表(chat_session) 存储一对一和群聊会话,主要用于显示“聊天列表”。 ```sql CREATE TABLE chat_session ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '会话ID', session_type TINYINT NOT NULL COMMENT '会话类型:1=单聊,2=群聊', user_id INT NOT NULL COMMENT '用户ID', target_id INT NOT NULL COMMENT '目标ID(单聊=对方用户ID;群聊=群ID)', last_message VARCHAR(255) COMMENT '最后一条消息内容(冗余存储,用于列表展示)', last_message_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '最后一条消息时间', updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', INDEX idx_user (user_id), INDEX idx_target (target_id), INDEX idx_update (updated_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会话表'; ``` 消息表(chat_message) 所有消息统一存储,支持文本、图片、语音、视频、定位、商品链接。 ```sql CREATE TABLE chat_message ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '消息ID', session_id INT NOT NULL COMMENT '会话ID', sender_id INT NOT NULL COMMENT '发送者ID', message_type TINYINT NOT NULL COMMENT '消息类型:1=文本,2=图片,3=语音,4=视频,5=定位,6=商品链接,7=系统消息', content VARCHAR(255) COMMENT '文本内容/扩展信息(JSON)', extra JSON COMMENT '额外信息(定位坐标、商品详情、语音转文字等)', read TINYINT DEFAULT 0 COMMENT '状态:0=未读,1=已读', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '发送时间', INDEX idx_session (session_id), INDEX idx_sender (sender_id), INDEX idx_created (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息表'; ``` 媒体资源表(chat_media) 单独存储图片/语音/视频等大文件信息,避免消息表过大。 ```sql CREATE TABLE chat_media ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '媒体ID', message_id INT NOT NULL COMMENT '消息ID', media_type TINYINT NOT NULL COMMENT '媒体类型:1=图片,2=语音,3=视频,4=文件', url VARCHAR(100) NOT NULL COMMENT '文件URL(对象存储地址)', duration INT COMMENT '时长(语音/视频)单位:秒', size INT COMMENT '文件大小(字节)', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间', INDEX idx_message (message_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息附件表'; ``` 群聊表(chat_group) 存储群聊信息,包括群名称、群头像、群主ID等。 ```sql CREATE TABLE chat_group ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '群ID', group_name VARCHAR(60) NOT NULL COMMENT '群名称', group_avatar VARCHAR(100) COMMENT '群头像', owner_id INT NOT NULL COMMENT '群主ID', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', INDEX idx_owner (owner_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='群聊表'; ``` 群成员表(chat_group_member) 群成员管理 ```sql CREATE TABLE chat_group_member ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'ID', group_id INT NOT NULL COMMENT '群ID', user_id INT NOT NULL COMMENT '用户ID', role TINYINT DEFAULT 0 COMMENT '角色:0=成员,1=管理员,2=群主', joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间', INDEX idx_group (group_id), INDEX idx_user (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='群成员表'; ``` 消息存储策略 文本消息:存 content 图片/语音/视频:在 chat_media 表存 URL + size/duration 定位消息:extra 存 JSON {"latitude": 31.2304, "longitude": 121.4737, "address": "上海市黄浦区..."} 商品链接:extra 存 JSON {"product_id": 123, "title": "宝马X5", "price": 320000, "url": "https://xxx"} ⚡️ 这样设计的好处: 高性能:去掉外键,只靠索引,写入速度快 可扩展:支持未来群聊、撤回消息、消息转发 灵活:商品链接、定位等都放在 extra JSON,避免频繁改表结构 ```sql -- 聊天室表 CREATE TABLE IF NOT EXISTS `chat_rooms` ( `id` INT NOT NULL COMMENT '聊天室ID', `car_id` INT NOT NULL COMMENT '关联汽车ID', `buyer_id` INT NOT NULL COMMENT '买家ID', `seller_id` INT NOT NULL COMMENT '卖家ID', `last_message` TEXT COMMENT '最后一条消息', `last_message_time` DATETIME COMMENT '最后消息时间', `buyer_unread_count` INT DEFAULT 0 COMMENT '买家未读消息数', `seller_unread_count` INT DEFAULT 0 COMMENT '卖家未读消息数', `status` TINYINT DEFAULT 1 COMMENT '状态:1-正常,0-关闭', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), INDEX `idx_car_id` (`car_id`), INDEX `idx_buyer_id` (`buyer_id`), INDEX `idx_seller_id` (`seller_id`), INDEX `idx_last_message_time` (`last_message_time`), UNIQUE KEY `uk_car_buyer` (`car_id`, `buyer_id`), FOREIGN KEY (`car_id`) REFERENCES `cars`(`car_id`) ON DELETE CASCADE, FOREIGN KEY (`buyer_id`) REFERENCES `users`(`id`) ON DELETE CASCADE, FOREIGN KEY (`seller_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='聊天室表'; ``` ```sql -- 消息表 CREATE TABLE IF NOT EXISTS `messages` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '消息ID', `room_id` INT NOT NULL COMMENT '聊天室ID', `sender_id` INT NOT NULL COMMENT '发送者ID', `receiver_id` INT NOT NULL COMMENT '接收者ID', `content` TEXT NOT NULL COMMENT '消息内容', `type` VARCHAR(20) DEFAULT 'TEXT' COMMENT '消息类型:TEXT-文本,IMAGE-图片,VOICE-语音', `is_read` TINYINT DEFAULT 0 COMMENT '是否已读:1-已读,0-未读', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), INDEX `idx_room_id` (`room_id`), INDEX `idx_sender_id` (`sender_id`), INDEX `idx_receiver_id` (`receiver_id`), INDEX `idx_created_at` (`created_at`), INDEX `idx_is_read` (`is_read`), FOREIGN KEY (`room_id`) REFERENCES `chat_rooms`(`id`) ON DELETE CASCADE, FOREIGN KEY (`sender_id`) REFERENCES `users`(`id`) ON DELETE CASCADE, FOREIGN KEY (`receiver_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='消息表'; ``` ```sql -- 用户在线日志表(简化版 - 替代原有的在线状态表) CREATE TABLE IF NOT EXISTS `user_online_log` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '日志ID', `user_id` INT NOT NULL COMMENT '用户ID', `online_time` DATETIME NOT NULL COMMENT '上线时间', `offline_time` DATETIME COMMENT '下线时间', `ip_address` VARCHAR(45) COMMENT 'IP地址', `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), INDEX `idx_user_id` (`user_id`), INDEX `idx_online_time` (`online_time`), INDEX `idx_created_at` (`created_at`), FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户在线日志表'; ``` 客户端WebSocket连接 → ChatWebSocketHandler → WebSocketService → 业务逻辑处理