Compare commits

...

4 Commits

Author SHA1 Message Date
tomsun28
2026d0e34f [monitor]feature: support roles permission, admin-user-guest 2022-04-17 21:26:22 +08:00
观沧海
39d31ad196 [script]bugfix #96,TDengine timezone error when docker-compose (#98)
Co-authored-by: Musk.Chen <Musk.Chen@fanruan.com>
2022-04-17 12:39:13 +08:00
tomsun28
70c31f1db7 [docs]add hertzbeat deploy video link 2022-04-17 12:30:11 +08:00
tomsun28
589d178586 [web-app]bugfix: filter is missing when alert-center pageSize change (#97) 2022-04-16 22:16:55 +08:00
17 changed files with 275 additions and 163 deletions

View File

@@ -62,6 +62,8 @@
- 如果您不想部署而是直接使用我们提供SAAS监控云-[TanCloud探云](https://console.tancloud.cn),即刻 **[登录注册](https://console.tancloud.cn)** 免费使用。 - 如果您不想部署而是直接使用我们提供SAAS监控云-[TanCloud探云](https://console.tancloud.cn),即刻 **[登录注册](https://console.tancloud.cn)** 免费使用。
- 如果您是想将HertzBeat部署到内网环境搭建监控系统请参考下面的 [部署文档](https://hertzbeat.com/docs/start/quickstart) 进行操作。 - 如果您是想将HertzBeat部署到内网环境搭建监控系统请参考下面的 [部署文档](https://hertzbeat.com/docs/start/quickstart) 进行操作。
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
### 🐵 依赖服务部署 ### 🐵 依赖服务部署
> HertzBeat最少依赖于 关系型数据库[MYSQL5+](https://www.mysql.com/) 和 时序性数据库[TDengine2+](https://www.taosdata.com/getting-started) > HertzBeat最少依赖于 关系型数据库[MYSQL5+](https://www.mysql.com/) 和 时序性数据库[TDengine2+](https://www.taosdata.com/getting-started)

View File

@@ -6,6 +6,8 @@ sidebar_label: Docker方式部署
> 推荐使用docker部署HertzBeat > 推荐使用docker部署HertzBeat
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
1. 下载安装Docker环境 1. 下载安装Docker环境
Docker 工具自身的下载请参考 [Docker官网文档](https://docs.docker.com/get-docker/)。 Docker 工具自身的下载请参考 [Docker官网文档](https://docs.docker.com/get-docker/)。
安装完毕后终端查看Docker版本是否正常输出。 安装完毕后终端查看Docker版本是否正常输出。
@@ -47,71 +49,101 @@ sidebar_label: Docker方式部署
```yaml ```yaml
resourceRole: resourceRole:
- /account/auth/refresh===post===[role1,role2,role3,role4] - /account/auth/refresh===post===[admin,user,guest]
- /apps/**===get===[admin,user,guest]
- /monitor/**===get===[admin,user,guest]
- /monitor/**===post===[admin,user]
- /monitor/**===put===[admin,user]
- /monitor/**===delete==[admin]
- /monitors/**===get===[admin,user,guest]
- /monitors/**===post===[admin,user]
- /monitors/**===put===[admin,user]
- /monitors/**===delete===[admin]
- /alert/**===get===[admin,user,guest]
- /alert/**===post===[admin,user]
- /alert/**===put===[admin,user]
- /alert/**===delete===[admin]
- /alerts/**===get===[admin,user,guest]
- /alerts/**===post===[admin,user]
- /alerts/**===put===[admin,user]
- /alerts/**===delete===[admin]
- /notice/**===get===[admin,user,guest]
- /notice/**===post===[admin,user]
- /notice/**===put===[admin,user]
- /notice/**===delete===[admin]
- /summary/**===get===[admin,user,guest]
- /summary/**===post===[admin,user]
- /summary/**===put===[admin,user]
- /summary/**===delete===[admin]
excludedResource: excludedResource:
- /account/auth/**===* - /account/auth/**===*
- /===get - /===get
- /i18n/**===get - /i18n/**===get
- /apps/hierarchy===get - /apps/hierarchy===get
- /console/**===get # web ui 静态资源
- /**/*.html===get - /console/**===get
- /**/*.js===get - /**/*.html===get
- /**/*.css===get - /**/*.js===get
- /**/*.ico===get - /**/*.css===get
- /**/*.ttf===get - /**/*.ico===get
- /**/*.png===get - /**/*.ttf===get
- /**/*.gif===get - /**/*.png===get
- /**/*.gif===get
- /**/*.png===* - /**/*.png===*
- /swagger-resources/**===get # swagger ui 资源
- /v2/api-docs===get - /swagger-resources/**===get
- /v3/api-docs===get - /v2/api-docs===get
- /v3/api-docs===get
account:
- appId: admin
credential: admin
role: [admin,user]
- appId: tom
credential: tom@123
role: [user]
- appId: guest
credential: guest
role: [guest]
- appId: lili
# 注意 Digest认证不支持加盐加密的密码账户
# 加盐加密的密码,通过 MD5(password+salt)计算
# 此账户的原始密码为 lili
credential: 1A676730B0C7F54654B0E09184448289
salt: 123
role: [guest]
# 用户账户信息
# 下面有 admin tom lili 三个账户
# eg: admin 拥有[role1,role2]角色,密码为admin
# eg: tom 拥有[role1,role2,role3],密码为tom@123
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
account:
- appId: admin
credential: admin
role: [role1,role2]
- appId: tom
credential: tom@123
role: [role1,role2,role3]
- appId: lili
# 注意 Digest认证不支持加盐加密的密码账户
# 加盐加密的密码,通过 MD5(password+salt)计算
# 此账户的原始密码为 lili
credential: 1A676730B0C7F54654B0E09184448289
salt: 123
role: [role1,role2]
``` ```
修改sureness.yml的如下**部分参数****[注意⚠sureness配置的其它默认参数需保留]** 修改sureness.yml的如下**部分参数****[注意⚠sureness配置的其它默认参数需保留]**
```yaml ```yaml
# 用户账户信息 # 用户账户信息
# 下面有 admin tom lili 三个账户 # 下面有 admin tom lili 三个账户
# eg: admin 拥有[role1,role2]角色,密码为admin # eg: admin 拥有[admin,user]角色,密码为admin
# eg: tom 拥有[role1,role2,role3],密码为tom@123 # eg: tom 拥有[user],密码为tom@123
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289 # eg: lili 拥有[guest],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
account: account:
- appId: admin - appId: admin
credential: admin credential: admin
role: [role1,role2] role: [admin,user]
- appId: tom - appId: tom
credential: tom@123 credential: tom@123
role: [role1,role2,role3] role: [user]
- appId: lili - appId: guest
# 注意 Digest认证不支持加盐加密的密码账户 credential: guest
# 加盐加密的密码,通过 MD5(password+salt)计算 role: [guest]
# 此账户的原始密码为 lili - appId: lili
credential: 1A676730B0C7F54654B0E09184448289 # 注意 Digest认证不支持加盐加密的密码账户
salt: 123 # 加盐加密的密码,通过 MD5(password+salt)计算
role: [role1,role2] # 此账户的原始密码为 lili
credential: 1A676730B0C7F54654B0E09184448289
salt: 123
role: [guest]
``` ```
6. 启动HertzBeat Docker容器 6. 启动HertzBeat Docker容器

View File

@@ -5,6 +5,8 @@ sidebar_label: MYSQL安装初始化
--- ---
MYSQL是一款值得信赖的关系型数据库HertzBeat使用其存储监控信息告警信息配置信息等结构化关系数据。 MYSQL是一款值得信赖的关系型数据库HertzBeat使用其存储监控信息告警信息配置信息等结构化关系数据。
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
> 如果您已有MYSQL环境可直接跳到SQL脚本执行那一步。 > 如果您已有MYSQL环境可直接跳到SQL脚本执行那一步。
### 通过Docker方式安装MYSQL ### 通过Docker方式安装MYSQL

View File

@@ -3,7 +3,9 @@ id: package-deploy
title: 通过安装包安装HertzBeat title: 通过安装包安装HertzBeat
sidebar_label: 安装包方式部署 sidebar_label: 安装包方式部署
--- ---
> HertzBeat支持在Linux Windows Mac系统安装运行CPU支持X64/ARM64。由于安装包自身不包含JAVA运行环境需您提前准备JAVA运行环境。 > HertzBeat支持在Linux Windows Mac系统安装运行CPU支持X86/ARM64。由于安装包自身不包含JAVA运行环境需您提前准备JAVA运行环境。
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
1. 安装JAVA运行环境-可参考[官方网站](http://www.oracle.com/technetwork/java/javase/downloads/index.html) 1. 安装JAVA运行环境-可参考[官方网站](http://www.oracle.com/technetwork/java/javase/downloads/index.html)
要求JDK8+(已验证JDK8) 要求JDK8+(已验证JDK8)
@@ -49,25 +51,30 @@ sidebar_label: 安装包方式部署
修改sureness.yml的如下**部分参数****[注意⚠sureness配置的其它默认参数需保留]** 修改sureness.yml的如下**部分参数****[注意⚠sureness配置的其它默认参数需保留]**
```yaml ```yaml
# 用户账户信息
# 下面有 admin tom lili 三个账户 # 用户账户信息
# eg: admin 拥有[role1,role2]角色,密码为admin # 下面有 admin tom lili 三个账户
# eg: tom 拥有[role1,role2,role3],密码为tom@123 # eg: admin 拥有[admin,user]角色,密码为admin
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289 # eg: tom 拥有[user],密码为tom@123
account: # eg: lili 拥有[guest],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
- appId: admin account:
credential: admin - appId: admin
role: [role1,role2] credential: admin
- appId: tom role: [admin,user]
credential: tom@123 - appId: tom
role: [role1,role2,role3] credential: tom@123
- appId: lili role: [user]
# 注意 Digest认证不支持加盐加密的密码账户 - appId: guest
# 加盐加密的密码,通过 MD5(password+salt)计算 credential: guest
# 此账户的原始密码为 lili role: [guest]
credential: 1A676730B0C7F54654B0E09184448289 - appId: lili
salt: 123 # 注意 Digest认证不支持加盐加密的密码账户
role: [role1,role2] # 加盐加密的密码,通过 MD5(password+salt)计算
# 此账户的原始密码为 lili
credential: 1A676730B0C7F54654B0E09184448289
salt: 123
role: [guest]
``` ```
5. 部署启动 5. 部署启动

View File

@@ -9,6 +9,8 @@ sidebar_label: 快速开始
- 如果您不想部署而是直接使用我们提供SAAS监控云-[TanCloud探云](https://console.tancloud.cn),即刻[登录注册](https://console.tancloud.cn)免费使用。 - 如果您不想部署而是直接使用我们提供SAAS监控云-[TanCloud探云](https://console.tancloud.cn),即刻[登录注册](https://console.tancloud.cn)免费使用。
- 如果您是想将HertzBeat部署到内网环境搭建监控系统请参考下面的部署文档进行操作。 - 如果您是想将HertzBeat部署到内网环境搭建监控系统请参考下面的部署文档进行操作。
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
### 🐵 依赖服务部署 ### 🐵 依赖服务部署
> HertzBeat最少依赖于 关系型数据库[MYSQL5+](https://www.mysql.com/) 和 时序性数据库[TDengine2+](https://www.taosdata.com/getting-started) > HertzBeat最少依赖于 关系型数据库[MYSQL5+](https://www.mysql.com/) 和 时序性数据库[TDengine2+](https://www.taosdata.com/getting-started)

View File

@@ -5,8 +5,11 @@ sidebar_label: TDengine安装初始化
--- ---
TDengine是一款国产的开源物联网时序型数据库我们使用其替换了InfluxDb来存储采集到的监控指标数据。 TDengine是一款国产的开源物联网时序型数据库我们使用其替换了InfluxDb来存储采集到的监控指标数据。
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
> 如果您已有TDengine环境可直接跳到创建数据库实例那一步。 > 如果您已有TDengine环境可直接跳到创建数据库实例那一步。
### 通过Docker方式安装TDengine ### 通过Docker方式安装TDengine
> 可参考官方网站[安装教程](https://www.taosdata.com/docs/cn/v2.0/getting-started/docker) > 可参考官方网站[安装教程](https://www.taosdata.com/docs/cn/v2.0/getting-started/docker)
1. 下载安装Docker环境 1. 下载安装Docker环境

View File

@@ -0,0 +1,14 @@
{
"title": {
"message": "Blog",
"description": "The title for the blog used in SEO"
},
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Recent posts",
"description": "The label for the left sidebar"
}
}

View File

@@ -2,10 +2,35 @@
# 加载到匹配字典的资源,也就是需要被保护的,设置了所支持角色访问的资源 # 加载到匹配字典的资源,也就是需要被保护的,设置了所支持角色访问的资源
# 没有配置的资源也默认被认证保护,但不鉴权 # 没有配置的资源也默认被认证保护,但不鉴权
# eg: /api/v1/source1===get===[role2] 表示 /api/v2/host===post 这条资源支持 role2 这一种角色访问 # eg: /api/v1/source1===get===[admin] 表示 /api/v2/host===post 这条资源支持 admin 这一种角色访问
# eg: /api/v1/source2===get===[] 表示 /api/v1/source2===get 这条资源不支持任何角色访问 # eg: /api/v1/source2===get===[] 表示 /api/v1/source2===get 这条资源不支持任何角色访问
resourceRole: resourceRole:
- /account/auth/refresh===post===[role1,role2,role3,role4] - /account/auth/refresh===post===[admin,user,guest]
- /apps/**===get===[admin,user,guest]
- /monitor/**===get===[admin,user,guest]
- /monitor/**===post===[admin,user]
- /monitor/**===put===[admin,user]
- /monitor/**===delete==[admin]
- /monitors/**===get===[admin,user,guest]
- /monitors/**===post===[admin,user]
- /monitors/**===put===[admin,user]
- /monitors/**===delete===[admin]
- /alert/**===get===[admin,user,guest]
- /alert/**===post===[admin,user]
- /alert/**===put===[admin,user]
- /alert/**===delete===[admin]
- /alerts/**===get===[admin,user,guest]
- /alerts/**===post===[admin,user]
- /alerts/**===put===[admin,user]
- /alerts/**===delete===[admin]
- /notice/**===get===[admin,user,guest]
- /notice/**===post===[admin,user]
- /notice/**===put===[admin,user]
- /notice/**===delete===[admin]
- /summary/**===get===[admin,user,guest]
- /summary/**===post===[admin,user]
- /summary/**===put===[admin,user]
- /summary/**===delete===[admin]
# 需要被过滤保护的资源,不认证鉴权直接访问 # 需要被过滤保护的资源,不认证鉴权直接访问
# /api/v1/source3===get 表示 /api/v1/source3===get 可以被任何人访问 无需登录认证鉴权 # /api/v1/source3===get 表示 /api/v1/source3===get 可以被任何人访问 无需登录认证鉴权
@@ -31,20 +56,23 @@ excludedResource:
# 用户账户信息 # 用户账户信息
# 下面有 admin tom lili 三个账户 # 下面有 admin tom lili 三个账户
# eg: admin 拥有[role1,role2]角色,密码为admin # eg: admin 拥有[admin,user]角色,密码为admin
# eg: tom 拥有[role1,role2,role3],密码为tom@123 # eg: tom 拥有[user],密码为tom@123
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289 # eg: lili 拥有[guest],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
account: account:
- appId: admin - appId: admin
credential: admin credential: admin
role: [role1,role2] role: [admin,user]
- appId: tom - appId: tom
credential: tom@123 credential: tom@123
role: [role1,role2,role3] role: [user]
- appId: guest
credential: guest
role: [guest]
- appId: lili - appId: lili
# 注意 Digest认证不支持加盐加密的密码账户 # 注意 Digest认证不支持加盐加密的密码账户
# 加盐加密的密码,通过 MD5(password+salt)计算 # 加盐加密的密码,通过 MD5(password+salt)计算
# 此账户的原始密码为 lili # 此账户的原始密码为 lili
credential: 1A676730B0C7F54654B0E09184448289 credential: 1A676730B0C7F54654B0E09184448289
salt: 123 salt: 123
role: [role1,role2] role: [guest]

View File

@@ -2,10 +2,35 @@
# 加载到匹配字典的资源,也就是需要被保护的,设置了所支持角色访问的资源 # 加载到匹配字典的资源,也就是需要被保护的,设置了所支持角色访问的资源
# 没有配置的资源也默认被认证保护,但不鉴权 # 没有配置的资源也默认被认证保护,但不鉴权
# eg: /api/v1/source1===get===[role2] 表示 /api/v2/host===post 这条资源支持 role2 这一种角色访问 # eg: /api/v1/source1===get===[admin] 表示 /api/v2/host===post 这条资源支持 admin 这一种角色访问
# eg: /api/v1/source2===get===[] 表示 /api/v1/source2===get 这条资源不支持任何角色访问 # eg: /api/v1/source2===get===[] 表示 /api/v1/source2===get 这条资源不支持任何角色访问
resourceRole: resourceRole:
- /account/auth/refresh===post===[role1,role2,role3,role4] - /account/auth/refresh===post===[admin,user,guest]
- /apps/**===get===[admin,user,guest]
- /monitor/**===get===[admin,user,guest]
- /monitor/**===post===[admin,user]
- /monitor/**===put===[admin,user]
- /monitor/**===delete==[admin]
- /monitors/**===get===[admin,user,guest]
- /monitors/**===post===[admin,user]
- /monitors/**===put===[admin,user]
- /monitors/**===delete===[admin]
- /alert/**===get===[admin,user,guest]
- /alert/**===post===[admin,user]
- /alert/**===put===[admin,user]
- /alert/**===delete===[admin]
- /alerts/**===get===[admin,user,guest]
- /alerts/**===post===[admin,user]
- /alerts/**===put===[admin,user]
- /alerts/**===delete===[admin]
- /notice/**===get===[admin,user,guest]
- /notice/**===post===[admin,user]
- /notice/**===put===[admin,user]
- /notice/**===delete===[admin]
- /summary/**===get===[admin,user,guest]
- /summary/**===post===[admin,user]
- /summary/**===put===[admin,user]
- /summary/**===delete===[admin]
# 需要被过滤保护的资源,不认证鉴权直接访问 # 需要被过滤保护的资源,不认证鉴权直接访问
# /api/v1/source3===get 表示 /api/v1/source3===get 可以被任何人访问 无需登录认证鉴权 # /api/v1/source3===get 表示 /api/v1/source3===get 可以被任何人访问 无需登录认证鉴权
@@ -31,20 +56,23 @@ excludedResource:
# 用户账户信息 # 用户账户信息
# 下面有 admin tom lili 三个账户 # 下面有 admin tom lili 三个账户
# eg: admin 拥有[role1,role2]角色,密码为admin # eg: admin 拥有[admin,user]角色,密码为admin
# eg: tom 拥有[role1,role2,role3],密码为tom@123 # eg: tom 拥有[user],密码为tom@123
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289 # eg: lili 拥有[guest],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
account: account:
- appId: admin - appId: admin
credential: admin credential: admin
role: [role1,role2] role: [admin,user]
- appId: tom - appId: tom
credential: tom credential: tom@123
role: [role1,role2,role3] role: [user]
- appId: guest
credential: guest
role: [guest]
- appId: lili - appId: lili
# 注意 Digest认证不支持加盐加密的密码账户 # 注意 Digest认证不支持加盐加密的密码账户
# 加盐加密的密码,通过 MD5(password+salt)计算 # 加盐加密的密码,通过 MD5(password+salt)计算
# 此账户的原始密码为 lili # 此账户的原始密码为 lili
credential: 1A676730B0C7F54654B0E09194448289 credential: 1A676730B0C7F54654B0E09184448289
salt: 123 salt: 123
role: [role1,role2] role: [guest]

View File

@@ -26,6 +26,8 @@ services:
container_name: tdengine container_name: tdengine
hostname: tdengine hostname: tdengine
restart: always restart: always
environment:
TZ: Asia/Shanghai
ports: ports:
- "6030-6049:6030-6049" - "6030-6049:6030-6049"
- "6030-6049:6030-6049/udp" - "6030-6049:6030-6049/udp"

View File

@@ -2,10 +2,35 @@
# 加载到匹配字典的资源,也就是需要被保护的,设置了所支持角色访问的资源 # 加载到匹配字典的资源,也就是需要被保护的,设置了所支持角色访问的资源
# 没有配置的资源也默认被认证保护,但不鉴权 # 没有配置的资源也默认被认证保护,但不鉴权
# eg: /api/v1/source1===get===[role2] 表示 /api/v2/host===post 这条资源支持 role2 这一种角色访问 # eg: /api/v1/source1===get===[admin] 表示 /api/v2/host===post 这条资源支持 admin 这一种角色访问
# eg: /api/v1/source2===get===[] 表示 /api/v1/source2===get 这条资源不支持任何角色访问 # eg: /api/v1/source2===get===[] 表示 /api/v1/source2===get 这条资源不支持任何角色访问
resourceRole: resourceRole:
- /account/auth/refresh===post===[role1,role2,role3,role4] - /account/auth/refresh===post===[admin,user,guest]
- /apps/**===get===[admin,user,guest]
- /monitor/**===get===[admin,user,guest]
- /monitor/**===post===[admin,user]
- /monitor/**===put===[admin,user]
- /monitor/**===delete==[admin]
- /monitors/**===get===[admin,user,guest]
- /monitors/**===post===[admin,user]
- /monitors/**===put===[admin,user]
- /monitors/**===delete===[admin]
- /alert/**===get===[admin,user,guest]
- /alert/**===post===[admin,user]
- /alert/**===put===[admin,user]
- /alert/**===delete===[admin]
- /alerts/**===get===[admin,user,guest]
- /alerts/**===post===[admin,user]
- /alerts/**===put===[admin,user]
- /alerts/**===delete===[admin]
- /notice/**===get===[admin,user,guest]
- /notice/**===post===[admin,user]
- /notice/**===put===[admin,user]
- /notice/**===delete===[admin]
- /summary/**===get===[admin,user,guest]
- /summary/**===post===[admin,user]
- /summary/**===put===[admin,user]
- /summary/**===delete===[admin]
# 需要被过滤保护的资源,不认证鉴权直接访问 # 需要被过滤保护的资源,不认证鉴权直接访问
# /api/v1/source3===get 表示 /api/v1/source3===get 可以被任何人访问 无需登录认证鉴权 # /api/v1/source3===get 表示 /api/v1/source3===get 可以被任何人访问 无需登录认证鉴权
@@ -23,7 +48,7 @@ excludedResource:
- /**/*.ttf===get - /**/*.ttf===get
- /**/*.png===get - /**/*.png===get
- /**/*.gif===get - /**/*.gif===get
- /**/*.png===* - /**/*.png===*
# swagger ui 资源 # swagger ui 资源
- /swagger-resources/**===get - /swagger-resources/**===get
- /v2/api-docs===get - /v2/api-docs===get
@@ -31,20 +56,23 @@ excludedResource:
# 用户账户信息 # 用户账户信息
# 下面有 admin tom lili 三个账户 # 下面有 admin tom lili 三个账户
# eg: admin 拥有[role1,role2]角色,密码为admin # eg: admin 拥有[admin,user]角色,密码为admin
# eg: tom 拥有[role1,role2,role3],密码为tom@123 # eg: tom 拥有[user],密码为tom@123
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289 # eg: lili 拥有[guest],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
account: account:
- appId: admin - appId: admin
credential: admin credential: admin
role: [role1,role2] role: [admin,user]
- appId: tom - appId: tom
credential: tom@123 credential: tom@123
role: [role1,role2,role3] role: [user]
- appId: guest
credential: guest
role: [guest]
- appId: lili - appId: lili
# 注意 Digest认证不支持加盐加密的密码账户 # 注意 Digest认证不支持加盐加密的密码账户
# 加盐加密的密码,通过 MD5(password+salt)计算 # 加盐加密的密码,通过 MD5(password+salt)计算
# 此账户的原始密码为 lili # 此账户的原始密码为 lili
credential: 1A676730B0C7F54654B0E09184448289 credential: 1A676730B0C7F54654B0E09184448289
salt: 123 salt: 123
role: [role1,role2] role: [guest]

View File

@@ -26,8 +26,8 @@ const CODE_MESSAGE: { [key: number]: string } = {
202: '一个请求已经进入后台排队(异步任务)。', 202: '一个请求已经进入后台排队(异步任务)。',
204: '删除数据成功。', 204: '删除数据成功。',
400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。', 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
401: '用户没有权限(令牌、用户名、密码错误)。', 401: '用户认证信息异常。',
403: '用户无权限访问此资源。', 403: '用户无此操作权限。',
404: '发出的请求针对的是不存在的记录,服务器没有进行操作。', 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
406: '请求的格式不可得。', 406: '请求的格式不可得。',
409: '请求与服务器端目标资源的当前状态相冲突', 409: '请求与服务器端目标资源的当前状态相冲突',
@@ -65,7 +65,11 @@ export class DefaultInterceptor implements HttpInterceptor {
private checkStatus(ev: HttpResponseBase): void { private checkStatus(ev: HttpResponseBase): void {
const errorText = CODE_MESSAGE[ev.status] || ev.statusText; const errorText = CODE_MESSAGE[ev.status] || ev.statusText;
console.warn(` ${ev.status}: ${ev.url}`, errorText); console.warn(` ${ev.status}: ${ev.url}`, errorText);
this.notification.error(` ${ev.status}: ${ev.url}`, errorText); if (ev.status == 403) {
this.notification.error(` ${ev.status}: ${errorText}`, '');
} else {
this.notification.error(` ${ev.status}: ${ev.url}`, errorText);
}
} }
/** /**

View File

@@ -54,7 +54,7 @@ export class HeaderNotifyComponent implements OnInit {
return; return;
} }
this.loading = true; this.loading = true;
let loadAlerts$ = this.alertSvc.searchAlerts(0, undefined, undefined, 0, 5).subscribe( let loadAlerts$ = this.alertSvc.loadAlerts(0, undefined, undefined, 0, 5).subscribe(
message => { message => {
loadAlerts$.unsubscribe(); loadAlerts$.unsubscribe();
if (message.code === 0) { if (message.code === 0) {

View File

@@ -30,7 +30,7 @@
<i nz-icon nzType="sync" nzTheme="outline"></i> <i nz-icon nzType="sync" nzTheme="outline"></i>
</button> </button>
<button style="margin-right: 25px; float: right" nz-button nzType="primary" (click)="onFilterSearchAlerts()"> <button style="margin-right: 25px; float: right" nz-button nzType="primary" (click)="loadAlertsTable()">
{{ 'common.search' | i18n }} {{ 'common.search' | i18n }}
</button> </button>
<input <input
@@ -39,7 +39,7 @@
type="text" type="text"
[placeholder]="'alert.center.search' | i18n" [placeholder]="'alert.center.search' | i18n"
nzSize="default" nzSize="default"
(keyup.enter)="onFilterSearchAlerts()" (keyup.enter)="loadAlertsTable()"
[(ngModel)]="filterContent" [(ngModel)]="filterContent"
/> />
<nz-select <nz-select

View File

@@ -36,13 +36,16 @@ export class AlertCenterComponent implements OnInit {
this.loadAlertsTable(); this.loadAlertsTable();
} }
onFilterSearchAlerts() { sync() {
this.loadAlertsTable();
}
loadAlertsTable() {
this.tableLoading = true; this.tableLoading = true;
let filterAlerts$ = this.alertSvc let alertsInit$ = this.alertSvc
.searchAlerts(this.filterStatus, this.filterPriority, this.filterContent, this.pageIndex - 1, this.pageSize) .loadAlerts(this.filterStatus, this.filterPriority, this.filterContent, this.pageIndex - 1, this.pageSize)
.subscribe( .subscribe(
message => { message => {
filterAlerts$.unsubscribe();
this.tableLoading = false; this.tableLoading = false;
this.checkedAll = false; this.checkedAll = false;
this.checkedAlertIds.clear(); this.checkedAlertIds.clear();
@@ -54,44 +57,16 @@ export class AlertCenterComponent implements OnInit {
} else { } else {
console.warn(message.msg); console.warn(message.msg);
} }
alertsInit$.unsubscribe();
}, },
error => { error => {
this.tableLoading = false; this.tableLoading = false;
filterAlerts$.unsubscribe(); alertsInit$.unsubscribe();
console.error(error.msg); console.error(error.msg);
} }
); );
} }
sync() {
this.loadAlertsTable();
}
loadAlertsTable() {
this.tableLoading = true;
let alertsInit$ = this.alertSvc.getAlerts(this.pageIndex - 1, this.pageSize).subscribe(
message => {
this.tableLoading = false;
this.checkedAll = false;
this.checkedAlertIds.clear();
if (message.code === 0) {
let page = message.data;
this.alerts = page.content;
this.pageIndex = page.number + 1;
this.total = page.totalElements;
} else {
console.warn(message.msg);
}
alertsInit$.unsubscribe();
},
error => {
this.tableLoading = false;
alertsInit$.unsubscribe();
console.error(error.msg);
}
);
}
onDeleteAlerts() { onDeleteAlerts() {
if (this.checkedAlertIds == null || this.checkedAlertIds.size === 0) { if (this.checkedAlertIds == null || this.checkedAlertIds.size === 0) {
this.notifySvc.warning(this.i18nSvc.fanyi('alert.center.notify.no-delete'), ''); this.notifySvc.warning(this.i18nSvc.fanyi('alert.center.notify.no-delete'), '');

View File

@@ -347,7 +347,7 @@ export class DashboardComponent implements OnInit, OnDestroy {
alertsDealLoading: boolean = true; alertsDealLoading: boolean = true;
refreshAlertContentList(): void { refreshAlertContentList(): void {
let alertsInit$ = this.alertSvc.getAlerts(0, 4).subscribe( let alertsInit$ = this.alertSvc.loadAlerts(undefined, undefined, undefined, 0, 4).subscribe(
message => { message => {
if (message.code === 0) { if (message.code === 0) {
let page = message.data; let page = message.data;

View File

@@ -16,22 +16,7 @@ const alerts_status_uri = '/alerts/status';
export class AlertService { export class AlertService {
constructor(private http: HttpClient) {} constructor(private http: HttpClient) {}
public getAlerts(pageIndex: number, pageSize: number): Observable<Message<Page<Alert>>> { public loadAlerts(
pageIndex = pageIndex ? pageIndex : 0;
pageSize = pageSize ? pageSize : 8;
// 注意HttpParams是不可变对象 需要保存set后返回的对象为最新对象
let httpParams = new HttpParams();
httpParams = httpParams.appendAll({
sort: 'id',
order: 'desc',
pageIndex: pageIndex,
pageSize: pageSize
});
const options = { params: httpParams };
return this.http.get<Message<Page<Alert>>>(alerts_uri, options);
}
public searchAlerts(
status: number | undefined, status: number | undefined,
priority: number | undefined, priority: number | undefined,
content: string | undefined, content: string | undefined,