Giter VIP home page Giter VIP logo

zongzibinbin / mallchat Goto Github PK

View Code? Open in Web Editor NEW
2.8K 19.0 745.0 2.09 MB

mallchat的后端项目,是一个既能购物又能聊天的电商系统。以互联网企业级开发规范的要求来实现它,电商该有的购物车,订单,支付,推荐,搜索,拉新,促活,推送,物流,客服,它都必须有。持续更新ing。。(点个star,不迷路)

License: Apache License 2.0

Java 100.00%

mallchat's Introduction

MallChat-抹茶

一个既能购物又能即时聊天的电商系统。致力于打造互联网企业级项目的最佳实践。
电商该有的购物车、订单、支付、推荐、搜索、拉新、促活、推送、物流、客服、它都必须有。持续更新 ing~

项目导航

  • 快速体验地址抹茶聊天首页
  • 前端项目仓库MallChatWeb
  • 项目视频记录Bilibili地址 全程分享项目进度,功能选型的思考,同时征集迭代建议。
  • 项目学习文档:10w+字,保姆级教学路线,环境搭建、核心功能、基建轮子、接口压测、问题记录、一个不落。可点击抹茶项目文档查看(内含500人交流大群)
  • 项目交流群:对抹茶感兴趣的,可以加入交流群。你的每一个举动,都会决定项目未来的方向。无论是提意见做产品经理,还是找bug做个测试人员,又或者加入开发小模块成为contributer,都欢迎你的加入。
  • 码云仓库Gitee(国内访问速度更快)

项目介绍

抹茶聊天是一个IM项目,通过netty实现和前端的websocket连接。内含微信扫描登录,成员列表,消息列表,消息互动,丰富的消息类型,还有很多实用的小轮子列如aop日志,分布式锁注解,频控注解,ip解析归属地等,持续更新中。。。

p92nKne.png

p92nKne.png

项目演示

C端项目

p92nKne.png

p92nKne.png

技术选型

后端技术

技术 说明 官网
SpringBoot web开发必备框架 https://spring.io/projects/spring-boot
MyBatis ORM框架 http://www.mybatis.org/mybatis-3/zh/index.html
MyBatisPlus 零sql,简化数据库操作,分页插件 https://baomidou.com/
Redis 缓存加速,多数据结构支持业务功能 https://redis.io
Caffeine 本地缓存 http://caffe.berkeleyvision.org/
Nginx 负载均衡,https配置,websocket升级,ip频控 https://nginx.org
Docker 应用容器引擎 https://www.docker.com
Oss 对象存储 https://letsencrypt.org/
Jwt 用户登录,认证方案 https://jwt.io
Lombok 简化代码 https://projectlombok.org
Hutool Java工具类库 https://github.com/looly/hutool
Swagger-UI API文档生成工具 https://github.com/swagger-api/swagger-ui
Hibernate-validator 接口校验框架 hibernate.org/validator/
minio 自建对象存储 https://github.com/minio/minio

前端技术

前往MallChatWeb查看

环境搭建

在项目目录下的application.yml修改自己的启动环境spring.profiles.active = test然后找到同级文件application-test.properties,填写自己的环境配置。星球成员提供一套测试环境配置,可直连

项目文档

保姆级教学路线,涵盖环境搭建、核心功能实现、基础架构构建、接口压力测试、问题记录以及项目的亮点。无一遗漏持续不断地更新中~
查看项目文档

文档1 文档2

star 趋势图

Stargazers over time

贡献

贡献之前请先阅读行为准则 和 贡献指南。感谢所有为 MallChat 做过贡献的人!

后端:

前端:

优秀贡献者:

类别 用户 贡献模块
前端 图片、语音、文件类型消息收发
消息互动操作(撤回、点赞、删除)
虚拟列表
后端 DFA敏感词检测
OpenAI聊天机器人
Ac自动机敏感词检测
限流编程式
握手认证

License

Apache License 2.0

公众号

微信搜索 阿斌Java之路 关注我的原创公众号,后台回复「抹茶」即可加入抹茶交流群,一些做过公司万人群聊,高并发的小伙伴都在里面讨论方案。公众号也会经常更新项目相关的文档,等你来撩~~

p9211Ag.png

mallchat's People

Contributors

1045078399 avatar akkkkkkdc avatar babelyj avatar beycheng avatar bigdataqichao avatar code-nose avatar djc-github avatar flowercard avatar hakusai22 avatar handsomeno2 avatar hildam avatar imarman avatar josek43326 avatar just-jing avatar kkuil avatar li-junpeng avatar lingyufei avatar linzhihan avatar lm0303 avatar maofuyu01 avatar oljc avatar realbebetter avatar shijiewu520 avatar sunwenhaopro avatar xiaocairush avatar yancyji avatar zbzbzzz avatar ziiigzag avatar zongzibinbin avatar zwmonrningstar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mallchat's Issues

关于敏感词过滤还能再优化的问题

假设: 基于原作者的写法 不用ac自动机的算法(斌哥视频中提及过)

1.应该使用 Trie 树数据结构:目前代码使用了一个以字符为键的 HashMap 来构建敏感词字典,但这样的实现在大规模敏感词库的情况下可能效率较低。可以考虑使用 Trie 树(字典树)来优化敏感词的存储和匹配,以提高效率。

2.加载敏感词的方式:当前代码提供了两种加载敏感词的方式,一种是通过直接传入敏感词列表,另一种是通过读取文件。可以根据实际需求考虑增加其他加载方式,例如从数据库中加载敏感词,或者支持动态添加和删除敏感词的操作。

3.增加对多线程环境的支持:当前的代码没有考虑多线程并发访问的情况。如果在多线程环境下使用,需要增加线程安全的措施,确保敏感词字典的正确性和一致性。

4.引入缓存机制:基于目前的框架,如果敏感词字典较大且更新频率较低,可以考虑引入缓存机制,避免每次过滤敏感词都重新加载字典。可以使用内存缓存或者使用缓存框架如Redis等来提高性能。

其它再看看

AC自动机BUG(acpro),敏感词屏蔽失效。

问题描述:ACProFilter类敏感词屏蔽功能BUG。
测试用例:
@test
public void ACPro()
{
List sensitiveList = Arrays.asList("白痴", "白痴吗你是");
ACProFilter acProFilter=new ACProFilter();
acProFilter.loadWord(sensitiveList);
System.out.println(acProFilter.filter("白痴吗你是白痴"));
}
测试结果:*****白痴
后面的白痴没有被屏蔽掉。

前端bug

消息撤回后,列表中还是有显示。
PS:第二个箭头指错地方了,应该是撤回的消息。

123

功能建议

1 已读功能(类似于标记类(点赞/点踩)的功能), 多数据源 数据库的选型要考虑, 推荐mongdb, 实现 jpa 和 mongodbTemplate 选择

2 输入中状态..., 无论单聊/群组, 都可存在此功能, 群组即例如顶顶会议的 xxxx,xx,xxx 正在讲话... , 或者单聊的 title 展示 对方正在输入中.../对方正在讲话中...

查看用户信息

有考虑过 聊天框/在线人数列表,点击头像查看其它用户相关信息吗?
展示信息:头像、昵称、拥有的徽章、注册时间、最后发言时间

RequestInfo 信息绑定问题

截屏2023-07-03 16 38 24

这个地方为啥要把单个channel的信息绑定到eventloop线程呢?如果eventloop对应多个channel的话不就覆盖掉了吗?

项目结构耦合度高的问题

大概的看了看了,不知道是不是我水平太差,感觉项目结构太混乱了。提个问题,正常的企业项目也是这样么🫠

【招募】握手认证功能

对于已登录的用户,前端拥有用户的token。在用户刷新网页的时候,前端会重新建立websocket链接,建立连接后,发送对应消息进行用户认证,传输token,对连接进行认证。
image

改版:
image

建立链接的时候就附带token信息。后端在握手阶段就会进行连接的校验。
然后返回对应的信息。
这样的改版,可以让用户在每次刷新页面的时候,更快得到认证的响应。
需要解决的难点
1.前端可以在建立链接的时候能携带参数
image

2.后端接受参数
前端携带的参数具体是在请求头还是在哪,需要debug试试。
具体是在协议升级前能获得,还是协议升级后才能获得,也需要试试。
协议升级前位置:com.abin.mallchat.custom.user.websocket.HttpHeadersHandler#channelRead
协议升级后位置:com.abin.mallchat.custom.user.websocket.NettyWebSocketServerHandler

3.后端返回成功或失败

  1. 对于认证成功的,我们当作已登录用户,需要更新websocket信息。
  2. 对于失败的,我们也会保持连接。当作游客连接,并返回认证失败的消息。
    可参考之前的逻辑com.abin.mallchat.custom.user.service.WebSocketService#authorize
    或者
    如果我们把三步分为两步,第二步返回的时候是触发前端的消息事件。
    也许我们还能做得更好,在连接的时候,直接把信息返回。触发的可能就是前端的连接响应事件。
    image

这就是真正的握手认证了,需要调研

前后端本地启动,空指针

image

|ERROR|2023-05-22 23:35:46.587|http-nio-8080-exec-3|a3e6ce8f-a814-43da-aa15-f9f4cf16ba1f|uid=10818|null point exception!The reason is:null|
java.lang.NullPointerException: null
at com.abin.mallchat.custom.user.service.adapter.UserAdapter.lambda$buildBadgeResp$0(UserAdapter.java:62)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.abin.mallchat.custom.user.service.adapter.UserAdapter.buildBadgeResp(UserAdapter.java:66)
at com.abin.mallchat.custom.user.service.impl.UserServiceImpl.badges(UserServiceImpl.java:89)
at com.abin.mallchat.custom.user.service.impl.UserServiceImpl$$FastClassBySpringCGLIB$$c76aabc2.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)
at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)

@用户功能相关bug(前端)

1、聊天界面,在聊天输入框无法@用户
2、当界面为 聊天界面-语音输入(按住说话),用户通过用户列表@其他用户时
期待结果: 显示输入框,并@用户
实际结果:界面为 聊天界面-语音输入(按住说话)

关于点赞

image
点赞时多次赞同一条消息概率出现幂等问题,连赞两次显示点赞数为2;交替点击赞和取消赞,出现点赞数为负数

用户体验优化

消息列表的加载优化,滚动条必须要滚动到最顶上, 才会触发下一页的消息加载,给人一种卡顿,不流畅的感觉。 可以到滚动一定的范围就提前加载,用户体验更好一点。

关于ONLINE_UID_MAP

/**
 * 所有在线的用户和对应的socket
 */
private static final ConcurrentHashMap<Long, CopyOnWriteArrayList<Channel>> ONLINE_UID_MAP = new ConcurrentHashMap<>();

这里为什么不是ConcurrentHashMap<Long, Channel> ,这里为什么要存CopyOnWriteArrayList呀

敏感词优化功能【招募】

抹茶项目的敏感词功能还需要优化,有兴趣的可以下方评论下。
1.异步构建前缀数,不要占用spring的启动流程
2.前缀树需要有结束节点,否则判断会出问题
3.前缀数用map构建,提高匹配速度,不要用arraylist。

徽章及其文字显示问题

image
徽章显示不出来了,只有鼠标移上去才会显示徽章的文字,这个时候下滑,徽章描述文字会超过主体,跑到外面去

Redis 集群模式下报错:

报错内容:ERR bad lua script for redis cluster, all the keys that the script uses should be passed using the KEYS array, and KEYS should not be in expression.
问题解决:Redis集群,在调用lua脚本的时候,key的位置必须是数组(不能使用Lua变量替换KEYS数组),否则直接返回错误信息。所以需要对lua脚本进行改正,去掉自定义的变量local,直接使用传入的KEYS数组。
参考链接:https://blog.csdn.net/qq_33996921/article/details/107204362

TextMsgHandler中自动装配规范问题

static 成员不应该使用Autowired注解装配;既然使用了new 创建对象就不该再使用自动装配功能,且会找不到PrioritizedUrlTitleDiscover类型的bean对象
image

这三个自制的start一直报错

[ERROR] Failed to execute goal on project mallchat-chat-server: Could not resolve dependencies for project com.abin.mallchat:mallchat-chat-server:jar:1.0-SNAPSHOT: The following artifacts could not be resolved: com.abin.mallchat:mallchat-common-starter:jar:1.0-SNAPSHOT, com.abin.mallchat:mallchat-transaction:jar:1.0-SNAPSHOT, com.abin.mallchat:mallchat-oss-starter:jar:1.0-SNAPSHOT: Could not find artifact com.abin.mallchat:mallchat-common-starter:jar:1.0-SNAPSHOT -> [Help 1]

有个疑问

image
zhe j这几个属于内部方法调用,没有收Spring管理,无法加入事务

SecureInvokeAspect基本类型或泛型无法反射成功

SecureInvokeAspect里面的 List parameters = Stream.of(method.getParameterTypes()).map(Class::getName).collect(Collectors.toList());
Class::getName如果是基本类型,则后面无法反射Class.forName成功,需要包装下成包装类型,可以参考hutool的
List parameters =
Stream.of(method.getParameterTypes())
.map(type -> BasicType.wrap(type).getName())
.collect(Collectors.toList());

泛型这个没有找到很好的解决方案

还有加了这个顺序后@order(Ordered.HIGHEST_PRECEDENCE + 1)//确保最先执行,因为spring事务优先级是比较低的,可能
TransactionSynchronizationManager.isActualTransactionActive();返回false,从而无法执行后续代码

规范问题建议

1、建议entity包中的实体类的createTime、updateTime等统一类型,目前有的是Date、有的是LocalDateTime
2、FrequencyControlAspect 在解析 target = EL时,可以增加注解的规范判断,FrequencyControlAspect#41行代码,可以在增加对frequencyControl.spEl()的非空串校验
3、SpElUtils#24行,params可能会出现null的情况
4、RedisConfig中配置RedisTemplate时,没有执行redisTemplate.afterPropertiesSet();;修改建议在#32行后面增加redisTemplate.afterPropertiesSet();
5、RedisUtils的类定位有点问题;为了方便使用,方法大多数都为static,但是又加上了 @component 注解;另外 其中的 RedisTemplate实际上不是RedisConfig中配置的;修改建议
public class RedisUtils { private static RedisTemplate<String,Object> redisTemplate; private static StringRedisTemplate stringRedisTemplate; static { // 原代码中是通过this访问的,静态变量不推荐用this访问 RedisUtils.stringRedisTemplate = SpringUtil.getBean(StringRedisTemplate.class); // RedisConfig 中的 redisTemplate 方法上修改为 @Bean(name = "myRedisTemplate") RedisUtils.redisTemplate = SpringUtil.getBean("myRedisTemplate"); } } ;RedisUtils 中所有涉及到 redisTemplate 调用的均需要修改一下;以及涉及到的类似于 getExpire 方法会产生NullPointerException的问题,redisTemplate.getExpire()返回的是包装类型的,但是RedisUtils 暴露的方法都是基本类型,unboxing是可能出现空指针异常

Thread使用的问题

问题思考来源于 issues #13

问题1: eventLoop thread会执行io操作

  clone代码后发现authorize是在eventLoop thread(并未在pipeline中添加切换thread的操作)中执行的,并且后续有同步执行redis和db的操作,存在的问题是cpu和memory都表现良好的前提下消息处理吞吐量提升不上去。

问题2:writeAndFlush这个方法无需在单独的thread中执行

  这个线程池在项目中没有找到其他用到的地方,writeAndFlush最后在pipeline中执行时会切换到evenLoop thread,此处再使用线程池中反而会得不偿失。 
image image

问题3(建议):使用Event时在发布事件处做同/异步的处理,特别是在non-blocking的线程模型下更应该谨慎的处理线程使用。

image

问题4:作者有没有意向用reactive替换现有的server端代码。

后端项目的建议

1 项目能有类似的模块建构图: (1) 使新人以最快的速度接受理解架构内容, (2)未来规划更明确
1698888005687

2 前端项目可发布一版访问 localhost的, 使后端更好调试(建议)

3 web端的大背景自定义或多种样式更换(建议)

4 项目架构我还需要关注一下

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.