在ruoyi-go 基础上 构造ruoyi-go 前后端分离版本
Author: Robin
jwt token 和 sa-token
JWT和Sa-Token在功能、使用场景和优缺点等方面存在显著差异。
功能和适用场景
- JWT:JWT是一种无状态令牌协议标准(RFC 7519),主要用于在网络间安全传递声明(Claims)。其核心特点包括无状态性、自包含结构(Header.Payload.Signature三段式编码)和跨域支持,特别适合分布式系统和跨服务认证1。JWT通常用于身份验证和信息交换,特别是在无状态的客户端-服务器通信中。由于其简洁和标准化的特点,JWT可以与各种语言和技术栈配合使用,提高系统的灵活性和可扩展性2。
- Sa-Token:这是一款轻量级权限认证框架,专注于解决系统的登录认证、权限管理、会话管理等安全问题。其核心特点包括有状态会话管理(基于服务端存储会话,如Redis)、开箱即用的API(提供注解式鉴权、踢人下线、单点登录等功能)和多存储适配(支持Redis、Memcached、数据库等会话存储方式)12。Sa-Token提供了丰富的权限相关注解,支持多种条件组合,如AND、OR逻辑关系,以及复杂的表达式,适合需要快速开发和易于维护的项目2。
优缺点对比
- JWT:
- 优点:无状态性减少了服务器的存储压力,提高了系统的可扩展性和跨域支持;自包含结构使得令牌本身包含所有必要信息,无需服务端存储;简洁和标准化使其与各种语言和技术栈兼容12。
- 缺点:需要自行实现令牌黑名单机制以实现踢人功能;由于信息自包含,令牌体积较大,可能会影响传输效率13。
- Sa-Token:
- 优点:提供丰富的权限相关注解和功能,支持多种存储方式,适合快速开发和易于维护的项目;开箱即用的体验简化了权限认证的集成和使用过程12。
- 缺点:有状态会话管理增加了服务器的存储压力;虽然功能丰富,但在高度定制化安全策略方面可能不如Spring Security灵活2。
若依 本地docker部署
Dockerfile :
FROM docker.1ms.run/openjdk:8
MAINTAINER Robin Luo
RUN mkdir -p /ruoyi/server/logs \
/ruoyi/server/temp \
/ruoyi/skywalking/agent
WORKDIR /ruoyi/server
ENV SERVER_PORT=8080
EXPOSE ${SERVER_PORT}
ADD ./ruoyi-admin.jar ./app.jar
ENTRYPOINT ["java", \
"-Djava.security.egd=file:/dev/./urandom", \
"-Dserver.port=${SERVER_PORT}", \
# 应用名称 如果想区分集群节点监控 改成不同的名称即可
# "-Dskywalking.agent.service_name=ruoyi-server", \
# "-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar", \
"-jar", "app.jar"]
docker-compose.yaml
version: '3.8'
services:
ruoyi-his-server:
build:
context: .
dockerfile: Dockerfile
container_name: ruoyi-his-server
ports:
- "8009:8080"
environment:
- SPRING_PROFILES_ACTIVE=druid,dev
restart: always
再该目录下 执行 docker-compose up -d 启动服务
执行 dock-compose down 停止服务
php 自定义类替换第三方包同名文件
修改自动加载规则
- 调整composer.json:如果必须的话,你可以调整
composer.json
中的autoload
部分,使得你的类优先于第三方包被加载。但是,这种方法较为复杂,并且可能导致难以预测的行为。json深色版本{ "autoload": { "psr-4": { "Vendor\\Package\\": "path/to/your/classes" } } }
- 重新dump自动加载器:当你改变了自动加载规则后,需要运行
composer dump-autoload
来更新自动加载器。
我们用
按下打印键会收到
NCP10 模式
bluetooth data : DRMIDNIDEK/ARK-1N
nidek.js:251 bluetooth data : O0694DADEC/31/2024.
nidek.js:251 bluetooth data : 19:56VD12.00WD40O
nidek.js:251 bluetooth data : L-02.00-00.50167OL-
nidek.js:251 bluetooth data : 02.00-00.501709 OL-
nidek.js:251 bluetooth data : 02.00-00.501669 OL-
nidek.js:251 bluetooth data : 02.00-00.501679 OR-
nidek.js:251 bluetooth data : 01.75-00.75004OR-01
nidek.js:251 bluetooth data : .75-00.750039 OR-01
nidek.js:251 bluetooth data : .75-00.750049 OR-01
nidek.js:251 bluetooth data : .75-00.750059 PD69?
nidek.js:251 bluetooth data : ?????DKM L08.0907
nidek.js:251 bluetooth data : .8717107.98DL41.754
nidek.js:251 bluetooth data : 3.0017142.25-01.25
nidek.js:251 bluetooth data : L08.1007.8717107.99
nidek.js:251 bluetooth data : DL41.7543.0017142.25
nidek.js:251 bluetooth data : -01.25 L08.0907.871
nidek.js:251 bluetooth data : 7107.98DL41.7543.00
nidek.js:251 bluetooth data : 17142.25-01.25 L08.
nidek.js:251 bluetooth data : 0907.8517107.97DL41
nidek.js:251 bluetooth data : .7543.0017142.25-01.
nidek.js:251 bluetooth data : 25 R08.0707.7800507
nidek.js:251 bluetooth data : .93DR41.7543.500054
nidek.js:251 bluetooth data : 2.50-01.75 R08.0807
nidek.js:251 bluetooth data : .7900507.94DR41.754
nidek.js:251 bluetooth data : 3.2500542.50-01.50
nidek.js:251 bluetooth data : R08.0707.7800507.93
nidek.js:251 bluetooth data : DR41.7543.5000542.50
nidek.js:251 bluetooth data : -01.75 R08.0607.780
nidek.js:251 bluetooth data : 0507.92DR41.7543.50
nidek.js:251 bluetooth data : 00542.50-01.75SL11.
nidek.js:251 bluetooth data : 9PL05.4NSR12.1PR0
nidek.js:251 bluetooth data : 5.0N8141
DRMIDNIDEK/ARK-1NO0694DADEC/31/2024.19:56VD12.00WD40OL-02.00-00.50167OL-02.00-00.501709 OL-02.00-00.501669 OL-02.00-00.501679 OR-01.75-00.75004OR-01.75-00.750039 OR-01.75-00.750049 OR-01.75-00.750059 PD69??????DKM L08.0907.8717107.98DL41.7543.0017142.25-01.25 L08.1007.8717107.99DL41.7543.0017142.25-01.25 L08.0907.8717107.98DL41.7543.0017142.25-01.25 L08.0907.8517107.97DL41.7543.0017142.25-01.25 R08.0707.7800507.93DR41.7543.5000542.50-01.75 R08.0807.7900507.94DR41.7543.2500542.50-01.50 R08.0707.7800507.93DR41.7543.5000542.50-01.75 R08.0607.7800507.92DR41.7543.5000542.50-01.75SL11.9PL05.4NSR12.1PR05.0N8141
example:
DRMIDNIDEK/ARK-1N
nidek.js:251 bluetooth data : O0695DADEC/31/2024.
nidek.js:251 bluetooth data : 20:34VD12.00WD40O
nidek.js:251 bluetooth data : L-02.00-00.50166OL-
2nidek.js:251 bluetooth data : 02.00-00.501669 OL-
nidek.js:251 bluetooth data : 02.00-00.501679 OR-
nidek.js:251 bluetooth data : 01.75-01.00006OR-01
2nidek.js:251 bluetooth data : .75-01.000069 OR-01
nidek.js:251 bluetooth data : .75-01.000079 PD68?
nidek.js:251 bluetooth data : ?????DKM L08.0907
nidek.js:251 bluetooth data : .8917507.99DL41.754
nidek.js:251 bluetooth data : 2.7517542.25-01.00
nidek.js:251 bluetooth data : L08.0907.8817507.99
nidek.js:251 bluetooth data : DL41.7542.7517542.25
nidek.js:251 bluetooth data : -01.00 L08.0907.891
nidek.js:251 bluetooth data : 7507.99DL41.7542.75
nidek.js:251 bluetooth data : 17542.25-01.00 L08.
nidek.js:251 bluetooth data : 0907.8917507.99DL41
nidek.js:251 bluetooth data : .7542.7517542.25-01.
nidek.js:251 bluetooth data : 00 R08.0707.7700807
nidek.js:251 bluetooth data : .92DR41.7543.500084
nidek.js:251 bluetooth data : 2.50-01.75 R08.0707
nidek.js:251 bluetooth data : .7700807.92DR41.754
nidek.js:251 bluetooth data : 3.5000842.50-01.75
nidek.js:251 bluetooth data : R08.0707.7700807.92
nidek.js:251 bluetooth data : DR41.7543.5000842.50
nidek.js:251 bluetooth data : -01.75 R08.0707.770
nidek.js:251 bluetooth data : 0807.92DR41.7543.50
nidek.js:251 bluetooth data : 00842.50-01.75SL11.
nidek.js:251 bluetooth data : 9PL05.0NSR12.2PR0
nidek.js:251 bluetooth data : 5.1N816D
索维SW800 蓝牙对接协议
example
{"PatientId":20241231000001,"Name":"","Sex":2,"DeviceId":"AH0078GY1A","DeviceName":"SW-800","CaseId":"000000000000000000","ClinicResult":[{"LAxis1":63,"LAxis2":153,"LDC1":-0.25,"LDC2":0.25,"LDS1":-3.00,"LDS2":-3.25,"LSE1":-3.25,"LSE2":-3.25,"LGazeH":5,"LGazeV":1,"LPupil":4.20,"LReflex":31.37,"LRangeH":-3.20,"LSpeedH":-100.00,"LRangeV":-2.90,"LSpeedV":-90.63,"RAxis1":123,"RAxis2":33,"RDC1":-0.25,"RDC2":0.25,"RDS1":-2.00,"RDS2":-2.25,"RSE1":-2.25,"RSE2":-2.25,"RGazeH":-2,"RGazeV":0,"RPupil":4.40,"RReflex":42.35,"RRangeH":-6.00,"RSpeedH":-187.50,"RRangeV":5.70,"RSpeedV":59.38,"PD":63,"ReflexDiffer":10.98,"ExamType":10,"EyeType":3,"CreationTime":"2024-12-31T14:47:53","Id":20241231000001}]}
{
"PatientId":20241231000001,
"Name":"",
"Sex":2,
"DeviceId":"AH0078GY1A",
"DeviceName":"SW-800",
"CaseId":"000000000000000000",
"ClinicResult":[
{
"LAxis1":63,
"LAxis2":153,//左眼轴位
"LDC1":-0.25,
"LDC2":0.25, //左眼柱镜
"LDS1":-3,
"LDS2":-3.25,//左眼球镜
"LSE1":-3.25,
"LSE2":-3.25,//左眼等效球镜
"LGazeH":5, //左眼水平瞳孔中心 左正右负
"LGazeV":1, //左眼竖直瞳孔中心 下正上负
"LPupil":4.2,//左眼瞳孔大小
"LReflex":31.37,
"LRangeH":-3.2,
"LSpeedH":-100,
"LRangeV":-2.9,
"LSpeedV":-90.63,
"RAxis1":123,
"RAxis2":33,//右眼轴位
"RDC1":-0.25,
"RDC2":0.25,//右眼柱镜
"RDS1":-2,
"RDS2":-2.25,//右眼球镜
"RSE1":-2.25,
"RSE2":-2.25,//右眼等效球镜
"RGazeH":-2, //右眼水平瞳孔中心 左正右负
"RGazeV":0, //右眼竖直瞳孔中心 下正上负
"RPupil":4.4,//右眼瞳孔大小
"RReflex":42.35,
"RRangeH":-6,
"RSpeedH":-187.5,
"RRangeV":5.7,
"RSpeedV":59.38,
"PD":63, //瞳距
"ReflexDiffer":10.98,
"ExamType":10,
"EyeType":3,
"CreationTime":"2024-12-31T14:47:53",
"Id":20241231000001
}
]
}
BLE 蓝牙信息
service UUID
0000180D-0000-1000-8000-00805F9B34FB
character UUID
00002A39-0000-1000-8000-00805F9B34FB
按下打印按钮后会收到
通知指令 指令(FKR710->上位机) 指令:#!< DATY 00 #!>,该指令表示 FKR710 存在数据记录 指令:#!< DATN 00 #!>,该指令表示 FKR710 不存在数据记录 该指令在 FKR710 端触发“打印”键时由 FKR710 发出注 1,上位机针对该指令不需应答。
#!<DATY00#!>
此时要回复
获取右眼屈光数据
#!<REFR#!>
应答
#!<REFR0167.012.00-02.25---02.00-00.50006#!>
获取左眼屈光数据
#!<REFL#!>
应答
#!<REFL0167.012.00-02.25---02.00-00.75159#!>
获取右眼角膜数据
#!<KRTR#!>
应答
#!<KRTR0167.000.00-01.20MM+08.08+07.85006#!>
获取左眼角膜数据
#!<KRTL#!>
应答
#!<KRTL0167.000.00-01.10MM+08.08+07.88174#!>
返回例子
bluetooth data : #!<DATY00#!>
falio.js:259 exam data : #!<DATY00#!>
falio.js:262 trigger printing
falio.js:277 writeBLECharacteristicValue success writeBLECharacteristicValue:ok
falio.js:298 writeBLECharacteristicValue success writeBLECharacteristicValue:ok
falio.js:219 bluetooth data : #!<REFR0167.012.00-0
falio.js:219 bluetooth data : 2.25---02.00-00.5000
falio.js:318 writeBLECharacteristicValue success writeBLECharacteristicValue:ok
falio.js:219 bluetooth data : 6#!>#!<REFL0167.012.
falio.js:259 exam data : #!<REFR0167.012.00-02.25---02.00-00.50006#!>
falio.js:219 bluetooth data : 00-02.25---02.00-00.
falio.js:219 bluetooth data : 75159#!>#!<KRTR0167.
falio.js:259 exam data : #!<REFL0167.012.00-02.25---02.00-00.75159#!>
falio.js:338 writeBLECharacteristicValue success writeBLECharacteristicValue:ok
falio.js:219 bluetooth data : 000.00-01.20MM+08.08
falio.js:219 bluetooth data : +07.85006#!>
falio.js:259 exam data : #!<KRTR0167.000.00-01.20MM+08.08+07.85006#!>
falio.js:219 bluetooth data : #!<KRTL0167.000.00-0
falio.js:219 bluetooth data : 1.10MM+08.08+07.8817
falio.js:219 bluetooth data : 4#!>
falio.js:259 exam data : #!<KRTL0167.000.00-01.10MM+08.08+07.88174#!>
laravel wechat
用户登录流程:
小程序调用 wx.login 后获得 code ,调用 laravel-wechat 的login 接口
https://depscreen.studentvision.cn/api/wechat/mini/login
返回 用户个人信息 openid accessToken 等
{
"error_code": 0,
"data": {
"access_token": "bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2RlcHNjcmVlbi5zdHVkZW50dmlzaW9uLmNuL2FwaS93ZWNoYXQvbWluaS9sb2dpbiIsImlhdCI6MTczMzk4NzMzMCwiZXhwIjoxNzMzOTkwOTMwLCJuYmYiOjE3MzM5ODczMzAsImp0aSI6IkFUTTloR1dvU1VuNjlaWWgiLCJzdWIiOiIxIiwicHJ2IjoiNDI1MTRkODBlZTM4NWRhODRjYTM4YWY0NTgyZThmNTRiYjRjZmIzOSJ9.qLXirUDL8GJjkg3LS47_J1LEpdA5j02VgyfUrt6RrpY",
"expires_in": 3600,
"wechat_user": {
"id": 1,
"app_id": "wx621e0fe15a370854",
"user_id": "0",
"openid": "oLG3w68wIQoTn5BwLOVyREIMtiFM",
"nickname": null,
"avatar": null,
"gender": "0",
"country": null,
"province": null,
"city": null,
"subscribed_at": null,
"created_at": "2024-12-11T04:15:17.997000Z",
"updated_at": "2024-12-11T04:15:17.997000Z",
"gender_readable": null
}
}
}
之后的每个请求都要带上 该jwt access token 作为通信票据以保证安全
Accept:application/json
Content-Type:application/json
Authorization:bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2RlcHNjcmVlbi5zdHVkZW50dmlzaW9uLmNuL2FwaS93ZWNoYXQvbWluaS9sb2dpbiIsImlhdCI6MTczMzk4NzMzMCwiZXhwIjoxNzMzOTkwOTMwLCJuYmYiOjE3MzM5ODczMzAsImp0aSI6IkFUTTloR1dvU1VuNjlaWWgiLCJzdWIiOiIxIiwicHJ2IjoiNDI1MTRkODBlZTM4NWRhODRjYTM4YWY0NTgyZThmNTRiYjRjZmIzOSJ9.qLXirUDL8GJjkg3LS47_J1LEpdA5j02VgyfUrt6RrpY
controller 增加一个middleware 作为checking
Route::middleware('auth:mini')
具体实现类是
这个作为jwt入口
Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
php artisan jwt:secret
该命令可以重新生成jwt 私钥
Traefik Controller
K3S 默认安装 Traefik 作为ingress 控制器
默认没有开启dashboard 且 占用了各个node的80 和 443 端口
traefix配置在kube-system 命名空间内
一个例子 暴露8081 的nexus-service
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nexus-ingress
namespace: nexus
spec:
entryPoints:
- web
routes:
- match: Host(`nexus.local`) # 域名
kind: Rule
services:
- name: nexus-service
port: 8081
apisix 作为流量网关
其本身数据通讯以来etcd
页面配置以来apisix-dashboard
以后是三个docker镜像的启动配置
containerd 脚本
apisix
#!/bin/sh
ctr run --detach --net-host --mount type=bind,src=/home/pi/apisix/apisix/config/conf.yaml,dst=/usr/local/apisix/conf/config.yaml,options=rbind:rw 192.168.0.30:30003/apache/apisix:latest apisix
dashboard
#!/bin/sh
ctr run -d --net-host --env DASHBOARD_LISTEN_IP=0.0.0.0 --env DASHBOARD_LISTEN_PORT=9000 --mount type=bind,src=/home/pi/apisix/apisix-dashboard/config/conf.yaml,dst=/usr/local/apisix-dashboard/conf/conf.yaml,options=rbind:rw 192.168.0.30:30003/apache/apisix-dashboard:latest apisix-dashboard
etcd
#!/bin/sh
ctr run --detach --net-host --env ALLOW_NONE_AUTHENTICATION=yes --env ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379 --env ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 192.168.0.30:30003/bitnami/etcd:latest my-etcd
apisix 和 dashboard都指定了配置文件(十分重要 对接promethus + grafana 也是在这里暴露一个metric作为endpoint)
在promethus.yml添加一个job
scrape_configs:
- job_name: 'apisix'
static_configs:
- targets: ['apisix:9091/metric'] 更改为指定apisix 的endpoint