据相关数据显示,中国二手交易市场的规模正在不断扩大,预计到2025年将达到2万亿元。而目前国内的二手交易平台存在一些问题,如不透明的交易信息、虚假交易、不安全的支付等,给消费者带来了诸多困扰。一个安全、便捷、高效、可信的二手交易平台的推出,将会有着广阔的市场空间。
登录功能--用户选择使用微信授权登录、手机号验证码登录
社区市场--社区二手交易场所,承载买卖交易活动
商品管理--卖家、买家角色可使用的功能
即时聊天--买家、卖家沟通方式
支付、钱包--支付方式,卖家、买家账户
客服--售后、投诉等问题处理
平台协议签署--用户与平台签署相关协议
用户角色--用户功能分配
系统功能设计
1社区市场
1数据库表结构
id | BIGINT | 18位数字ID,全局唯一主键 | 无 |
name | VARCHAR(255) | 社区市场名称 | 无 |
description | TEXT | 社区市场描述 | 无 |
address | VARCHAR(255) | 社区市场地址 | 无 |
create_time | DATETIME | 记录创建时间 | CURRENT_TIMESTAMP (当前时间戳) |
update_time | DATETIME | 记录更新时间 | CURRENT_TIMESTAMP (当前时间戳),自动更新 |
admin_uid | BIGINT | 管理员UID | 无 |
admin_name | VARCHAR(255) | 管理员姓名 | 无 |
admin_phone | VARCHAR(20) | 管理员电话 | 无 |
lon | DECIMAL(10, 7) | 社区市场经度 | 无 |
lat | DECIMAL(10, 7) | 社区市场纬度 | 无 |
status | INT | 状态字段(1表示待审核 2未营业 3表示营业 4表示违规停业) | 0 1表示待审核 2 未营业 3表示营业 4表示违规停业,默认值为0 |
is_delete | TINYINT | 删除标识字段(0表示未删除,1表示删除) | 0 |
CREATE TABLE `community_markets` (
`id` BIGINT PRIMARY KEY, -- 使用BIGINT来存储18位数字ID
`name` VARCHAR(255) NOT NULL,
`description` TEXT,
`address` VARCHAR(255) NOT NULL, -- 使用address字段代替原location字段
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间默认值为当前时间戳
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间默认值为当前时间戳,记录更新时自动更新为当前时间
`admin_uid` BIGINT NOT NULL,
`admin_name` VARCHAR(255) NOT NULL,
`admin_phone` VARCHAR(20) NOT NULL,
`lon` DECIMAL(10, 7) NOT NULL,
`lat` DECIMAL(10, 7) NOT NULL,
`status` INT NOT NULL DEFAULT 0, -- 状态字段,数字类型,默认值为0 1表示待审核 2 未营业 3表示营业 4表示违规停业
`is_delete` TINYINT NOT NULL DEFAULT 0 -- 新增删除标识字段,数字类型,默认值为0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT="社区市场表"; -- 指定InnoDB引擎、UTF-8字符集和表备注信息
2社区市场功能接口
社区市场 | 功能描述 | |
创建市场 | 新增 | |
删除市场 | 删除 | |
修改市场 | 修改基础信息 | |
修改状态: 审核通过 ——> 营业 停业 ——> 营业 营业 ——> 停业 all ——> 违规停业 违规停业 ——> 营业 | ||
市场查询 | 根据当前位置查询最近的一个市场 | |
查询附近的市场列表 | ||
根据关键字查询市场列表 |
3社区市场接口设计
1 | 创建市场 | POST | /community_markets | 无 | 无 | 市场信息 |
2 | 删除市场 | DELETE | /community_markets/{id} | {id} - 市场ID | 无 | 无 |
3 | 修改市场 | PUT | /community_markets/{id} | {id} - 市场ID | 无 | 修改的市场信息 |
4 | 修改状态 | PATCH | /community_markets/{id}/status | {id} - 市场ID | 无 | 新状态 |
5 | 查询最近的一个市场 | GET | /community_markets/nearest | 无 | longitude, latitude | 无 |
6 | 查询附近的市场列表 | GET | /community_markets/nearby | 无 | longitude, latitude, radius(可选) | 无 |
7 | 根据关键字查询市场列表 | GET | /community_markets/search | 无 | keyword | 无 |
2即时消息功能
1功能列表
用户使用手机号码等信息进行注册 | |
用户使用手机号码和密码登录系统 | |
用户主动退出系统 | |
创建聊天室 | 用户创建一个新的聊天室 |
聊天室创建者解散聊天室,聊天室内的成员会被自动移除 | |
用户申请加入一个聊天室,聊天室创建者可以审核通过或拒绝 | |
退出聊天室 | 用户主动退出聊天室,聊天室创建者可以将成员移除聊天室 |
查看聊天室信息 | 用户查看聊天室的基本信息,包括聊天室名称、成员列表等 |
发送文本消息 | 用户在聊天室内发送文本消息 |
发送图片消息 | 用户在聊天室内发送图片消息,可以选择本地图片或拍摄照片 |
发送语音消息 | 用户在聊天室内发送语音消息,可以录制语音或选择本地音频文件 |
发送表情消息 | 用户在聊天室内发送表情消息,可以选择系统提供的表情或自定义表情 |
接收消息 | 用户在聊天室内实时接收到其他用户发送的消息 |
消息未读提醒 | 用户在聊天室内接收到未读的消息时,系统会发送未读提醒 |
消息已读确认 | 用户在聊天室内查看到未读消息时,可以进行已读确认 |
查看聊天记录 | 用户可以在聊天室内查看历史聊天记录 |
聊天室成员在线状态 | 用户可以查看聊天室内成员的在线状态,包括在线、离线、隐身等 |
离线消息推送 | 当用户不在线时,系统会将未读消息通过推送技术发送到用户设备上 |
实时通信协议 | 基于Websocket等技术实现聊天室内消息的实时通信 |
网络传输安全性 | 通过加密传输、安全验证等技术保障聊天室内消息的安全性 |
消息队列处理 | 使用消息队列技术处理消息的发送和接收等操作 |
2数据库设计
用户表
id | INT | 用户id,主键 |
username | VARCHAR(20) | 用户名 |
password | VARCHAR(20) | 用户密码 |
nickname | VARCHAR(20) | 用户昵称 |
avatar | VARCHAR(50) | 用户头像 |
created_time | DATETIME | 创建时间 |
updated_time | DATETIME | 更新时间 |
is_deleted | TINYINT | 删除标志,0-未删除,1-已删除 |
聊天室表
id | INT | 聊天室id,主键 |
name | VARCHAR(20) | 聊天室名称 |
owner_id | INT | 创建者id |
created_time | DATETIME | 创建时间 |
updated_time | DATETIME | 更新时间 |
is_deleted | TINYINT | 删除标志,0-未删除,1-已删除 |
聊天室成员表
id | INT | 主键 |
chat_room_id | INT | 聊天室id |
user_id | INT | 用户id |
created_time | DATETIME | 加入聊天室时间 |
is_deleted | TINYINT | 删除标志,0-未删除,1-已删除 |
消息表
id | INT | 消息id,主键 |
sender_id | INT | 发送者id |
receiver_id | INT | 接收者id,如果是群聊则为聊天室id |
chat_room_id | INT | 聊天室id,如果是私聊则为null |
content | TEXT | 消息内容 |
send_time | DATETIME | 发送时间 |
receive_time | DATETIME | 接收时间 |
is_received | TINYINT | 是否已接收,0-未接收,1-已接收 |
is_deleted | TINYINT | 删除标志,0-未删除,1-已删除 |
is_persistent | TINYINT | 是否持久化,0-不持久化,1-持久化 |
persistent_key | VARCHAR(50) | 持久化key,用于查询聊天记录 |
CREATE TABLE `user` (
`id` varchar(36) NOT NULL COMMENT "用户ID",
`username` varchar(50) NOT NULL COMMENT "用户名",
`password` varchar(100) NOT NULL COMMENT "密码",
`nickname` varchar(50) DEFAULT NULL COMMENT "昵称",
`avatar` varchar(255) DEFAULT NULL COMMENT "头像URL",
`created_time` datetime NOT NULL COMMENT "创建时间",
`updated_time` datetime NOT NULL COMMENT "更新时间",
`is_deleted` tinyint(1) NOT NULL DEFAULT "0" COMMENT "删除标记",
PRIMARY KEY (`id`),
UNIQUE KEY `username_UNIQUE` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="用户表";
CREATE TABLE `chat_room` (
`id` varchar(36) NOT NULL COMMENT "聊天室ID",
`name` varchar(50) NOT NULL COMMENT "聊天室名称",
`owner_id` varchar(36) NOT NULL COMMENT "创建者ID",
`created_time` datetime NOT NULL COMMENT "创建时间",
`updated_time` datetime NOT NULL COMMENT "更新时间",
`is_deleted` tinyint(1) NOT NULL DEFAULT "0" COMMENT "删除标记",
PRIMARY KEY (`id`),
KEY `fk_chat_room_owner` (`owner_id`),
CONSTRAINT `fk_chat_room_owner` FOREIGN KEY (`owner_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="聊天室表";
CREATE TABLE `message` (
`id` varchar(36) NOT NULL COMMENT "消息ID",
`sender_id` varchar(36) NOT NULL COMMENT "发送者ID",
`receiver_id` varchar(36) NOT NULL COMMENT "接收者ID",
`chat_room_id` varchar(36) DEFAULT NULL COMMENT "聊天室ID",
`content` varchar(1024) NOT NULL COMMENT "消息内容",
`send_time` datetime NOT NULL COMMENT "发送时间",
`receive_time` datetime DEFAULT NULL COMMENT "接收时间",
`is_received` tinyint(1) NOT NULL DEFAULT "0" COMMENT "是否已接收",
`is_deleted` tinyint(1) NOT NULL DEFAULT "0" COMMENT "删除标记",
`is_persistent` tinyint(1) NOT NULL DEFAULT "0" COMMENT "是否已持久化",
`persistent_key` varchar(36) DEFAULT NULL COMMENT "持久化Key",
PRIMARY KEY (`id`),
KEY `fk_message_sender` (`sender_id`),
KEY `fk_message_receiver` (`receiver_id`),
KEY `fk_message_chat_room` (`chat_room_id`),
CONSTRAINT `fk_message_chat_room` FOREIGN KEY (`chat_room_id`) REFERENCES `chat_room` (`id`),
CONSTRAINT `fk_message_receiver` FOREIGN KEY (`receiver_id`) REFERENCES `user` (`id`),
CONSTRAINT `fk_message_sender` FOREIGN KEY (`sender_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="消息表";
CREATE TABLE `chat_room_member` (
`id` varchar(36) NOT NULL COMMENT "ID",
`user_id` varchar(36) NOT NULL COMMENT "用户ID",
`chat_room_id` varchar(36) NOT NULL COMMENT "聊天室ID",
`created_time` datetime NOT NULL COMMENT "创建时间",
`updated_time` datetime NOT NULL COMMENT "更新时间",
`is_deleted
3聊天相关的接口设计
创建一对一聊天室接口 | POST | {"buyer_id": "买家用户ID","seller_id": "卖家用户ID"} | {"chatroom_id": "聊天室ID"} | 创建一对一聊天室,返回聊天室ID |
发送消息接口 | POST | {"chatroom_id": "聊天室ID","sender_id": "发送者用户ID","receiver_id": "接收者用户ID","message": "消息内容"} | {"message_id": "消息ID"} | 发送消息到指定聊天室,返回消息ID |
获取聊天记录接口 | GET | chatroom_id:聊天室ID<br>start_time:开始时间(可选)<br>end_time:结束时间(可选) | {"messages": [{"message_id": "消息ID","chatroom_id": "聊天室ID","sender_id": "发送者用户ID","receiver_id": "接收者用户ID","message": "消息内容","create_time": "创建时间"},...]} | 获取指定聊天室的聊天记录,支持按时间区间查询 |
接收新消息通知接口 | POST | {"receiver_id": "接收者用户ID"} | {"messages": [{"message_id": "消息ID","chatroom_id": "聊天室ID","sender_id": "发送者用户ID","receiver_id": "接收者用户ID","message": "消息内容","create_time": "创建时间"},...]} | 接收新消息通知,返回未读的消息列表 |
基于Netty框架,我们可以设计以下方案实现即时消息:
使用Netty实现客户端与服务端的连接和通信。自定义协议实现消息的格式、编码和解码。可以使用Protobuf等序列化框架进行数据传输格式的定义和封装。使用JWT等认证和授权机制保障用户的登录和鉴权。可以考虑使用OAuth2等标准协议进行用户的授权认证。使用Redis等缓存中间件缓存用户信息、会话信息等数据。使用MySQL等关系型数据库实现消息的持久化存储,可以根据需求选择分库分表、读写分离等策略。使用RocketMQ、Kafka等消息队列中间件实现消息的异步发送和消费,以及实现消息的分发和路由等功能。使用Zookeeper、Consul等服务发现和配置管理工具实现服务注册和发现、负载均衡等功能。使用分布式锁等技术实现并发控制、数据一致性等功能。
需要注意的是,Netty的聊天框架可能涉及到更加复杂的功能和技术实现,如消息撤回、加密解密、消息的防篡改等安全性能优化等,具体实现方案需要根据需求进行设计和优化。
文章为作者独立观点,不代表股票配资公司观点