Coder Social home page Coder Social logo

evansy / mallchatweb Goto Github PK

View Code? Open in Web Editor NEW
1.0K 12.0 458.0 3 MB

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

Home Page: https://mallchat.cn

License: Apache License 2.0

JavaScript 1.27% HTML 0.18% Vue 37.97% CSS 2.23% TypeScript 43.07% SCSS 15.15% Shell 0.13%
chat mall mallchat

mallchatweb's Introduction

MallChat-抹茶

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

项目导航

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

项目介绍

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

项目演示

项目启动及部署

  • 环境: node 16.18+, 包管理工具 pnpm (安装完 node 执行 npm i pnpm -g 即可);
  • 安装依赖: clone 工程之后,执行 pnpm i
    • npm 安装报错, 命令后加参数 npm i --ignore-scripts 忽略 scripts 相关依赖即可解决 p9211Ag.png
    • 推荐使用 pnpm, 安装依赖不会有 因为网络而失败 的问题
  • 启动: 按 F5 即可自动执行 pnpm run dev 并且打开浏览器
  • 部署
    • 部署到本地:执行 pnpm build 构建完成后把 dist 文件夹 放到服务器,并配置 nginx 即可
    • 自动 CI/CD:通过 github actions 在代码提交到 GitHub 之后自动构建并部署到服务器, 详细参考可查看 deploy.yml

C 端项目

p92nKne.png

技术选型

前端技术

技术 说明 官网
Vue3 前端流行开发框架 https://cn.vuejs.org
Pinia vue3 官方推荐状态管理框架 https://pinia.vuejs.org
vue-router Vue 的官方路由 https://router.vuejs.org
TypeScript 让 JS 具备类型声明 https://www.typescriptlang.org/
Element Plus 缓基于 vue3 的组件库 https://element-plus.gitee.io
Alova 轻量级的请求策略库,用起来负担比 axios 小 https://alova.js.org/
vite 极速的前端打包构建工具 https://cn.vitejs.dev
pnpm 速度快、节省磁盘空间的软件包管理器 https://www.pnpm.cn

后端技术

MallChat

后端环境搭建

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

项目文档

保姆级教学路线,环境搭建、核心功能、性能优化、埋点上报、问题记录、项目亮点一个不落。点击 项目文档

更多有趣功能在持续更新中。。。

p92Qa2q.png

star 趋势图

Stargazers over time

贡献

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

前端:

后端:

优秀贡献者:

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

公众号

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

p9211Ag.png

mallchatweb's People

Contributors

14kay avatar arsize avatar auyuhui avatar czh1998yr avatar elloit333 avatar essentric avatar evansy avatar kkuil avatar li-junpeng avatar neper98 avatar nightminggit avatar oljc avatar sunzsh avatar wangwenke95 avatar xyqfei avatar yangfei1929 avatar zongzibinbin avatar

Stargazers

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

Watchers

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

mallchatweb's Issues

[Bug]: 换行需要按两次快捷键,才能起到一次换行的作用

BUG 描述
在当前行的最后面通过 shift + enter 快捷键换行时,需要按两次换行键,才能起到换行的作用,当光标在文字的中间或者当前行为空时,没有这个问题,按一次换行即可生成一个新行

预期效果
按一次 shift + enter ,文字即可换行

信息

  • 系统: [e.g. iOS] macos
  • 系统版本: [e.g. iOS 16.3] 12.5.1
  • 浏览器: [e.g. chrome 62] chrome 115

[Bug]: 聊天列表徽章文字显示到了聊天窗口外

BUG 描述
在聊天窗口下鼠标移动到徽章上的时候,滑动鼠标轮,会发现徽章文字顺着滑动移动到了窗口外。
image

预期效果
当徽章滑出窗口时,徽章文字隐藏。

信息

  • 系统: [e.g. win]
  • 系统版本: [e.g. win 10]
  • 浏览器: [e.g. chrome 114.0.5735.199]

[Bug]: 链接类消息导致XSS问题

BUG 描述
当消息里存在url的情况下服务器会解析url标题并返回前段渲染

前端在渲染的时候使用了v-html并未过滤会导致XSS

const clean = DOMPurify.sanitize(props.text, { ALLOWED_TAGS: [], ALLOWED_ATTR: [] })
// 再替换标签,保证用户输入的内容是干净的
let result = clean
for (const [url, title] of Object.entries(props.urlMap)) {
result = result?.replace(
url,
`<a rel="noopener noreferrer nofollow" target="_blank" class="msg-content-link" style="color: ${
props.isMe ? '#fff' : 'var(--color-primary)'
};" href="${url.includes('http') ? url : `//${url}`}">${title}</a>`,
)
}
return <div v-html={result} />

处理逻辑先过滤了原始消息内容,然后进行链接的render,但url标题是可控的

临时修复方案

import { defineComponent } from 'vue'
import DOMPurify from 'dompurify'

const sanitize = (text: string) => DOMPurify.sanitize(text, { ALLOWED_TAGS: [], ALLOWED_ATTR: [] })

export default defineComponent({
  props: ['urlMap', 'text', 'isMe'],
  setup(props) {
    return () => {
      if (!props.urlMap || Object.keys(props.urlMap).length === 0) return props.text

      // 先过滤所有标签
      let result = sanitize(props.text)

      // 再替换标签,保证用户输入的内容是干净的
      for (const [url, title] of Object.entries(props.urlMap)) {
        result = result?.replace(
          url,
          `<a rel="noopener noreferrer nofollow" target="_blank" class="msg-content-link" style="color: ${
            props.isMe ? '#fff' : 'var(--color-primary)'
          };" href="${url.includes('http') ? url : `//${url}`}">${sanitize(title)}</a>`,
        )
      }
      return <div v-html={result} />
    }
  },
})

此方法也是可以被bypass的,完全安全需要修改render方式,不使用v-html

[Bug]: 艾特功能,无法自动弹出用户列表

BUG 描述
手动在输入框内输入 "@" 字符后,能自动弹出用户列表,但是点击表情右边的"@"按钮时,无法自动弹出用户列表

预期效果
能自动弹出用户列表

信息

  • 系统: [e.g. Windows 11]
  • 系统版本: [e.g. 11]
  • 浏览器: [e.g. chrome 114.0.5735.199]

[Bug]: 加载更多消息后,虚拟列表定位到加载时的那条消息位置有误差。

BUG 描述
加载更多消息后,定位到加载时的那条消息位置有误差。

预期效果
加载更多消息完成后,消息准确定位到加载时的那条消息

信息

  • 系统: [iOS]
  • 系统版本: [iOS 12.1]
  • 浏览器: [chrome 114.0.5735.106(正式版本) (arm64)]

bug视频
https://github.com/Evansy/MallChatWeb/assets/23380976/8deff4f1-e0bb-4494-af7b-3c2c9c2df548

问题初步分析:

// 到顶部时触发函数 记录旧的滚动高度,加载更多消息后滚动回加载时那条消息的位置
const onTotop = throttle(async () => {
const oldScrollTop = virtualListRef.value.getScrollSize()
await chatStore.loadMore()
nextTick(() => {
const newScrollTop = virtualListRef.value.getScrollSize() - oldScrollTop
virtualListRef.value.scrollToOffset(newScrollTop)
})
}, 1600)

当触顶事件onToTop事件内计算得出的newScrollTop都没有问题,但是

virtualListRef.value.scrollToOffset(newScrollTop)

会导致虚拟列表scrollHeight改变,从而使定位出现误差。

以下是验证代码

const onTotop = throttle(async () => {
  const oldScrollTop = virtualListRef.value.getScrollSize()
  await chatStore.loadMore()
  nextTick(() => {
    const scrollHeight1 = virtualListRef.value.getScrollSize()
    console.log(scrollHeight1)
    const newScrollTop = virtualListRef.value.getScrollSize() - oldScrollTop
    virtualListRef.value.scrollToOffset(newScrollTop)
  }).then(() => {
    nextTick(() => {
      setTimeout(() => {
        const scrollHeight2 = virtualListRef.value.getScrollSize()
        console.log(scrollHeight2)
      }, 1000)
    })
  })
}, 1600)```

结果发现 scrollHeight1  scrollHeight2 并不相等。


[Topic]: 快来参与领任务吧~,如果你想提 Issue 参与开源 PR,请先点我

如果您想参与 PR,或者想提 issue

请先务必看看这里 https://github.com/users/Evansy/projects/1,
看看 Todo 面板中,是否有人已经领取了相关任务并且在做了;

如果你有新的想法🤔
可以在下面留言,可以根据大家的点赞或者内部讨论流入 Todo;

如何参与
如果 Project 里面的 Bug/Feature 你也想参与进来改动,可以在下方留言,我给你添加 Project 权限,你就可以领任务啦~


非常感谢大家的关注和参与~

[Feature]: unplugin-auto-import包的使用疑问🤔️

看到项目使用unplugin-auto-import,这个可以帮助开发者API自动导入~

见到已配置好ElementPlus 但是并没有对Vue全家桶进行一个配置 配置好就不需要在手动导入vue一系列api,多处文件还是手动形式导入

// 配置前
import { computed, ref } from 'vue'
const count = ref(0)
const doubled = computed(() => count.value * 2)
// 配置后
const count = ref(0)
const doubled = computed(() => count.value * 2)

还是说有其他想法作考虑

[Feature]: 支持移动端

想法内容
简洁而清晰的描述 您想改进的地方.
如果能支持移动端的话,就更好了。现在移动端浏览器打开这个网站,样式乱了

[Bug]: url点击无法跳转

BUG 描述
如果url没有携带http或者https的协议,前端能够识别url,但是无法匹配。

预期效果
对于没有协议的url,前端可以根据判断是否含有http,没有默认加上http://前缀,这样即可跳转

信息

  • 系统: [e.g. iOS]
  • 系统版本: [e.g. iOS 16.3]
  • 浏览器: [e.g. chrome 62]

[Bug]: 聊天记录滚动bug

BUG 描述
打开页面后有几率聊天记录往上滚动不了,页面会自动往下滚动,抢手动滚动的操作.但是一旦按F12后就恢复正常了
bug录屏:20230608135159.webm

预期效果
解决页面自动抢“往下滚动的操作”.

信息

  • 系统: [MacOS]
  • 系统版本: [MacOs 13.4]
  • 浏览器: [Chrome 113.0.5672.126(正式版本) (arm64)]

[Bug]: “@”功能有些问题

BUG 描述
“@”功能有些问题,具体表现已经录屏了。

信息

  • 系统: [e.g. iOS]
  • 系统版本: [e.g. iOS 16.3]
  • 浏览器: [e.g. chrome 62]
  • Microsoft​ Edge 2024-05-30
MallChat.-.-.Microsoft.Edge.2024-05-30.mp4

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

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

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.