Sana Sana
首页
  • 项目介绍

    • 项目介绍
    • 结构说明
    • 后续计划
  • 环境搭建

    • 配置maven
    • 安装JDK17
    • 安装Node.JS
    • 安装Redis
    • 安装Mysql
    • 安装Tdengine
    • 安装MinIO
  • 本地运行

    • 运行后端
    • 运行前端
  • 服务部署

    • 简单部署
  • 操作说明

    • 设备维护
    • 接入管理
    • 规则编排
    • 大屏管理
    • 摄像头管理
  • 使用案例

    • 模拟单个设备接入案例
    • 模拟边缘程序设备接入案例
演示地址
问题反馈
GitHub (opens new window)
首页
  • 项目介绍

    • 项目介绍
    • 结构说明
    • 后续计划
  • 环境搭建

    • 配置maven
    • 安装JDK17
    • 安装Node.JS
    • 安装Redis
    • 安装Mysql
    • 安装Tdengine
    • 安装MinIO
  • 本地运行

    • 运行后端
    • 运行前端
  • 服务部署

    • 简单部署
  • 操作说明

    • 设备维护
    • 接入管理
    • 规则编排
    • 大屏管理
    • 摄像头管理
  • 使用案例

    • 模拟单个设备接入案例
    • 模拟边缘程序设备接入案例
演示地址
问题反馈
GitHub (opens new window)
  • 项目介绍

  • 环境搭建

  • 本地运行

    • 运行后端
      • 下载代码
      • 初始化数据库:
        • 1、初始化mysql数据库
        • 2、初始化TDengine数据库
      • 配置后端环境
        • 1、使用编辑器打开sana项目,配置mavne
        • 2、修改本项目的sdk版本信息,确保和后端要求的sdk版本一致
      • 修改配置文件
        • 1、修改application.yml
        • 1、修改application-dev.yml(上面的配置中,active为:dev)
      • 启动后端程序
    • 运行前端
  • 服务部署

  • 指南
  • 本地运行
lyl-xf
2025-06-02
目录

运行后端

# 运行后端代码

# 下载代码

GitHub - lyl-xf/sana (opens new window)

下载完成之后进入项目目录可以看到以下结构:

|----sana               
|----doc                #文档
|----sana-abutment      #设备接入模块
|----sana-base          #基础功能模块
|----sana-devices       #设备管理模块
|----sana-rules         #规则管理模块
|----sana-service       #主服务模块
|----sana-system        #系统管理模块
|----sana-camera        #摄像头模块
.....                   #待归化模块
|----sana-web           #前端项目
1
2
3
4
5
6
7
8
9
10
11
  • sana为整个项目的根目录,也是后端的根目录,直接使用后端编辑器打开sana项目即可。
  • 其中sana-web为前端项目,需要单独独拷贝出去编译,并启动。

# 初始化数据库:

# 1、初始化mysql数据库

  • 连接到mysql数据库,创建数据库sana。
  • 运行sql文件:doc/mysql/sana.sql

# 2、初始化TDengine数据库

可以使用TDengineGUI,也可以通过命令行来操作,下面介绍的是命令行的方式:

  • 命令行进入taos界面

  • 找到文件:doc/TDengine/TD.sql

  • 使用建表语句(这里存储时长是3650天,可自行修改):

CREATE DATABASE sana PRECISION 'ms' KEEP 3650 DURATION 10 BUFFER 16;
1

  • 使用刚刚创建的sana数据库:
use sana;
1
  • 创建日志超级表,建表语句如下:
CREATE STABLE sys_log_operate (ts timestamp,
    module NCHAR(200),
    name NCHAR(100),
    req_uri NCHAR(200),
    req_method NCHAR(200),
    req_params NCHAR(4000),
    ip NCHAR(50),
    user_agent NCHAR(300),
    operate_type INT,
    status INT,
    real_name NCHAR(50)
    ) TAGS (user_id BIGINT);
1
2
3
4
5
6
7
8
9
10
11
12
  • 查看表是否存在

# 配置后端环境

# 1、使用编辑器打开sana项目,配置mavne

配置好之后,请使用maven编译项目,确保项目可以编译通过(先clena,后install)。

# 2、修改本项目的sdk版本信息,确保和后端要求的sdk版本一致

# 修改配置文件

# 1、修改application.yml

  • 文件位置: sana-server/src/main/resources/application.yml

  • 主要关注以下配置:

# Tomcat
server:
  port: 28081
  servlet:
    context-path: /sana
    session:
      cookie:
        http-only: true
spring:
  # 环境 dev|test|prod
  profiles:
    active: dev
  application:
    name: sana
  jackson:
    time-zone: GMT+8
  servlet:
    multipart:
      max-file-size: 400MB
      max-request-size: 400MB
  # 任务调度
  quartz:
    job-store-type: "jdbc"    # 任务存储类型
    wait-for-jobs-to-complete-on-shutdown: false    # 关闭时等待任务完成
    overwrite-existing-jobs: true   # 是否覆盖已有的任务
    auto-startup: true    # 是否自动启动计划程序
    startup-delay: 0s   # 延迟启动
    jdbc:
      initialize-schema: "never"  # 数据库架构初始化模式(never:从不进行初始化;always:每次都清空数据库进行初始化;embedded:只初始化内存数据库(默认值))
    properties: # 相关属性配置
      org:
        quartz:
          scheduler:
            instanceName: SanaScheduler # 调度器实例名称
            instanceId: AUTO  # 分布式节点ID自动生成
          jobStore:
            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            tablePrefix: QRTZ_  # 表前缀
            isClustered: false  # 是否开启集群
            dataSource: quartz  # 数据源别名(自定义)
            clusterCheckinInterval: 10000 # 分布式节点有效性检查时间间隔(毫秒)
            useProperties: false
          # 线程池配置
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true
sana:
  version: '@project.version@'
  resetPassword: 'sana.password' #重置密码功能中默认要修改的密码
  logging-enabled: true #是否开启日志存储(如果关闭,则不会进行日志数据的存储)
  logging-save-type: mysql #日志存储类型(tdengine\mysql)
  devicedata-enabled: true  #是否开启设备数据存储
  log-save-speed: 20  # 日志每次存储条数(建议根据实际配置、实际操作数量修改)
  device-data-speed: 20  # 设备存储每次存储条数(建议根据实际配置、实际操作数量修改)
  aviator-path:  #aviator规则脚本存储位置,如果不设置,则默认为当前程序运行的目录下的:/sana-rules/src/main/resources/script中
  rule-priority: listening  #(timing\listening)  #规则优先,定时:timing,监听:listening。这里要特别说明一下:如果设置为timing,则定时优先,如果是listening,则监听优先(这种情况发生在同一个设备同时属于定时、监听规则的情况下,并且在相同时间内触发,选择性的执行哪一个)
  rule-action:  #rule配置
    queue-type:  REDIS  # 队列类型(REDIS:已实现,KAFKA:暂无实现,或将放在后期)
    core-size: 2        # 线程池大小
    queue-capacity: 500 # 队列大小

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  typeAliasesPackage: com.sana.*.entity
  global-config:
    db-config:
      id-type: AUTO
      logic-delete-value: 1
      logic-not-delete-value: 0
    banner: false
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    call-setters-on-nulls: true
    jdbc-type-for-null: 'null'
  configuration-properties:
    prefix:
    blobType: BLOB
    boolValue: TRUE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

# 1、修改application-dev.yml(上面的配置中,active为:dev)

  • 文件位置: sana-server/src/main/resources/application-dev.yml

  • 主要关注以下配置(将:文件存储minio配置、redis配置、数据库‘mysql’、‘TDengine’配置 更换为自己部署的信息。):

############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token:
  cookie:
    secure: false
    httpOnly: true
  token-name: Authorization # token 名称(同时也是 cookie 名称)
  timeout: 2592000  # token 有效期(单位:秒) 默认30天,-1 代表永久有效
  active-timeout: -1  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
  is-concurrent: true  # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
  is-share: false  # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
  token-style: uuid  # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
  is-log: true  # 是否输出操作日志
  jwt-secret-key: sanakeyidSDWsdjnusadFaaDWedwfdasefAS # jwt秘钥
  ignore-config:
    paths:
      - /swagger/**
      - /swagger-resources/**
      - /swagger-ui.html
      - /doc.html
      - /swagger-ui/**
      - /favicon.ico
# 文件存储
storage:
  minio:
    access-key: Y2j5CZqWkTYjhRsadas
    secret-key: ro2TfKWjV07uOTXBqp5PGzzRQNsadasXRY
    end-point: http://127.0.0.1:9000
    bucket-name: dev

spring:
  # 是否开启登录验证码
  captchaEnabled: true
  # 数据库连接信心
  data:
    redis:
      database: 1
      host: 127.0.0.1
      port: 6379
      password: 123456
      timeout: 6000ms  # 连接超时时长(毫秒)
      lettuce:
        pool:
          max-active: 20    # 最大活跃连接数
          max-idle: 10      # 最大空闲连接
          min-idle: 5       # 最小空闲连接
          max-wait: 5000ms  # 获取连接最大等待时间
          time-between-eviction-runs: 30000ms  # 空闲连接检查周期
      stream:
        core-pool-size: 3 #处理逻辑时线程池的核心线程数
        max-pool-size: 3  #线程池最大线程数
        queue-capacity: 500 # 队列容量,默认:500
        batch-size: 40    #批量消费数量(一次最多获取多少条消息)
        poll-timeout-seconds: 3 # Stream中没有消息时,等待时间
        streams:          # 环境运行的时候,请一定要先创建好对应的stream;
          - name: sana:stream:topic-ruleo  # 设备规则处理stream1
            group: group-rule1
          - name: sana:stream:topic-rulet  # 设备规则处理stream2
            group: group-rule2
          - name: sana:stream:topic-rulej  # 定时规则处理stream
            group: group-rulejob
  datasource:
    dynamic:
      hikari: # Hikari 连接池全局配置
        connection-timeout: 30000     # 等待连接池分配链接的最大时长(毫秒),超过这个时长还没有可用的连接则发生 SQLException,默认:30 秒
        minimum-idle: 2               # 最小空闲连接数
        maximum-pool-size: 10         # 最大连接数
        idle-timeout: 600000          # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10 分钟
        max-lifetime: 1800000         # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认: 30 分钟
        connection-test-query: SELECT 1
      primary: mysql
      datasource:
        mysql:
          # MySQL8
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/sana?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
          username: root
          password: 123456
          # TDengine
        tdengine:
          #原生链接,需要配置客户端
          #driver-class-name: com.taosdata.jdbc.TSDBDriver
          #url: jdbc:TAOS://127.0.0.1:6041/sana?charset=UTF-8&locale=en_US.UTF-8&timezone=UTC-8
          #REST 连接
          driver-class-name: com.taosdata.jdbc.rs.RestfulDriver
          url: jdbc:TAOS-RS://127.0.0.1:6041/sana?charset=UTF-8&locale=en_US.UTF-8&timezone=UTC-8
          username: root
          password: admin1234...
# ZLMediaKit,目前计划整合GB28181、拉流两种方式,前端播放以webrtc为主。
zlm:
  enable: true # 是否启用,未启用不会加载
  balance: round_robin # 节点负载均衡算法,默认round_robin
  nodes: # zlm节点列表,每个节点配置如下
    - server-id: zlm-node-1 # 节点ID,可自定义
      host: "127.0.0.1" # 节点地址
      secret: KqErX1KUSnoGn3IpHsdsdl8KyLSAdmVgLlpa # 节点密钥
      enabled: true # 节点是否启用
      hook-enabled: true # 节点是否启用hook接口,启用hook会注入hook接口,默认true,需要注意拦截器放通
    - server-id: zlm-node-2 # 可配置多个节点
      host: "127.0.0.1"
      secret: KqErX1KUSnoGn3IpHl8KyLSAdmVgLlpa
      enabled: false
      hook-enabled: true
# mqtt
mqtt:
  mqtt-message:                # 服务端配置
    core-size:  2              #  线程池核心线程数
    queue-capacity: 500        # 队列容量,默认:500
  server:
    enabled: true             # 是否开启服务端,默认:true
    ip: 0.0.0.0                # 服务端 ip 默认为0.0.0.0,
    port: 1884                 # 端口,默认:1883
    name: Mqtt-broker(测试环境不开放端口)      # 名称,默认:Mica-Mqtt-Server
    heartbeat-timeout: 120000   # 心跳超时,单位毫秒,默认: 1000 * 120
    read-buffer-size: 8KB       # 接收数据的 buffer size,默认:8k
    max-bytes-in-message: 10MB  # 消息解析最大 bytes 长度,默认:10M
    auth:
      enable: true              # 是否开启 mqtt 认证
      username: root            # mqtt 认证用户名
      password: MqttNB!%#...           # mqtt 认证密码
    debug: false                # 如果开启 prometheus 指标收集建议关闭
    stat-enable: false          # 开启指标收集,debug 和 prometheus 开启时需要打开,默认开启,关闭节省内存
    proxy-protocol-enable: false   # 代理协议支持,nginx 可开启 tcp proxy_protocol on; 时转发源 ip 信息。2.4.1 版本开始支持
    web-port: 8084             # http、websocket 端口,默认:8083
    websocket-enable: true      # 是否开启 websocket,默认: true
    http-enable: true           # 是否开启 http api,默认: false
    http-basic-auth:
      enable: true              # 是否开启 http basic auth,默认: false
      username: root            # http basic auth 用户名
      password: MqttNB!%#...    # http basic auth 密码
    ssl:                        # mqtt tcp ssl 认证
      enabled: false            # 是否开启 ssl 认证,2.1.0 开始支持双向认证
      keystore-path:            # 必须参数:ssl keystore 目录,支持 classpath:/ 路径。
      keystore-pass:            # 必选参数:ssl keystore 密码
      truststore-path:          # 可选参数:ssl 双向认证 truststore 目录,支持 classpath:/ 路径。
      truststore-pass:          # 可选参数:ssl 双向认证 truststore 密码
      client-auth: none         # 是否需要客户端认证(双向认证),默认:NONE(不需要),REQUIRE(需要)
    linkType: 0                 # 连接类型,暂无用处,后续预留
  client:
    enabled: true               # 是否开启客户端,默认:true
    proxy-prefix : '/SB/#'          # 代理前缀(以‘SB’前缀为例,则默认订阅已经连接broker的:/SB/#)
    proxy-status-prefix : /SBSTUTA    # 代理前缀(以‘SBSTUTA’前缀为例,则默认订阅已经连接broker的:/SBSTUTA,用于检测代理的设备连接状态。注意:如果使用的emqx,则需要配置一条上下线的规则,转发到该主题上来)
    ip: 192.168.3.121               # 连接的服务端 ip(这里的ip为emqx,或者是其他第三方的mqtt-broker) ,默认:127.0.0.1
    port: 1883                  # 端口:默认:1883
    name: Mqtt-client(作为代理服务器的 代理监听客户端)      # 名称,默认:Mica-Mqtt-Client
    client-id: lana-mqttClient           # 客户端Id(非常重要,一般为设备 sn,不可重复)
    user-name: admin            # 认证的用户名
    password: 123456     # 认证的密码
    global-subscribe:           # 全局订阅的 topic,可被全局监听到,保留 session 停机重启,依然可以接受到消息。(2.2.9开始支持)
    timeout: 5                  # 超时时间,单位:秒,默认:5秒
    reconnect: true             # 是否重连,默认:true
    re-interval: 5000           # 重连时间,默认 5000 毫秒
    version: mqtt_3_1_1         # mqtt 协议版本,可选 MQTT_3_1、mqtt_3_1_1、mqtt_5,默认:mqtt_3_1_1
    read-buffer-size: 8KB       # 接收数据的 buffer size,默认:8k
    max-bytes-in-message: 10MB  # 消息解析最大 bytes 长度,默认:10M
    keep-alive-secs: 60         # keep-alive 时间,单位:秒
    heartbeat-mode: LAST_REQ    # 心跳模式,支持最后发送或接收心跳时间来计算心跳,默认:最后发送心跳的时间。(2.4.3 开始支持)
    heartbeat-timeout-strategy: PING # 心跳超时策略,支持发送 PING 和 CLOSE 断开连接,默认:最大努力发送 PING。(2.4.3 开始支持)
    clean-session: true         # mqtt clean session,默认:true
    session-expiry-interval-secs: 0 # 开启保留 session 时,session 的有效期,默认:0(2.4.2 开始支持)
    biz-thread-pool-size: 2     # mqtt 工作线程数,默认:2,如果消息量比较大,处理较慢,例如做 emqx 的转发消息处理,可以调大此参数(2.4.2 开始支持)
    ssl:
      enabled: false            # 是否开启 ssl 认证,2.1.0 开始支持双向认证
      keystore-path:            # 可选参数:ssl 双向认证 keystore 目录,支持 classpath:/ 路径。
      keystore-pass:            # 可选参数:ssl 双向认证 keystore 密码
      truststore-path:          # 可选参数:ssl 双向认证 truststore 目录,支持 classpath:/ 路径。
      truststore-pass:          # 可选参数:ssl 双向认证 truststore 密码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166

# 启动后端程序

  • 找到SanaServerApplication启动文件(sana-server/src/main/java/com/sana/SanaServerApplication)

  • 右键,选择: Run 'SanaServerAppl....mian()',即可启动项目

  • 启动效果:

上次更新: 2025/06/04
安装Tdengine
运行前端

← 安装Tdengine 运行前端→

最近更新
01
摄像头管理
11-02
02
项目介绍
06-02
03
后续计划
06-02
更多文章>
Theme by Vdoing | Copyright © 2024-2025 lyl-xf | Apache 2.0 License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式