├── .gitignore
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── document
├── deploy
│ └── 线上部署
│ │ ├── Dockerfile-Backend-8888
│ │ ├── Dockerfile-Backend-8889
│ │ ├── docker-compose.yml
│ │ ├── k8s
│ │ ├── Dockerfile-Frontend
│ │ ├── deploy-backend.yml
│ │ ├── deploy-frontend.yml
│ │ ├── ingress-nginx.yml
│ │ ├── nginx.conf
│ │ ├── svc-backend.yml
│ │ └── svc-frontend.yml
│ │ └── nginx.conf
├── guide
│ ├── images
│ │ ├── 04ae31df9b954bd5877454c719b738ec.png
│ │ ├── 14a33ba7ba3a405c8b87cba53e121911.png
│ │ ├── 1549a7a682614972883c48990c4c0dab.png
│ │ ├── 277021c85e544bc190b560cd823a7b29.png
│ │ ├── 278a9aff1cff417b87dfe3f014245066.png
│ │ ├── 32383e2ca264426ca4e8e394c973d10d.png
│ │ ├── 351392fb5b384e89b4d8dff057b65e07.png
│ │ ├── 37a1e2f11dc642559c031b6168f9f286.png
│ │ ├── 37ebf53c03284b319337b59676d50ce2.png
│ │ ├── 47f282031d7347c78c02dba83ac31197.png
│ │ ├── 4f81a25ecca74e9fabbd7172e971a73b.png
│ │ ├── 52c07e2a2244435ea28cb91918da03b8.png
│ │ ├── 52da01c64038499a9c617e1e31162236.png
│ │ ├── 59215af56edc4aa89a8dda8a57decc23.png
│ │ ├── 5c06d38bdbb3487cb4e2def9cd0fe869.png
│ │ ├── 6cc48c2e8fda450cb78914506b18d575.png
│ │ ├── 912a885fc1a3459d8dcd67c328c5d87c.png
│ │ ├── 93e53e3ae2bd4490a7e0455240d63aa5.png
│ │ ├── 9f8fec04d4d44b17a643416a2b2e0319.png
│ │ ├── a5b808af78454c8c90fd036c2946eca9.png
│ │ ├── b0b1977cfab24fdcb2724a5b720c2b08.png
│ │ ├── b27f255816854074b8afdaa1c9ebbcad.png
│ │ ├── c0e3367d12d84f7e99ef89a769d7952f.png
│ │ ├── cae11a506c2a4c018e5b7ba3538a4f12.png
│ │ ├── cfa7e96cb48c4ddf9b9a49119bf84057.png
│ │ ├── e28f3ec401224d5cbcc0e6479201f04e.png
│ │ ├── e31a2f1e468b41bc987d55ddb30c0415.png
│ │ ├── f0559af942e64c5f8f4b4815f50da882.png
│ │ ├── image-20240414191745575.png
│ │ ├── image-20241019202710916.png
│ │ ├── image-20241019204035779.png
│ │ ├── image-20241019205009094.png
│ │ ├── image-20241019205146845.png
│ │ ├── image-20241019205223613.png
│ │ └── image-20241027210413708.png
│ ├── quick_chat.sql
│ ├── 启动MQ.md
│ └── 提交PR流程.md
├── image
│ └── logo.png
└── 待完成需求.md
├── pom.xml
└── src
└── main
├── java
└── com
│ └── quick
│ ├── QuickChatApplication.java
│ ├── api
│ ├── controller
│ │ ├── QuickChatApplyController.java
│ │ ├── QuickChatContactController.java
│ │ ├── QuickChatFileController.java
│ │ ├── QuickChatGroupController.java
│ │ ├── QuickChatGroupMemberController.java
│ │ ├── QuickChatMsgController.java
│ │ ├── QuickChatSearchController.java
│ │ ├── QuickChatSessionController.java
│ │ └── QuickChatUserController.java
│ ├── mapper
│ │ ├── QuickChatApplyMapper.java
│ │ ├── QuickChatArchiveRecordMapper.java
│ │ ├── QuickChatContactMapper.java
│ │ ├── QuickChatEmojiMapper.java
│ │ ├── QuickChatGroupMapper.java
│ │ ├── QuickChatGroupMemberMapper.java
│ │ ├── QuickChatMsgDorisMapper.java
│ │ ├── QuickChatMsgMapper.java
│ │ ├── QuickChatSessionMapper.java
│ │ └── QuickChatUserMapper.java
│ ├── service
│ │ ├── QuickChatApplyService.java
│ │ ├── QuickChatContactService.java
│ │ ├── QuickChatEmojiService.java
│ │ ├── QuickChatFileService.java
│ │ ├── QuickChatGroupMemberService.java
│ │ ├── QuickChatGroupService.java
│ │ ├── QuickChatMsgService.java
│ │ ├── QuickChatSessionService.java
│ │ ├── QuickUserService.java
│ │ └── impl
│ │ │ ├── QuickChatApplyServiceImpl.java
│ │ │ ├── QuickChatContactServiceImpl.java
│ │ │ ├── QuickChatEmojiServiceImpl.java
│ │ │ ├── QuickChatFileServiceImpl.java
│ │ │ ├── QuickChatGroupMemberServiceImpl.java
│ │ │ ├── QuickChatGroupServiceImpl.java
│ │ │ ├── QuickChatMsgServiceImpl.java
│ │ │ ├── QuickChatSessionServiceImpl.java
│ │ │ └── QuickUserServiceImpl.java
│ └── store
│ │ ├── QuickChatApplyStore.java
│ │ ├── QuickChatArchiveRecordStore.java
│ │ ├── QuickChatContactStore.java
│ │ ├── QuickChatEmojiStore.java
│ │ ├── QuickChatGroupMemberStore.java
│ │ ├── QuickChatGroupStore.java
│ │ ├── QuickChatMsgStore.java
│ │ ├── QuickChatSessionStore.java
│ │ ├── QuickChatUserStore.java
│ │ ├── doris
│ │ ├── QuickChatMsgDorisStore.java
│ │ └── impl
│ │ │ └── QuickChatMsgDorisStoreImpl.java
│ │ └── impl
│ │ ├── QuickChatApplyStoreImpl.java
│ │ ├── QuickChatArchiveRecordStoreImpl.java
│ │ ├── QuickChatEmojiStoreImpl.java
│ │ ├── QuickChatFriendContactStoreImpl.java
│ │ ├── QuickChatGroupMemberStoreImpl.java
│ │ ├── QuickChatGroupStoreImpl.java
│ │ ├── QuickChatMsgStoreImpl.java
│ │ ├── QuickChatSessionStoreImpl.java
│ │ └── QuickChatUserStoreImpl.java
│ └── common
│ ├── adapter
│ ├── ApplyAdapter.java
│ ├── ContactAdapter.java
│ ├── EmojiAdapter.java
│ ├── FileExtraAdapter.java
│ ├── GroupAdapter.java
│ ├── GroupMemberAdapter.java
│ ├── MsgAdapter.java
│ ├── SessionAdapter.java
│ └── UserAdapter.java
│ ├── annotation
│ └── RateLimiter.java
│ ├── aspect
│ ├── RateLimiterAspect.java
│ └── WebLogAspect.java
│ ├── config
│ ├── BeanPostProcessorConfig.java
│ ├── KaptchaConfig.java
│ ├── LuaScriptConfig.java
│ ├── MetaObjectConfig.java
│ ├── MinioConfig.java
│ ├── MybatisPlusConfig.java
│ ├── RedisConfig.java
│ ├── RocketMQConfig.java
│ ├── SensitiveConfig.java
│ ├── SwaggerConfiguration.java
│ ├── WebMvcConfig.java
│ └── XxlJobConfig.java
│ ├── constant
│ ├── RedisConstant.java
│ └── RocketMQConstant.java
│ ├── enums
│ ├── ApplyTypeEnum.java
│ ├── BucketEnum.java
│ ├── ChatMsgEnum.java
│ ├── EmailEnum.java
│ ├── GenderEnum.java
│ ├── LimitTypeEnum.java
│ ├── ResponseEnum.java
│ ├── SessionTypeEnum.java
│ ├── WsPushEnum.java
│ └── YesNoEnum.java
│ ├── exception
│ ├── GlobalExceptionHandler.java
│ ├── QuickException.java
│ └── QuickValidationException.java
│ ├── interceptor
│ └── LoginTokenInterceptor.java
│ ├── job
│ └── ChatSessionMsgJob.java
│ ├── mq
│ ├── consumer
│ │ ├── apply
│ │ │ ├── FriendApplyConsumer.java
│ │ │ └── GroupApplyConsumer.java
│ │ ├── msg
│ │ │ ├── SendFriendMsgConsumer.java
│ │ │ ├── SendGroupMsgConsumer.java
│ │ │ └── SendMsgLoadingConsumer.java
│ │ └── notice
│ │ │ ├── GroupAddMemberConsumer.java
│ │ │ ├── GroupDeleteMemberConsumer.java
│ │ │ └── GroupReleaseConsumer.java
│ └── producer
│ │ └── MyRocketMQTemplate.java
│ ├── netty
│ ├── NettyChannelHandler.java
│ ├── NettyWebSocketServer.java
│ └── UserChannelRelation.java
│ ├── pojo
│ ├── dto
│ │ ├── ChatMsgDTO.java
│ │ ├── ChatMsgQueryDTO.java
│ │ ├── EmailDTO.java
│ │ ├── FileExtraDTO.java
│ │ ├── FindBackFormDTO.java
│ │ ├── GroupDTO.java
│ │ ├── LoginFormDTO.java
│ │ ├── RegisterFormDTO.java
│ │ └── UserInfoDTO.java
│ ├── entity
│ │ └── WsPushEntity.java
│ ├── po
│ │ ├── QuickChatApply.java
│ │ ├── QuickChatArchiveRecord.java
│ │ ├── QuickChatContact.java
│ │ ├── QuickChatEmoji.java
│ │ ├── QuickChatGroup.java
│ │ ├── QuickChatGroupMember.java
│ │ ├── QuickChatMsg.java
│ │ ├── QuickChatSession.java
│ │ └── QuickChatUser.java
│ └── vo
│ │ ├── ChatMsgVO.java
│ │ ├── ChatSessionVO.java
│ │ └── ChatUserVO.java
│ ├── response
│ ├── BaseResponse.java
│ └── R.java
│ ├── sensitive
│ ├── MySensitiveWordReplace.java
│ ├── MyWordAllow.java
│ └── MyWordDeny.java
│ ├── strategy
│ ├── email
│ │ ├── AbstractEmailStrategy.java
│ │ ├── EmailStrategyFactory.java
│ │ └── handler
│ │ │ ├── FindBackHandler.java
│ │ │ ├── SendCodeHandler.java
│ │ │ └── WarnUserHandler.java
│ ├── file
│ │ ├── AbstractFileStrategy.java
│ │ ├── FileStrategyFactory.java
│ │ └── handler
│ │ │ ├── AvatarHandler.java
│ │ │ ├── FileHandler.java
│ │ │ └── VoiceHandler.java
│ └── msg
│ │ ├── AbstractChatMsgStrategy.java
│ │ ├── ChatMsgStrategyFactory.java
│ │ └── handler
│ │ ├── AtMsgHandler.java
│ │ ├── EmojiHandler.java
│ │ ├── FileMsgHandler.java
│ │ ├── FontMsgHandler.java
│ │ ├── RecallMsgHandler.java
│ │ ├── ReplyMsgHandler.java
│ │ ├── VideoCallHandler.java
│ │ ├── VoiceCallHandler.java
│ │ └── VoiceMsgHandler.java
│ ├── threadpool
│ ├── MyThreadFactory.java
│ ├── MyThreadPoolExecutor.java
│ └── MyUncaughtExceptionHandler.java
│ └── utils
│ ├── AESUtil.java
│ ├── AddressUtil.java
│ ├── CookieUtil.java
│ ├── EmailUtil.java
│ ├── HttpServletUtil.java
│ ├── IpUtil.java
│ ├── JwtUtil.java
│ ├── MinioUtil.java
│ ├── RandomUtil.java
│ ├── RedisUtil.java
│ ├── RedissonLockUtil.java
│ ├── RequestContextUtil.java
│ └── SensitiveWordUtil.java
└── resources
├── application-dev.yml
├── application.yml
├── banner.txt
├── email
├── findBack.html
└── sendCode.html
├── ip2region
└── ip2region.xdb
├── logback-spring.xml
├── lua
└── RateLimit.lua
├── mapper
├── QuickChatApplyMapper.xml
├── QuickChatArchiveRecordMapper.xml
├── QuickChatContactMapper.xml
├── QuickChatEmojiMapper.xml
├── QuickChatGroupMapper.xml
├── QuickChatGroupMemberMapper.xml
├── QuickChatMsgDorisMapper.xml
├── QuickChatMsgMapper.xml
├── QuickChatSessionMapper.xml
└── QuickChatUserMapper.xml
└── sensitive
├── myNotSensitiveWords.txt
└── mySensitiveWords.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | # User-specific stuff
2 | .idea/**/workspace.xml
3 | .idea/**/tasks.xml
4 | .idea/**/dictionaries
5 | .idea/**/shelf
6 |
7 | # Sensitive or high-churn files
8 | .idea/**/dataSources/
9 | .idea/**/dataSources.ids
10 | .idea/**/dataSources.local.xml
11 | .idea/**/sqlDataSources.xml
12 | .idea/**/dynamic.xml
13 | .idea/**/uiDesigner.xml
14 | .idea/**/dbnavigator.xml
15 | .idea
16 |
17 | # Gradle
18 | .idea/**/gradle.xml
19 | .idea/**/libraries
20 |
21 | # CMake
22 | cmake-build-debug/
23 | cmake-build-release/
24 |
25 | # Mongo Explorer plugin
26 | .idea/**/mongoSettings.xml
27 |
28 | # File-based project format
29 | *.iws
30 |
31 | # IntelliJ
32 | out/
33 |
34 | # mpeltonen/sbt-idea plugin
35 | .idea_modules/
36 |
37 | # JIRA plugin
38 | atlassian-ide-plugin.xml
39 |
40 | # Cursive Clojure plugin
41 | .idea/replstate.xml
42 |
43 | # Crashlytics plugin (for Android Studio and IntelliJ)
44 | com_crashlytics_export_strings.xml
45 | crashlytics.properties
46 | crashlytics-build.properties
47 | fabric.properties
48 |
49 | # Editor-based Rest Client
50 | .idea/httpRequests
51 |
52 | ### Java template
53 | # Compiled class file
54 | *.class
55 |
56 | # Log file
57 | *.log
58 |
59 | # BlueJ files
60 | *.ctxt
61 |
62 | # Mobile Tools for Java (J2ME)
63 | .mtj.tmp/
64 |
65 | # Package Files #
66 | *.jar
67 | *.war
68 | *.nar
69 | *.ear
70 | *.zip
71 | *.tar.gz
72 | *.rar
73 |
74 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
75 | hs_err_pid*
76 | *.iml
77 | /.idea/
78 | */target/
79 | */*/target/
80 | */*/*/target/
81 | */*.iml
82 | */*/*.iml
83 |
84 | # 自定义
85 | application-prod.yml
86 | CodeGenerator.java
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 | ## ✨系统介绍
15 |
16 | 基于SpringBoot2 + JDK11的IM实时通讯聊天系统,通过Netty构建高性能WebSocket服务器。
17 | 具有单聊、群聊、文件传输、音频消息、实时通话视频等强大功能。
18 | 支持任意联网设备直接通过浏览器随时随地访问,消息多端系统实时同步。
19 |
20 | ## 🚀技术架构
21 |
22 |
23 | ## ✋加入我们
24 |
25 | - [🚢本地启动流程](https://github.com/Binx98/QuickChat/blob/master/docs/guide/%E6%9C%AC%E5%9C%B0%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2.md)
26 | - [✍提交PR流程](https://github.com/Binx98/QuickChat/blob/master/docs/guide/%E6%8F%90%E4%BA%A4PR%E6%B5%81%E7%A8%8B.md)
27 |
28 | ## 🎉贡献名单
29 |
30 |
31 |
32 |
33 |
34 | | 姓名 | Github | 公司 |
35 | |:---:|:----------------------------------:|:-------------:|
36 | | 徐志斌 | https://github.com/Binx98 | PARAVERSE 平行云 |
37 | | 陈辰 | https://github.com/GeforceLite | SBI BITS |
38 | | 刘东辉 | https://github.com/gentlemanJiu | 中科院信工所 |
39 |
--------------------------------------------------------------------------------
/document/deploy/线上部署/Dockerfile-Backend-8888:
--------------------------------------------------------------------------------
1 | FROM openjdk:17
2 | MAINTAINER 徐志斌
3 | ADD quick-chat.jar /quick-chat.jar
4 | EXPOSE 8888
5 | ENTRYPOINT ["java", "-jar", "quick-chat.jar"]
--------------------------------------------------------------------------------
/document/deploy/线上部署/Dockerfile-Backend-8889:
--------------------------------------------------------------------------------
1 | FROM openjdk:17
2 | MAINTAINER 徐志斌
3 | ADD quick-chat.jar /quick-chat.jar
4 | EXPOSE 8889
5 | ENTRYPOINT ["java", "-jar", "quick-chat.jar"]
--------------------------------------------------------------------------------
/document/deploy/线上部署/k8s/Dockerfile-Frontend:
--------------------------------------------------------------------------------
1 | # 基础镜像 Nginx
2 | FROM nginx:1.24.0
3 |
4 | # 拷贝当前目录的文件到指定文件夹下,改文件夹为镜像中的文件夹
5 | COPY ./dist /usr/share/nginx/html
6 |
7 | # 拷贝nginx.conf文件到镜像下,替换掉原有的nginx.conf
8 | COPY nginx.conf /etc/nginx/nginx.conf
9 |
--------------------------------------------------------------------------------
/document/deploy/线上部署/k8s/deploy-backend.yml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: backend-deployment
5 | namespace: prod-env
6 | labels:
7 | app: backend-label
8 | spec:
9 | replicas: 3
10 | selector:
11 | matchLabels:
12 | app: backend-label
13 | template:
14 | metadata:
15 | labels:
16 | app: backend-label
17 | spec:
18 | containers:
19 | - name: backend
20 | image: 镜像仓库内网IP:9999/test/backend-project:1.0
21 | imagePullPolicy: Always
22 | ports:
23 | - containerPort: 8080
24 | resources:
25 | requests:
26 | memory: 300Mi
27 | cpu: 200m
28 | limits:
29 | memory: 500Mi
30 | cpu: 400m
--------------------------------------------------------------------------------
/document/deploy/线上部署/k8s/deploy-frontend.yml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: frontend-deployment
5 | namespace: prod-env
6 | labels:
7 | app: frontend-label
8 | spec:
9 | replicas: 3
10 | selector:
11 | matchLabels:
12 | app: frontend-label
13 | template:
14 | metadata:
15 | labels:
16 | app: frontend-label
17 | spec:
18 | containers:
19 | - name: frontend
20 | image: 镜像仓库内网IP:9999/test/frontend-project:1.0
21 | imagePullPolicy: Always
22 | ports:
23 | - containerPort: 80
24 | resources:
25 | requests:
26 | memory: 300Mi
27 | cpu: 200m
28 | limits:
29 | memory: 500Mi
30 | cpu: 400m
31 |
--------------------------------------------------------------------------------
/document/deploy/线上部署/k8s/ingress-nginx.yml:
--------------------------------------------------------------------------------
1 | apiVersion: networking.k8s.io/v1
2 | kind: Ingress
3 | metadata:
4 | name: my-ingress
5 | namespace: prod-env
6 | spec:
7 | ingressClassName: nginx
8 | rules:
9 | - host: 域名
10 | http:
11 | paths:
12 | - path: /
13 | pathType: Prefix
14 | backend:
15 | service:
16 | name: frontend-service
17 | port:
18 | number: 80
19 |
20 | # 后端服务 Service 就不用暴露了,不需要直接把后端接口给别人调用啊!
21 | # - path: /api
22 | # pathType: Prefix
23 | # backend:
24 | # service:
25 | # name: backend-service
26 | # port:
27 | # number: 8080
--------------------------------------------------------------------------------
/document/deploy/线上部署/k8s/nginx.conf:
--------------------------------------------------------------------------------
1 | worker_processes 1;
2 |
3 | events {
4 | worker_connections 1024;
5 | }
6 |
7 | http {
8 | include mime.types;
9 | default_type application/octet-stream;
10 | sendfile on;
11 | keepalive_timeout 65;
12 |
13 | server {
14 | listen 80;
15 | server_name localhost;
16 |
17 | location / {
18 | root /usr/share/nginx/html;
19 | try_files $uri $uri/ /index.html;
20 | index index.html index.htm;
21 | }
22 |
23 | location /api/ {
24 | proxy_http_version 1.1;
25 | proxy_set_header Host $host;
26 | proxy_set_header X-Real-IP $remote_addr;
27 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
28 | proxy_set_header Connection "";
29 | # 这里用的是 K8S Service 服务名访问方式
30 | proxy_pass http://backend-service.prod-env.svc.cluster.local:8080;
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/document/deploy/线上部署/k8s/svc-backend.yml:
--------------------------------------------------------------------------------
1 | kind: Service
2 | apiVersion: v1
3 | metadata:
4 | name: backend-service
5 | namespace: prod-env
6 | labels:
7 | app: backend-label
8 | spec:
9 | selector:
10 | app: backend-label
11 | type: ClusterIP
12 | ports:
13 | - protocol: TCP
14 | port: 8080
15 | targetPort: 8080
16 |
--------------------------------------------------------------------------------
/document/deploy/线上部署/k8s/svc-frontend.yml:
--------------------------------------------------------------------------------
1 | kind: Service
2 | apiVersion: v1
3 | metadata:
4 | name: frontend-service
5 | namespace: prod-env
6 | labels:
7 | app: frontend-label
8 | spec:
9 | selector:
10 | app: frontend-label
11 | type: ClusterIP
12 | ports:
13 | - protocol: TCP
14 | port: 80
15 | targetPort: 80
16 |
--------------------------------------------------------------------------------
/document/deploy/线上部署/nginx.conf:
--------------------------------------------------------------------------------
1 | upstream backend {
2 | server JAR内网ip:8888 max_fails=3 fail_timeout=30s;
3 | server JAR内网ip:8889 max_fails=3 fail_timeout=30s;
4 | }
5 |
6 | upstream websocket {
7 | server JAR内网ip:8888 max_fails=3 fail_timeout=30s;
8 | server JAR内网ip:8889 max_fails=3 fail_timeout=30s;
9 | }
10 |
11 | server {
12 | listen 80;
13 | server_name localhost;
14 |
15 | location / {
16 | root /usr/share/nginx/html/pc;
17 | if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
18 | root /usr/share/nginx/html/mobile;
19 | }
20 | index index.html index.htm;
21 | }
22 |
23 | location /api/ {
24 | proxy_http_version 1.1;
25 | proxy_set_header Host $host;
26 | proxy_set_header Connection "";
27 | proxy_set_header X-Real-IP $remote_addr;
28 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
29 | proxy_pass http://backend;
30 | }
31 |
32 | location /ws/ {
33 | proxy_http_version 1.1;
34 | proxy_set_header Host $host;
35 | proxy_set_header Upgrade $http_upgrade";
36 | proxy_set_header Connection "Upgrade";
37 | proxy_pass http://websocket;
38 | }
39 | }
--------------------------------------------------------------------------------
/document/guide/images/04ae31df9b954bd5877454c719b738ec.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/04ae31df9b954bd5877454c719b738ec.png
--------------------------------------------------------------------------------
/document/guide/images/14a33ba7ba3a405c8b87cba53e121911.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/14a33ba7ba3a405c8b87cba53e121911.png
--------------------------------------------------------------------------------
/document/guide/images/1549a7a682614972883c48990c4c0dab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/1549a7a682614972883c48990c4c0dab.png
--------------------------------------------------------------------------------
/document/guide/images/277021c85e544bc190b560cd823a7b29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/277021c85e544bc190b560cd823a7b29.png
--------------------------------------------------------------------------------
/document/guide/images/278a9aff1cff417b87dfe3f014245066.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/278a9aff1cff417b87dfe3f014245066.png
--------------------------------------------------------------------------------
/document/guide/images/32383e2ca264426ca4e8e394c973d10d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/32383e2ca264426ca4e8e394c973d10d.png
--------------------------------------------------------------------------------
/document/guide/images/351392fb5b384e89b4d8dff057b65e07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/351392fb5b384e89b4d8dff057b65e07.png
--------------------------------------------------------------------------------
/document/guide/images/37a1e2f11dc642559c031b6168f9f286.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/37a1e2f11dc642559c031b6168f9f286.png
--------------------------------------------------------------------------------
/document/guide/images/37ebf53c03284b319337b59676d50ce2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/37ebf53c03284b319337b59676d50ce2.png
--------------------------------------------------------------------------------
/document/guide/images/47f282031d7347c78c02dba83ac31197.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/47f282031d7347c78c02dba83ac31197.png
--------------------------------------------------------------------------------
/document/guide/images/4f81a25ecca74e9fabbd7172e971a73b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/4f81a25ecca74e9fabbd7172e971a73b.png
--------------------------------------------------------------------------------
/document/guide/images/52c07e2a2244435ea28cb91918da03b8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/52c07e2a2244435ea28cb91918da03b8.png
--------------------------------------------------------------------------------
/document/guide/images/52da01c64038499a9c617e1e31162236.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/52da01c64038499a9c617e1e31162236.png
--------------------------------------------------------------------------------
/document/guide/images/59215af56edc4aa89a8dda8a57decc23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/59215af56edc4aa89a8dda8a57decc23.png
--------------------------------------------------------------------------------
/document/guide/images/5c06d38bdbb3487cb4e2def9cd0fe869.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/5c06d38bdbb3487cb4e2def9cd0fe869.png
--------------------------------------------------------------------------------
/document/guide/images/6cc48c2e8fda450cb78914506b18d575.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/6cc48c2e8fda450cb78914506b18d575.png
--------------------------------------------------------------------------------
/document/guide/images/912a885fc1a3459d8dcd67c328c5d87c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/912a885fc1a3459d8dcd67c328c5d87c.png
--------------------------------------------------------------------------------
/document/guide/images/93e53e3ae2bd4490a7e0455240d63aa5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/93e53e3ae2bd4490a7e0455240d63aa5.png
--------------------------------------------------------------------------------
/document/guide/images/9f8fec04d4d44b17a643416a2b2e0319.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/9f8fec04d4d44b17a643416a2b2e0319.png
--------------------------------------------------------------------------------
/document/guide/images/a5b808af78454c8c90fd036c2946eca9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/a5b808af78454c8c90fd036c2946eca9.png
--------------------------------------------------------------------------------
/document/guide/images/b0b1977cfab24fdcb2724a5b720c2b08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/b0b1977cfab24fdcb2724a5b720c2b08.png
--------------------------------------------------------------------------------
/document/guide/images/b27f255816854074b8afdaa1c9ebbcad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/b27f255816854074b8afdaa1c9ebbcad.png
--------------------------------------------------------------------------------
/document/guide/images/c0e3367d12d84f7e99ef89a769d7952f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/c0e3367d12d84f7e99ef89a769d7952f.png
--------------------------------------------------------------------------------
/document/guide/images/cae11a506c2a4c018e5b7ba3538a4f12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/cae11a506c2a4c018e5b7ba3538a4f12.png
--------------------------------------------------------------------------------
/document/guide/images/cfa7e96cb48c4ddf9b9a49119bf84057.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/cfa7e96cb48c4ddf9b9a49119bf84057.png
--------------------------------------------------------------------------------
/document/guide/images/e28f3ec401224d5cbcc0e6479201f04e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/e28f3ec401224d5cbcc0e6479201f04e.png
--------------------------------------------------------------------------------
/document/guide/images/e31a2f1e468b41bc987d55ddb30c0415.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/e31a2f1e468b41bc987d55ddb30c0415.png
--------------------------------------------------------------------------------
/document/guide/images/f0559af942e64c5f8f4b4815f50da882.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/f0559af942e64c5f8f4b4815f50da882.png
--------------------------------------------------------------------------------
/document/guide/images/image-20240414191745575.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/image-20240414191745575.png
--------------------------------------------------------------------------------
/document/guide/images/image-20241019202710916.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/image-20241019202710916.png
--------------------------------------------------------------------------------
/document/guide/images/image-20241019204035779.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/image-20241019204035779.png
--------------------------------------------------------------------------------
/document/guide/images/image-20241019205009094.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/image-20241019205009094.png
--------------------------------------------------------------------------------
/document/guide/images/image-20241019205146845.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/image-20241019205146845.png
--------------------------------------------------------------------------------
/document/guide/images/image-20241019205223613.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/image-20241019205223613.png
--------------------------------------------------------------------------------
/document/guide/images/image-20241027210413708.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/guide/images/image-20241027210413708.png
--------------------------------------------------------------------------------
/document/guide/启动MQ.md:
--------------------------------------------------------------------------------
1 | RocketMQ 需要先启动 NameServer 再启动 Broker,RocketMQ安装4.9.3版本即可
2 |
3 | 参考文档:[【RocketMQ】安装与部署(Windows)_rocketmq windows-CSDN博客](https://blog.csdn.net/m0_52777015/article/details/130928378)
4 |
5 | 启动nameServer
6 |
7 | ```text
8 | start mqnamesrv.cmd
9 | ```
10 |
11 | 
12 |
13 | **启动Broker**:继续在同一命令提示符窗口中执行下面的命令来启动Broker
14 |
15 | ```text
16 | start mqbroker.cmd -n 127.0.0.1:9876
17 | ```
18 |
19 | 
20 |
21 |
22 |
23 | 启动MQ的web管理端,这个自行百度即可,不做特别详细介绍:[RockeMQ Admin DashBoard](https://github.com/apache/rocketmq-dashboard)
24 |
25 | ```
26 | mvn spring-boot:run
27 | ```
28 |
29 |
30 |
31 | **启动时可能遇到的问题:**
32 |
33 | 如果你的电脑默认JDK不是8的情况下,那么默认就需要修改一下启动变量,比如我默认是11
34 | 
35 |
36 | 版本不对,XXX类已经过时,一般就是JAVA_HOME的版本不对,右键打开启动脚本,单独设置JDK8的路径即可
37 |
38 | 
39 |
40 | 
41 |
42 | 
--------------------------------------------------------------------------------
/document/image/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Binx98/QuickChat/f6ad197da44025db491e99b1a3a61a2ea67ef4a8/document/image/logo.png
--------------------------------------------------------------------------------
/document/待完成需求.md:
--------------------------------------------------------------------------------
1 | - XXL-JOB整合
2 | - RocketMQ整合
3 | - 本地部署文档
--------------------------------------------------------------------------------
/src/main/java/com/quick/QuickChatApplication.java:
--------------------------------------------------------------------------------
1 | package com.quick;
2 |
3 | import lombok.extern.slf4j.Slf4j;
4 | import org.mybatis.spring.annotation.MapperScan;
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.boot.CommandLineRunner;
7 | import org.springframework.boot.SpringApplication;
8 | import org.springframework.boot.autoconfigure.SpringBootApplication;
9 | import org.springframework.core.env.Environment;
10 | import org.springframework.scheduling.annotation.EnableAsync;
11 |
12 | @Slf4j
13 | @EnableAsync
14 | @MapperScan("com.quick.api.mapper")
15 | @SpringBootApplication
16 | public class QuickChatApplication implements CommandLineRunner {
17 | @Autowired
18 | private Environment environment;
19 |
20 | public static void main(String[] args) {
21 | SpringApplication.run(QuickChatApplication.class, args);
22 | }
23 |
24 | public void run(String... args) {
25 | String applicationName = environment.getProperty("spring.application.name");
26 | String serverPort = environment.getProperty("server.port");
27 | String active = environment.getProperty("spring.profiles.active");
28 | System.setProperty("rocketmq.client.logUseSlf4j", "true");
29 | log.info("----------------------------项目名称:[{}]----------------------------", applicationName);
30 | log.info("----------------------------项目环境:[{}]----------------------------", active);
31 | log.info("----------------------------项目端口:[{}]----------------------------", serverPort);
32 | log.info("----------------------------QuickChat启动成功!----------------------------");
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/controller/QuickChatApplyController.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.controller;
2 |
3 | import com.quick.common.enums.ResponseEnum;
4 | import com.quick.common.pojo.po.QuickChatApply;
5 | import com.quick.common.response.R;
6 | import com.quick.api.service.QuickChatApplyService;
7 | import io.swagger.annotations.Api;
8 | import io.swagger.annotations.ApiOperation;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.web.bind.annotation.PathVariable;
11 | import org.springframework.web.bind.annotation.PostMapping;
12 | import org.springframework.web.bind.annotation.RequestMapping;
13 | import org.springframework.web.bind.annotation.RestController;
14 |
15 | import java.util.List;
16 |
17 | /**
18 | * @Author: 徐志斌
19 | * @CreateTime: 2024-07-04 15:45
20 | * @Description: 申请通知
21 | * @Version: 1.0
22 | */
23 | @Api(tags = "申请通知")
24 | @RestController
25 | @RequestMapping("/apply")
26 | public class QuickChatApplyController {
27 | @Autowired
28 | private QuickChatApplyService applyService;
29 |
30 | @ApiOperation("查询列表")
31 | @PostMapping("/list")
32 | public R getApplyList() {
33 | List list = applyService.getApplyList();
34 | return R.out(ResponseEnum.SUCCESS, list);
35 | }
36 |
37 | @ApiOperation("同意申请")
38 | @PostMapping("/agree/{applyId}")
39 | public R agreeApply(@PathVariable Long applyId) {
40 | applyService.agreeApply(applyId);
41 | return R.out(ResponseEnum.SUCCESS);
42 | }
43 |
44 | @ApiOperation("删除申请")
45 | @PostMapping("/delete/{applyId}")
46 | public R deleteApply(@PathVariable Long applyId) {
47 | applyService.deleteApply(applyId);
48 | return R.out(ResponseEnum.SUCCESS);
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/controller/QuickChatContactController.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.controller;
2 |
3 | import com.quick.common.enums.ResponseEnum;
4 | import com.quick.common.pojo.vo.ChatUserVO;
5 | import com.quick.common.response.R;
6 | import com.quick.api.service.QuickChatContactService;
7 | import io.swagger.annotations.Api;
8 | import io.swagger.annotations.ApiOperation;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.web.bind.annotation.PathVariable;
11 | import org.springframework.web.bind.annotation.PostMapping;
12 | import org.springframework.web.bind.annotation.RequestMapping;
13 | import org.springframework.web.bind.annotation.RestController;
14 |
15 | import java.util.List;
16 |
17 | /**
18 | * @Author: 徐志斌
19 | * @CreateTime: 2024-07-04 15:45
20 | * @Description: 通讯录(好友 + 群组)
21 | * @Version: 1.0
22 | */
23 | @Api(tags = "通讯录")
24 | @RestController
25 | @RequestMapping("/contact")
26 | public class QuickChatContactController {
27 | @Autowired
28 | private QuickChatContactService contactService;
29 |
30 | @ApiOperation("查询列表")
31 | @PostMapping("/list")
32 | public R getFriendList() {
33 | List result = contactService.getContactList();
34 | return R.out(ResponseEnum.SUCCESS, result);
35 | }
36 |
37 | @ApiOperation("添加好友")
38 | @PostMapping("/add/{accountId}")
39 | public R addFriend(@PathVariable String accountId, String applyInfo) {
40 | contactService.addFriend(accountId, applyInfo);
41 | return R.out(ResponseEnum.SUCCESS);
42 | }
43 |
44 | @ApiOperation("删除好友")
45 | @PostMapping("/delete/{accountId}")
46 | public R deleteFriend(@PathVariable String accountId) {
47 | contactService.deleteFriend(accountId);
48 | return R.out(ResponseEnum.SUCCESS);
49 | }
50 |
51 | @ApiOperation("备注昵称")
52 | @PostMapping("/note/{accountId}/{noteName}")
53 | public R noteFriend(@PathVariable String accountId,
54 | @PathVariable String noteName) {
55 | contactService.noteFriend(accountId, noteName);
56 | return R.out(ResponseEnum.SUCCESS);
57 | }
58 |
59 | @ApiOperation("拉黑好友")
60 | @PostMapping("/black")
61 | public R blackFriend() {
62 | return R.out(ResponseEnum.SUCCESS);
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/controller/QuickChatFileController.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.controller;
2 |
3 | import com.quick.common.enums.ResponseEnum;
4 | import com.quick.common.response.R;
5 | import com.quick.api.service.QuickChatFileService;
6 | import io.swagger.annotations.Api;
7 | import io.swagger.annotations.ApiOperation;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.stereotype.Controller;
10 | import org.springframework.web.bind.annotation.*;
11 | import org.springframework.web.multipart.MultipartFile;
12 |
13 | import java.util.Map;
14 |
15 | /**
16 | * @Author 徐志斌
17 | * @Date: 2024/3/3 16:29
18 | * @Version 1.0
19 | * @Description: 文件控制器
20 | */
21 | @Api(tags = "文件相关")
22 | @Controller
23 | @RequestMapping("/file")
24 | public class QuickChatFileController {
25 | @Autowired
26 | private QuickChatFileService fileService;
27 |
28 | @ResponseBody
29 | @ApiOperation("上传文件")
30 | @PostMapping("/upload/{type}")
31 | public R uploadFile(@PathVariable Integer type, MultipartFile file) throws Exception {
32 | Map resultMap = fileService.uploadFile(type, file);
33 | return R.out(ResponseEnum.SUCCESS, resultMap);
34 | }
35 |
36 | @ApiOperation("下载文件")
37 | @GetMapping("/download/{type}")
38 | public void downloadFile(@PathVariable Integer type, String url) {
39 | fileService.downloadFile(type, url);
40 | }
41 |
42 | @ApiOperation("删除文件")
43 | @DeleteMapping("/delete/{type}")
44 | public void deleteFile(@PathVariable Integer type, String url) throws Exception {
45 | fileService.deleteFile(type, url);
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/controller/QuickChatGroupController.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.controller;
2 |
3 | import com.quick.common.enums.ResponseEnum;
4 | import com.quick.common.pojo.dto.GroupDTO;
5 | import com.quick.common.response.R;
6 | import com.quick.api.service.QuickChatGroupService;
7 | import io.swagger.annotations.Api;
8 | import io.swagger.annotations.ApiOperation;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.validation.annotation.Validated;
11 | import org.springframework.web.bind.annotation.*;
12 |
13 | /**
14 | * @Author: 徐志斌
15 | * @CreateTime: 2023-11-21 10:05
16 | * @Description: 群组信息
17 | * @Version: 1.0
18 | */
19 | @Api(tags = "群组信息")
20 | @RestController
21 | @RequestMapping("/group")
22 | public class QuickChatGroupController {
23 | @Autowired
24 | private QuickChatGroupService groupService;
25 |
26 | @ApiOperation("创建群组")
27 | @PostMapping("/create")
28 | public R create(@Validated @RequestBody GroupDTO group) {
29 | groupService.createGroup(group);
30 | return R.out(ResponseEnum.SUCCESS);
31 | }
32 |
33 | @ApiOperation("修改群组信息")
34 | @GetMapping("/update")
35 | public R updateInfo(@Validated @RequestBody GroupDTO group) {
36 | groupService.updateInfo(group);
37 | return R.out(ResponseEnum.SUCCESS);
38 | }
39 |
40 | @ApiOperation("解散群聊")
41 | @DeleteMapping("/release/{groupId}")
42 | public R releaseGroup(@PathVariable Long groupId) {
43 | groupService.releaseGroup(groupId);
44 | return R.out(ResponseEnum.SUCCESS);
45 | }
46 |
47 | @ApiOperation("退出群聊")
48 | @GetMapping("/exit/{groupId}")
49 | public R exitGroup(@PathVariable Long groupId) {
50 | groupService.exitGroup(groupId);
51 | return R.out(ResponseEnum.SUCCESS);
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/controller/QuickChatGroupMemberController.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.controller;
2 |
3 | import com.quick.common.enums.ResponseEnum;
4 | import com.quick.common.pojo.vo.ChatUserVO;
5 | import com.quick.common.response.R;
6 | import com.quick.api.service.QuickChatGroupMemberService;
7 | import io.swagger.annotations.Api;
8 | import io.swagger.annotations.ApiOperation;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.web.bind.annotation.*;
11 |
12 | import java.util.List;
13 |
14 | /**
15 | * @Author: 徐志斌
16 | * @CreateTime: 2024-07-05 16:45
17 | * @Description: 群成员
18 | * @Version: 1.0
19 | */
20 | @Api(tags = "群成员")
21 | @RestController
22 | @RequestMapping("/member")
23 | public class QuickChatGroupMemberController {
24 | @Autowired
25 | private QuickChatGroupMemberService memberService;
26 |
27 | @ApiOperation("查询群成员")
28 | @PostMapping("/list/{groupId}")
29 | public R getMemberList(@PathVariable Long groupId) {
30 | List members = memberService.getGroupMemberList(groupId);
31 | return R.out(ResponseEnum.SUCCESS, members);
32 | }
33 |
34 | @ApiOperation("批量添加成员")
35 | @GetMapping("/add/{groupId}")
36 | public R addMember(@PathVariable Long groupId,
37 | @RequestBody List accountIdList) {
38 | memberService.addMember(groupId, accountIdList);
39 | return R.out(ResponseEnum.SUCCESS);
40 | }
41 |
42 | @ApiOperation("移除群成员")
43 | @GetMapping("/delete/{groupId}/{accountId}")
44 | public R deleteMember(@PathVariable Long groupId,
45 | @PathVariable String accountId) {
46 | memberService.deleteMember(groupId, accountId);
47 | return R.out(ResponseEnum.SUCCESS);
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/controller/QuickChatSearchController.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.controller;
2 |
3 | import org.springframework.web.bind.annotation.RequestMapping;
4 | import org.springframework.web.bind.annotation.RestController;
5 |
6 | /**
7 | * @Author: 徐志斌
8 | * @CreateTime: 2024-12-03 12:06
9 | * @Description: 搜索框
10 | * @Version: 1.0
11 | */
12 | @RestController
13 | @RequestMapping("/search")
14 | public class QuickChatSearchController {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/mapper/QuickChatApplyMapper.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.quick.common.pojo.po.QuickChatApply;
5 |
6 | /**
7 | *
8 | * 系统通知 Mapper 接口
9 | *
10 | *
11 | * @author 徐志斌
12 | * @since 2024-03-12
13 | */
14 | public interface QuickChatApplyMapper extends BaseMapper {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/mapper/QuickChatArchiveRecordMapper.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.quick.common.pojo.po.QuickChatArchiveRecord;
5 |
6 | /**
7 | *
8 | * Mapper 接口
9 | *
10 | *
11 | * @author 徐志斌
12 | * @since 2024-11-13
13 | */
14 | public interface QuickChatArchiveRecordMapper extends BaseMapper {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/mapper/QuickChatContactMapper.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.quick.common.pojo.po.QuickChatContact;
5 |
6 | /**
7 | *
8 | * 聊天好友 Mapper 接口
9 | *
10 | *
11 | * @author 徐志斌
12 | * @since 2023-11-30
13 | */
14 | public interface QuickChatContactMapper extends BaseMapper {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/mapper/QuickChatEmojiMapper.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.quick.common.pojo.po.QuickChatEmoji;
5 |
6 | /**
7 | *
8 | * 表情包 Mapper 接口
9 | *
10 | *
11 | * @author 徐志斌
12 | * @since 2023-11-30
13 | */
14 | public interface QuickChatEmojiMapper extends BaseMapper {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/mapper/QuickChatGroupMapper.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.quick.common.pojo.po.QuickChatGroup;
5 |
6 | /**
7 | *
8 | * 群聊 Mapper 接口
9 | *
10 | *
11 | * @author 徐志斌
12 | * @since 2024-01-08
13 | */
14 | public interface QuickChatGroupMapper extends BaseMapper {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/mapper/QuickChatGroupMemberMapper.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.quick.common.pojo.po.QuickChatGroupMember;
5 |
6 | /**
7 | *
8 | * 群成员 Mapper 接口
9 | *
10 | *
11 | * @author 徐志斌
12 | * @since 2024-01-08
13 | */
14 | public interface QuickChatGroupMemberMapper extends BaseMapper {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/mapper/QuickChatMsgDorisMapper.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.quick.common.pojo.po.QuickChatMsg;
5 |
6 | /**
7 | *
8 | * 聊天信息 Mapper 接口
9 | *
10 | *
11 | * @author 徐志斌
12 | * @since 2023-11-25
13 | */
14 | public interface QuickChatMsgDorisMapper extends BaseMapper {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/mapper/QuickChatMsgMapper.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.quick.common.pojo.po.QuickChatMsg;
5 | import org.apache.ibatis.annotations.Param;
6 |
7 | import java.util.List;
8 |
9 | /**
10 | *
11 | * 聊天信息 Mapper 接口
12 | *
13 | *
14 | * @author 徐志斌
15 | * @since 2023-11-25
16 | */
17 | public interface QuickChatMsgMapper extends BaseMapper {
18 | /**
19 | * 根据 消息id列表 物理删除聊天记录
20 | *
21 | * @param ids 消息id列表
22 | * @return 执行结果
23 | */
24 | Boolean physicalDeleteMsgList(@Param("ids") List ids);
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/mapper/QuickChatSessionMapper.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.quick.common.pojo.po.QuickChatSession;
5 |
6 | /**
7 | *
8 | * 聊天会话(针对单聊) Mapper 接口
9 | *
10 | *
11 | * @author 徐志斌
12 | * @since 2023-11-25
13 | */
14 | public interface QuickChatSessionMapper extends BaseMapper {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/mapper/QuickChatUserMapper.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.quick.common.pojo.po.QuickChatUser;
5 |
6 | /**
7 | *
8 | * Mapper 接口
9 | *
10 | *
11 | * @author 徐志斌
12 | * @since 2023-11-13
13 | */
14 | public interface QuickChatUserMapper extends BaseMapper {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/service/QuickChatApplyService.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.service;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatApply;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | *
10 | * 申请通知 服务类
11 | *
12 | *
13 | * @author 徐志斌
14 | * @since 2024-03-12
15 | */
16 | public interface QuickChatApplyService extends IService {
17 |
18 | /**
19 | * 查询申请通知列表
20 | *
21 | * @return 通知列表
22 | */
23 | List getApplyList();
24 |
25 | /**
26 | * 同意申请
27 | *
28 | * @param applyId 申请id
29 | * @return 执行结果
30 | */
31 | void agreeApply(Long applyId);
32 |
33 | /**
34 | * 删除申请
35 | *
36 | * @param applyId 申请id
37 | * @return 执行结果
38 | */
39 | void deleteApply(Long applyId);
40 | }
41 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/service/QuickChatContactService.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.service;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatContact;
5 | import com.quick.common.pojo.vo.ChatUserVO;
6 |
7 | import java.util.List;
8 |
9 | /**
10 | *
11 | * 通讯录 服务类
12 | *
13 | *
14 | * @author 徐志斌
15 | * @since 2023-11-30
16 | */
17 | public interface QuickChatContactService extends IService {
18 |
19 | /**
20 | * 查询通讯录好友
21 | *
22 | * @return 通讯录好友列表
23 | */
24 | List getContactList();
25 |
26 | /**
27 | * 添加好友
28 | *
29 | * @param accountId 用户id
30 | * @param applyInfo 申请信息
31 | * @return 执行结果
32 | */
33 | void addFriend(String accountId, String applyInfo);
34 |
35 | /**
36 | * 删除好友
37 | *
38 | * @param accountId 用户id
39 | * @return 执行结果
40 | */
41 | void deleteFriend(String accountId);
42 |
43 | /**
44 | * 备注昵称
45 | *
46 | * @param accountId 账户id
47 | * @param noteName 昵称
48 | */
49 | void noteFriend(String accountId, String noteName);
50 | }
51 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/service/QuickChatEmojiService.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.service;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatEmoji;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | *
10 | * 表情包 服务类
11 | *
12 | *
13 | * @author 徐志斌
14 | * @since 2023-11-30
15 | */
16 | public interface QuickChatEmojiService extends IService {
17 | /**
18 | * 获取表情包列表
19 | *
20 | * @param accountId 账号id
21 | * @return 表情包列表
22 | */
23 | List getEmojiList(String accountId);
24 |
25 | /**
26 | * 添加表情包
27 | *
28 | * @param url 表情包URL
29 | * @return 执行结果
30 | */
31 | Boolean addEmoji(String url);
32 |
33 | /**
34 | * 删除表情包
35 | *
36 | * @param id 主键id
37 | * @return 执行结果
38 | */
39 | Boolean deleteEmoji(Long id);
40 | }
41 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/service/QuickChatFileService.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.service;
2 |
3 | import org.springframework.web.multipart.MultipartFile;
4 |
5 | import java.util.Map;
6 |
7 | /**
8 | *
9 | * 表情包 服务类
10 | *
11 | *
12 | * @author 徐志斌
13 | * @since 2024-04-04
14 | */
15 | public interface QuickChatFileService {
16 | /**
17 | * 上传文件
18 | *
19 | * @param type Bucket类型
20 | * @param file 文件对象
21 | * @return 文件信息
22 | */
23 | Map uploadFile(int type, MultipartFile file) throws Exception;
24 |
25 | /**
26 | * 下载文件
27 | *
28 | * @param type Bucket类型
29 | * @param url 文件url
30 | */
31 | void downloadFile(int type, String url);
32 |
33 | /**
34 | * 删除文件
35 | *
36 | * @param type Bucket类型
37 | * @param url 文件url
38 | */
39 | void deleteFile(int type, String url) throws Exception;
40 | }
41 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/service/QuickChatGroupMemberService.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.service;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatGroupMember;
5 | import com.quick.common.pojo.vo.ChatUserVO;
6 |
7 | import java.util.List;
8 |
9 | /**
10 | *
11 | * 群成员 服务类
12 | *
13 | *
14 | * @author 徐志斌
15 | * @since 2024-01-08
16 | */
17 | public interface QuickChatGroupMemberService extends IService {
18 | /**
19 | * 查询群成员列表
20 | *
21 | * @param groupId 群id
22 | * @return 群成员列表
23 | */
24 | List getGroupMemberList(Long groupId);
25 |
26 | /**
27 | * 添加群成员
28 | *
29 | * @param groupId 群组id
30 | * @param accountIdList 账户id列表
31 | */
32 | void addMember(Long groupId, List accountIdList);
33 |
34 | /**
35 | * 移除群成员
36 | *
37 | * @param groupId 群组id
38 | * @param accountId 账户id
39 | * @return 执行结果
40 | */
41 | void deleteMember(Long groupId, String accountId);
42 | }
43 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/service/QuickChatGroupService.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.service;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.dto.GroupDTO;
5 | import com.quick.common.pojo.po.QuickChatGroup;
6 |
7 | /**
8 | *
9 | * 群聊 服务类
10 | *
11 | *
12 | * @author 徐志斌
13 | * @since 2024-01-08
14 | */
15 | public interface QuickChatGroupService extends IService {
16 | /**
17 | * 创建群聊
18 | *
19 | * @param group 群聊参数
20 | * @return 执行结果
21 | */
22 | void createGroup(GroupDTO group);
23 |
24 | /**
25 | * 解散群聊
26 | *
27 | * @param groupId 群聊id
28 | */
29 | void releaseGroup(Long groupId);
30 |
31 | /**
32 | * 退出群聊
33 | *
34 | * @param groupId 群聊id
35 | * @return 执行结果
36 | */
37 | void exitGroup(Long groupId);
38 |
39 | /**
40 | * 修改群组信息
41 | *
42 | * @param group 群组信息
43 | * @return 执行结果
44 | */
45 | void updateInfo(GroupDTO group);
46 | }
47 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/service/QuickChatMsgService.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.service;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.dto.ChatMsgDTO;
5 | import com.quick.common.pojo.po.QuickChatMsg;
6 | import com.quick.common.pojo.vo.ChatMsgVO;
7 |
8 | import java.util.List;
9 | import java.util.Map;
10 |
11 | /**
12 | *
13 | * 聊天信息 服务类
14 | *
15 | *
16 | * @author 徐志斌
17 | * @since 2023-11-25
18 | */
19 | public interface QuickChatMsgService extends IService {
20 | /**
21 | * 根据 relation_id 分页查询聊天信息
22 | *
23 | * @param relationId 关联id
24 | * @param current 当前页
25 | * @param size 每页条数
26 | * @return 聊天信息集合
27 | */
28 | Map> getPageByRelationId(Long relationId, Integer current, Integer size);
29 |
30 | /**
31 | * 根据 relation_id 分页查询历史聊天信息
32 | *
33 | * @param relationId 关联id
34 | * @param current 当前页
35 | * @param size 每页条数
36 | * @return 聊天信息集合
37 | */
38 | Map> getHisPageByRelationId(Long relationId, Integer current, Integer size);
39 |
40 | /**
41 | * 根据 account_id 集合批量查询聊天记录
42 | *
43 | * @param relationIds 会话列表
44 | * @return 聊天信息
45 | */
46 | Map> getMsgByRelationIds(List relationIds, Integer size);
47 |
48 |
49 | /**
50 | * 发送聊天信息
51 | *
52 | * @param msgDTO 聊天信息实体
53 | * @throws Throwable
54 | */
55 | void sendMsg(ChatMsgDTO msgDTO) throws Throwable;
56 |
57 | /**
58 | * 对方正在输入...
59 | *
60 | * @param fromId 发送方
61 | * @param toId 接收方
62 | */
63 | void writing(String fromId, String toId);
64 | }
65 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/service/QuickChatSessionService.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.service;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatSession;
5 | import com.quick.common.pojo.vo.ChatSessionVO;
6 |
7 | import java.util.List;
8 | import java.util.Map;
9 |
10 | /**
11 | *
12 | * 聊天会话(针对单聊) 服务类
13 | *
14 | *
15 | * @author 徐志斌
16 | * @since 2023-11-25
17 | */
18 | public interface QuickChatSessionService extends IService {
19 | /**
20 | * 查询会话列表
21 | *
22 | * @return 会话列表信息
23 | */
24 | List getSessionList();
25 |
26 | /**
27 | * 根据 sessionId 删除会话
28 | *
29 | * @param sessionId 会话主键id
30 | * @return 执行结果
31 | */
32 | void deleteSession(Long sessionId);
33 |
34 | /**
35 | * 更新最后会话读取时间
36 | *
37 | * @param sessionId 会话id
38 | * @return 执行结果
39 | */
40 | void updateReadTime(Long sessionId);
41 |
42 | /**
43 | * 获取会话未读数
44 | *
45 | * @param sessionList 会话列表
46 | * @return 未读数结果Map
47 | */
48 | Map getUnreadCountMap(List sessionList);
49 |
50 | /**
51 | * 查询会话信息
52 | *
53 | * @param fromId 发送方
54 | * @param toId 接收方
55 | * @return 会话信息
56 | */
57 | ChatSessionVO getByFromIdAndToId(String fromId, String toId);
58 |
59 | /**
60 | * 置顶会话
61 | *
62 | * @param sessionId
63 | * @return 执行结果
64 | */
65 | void topSession(Long sessionId);
66 |
67 | /**
68 | * 恢复会话信息
69 | *
70 | * @param toId 用户id
71 | * @return 执行结果
72 | */
73 | void activeSession(String toId);
74 | }
75 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/service/QuickUserService.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.service;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.dto.*;
5 | import com.quick.common.pojo.po.QuickChatUser;
6 | import com.quick.common.pojo.vo.ChatUserVO;
7 |
8 | import java.io.IOException;
9 | import java.util.Map;
10 |
11 | /**
12 | *
13 | * 服务类
14 | *
15 | *
16 | * @author 徐志斌
17 | * @since 2023-11-13
18 | */
19 | public interface QuickUserService extends IService {
20 | /**
21 | * 根据 account_id 查询用户信息
22 | *
23 | * @param accountId 账户id
24 | * @return 用户信息VO
25 | * @throws Exception
26 | */
27 | ChatUserVO getByAccountId(String accountId) throws Exception;
28 |
29 | /**
30 | * 账号注册
31 | *
32 | * @param registerDTO 注册表单DTO
33 | * @return 执行结果
34 | * @throws Exception
35 | */
36 | void register(RegisterFormDTO registerDTO) throws Exception;
37 |
38 | /**
39 | * 登录功能
40 | *
41 | * @param loginDTO 登录表单DTO
42 | * @return Token和账户信息
43 | * @throws Exception
44 | */
45 | Map login(LoginFormDTO loginDTO) throws Exception;
46 |
47 | /**
48 | * 图片验证码
49 | *
50 | * @throws IOException
51 | */
52 | void captcha() throws IOException;
53 |
54 | /**
55 | * 发送邮件
56 | *
57 | * @param emailDTO 邮件入参DTO
58 | * @return 执行结果
59 | * @throws Throwable
60 | */
61 | void sendEmail(EmailDTO emailDTO) throws Throwable;
62 |
63 | /**
64 | * 修改用户信息
65 | *
66 | * @param userDTO 修改表单DTO
67 | * @return 执行结果
68 | */
69 | void updateUser(UserInfoDTO userDTO);
70 |
71 | /**
72 | * 根据请求头Token解析用户信息
73 | *
74 | * @return 用户信息PO
75 | */
76 | QuickChatUser getByToken();
77 |
78 | /**
79 | * 用户找回密码
80 | *
81 | * @param findBackDTO 找回密码DTO
82 | * @return 执行结果
83 | * @throws Exception
84 | */
85 | void findBack(FindBackFormDTO findBackDTO) throws Exception;
86 |
87 | }
88 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/service/impl/QuickChatEmojiServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.service.impl;
2 |
3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
4 | import com.quick.api.mapper.QuickChatEmojiMapper;
5 | import com.quick.api.service.QuickChatEmojiService;
6 | import com.quick.api.store.QuickChatEmojiStore;
7 | import com.quick.common.adapter.EmojiAdapter;
8 | import com.quick.common.pojo.po.QuickChatEmoji;
9 | import com.quick.common.utils.RequestContextUtil;
10 | import org.springframework.beans.factory.annotation.Autowired;
11 | import org.springframework.stereotype.Service;
12 |
13 | import java.util.List;
14 |
15 | /**
16 | *
17 | * 表情包 服务实现类
18 | *
19 | *
20 | * @author 徐志斌
21 | * @since 2023-11-30
22 | */
23 | @Service
24 | public class QuickChatEmojiServiceImpl extends ServiceImpl implements QuickChatEmojiService {
25 | @Autowired
26 | private QuickChatEmojiStore emojiStore;
27 |
28 | @Override
29 | public List getEmojiList(String accountId) {
30 | return emojiStore.getEmojiList(accountId);
31 | }
32 |
33 | @Override
34 | public Boolean addEmoji(String url) {
35 | String accountId = (String) RequestContextUtil.getData(RequestContextUtil.ACCOUNT_ID);
36 | QuickChatEmoji chatEmoji = EmojiAdapter.buildEmojiPO(url, accountId);
37 | return emojiStore.saveEmoji(chatEmoji);
38 | }
39 |
40 | @Override
41 | public Boolean deleteEmoji(Long id) {
42 | String accountId = (String) RequestContextUtil.getData(RequestContextUtil.ACCOUNT_ID);
43 | return emojiStore.deleteByEmojiId(id, accountId);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/service/impl/QuickChatFileServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.service.impl;
2 |
3 | import com.quick.api.service.QuickChatFileService;
4 | import com.quick.common.strategy.file.AbstractFileStrategy;
5 | import com.quick.common.strategy.file.FileStrategyFactory;
6 | import org.springframework.stereotype.Service;
7 | import org.springframework.web.multipart.MultipartFile;
8 |
9 | import java.util.Map;
10 |
11 | /**
12 | *
13 | * 表情包 服务实现类
14 | *
15 | *
16 | * @author 徐志斌
17 | * @since 2024-04-04
18 | */
19 | @Service
20 | public class QuickChatFileServiceImpl implements QuickChatFileService {
21 | @Override
22 | public Map uploadFile(int type, MultipartFile file) throws Exception {
23 | AbstractFileStrategy fileStrategy = FileStrategyFactory.getStrategyHandler(type);
24 | return fileStrategy.uploadFile(file);
25 | }
26 |
27 | @Override
28 | public void downloadFile(int type, String url) {
29 | AbstractFileStrategy fileStrategy = FileStrategyFactory.getStrategyHandler(type);
30 | fileStrategy.downloadFile(url);
31 | }
32 |
33 | @Override
34 | public void deleteFile(int type, String url) throws Exception {
35 | AbstractFileStrategy fileStrategy = FileStrategyFactory.getStrategyHandler(type);
36 | fileStrategy.deleteFile(url);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/QuickChatApplyStore.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatApply;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | *
10 | * 好友/群聊申请 服务类
11 | *
12 | *
13 | * @author 徐志斌
14 | * @since 2024-03-12
15 | */
16 | public interface QuickChatApplyStore extends IService {
17 | /**
18 | * 保存申请信息
19 | *
20 | * @param apply 申请信息
21 | * @return 执行结果
22 | */
23 | Boolean saveApply(QuickChatApply apply);
24 |
25 | /**
26 | * 根据 to_id 查询申请列表
27 | *
28 | * @param toId 接收方
29 | * @return 申请列表
30 | */
31 | List getListByToId(String toId);
32 |
33 | /**
34 | * 修改申请状态
35 | *
36 | * @param applyId 申请id
37 | * @param toId 接收账号
38 | * @param status 状态
39 | * @return 执行结果
40 | */
41 | Boolean updateApplyStatus(Long applyId, String toId, Integer status);
42 |
43 | /**
44 | * 根据 申请id 删除申请记录
45 | *
46 | * @param applyId 申请id
47 | * @param toId 接收方账号
48 | * @return 执行结果
49 | */
50 | Boolean deleteByApplyId(Long applyId, String toId);
51 |
52 | /**
53 | * 根据 申请id 查询申请记录
54 | *
55 | * @param applyId 申请id
56 | * @return 申请记录
57 | */
58 | QuickChatApply getByApplyId(Long applyId);
59 |
60 | /**
61 | * 批量保存申请记录
62 | *
63 | * @param applyList 申请列表
64 | * @return
65 | */
66 | Boolean saveAll(List applyList);
67 |
68 | /**
69 | * 根据 apply_id 删除 Redis 缓存
70 | *
71 | * @param applyId 申请id
72 | */
73 | void deleteCacheByApplyId(Long applyId);
74 | }
75 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/QuickChatArchiveRecordStore.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatArchiveRecord;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | *
10 | * 服务类
11 | *
12 | *
13 | * @author 徐志斌
14 | * @since 2024-11-13
15 | */
16 | public interface QuickChatArchiveRecordStore extends IService {
17 | /**
18 | * 保存数据迁移记录
19 | *
20 | * @param record 迁移记录
21 | * @return 执行结果
22 | */
23 | Boolean saveArchiveRecord(QuickChatArchiveRecord record);
24 |
25 | /**
26 | * 修改迁移记录
27 | *
28 | * @param record 迁移记录
29 | * @return 执行结果
30 | */
31 | Boolean updateArchiveRecord(QuickChatArchiveRecord record);
32 |
33 | /**
34 | * 根据状态查询迁移记录
35 | *
36 | * @param status 状态
37 | * @return 迁移记录
38 | */
39 | List getListByStatus(Integer status);
40 | }
41 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/QuickChatContactStore.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatContact;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | *
10 | * 通讯录 服务类
11 | *
12 | *
13 | * @author 徐志斌
14 | * @since 2023-11-30
15 | */
16 | public interface QuickChatContactStore extends IService {
17 | /**
18 | * 根据 from_id 查询通讯录列表
19 | *
20 | * @param fromId 用户id
21 | * @return 通讯录列表
22 | */
23 | List getListByFromId(String fromId);
24 |
25 | /**
26 | * 根据 from_id to_id 查询好友信息
27 | *
28 | * @param fromId 账号id
29 | * @param toId 账号id
30 | * @return 通讯录信息
31 | */
32 | QuickChatContact getByFromIdAndToId(String fromId, String toId);
33 |
34 | /**
35 | * 根据 from_id to_id 删除好友信息
36 | *
37 | * @param fromId 账号id
38 | * @param toId 账号id
39 | * @return 执行结果
40 | */
41 | Boolean deleteByFromIdAndToId(String fromId, String toId);
42 |
43 | /**
44 | * 保存通讯录
45 | *
46 | * @param contact 通讯录信息
47 | * @return 执行结果
48 | */
49 | Boolean saveContact(QuickChatContact contact);
50 |
51 | /**
52 | * 批量保存通讯录
53 | *
54 | * @param contacts 通讯录列表
55 | * @return 执行结果
56 | */
57 | Boolean saveContactList(List contacts);
58 |
59 | /**
60 | * 修改通讯录
61 | *
62 | * @param friendPO 通讯录实体
63 | * @return 执行结果
64 | */
65 | Boolean updateContact(QuickChatContact friendPO);
66 |
67 | /**
68 | * 删除 Redis 缓存
69 | *
70 | * @param fromId 账号id
71 | * @param toId 账号id
72 | */
73 | void deleteCacheByFromIdAndToId(String fromId, String toId);
74 | }
75 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/QuickChatEmojiStore.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatEmoji;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | *
10 | * 表情包 服务类
11 | *
12 | *
13 | * @author 徐志斌
14 | * @since 2023-11-30
15 | */
16 | public interface QuickChatEmojiStore extends IService {
17 | /**
18 | * 根据 account_id 查询表情包列表
19 | *
20 | * @param accountId 账号id
21 | * @return 表情包List
22 | */
23 | List getEmojiList(String accountId);
24 |
25 | /**
26 | * 保存表情包
27 | *
28 | * @param chatEmoji 表情包实体
29 | * @return 执行结果
30 | */
31 | Boolean saveEmoji(QuickChatEmoji chatEmoji);
32 |
33 | /**
34 | * 删除表情包
35 | *
36 | * @param emojiId 表情包id
37 | * @param accountId 账户id
38 | * @return 执行结果
39 | */
40 | Boolean deleteByEmojiId(Long emojiId, String accountId);
41 | }
42 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/QuickChatGroupMemberStore.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatGroupMember;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | *
10 | * 群成员 服务类
11 | *
12 | *
13 | * @author 徐志斌
14 | * @since 2024-01-08
15 | */
16 | public interface QuickChatGroupMemberStore extends IService {
17 |
18 | /**
19 | * 根据 group_id 查询群成员列表
20 | *
21 | * @param groupId 群聊id
22 | * @return 群成员列表
23 | */
24 | List getListByGroupId(Long groupId);
25 |
26 | /**
27 | * 进入群聊
28 | *
29 | * @param memberPO 群成员信息
30 | * @return 执行结果
31 | */
32 | Boolean saveMember(QuickChatGroupMember memberPO);
33 |
34 | /**
35 | * 根据 group_id account_id 移出群聊
36 | *
37 | * @param groupId 群聊id
38 | * @param accountId 账号id
39 | * @return 执行结果
40 | */
41 | Boolean deleteByGroupIdAndAccountId(Long groupId, String accountId);
42 |
43 | /**
44 | * 查询成员否在群中
45 | *
46 | * @param groupId 群组id
47 | * @param accountId 账户id
48 | * @return 群成员信息
49 | */
50 | QuickChatGroupMember getMemberByAccountId(Long groupId, String accountId);
51 |
52 | /**
53 | * 根据 groupId,accountIdList 查询成员
54 | *
55 | * @param groupId 群id
56 | * @param accountIdList 成员id列表
57 | * @return
58 | */
59 | List getGroupMemberByAccountIdList(Long groupId, List accountIdList);
60 | }
61 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/QuickChatGroupStore.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatGroup;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | *
10 | * 群聊 服务类
11 | *
12 | *
13 | * @author 徐志斌
14 | * @since 2024-01-08
15 | */
16 | public interface QuickChatGroupStore extends IService {
17 | /**
18 | * 根据 group_id 查询
19 | *
20 | * @param groupId 群组id
21 | * @return 群组信息
22 | */
23 | QuickChatGroup getByGroupId(Long groupId);
24 |
25 | /**
26 | * 修改群组信息
27 | *
28 | * @param group 群组信息
29 | * @return 执行结果
30 | */
31 | Boolean updateInfo(QuickChatGroup group);
32 |
33 | /**
34 | * 根据 group_id 列表批量查询群组信息列表
35 | *
36 | * @param groupIds 群组id列表
37 | * @return 群组信息列表
38 | */
39 | List getListByGroupIds(List groupIds);
40 |
41 | /**
42 | * 根据 group_id 解散群聊
43 | *
44 | * @param groupId 群组id
45 | * @return 执行结果
46 | */
47 | Boolean dismissByGroupId(Long groupId);
48 |
49 | /**
50 | * 创建群聊
51 | *
52 | * @param groupPO 群聊信息实体
53 | * @return 执行结果
54 | */
55 | Boolean saveGroup(QuickChatGroup groupPO);
56 | }
57 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/QuickChatMsgStore.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store;
2 |
3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
4 | import com.baomidou.mybatisplus.extension.service.IService;
5 | import com.quick.common.pojo.po.QuickChatMsg;
6 |
7 | import java.time.LocalDateTime;
8 | import java.util.List;
9 |
10 | /**
11 | *
12 | * 聊天信息 服务类
13 | *
14 | *
15 | * @author 徐志斌
16 | * @since 2023-11-25
17 | */
18 | public interface QuickChatMsgStore extends IService {
19 | /**
20 | * 保存聊天消息
21 | *
22 | * @param chatMsg 消息实体
23 | * @return 执行结果
24 | */
25 | Boolean saveMsg(QuickChatMsg chatMsg);
26 |
27 | /**
28 | * 根据 relation_id 分页查询聊天信息
29 | *
30 | * @param relationId 关联id
31 | * @param current 起始页
32 | * @param size 每页条数
33 | * @return 聊天信息结果
34 | */
35 | Page getPageByRelationId(Long relationId, Integer current, Integer size);
36 |
37 | /**
38 | * 根据 relation_id集合 查询聊天信息
39 | *
40 | * @param relationIds relation_id集合
41 | * @param size 数据条数
42 | * @return 聊天信息列表
43 | */
44 | List getByRelationIds(List relationIds, Integer size);
45 |
46 | /**
47 | * 根据 msg_id 查询单条聊天信息
48 | *
49 | * @param msgId 消息id
50 | * @return 消息实体
51 | */
52 | QuickChatMsg getByMsgId(Long msgId);
53 |
54 | /**
55 | * 根据 msg_id 修改聊天信息
56 | *
57 | * @param chatMsg 消息实体
58 | * @return 执行结果
59 | */
60 | Boolean updateByMsgId(QuickChatMsg chatMsg);
61 |
62 | /**
63 | * 获取消息未读数量
64 | *
65 | * @param loginAccountId 登录账号id
66 | * @param relationId 关联id
67 | * @param lastReadTime 上次已读时间
68 | * @return 未读数量
69 | */
70 | Long getUnreadCount(String loginAccountId, Long relationId, LocalDateTime lastReadTime);
71 |
72 | /**
73 | * 根据时间范围,查询聊天信息
74 | *
75 | * @param startTime 开始时间
76 | * @param endTime 结束时间
77 | * @return 聊天信息列表
78 | */
79 | List getMsgByTime(LocalDateTime startTime, LocalDateTime endTime);
80 |
81 | /**
82 | * 物理删除聊天消息(数据迁移使用)
83 | *
84 | * @param ids 聊天信息id列表
85 | * @return 执行结果
86 | */
87 | Boolean deleteNoLogicMsgListByIds(List ids);
88 | }
89 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/QuickChatUserStore.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store;
2 |
3 | import com.baomidou.mybatisplus.extension.service.IService;
4 | import com.quick.common.pojo.po.QuickChatUser;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | *
10 | * 服务类
11 | *
12 | *
13 | * @author 徐志斌
14 | * @since 2023-11-13
15 | */
16 | public interface QuickChatUserStore extends IService {
17 | /**
18 | * 根据 account_id 查询用户信息
19 | *
20 | * @param accountId 账户id
21 | * @return 用户信息
22 | */
23 | QuickChatUser getByAccountId(String accountId);
24 |
25 | /**
26 | * 保存用户信息
27 | *
28 | * @param userPO 用户信息
29 | * @return 执行结果
30 | */
31 | Boolean saveUser(QuickChatUser userPO);
32 |
33 | /**
34 | * 根据 account_id 列表查询用户列表
35 | *
36 | * @param accountIds account_id列表
37 | * @return 用户列表
38 | */
39 | List getListByAccountIds(List accountIds);
40 |
41 | /**
42 | * 修改用户信息
43 | *
44 | * @param userPO 用户信息
45 | * @return 执行结果
46 | */
47 | Boolean updateUserById(QuickChatUser userPO);
48 |
49 | /**
50 | * 根据 email 查询用户信息
51 | * @param email
52 | * @return
53 | */
54 | QuickChatUser getByEmail(String email);
55 | }
56 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/doris/QuickChatMsgDorisStore.java:
--------------------------------------------------------------------------------
1 | //package com.quick.store.doris;
2 | //
3 | //import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
4 | //import com.baomidou.mybatisplus.extension.service.IService;
5 | //import com.quick.pojo.po.QuickChatMsg;
6 | //
7 | //import java.util.List;
8 | //
9 | ///**
10 | // *
11 | // * 聊天信息 服务类
12 | // *
13 | // *
14 | // * @author 徐志斌
15 | // * @since 2024-11-06
16 | // */
17 | //public interface QuickChatMsgDorisStore extends IService {
18 | // /**
19 | // * 批量保存聊天记录
20 | // *
21 | // * @param msgList 消息列表
22 | // * @return 执行结果
23 | // */
24 | // Boolean saveBatchMsg(List msgList);
25 | //
26 | //
27 | // /**
28 | // * 根据 relation_id 分页查询聊天记录
29 | // *
30 | // * @param relationId 关联id
31 | // * @param current 当前页
32 | // * @param size 每页条数
33 | // * @return 分页聊天记录
34 | // */
35 | // Page getHisPageByRelationId(Long relationId, Integer current, Integer size);
36 | //}
37 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/doris/impl/QuickChatMsgDorisStoreImpl.java:
--------------------------------------------------------------------------------
1 | //package com.quick.store.doris.impl;
2 | //
3 | //import com.baomidou.dynamic.datasource.annotation.DS;
4 | //import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
5 | //import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
6 | //import com.quick.mapper.QuickChatMsgDorisMapper;
7 | //import com.quick.mapper.QuickChatMsgMapper;
8 | //import com.quick.pojo.po.QuickChatMsg;
9 | //import com.quick.store.doris.QuickChatMsgDorisStore;
10 | //import org.springframework.stereotype.Service;
11 | //
12 | //import java.util.List;
13 | //
14 | ///**
15 | // *
16 | // * 聊天信息 服务实现类
17 | // *
18 | // *
19 | // * @author 徐志斌
20 | // * @since 2024-11-06
21 | // */
22 | //@Service
23 | //@DS("doris")
24 | //public class QuickChatMsgDorisStoreImpl extends ServiceImpl implements QuickChatMsgDorisStore {
25 | // @Override
26 | // public Boolean saveBatchMsg(List msgList) {
27 | // return this.saveBatch(msgList);
28 | // }
29 | //
30 | // @Override
31 | // public Page getHisPageByRelationId(Long relationId, Integer current, Integer size) {
32 | // return null;
33 | // }
34 | //}
35 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/impl/QuickChatArchiveRecordStoreImpl.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store.impl;
2 |
3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
4 | import com.quick.api.mapper.QuickChatArchiveRecordMapper;
5 | import com.quick.api.store.QuickChatArchiveRecordStore;
6 | import com.quick.common.pojo.po.QuickChatArchiveRecord;
7 | import org.springframework.stereotype.Service;
8 |
9 | import java.util.List;
10 |
11 | /**
12 | *
13 | * 服务实现类
14 | *
15 | *
16 | * @author 徐志斌
17 | * @since 2024-11-13
18 | */
19 | @Service
20 | public class QuickChatArchiveRecordStoreImpl extends ServiceImpl implements QuickChatArchiveRecordStore {
21 | @Override
22 | public Boolean saveArchiveRecord(QuickChatArchiveRecord record) {
23 | return this.save(record);
24 | }
25 |
26 | @Override
27 | public Boolean updateArchiveRecord(QuickChatArchiveRecord record) {
28 | return this.updateById(record);
29 | }
30 |
31 | @Override
32 | public List getListByStatus(Integer status) {
33 | return this.lambdaQuery()
34 | .eq(QuickChatArchiveRecord::getStatus, status)
35 | .list();
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/impl/QuickChatEmojiStoreImpl.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store.impl;
2 |
3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
4 | import com.quick.api.mapper.QuickChatEmojiMapper;
5 | import com.quick.common.pojo.po.QuickChatEmoji;
6 | import com.quick.api.store.QuickChatEmojiStore;
7 | import org.springframework.stereotype.Service;
8 |
9 | import java.util.List;
10 |
11 | /**
12 | *
13 | * 表情包 服务实现类
14 | *
15 | *
16 | * @author 徐志斌
17 | * @since 2023-11-30
18 | */
19 | @Service
20 | public class QuickChatEmojiStoreImpl extends ServiceImpl implements QuickChatEmojiStore {
21 | @Override
22 | public List getEmojiList(String accountId) {
23 | return this.lambdaQuery()
24 | .eq(QuickChatEmoji::getAccountId, accountId)
25 | .list();
26 | }
27 |
28 | @Override
29 | public Boolean saveEmoji(QuickChatEmoji chatEmoji) {
30 | return this.save(chatEmoji);
31 | }
32 |
33 | @Override
34 | public Boolean deleteByEmojiId(Long emojiId, String accountId) {
35 | return this.removeById(emojiId);
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/impl/QuickChatGroupStoreImpl.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store.impl;
2 |
3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
4 | import com.quick.api.mapper.QuickChatGroupMapper;
5 | import com.quick.common.constant.RedisConstant;
6 | import com.quick.common.pojo.po.QuickChatGroup;
7 | import com.quick.api.store.QuickChatGroupStore;
8 | import org.springframework.cache.annotation.CacheEvict;
9 | import org.springframework.cache.annotation.Cacheable;
10 | import org.springframework.cache.annotation.Caching;
11 | import org.springframework.stereotype.Service;
12 |
13 | import java.util.List;
14 |
15 | /**
16 | *
17 | * 群聊 服务实现类
18 | *
19 | *
20 | * @author 徐志斌
21 | * @since 2024-01-08
22 | */
23 | @Service
24 | public class QuickChatGroupStoreImpl extends ServiceImpl implements QuickChatGroupStore {
25 | @Override
26 | @Cacheable(value = RedisConstant.QUICK_CHAT_GROUP, key = "'getByGroupId:' + #p0", unless = "#result == null")
27 | public QuickChatGroup getByGroupId(Long groupId) {
28 | return this.getById(groupId);
29 | }
30 |
31 | @Override
32 | @Caching(evict = {
33 | @CacheEvict(value = RedisConstant.QUICK_CHAT_GROUP, key = "'getByGroupId:' + p0.id")
34 | })
35 | public Boolean updateInfo(QuickChatGroup chatGroup) {
36 | return this.updateById(chatGroup);
37 | }
38 |
39 | @Override
40 | public List getListByGroupIds(List groupIds) {
41 | return this.lambdaQuery()
42 | .in(QuickChatGroup::getId, groupIds)
43 | .list();
44 | }
45 |
46 | @Override
47 | @Caching(evict = {
48 | @CacheEvict(value = RedisConstant.QUICK_CHAT_GROUP, key = "'getByGroupId:' + p0")
49 | })
50 | public Boolean dismissByGroupId(Long groupId) {
51 | return this.lambdaUpdate()
52 | .eq(QuickChatGroup::getId, groupId)
53 | .remove();
54 | }
55 |
56 | @Override
57 | public Boolean saveGroup(QuickChatGroup groupPO) {
58 | return this.save(groupPO);
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/api/store/impl/QuickChatUserStoreImpl.java:
--------------------------------------------------------------------------------
1 | package com.quick.api.store.impl;
2 |
3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
4 | import com.quick.api.mapper.QuickChatUserMapper;
5 | import com.quick.common.constant.RedisConstant;
6 | import com.quick.common.pojo.po.QuickChatUser;
7 | import com.quick.api.store.QuickChatUserStore;
8 | import org.springframework.cache.annotation.CacheEvict;
9 | import org.springframework.cache.annotation.Cacheable;
10 | import org.springframework.cache.annotation.Caching;
11 | import org.springframework.stereotype.Service;
12 |
13 | import java.util.List;
14 |
15 | /**
16 | *
17 | * 服务实现类
18 | *
19 | *
20 | * @author 徐志斌
21 | * @since 2023-11-13
22 | */
23 | @Service
24 | public class QuickChatUserStoreImpl extends ServiceImpl implements QuickChatUserStore {
25 | @Override
26 | @Cacheable(value = RedisConstant.QUICK_CHAT_USER, key = "'getByAccountId:' + #p0", unless = "#result == null")
27 | public QuickChatUser getByAccountId(String accountId) {
28 | return this.lambdaQuery()
29 | .eq(QuickChatUser::getAccountId, accountId)
30 | .one();
31 | }
32 |
33 | @Override
34 | public List getListByAccountIds(List accountIds) {
35 | return this.lambdaQuery()
36 | .in(QuickChatUser::getAccountId, accountIds)
37 | .list();
38 | }
39 |
40 | @Override
41 | public Boolean saveUser(QuickChatUser userPO) {
42 | return this.save(userPO);
43 | }
44 |
45 | @Override
46 | @Caching(evict = {
47 | @CacheEvict(value = RedisConstant.QUICK_CHAT_USER, key = "'getByEmail:' + #p0.accountId"),
48 | @CacheEvict(value = RedisConstant.QUICK_CHAT_USER, key = "'getByAccountId:' + #p0.email")
49 | })
50 | public Boolean updateUserById(QuickChatUser userPO) {
51 | return this.updateById(userPO);
52 | }
53 |
54 | @Override
55 | @Cacheable(value = RedisConstant.QUICK_CHAT_USER, key = "'getByEmail:' + #p0", unless = "#result == null")
56 | public QuickChatUser getByEmail(String email) {
57 | return this.lambdaQuery()
58 | .eq(QuickChatUser::getEmail, email)
59 | .one();
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/common/adapter/ApplyAdapter.java:
--------------------------------------------------------------------------------
1 | package com.quick.common.adapter;
2 |
3 | import com.quick.common.pojo.po.QuickChatApply;
4 |
5 | /**
6 | * @Author: 徐志斌
7 | * @CreateTime: 2024-07-05 13:35
8 | * @Description: 好友/群聊申请适配器
9 | * @Version: 1.0
10 | */
11 | public class ApplyAdapter {
12 | public static QuickChatApply buildFriendApplyPO(String fromId, String toId,
13 | String applyInfo, Integer type,
14 | Long groupId, Integer status) {
15 | QuickChatApply apply = new QuickChatApply();
16 | apply.setFromId(fromId);
17 | apply.setToId(toId);
18 | apply.setApplyInfo(applyInfo);
19 | apply.setType(type);
20 | apply.setGroupId(groupId);
21 | apply.setStatus(status);
22 | return apply;
23 | }
24 |
25 | public static QuickChatApply buildFriendApplyPO(String fromId, String toId,
26 | String applyInfo, Integer type, Integer status) {
27 | QuickChatApply apply = new QuickChatApply();
28 | apply.setFromId(fromId);
29 | apply.setToId(toId);
30 | apply.setApplyInfo(applyInfo);
31 | apply.setType(type);
32 | apply.setStatus(status);
33 | return apply;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/common/adapter/ContactAdapter.java:
--------------------------------------------------------------------------------
1 | package com.quick.common.adapter;
2 |
3 | import com.quick.common.pojo.po.QuickChatContact;
4 |
5 | /**
6 | * @Author: 徐志斌
7 | * @CreateTime: 2024-07-08 10:20
8 | * @Description: 通讯录-适配器
9 | * @Version: 1.0
10 | */
11 | public class ContactAdapter {
12 |
13 | public static QuickChatContact buildContactPO(String accountId, Long groupId, Integer type, String noteName) {
14 | QuickChatContact contact = new QuickChatContact();
15 | contact.setFromId(accountId);
16 | contact.setToId(groupId.toString());
17 | contact.setType(type);
18 | contact.setNoteName(noteName);
19 | return contact;
20 | }
21 |
22 | public static QuickChatContact buildContactPO(String accountId, Long groupId, Integer type) {
23 | QuickChatContact contact = new QuickChatContact();
24 | contact.setFromId(accountId);
25 | contact.setToId(groupId.toString());
26 | contact.setType(type);
27 | return contact;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/common/adapter/EmojiAdapter.java:
--------------------------------------------------------------------------------
1 | package com.quick.common.adapter;
2 |
3 | import com.quick.common.pojo.po.QuickChatEmoji;
4 |
5 | /**
6 | * @Author: 徐志斌
7 | * @CreateTime: 2023-12-01 09:18
8 | * @Description: 表情包适配器
9 | * @Version: 1.0
10 | */
11 | public class EmojiAdapter {
12 |
13 | public static QuickChatEmoji buildEmojiPO(String url, String accountId) {
14 | QuickChatEmoji chatEmoji = new QuickChatEmoji();
15 | chatEmoji.setAccountId(accountId);
16 | chatEmoji.setUrl(url);
17 | return chatEmoji;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/common/adapter/FileExtraAdapter.java:
--------------------------------------------------------------------------------
1 | package com.quick.common.adapter;
2 |
3 | import com.quick.common.pojo.dto.FileExtraDTO;
4 |
5 | /**
6 | * @Author 徐志斌
7 | * @Date: 2024/4/4 15:42
8 | * @Version 1.0
9 | * @Description: 文件信息适配器
10 | */
11 | public class FileExtraAdapter {
12 |
13 | public static FileExtraDTO buildFileExtraPO(String fileName, long size) {
14 | FileExtraDTO extraDTO = new FileExtraDTO();
15 | extraDTO.setName(fileName);
16 | extraDTO.setSize(size);
17 | return extraDTO;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/common/adapter/GroupAdapter.java:
--------------------------------------------------------------------------------
1 | package com.quick.common.adapter;
2 |
3 | import com.quick.common.pojo.dto.GroupDTO;
4 | import com.quick.common.pojo.po.QuickChatGroup;
5 |
6 | /**
7 | * @Author 徐志斌
8 | * @Date: 2024/5/25 8:29
9 | * @Version 1.0
10 | * @Description: 群组适配器
11 | */
12 | public class GroupAdapter {
13 | public static QuickChatGroup buildGroupPO(GroupDTO groupDTO) {
14 | QuickChatGroup group = new QuickChatGroup();
15 | group.setAccountId(groupDTO.getAccountId());
16 | group.setGroupName(groupDTO.getGroupName());
17 | return group;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/common/adapter/GroupMemberAdapter.java:
--------------------------------------------------------------------------------
1 | package com.quick.common.adapter;
2 |
3 | import com.quick.common.pojo.po.QuickChatGroupMember;
4 |
5 | /**
6 | * @Author 徐志斌
7 | * @Date: 2024/1/8 21:22
8 | * @Version 1.0
9 | * @Description: 群成员适配器
10 | */
11 | public class GroupMemberAdapter {
12 | public static QuickChatGroupMember buildMemberPO(Long groupId, String accountId) {
13 | QuickChatGroupMember groupMember = new QuickChatGroupMember();
14 | groupMember.setGroupId(groupId);
15 | groupMember.setAccountId(accountId);
16 | return groupMember;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/common/annotation/RateLimiter.java:
--------------------------------------------------------------------------------
1 | package com.quick.common.annotation;
2 |
3 | import com.quick.common.enums.LimitTypeEnum;
4 |
5 | import java.lang.annotation.*;
6 |
7 | /**
8 | * @Author 徐志斌
9 | * @Date: 2024/2/14 20:40
10 | * @Version 1.0
11 | * @Description: 限流注解
12 | */
13 | @Target(ElementType.METHOD)
14 | @Retention(RetentionPolicy.RUNTIME)
15 | @Documented
16 | public @interface RateLimiter {
17 | /**
18 | * 限流 KEY
19 | */
20 | String key() default "rate_limit:";
21 |
22 | /**
23 | * 限流时间,单位秒
24 | */
25 | int time() default 60;
26 |
27 | /**
28 | * 请求次数
29 | */
30 | int count() default 100;
31 |
32 | /**
33 | * 限流类型
34 | */
35 | LimitTypeEnum limitType() default LimitTypeEnum.DEFAULT;
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/src/main/java/com/quick/common/aspect/WebLogAspect.java:
--------------------------------------------------------------------------------
1 | package com.quick.common.aspect;
2 |
3 | import cn.hutool.core.date.StopWatch;
4 | import com.quick.common.utils.HttpServletUtil;
5 | import lombok.extern.slf4j.Slf4j;
6 | import org.aspectj.lang.ProceedingJoinPoint;
7 | import org.aspectj.lang.annotation.Around;
8 | import org.aspectj.lang.annotation.Aspect;
9 | import org.springframework.stereotype.Component;
10 |
11 | import javax.servlet.ServletRequest;
12 | import javax.servlet.ServletResponse;
13 | import javax.servlet.http.HttpServletRequest;
14 | import java.util.List;
15 | import java.util.stream.Collectors;
16 | import java.util.stream.Stream;
17 |
18 | /**
19 | * @Author: 徐志斌
20 | * @CreateTime: 2023-09-13 16:22
21 | * @Description: 统计接口调用日志
22 | * @Version: 1.0
23 | */
24 | @Slf4j
25 | @Aspect
26 | @Component
27 | public class WebLogAspect {
28 | @Around("execution(* com.quick.api.controller..*.*(..))")
29 | public Object saveLog(ProceedingJoinPoint joinPoint) throws Throwable {
30 | HttpServletRequest request = HttpServletUtil.getRequest();
31 | String method = request.getMethod();
32 | String uri = request.getRequestURI();
33 |
34 | List