| .github/workflows | ||
| config | ||
| device-activation-platform | ||
| device-fingerprint-tool | ||
| docs | ||
| scripts | ||
| src | ||
| ukey-tool | ||
| .gitignore | ||
| openapi.yml | ||
| pom.xml | ||
| qodana.yaml | ||
| README.md | ||
TMS Framework
Single-process TMS monolith scaffold built with:
- JDK 17
- Spring Boot 3.5.x
- MyBatis-Plus
- TiDB (MySQL driver)
- Swagger (springdoc-openapi)
Quick Start
cd tms-framework
mvn spring-boot:run
Jar 包部署(外置配置)
完整部署手册:
- 构建 jar 包:
cd tms-framework
mvn -q -DskipTests package
cp target/tms-framework-*.jar /home/tms/tms-framework.jar
- 在 CentOS 上准备部署目录:
sudo mkdir -p /home/tms/{bin,config,scripts,logs,run}
sudo mkdir -p /home/tms/bin/resource-restore
sudo chown -R "$(whoami)":"$(whoami)" /home/tms
cp scripts/tms.sh /home/tms/scripts/tms.sh
cp scripts/standard-init/*.sh /home/tms/bin/
sudo cp scripts/standard-init/root-sbin/tms-run-standard-vendor-step /usr/local/sbin/tms-run-standard-vendor-step
sudo cp scripts/standard-init/root-sbin/tms-prepare-standard-permissions /usr/local/sbin/tms-prepare-standard-permissions
cp scripts/resource-restore/*.sh /home/tms/bin/resource-restore/
cp config/application.yml.example /home/tms/config/application.yml
chmod +x /home/tms/bin/*.sh
chmod +x /home/tms/bin/resource-restore/*.sh
chmod +x /home/tms/scripts/tms.sh
sudo chown root:root /usr/local/sbin/tms-run-standard-vendor-step
sudo chmod 755 /usr/local/sbin/tms-run-standard-vendor-step
sudo chown root:root /usr/local/sbin/tms-prepare-standard-permissions
sudo chmod 755 /usr/local/sbin/tms-prepare-standard-permissions
- 启动 / 停止 / 状态:
/home/tms/scripts/tms.sh start
/home/tms/scripts/tms.sh status
/home/tms/scripts/tms.sh stop
说明:
- 脚本默认
APP_HOME=/home/tms,并通过--spring.config.additional-location=optional:file:<app_home>/config/从/home/tms/config/读取外部配置。 - 默认要求
/home/tms/config/application.yml存在。 - 脚本不再强制指定 profile;默认按 Spring 配置文件自身规则解析,可通过
SPRING_PROFILES_ACTIVE=dev /home/tms/scripts/tms.sh start显式覆盖。 - 可通过
JAR_PATH=/home/tms/tms-framework.jar覆盖 jar 路径。 - 如果部署路径不是
/home/tms,使用APP_HOME=/your/path /your/path/scripts/tms.sh start。 - 标准 CISD 初始化辅助脚本位于
scripts/standard-init/,部署时需复制到/home/tms/bin/。 scripts/standard-init/root-sbin/tms-run-standard-vendor-step是标准版 vendor 客户化脚本的 root 受控入口,部署到/usr/local/sbin/后通过 sudoers 授权给tms使用。scripts/standard-init/root-sbin/tms-prepare-standard-permissions是标准版介质权限预处理脚本,由root在初始化前手工执行,用于修正/home/cmep4i/cpackage、license、SQL load、CMSP/CMTP 目录权限。- 资源恢复辅助脚本位于
scripts/resource-restore/,部署时需复制到/home/tms/bin/resource-restore/。 apply_standard_db.sh依赖预置环境变量,例如DB_USER、DB_PASSWORD,不要直接写入application.yml。- 运行目录结构、配置项说明、文件上传
fileId流程和故障排查,请查看上面的完整部署手册。
配置敏感信息加密
配置文件中的敏感值可以写成 ENC(...),应用启动早期会自动解密后再交给 Spring 绑定:
spring:
datasource:
password: ENC(v1:<iv>:<ciphertext>)
当前实现使用 AES-256-GCM,主密钥按当前交付要求临时硬编码在代码中。生成密文:
java -jar tms-framework.jar --tms.crypto.encrypt
命令会从标准输入读取一行明文并输出 ENC(...)。解密校验:
java -jar tms-framework.jar --tms.crypto.decrypt
生产加固时应把硬编码密钥替换为环境变量、独立密钥文件或密码机/KMS 托管密钥。
运行时建议:
- 本地构建和测试统一使用 JDK 17,与项目和 CI 运行时保持一致。
Open:
- Swagger UI: http://localhost:8080/swagger-ui.html
- Internal API docs JSON: http://localhost:8080/v3/api-docs/internal-api
- Runtime-generated Swagger/OpenAPI docs are the source of truth for
/api/**. - Internal health API:
GET /api/v1/device/status - Internal sign preview API:
POST /api/v1/sign/preview - External sign API:
POST /openapi/v1/sign/signature - Init template API:
GET /api/v1/init/template - Init preview API:
POST /api/v1/init/preview - Current init config API:
GET /api/v1/init/config - Reset preview API:
POST /api/v1/init/reset/preview - Reset create task API:
POST /api/v1/init/reset/tasks - Reset execute API:
POST /api/v1/init/reset/tasks/{taskId}/execute - Auth login API:
POST /api/v1/auth/login - Compat password login API:
POST /api/v1/auth/password-login - Compat UKey login API:
POST /api/v1/auth/ukey-login - Compat UKey random API:
GET /api/v1/auth/ukey-login/randoms - UKey binding issue-sign API:
POST /api/v1/auth/roles/{roleCode}/ukeys/issue-sign - UKey binding API:
POST /api/v1/auth/roles/{roleCode}/ukeys/bind - Device info API:
GET /api/v1/device/info - Device profile API:
GET /api/v1/device/profile - Device runtime status API:
GET /api/v1/device/runtime-status - Upgrade package upload API:
POST /api/v1/upgrade-packages - Upgrade preview API:
POST /api/v1/upgrades/previews - Upgrade create task API:
POST /api/v1/upgrades - Upgrade execute API:
POST /api/v1/upgrades/{taskId}/execute - Upgrade list API:
GET /api/v1/upgrades - CRL import API:
POST /api/v1/crls/import - CRL import task detail API:
POST /api/v1/crls/import-tasks/detail - CRL revoked list API:
POST /api/v1/crls/list - CRL delete API:
POST /api/v1/crls/delete - PCIe crypto count API:
GET /api/v1/device/crypto/device-count - PCIe crypto HMAC API:
POST /api/v1/device/crypto/hmac
Certificate CRL Management
前后端对接文档:
最小调用顺序:
POST /api/v1/crls/importPOST /api/v1/crls/listPOST /api/v1/crls/delete
当前实现边界:
- 可通过
tms.cert.trusted-root-fingerprints配置根 CA 证书 SHA-256 指纹白名单;配置后根 CA 导入必须命中白名单,中间 CA 仍按当前可信链校验。 - CRL 文件支持 PEM / DER 格式,导入接口会先创建后台任务并返回
taskId,前端通过POST /api/v1/crls/import-tasks/detail轮询PENDING/RUNNING/SUCCESS/FAILED状态。 - 后台导入完成后保存 CRL metadata 和 CRL 内每条 revoked certificate 明细;原始 CRL 文件只作为临时文件参与解析,任务结束后删除,不作为业务数据长期保存。
- CRL issuer 通过可信 CA 的 issuer DN 候选和实际 CRL 签名验证解析。
- CRL issuer 必须是可信 CA,且 KeyUsage 必须允许
cRLSign。 - 重复 CRL 通过 SHA-256 fingerprint 拒绝。
- revoked 明细查询按
algoType和证书subjectDn模糊过滤,返回的是 revoked certificate 明细列表,不是 CRL 文件列表。 - 证书导入时如果
issuerDn + serialNumber已命中已导入 CRL,会拒绝导入。 - 证书列表和详情的
runtimeStatus在 CRL 命中时优先返回REVOKED,优先级高于时间有效期状态。
CISD Reset
最小调用顺序:
POST /api/v1/init/reset/previewPOST /api/v1/init/reset/tasksPOST /api/v1/init/reset/tasks/{taskId}/executeGET /api/v1/init/reset/tasks/{taskId}GET /api/v1/init/reset/tasks/{taskId}/stepsGET /api/v1/init/reset/tasks/{taskId}/steps/{stepNo}/log
当前支持范围:
- 仅支持设备预置产品类型为
ENTERPRISE或INDIRECT DIRECT当前明确不支持 reset
请求说明:
- reset 接口不再要求前端重复提交机构号、MQ 类型和 RabbitMQ 通道用户
- 后端会自动读取“最近一次成功初始化任务”的快照,提取
orgCode、mqType、channelUsername - 如果当前设备没有有效初始化快照,reset 预检和任务创建会直接失败
设备状态接口:
GET /api/v1/device/status- 返回字段
initStateUNINITIALIZED: 当前没有有效初始化快照INITIALIZING: 初始化任务正在执行INITIALIZED: 当前设备已初始化RESETTING: 重置任务正在执行
- 前端仅根据
initState判断展示初始化页、已初始化页或执行中页面
当前初始化配置展示接口:
GET /api/v1/init/config- 数据来源固定为最新一次成功初始化任务快照
- 只返回机构信息、部署信息、中间件信息和节点/签名核心字段
- 只用于展示,不用于编辑
当前 reset 实际会做的事情:
- 停止
CMSP/CMTP - 删除数据库
CMEP - 删除数据库
orgCode - 删除 RabbitMQ 客户化账号、
/RQ权限、客户化队列 - 停止 RabbitMQ 进程
- 删除 TLQ license 文件
- 清理当前 reset 任务的 staging 目录
当前 reset 不做的事情:
- 不回滚
cpconfig.cfg - 不删除 nginx 配置和已发布前端目录
- 不回滚应用配置文件中的 RabbitMQ 账号密码
- 不删除标准安装介质目录
运维前置条件:
scripts/standard-init/*.sh已部署到/home/tms/bin//home/tms/bin/stop_standard_apps.sh/home/tms/bin/stop_standard_rabbitmq.sh/home/tms/bin/apply_standard_db.shtms.init.executor.standard-db-username/password已正确配置tms.init.executor.rabbitmq-ctl-command指向可执行的rabbitmqctl- 运行时 Swagger 文档以
http://<ip>:8080/swagger-ui.html和http://<ip>:8080/v3/api-docs/internal-api为准
Offline Upgrade
最小调用顺序:
POST /api/v1/upgrade-packagesPOST /api/v1/upgrades/previewsPOST /api/v1/upgradesPOST /api/v1/upgrades/{taskId}/executePOST /api/v1/upgrades/{taskId}/rollbackGET /api/v1/upgradesGET /api/v1/upgrades/{taskId}GET /api/v1/upgrades/{taskId}/log
当前支持范围:
- 仅支持离线升级
- 当前支持任务类型:
TMSRECEIVERFIRMWARE
- 当前不支持:
- 在线升级
CVE/ 操作系统补丁升级
当前流程:
- 先上传离线升级包,复用现有文件上传能力,得到
fileId - 后端基于
fileId解析升级包并做预检 - 预检结果返回
taskType、productType、当前版本、目标版本和版本变化提示 - 用户确认后创建升级任务
- 调用执行接口后,任务异步进入后台执行
- 升级失败后,如升级包提供
rollback入口,可手工调用回滚接口 - 前端通过列表、详情和日志接口轮询任务状态
当前升级包要求:
- 外层为 zip 包
- 至少包含:
manifest.jsonsignature.sig
payload/下按需包含:app/web/dist/config/sql/firmware/scripts/
- 外层升级包实际包含的是
payload.zip,payload.zip内部再包含上述payload/目录 signature.sig需要能被配置的 PEM 公钥使用SM3withSM2软验签通过- 服务端需要配置
tms.upgrade.signature-public-key-pem-path(公钥 PEM 文件路径) manifest.json当前要求包含:packageIdtaskTypeproductTypeversionminCompatibleVersiondescriptionentrypoints.executepayloadSm3- 可选
entrypoints.precheck - 可选
entrypoints.verify - 可选
entrypoints.rollback
payloadSm3是整个payload.zip文件的SM3摘要;后端验签manifest.json后,会校验payload.zip摘要并解压出payload/供脚本执行
当前执行规则:
- 同一时刻只允许一个升级任务处于
RUNNING - 不允许目标版本低于当前版本
- 不满足最小兼容版本时拒绝升级
execute.sh必填,precheck.sh、verify.sh、rollback.sh可选- 执行顺序为:
precheck -> execute -> verify TMS自升级包内脚本第一版不应直接stop/start当前 TMS;推荐只完成文件准备,由后端在写入终态和日志后异步触发/home/tms/scripts/tms.sh restartFIRMWARE不增加额外后端流程,具体固件刷写、重启、恢复提示由包内脚本负责- 回滚不自动触发,需要调用回滚接口
TMS、RECEIVER升级成功后会更新tms_device_software_version;FIRMWARE暂不维护版本表
Resource Backup / Restore
最小调用顺序:
POST /api/v1/resource-backupsGET /api/v1/resource-backups/{taskId}GET /api/v1/resource-backups/{taskId}/downloadPOST /api/v1/resource-restores/precheckPOST /api/v1/resource-restoresPOST /api/v1/resource-restores/{taskId}/applyGET /api/v1/resource-restores/latest
恢复任务创建接口只完成验签、解密、展开和计划生成;前端只做一次“确认恢复”,确认后先调用创建接口,返回 READY_TO_APPLY 后立即调用 apply 接口进入停机恢复。也就是用户确认后调用 apply 接口进入停机恢复,不再做第二次确认。TMS 重启后前端可调用 latest 接口展示最近一次恢复时间、结果和失败原因。
前后端字段、状态枚举和联调流程见 docs/openapi/resource-backup-restore-frontend-integration.md。
当前实现边界:
- 资源备份包输出为
.tmsbak,包内包含manifest.json、envelope.json、payload.enc、signature.sig payload.enc加解密使用 PCIe 密码卡 SDF 会话密钥流程:备份时通过SDF_GenerateKeyWithIPK_ECC生成内部 ECC 公钥包裹的会话密钥并用SDF_Encrypt加密 payload;恢复时通过SDF_ImportKeyWithISK_ECC导入包裹会话密钥并用SDF_Decrypt解密 payload。envelope.json保持version=1,只记录payloadAlg、ivBase64和wrappedSessionKeyBase64,keyIndex/keyBits/algId由系统固定约定。- 当前第一版备份/恢复只覆盖最小资源集:
TMS_CONFIGTMS_DBCMEP_DBORG_DB(标准/间参收发器以orgCode命名的机构业务库;DIRECT模式不包含)CP_CONFIGRECEIVER_LICENSESTANDARD_CMSP_APP_CONFIG(标准版 CMSP 应用配置,由默认tms.backup.file-resources配置匹配/home/cmep4i/cmsp/application-prd*.properties)STANDARD_CMTP_APP_CONFIG(标准版 CMTP 应用配置,由默认tms.backup.file-resources配置匹配/home/cmep4i/cmtp/application-prd*.properties)USER_KEY(从实体证书KeyEntity.keyIdx采集用户密钥备份)MQ_REPLAY
- 预检阶段只做包头解析、指纹匹配和验签,不提前解密完整 payload
- 恢复任务创建时 Java 完成验签、PCIe/SDF 解密、payload 展开、用户密钥恢复和恢复路径白名单校验
- Java 会生成 shell 友好的
restore-files.tsv、restore-databases.tsv、restore-mq.tsv - 创建恢复任务后启动
apply-resource-backup.sh --work-dir <workDir>,由 shell 执行停服务、文件覆盖、SQL 导入、MQ replay、起服务和健康检查 - Java 启动恢复脚本前会在工作目录生成
restore-env.sh、restore-stop-commands.tsv、restore-start-commands.tsv;停启服务命令来自tms.backup.restore-stop-commands/tms.backup.restore-start-commands - 标准/间参默认恢复后会启动 TMS、CMSP/CMTP 和 nginx;现场需要启动其它软件时,只需在上述命令列表里增删配置项
- shell 侧状态写入
status.json,日志写入restore.log - 第一版资源恢复是停机恢复。创建恢复任务后当前TMS服务可能中断,前端应提示用户恢复期间页面/API可能不可用,恢复结果以后续健康检查、重新登录和
status.json/restore.log为准。 FILE回写 manifest 明确声明的配置/License 文件- 可通过
tms.backup.file-resources自行增删直接复制恢复的文件类资源:mode=FILE:单文件,restore-path是目标文件路径mode=DIR:目录递归,restore-path是目标目录mode=GLOB:通配符匹配同一目录下的一批文件,restore-path是目标目录product-types/mq-types:可选过滤条件;不配置表示所有产品类型或 MQ 类型都适用required=true时匹配不到或读取失败会导致备份失败,required=false时跳过并写入 manifest
DATABASE恢复:db/TMS.sqldb/CMEP.sql(包内存在时)db/<orgCode>.sql(标准/间参收发器包内存在时,导回同名机构库)
TMS_DB备份默认通过tms.backup.tms-db-excluded-tables排除角色、授权、会话和资源备份/恢复任务表,恢复时不会覆盖新机器安全登录状态,也不会把旧的RUNNING任务带到新机器;tms_operation_audit_log默认随 TMS 库一起备份MQ_REPLAY通过replay-mq.sh消费mq/mq-restore-context.json,也可用MQ_REPLAY_COMMAND委派给现场脚本- Java 启动恢复脚本前会在工作目录生成
restore-env.sh,传递数据库连接、恢复脚本路径、MQ replay 脚本路径和健康检查配置;健康检查会按配置重试等待 TMS 真正启动完成
关键配置:
tms.backup.output-dirtms.backup.precheck-store-dirtms.backup.restore-task-root-dirtms.backup.tms-script-pathtms.backup.restore-stop-commandstms.backup.restore-start-commandstms.backup.restore-apply-script-pathtms.backup.allowed-restore-rootstms.backup.file-resourcestms.backup.mysqldump-pathtms.backup.mysqldump-timeout-secondstms.backup.mysql-pathtms.backup.restore-db-script-pathtms.backup.restore-db-timeout-secondstms.backup.mq-replay-script-pathtms.backup.tms-database-nametms.backup.tms-db-excluded-tablestms.backup.cmep-database-nametms.backup.health-check-urltms.backup.health-check-timeout-secondstms.backup.health-check-max-wait-secondstms.backup.health-check-retry-interval-seconds
恢复前置条件:
- LMK、IK、数据存储加密密钥对、数据真实性保护密钥对需先通过 UKey 恢复
/home/tms/bin/resource-restore/apply-resource-backup.sh、restore-db.sh、replay-mq.sh必须已部署并可执行mysql/mysqldump客户端必须可用
当前明确不在第一版恢复范围内:
- nginx 配置
organization.json- 已发布 web 静态资源
/home/tms/uploads- 机构库
- 在线恢复 / 增量恢复 / 回滚
- 升级执行日志统一写入
tms.upgrade.log-dir
联调清单:
当前配置项:
tms.upgrade.staging-root-dirtms.upgrade.log-dirtms.upgrade.signature-public-key-pem-path
升级包规范见:
Architecture (Monolith + Modular)
- One deployable Spring Boot application.
- Module-first packaging under
modules/*. - Default module layout:
controller + service + repository + entity + dto. signmodule has extracontroller/openapi,dto/openapi, andsupport.- Cross-cutting concerns moved to top-level
securityandintegration.
Project Structure
src/main/java/com/cisd/tms
├── TmsApplication.java
├── common
│ ├── api
│ ├── config
│ │ └── properties
│ ├── constant
│ ├── enums
│ ├── exception
│ └── util
├── infrastructure
│ └── persistence
│ ├── entity
│ ├── mapper
│ └── mybatis
├── integration
│ ├── cips
│ ├── mq
│ ├── crypto
│ └── file
├── security
│ ├── internal
│ └── openapi
└── modules
├── system
│ ├── controller
│ ├── service
│ └── dto
├── sign
│ ├── controller
│ ├── controller/openapi
│ ├── service
│ ├── dto/internal
│ ├── dto/openapi
│ ├── support
│ ├── repository
│ └── entity
├── init
├── auth
## Auth Compat
当前仓库只包含后端认证接口,不包含登录页前端工程。
兼容旧管理端的登录调用说明见:
- [2026-03-23-auth-compat-integration-guide.md](/Users/waner/Work/CISD/文档/tms-framework/docs/plans/2026-03-23-auth-compat-integration-guide.md)
├── device
├── upgrade
├── cert
├── key
├── audit
├── backup
└── activation
src/main/resources
├── application.yml
├── application-dev.yml
├── application-prod.yml
├── mapper
│ ├── init/InitTaskMapper.xml
│ ├── auth/AuthUserMapper.xml
│ └── device/DeviceNodeMapper.xml
└── db/migration
└── V1__init_auth_device_tables.sql
API Boundary Rules
/api/**controllers live undercontroller.- External API controllers only in
*/controller/openapi, path prefix/openapi/**. - Internal and external DTOs are separated.
- Cross-module calls must go through
service, notrepository. - Internal token interceptor exclusions:
/api/v1/device/status,/api/v1/auth/login.
Auth Configuration
tms:
security:
internal-token: ${TMS_INTERNAL_TOKEN:change-me-internal-token}
openapi:
timestamp-skew-seconds: 300
clients:
demo-app: ${TMS_OPENAPI_DEMO_SECRET:change-me-openapi-secret}
Crypto Card Configuration
tms:
crypto-card:
enabled: ${TMS_CRYPTO_CARD_ENABLED:false}
mode: ${TMS_CRYPTO_CARD_MODE:MOCK} # MOCK / JNA
vendor-lib-path: ${TMS_CRYPTO_VENDOR_LIB_PATH:/home/tms/libs/libsdf_ukey_syd1408-x64.so.1.0.0}
vendor-lib-name: ${TMS_CRYPTO_VENDOR_LIB_NAME:sdf_ukey_syd1408}
- Internal PCIe debug APIs (strong-typed service):
GET /api/v1/device/crypto/device-countGET /api/v1/device/crypto/device-confGET /api/v1/device/crypto/device-infoGET /api/v1/device/crypto/random?length=16POST /api/v1/device/crypto/self-testPOST /api/v1/device/crypto/hmacPOST /api/v1/device/crypto/digestPOST /api/v1/device/crypto/encrypt/plainPOST /api/v1/device/crypto/decrypt/plainPOST /api/v1/device/crypto/encrypt/kekPOST /api/v1/device/crypto/decrypt/kekPOST /api/v1/device/crypto/mac/plainPOST /api/v1/device/crypto/file/createPOST /api/v1/device/crypto/file/writePOST /api/v1/device/crypto/file/readPOST /api/v1/device/crypto/file/deletePOST /api/v1/device/crypto/kek/generateGET /api/v1/device/crypto/kek/status?keyIndex=1GET /api/v1/device/crypto/lmk/seed-macPOST /api/v1/device/crypto/std/keypair/rsaPOST /api/v1/device/crypto/std/keypair/eccPOST /api/v1/device/crypto/envelope/exchange/rsaPOST /api/v1/device/crypto/envelope/exchange/eccPOST /api/v1/device/crypto/agreement/data-key/eccPOST /api/v1/device/crypto/agreement/session-key/ecc
PCIe Crypto Unified Wrapper (JNA)
The project keeps JNA native mappings for PCIe card SDF/SDFE interfaces from
PCIE密码卡应用接口说明书 V1.02, and provides strong-typed service APIs via
com.cisd.tms.integration.crypto.pcie.service.PcieCryptoService.
tms:
crypto-card:
enabled: ${TMS_CRYPTO_CARD_ENABLED:false}
mode: ${TMS_CRYPTO_CARD_MODE:JNA} # MOCK / JNA
vendor-lib-path: ${TMS_CRYPTO_VENDOR_LIB_PATH:/home/tms/libs/libsdf_ukey_syd1408-x64.so.1.0.0}
vendor-lib-name: ${TMS_CRYPTO_VENDOR_LIB_NAME:sdf_ukey_syd1408}
- JNA native mapping:
com.cisd.tms.integration.crypto.pcie.jna.PcieNativeLibrary - JNA implementation:
com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService - Mock fallback:
com.cisd.tms.integration.crypto.pcie.service.MockPcieCryptoService
OpenAPI Signature Rules
- Headers:
X-App-Id,X-Timestamp,X-Nonce,X-Signature - Canonical string:
appId + "\\n" + timestamp + "\\n" + nonce - Signature algorithm:
HMAC-SHA256with app secret, lowercase hex - Replay protection: nonce one-time in time window
Build And Test
mvn -q -DskipTests compile
mvn -q test
PCIe Real-Card Smoke
- Checklist:
docs/plans/2026-02-28-pcie-realcard-smoke-checklist.md - Script template:
scripts/pcie_realcard_smoke.sh
Example:
export BASE_URL=http://127.0.0.1:8080
export INTERNAL_TOKEN=change-me-internal-token
export ALG_SM3=1
export ALG_SM4_ECB=1025
./scripts/pcie_realcard_smoke.sh
- CI is pinned to JDK 17 via
.github/workflows/ci.yml. - Maven Surefire preloads Mockito javaagent to avoid dynamic self-attach failures on newer JDKs.
Current Status
- Structure refactored to lightweight monolith modules.
- Internal and external API entry points separated.
- Basic auth interceptors for internal/openapi are in place.
init/auth/device/sign/systemmodules have runnable skeleton controllers and services.init/auth/devicemodules include mapper+xml+repository-impl+DDL skeleton for TiDB.