【背景分析】
【实体图设计】
【 数据库表设计】
名称 | 类型 | 长度 | 注释 |
id | bigint | 20 | 主键 |
user_id | bigint | 20 | 用户id |
title | varchar | 255 | 标题 |
images | varchar | 2048 | 探店的照片,最多6张,多张以","隔开 |
content | varchar | 2048 | 探店的文字描述 |
liked | int | 8 | 点赞数量 |
collect | int | 8 | 收藏的数量 |
comments | int | 8 | 评论数量 |
status | tinyint | 1 | 博客状态:0-屏蔽、1-可见、2-不可见 |
can_like | tinyint | 1 | 是否可以点赞 |
can_com | tinyint | 1 | 是否可以评论 |
create_time | timestamp | 0 | 创建时间 |
update_time | timestamp | 0 | 更新时间 |
名称 | 类型 | 长度 | 注释 |
id | bigint | 20 | 主键 |
user_id | bigint | 20 | 用户id |
blog_id | bigint | 20 | 关联微博id |
parent_id | bigint | 20 | 关联的1级评论id,如果是一级评论,则值为0 |
answer_id | bigint | 20 | 回复的评论id |
content | varchar | 255 | 回复的内容 |
create_time | timestamp | 0 | 创建时间 |
update_time | timestamp | 0 | 更新时间 |
表3:tb_collect(收藏表)
名称 | 类型 | 长度 | 注释 |
id | bigint | 20 | 主键 |
user_id | bigint | 20 | 用户id |
collect_blog_id | bigint | 20 | 收藏的博客ID |
create_time | timestamp | 0 | 创建时间 |
名称 | 类型 | 长度 | 注释 |
id | bigint | 20 | 主键 |
user_id | bigint | 20 | 用户id |
follow_user_id | bigint | 20 | 关联的用户id |
create_time | timestamp | 0 | 创建时间 |
名称 | 类型 | 长度 | 注释 |
id | bigint | 20 | 主键 |
word | varchar | 50 | 敏感词汇 |
create_time | timestamp | 0 | 创建时间 |
名称 | 类型 | 长度 | 注释 |
id | bigint | 20 | 主键 |
root_name | varchar | 20 | 管理员用户名 |
root_account | varchar | 20 | 管理员账号 |
password | varchar | 30 | 密码 |
名称 | 类型 | 长度 | 注释 |
id | bigint | 20 | 主键 |
phone | varchar | 11 | 手机号码 |
password | varchar | 128 | 密码,加密存储 |
nick_name | varchar | 32 | 昵称,默认是用户id |
icon | varchar | 255 | 人物头像 |
user_status | tinyint | 1 | 0-正常、1-禁止分享 |
fan_num | bigint | 20 | 粉丝数 |
follow_num | bigint | 20 | 关注数 |
create_time | timestamp | 0 | 创建时间 |
update_time | timestamp | 0 | 更新时间 |
名称 | 类型 | 长度 | 注释 |
user_id | bigint | 20 | 主键,用户id |
fan_display | tinyint | 1 | 是否展示粉丝,0-false、1-true |
follow_display | tinyint | 1 | 是否展示关注,0-false、1-true |
create_time | timestamp | 0 | 创建时间 |
update_time | timestamp | 0 | 更新时间 |
1.登录功能
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
//StringTemplate 要求必须为 String 类型
Map userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(), CopyOptions.create()
.setIgnoreNullValue(true)
.setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));
String token = UUID.randomUUID().toString(true); //利用 UUID 随机生成 token 作为模拟
sessionID
String tokenKey = LOGIN_USER_KEY + token;
stringRedisTemplate.opsForHash().putAll(tokenKey,
// request 拦截器,将用户 token 放入头中
let token = sessionStorage.getItem("token");
axios.interceptors.request.use(
config => {
if(token) config.headers['authorization'] = token
return config
}, error => {
console.log(error)
return Promise.reject(error)
}
)
2.实现滚动查询
List records = new ArrayList<>();
// 根据用户查询
if (current == 1) {
Page page = query()
.orderByDesc("create_time")
.eq("status", BLOG_NORMAL)
.page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));
// 获取当前页数据
records = page.getRecords();
18
} else {
int num = 0;
int index = 0;
QueryWrapper blogQueryWrapper = new QueryWrapper<>();
blogQueryWrapper.select()
.orderByDesc("create_time");
List blogList = this.baseMapper.selectList(blogQueryWrapper);
for (Blog blog : blogList) {
if (blog.getId() == id) {
break;
}
index++;
}
//剩余的数量
int leaveNum = blogList.size() - index - 1;
while (leaveNum > 0 && num < 10) {
index++;
//分享的状态是必须是公开的
if (blogList.get(index).getStatus() == BLOG_NORMAL) { num++; records.add(blogList.get(index));
}
//剩余数量 -1
leaveNum--;
}
}
3.评论实现
4.点赞实现
if (score == null) {
// 3.如果未点赞,可以点赞
// 3.1.数据库点赞数 + 1
boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();
// 3.2.保存用户到 Redis 的 set 集合 zadd key value score
if (isSuccess) {
stringRedisTemplate.opsForZSet().add(key, userId.toString(), System.currentTimeMillis());
}
} else {
// 4.如果已点赞,取消点赞
// 4.1.数据库点赞数 -1
boolean isSuccess = update().setSql("liked = liked - 1").eq("id", id).update();
// 4.2.把用户从 Redis 的 set 集合移除
if (isSuccess) {
stringRedisTemplate.opsForZSet().remove(key, userId.toString());
}
}
1、首页
2.单个内容模块
3.博文展开
4.二级评论展开
6.他人主页
7.个人主页
8.查看粉丝
9.发布分享
10. 隐私设置
11.管理用户
12.敏感词汇管控
如果文章对您有用的话,三连支持一下吧!!!