Categories
php

php简介

    php原始为Personal Home Page的缩写,已经正式更名为 “PHP: Hypertext Preprocessor”。

    php依赖php运行容器即php进程,通过该进程对php文件进行输入处理,在 标准输出流 返回输出结果。特点运行简单,无需编译。在web容器下,每个请求都会产生一个php进程,所以只需把php文件更改后,立即访问该php文件,即可看见最新的更改(每发送一个请求,产生了新的进程重新读取文件)。调试十分方便。

运行php环境有多种方法

    1:通过php命令

    php -f “xxx.php” 通过指定需要加载php文件,开启php进程,在控制台标准输出流看到该文件的输出。

    php -s localhost:8080 (-t “项目文件夹”) 通过-t 指定php文件的文件夹,默认为当前进程执行文件夹目录。浏览器访问localhost:8080通过文件系统路径访问对应的文件(默认为index.php),即可在浏览器看到对应文件的输出。这个就是把php进程的输出流打在web容器的请求输出上,所以能在浏览器看到输出

    2:通过web容器访问。其实就是通过web容器执行请求输入到socket中(文件socket或端口socket都可)。服务器开启php-fpm服务,监听对应的socket作为进程输入,将php-fpm的标准输出流打在socket上供web容器读取。web容器再把socket的读取的内容作为请求响应返回给用户。(这就是标准的cgi做法,以进程标准输入流接受请求,标准输出流产生响应,一个请求就是一个进程)。

    nginx配置:

location ~ .php$ {
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

    apache配置:

LoadModule php7_module “${INSTALL_DIR}/bin/php/php7.1.9/php7apache2_4.dll”

<IfModule php7_module>
    DirectoryIndex index.php index.php3 
AddType application/x-httpd-php .php
    AddType application/x-httpd-php .php3
</IfModule>
Categories
go

ruoyi-go

在ruoyi-go 基础上 构造ruoyi-go 前后端分离版本

Categories
java

jwt token 和 sa-token

JWTSa-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。
Categories
java

若依 本地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 停止服务

Categories
php

php 自定义类替换第三方包同名文件

修改自动加载规则

  1. 调整composer.json:如果必须的话,你可以调整composer.json中的autoload部分,使得你的类优先于第三方包被加载。但是,这种方法较为复杂,并且可能导致难以预测的行为。json深色版本{ "autoload": { "psr-4": { "Vendor\\Package\\": "path/to/your/classes" } } }
  2. 重新dump自动加载器:当你改变了自动加载规则后,需要运行composer dump-autoload来更新自动加载器。
Categories
验光仪

尼德克对接协议

我们用

按下打印键会收到

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
Categories
验光仪

索维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
Categories
验光仪

法里奥对接协议

按下打印按钮后会收到

通知指令 指令(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#!>
Categories
php

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 私钥

Categories
K8S

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
Categories
K8S

APISIX

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