上图是本项目用到的所有技术栈
这个项目分为四端(前端)
- App(只做安卓不上架) 技术栈
ReactNative
TS
Socket.io
scss
- 桌面端(只做Win) 技术栈
Electron
TS
Vue3
Socket.io
- web端技术栈
Vue3
TS
ElementPlus
Day.js
Unocss
Vite
Axios
Pinia
Md5
Echarts
less
- 小程序技术栈
Uniapp
Vue3
Dayjs
UviewPlus
项目所使用的AI工具
cursor3.5/3.7
gpt-4
deepseek
服务器
阿里云
Linux
Nginx
宝塔
项目后端(服务端)
- 技术栈
Nestjs
TS
Dayjs Axios
- 数据库
Mysql
Redis
ORM(prisma)力荐
- 消息队列
BullMQ
架构设计思想
整体是 pnpm + monorepo架构,为什么要这么做呢,因为这样设计前后端可以通过workspace
技术实现前后端共用一套声明文件,后端增加了一个字段,前端会立马报错需要添加新增的字段,这样能避免很多问题。
common
目录就是存放公共的声明文件前后端一起用的
前后端只需要把这个common项目安装到前后端项目即可
pnpm add @project/common --workspace --filter @project/admin-server
第二个考虑为什么不用现成的模板呢
- 我从来没用过
若依
那些框架(不熟) - 客户很多界面都是定制化的
- 这也是一个学习的机会很多东西我想手写一次,毕竟真实在公司里不会让你去搞这些的,所以私活可以自己整很多东西前提是客户不懂技术。
所以综合考虑就自己干了 本来想跟群友一起搞的但是那时候缺米后来还是一个人承包了
后端架构
微服务设计
- 后端管理系统微服务
Admin-Server
- 文件管理微服务
Fs-server
- 小程序微服务
Program-server
- Socket即时通讯服务
Socket-server
网关层设计
因为微服务太多了api地址各不相同,我想着是入口统一设计了网关层,然后通过网关层分发到各个微服务,其次就是网关层还可以实现 限流
信道加密
熔断技术
这样就不管哪个端发送的请求都会经过网关层 然后通过网关层分发给各个微服务
数据库
数据库采用了分库分表设计
分库分表设计 主流的切分方式有 3种 水平切分
垂直切分
混合切分
我采用了水平切分
为什么要分库分表呢,因为单库性能瓶颈 CPU压力会很大
项目刚部署服务器直接爆表
网友的评价是:小马拉大车
后来我进行优化 分库分表 集群部署 Nginx七层SLB负载和四层LB负载之后终于稳定了
ORM(prisma)
这个ORM框架非常好用,TS智能提示,一对多 多对多 都很简单,并且还有级联删除 复杂查询等等太好用了
微信支付对接
官方没有提供Node.js的SDK,所有就有很多网友自己写了很多微信支付的库
但是下载量都很低,所有我选择自己封装微信支付
我封装了V2和V3两个版本的,那为什么要做两个版本的我也真的是服了
对接扫码枪只能用V2的版本而且V2的版本还是传输XML格式
其实自己搞一搞对微信的加密算法,签名会有很多的思路以后在自己的项目就会思考这些设计方案。
扫码枪方案
扫码枪是通过USB连接在电脑上的,需要客户出示付款码进行支付,但是接收方是App也就是pad上,这怎么玩
所以我的方案是,他正好有一个桌面程序展示菜单的
所以我在桌面程序监听了扫码枪,然后通过socket传给了App这样就行了
扫码枪要扫三个东西
- 小程序的会员码
- 付款码
- 商品码直接扫商品的条码就能新增进去
小票机对接难度指数(☆☆☆☆☆)
客户买的小票机无法通过网络编程,也就是直接提供好API就可以调用的那种,他只能通过串口去对接,这就很麻烦了。
我知道Node可以掉串口,node-ffi
技术
经过各种重重难关终于可以打印,但是没有字,不然就是无限切纸,浪费了很多纸,后来放弃了这个方案。
他官方提供了SDK 不过是C#的,没办法自学了C# 也就是 C sharp语言,跟TS类似
发现很简单,非常好用
所以我用C#提供了一个API 给Nestjs 去调用,只需要把要打印的数据传过来就可以了
但是问题又出现了 C# 的这个服务只能在局域网调用啊,因为小票机要连接他的本地电脑,不可能放到服务器啊,
这怎么办???????
如果用户下单的时候用的是流量或者用户在家用小程序预约下单,那就不可能打出票啊,所以我想到了内网穿透技术
自学了FRPC
免费的内网穿透技术
搭建完成还提供一个可视化面板这个就是打印机的内网穿透服务
但是又产生另一个问题,客户不懂技术啊,他每次打开电脑还要执行一下内网穿透的服务启动,他也会觉得烦,并且很麻烦,所以我想着做成开机自启,并且需要有守护进程,断掉了自动帮我重启这个服务,所以我发现了NSSM技术专门搞这种事情的太完美了要什么有什么所以我自学了NSSM做成了开机自启哈哈
第三个难题,因为他要打三张小票,小票机的服务是我在Nestjs里面用axios调用的,但是如果两个人或多个人同时下单呢??? 这样打印的票不就乱了吗,第一个用户的接口快打印了一张,然后第二个用户的接口快打印了一张,这样就乱掉了,所哟我接入了消息队列先进先出,bullMQ
这样的话就会按顺序执行了不会出现用户1用户2同时打印的情况了,并且还解决了微服务通讯的问题
项目演示
整体UI 都是我自己设计的甲方没有UI 只有一张纸
我参考了 霸王茶姬
美团
汉堡王
京东
的设计综合起来
店内实物 店长买票邀请我过去品尝,顺便玩了一周
店铺位置 山西省/长治市/潞州区/太行东街2号天空之城西1门北侧