Compare commits

..

2132 Commits

Author SHA1 Message Date
Diego
6427ee6ee0 refactor: 降低sqlite依赖 2025-06-27 14:44:00 +08:00
Diego
4c95997d62 build: 10.9.2
fix: taos connection dispose
refactor: opcua AddSubscriptionAsync 添加延时和重试
2025-06-27 11:16:58 +08:00
Diego
1d82cea40d build: 10.9.1
fix: 任务空错误异常
feat: 数据库插件增加字符串变量表和数值变量表两种情况
2025-06-27 03:02:03 +08:00
Diego
e78799424c 添加日志输出筛选 2025-06-25 17:09:05 +08:00
Diego
1000c8d38f docs: 更新采集插件开发文档 2025-06-25 14:22:58 +08:00
Diego
b2589fc634 build: 10.8.24
fix: 变量离线后再次上线,如果值不变,会导致在线状态不刷新
fix: s7离线恢复时,可能触发多次协议握手导致异常
2025-06-25 11:19:06 +08:00
Diego
c80e57a4e8 build: 10.8.24
fix: 变量离线后再次上线,如果值不变,会导致在线状态不刷新
fix: s7离线恢复时,可能触发多次协议握手导致异常
2025-06-25 11:17:04 +08:00
Diego
6510c3e289 feat: 增加一个变量读写表达式常用转换的友好编辑界面 2025-06-24 16:14:35 +08:00
Diego
920e407d05 恢复规则引擎脚本接口 2025-06-24 10:52:00 +08:00
Diego
7314c8901d fix: 用户编辑框初始刷新职位 2025-06-24 09:15:33 +08:00
Diego
4e9f02b48c 更新依赖包 2025-06-24 09:03:34 +08:00
2248356998 qq.com
9ae7602cb4 配置最大连接数 2025-06-24 00:09:07 +08:00
2248356998 qq.com
aa8aa36aef build: 10.8.19
fix: s7 复用地址对象导致读取异常
feat: 规则引擎node添加内部异常捕获
feat: 变量增加属性: 写入后再次读取检查值是否一致
2025-06-23 21:21:27 +08:00
2248356998 qq.com
0174f7c6f2 更新依赖 2025-06-22 23:05:12 +08:00
2248356998 qq.com
df9e7d6ff1 10.8.17 2025-06-22 21:11:37 +08:00
Diego
b40ca920d3 fix: 变量自动刷新运行态 2025-06-20 16:58:45 +08:00
Diego
5a4b0a0e93 修改插件过期提示 2025-06-20 14:43:13 +08:00
Diego
a879edd68b 10.8.12 2025-06-20 13:52:42 +08:00
Diego
62e0a6ee9d gitee登录按钮隐藏 2025-06-19 17:04:22 +08:00
Diego
765e5564d4 10.8.10 2025-06-19 16:56:04 +08:00
Diego
10eecac19b feat: 优化设备状态逻辑 2025-06-19 11:41:43 +08:00
Diego
59241b8faa fix: opcua插件订阅检查失效 2025-06-19 10:42:54 +08:00
Diego
52b3097f04 10.8.7 2025-06-18 22:04:48 +08:00
Diego
d922296b70 feat: 重构插件任务 2025-06-18 17:11:57 +08:00
Diego
aec91da28b 10.8.2
feat: 优化闭包导致的状态机内存占用,高并发时内存显著下降
fix(sqldb): 定时上传模式时,实时表时效
fix(taos): 初始化失败
2025-06-17 17:09:05 +08:00
Diego
013ff394be 10.8.1 2025-06-16 18:25:55 +08:00
Diego
081e07473d 10.8.0 2025-06-16 18:12:28 +08:00
Diego
d33d900592 增加github oauth登录 2025-06-15 00:17:25 +08:00
Diego
29365c4ef9 修改脚本测试方法 2025-06-14 11:56:31 +08:00
Diego
17a6189089 style: 更新SysResourcePage页面样式 2025-06-13 16:03:28 +08:00
Diego
003b8a3763 10.7.56 2025-06-13 13:35:38 +08:00
Diego
1c7f8b5cab 10.7.55 2025-06-13 09:14:22 +08:00
Diego
b7ff9ffca2 更新解决方案 2025-06-13 09:06:42 +08:00
Diego
9bba9bda76 10.7.54 2025-06-12 23:54:10 +08:00
Diego
ec2fcc75d3 合并代码 2025-06-12 20:21:50 +08:00
Diego
57a4038577 pwa安装提示优化 2025-06-12 10:20:52 +08:00
Diego
b78a76e60f 增加采集设备写入数据的控制台文本日志 2025-06-11 23:49:37 +08:00
Diego
28bd751d44 增加tab右键菜单 2025-06-11 22:57:00 +08:00
Diego
dcba7b9810 10.7.50 2025-06-11 21:50:46 +08:00
Diego
7f1a741ce6 优化sql实时表执行性能 2025-06-11 21:39:14 +08:00
Diego
ca2b17d433 10.7.47 2025-06-11 17:08:19 +08:00
Diego
af589eac10 更新依赖 2025-06-11 15:05:03 +08:00
Diego
573670f1f5 10.7.45 2025-06-11 10:26:48 +08:00
Diego
f3ec85a03d 更新测试 2025-06-10 16:26:14 +08:00
Diego
c94308454f build: 10.7.42
feat:更改后台服务多语言处理方式
2025-06-10 15:49:47 +08:00
Diego
c9c2b2b69d 10.7.39 2025-06-09 16:11:37 +08:00
Diego
40574b776f feat(TDengine): 支持websocket连接,无需安装sdk 2025-06-09 12:38:30 +08:00
Diego
f426c1533d fix: taos插件 not found dll错误 2025-06-09 10:07:58 +08:00
Diego
4a3b5163f1 更新依赖 2025-06-09 09:29:41 +08:00
2248356998 qq.com
3a0946d357 优化单例db对象获取 2025-06-08 21:09:07 +08:00
Diego
9dd21c644c 10.7.35 2025-06-08 15:48:13 +08:00
2248356998 qq.com
6713190a23 日志写入器释放 2025-06-08 15:47:25 +08:00
Diego
9f24533425 10.7.34 2025-06-08 15:38:41 +08:00
2248356998 qq.com
ed1d9374eb 2025-06-08 01:22:41 +08:00
Diego
f14d27129e 10.7.33 2025-06-07 22:30:27 +08:00
2248356998 qq.com
5b04f02fbe Merge branch 'v10' of https://gitee.com/ThingsGateway/ThingsGateway into v10 2025-06-07 22:26:32 +08:00
2248356998 qq.com
227080e332 ddp协议清理旧连接逻辑错误 2025-06-07 22:26:18 +08:00
Diego
1e87482a49 10.7.32 2025-06-07 15:25:38 +08:00
2248356998 qq.com
054d31c3ea 添加自定义插件 2025-06-07 15:14:54 +08:00
Diego
3a068a7b03 更新解决方案 2025-06-07 12:22:05 +08:00
Diego
b12e923c99 10.7.31 2025-06-06 23:47:07 +08:00
Diego
ab33eed8d3 10.7.22 2025-06-06 21:13:58 +08:00
Diego
d930a9a8eb 修改演示站登录ui 2025-06-05 08:40:25 +08:00
Diego
af381fce12 插件调试增加双击显示 2025-06-04 09:45:02 +08:00
Diego
b64ac0539e 更新依赖 2025-06-03 22:27:28 +08:00
Diego
541c60b363 10.7.17 2025-06-02 19:45:56 +08:00
Diego
824e95f7cb 10.7.16 2025-06-02 19:44:30 +08:00
youthalan
38f7850196 !66 修复缺少引用编译错误
* 修复缺少引用编译错误
2025-05-31 06:35:47 +00:00
Diego
bef9de88e2 oauth增加scope参数 2025-05-31 02:17:09 +08:00
Diego
48cd5e7c7f 增加演示站的gitee授权 2025-05-31 00:43:43 +08:00
Diego
3b44fda51c 修复hybrid程序 2025-05-30 13:48:03 +08:00
Diego
dbfc9a5bb4 更新授权显示 2025-05-30 11:21:45 +08:00
Diego
1b758aa41a 10.6.37 2025-05-30 10:15:58 +08:00
Diego
43bdc70899 优化文本日志读取 2025-05-30 10:02:51 +08:00
Diego
fadda000a6 添加sqlsugar类 2025-05-29 22:18:33 +08:00
Diego
45a8c91a5a 优化UI刷新 2025-05-29 17:05:06 +08:00
Diego
8e938f18be 去除不必要的控制台日志输出 2025-05-28 16:52:51 +08:00
Diego
ab1b364c54 fix: 同步插件反写空错误 2025-05-28 12:30:16 +08:00
Diego
5ec65b2fb0 10.6.29 2025-05-28 10:47:31 +08:00
Diego
926eced724 10.6.28 2025-05-27 17:20:05 +08:00
Diego
f7f8802272 2025-05-27 13:19:39 +08:00
Diego
c6910dff02 update src/Gateway/ThingsGateway.Gateway.Application/ThingsGateway.Gateway.Application.csproj.
Signed-off-by: Diego <2248356998@qq.com>
2025-05-27 01:37:29 +00:00
Diego
ad299d0dbb 2025-05-27 08:52:06 +08:00
2248356998 qq.com
8b124d1050 日志统计查询性能增强 2025-05-27 00:03:30 +08:00
Diego
ff41080dbd 更新授权类 2025-05-26 19:51:21 +08:00
Diego
0e28606e3d 10.6.23 2025-05-26 18:43:42 +08:00
Diego
6a025ceee5 序列化配置增加nan的情况 2025-05-26 17:41:13 +08:00
Diego
6b2e53d6dc 更新配置 2025-05-26 09:17:59 +08:00
2248356998 qq.com
b989aa5561 10.6.21 2025-05-26 00:05:16 +08:00
2248356998 qq.com
f5b0b7ebd2 fix: s7多写 2025-05-24 14:22:58 +08:00
2248356998 qq.com
16881ae076 fix: s7多写 2025-05-24 14:18:58 +08:00
2248356998 qq.com
af04112656 10.6.20
fix: s7多写
fix: opcuaserver写入数组
2025-05-24 14:11:10 +08:00
Diego
a2863112dc 2025-05-23 15:47:41 +08:00
Diego
f531e4dfc5 10.6.19 2025-05-23 13:16:57 +08:00
Diego
8db9b32ba7 10.6.18 2025-05-23 12:55:21 +08:00
Diego
dd5691cbef 更新依赖 2025-05-22 14:40:56 +08:00
Diego
de48b32af3 优化硬件信息曲线数据 2025-05-21 17:10:28 +08:00
Diego
600b5042a1 更新首页 2025-05-21 16:51:40 +08:00
Diego
aac77029da 修改数据保护密钥持久化位置 2025-05-21 13:15:39 +08:00
Diego
e50205f557 导出excel不再按设备名称和变量名称排序 2025-05-21 10:10:59 +08:00
Diego
e227411d1f fix: taos插件查询错误 2025-05-21 09:34:31 +08:00
2248356998 qq.com
2de0ed793f 调整json序列化内容 2025-05-20 23:21:58 +08:00
Diego
cb0276f273 fix: opcuamaster插件属性UI未正确显示 2025-05-20 15:20:14 +08:00
Diego
562b3f17c9 10.6.11 2025-05-19 23:16:49 +08:00
Diego
0f78f81c1c 10.6.7 2025-05-19 18:43:03 +08:00
Diego
6594937d0a 网关冗余备用站和同步插件支持 变量写入 2025-05-19 18:01:23 +08:00
Diego
64bc6084be 更新sln 2025-05-19 12:23:41 +08:00
Diego
20434d5bd2 10.6.5 2025-05-19 12:13:11 +08:00
Diego
9ecc9380e6 同步更改 2025-05-19 12:12:44 +08:00
Diego
a57c55080b 增加数据同步插件 2025-05-19 12:10:11 +08:00
2248356998 qq.com
b8ca06c6be fix: hybrid运行切换语言错误 2025-05-17 16:32:36 +08:00
Diego
5aff6461a1 fix: opcuaServer 业务设备刷新变量时可能导致内存泄露 2025-05-16 19:26:33 +08:00
Diego
6cf53fefec 优化内存占用 2025-05-16 18:00:36 +08:00
Diego
45132f3503 更新依赖 2025-05-16 10:51:44 +08:00
Diego
f1e78a0e8a 恢复配置json 2025-05-15 12:17:43 +08:00
Diego
0bf28ec275 更新语言资源 2025-05-15 12:17:09 +08:00
Diego
41f8412c97 支持达梦数据库 2025-05-15 12:15:32 +08:00
Diego
c535974362 更新规则引擎示例 2025-05-15 10:44:12 +08:00
Diego
1860c5f215 build:10.6.1 2025-05-15 09:12:33 +08:00
Diego
6d778b2d39 增加initDatabase配置项 2025-05-15 09:08:08 +08:00
Diego
f48b99c259 更新示例 2025-05-14 21:12:51 +08:00
Diego
3c73b93051 更新依赖 2025-05-14 18:52:19 +08:00
Diego
98f3f2d519 添加 `过滤离线变量` 插件属性 2025-05-14 13:01:12 +08:00
Diego
b76b4e8d68 变量表索引删除语句兼容性增强 2025-05-13 19:27:50 +08:00
Diego
07285a7c61 mqtt增加qos属性 2025-05-13 19:27:27 +08:00
Diego
03c0dfef37 增加业务设备日志 2025-05-12 15:26:51 +08:00
Diego
6ef6929c35 优化api权限树 2025-05-12 10:21:41 +08:00
Diego
e3c0c173f0 更新依赖 2025-05-12 08:53:25 +08:00
Diego
7d64e058d4 更新依赖 2025-05-08 16:34:48 +08:00
Diego
e97ee9b64b 10.5.15 2025-05-07 22:08:54 +08:00
Diego
6a03e39eeb 10.5.14 2025-05-07 22:00:31 +08:00
Diego
525ec740b5 添加脚本demo 2025-05-06 11:43:56 +08:00
2248356998 qq.com
b790cf5f4e 更新依赖 2025-05-05 20:25:43 +08:00
Diego
d1248811fd build: 10.5.11 2025-04-30 23:05:36 +08:00
2248356998 qq.com
022d016e8e feat: 添加采集组 2025-04-30 23:04:51 +08:00
Diego
f73245e650 build: 10.5.10 2025-04-30 15:31:39 +08:00
2248356998 qq.com
484461fa05 更新依赖 2025-04-30 15:29:19 +08:00
Diego
7e0b7aff2a feat: sqldb支持数组 2025-04-28 15:52:32 +08:00
Diego
6c450dcb09 feat: sqldb支持数组类型 2025-04-28 15:52:11 +08:00
Diego
227f44283f build: 10.5.8 2025-04-28 15:30:10 +08:00
Diego
74f6e79625 build: 10.5.7
优化opcua变量缓存
修复cron表达式间隔
2025-04-27 16:35:58 +08:00
Diego
cec43e2ce8 feat: 防呆设计,强制设置通道的最大并发数 2025-04-27 10:13:35 +08:00
Diego
7553b258bb build: 10.5.5 2025-04-26 17:46:31 +08:00
Diego
8bdbdc117e 支持bind链路设置多个通道 2025-04-26 17:10:46 +08:00
Diego
0e206be296 更新依赖 2025-04-26 16:17:02 +08:00
Diego
00b7353433 兼容性增强 2025-04-26 15:53:20 +08:00
Diego
44e7a83593 更新依赖 2025-04-26 15:02:57 +08:00
Diego
dd68d555d4 feat: 支持字节数组上传 2025-04-24 10:25:36 +08:00
2248356998 qq.com
0456296103 更新依赖包 2025-04-23 23:07:27 +08:00
Diego
a1b66277ff nuget 2025-04-23 15:28:53 +08:00
Diego
50758b79bc 更新依赖包 2025-04-23 11:48:45 +08:00
Diego
06a1f902ad 修改Startup方法名称 2025-04-23 10:56:03 +08:00
Diego
58f8b23b7c build:10.5.1
fix: 反向代理正确获取客户端IP

refactor: 添加demo站点域名
2025-04-22 11:45:14 +08:00
Diego
9e7c348b15 添加大数据写入方法 2025-04-21 23:05:10 +08:00
Diego
5f5ff8b43b 删除实体部分特性 2025-04-21 17:53:33 +08:00
Diego
f626b4e5fc sql插件增加分表模式 属性 2025-04-21 11:00:05 +08:00
2248356998 qq.com
bc23200e66 更新依赖 2025-04-20 20:32:41 +08:00
Diego
95ab59fd5a build: 10.4.21 2025-04-18 11:27:48 +08:00
Diego
0bbee003b0 app.json 2025-04-18 09:21:31 +08:00
Diego
d20cb7a928 兼容10.4.8以下数据库 2025-04-17 09:41:15 +08:00
Diego
952c134aba build: 10.4.19 2025-04-16 09:08:35 +08:00
2248356998 qq.com
5533d980e3 删除不必要的代码 2025-04-15 21:14:35 +08:00
2248356998 qq.com
aa0213818f 添加规则引擎日志清理任务 2025-04-15 20:59:01 +08:00
2248356998 qq.com
af88ffd57c 添加语言资源 2025-04-15 20:07:44 +08:00
2248356998 qq.com
87447b1c2a 传输model添加runtimetype 2025-04-15 20:01:21 +08:00
Diego
384a12880b 网关表格按钮权限 2025-04-15 10:13:37 +08:00
Diego
791f91f377 build: 10.4.18 2025-04-14 15:28:35 +08:00
Diego
4f8b405cc3 build:10.4.17 2025-04-13 13:03:39 +08:00
2248356998 qq.com
e1b7af201a 修改表单映射 2025-04-13 12:09:12 +08:00
2248356998 qq.com
a04b7817a9 refactor: 表格编辑框 model映射 2025-04-13 09:56:11 +08:00
2248356998 qq.com
21bf83aec7 edit css 2025-04-12 14:57:19 +08:00
2248356998 qq.com
d060d5179d build: 10.4.16 2025-04-12 12:24:05 +08:00
2248356998 qq.com
e73dd58e46 fix: 初始连接时,适配器空错误 2025-04-11 23:24:52 +08:00
Diego
a34e4a6942 添加api 2025-04-11 20:21:35 +08:00
Diego
a7ee6d78b5 fix: mqttcollect 重载变量寄存器 2025-04-11 11:01:29 +08:00
Diego
0a6651ac11 build: 10.4.14 2025-04-11 10:30:18 +08:00
Diego
fa25053c13 fix: 宏电ddp协议 tcpudp差异 2025-04-11 10:23:52 +08:00
Diego
61dd4edeb5 更新依赖 2025-04-09 18:28:25 +08:00
Diego
dbaeff302b build: 10.4.13
fix: 通道,设备名称为中文时,日志路径错误
2025-04-09 17:22:46 +08:00
Diego
6cbe7ebcf2 fix: 复制通道 2025-04-09 13:32:04 +08:00
youthalan
2826e08c8c !64 -注册授权页面显示 2025-04-08 14:36:22 +00:00
Diego
e30e337efa refactor: 删除重复的注册授权页面 2025-04-08 10:44:54 +08:00
Diego
39788e0357 refactor: 删除重复的注册授权页面 2025-04-08 10:35:37 +08:00
Diego
c47363df71 build: 10.4.11 2025-04-08 10:20:33 +08:00
Diego
4199453038 refactor: 删除logenable 2025-04-08 09:44:08 +08:00
Diego
db991081c8 build: 10.4.10 2025-04-08 00:53:41 +08:00
Diego
24f946a727 refactor: 组件属性删除 2025-04-08 00:53:22 +08:00
Diego
772dae047a refactor: 删除logenable字段 2025-04-08 00:37:41 +08:00
Diego
020f440fdd !63 build: 10.4.8
* 10.4.8
* 优化ui
* 调整规则引擎
2025-04-07 15:54:03 +00:00
Diego
c88fc5ec09 !62 build: 10.4.7
* build: 10.4.7
* 格式化
* Merge branch 'v10' into v10-dev
* Merge branch 'v10' of gitee.com:ThingsGateway/ThingsGateway into v10-dev
* 修改通道显示字符串
* fix: ddp协议
* 更新依赖
* 10.4.6
* 通道 本地主机地址和远程主机地址 文本修改
* 注册页面位置更改
* 修复导出设备失败,注册页面位置更改
* 更新依赖
* 格式化
* 更新依赖
* 删除会话管理字段
* logo size
* 更新依赖
2025-04-07 07:37:17 +00:00
Diego
475849fbef !61 fix: ddp协议
* Merge branch 'v10' of gitee.com:ThingsGateway/ThingsGateway into v10-dev
* 修改通道显示字符串
* fix: ddp协议
* 更新依赖
* 10.4.6
* 通道 本地主机地址和远程主机地址 文本修改
* 注册页面位置更改
* 修复导出设备失败,注册页面位置更改
* 更新依赖
* 格式化
* 更新依赖
* 删除会话管理字段
* logo size
* 更新依赖
2025-04-07 05:01:56 +00:00
Diego
1d63228fb2 !60 build: 10.4.6
fix: 修复导出设备失败,注册页面位置更改

refactor:通道 本地主机地址和远程主机地址 文本修改
refactor:注册页面位置更改
refactor:更新依赖包
refactor:删除会话管理字段
2025-04-06 12:28:24 +00:00
Diego
c918c0c010 更新authorizel类库 2025-04-03 02:01:08 +08:00
Diego
1028179983 build: 10.4.4 2025-04-03 01:27:43 +08:00
Diego
686f61ff90 refactor: docker镜像基础改为net8 2025-04-02 21:38:36 +08:00
Diego
ae43fadca3 更新依赖包 2025-04-02 20:40:11 +08:00
Diego
1bf05780b3 build: 10.4.3
调整pro授权密钥方式
2025-04-02 18:49:51 +08:00
Diego
3e30daa1d3 refactor: 修改文件名称 2025-04-02 12:37:06 +08:00
Diego
54ef1233b1 refactor: 重启通道时,清空内存池 2025-04-02 10:56:24 +08:00
Diego
4413633de7 build: 10.3.1 2025-04-01 22:58:06 +08:00
2248356998 qq.com
c76e20d146 dispose 2025-04-01 22:56:58 +08:00
Diego
36d53b7ce4 build: 10.2.26 2025-04-01 22:45:58 +08:00
2248356998 qq.com
0b0bce2761 fix: 设备冗余检测事件未释放 2025-04-01 22:44:46 +08:00
Diego
d47a9be03c build: 10.2.25 2025-04-01 22:22:58 +08:00
2248356998 qq.com
bc32d7ae7a refacotr: 插件释放时显式清理较大内存资源 2025-04-01 22:18:39 +08:00
Diego
e6747a2c2c build: 10.2.24
fix: ui page dispose方法未自动执行,可能导致内存泄露
2025-04-01 14:53:10 +08:00
Diego
3fb48cb64e refactor: 报警恢复时报警文本不清空 2025-04-01 11:34:41 +08:00
Diego
381db1cf53 nuget构建 2025-04-01 11:15:23 +08:00
Diego
d3939aeb9d build: 10.2.22
更新依赖项
2025-04-01 11:05:32 +08:00
Diego
5956f90557 Merge branch 'v10' of https://gitee.com/ThingsGateway/ThingsGateway into v10 2025-04-01 10:57:44 +08:00
Diego
7f54ecfe5d build: 10.2.21
feat: 增加汇川plc插件
2025-04-01 10:57:42 +08:00
Diego
e7bda99c8b build: 10.2.21
feat: 增加汇川plc插件
2025-04-01 10:57:06 +08:00
2248356998 qq.com
ea7ab5a2bf refactor: 插件停止方式改为token取消委托 2025-03-31 19:26:11 +08:00
Diego
ee566d199a 规则引擎rpc日志 增加 源名称 2025-03-31 16:19:43 +08:00
Diego
56eca454b1 更新usheet依赖项 2025-03-31 15:26:53 +08:00
Diego
d057974c3e build:10.2.20 2025-03-31 12:39:35 +08:00
Argo Zhang
9514e7fdea 更新样式适配紧凑模式下按钮大小 (#25) 2025-03-31 12:29:56 +08:00
Diego
e546113873 refactor: 添加规则名称 2025-03-31 12:14:10 +08:00
Diego
60f1139355 feat: 增加pro插件标识 2025-03-31 10:05:37 +08:00
Diego
1b18b59054 build: 10.2.18
更新依赖库
2025-03-30 16:39:10 +08:00
Diego
afec0187e9 build: 10.2.17 2025-03-29 21:24:12 +08:00
2248356998 qq.com
d0d7e1ccf8 feat: 优化ui刷新性能 2025-03-29 21:21:51 +08:00
Diego
d72376b4b7 build: 10.2.16 2025-03-29 19:00:00 +08:00
2248356998 qq.com
3be60cb305 refactor: opcua加载复杂类型添加条件 2025-03-29 18:51:57 +08:00
Diego
75b1f351a1 build: 10.2.15 2025-03-29 12:25:51 +08:00
2248356998 qq.com
07185f8018 refactor: 多通道设备日志 2025-03-29 12:23:53 +08:00
Diego
2f081b62a7 build: 10.2.14 2025-03-29 11:42:18 +08:00
2248356998 qq.com
bbce2a11e1 refactor:opcua检查订阅 2025-03-29 11:38:17 +08:00
2248356998 qq.com
96ab609157 删除注释 2025-03-29 11:23:49 +08:00
2248356998 qq.com
d961d56a35 refactor: opcua日志内容 2025-03-29 00:20:38 +08:00
Diego
82a5335a92 build: 10.2.13 2025-03-28 23:32:16 +08:00
2248356998 qq.com
729a23949c refactor: opcua增加质量戳bad日志 2025-03-28 23:29:12 +08:00
2248356998 qq.com
a1b0419d7a refactor: 在线excel 2025-03-28 23:12:00 +08:00
2248356998 qq.com
7a23015b9d refactor: 采集插件基类CollectBase更名CollectFoundationBase,CollectBase适用与与touchsocket无关的采集插件 2025-03-28 22:58:19 +08:00
Diego
9cbe0dbae1 feat: 增加tab右键菜单
refactor: mqtt协议版本增加默认值3.11
2025-03-28 17:15:45 +08:00
Diego
4f139b7d03 更新readme 2025-03-28 11:16:28 +08:00
Diego
1e925e2560 refactor: 自定义cookie名称 2025-03-28 11:14:01 +08:00
Diego
a42e1e3af3 feat: mqtt插件添加mqtt版本选择
fix: s7地址格式解析db块逻辑错误
2025-03-28 10:45:50 +08:00
Diego
799caec7ee refactor: 删除没有使用的代码 2025-03-28 10:20:35 +08:00
Diego
dd7d30498f feat: 添加变量复制按钮 2025-03-28 09:06:54 +08:00
Diego
e9b1720e98 refactor: DataHandleAdapter 2025-03-27 17:46:53 +08:00
Diego
5f41371bdb refactor: 更新配置 2025-03-27 17:09:13 +08:00
Diego
5226bfae20 build: 10.2.9 2025-03-27 15:06:02 +08:00
Diego
d1eab168b7 build: 10.2.8 2025-03-26 17:47:24 +08:00
Diego
8760518c10 build: 10.2.7 2025-03-26 09:19:46 +08:00
Diego
6719a352c2 hybrid程序startup 2025-03-25 17:14:37 +08:00
Diego
8449b6c6b8 refactor: miniexcel版本回退 2025-03-25 15:27:05 +08:00
Diego
0550eaf465 feat: 规则引擎 自定义脚本 增加主动释放方法 2025-03-25 10:55:25 +08:00
Diego
bdc9eb44ec feat: 规则引擎 自定义执行脚本支持 `IDisposable` 接口
refactor: 脚本内日志对象统一命名为 ``Logger``
2025-03-25 10:46:03 +08:00
Diego
37b99cb1b0 feat: 增加脚本提示 2025-03-25 03:22:37 +08:00
Diego
492381e4fc refactor: 修改变量数量限制逻辑 2025-03-24 14:49:41 +08:00
Diego
27d65dd799 refactor: 变量名称不再限制 不包含. 符号 2025-03-24 11:40:27 +08:00
Diego
434724310c build: 10.2.1
feat: 新增 配置 通道、设备、变量的数量限制,防止OOM

feat: 优化 ``opcuaserver`` 插件刷新变量逻辑

refactor: taos插件 表名称 强制小写

refactor: 数据库插件 脚本父类更改
2025-03-24 11:23:08 +08:00
Diego
e5ad5a8521 feat: 变量新建时自动设置已选择的设备 2025-03-21 16:46:40 +08:00
Diego
3942819fed refactor: ui样式修改 2025-03-21 10:48:11 +08:00
Diego
1cc5f538aa feat: 报警实体添加 `恢复值` 属性 2025-03-20 11:04:55 +08:00
Diego
b0d8534ea4 fix: 规则引擎按钮权限异常 2025-03-19 17:46:17 +08:00
Diego
5b2bc38670 refactor: 删除不需要的代码 2025-03-19 17:09:42 +08:00
Diego
b36aa3557c feat: opcUaServer支持同时多个写入 2025-03-19 10:57:57 +08:00
Diego
a1a525e6e3 fix: 导出excel失败 2025-03-19 09:42:37 +08:00
Diego
14453cc437 fix: rpc日志入队条件错误 2025-03-19 08:45:24 +08:00
Diego
db760ba5d8 fix: taos插件sql语句缺失标识符 2025-03-18 17:01:02 +08:00
Diego
4ae692008f 资源文件翻译错别字 2025-03-18 15:54:08 +08:00
Diego
f37449f9ac feat: 新增在线excel编辑 2025-03-18 15:44:00 +08:00
Diego
8b7348b3d4 build: 10.1.20
feat: 优化excel导入速度
feat: 优化taos插件插入数据速度
feat: DB插件全部增加设备名称筛选项

refactor: 更改默认sqlite数据库目录

fix: taos插件多个插件设备但同个变量名称的插入逻辑错误
2025-03-17 19:39:19 +08:00
Diego
709cbb7b2e build: 10.1.19 2025-03-16 23:35:52 +08:00
2248356998 qq.com
187f1a4ce2 refactor: 更新依赖项 2025-03-16 23:31:37 +08:00
2248356998 qq.com
0f2ebd3a54 refactor: 调整发送延迟方法位置 2025-03-15 14:16:57 +08:00
Diego
86b63c2792 fix: 动态topic推断错误 2025-03-14 17:02:04 +08:00
Diego
cec2e71b41 build: 10.1.18
feat: opcuaMaster兼容性增强
refactor: controlLogix插件改为符号方式
2025-03-14 13:53:13 +08:00
Diego
9380f3e1ec feat: opcua 兼容性增强 2025-03-13 17:36:45 +08:00
Diego
76c2934e12 fix: modbusSlave驱动插件配置错误 2025-03-13 10:08:01 +08:00
Diego
9714c35d4b refactor: 修改依赖项版本 2025-03-13 09:14:24 +08:00
Diego
0d9beb713a refactor: 修改依赖项版本 2025-03-13 09:10:57 +08:00
Diego
c5f8d0e0b7 feat: 添加DTU服务类型字段 2025-03-12 23:14:23 +08:00
youthalan
5e8f4b075d !59 用户实体 语言json资源更改
* 用户实体 语言json资源更改
2025-03-11 08:23:26 +00:00
Diego
4b53fca3db build: 10.1.13 2025-03-11 14:39:57 +08:00
Diego
5d9c030a09 feat: 添加json缩进格式配置 2025-03-11 14:00:35 +08:00
Diego
bacbb9a28e fix: opcuaserver释放时空异常 2025-03-10 13:32:20 +08:00
Diego
7c287e0c03 refactor: 同步依赖库代码 2025-03-10 11:48:52 +08:00
Diego
10f675137d build: 10.1.9 2025-03-09 23:04:59 +08:00
2248356998 qq.com
6bdb5328e3 feat: mqttclient插件支持tls 2025-03-09 22:53:22 +08:00
2248356998 qq.com
14f529ac4e refactor: 调整授权cookie名称 2025-03-09 19:34:41 +08:00
Diego
ffe96d9ef1 build: 10.1.8 2025-03-09 10:23:21 +08:00
2248356998 qq.com
335f264caa refactor: 日志/缓存文件夹 由Id 改为 名称 2025-03-09 10:22:05 +08:00
2248356998 qq.com
b73e86ea9f refactor: 方法名称错别字 2025-03-07 20:51:36 +08:00
Diego
2bc2c4c57b refactor: table默认紧凑 2025-03-07 16:59:28 +08:00
Diego
6f87c2f03a refactor: 优化UI细节 2025-03-07 16:14:13 +08:00
Diego
75e677af88 feat: web页面更新为紧凑主题 2025-03-07 15:47:39 +08:00
Diego
9ffe355396 build: 10.1.5
feat: 添加复制通道、复制设备功能
refactor: 优化UI提示
2025-03-07 12:21:09 +08:00
Diego
60b0fb23f8 refactor: 调整模块顺序 2025-03-07 08:52:43 +08:00
Diego
1c05ffc6ed build: 10.1.4 2025-03-06 21:17:14 +08:00
Diego
8cd4e43c68 fix: web页面 业务设备节点查询变量空异常 2025-03-06 20:55:45 +08:00
Diego
8486d28310 refactor: sql错误输出文本日志 2025-03-06 18:00:16 +08:00
Diego
e8aadda185 refactor: 显示未知类型插件 2025-03-06 17:46:28 +08:00
Diego
fcfd0428ab fix: s7设备无法保存 2025-03-06 16:33:43 +08:00
Diego
ddcc087800 build: 10.1.2
refactor: EnableWriteXorExecute 默认0
fix: 集合多线程更改错误
2025-03-06 12:09:50 +08:00
Diego
d574de54b4 refactor: EnableWriteXorExecute 默认0 2025-03-06 11:43:50 +08:00
Diego
1682ac03ac build: 10.1.1
fix: 变量寄存器编辑UI 输出错误
2025-03-06 11:08:52 +08:00
Diego
447dbece1c refactor: variableRuntime dispose 2025-03-06 10:45:39 +08:00
Diego
dcca901b17 refactor: 调整生产环境配置 2025-03-06 10:39:36 +08:00
Diego
a32c779074 refactor: 日志显示刷新频率降低 2025-03-06 09:13:30 +08:00
Diego
187c0f9829 refactor: 添加过滤条件 2025-03-06 08:44:55 +08:00
Diego
6c970c88ab feat: 优化组态重载逻辑 2025-03-06 00:46:24 +08:00
Diego
28a4520c77 build: 添加包构建条件 2025-03-05 16:37:21 +08:00
Diego
02d0dcdff7 fix: 变量页面筛选总条数显示错误 2025-03-05 14:58:17 +08:00
Diego
427d4e31c9 build: 10.1.0.4
fix: 包构建缺失内容
2025-03-05 14:40:09 +08:00
Diego
c60f7aac44 build: 10.1.0.3 2025-03-05 11:50:10 +08:00
Diego
42a7758a34 fix: webapi rpc写入 json反序列化错误 2025-03-05 11:26:38 +08:00
Diego
e0bade4670 fix: 规则引擎 变量Node 查询名称空异常 2025-03-04 23:12:53 +08:00
Diego
6af83152de build: 10.1.0.1
feat: 变量名称 由 全局唯一 更改为 采集设备内唯一
fix: opcda订阅方式初始化时未更新变量状态,导致后续变了状态一直是offline
feat: mqttServer 允许的连接ID前缀 为空时可为任意id

破坏性更新:
1、兼容旧版本数据库,但不兼容旧版本excel文件,不同点在于变量excel 业务属性页,添加了设备名称和业务设备名称,旧版本只有业务设备名称
2、业务上传内容更改为 字典类型,键为设备名称,值为变量列表。变量列表内容与旧版本相同
2025-03-04 21:09:11 +08:00
Diego
091a30045d feat: 规则引擎触发器UI优化 2025-03-03 18:07:18 +08:00
Diego
b2c8ae0c33 更新依赖包 2025-03-03 13:02:27 +08:00
Diego
8b6e0982c6 feat: 页面添加变量寄存器格式提示titile 2025-03-01 21:00:24 +08:00
Diego
caa3ebd600 feat: db动态脚本基类修改 2025-03-01 16:04:40 +08:00
Diego
d248e047b3 build: 10.0.2.14 2025-02-27 18:04:51 +08:00
Diego
25a95a1de0 fea(variableRuntimeService): 方法添加是否重启参数 2025-02-27 17:48:03 +08:00
Diego
d506b2c692 fix: api登录异常 2025-02-27 11:11:53 +08:00
Diego
24c672c2b9 feat: 优化树节点右键菜单内容 2025-02-27 10:51:05 +08:00
Diego
c407e0e83e feat: taos时序库支持每个数据点独立子表
feat: 重启运行时方法改为重载数据库获取通道设备变量
2025-02-26 21:59:41 +08:00
Diego
b1346698d6 feat: 优化opcua历史查询 2025-02-26 14:40:38 +08:00
Diego
5c01129567 补充解决方案文件 2025-02-25 16:39:03 +08:00
Diego
cd7ce53bd0 feat: 新增webhook插件 2025-02-25 16:23:43 +08:00
Diego
4c95c20061 feat: 添加动态变量新增和删除的方法 2025-02-25 15:21:06 +08:00
Diego
5339db5058 refactor: 删除opcua105 2025-02-25 10:04:02 +08:00
Diego
623e932f8c feat: 增加 microLogix1400 plc驱动(pro插件) 2025-02-24 20:23:07 +08:00
Diego
43659de4f4 feat: mqttServer增加匿名登录选项 2025-02-23 22:22:47 +08:00
Argo Zhang
2a661eda42 refactor: 调整插件调试样式 (#23) 2025-02-23 22:03:51 +08:00
Diego
c85a93a17b build: 10.0.2.3 2025-02-21 08:45:04 +08:00
2248356998 qq.com
8ab36cb3e1 feat: 优化opcua订阅 2025-02-20 23:18:37 +08:00
Diego
72820d0708 feat: 添加注册服务 2025-02-20 11:33:39 +08:00
Diego
95b551d4ba feat: 优化opc单设备大批变量检索速度
fix: 定时任务删除网关日志无效
2025-02-19 20:39:42 +08:00
Diego
68af9a0695 feat: 语言资源 2025-02-18 19:33:14 +08:00
Diego
6953c3989b feat: 添加刷新变量日志 2025-02-18 09:03:51 +08:00
Diego
cd4cb385d5 fix: 修复设备冗余多次切换后设备状态异常导致切换事件不触发 2025-02-17 14:58:44 +08:00
Diego
f4f6d595fc feat: 优化设备冗余,网关冗余 2025-02-17 13:31:29 +08:00
Diego
d2356f00e9 feat: 业务插件增加循环间隔 2025-02-17 09:35:59 +08:00
2248356998 qq.com
e408136196 feat: 优化组态配置流畅度 2025-02-15 20:12:59 +08:00
Diego
c355968add 支持冗余备用设备变量并集 2025-02-14 17:15:58 +08:00
Diego
783f878947 fix: 转换器实例初始化方法 2025-02-14 16:23:00 +08:00
Diego
4faf41e482 fix: 修复设备冗余切换 2025-02-14 14:48:28 +08:00
Diego
d8964b6ed2 feat: 优化设备冗余 2025-02-14 11:11:12 +08:00
Diego
b5b999941c 10.0.1.3 2025-02-14 09:43:15 +08:00
2248356998 qq.com
deeba8c4de 默认关闭多租户 2025-02-13 20:33:19 +08:00
youthalan
9e48729eb0 !58 修复按钮资源值及默认开启租户状态
* 修复按钮资源值及默认开启租户状态
2025-02-13 12:32:26 +00:00
2248356998 qq.com
936e374c05 fix: 修改设备后,变量实体中的设备名称实时生效 2025-02-13 20:29:50 +08:00
Diego
0f3524b114 feat: opc插件支持实时修改变量 2025-02-12 16:23:05 +08:00
Diego
d62de3d72c feat: 上传 网关冗余/更新以及规则引擎 源码 2025-02-10 09:32:02 +08:00
Diego
957a80da4b feat: 优化变量寄存器界面加载 2025-02-07 18:09:51 +08:00
Diego
1dccd70f7c feat(uaserver): 删除登录策略限制 2025-02-07 16:37:25 +08:00
Diego
006a5d4e61 feat: excel导入支持空白单元格 2025-02-07 10:50:33 +08:00
Diego
ce7cdcf54e fix: 变量编辑样式修正 2025-02-07 10:17:12 +08:00
Diego
c1ebb4a79b feat: 公开mqttServer发布方法 2025-02-06 16:43:05 +08:00
Diego
41964ae1de fix: 修改通道时,设备没有及时修改插件 2025-02-06 16:30:51 +08:00
Diego
66cf34adf7 fix: 修改通道时,设备没有及时修改插件 2025-02-06 16:04:49 +08:00
Diego
9e9e0009cf fix: opcua插件名称重复 2025-02-06 14:26:51 +08:00
Diego
d5cd9660fc feat: 调整blazor授权,添加自定义刷新逻辑 2025-02-06 12:08:40 +08:00
Diego
12a7803653 更新readme 2025-02-05 11:47:42 +08:00
Diego
8f7bef6a20 feat: 添加1.05版本opcua依赖库 2025-02-05 10:49:22 +08:00
2248356998 qq.com
a0715b830c feat: 日志读取长度限制放宽 2025-02-03 21:22:37 +08:00
2248356998 qq.com
f87ce10dc4 feat: 更新依赖包 2025-02-03 19:57:16 +08:00
2248356998 qq.com
ee4936b8c9 fix: 变量实时值偶发错误
feat: 优化内存占用
2025-01-25 16:02:06 +08:00
2248356998 qq.com
3cb2592660 fix: 清空变量时空异常 2025-01-24 23:22:41 +08:00
2248356998 qq.com
574c901b40 v10迁移 2025-01-24 22:42:26 +08:00
2248356998 qq.com
7590ba4ad5 更新插件 2025-01-06 20:57:36 +08:00
Diego
39ce18f8bb 更新readme 2025-01-06 16:06:01 +08:00
Diego
777a4f9d3f 更新插件 2025-01-06 14:29:51 +08:00
Diego
b91a938787 更新构建脚本 2025-01-06 14:02:41 +08:00
Diego
c903abdb1b 更新admin 2025-01-06 11:24:49 +08:00
Diego
3279bc0580 更新构建脚本 2025-01-06 11:12:04 +08:00
Diego
bd32c9f49e 更新插件 2025-01-06 10:28:14 +08:00
Diego
5507088e3d 更新插件 2025-01-06 09:48:55 +08:00
2248356998 qq.com
37ad48ae4a 7.2.3.6
更新依赖包
2025-01-05 23:46:31 +08:00
2248356998 qq.com
120c6e6d87 7.2.3.5
opcuaclient: 心跳机制异常
2025-01-05 00:46:52 +08:00
2248356998 qq.com
866e907b7e 同步 2025-01-02 20:47:47 +08:00
2248356998 qq.com
2bd8c2cb10 更新mc1e插件 2025-01-02 20:45:19 +08:00
Diego
c6c9919178 更新依赖包 2025-01-02 16:45:31 +08:00
Diego
575bf9d1e0 update Version MSBuildProperty 2025-01-02 13:56:38 +08:00
Diego
82a56e0285 更新构建脚本 2025-01-02 12:56:52 +08:00
Diego
25d5f7c132 设定动态编译缓存目录 2025-01-02 12:27:57 +08:00
Diego2098
a3e9ecf30f !56 恢复插件隔离
* 恢复插件域
2025-01-02 04:03:14 +00:00
2248356998 qq.com
ec5ff0a07f 7.2.1.3
更新mqttnet版本
更新admin
2025-01-01 16:25:19 +08:00
Diego
be836d30c5 更新admin 2024-12-30 12:11:08 +08:00
2248356998 qq.com
42b1529a5f 添加Release解决方案 2024-12-28 10:35:02 +08:00
2248356998 qq.com
47708c4807 添加Release解决方案 2024-12-28 10:30:17 +08:00
2248356998 qq.com
d2a51e004c 7.2.0.99
规则引擎:自定义脚本接口定义修改,增加Logger属性
数据库上传插件:回退修改,恢复string类型Value字段
2024-12-28 04:19:37 +08:00
2248356998 qq.com
ab14230101 修复通道报文日志失效 2024-12-26 21:36:09 +08:00
Diego
4bcf8c1f78 修复设备通讯变量点位 2024-12-26 15:38:19 +08:00
Diego
44d00e9da3 数据库插件实体类修改! 2024-12-26 14:45:25 +08:00
Diego
d7e6a4493c 更新依赖 2024-12-26 13:22:51 +08:00
Diego
53e89d8c54 7.2.0.95
修复 LL优先级比L低
添加报警属性验证规则
2024-12-25 12:26:06 +08:00
Diego
4497c13634 代码清理 2024-12-25 10:53:43 +08:00
Diego
4a35fade46 更新插件 2024-12-24 17:44:51 +08:00
Diego
6cba0601fd fix: 上一提交导致other通道创建错误 2024-12-24 17:21:10 +08:00
Diego
ed4332ea78 更新readme 2024-12-24 14:14:30 +08:00
Diego
aba069cec5 7.2.0.91
修复dlt645驱动
调整异步方法
2024-12-24 14:03:39 +08:00
Diego
8a82ac0a11 更新测试方法 2024-12-23 16:43:35 +08:00
Diego
1cd1456d75 7.2.0.87
更新admin
2024-12-23 15:31:16 +08:00
Diego
b791a3eb10 修复 动态插件属性 验证错误 2024-12-23 15:21:42 +08:00
2248356998 qq.com
3b22a8b170 7.2.0.85
更新依赖
2024-12-22 15:59:15 +08:00
2248356998 qq.com
419e8214ca 更新规则引擎,优化性能 2024-12-20 22:32:37 +08:00
Diego
b9f8571f0f 7.2.0.83
fix(VariableRuntime): 修改判断变量变化方法
feat(TestVariable): 修改添加测试变量UI
2024-12-20 14:28:44 +08:00
Diego
c6d9a9d7f8 修改判断变量变化方法 2024-12-20 14:27:29 +08:00
Diego
310aba6ccb 修改添加测试变量UI 2024-12-20 12:11:20 +08:00
Diego
9bd89ac4f6 添加 git 更新子模块 bat 2024-12-19 18:40:13 +08:00
Diego
ea6a51dca9 更新admin 2024-12-19 18:16:01 +08:00
Diego
e701bcc50c 调整插件基类,增加上传模式配置 2024-12-19 18:15:47 +08:00
Diego
a1abf06e75 7.2.0.78
更新opc插件
2024-12-19 16:11:13 +08:00
Diego
76ace394b0 更新opcua插件 2024-12-19 15:21:21 +08:00
Diego
4dac462f8f 更新解决方案 2024-12-19 12:21:32 +08:00
Diego
039672b1e7 更新admin 2024-12-19 12:19:55 +08:00
Diego
1b26ecbbf5 添加 admin 子模块 2024-12-19 11:54:14 +08:00
Diego2098
f4a7e96943 add Admin submodule.
Signed-off-by: Diego2098 <2248356998@qq.com>
2024-12-19 03:17:59 +00:00
Diego
a45bc2954f 移动文件夹 2024-12-19 11:16:24 +08:00
Diego
62f32467b7 移动文件夹 2024-12-19 11:15:18 +08:00
Diego
600a1bf201 7.2.0.75 2024-12-18 12:36:49 +08:00
Diego
7e196e7aa6 更新admin 2024-12-17 14:16:15 +08:00
Diego
9ad3507b66 7.2.0.72
修复变量导入错误
2024-12-17 13:51:51 +08:00
Diego
add1bdfcf6 更新admin 2024-12-17 13:26:27 +08:00
Diego
7ea8a7c079 7.2.0.70
修复初始值解析
2024-12-17 10:51:52 +08:00
Diego
28e31f5165 7.2.0.69
更新实体特性
2024-12-17 10:22:03 +08:00
Diego
10a6975c5d 7.2.0.68
更新modbusSlave插件,适配03功能码单写bit
2024-12-16 18:24:16 +08:00
Diego
b34ea87660 7.2.0.67
更新db插件,增加 单独配置实时表上传间隔时间 属性
2024-12-16 17:38:42 +08:00
Diego
86ed69c50b 7.2.0.66
更新版本
2024-12-16 11:29:52 +08:00
Diego
02e824154c 7.2.0.65
读取间隔增加cron支持
2024-12-16 11:13:23 +08:00
Matrix
dc973c8491 !55 TimeTick 新增 Cron
* TimeTick 新增 cron定时
2024-12-16 03:03:39 +00:00
2248356998 qq.com
0a28e3a8d3 7.2.0.64 2024-12-15 23:41:07 +08:00
2248356998 qq.com
7a48c260e1 更新插件 2024-12-14 15:22:19 +08:00
Diego
c55c49a3a2 添加TS自定义二进制序列化方式 2024-12-13 12:19:12 +08:00
Diego
0fc9b06d12 7.2.0.62
优化上传插件批量性能
2024-12-11 15:52:00 +08:00
Diego
d71ad5a6bf 单文件发布 2024-12-11 11:13:58 +08:00
Diego
f0b3028306 更新规则引擎 2024-12-11 09:15:27 +08:00
2248356998 qq.com
752992c527 7.2.0.60
更新admin
删除不需要的文件
2024-12-10 14:30:18 +08:00
Diego
43c4476396 7.2.0.58
更新aop框架版本
2024-12-09 15:43:29 +08:00
Diego
f8172bed56 修复单文件发布 2024-12-09 11:33:00 +08:00
Diego
c1f71b4cfc 7.2.0.57
添加数据库解密示例

更新依赖包
2024-12-09 11:11:16 +08:00
2248356998 qq.com
4799da15e7 7.2.0.53
更新语言资源
更新规则引擎
2024-12-08 22:01:16 +08:00
2248356998 qq.com
4936e47c7a 7.2.0.50 2024-12-07 18:34:51 +08:00
2248356998 qq.com
cb965373aa 更新插件 2024-12-07 18:30:25 +08:00
2248356998 qq.com
654a91184a 7.2.0.48
更新依赖
2024-12-07 17:51:48 +08:00
Diego
57997f7f4b 优化规则引擎 2024-12-06 10:45:56 +08:00
Diego
ca2f5be3d1 7.2.0.46
更新Admin,修复错误插件dll导致程序无法启动的问题
2024-12-05 17:15:54 +08:00
Diego
1b091073f1 7.2.0.45 2024-12-05 11:10:43 +08:00
Diego
85d2d3c442 更新pro插件 2024-12-05 11:09:31 +08:00
Diego
d77dfd63cf 增加规则引擎插件 2024-12-05 02:13:02 +08:00
Diego
db2bf52fca 调整脚本编辑UI 2024-12-04 08:48:27 +08:00
Diego
2c62d97440 迁移重启后台按钮到设备状态页面 2024-12-03 22:23:26 +08:00
Diego
53b2e64214 修复net6 界面白屏 2024-12-02 18:11:16 +08:00
Diego
ccf82a3ee5 添加layout显示条件 2024-12-02 17:08:50 +08:00
Diego
9cb6f35e60 修改代码规范文件,更新依赖包 2024-12-02 11:28:54 +08:00
2248356998 qq.com
da2e33a040 7.2.0.36 2024-11-30 21:00:05 +08:00
2248356998 qq.com
f2d260bfa4 动态调整线程池最大活动数目 2024-11-30 01:53:26 +08:00
Diego
783c7244f9 修正語言資源 2024-11-29 17:05:21 +08:00
Diego
c9287e0e63 更新依赖
命名空间变化
2024-11-29 16:53:00 +08:00
Diego
69b84d115c 添加变量导入校验缓存 2024-11-29 10:01:02 +08:00
Diego
1745b898b1 删除文件 2024-11-29 09:22:36 +08:00
Diego
5ba4c85249 更新依赖包,转移部分代码到插件仓库 2024-11-28 21:14:14 +08:00
Diego
03c87bb46d 更新admin 2024-11-28 14:13:50 +08:00
Diego
dff5a76e9e 更新docker构建脚本 2024-11-27 16:05:16 +08:00
Diego
50386f4ca4 cache try dispose 2024-11-26 11:29:52 +08:00
Diego
de6ba2ec80 更新版本 2024-11-25 13:26:11 +08:00
Diego
ce126015d9 更新pro插件 2024-11-25 12:52:04 +08:00
Diego
f2337c3d43 更新依赖 2024-11-25 11:38:09 +08:00
Diego
41b59d322a 更新依赖,添加bacnet,HJ212 2024-11-25 11:32:28 +08:00
2248356998 qq.com
dfea7c111e 更新依赖 2024-11-23 17:36:59 +08:00
2248356998 qq.com
3d5d672297 更新版本 2024-11-22 19:57:31 +08:00
2248356998 qq.com
e4dcc6f342 更新插件 2024-11-22 19:57:11 +08:00
Diego
9847249611 修改非数采插件的引用方式 2024-11-21 23:52:31 +08:00
Diego
19742a54ec 更新插件 2024-11-21 18:37:11 +08:00
Diego
5af9ae7a80 修复上个版本导致驱动sign量无法正常返回的bug 2024-11-21 17:42:11 +08:00
Diego
78962a4a75 去掉api日志显示 2024-11-21 17:05:13 +08:00
Diego
9a35d826aa 添加 更新服务 启用选项 2024-11-21 16:47:09 +08:00
Diego
c9cdc89d35 更新版本 2024-11-20 18:28:16 +08:00
Diego
33b75703ba 更新種子數據 2024-11-20 09:40:49 +08:00
Diego
ca55aa3a24 更新插件 2024-11-19 17:03:52 +08:00
Diego
95307c3902 更新版本文件 2024-11-19 12:10:40 +08:00
Diego
89c8eae7e2 更新依赖 2024-11-19 10:48:49 +08:00
Diego
91614772dc 更新版本 2024-11-19 10:28:42 +08:00
Diego
cd497ab4dc 更换快捷方式实现方式 2024-11-18 10:03:45 +08:00
2248356998 qq.com
f81895905e 更新依赖包 2024-11-18 00:24:18 +08:00
2248356998 qq.com
d82fafaa7a 更新后台版本 2024-11-17 14:14:28 +08:00
2248356998 qq.com
0ea01acc46 驱动在丢弃错误报文时提示日志 2024-11-16 20:58:46 +08:00
2248356998 qq.com
df55792a68 调试工具css更新 2024-11-16 20:29:36 +08:00
Diego
6a19c45269 更新版本 2024-11-15 21:51:39 +08:00
Diego
23ee345441 更新插件 2024-11-15 21:13:43 +08:00
Diego
0e8ff253f3 更新admin版本 2024-11-15 16:53:44 +08:00
2248356998 qq.com
89bddb0bc4 修复双机热备功能,添加日志显示 2024-11-14 22:34:03 +08:00
Diego
77bbca9bb3 调整公共页面位置 2024-11-14 15:13:34 +08:00
2248356998 qq.com
1acd4d8d58 更新版本 2024-11-14 00:31:33 +08:00
2248356998 qq.com
4db72a712d 更新依赖 2024-11-13 22:08:59 +08:00
Diego
da2b7ba08e 调整css 2024-11-13 17:32:39 +08:00
Diego
f8b49411bf 添加net9.0 2024-11-13 16:15:04 +08:00
Diego
a04b0d99b0 添加更新服务器 2024-11-12 16:14:09 +08:00
Diego
9e9735f617 更新admin版本 2024-11-11 17:28:34 +08:00
Diego
f906b36f01 更新插件版本 2024-11-11 17:26:12 +08:00
Diego
a9d1f4f854 更新版本 2024-11-10 20:29:42 +08:00
Diego
d017ae905f 添加重启软件功能 2024-11-10 01:18:05 +08:00
Diego
bede280507 种子数据默认不更新 2024-11-08 00:35:08 +08:00
Diego
ea130047bc 修复配置 2024-11-07 16:36:18 +08:00
Diego
d77d8de63e 更新依赖包 2024-11-07 16:27:44 +08:00
Diego
f5413d9202 修复插件关联设备数量缓存不刷新 2024-11-07 15:08:15 +08:00
Diego
559fc8f216 更新后台 2024-11-06 16:25:10 +08:00
Diego
34b2df911d 更新插件版本 2024-11-06 13:16:47 +08:00
Diego
3d5a8a8cbd Merge branch 'master' into release 2024-11-06 10:19:16 +08:00
Diego
2b07097e14 导入变量时写入机构id 2024-11-06 10:18:52 +08:00
Diego
372e943d8b Merge branch 'master' into release 2024-11-06 09:32:24 +08:00
Diego
95afcedc4f 更新后台 2024-11-06 09:32:01 +08:00
Diego
c1dc8f017c Merge branch 'master' into release 2024-11-06 09:15:04 +08:00
Diego
dbeddca263 整理格式 2024-11-06 09:13:09 +08:00
Diego
e65d133dec 更新依赖包 2024-11-06 09:02:11 +08:00
Diego
b5e1dea1c2 Merge branch 'master' into release 2024-11-05 14:52:58 +08:00
Diego
3f19469939 更新后台 2024-11-05 14:52:27 +08:00
Diego
87874b037a Merge branch 'master' into release 2024-11-05 11:59:50 +08:00
Diego
adda6841d1 更新后台版本 2024-11-05 11:58:24 +08:00
Diego
a8092b921b 添加机构 2024-11-05 06:05:23 +08:00
Diego
930e4d69d1 恢复sqlite数据库类型 2024-11-05 05:41:07 +08:00
Diego
d9219df45b 后台管理添加机构功能 2024-11-05 05:39:07 +08:00
Diego
a6d4ec28db 删除不必要的构建 2024-10-29 14:26:06 +08:00
Diego
b29e13f777 更新构建脚本 2024-10-28 17:08:35 +08:00
Diego
9363b78ff6 Merge branch 'master' of https://gitee.com/ThingsGateway/ThingsGateway 2024-10-28 16:58:42 +08:00
Diego
eba411fec7 更新插件 2024-10-28 16:49:09 +08:00
Diego2098
9afe99e134 !53 7.0.1.6
* Merge branch 'release' of gitee.com:ThingsGateway/ThingsGateway into master
* 更新依赖包
* 更新依赖包,雪花ID方法
* 更新依赖包,雪花ID方法
2024-10-28 00:40:55 +00:00
Diego2098
6678856178 Merge branch 'release' of gitee.com:ThingsGateway/ThingsGateway into master
Signed-off-by: Diego2098 <2248356998@qq.com>
2024-10-28 00:40:40 +00:00
Diego
a1fea38c2c 更新依赖包 2024-10-28 08:32:18 +08:00
Diego2098
2d3265e66d !52 7.0.1.5
* 更新依赖包,雪花ID方法
* 更新依赖包,雪花ID方法
2024-10-23 11:03:51 +00:00
Diego
f6d4400db9 更新依赖包,雪花ID方法 2024-10-23 19:01:13 +08:00
Diego
6d892a9266 更新依赖包,雪花ID方法 2024-10-23 19:00:23 +08:00
Diego2098
356fa08da5 !51 7.0.1.4
Merge pull request !51 from Diego2098/master
2024-10-16 15:13:04 +00:00
Diego
2225f8c890 修复数组类型比较错误 2024-10-16 22:37:35 +08:00
Diego2098
d1a89739f9 !50 7.0.1.3
Merge pull request !50 from Diego2098/master
2024-10-16 05:23:38 +00:00
Diego
6ec6896763 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2024-10-16 13:19:42 +08:00
Diego
9fb718d610 更新依赖包 2024-10-16 13:18:09 +08:00
Diego2098
c913b89a47 !49 7.0.1.2
Merge pull request !49 from Diego2098/master
2024-10-16 03:59:53 +00:00
Diego2098
58b45693b7 !48 7.0.1.2
Merge pull request !48 from Diego2098/release
2024-10-16 03:59:16 +00:00
Diego
29d3ece9b1 更新依赖包 2024-10-15 17:47:12 +08:00
Diego2098
7e5db75230 !47 7.0.1.2
Merge pull request !47 from Diego2098/master
2024-10-14 11:51:48 +00:00
Diego
283c0b9845 修改:更新脚本编辑UI 2024-10-14 19:51:22 +08:00
Diego2098
071a0f1651 !46 7.0.1.1
Merge pull request !46 from Diego2098/master
2024-10-14 11:07:55 +00:00
Diego
1a116557a4 修改:移入部分项目代码 2024-10-14 19:06:09 +08:00
Diego
1468297626 修改:更新依赖包 2024-10-12 23:41:40 +08:00
Diego
87e94fdf52 修改:更新依赖包 2024-10-12 10:59:12 +08:00
Diego
64e15c33c8 修改:更新依赖包 2024-10-12 10:57:10 +08:00
Diego2098
7170f435d1 !45 7.0.0.26
Merge pull request !45 from Diego2098/master
2024-10-11 07:31:21 +00:00
Diego
9942be0493 修复:更新依赖包,修复脚本编辑框无法显示的问题 2024-10-11 15:29:45 +08:00
Diego
eaad36277f 修改:脚本编辑更改代码编辑器 2024-10-10 17:25:37 +08:00
Diego
37cc498568 修改:脚本编辑更改代码编辑器 2024-10-10 16:44:39 +08:00
Diego
8a3191340a 修改:更新依赖包 2024-10-09 22:15:56 +08:00
Diego
0f4e998f0a 修改:更新依赖包 2024-10-08 13:40:43 +08:00
Diego
0c93b649ba 新增:预添加网关检查更新,网关系统重启等页面 2024-10-08 13:27:45 +08:00
Diego
947d269877 新增:预添加网关检查更新,网关系统重启等页面 2024-10-08 13:21:55 +08:00
Diego
b4b9453948 新增:语言资源 2024-10-08 09:59:20 +08:00
Diego
b99a4cd095 修改:插件添加方式 2024-10-06 00:08:40 +08:00
Diego
a363d5aa46 修改:业务插件变量属性添加enable字段 2024-10-05 23:05:27 +08:00
Diego
ae442dabb4 新增:添加设备关联变量跳转 2024-10-05 21:23:00 +08:00
Diego
1477c88397 新增:添加插件关联设备数量字段 2024-10-05 21:22:52 +08:00
Diego
4172462938 新增:添加专业版插件标识 2024-10-05 13:54:43 +08:00
Diego
27341ba4f8 修改:更新nuget依赖 2024-10-02 09:19:08 +08:00
Diego2098
7443076094 修改:更新nuget依赖 2024-10-02 09:15:41 +08:00
Diego
a764bb4b1d 构建:共用版本变量 2024-09-30 12:20:05 +08:00
Diego
57130e1af7 release:7.0
代码架构重构,兼容6.0数据库
2024-09-30 01:39:39 +08:00
Diego
3f8a354c99 refactor: 更新依赖 2024-09-23 16:59:26 +08:00
Diego
0b10d92929 release:6.1.0.33 2024-09-22 22:28:32 +08:00
Diego
1a1c55e661 docs: 更新文档 2024-09-22 22:27:44 +08:00
Diego
87768f9e8b release:6.1.0.32
refactor: 合并工具库代码

fix: 操作日志 orm特性 在特定数据库类型下 可能会报错

refactor: 部分文件更换目录
2024-09-22 21:38:36 +08:00
Diego
d079f50364 fix: 操作日志 orm特性 在特定数据库类型下 可能会报错 2024-09-19 12:32:10 +08:00
Diego
72a89835c5 refactor: 合并工具库代码 2024-09-19 11:17:13 +08:00
Diego
39d686810b release:6.1.0.29
feat: 增加变量业务属性自定义UI

fix: 设备状态更新错误

refactor: 变量导出导入excel排序
2024-09-18 09:14:56 +08:00
Diego
d936626001 feat: 增加变量业务属性自定义UI 2024-09-18 09:05:48 +08:00
Diego2098
cdce1c5ea6 refactor: 更新依赖 2024-09-17 16:00:48 +08:00
Diego
d59530a54f other: 更新文档地址 2024-09-14 18:17:25 +08:00
Diego
fe480811fb fix: 设备状态更新错误 2024-09-14 15:41:27 +08:00
Diego
2e3e0d34c3 refactor: 变量导出导入排序 2024-09-14 14:22:42 +08:00
Diego
1e2984d0d9 refactor: 更新依赖 2024-09-14 03:02:51 +08:00
Diego
3e9fe693c7 release:6.1.0.27
feat: 添加链路关闭前事件
feat: 添加AB PLC ControlLogix协议驱动

refactor: 更新依赖
refactor: mqttCollect支持简单json对象
refactor: 每次采集成功都更新设备成功状态
2024-09-14 01:14:09 +08:00
Diego
63161838d8 feat: 添加链路关闭前事件
refactor: 更新依赖
refactor: mqttCollect支持简单json对象
refactor: 每次采集成功都更新设备成功状态
2024-09-12 18:12:38 +08:00
Diego
7c92951ae9 release:6.1.0.26
feat: 添加保存值功能
feat: 增加特殊地址变量,方便用户自定义设备状态变量或当前设备计算点

refactor: 繁體詞彙修改與新增UI翻譯
refactor: 更新依赖
2024-09-10 11:49:58 +08:00
Diego
59a25854ef feat: 添加保存值功能 2024-09-10 10:59:58 +08:00
rotoyang
3ca5768974 繁中語系更新 (#21)
* 繁體詞彙修改與新增UI翻譯

* TYPO

---------

Co-authored-by: RY <ry@address.no>
2024-09-10 10:23:33 +08:00
Diego
9a2dce43dd feat: 增加特殊地址变量,方便用户自定义设备状态变量或当前设备计算点 2024-09-09 16:21:24 +08:00
Diego
b7fce4317b release:6.1.0.25
docs: 更新采集插件开发文档
fix: 偶发重启后台出现变量重复
refactor: 更新依赖
2024-09-09 14:29:13 +08:00
Diego
97d9514b00 fix(mqttcollect): 重试时间默认为0错误 2024-09-08 16:18:07 +08:00
Diego
58f88708fa docs: 更新文档 2024-09-07 21:24:11 +08:00
Diego
d79c874aa5 release:6.1.0.24
fix: modbus、s7 读取字节某一位开始的数组时,请求长度太大
feat: linux桌面软件添加net8实现
2024-09-07 20:03:41 +08:00
Diego2098
58917c1ff8 refactor: 更新依赖 2024-09-07 18:24:08 +08:00
Diego2098
13b171a62d fix: modbus、s7 读取字节某一位开始的数组时,请求长度太大 2024-09-07 18:23:39 +08:00
Diego2098
f0a601922a fix: modbus、s7 读取字节某一位开始的数组时,请求长度太大 2024-09-07 16:23:59 +08:00
Diego
d90090b35e release:6.1.0.23
feat: 增加mqtt采集插件
fix: net6框架中的opcuaserver缺少dll文件
2024-09-06 15:12:27 +08:00
Diego
094d1142e7 fix: net6框架中的opcuaserver缺少dll文件 2024-09-06 10:08:11 +08:00
Diego
eb09d1c925 refactor: 恢复插件创建方式 2024-09-06 03:10:44 +08:00
Diego
bd5d75361e refactor: 恢复插件创建方式 2024-09-06 03:10:16 +08:00
Diego
5d7c0c635b release:6.1.0.21
feat: 关系库存储插件支持动态表格式脚本
refactor: 内存变量插件修改读取逻辑
2024-09-06 02:06:08 +08:00
Diego
606f538bf3 other: 修改引入条件 2024-09-06 01:02:23 +08:00
Diego
574c0eea27 feat: 关系库存储插件支持动态表格式脚本 2024-09-06 00:59:19 +08:00
Diego
4730cbc543 refactor: 内存变量插件修改读取逻辑 2024-09-05 15:29:23 +08:00
Diego
5c63359550 release:6.1.0.20
feat: 添加报警确认api
feat: 添加插件属性自定义ui
2024-09-05 11:45:28 +08:00
Diego
ec3607f779 refactor: 更新繁体资源 2024-09-04 16:58:13 +08:00
Diego
7efd0f8098 release:6.1.0.19
refactor: 更新依赖
feat: 添加繁体资源
2024-09-04 16:39:57 +08:00
Diego
2a7c30a21a refactor: netcoreApp添加去重 2024-09-04 16:12:39 +08:00
Diego2098
2639c3ee3f !43 feat: 添加繁体资源
* feat: 添加繁体资源
2024-09-04 08:08:37 +00:00
Diego2098
547e0153cb !42 refactor: 更新依赖 2024-09-04 03:21:17 +00:00
Diego
423664fcfa other: 补充忽略文件 2024-09-04 08:41:06 +08:00
Diego2098
c986c230ef !41 release:6.1.0.17
* 添加pro nuget包
* 更新依赖
2024-09-03 14:37:57 +00:00
Diego
7c6001f76e refactor: 修改插件构建项 2024-09-03 16:32:38 +08:00
Diego
d3620946ac fix(Admin): adminIndex编译错误 2024-09-02 17:01:57 +08:00
Diego2098
479643221c !40 release:6.1.0.1
release:6.1.0.1

refactor: 部分插件方法访问权限修改
refactor: 优化采集/业务后台服务可读代码
refactor(modbusSlave): 默认建立时启动服务
refactor(modbusSlave): 对于设置的不同设备地址,不返回错误码(不再响应,以防止干扰通讯链路中的其他设备)
refactor: 更新依赖库
2024-09-02 08:08:59 +00:00
Diego
c9ef8bcf6a fix: 报警插件记录到questdb时出现错误sql 2024-08-30 17:06:54 +08:00
Diego
d655a7c2f6 fix: opc插件调试日志不显示 2024-08-30 13:54:57 +08:00
Diego
306861d3b4 release:6.0.5.30
refactor:  mqtt插件重启时忽略报错日志

fix(mqttClient): 订阅配置错误
fix: 获取实时报警api接口返回值错误
2024-08-30 13:22:30 +08:00
Diego
7abab41eed refactor: 更新注释 2024-08-30 08:58:59 +08:00
Diego
acc2691e33 fix: 获取实时报警api接口返回值错误 2024-08-29 17:41:06 +08:00
Diego
21a65956b0 refactor: mqtt插件重启时忽略报错日志 2024-08-29 16:14:33 +08:00
Diego
9738275ad1 fix: DB插件编译 2024-08-29 13:10:59 +08:00
Diego
7265034703 refactor: 更新构建项 2024-08-29 13:08:05 +08:00
Diego
9bcc45591d docs: 更新文档 2024-08-29 12:49:48 +08:00
Diego
38d657ba0e fix(mqttClient): 订阅配置错误 2024-08-29 12:43:10 +08:00
Diego
6a0d16c5bb release:6.0.5.29
refactor:  mqttServer不再保留全部变量遗嘱数据,可使用quest rpc获取
feat: 增加net6编译程序,只在低版本操作系统中推荐
2024-08-29 11:54:56 +08:00
Diego
490d4abb56 feat: 更新构建项 2024-08-29 10:48:48 +08:00
Diego
a7d0f7fc99 refactor: mqttServer不再保留全部变量遗嘱数据,可使用quest rpc获取 2024-08-28 17:46:04 +08:00
Diego
0d2d3ff528 release:6.0.5.28
refactor:  更新依赖库
refactor:  删除tab 扩展按钮,固定首页不可关闭
feat: 添加调试页面winbox窗口
2024-08-28 13:26:59 +08:00
Diego
526169f0aa release:6.0.5.27
refactor:  更新依赖库
feat: 日志组件添加等级筛选
feat: 补充多语言资源
fix: dlt645驱动上个版本提交bug
2024-08-27 16:43:59 +08:00
Diego
42940ff0e3 feat: 补充多语言资源 2024-08-27 14:55:10 +08:00
Diego
e9b943363d feat: 日志组件添加等级筛选 2024-08-27 14:24:26 +08:00
Diego
01e98ff10c refactor: 更新依赖库 2024-08-27 10:48:53 +08:00
Diego
d38981a17d release:6.0.5.26
feat: 关系库插件 添加 自动建库 功能
feat: 驱动库添加压测
2024-08-27 10:37:12 +08:00
Diego
7612e91691 feat: 关系库插件 添加 自动建库 功能 2024-08-27 08:38:19 +08:00
Diego
76b0f20033 release:6.0.5.25
fix: 单通道多设备时,偶发空指针错误
2024-08-26 18:06:27 +08:00
Diego
b78c0f8a29 refactor: 驱动库send方法默认添加锁 2024-08-26 11:45:50 +08:00
Diego
ea93c7c8fc release:6.0.5.24
feat: 基础库增加 net8 编译项
feat: SqlHisAlarm添加表名称配置属性
refactor:  默认server gc true,如有低内存需要,更改 MSBuild 项
2024-08-26 11:11:50 +08:00
Diego
8ac1952974 release:6.0.5.23
feat: 基础库增加 net8 编译项
feat: SqlHisAlarm添加表名称配置属性
refactor:  默认server gc true,如有低内存需要,更改 MSBuild 项
2024-08-26 11:02:21 +08:00
Diego
b4514a5bbf release:6.0.5.21
feat: 完善mqtt脚本,适配thingsboard
2024-08-25 18:10:26 +08:00
Diego
568053b06d feat: 增加多语言资源 2024-08-24 23:05:17 +08:00
Diego
bb180bfc39 release:6.0.5.20
refactor:  启动项目文件结构优化
2024-08-24 18:29:04 +08:00
Diego
5ee635caed fix: 字节池对象获取ArraySegment错误 2024-08-23 16:48:01 +08:00
Diego
5dfd7c8597 release:6.0.5.17
feat: 添加内存变量插件
refactor:  变量数据页面序列化数据概要json.net
2024-08-23 14:51:29 +08:00
Diego
fe61b75d7e feat: 添加内存变量插件 2024-08-23 13:11:28 +08:00
Diego
e7bf565418 feat: 添加内存变量插件 2024-08-23 13:11:06 +08:00
Diego
12071f6251 feat: 添加内存变量插件 2024-08-23 13:10:35 +08:00
Diego
72ed2e3ed0 release:6.0.5.16
docs: 更新文档
refactor:  questdb初始化失败时更新的时间为格里威治时间
2024-08-22 19:41:13 +08:00
Diego
d7c1f134fe release:6.0.5.15
docs: 更新文档
refactor:  更新依赖包
refactor:  优化UI卡顿问题
refactor:  await统一添加ConfigureAwait(false)
2024-08-22 19:22:45 +08:00
Diego
5072d9f7ad fix: mqtt脚本检查功能中的类型转换错误 2024-08-21 20:44:52 +08:00
Diego
5d42a1247a docs: 更新文档 2024-08-21 20:16:16 +08:00
Diego
ce64be22bd docs: 更新文档 2024-08-21 20:10:50 +08:00
Diego
36f9386e8d release:6.0.5.14
feat: 添加报警延时逻辑
feat: mqtt脚本添加检查按钮
fix(opcuamaster): 服务端时间戳选项在轮询模式下不生效
refactor:  aop插入日志ip字段 非null
2024-08-21 19:44:34 +08:00
Diego
e9dc963805 feat: mqtt脚本添加检查按钮 2024-08-21 18:19:39 +08:00
Diego
8854322997 fix(opcuamaster): 服务端时间戳选项在轮询模式下不生效 2024-08-21 16:08:13 +08:00
Diego
6018f1e8ca refactor: aop插入日志ip字段 非null 2024-08-21 12:25:53 +08:00
Diego
68f8ebb543 release:6.0.5.13
refactor:  修改用户中心的修改密码为密码输入框
refactor:  opcua轮询采集时异常捕获内容包含当前读取地址
2024-08-20 16:13:00 +08:00
youthalan
301f0218fd !39 修改用户中心的修改密码为密码输入框
修改用户中心的修改密码为密码输入框
2024-08-20 04:39:42 +00:00
Diego
a9c4a56893 other: 更新发布脚本 2024-08-19 18:07:00 +08:00
Diego
3ea3d72f11 refactor: 全屏按钮重复 2024-08-19 15:25:20 +08:00
Diego
33da5bf4a7 release:6.0.5.12
refactor:  更新依赖项
build:  修改构建脚本
build:  添加arm64 docker镜像
2024-08-19 13:08:05 +08:00
Diego
e3de01948a release:6.0.5.12
refactor:  更新依赖项
build:  修改构建脚本
build:  添加arm64 docker镜像
2024-08-19 13:06:02 +08:00
Diego
3cd92aaf54 other: winform标题修改 2024-08-18 21:17:43 +08:00
Diego
ab4e1996dd other: 添加演示站自动更新功能 2024-08-18 21:14:33 +08:00
Diego
b9ef082abf release:6.0.5.10
refactor:  photino版本退出时释放资源
feat:  添加winform版本
2024-08-18 18:34:14 +08:00
Diego
dac7186da3 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2024-08-18 04:03:15 +08:00
Diego
1fd6cc2b5e release:6.0.5.9
refactor: 封装furion swagger文档
refactor:简化代码
refactor:更新依赖包
2024-08-18 04:03:01 +08:00
youthalan
0b7da9790a !38 修复AdminTable的行编辑按钮和行删除按钮的回调显示
!38 修复AdminTable的行编辑按钮和行删除按钮的回调显示
2024-08-16 07:26:01 +00:00
Diego
a9e0e0ead6 other: 添加一键发布脚本 2024-08-16 13:05:57 +08:00
Diego
079754f1a9 release:6.0.5.7
refactor: 设备PluginType属性增加多语言资源键值
fix: 权限框架解决方案编译错误
refactor: index 首页 页面文件迁移至主程序
refactor:更新依赖包
2024-08-16 11:55:49 +08:00
Diego
c45b5b1e86 release:6.0.5.7
refactor: 设备PluginType属性增加多语言资源键值
fix: 权限框架解决方案编译错误
refactor: index 首页 页面文件迁移至主程序
2024-08-16 11:43:34 +08:00
Diego
2115cc685c fix: visual studio2022.17.11.0版本编译错误,razor条件编译方式更换 2024-08-15 15:58:00 +08:00
Diego
b99e56fc19 release:6.0.5.6 2024-08-15 11:48:45 +08:00
Diego
74c057eb84 refactor: 更新依赖库 2024-08-14 20:56:12 +08:00
Diego
e8ececc0dc other: 代码清理 2024-08-14 20:55:50 +08:00
Diego
ad120b7736 fix(chart): pie饼图加载异常,回退依赖版本 2024-08-14 15:13:35 +08:00
Diego
61c0711e79 release:6.0.5.5
fix: newlife.x工具库部分命名空间错误
refactor: DtuId属性描述添加'UTF8'
refactor: 更新依赖项
2024-08-14 11:52:35 +08:00
Diego
81c3f6fce0 refactor: 调整工具库命名空间 2024-08-13 18:33:54 +08:00
Diego2098
0a4416e633 !37 release:6.0.5.3
refactor: 完善桌面端版本多语言资源

refactor: 忽略部分文件夹
2024-08-13 08:49:17 +00:00
Diego
6bb712854d Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2024-08-13 00:27:08 +08:00
Diego
46959e2407 docs: 更新文档 2024-08-13 00:27:00 +08:00
Diego2098
debbb049b0 !36 release:6.0.5.2
* feat: 增加IHostApplicationLifetime实现
* fix(FAIconList): js位置错误
2024-08-12 16:02:37 +00:00
Diego
375377fef9 release:6.0.5.1
refactor: 分离部分代码
refactor: 调整代码架构,分出blaor server与blazor hybrid架构的服务代码
2024-08-12 16:48:33 +08:00
Diego
d5758dd6a3 refactor: 代码清理 2024-08-12 14:22:07 +08:00
Diego
d5deffea58 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2024-08-11 18:10:35 +08:00
Diego
fadb43d9a1 release:6.0.4.61
refactor: 更新依赖库版本
refactor: card默认背景颜色更改
2024-08-11 18:10:24 +08:00
youthalan
044b641df0 !35 将快捷按钮归入到SPA模块中
* -将快捷按钮归入到SPA模块中
2024-08-09 01:48:19 +00:00
Diego
fbbacdb2ff Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2024-08-08 10:57:09 +08:00
Diego
4bfd7acd96 release:6.0.4.60
refactor: 支持全局按钮权限
refactor: 修改服务类插件启动错误后的等待间隔时间
2024-08-08 10:56:23 +08:00
youthalan
ff03225cf4 !34 补充TableExtensionToolbarTemplate及TableExtensionToolbarBeforeTemplate属性
* -补充TableExtensionToolbarTemplate及TableExtensionToolbarBeforeTemplate属性
2024-08-07 05:54:09 +00:00
Diego
8e820c0e47 fix(s7): 插件写入时错误 2024-08-07 11:16:41 +08:00
Diego
d718314324 other: 更新readme 2024-08-06 14:21:45 +08:00
Diego
1c653ec1b1 release:6.0.4.58 2024-08-05 20:13:54 +08:00
Diego
fe16ddadce fix: sql历史数据分包查询错误 2024-08-05 11:23:33 +08:00
Diego
7a978054cc refactor: 默认的登录页路径设置 2024-08-05 10:42:27 +08:00
Diego
8ed3b5a747 refactor: 整理权限框架 2024-08-04 00:38:07 +08:00
youthalan
6885150800 !33 修复用户页面手机号显示问题
* -修复用户页面手机号显示问题
2024-08-02 03:53:49 +00:00
Diego
35d33a1c7d fix: 修复上一提交导致的字典服务错误 2024-08-02 00:26:41 +08:00
Diego
93a16bbd3c fix: 修复上一提交导致的字典服务错误 2024-08-02 00:08:28 +08:00
Diego
d3cf6a4985 fix: 修复上一提交导致的字典服务错误 2024-08-01 23:54:42 +08:00
Diego
8ef7200c32 fix: 修复上一提交导致的字典服务缓存实体类型错误 2024-08-01 23:07:43 +08:00
Diego
e43da5ba86 release:6.0.4.48 2024-08-01 22:13:56 +08:00
youthalan
10428b4340 !32 添加查询自定义字典参数
* -修改字典种子数据字段名称
* -添加查询自定义字典参数
2024-08-01 14:08:46 +00:00
Diego
43b7c05cd7 refactor: 删除空文件夹 2024-08-01 17:31:17 +08:00
Diego
057f64b04c refactor: 文件更名 2024-08-01 17:28:21 +08:00
Diego
0971d783f3 release:6.0.4.47 2024-08-01 14:54:39 +08:00
Diego
54aabad3e8 refactor: 添加桌面端导出服务 2024-07-31 17:18:53 +08:00
Diego
606fbb5fec build: 调整构建脚本 2024-07-31 11:14:27 +08:00
Diego
5093c27ba5 release:6.0.4.45
fix: 会话管理离线通知功能失效
2024-07-31 09:28:01 +08:00
Diego
1d3661c946 refactor: 添加桌面端后台服务启停; 2024-07-30 21:04:17 +08:00
Diego
304f7a068d release:6.0.4.43
refactor: 支持blazor hybrid;
feat(s7): 支持多写;
2024-07-30 20:45:22 +08:00
Diego
7ea91be3fc release:6.0.4.43
refactor: 支持blazor hybrid;
feat(s7): 支持多写;
2024-07-30 20:44:20 +08:00
Diego
d15464b1ae release:6.0.4.42
refactor: 支持blazor hybrid;
feat(s7): 支持多写;
2024-07-30 19:57:23 +08:00
Diego
150435f24e release:6.0.4.41
refactor: 支持blazor hybrid;
feat(s7): 支持多写;
2024-07-30 19:45:06 +08:00
Diego
e49507cd14 release:6.0.4.38
refactor: 支持blazor hybrid;
feat(s7): 支持多写;
2024-07-30 19:44:47 +08:00
Diego
ad3cc3ebb6 refactor: 添加Cors 2024-07-29 09:47:58 +08:00
Diego
ecaf53836d release:6.0.4.31 2024-07-26 17:25:03 +08:00
Diego
8fc36e7b24 refactor: s7打包后不再主动关闭连接,因为可能对通道多设备产生影响 2024-07-26 17:24:26 +08:00
Diego
1dbbac2aa3 refactor: 更新依赖包 2024-07-26 08:56:44 +08:00
Diego
4e5775fde4 fix(modbusServer): modbusServer 写入布尔量错误 2024-07-24 00:06:45 +08:00
Diego
9d81c7c366 other: 删除backup文件 2024-07-19 10:28:23 +08:00
Diego
2df0441f0f release:6.0.4.28
fix: 变量导出excel偶发插件属性丢失
refactor: 变量并发导出按变量名称排序
2024-07-19 09:12:17 +08:00
Diego
4216002ce5 feat: startup适配移动平台 2024-07-18 20:50:06 +08:00
Diego
1af6f4e151 feat: 导出扩展方法 2024-07-18 08:20:57 +08:00
Diego
05f284bc11 refactor(S7): 对于变长字符串,连读打包解析时,根据返回字节解析长度 2024-07-17 14:51:48 +08:00
Diego
40c19b3ad4 refactor: 完善多语言资源 2024-07-16 17:06:03 +08:00
Diego
d1d972cca0 refactor: 文件夹更名 2024-07-16 15:54:30 +08:00
Diego
2a969921d6 refactor: nuget包添加打包 2024-07-16 08:32:27 +08:00
Diego
4b3e1f5187 refactor: nuget包添加打包 2024-07-15 20:45:12 +08:00
Diego
561963aa26 refactor: 整理格式 2024-07-15 20:36:36 +08:00
Diego
6c2c192836 refactor: 整理格式 2024-07-15 17:44:32 +08:00
Diego
f0730f2295 refactor: 恢复格式 2024-07-14 21:17:09 +08:00
Diego
9df91d2b63 refactor: 整理格式 2024-07-14 17:48:17 +08:00
Diego
09da1941fd refactor: 整理格式 2024-07-14 17:45:18 +08:00
Diego
613c8e4c28 refactor: 整理格式 2024-07-14 14:49:40 +08:00
Diego
7b407fd34d refactor: 整理格式 2024-07-14 12:19:20 +08:00
Diego
fb7ff7a803 refactor: 整理格式 2024-07-14 12:18:13 +08:00
Diego
0c1f0e0522 refactor: 分离部分代码 2024-07-13 22:31:45 +08:00
Diego
b5d771e9aa refactor: 分离部分代码 2024-07-13 22:22:53 +08:00
Diego
2f64255895 refactor(modbus): 修改方法访问级别 2024-07-13 13:30:06 +08:00
Diego
5b629a5c40 release:6.0.3.81
更新依赖包
2024-07-12 16:40:08 +08:00
Diego
b749cf52c3 feat(RpcService): rpc多写性能优化 2024-07-12 09:33:17 +08:00
Diego
b9a36a9223 feat: 更新常用方法 2024-07-09 17:27:21 +08:00
Diego
32debf6e6b fix: modbus byte类型读取偏移 2024-07-09 16:45:52 +08:00
Diego
06f6ae01c9 feat(modbus):支持byte类型连读 2024-07-09 16:20:42 +08:00
Diego
db4d8ad802 release:6.0.3.76 2024-07-09 15:40:36 +08:00
Diego
9c82de9c9e feat(opcuaServer): 优化opcuaServer更新数据效率 2024-07-09 12:01:06 +08:00
Diego
8329835528 refactor: 更新依赖项 2024-07-08 18:35:27 +08:00
Diego
8e624aa31b refactor: 更新依赖项 2024-07-07 17:08:04 +08:00
Diego2098
a2e8741517 refactor: 实时数据页面去除变量值筛选 2024-07-06 17:03:58 +08:00
Diego2098
3b7c107e8f release:6.0.3.72
fix(dlt645): 最大需量及发生时间数据标识编码错误
2024-07-06 17:00:54 +08:00
Diego
558bc3f971 release:6.0.3.71
fix(s7): 打包时pdulength不需要再次减去其他字节量

fix(s7): 打包时尝试连接一次
2024-07-05 15:07:05 +08:00
Diego
90a326f380 refactor: 实时数据页面去除变量值排序 2024-07-04 23:08:57 +08:00
Diego
867dc1ae35 refactor: 实时数据页面去除变量值排序 2024-07-04 22:53:20 +08:00
Diego
3f555464f7 fix(s7): 非主动发送时忽略解析 2024-07-04 22:35:38 +08:00
Diego
c0c0782258 release:6.0.3.69
fix(s7):写入结果错误
2024-07-04 19:18:24 +08:00
Diego
377f57bcb6 release:6.0.3.68
refactor: modbustcp修改错误
refactor: 连接失败时延时返回
refactor: 添加Dtu心跳回应间隔
2024-07-04 16:11:16 +08:00
Diego
a51253f1e5 refactor: modbustcp修改错误 2024-07-04 10:35:58 +08:00
Diego
e674e94da6 refactor: 驱动连接失败时延时返回 2024-07-04 10:28:02 +08:00
Diego
93a415f6d3 refactor: 添加Dtu心跳回应间隔 2024-07-04 10:04:10 +08:00
Diego
9364b97692 release:6.0.3.67 2024-07-03 17:46:38 +08:00
Diego
030915c9ea refactor: modbus排除干扰报文 2024-07-03 17:41:22 +08:00
Diego
10882c309a refactor: 修改 未选择数据时,批量编辑按钮提示信息 2024-07-03 15:11:52 +08:00
Diego
8232fde160 refactor: s7 2024-07-03 09:29:03 +08:00
Diego
45c3474d4d feat: 更新主题修改方式 2024-07-01 12:12:03 +08:00
Diego
c5a9e85343 release:6.0.3.66
feat: SQHisAlarm 支持questDB数据库
2024-07-01 10:20:19 +08:00
Diego
8c7ef59583 release:6.0.3.66
feat: SQHisAlarm 支持questDB数据库
2024-07-01 09:33:39 +08:00
Diego
36404b5c92 release:6.0.3.65 2024-06-29 18:53:05 +08:00
Diego
9949a117be refactor: 优化dtu服务显示页面 2024-06-29 17:07:45 +08:00
Diego
a3896db4f5 fix: signalr client在blazor server中,指定的url需按本机地址 2024-06-29 15:27:19 +08:00
Diego2098
f668062cab release:6.0.3.64 2024-06-29 12:02:04 +08:00
Diego2098
bac0721078 refactor: 任务启动前捕获操作取消日志 2024-06-29 11:46:51 +08:00
Diego2098
e29d7244d8 release:6.0.3.63 2024-06-29 10:36:36 +08:00
Diego2098
5a34b91a7a release:6.0.3.62 2024-06-29 08:17:28 +08:00
Diego2098
eaac8b1428 release:6.0.3.62
fix: dtu插件错误
2024-06-29 08:11:28 +08:00
Diego2098
6c6275dc88 release:6.0.3.61 2024-06-29 01:48:45 +08:00
Diego2098
bd350ae679 fix: tcpService被动连接读取错误 2024-06-29 00:53:32 +08:00
Diego
cadee28c68 release:6.0.3.60 2024-06-28 18:38:57 +08:00
Diego
3534828a99 feat: 支持DataService 2024-06-28 15:59:03 +08:00
Diego
e1c5777e25 release:6.0.3.59 2024-06-28 15:41:56 +08:00
Diego
63553d4dd3 release:6.0.3.59 2024-06-28 15:35:15 +08:00
Diego
6033d779fc release:6.0.3.58 2024-06-28 15:24:29 +08:00
Diego
97db27e61f release:6.0.3.57 2024-06-27 18:57:04 +08:00
Diego
8ed861c05f release:6.0.3.56 2024-06-27 15:55:54 +08:00
Diego
4d416657bf release:6.0.3.55 2024-06-27 12:24:21 +08:00
Diego
ede0399275 release:6.0.3.55 2024-06-27 12:20:42 +08:00
Diego
1a28ada04c fix: 服务启动时状态设置错误 2024-06-27 11:36:14 +08:00
Diego
8ac771cde4 release:6.0.3.51 2024-06-27 10:54:25 +08:00
Diego
c6afbbfc73 fix: 通道多设备时,适配器设置偶发错误 2024-06-27 10:54:06 +08:00
Diego
5ba71e8109 refactor: modbus/s7 2024-06-27 10:43:31 +08:00
Diego
a0d2922aca fix: 菜单缓存未及时刷新 2024-06-26 21:06:53 +08:00
Diego2098
446610b9df release:6.0.3.50 (#10)
release:6.0.3.50
2024-06-26 20:16:31 +08:00
Diego
4905eea503 refactor: modbus插件删除并发数量 2024-06-24 17:59:08 +08:00
Diego
519fc128f6 refactor: Admin 2024-06-24 16:25:04 +08:00
Diego
cc10955483 refactor: 修改测试库 2024-06-24 12:16:19 +08:00
Diego
e0bd47bb87 refactor: 修改注释 2024-06-24 10:48:12 +08:00
Diego
fb0c3c4a06 release:6.0.3.47 2024-06-24 10:39:19 +08:00
Diego
ceef1fdaf2 release:6.0.3.47 2024-06-24 10:38:05 +08:00
Diego
e1ac287ed1 release:6.0.3.46 2024-06-24 10:19:17 +08:00
Diego2098
29cd3a5945 release:6.0.3.44 2024-06-23 22:49:01 +08:00
Diego2098
cab082166b release:6.0.3.38 2024-06-23 00:01:26 +08:00
Diego
711dfd4da9 release:6.0.3.35 2024-06-21 18:18:28 +08:00
Diego
643948331d other: 更新demo 2024-06-21 18:10:13 +08:00
Diego2098
119030f1a5 release:6.0.3.34 2024-06-21 18:05:20 +08:00
Diego2098
3efee3dc52 refactor: 修改DTU未连接的错误提示 2024-06-21 18:01:15 +08:00
Diego2098
70716d5121 fix: mapster忽略大小写策略错误,导致部分插件属性映射错误 2024-06-21 09:43:11 +08:00
Diego
a7d11ead62 fix: 调试工具多读功能寄存器数据类型未绑定 2024-06-20 18:32:51 +08:00
Diego
017830e433 docs: 更新文档 2024-06-20 18:09:38 +08:00
Diego
bceb175c75 release:6.0.3.32 2024-06-20 16:49:53 +08:00
Diego
98277c6b71 release:6.0.3.32 2024-06-20 16:49:01 +08:00
Diego
b227fbe523 feat(opcda): 值变化事件添加组名称参数 2024-06-20 16:48:37 +08:00
Diego
ac6659a293 refactor: 通道释放等待池 2024-06-20 14:42:53 +08:00
Diego
30a24ced1d refactor: 修改日志输出顺序 2024-06-20 13:02:51 +08:00
Diego
3d1f4ae2ed fix: blazor form验证 2024-06-19 19:28:23 +08:00
Diego
e86aff049c fix(调试工具): 断开连接 2024-06-19 18:55:33 +08:00
Diego
8ec0ba7c9e other: 更新demo 2024-06-19 17:16:00 +08:00
Diego
c2898f0b2e other: 更新demo 2024-06-19 15:35:30 +08:00
Diego
0747374378 release:6.0.3.31 2024-06-19 11:43:53 +08:00
Diego
a0c2fea833 feat: 支持单文件发布 2024-06-19 11:43:14 +08:00
Diego
811c1a445f refactor: 修改基准测试项 2024-06-18 14:55:56 +08:00
Diego
72d3041e7e release:6.0.3.30 2024-06-18 14:31:52 +08:00
Diego
503180e7ec release:6.0.3.23 2024-06-18 12:25:54 +08:00
Diego
8ad548cad7 release:6.0.3.22 2024-06-18 12:14:38 +08:00
Diego2098
85d9acf605 refactor: 并发锁位置调整 2024-06-18 10:09:01 +08:00
Diego
fc93c5ffcb refactor: 并发锁位置调整 2024-06-17 17:01:13 +08:00
Diego
d6b0a9314c refactor: 初始化缓存编译读写表达式 2024-06-17 13:49:45 +08:00
Diego
83bc07c3ff release:6.0.3.11
修改默认启动端口
2024-06-17 10:32:05 +08:00
Diego2098
6ca680cd41 refactor: 数据库表名风格统一 2024-06-16 13:59:17 +08:00
Diego2098
2b533dcb2b fix: s7驱动多语言文本错误 2024-06-15 20:18:37 +08:00
Diego2098
13a5a09f98 refactor: 优化modbusSlave 2024-06-15 19:09:18 +08:00
Diego
75ff7ebdbe other:更新调试工具 2024-06-14 16:01:42 +08:00
Diego
6d8f3a1fc8 release:6.0.3.9 2024-06-14 14:14:39 +08:00
Diego
a11b411912 fix: 修复上个提交导致的表达式空指针错误 2024-06-14 09:28:18 +08:00
Diego
2dba817c69 feat: 登录页面添加版本提示 2024-06-13 16:55:54 +08:00
Diego
d4df9a545f release:6.0.3.8 2024-06-13 14:22:36 +08:00
Diego
cae21391e5 release:6.0.3.8 2024-06-13 14:20:53 +08:00
Diego
573b22d2c2 refactor: 优化CSScript编译 2024-06-13 14:20:30 +08:00
Diego
14d4112a9d fix: 命名空间错误 2024-06-13 13:47:18 +08:00
Diego
28aa9db9c5 更新依赖 2024-06-13 13:40:33 +08:00
Diego
d50c349e00 release:6.0.3.7
破坏性更改

动态编译脚本表达式,传入值不再是dynamic类型,而是object,注意类型转换
2024-06-13 13:38:17 +08:00
Diego
905362c59c release:6.0.3.6 2024-06-13 10:23:36 +08:00
Diego
97e7d44310 fix: 特殊方法选择错误 2024-06-12 16:29:04 +08:00
Diego
bb71a1ef23 feat: tcpservice支持多个ip绑定,以分号间隔 2024-06-12 14:29:14 +08:00
youthalan
de2771d008 !31 添加ShowExtendEditButtonCallback等
Merge pull request !31 from youthalan/master
2024-06-12 02:59:09 +00:00
Diego
02de34b65a refactor: crc方法修改 2024-06-11 19:03:19 +08:00
youthalan
c6e14889f2 !30 添加SetRowClassFormatter属性等
Merge pull request !30 from youthalan/master
2024-06-11 08:07:06 +00:00
Diego
f843732790 other: dockerfile 2024-06-11 15:50:52 +08:00
Diego
80e7ff0fc1 release:6.0.3.5 2024-06-11 15:47:58 +08:00
Diego
2964db6bdd fix: modbusUdp已发送数组获取失败 2024-06-11 15:47:36 +08:00
Diego
5fbd94ec74 refactor: 更新依赖 2024-06-11 15:37:50 +08:00
Diego
1d8d31d4f0 other: 更新docker地址 2024-06-11 12:53:08 +08:00
Diego
707c3eed99 release:6.0.3.3
refactor: 优化错误提示
2024-06-11 12:24:17 +08:00
Diego2098
e33a81ad36 refactor: 优化错误提示 2024-06-10 22:53:48 +08:00
Diego2098
0f7d216379 refactor: 优化错误提示 2024-06-10 22:47:54 +08:00
Diego2098
f0052e97a6 refactor: 修改注销方式 2024-06-10 21:05:59 +08:00
Diego
5c6076d48d refactor: 修改token缓存服务 2024-06-09 19:49:29 +08:00
Diego
883bd31249 refactor: 优化debug软件体验 2024-06-09 17:55:57 +08:00
Diego
d7b5fde3c7 fix: 取消mapster映射忽略大小写,这会导致字典键错误 2024-06-09 17:16:56 +08:00
Diego
f4273efef0 fix: 冗余心跳错误 2024-06-09 14:12:39 +08:00
Diego
471dc966d9 fix: 冗余心跳错误 2024-06-09 13:52:12 +08:00
Diego
50368654a4 build: Photino修改为net6 2024-06-09 13:34:01 +08:00
Diego
b1e1cc04ce refactor: dockerfile 2024-06-09 13:18:49 +08:00
Diego
554f67e295 release:6.0.2.27 2024-06-09 13:16:10 +08:00
Diego
278bd09a6c refactor: 优化插件调试通道创建步骤 2024-06-09 13:12:42 +08:00
Diego
300d083038 release:6.0.2.27
refactor: 优化插件调试通道创建步骤
2024-06-09 13:11:03 +08:00
Diego
34664f0025 other: 代码整理 2024-06-09 12:30:45 +08:00
Diego
7aaa803813 docs: 更新文档 2024-06-09 12:25:28 +08:00
Diego
b075b3ec1c Revert "dcos: 更新大小端配置方式"
This reverts commit 6a1f1ebf9d.
2024-06-09 12:24:01 +08:00
Diego
0f3f4b0f5b refactor: 字节解析顺序回退5.x版本策略 2024-06-09 12:23:55 +08:00
Diego
fd5ed78442 feat: 支持modbus服务端模拟dtu设备 2024-06-07 22:39:17 +08:00
Diego
d516e7dcb4 fix: 回退5.x版本bool解析策略 2024-06-07 13:48:37 +08:00
Diego
6a1f1ebf9d dcos: 更新大小端配置方式 2024-06-06 19:08:15 +08:00
Diego
6ba5c02dd6 release:6.0.2.25 2024-06-06 16:29:19 +08:00
Diego
c9b8f90859 fix: 线程管理锁策略错误 2024-06-06 15:18:58 +08:00
Diego
70a0bf6d5c fix: 心跳格式判断错误(多余空格) 2024-06-06 14:50:05 +08:00
Diego
4caf8d6fab refactor: 默认GC策略修改 2024-06-06 10:32:42 +08:00
Diego
aa90593158 refactor: 优化动态主题错误提示 2024-06-06 09:07:13 +08:00
youthalan
9da5531483 feat(AdminTable): 增加BeforeRowButtonTemplate属性 2024-06-06 01:05:11 +00:00
youthalan
9483459ba7 feat(AdminTable): 增加BeforeRowButtonTemplate属性
feat(AdminTable): 增加BeforeRowButtonTemplate属性
2024-06-05 09:58:13 +00:00
Diego
ae57883770 refactor: 适配touchsocket nuget包新版本 2024-06-05 16:50:30 +08:00
Diego
8cb5a89d10 other: 更新Dockerfile 2024-06-05 16:15:10 +08:00
Diego
1a35fb0d4d release:6.0.2.22 2024-06-05 15:55:58 +08:00
Diego
1a2483c68c docs: 更新mqtt文档 2024-06-05 15:55:35 +08:00
Diego
6c806238b2 refactor: mqttRpc主题策略更改
Break Changes

mqttRpc主题策略更改
2024-06-05 15:51:08 +08:00
Diego
ea6e07a38b refactor: 代码整理 2024-06-05 14:56:34 +08:00
Diego
ec6b07b275 fix: 业务插件基类定时上传方法循环错误 2024-06-05 14:48:54 +08:00
Diego
e85a03a1ca release:6.0.2.20
refactor: 更新依赖包版本
2024-06-05 14:18:03 +08:00
Diego
5d66b7677f refactor: 缓存文件名称修改 2024-06-05 13:19:11 +08:00
Diego
3932834172 other: 修改解决方案文件 2024-06-05 12:36:10 +08:00
Diego
d2e8294a1a release:6.0.2.19
fix: 自定义实时报警条件错误

refactor: webapi登录返回实体更改,添加token到响应body
2024-06-05 10:27:13 +08:00
Diego
b06aa66ad8 refactor: 优化本地化语言显示 2024-06-04 19:15:10 +08:00
Diego
c45b48d949 release:6.0.2.18
fix: 重启运行时偶发空异常

refactor: 变量批量编辑支持报警属性

fix: 批量编辑时刷新缓存
2024-06-04 18:54:37 +08:00
Diego
f779af1f65 fix: 重启运行时偶发空异常 2024-06-04 15:39:16 +08:00
Diego
78d039cd5f refactor: 变量批量编辑支持报警属性 2024-06-04 15:02:53 +08:00
Diego
fdbd5418c7 release:6.0.2.17
fix: 变量业务属性为空时保存失败

fix: TD数据库列描述不支持,删除对应特性

feat: 增加删除缓存按钮
2024-06-04 14:47:11 +08:00
Diego
5df42466fd fix: 变量业务属性为空时保存失败;
fix: TD数据库列描述不支持,删除对应特性
2024-06-04 14:12:46 +08:00
Diego
ff2bed87f2 release:6.0.2.16
refactor: 优化DTU模式采集
2024-06-04 12:02:38 +08:00
Diego
765e7d0b1e release:6.0.2.15
refactor: 优化DTU模式采集
2024-06-04 11:16:22 +08:00
Diego
71ab6d42c8 fix: dtu模式下modbus打包逻辑错误 2024-06-03 18:39:03 +08:00
Diego
2ea2a662ef refactor: 删除不必要的锁操作 2024-06-03 18:28:28 +08:00
Diego
c2d45349a4 release:6.0.2.10
refactor: update touchsocket
2024-06-03 15:11:03 +08:00
Diego
1b5cf410b7 release:6.0.2.7
fix: 回退touchsocket版本
2024-06-03 14:08:33 +08:00
Diego
3e79e2bed0 feat: 增加可选配置json文件 2024-06-03 13:30:31 +08:00
Diego
2a1f933702 release:6.0.2.6
refactor: update touchsocket

refactor: update photino
2024-06-03 09:44:12 +08:00
Diego2098
251d3b487f release:6.0.2.6
refactor: 打包参数策略修改,防止数据类型用户填写错误时出现未能理解的错误
2024-06-01 12:50:50 +08:00
Diego
e55ec48c7d release:6.0.2.5
refactor: 修改每包读取延迟策略
2024-05-31 17:11:05 +08:00
Diego
7ce2195adb release:6.0.2.4
feat: 添加docker公共镜像
refactor: 首次连接失败opcua时,实时重连
2024-05-31 16:51:30 +08:00
Diego
537b79f1c2 feat: opcua客户端读取数据增加服务端时间属性读取 2024-05-30 16:39:02 +08:00
Diego
e4c4d22f56 docs: 更新pro用户列表 2024-05-30 15:58:32 +08:00
Diego
c4d244398c release: 6.0.2.1
refactor: 更新BootstrapBlazor版本

refactor: opc导入导出去重
2024-05-30 15:40:20 +08:00
Diego
47260cdaf0 feat: 添加ValueTask同步扩展 2024-05-30 14:26:45 +08:00
Diego
7ef13058c7 fix: 修复上一提交导致的偶发空异常 2024-05-30 12:37:04 +08:00
Diego
8066cb1804 feat: 优化变量离线逻辑,当设备无法连接时,直接判断全部变量离线 2024-05-30 12:18:17 +08:00
Diego
c5af6062fa fix: 修复网页重启运行时与冗余网关配置重启运行时逻辑冲突错误 2024-05-30 11:23:14 +08:00
Diego
908a2eba20 feat: 添加等待并比较读取返回值的扩展方法 2024-05-30 10:31:03 +08:00
Diego
6f43957703 other: 更新demo 2024-05-30 09:32:14 +08:00
Diego
897ea28cf4 release: 6.0.1.5
fix: table查询返回IsAdvanceSearch属性错误

refactor: 日志表默认时间倒序显示
2024-05-30 09:30:12 +08:00
Diego
d056ddbff1 fix: table查询返回IsAdvanceSearch属性错误 2024-05-30 09:26:30 +08:00
Diego
f157350059 refactor: 日志表默认时间倒序显示 2024-05-30 08:25:17 +08:00
Diego2098
7e3d99bda3 release: 6.0.1.5
refactor: 部分选项恢复上一版本默认值
2024-05-29 23:08:14 +08:00
Diego2098
c7c53e1d94 release: 6.0.1.4
other: 同步master
2024-05-29 22:15:45 +08:00
Diego
b912ee3f6f refactor: 删除多余代码 2024-05-29 19:09:38 +08:00
Diego2098
06c05ad8e5 feat: 更新6.0.1.3 (#9)
1、更新TouchSocket2.1版本,重构相关代码.

2、优化多处细节,提供运行效率.
2024-05-29 19:03:40 +08:00
Diego
7f411400d5 fix(CacheService): GetOrCreate方法错误触发委托 2024-05-27 18:28:07 +08:00
Diego
f24f234869 fix: 修复因缓存修改导致的插件显示错误 #I9NKA7 2024-05-17 12:28:10 +08:00
Kimdiego2098
4e384e7811 refactor: 按钮disable改为isshow 2024-05-06 15:32:57 +08:00
Kimdiego2098
5143448163 fix: 变量上传属性删除按钮丢失 2024-05-06 14:34:10 +08:00
Diego2098
8e5e9f7cbc build: 更新admin解决方案 2024-05-04 22:30:28 +08:00
Diego2098
5ea7fd01bf release: 6.0.0.13 2024-05-04 22:22:20 +08:00
Kimdiego2098
8f3f6bc774 fix: 修正BusinessBaseWithCacheInterval初始化顺序 2024-04-30 17:55:59 +08:00
Kimdiego2098
7f1524b42f fix: v6代码错漏,间隔上传基类重写BusinessPropertyWithCache属性 2024-04-30 17:35:08 +08:00
Diego2098
4b7db4689d fix: variable实体类读写表达式执行错误 (#8)
* fix: variable实体类读写表达式执行错误

fix: 读写表达式编译错误,缺少using

feat: 增加部分使用demo

* refactor: 整理格式
2024-04-29 16:03:38 +08:00
Diego2098
92831ecb43 refactor: 修改下拉框全选项文本 (#7)
* refactor: 修改下拉框全选项文本

refactor: 修改下拉框全选项文本

fix: i18n(AlarmTopic)中文错误

* build: 更新版本号
2024-04-29 14:50:14 +08:00
Argo-AscioTech
d486f3f306 chore: 删除冗余代码 2024-04-29 03:08:22 +00:00
Diego2098
bfb7468f62 !26 test:回退 'Pull Request !22: fix: 增加 fill 元素保证小屏幕时用户信息靠右'
* 回退 'Pull Request !25 : fix: 增加 fill 元素保证小屏幕时用户信息靠右'
2024-04-29 02:27:13 +00:00
Argo-AscioTech
2e417d41db chore: 删除冗余代码 2024-04-29 02:18:45 +00:00
Argo-AscioTech
b17f68cbfb fix: 增加 fill 元素保证小屏幕时用户信息靠右 2024-04-29 02:18:45 +00:00
Argo-AscioTech
8a22a523d6 doc: 代码格式化 2024-04-29 02:18:45 +00:00
Diego2098
97fe752a4e 回退 'Pull Request !22 : fix: 增加 fill 元素保证小屏幕时用户信息靠右' 2024-04-29 02:13:39 +00:00
Diego2098
cc4ea122a2 !22 fix: 增加 fill 元素保证小屏幕时用户信息靠右
* chore: 删除冗余代码
* fix: 增加 fill 元素保证小屏幕时用户信息靠右
* doc: 代码格式化
2024-04-29 02:05:15 +00:00
Kimdiego2098
db995d29e5 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2024-04-29 10:04:07 +08:00
Kimdiego2098
c22dde8008 fix(mqttClient): AlarmTopic upload failure
fix: 报警主题中文名称错误

fix: 报警事件订阅漏写
2024-04-29 10:03:55 +08:00
Diego2098
462d888894 refactor: update appsettings
* refactor: 调整顺序,最大通道数量默认改为10000
2024-04-28 19:22:28 +08:00
Argo Zhang
9311b914ad refactor(AdminTable): update page items from 20 (#4)
* chore: 增加单词拼写字典

* refactor: 更改页码每页最少 20 行数据
2024-04-28 19:13:17 +08:00
Argo Zhang
c5e0488210 feat(AdminTable): add ClientTableName parameter (#5)
* refactor: 代码格式化

* feat: 增加 ClientTableName 参数
2024-04-28 19:13:00 +08:00
Kimdiego2098
f548c27179 refactor: modbusSlave默认启用rpc 2024-04-28 15:20:10 +08:00
Kimdiego2098
1f5f405b52 release: 6.0.0.12 2024-04-28 14:41:20 +08:00
Kimdiego2098
cd923ab838 other: 更新readme 2024-04-28 14:40:56 +08:00
Kimdiego2098
aacdff92d2 docs: 更新文档 2024-04-28 14:25:02 +08:00
Kimdiego2098
32160d388a docs: 迁移文档站点 2024-04-28 13:41:41 +08:00
Kimdiego2098
72e31929eb docs: 迁移文档站点 2024-04-28 13:33:35 +08:00
Kimdiego2098
29014bb40e other: 修改git忽略项 2024-04-28 13:32:24 +08:00
Kimdiego2098
e9d0a65536 fix: 重载插件几率死锁 2024-04-28 11:03:14 +08:00
Kimdiego2098
f7a3b68834 fix: 重载插件几率死锁 2024-04-28 10:13:26 +08:00
Kimdiego2098
dcc9d3b588 docs: 更新文档 2024-04-28 09:54:06 +08:00
Kimdiego2098
b8f6f65943 fix(tcpservice): 客户端断开时不需重置全部同步锁 2024-04-28 09:53:46 +08:00
Kimdiego2098
3dacdda21a build: 更新mapster nuget版本 2024-04-28 09:53:05 +08:00
Diego2098
49b766120f refactor: json序列化忽略null值 2024-04-27 16:19:54 +08:00
Diego2098
2d7e1553f8 refactor: 优化间隔检测 2024-04-26 21:17:27 +08:00
Kimdiego2098
d5d41213b0 release: 6.0.0.11 2024-04-26 18:02:23 +08:00
Kimdiego2098
328df00d2e fix: 通道日志导出时,支持中文名称 2024-04-26 18:01:50 +08:00
Kimdiego2098
e4a5bf8234 feat: 添加批量编辑方法 2024-04-26 17:43:41 +08:00
Kimdiego2098
d6ee0f216c feat: 添加demo 2024-04-26 17:20:00 +08:00
Kimdiego2098
0246ef6b6a feat: 添加demo 2024-04-26 17:03:22 +08:00
Kimdiego2098
7fd40518fd refactor: 内存优化 2024-04-26 12:25:38 +08:00
Kimdiego2098
95eb53edf6 feat: 添加当前进程占用内存显示 2024-04-26 11:22:42 +08:00
Kimdiego2098
4cdf2962cd release: 6.0.0.10 2024-04-26 10:07:55 +08:00
Kimdiego2098
5bf8ccd1fd refactor: 优化网关模块页面的使用体验 2024-04-26 10:06:54 +08:00
Kimdiego2098
dd9fbbcfa7 feat: 添加通用并发锁条件 2024-04-26 09:28:44 +08:00
Diego2098
72d8fd5be0 refactor: 设备状态页面优化 2024-04-25 23:25:52 +08:00
Diego2098
b577229ed3 refactor: 表格去除列宽持久化 2024-04-25 23:20:45 +08:00
Diego2098
4ae870b799 fix: 多页面通知刷新 2024-04-25 23:11:43 +08:00
Diego2098
0590e74b30 feat: SystemTextJson修改NumberHandling选项,支持特殊数字 2024-04-25 22:32:54 +08:00
Diego2098
b9956ba800 fix: v6版本支持系统服务 2024-04-25 19:40:18 +08:00
Kimdiego2098
fef6259d09 release: 6.0.0.9 2024-04-25 18:07:00 +08:00
Kimdiego2098
e24f19e88b docs: 更新文档 2024-04-25 18:06:03 +08:00
Kimdiego2098
cc6de1e71c build: 更新肉夹馍nuget版本 2024-04-25 18:00:19 +08:00
Kimdiego2098
b0240a1c95 refactor: appsettings添加urls配置例子 2024-04-25 17:54:43 +08:00
Kimdiego2098
8acdec333b refactor: 控制台字符logo更新 2024-04-25 17:53:56 +08:00
Kimdiego2098
eafcbb81f9 feat: DEBUG启动自动填充账密 2024-04-25 17:52:44 +08:00
Kimdiego2098
4b083463c8 refactor: gateway命名空间 2024-04-25 15:39:00 +08:00
Kimdiego2098
78e834e04f build: 修改插件类库拷贝脚本 2024-04-25 15:13:26 +08:00
Kimdiego2098
2ed1893620 feat: 添加Description方法 2024-04-25 15:12:36 +08:00
Kimdiego2098
35f188a7dd fix: CSScript using namespace无效 2024-04-25 09:47:46 +08:00
Kimdiego2098
07f577a9dd release: 6.0.0.8 2024-04-25 09:26:08 +08:00
Kimdiego2098
25c72b50c0 build: 类库net版本降至net6 2024-04-25 09:25:47 +08:00
Kimdiego2098
e07346ebea other: update readme 2024-04-24 15:00:07 +08:00
Diego2098
699b466291 other: git忽略文件 2024-04-23 21:44:59 +08:00
Diego2098
f0f24ff96f release: 6.0.0.7 2024-04-23 21:21:58 +08:00
Diego2098
1113997c71 fix: 修复类似400001.0位格式读取打包错误 2024-04-23 21:21:40 +08:00
Kimdiego2098
487fb6e5c9 release: 6.0.0.6 2024-04-23 18:34:35 +08:00
Kimdiego2098
62908a323c fix: v6版本modbusRtu bodyLength错误 2024-04-23 18:33:41 +08:00
Kimdiego2098
021131271a other: modify Pro ProjectReference Include 2024-04-23 18:08:21 +08:00
Kimdiego2098
c20fa4dbd2 fix: VersionService取消Assembly.Location用法 2024-04-23 16:54:38 +08:00
Kimdiego2098
b1826678da release: 6.0.0.5 2024-04-23 12:12:17 +08:00
Kimdiego2098
1630338f4e refactor: 修改条件编译 2024-04-23 12:11:53 +08:00
Kimdiego2098
78af3d979c fix: 菜单curd
1、创建模块后,切换模块列表不能马上显示
2、创建根菜单时,不填写路径会出错
2024-04-23 12:08:40 +08:00
Kimdiego2098
8346dfb1f5 perf: 添加ConfigureAwait(false) 2024-04-23 11:33:26 +08:00
Kimdiego2098
5ecb4e4fe4 refactor(VerificatInfoCacheService): DEBUG模式下,实时持久化登录凭据 2024-04-23 08:45:16 +08:00
Kimdiego2098
ec9ff23b23 refactor(DeviceStatusPage): 设备页面筛选下拉框null值显示为none 2024-04-23 08:37:27 +08:00
Diego2098
149e9931e7 refactor: 修改user默认模块种子数据 2024-04-23 00:02:11 +08:00
Diego2098
58b62094bd release: 6.0.0.4 2024-04-22 23:57:51 +08:00
Diego2098
d357074ad4 refactor: 修改excel导出的字段排序 2024-04-22 23:57:14 +08:00
Diego2098
d9bacc129b feat: 业务缓存设备基类添加属性(缓存文件最大长度) 2024-04-22 23:31:48 +08:00
Diego2098
28d869b099 refactor: excel导入时,按行号排序 2024-04-22 23:25:40 +08:00
Kimdiego2098
d04e87718a release: 6.0.0.3 2024-04-22 18:31:41 +08:00
Kimdiego2098
8d81bf60c9 feat(dlt645): 修改FE前导符为自定义格式 2024-04-22 18:30:47 +08:00
Kimdiego2098
4fe9094ff7 refactor: trace日志构建前设置条件 2024-04-22 17:41:22 +08:00
Kimdiego2098
4cfde45755 refactor: 修改单线程读写时的锁范围 2024-04-22 17:12:16 +08:00
Kimdiego2098
c28844dbeb refactor: 迁移读写方法到基础类库 2024-04-22 16:59:14 +08:00
Kimdiego2098
837ea7c8d6 refactor: 迁移Dtu读写方法到基础类库 2024-04-22 14:42:27 +08:00
Kimdiego2098
6c85ac8827 refactor: 补充nuget发布类库 2024-04-22 14:27:53 +08:00
Kimdiego2098
c8eb8bf35d release: 6.0.0.2 2024-04-22 14:22:37 +08:00
Kimdiego2098
0f6cbddd57 refactor: 迁移DtuPlugin到共用类库 2024-04-22 14:18:57 +08:00
Kimdiego2098
530b4755bf refactor: 底层驱动类库升级net版本,保留net462以及netstandard2.0 2024-04-22 13:58:14 +08:00
Kimdiego2098
679395b3fe refactor: modbusMaster 添加 分部定义 2024-04-22 13:56:45 +08:00
Kimdiego2098
9293442836 fix: editForm不应该直接修改缓存 2024-04-22 10:33:51 +08:00
Kimdiego2098
4841b412f3 feat: v6网关模块添加按钮权限 2024-04-22 10:08:57 +08:00
Kimdiego2098
f03575ad89 fix: 角色授权流程错误 2024-04-22 10:07:49 +08:00
Diego2098
e0e5428ebd feat: 添加业务设备离线缓存 2024-04-21 00:06:32 +08:00
Diego2098
015f7edae2 style: 表格列宽调整 2024-04-20 23:14:47 +08:00
Diego2098
d5414f5d91 !20 fix: 修复表格不对齐问题
* fix: 修复表格不对齐问题 , thanks to @Argo
2024-04-20 14:59:00 +00:00
Kimdiego2098
4bc3512d42 按钮授权初始化授权列表错误 2024-04-19 12:50:48 +08:00
Kimdiego2098
4c305994ca 添加多语言资源 2024-04-19 11:39:10 +08:00
Kimdiego2098
788e2cba04 修改变量页面默认排序 2024-04-18 16:52:19 +08:00
Kimdiego2098
b79b79970e 实时数据页面添加关键词搜索 2024-04-18 16:18:53 +08:00
Kimdiego2098
8b0f4de516 更新 2024-04-18 16:15:54 +08:00
Kimdiego2098
a17000ad6d 修改判断值变化方法 2024-04-18 16:15:53 +08:00
Kimdiego2098
c9f63c58df 修改项目文件 2024-04-18 16:01:38 +08:00
Kimdiego2098
c311b1c706 更新git文件 2024-04-18 14:36:58 +08:00
Kimdiego2098
072451afae 删除多余重写属性 2024-04-18 11:06:00 +08:00
Kimdiego2098
7349793463 更新项目文件 2024-04-18 10:21:31 +08:00
Kimdiego2098
c0144eab86 调整项目文件 2024-04-18 10:18:09 +08:00
Kimdiego2098
ba79b25944 VerificatInfo删除不必要的属性 2024-04-17 18:56:20 +08:00
Kimdiego2098
3fb34b12a0 更新部署文件 2024-04-17 15:00:09 +08:00
Kimdiego2098
b6c17e76c2 更新部署文件 2024-04-17 14:57:01 +08:00
Kimdiego2098
1201f20d79 删除不必要的文件 2024-04-17 12:30:44 +08:00
Kimdiego2098
98ae8e692e 添加文档 2024-04-17 12:20:01 +08:00
Kimdiego2098
8342dbff4e 更新6.0版本 2024-04-17 12:18:00 +08:00
Kimdiego2098
a22aa0f9a7 Merge branch 'dev' into temp 2024-04-17 12:15:23 +08:00
Kimdiego2098
b49d221ec1 准备合并dev分支 2024-04-17 12:14:05 +08:00
Kimdiego2098
f1be315147 更新插件 2024-04-17 11:32:36 +08:00
Kimdiego2098
8aaac2a3d4 更新插件UI 2024-04-17 10:55:46 +08:00
Kimdiego2098
bd07d30e47 更新插件 2024-04-17 10:51:42 +08:00
Kimdiego2098
54e103f00f 更新插件 2024-04-17 10:32:31 +08:00
Kimdiego2098
5404d8f7ab 更新插件 2024-04-17 10:21:45 +08:00
Diego2098
1364e02c67 更新插件 2024-04-17 00:42:25 +08:00
Diego2098
b4818e2f9a 修复 变量页面 自动刷新时,每页条数会恢复初始值 的问题 2024-04-16 22:54:05 +08:00
Diego2098
734cf57d4a 更新插件 2024-04-16 21:22:49 +08:00
Diego2098
9236610ec1 更新插件 2024-04-16 21:12:38 +08:00
Diego2098
c33828a5d9 更新插件 2024-04-16 21:11:42 +08:00
Diego2098
faadb03e46 !18 更新插件
Merge pull request !18 from BAD MAN/dev_20240416
2024-04-16 10:11:54 +00:00
allrightsreserved
3a0c4c51d2 Merge branch 'dev' of https://gitee.com/dancingqueen/ThingsGateway into dev 2024-04-16 16:02:40 +08:00
Kimdiego2098
6c28c2b91e 更新OPCUA OPCDA 2024-04-16 16:02:26 +08:00
Kimdiego2098
5226df6194 更新readme 2024-04-16 14:45:15 +08:00
Kimdiego2098
1ad23a3cbb 更新依赖 2024-04-16 14:29:13 +08:00
Kimdiego2098
c4149ca304 修改变量服务 导出方法名称 2024-04-16 14:26:19 +08:00
Kimdiego2098
68b02fe950 优化导入导出,支持属性验证 2024-04-16 14:02:41 +08:00
Kimdiego2098
d9408523a5 更新插件 2024-04-16 11:12:28 +08:00
Diego2098
40ad0f063a 更新版本 2024-04-15 23:31:57 +08:00
Diego2098
40d85e8926 恢复部分代码:tcpclientbase;IDBHistoryAlarm;sqlhisalarm 2024-04-15 23:31:43 +08:00
Diego2098
e655f719e6 !16 为历史报警增加外部访问接口,linux下隐藏 OPCDA 调试选项,TgTcpClientBase.cs 增加try catch,防止出现设备无法连接时visualstudio 抛出异常“在一个非嵌套字上尝试了一个操作”
Merge pull request !16 from BAD MAN/master
2024-04-15 15:26:40 +00:00
BAD MAN
ede0ea02c5 Merge branch 'master' of https://gitee.com/dancingqueen/ThingsGateway 2024-04-15 22:46:37 +08:00
Diego2098
e579575b21 为 history alarm 增加 GetDBHistoryAlarmsAsync 和 GetDBHistoryAlarmPagesAsync 接口,方便外部访问历史报警;增加try catch,防止出现设备无法连接时visualstudio 抛出异常“在一个非嵌套字上尝试了一个操作”;linux 环境下 OPCDA 不显示 2024-04-15 22:46:35 +08:00
Kimdiego2098
06ffcc9fdf 更新插件 2024-04-15 18:14:23 +08:00
Kimdiego2098
774d03e510 更新插件 2024-04-15 17:39:02 +08:00
Kimdiego2098
adcac9dfe6 添加任务最大数量限制 2024-04-15 16:50:06 +08:00
Kimdiego2098
399e14c70c 去除头像种子数据 2024-04-15 14:25:35 +08:00
Kimdiego2098
ec8b51033b signalr dispose 忽略exception 2024-04-15 14:23:29 +08:00
Kimdiego2098
ca5d167b6a 更新插件 2024-04-15 13:57:05 +08:00
Kimdiego2098
fcd1b001d1 更新readme 2024-04-15 13:34:32 +08:00
Kimdiego2098
1cabbefe04 更新插件 2024-04-15 13:31:28 +08:00
Kimdiego2098
ecefe22c95 更新插件 2024-04-15 13:06:43 +08:00
Kimdiego2098
64db77b9a2 更新插件 2024-04-15 13:03:32 +08:00
Kimdiego2098
19d7360ad5 更新插件 2024-04-15 13:01:46 +08:00
Kimdiego2098
2f014cd827 更新插件 2024-04-15 12:46:17 +08:00
Kimdiego2098
7fb84205d9 更新插件 2024-04-15 12:38:07 +08:00
Kimdiego2098
47e1127c5f 更新插件 2024-04-15 12:21:16 +08:00
Kimdiego2098
e036b59306 更新插件 2024-04-15 12:04:34 +08:00
Kimdiego2098
f4904c3b53 添加插件 2024-04-15 11:31:13 +08:00
Diego2098
3002a63ba5 更新BootstrapBlazor版本 2024-04-14 23:38:47 +08:00
Diego2098
b69717e6c3 更新版本 2024-04-14 23:37:05 +08:00
Diego2098
d07962953f 修改注释 2024-04-14 23:16:30 +08:00
Diego2098
857cf0d21e delay策略更改 2024-04-14 23:10:37 +08:00
Diego2098
5f08c2615d 修复缓存类型转换错误 2024-04-14 23:05:21 +08:00
Diego2098
e87428ef33 更新6.0版本 2024-04-14 22:51:56 +08:00
Kimdiego2098
03fd54fe70 td时序库上传时间不应作为主键 2024-04-12 16:57:09 +08:00
Kimdiego2098
086c2c8253 取消ParallelForEachAsync方法 2024-04-11 14:54:54 +08:00
Kimdiego2098
05c19a32ea s7 修改解析 返回码 顺序 2024-04-10 15:20:18 +08:00
Kimdiego2098
99d174906a 更新版本 2024-04-08 21:48:50 +08:00
Kimdiego2098
82e30a326a 修复上个版本 modbus驱动打包变量 代码错误 2024-04-08 21:46:47 +08:00
Diego2098
2963a9cdca !14 获取历史数据之前检查历史数据库是否连接成功
Merge pull request !14 from BAD MAN/master
2024-04-05 13:53:55 +00:00
BAD MAN
288da75b2b Merge branch 'master' of https://gitee.com/dancingqueen/ThingsGateway 2024-04-05 21:05:57 +08:00
Kimdiego2098
0943a496dd 获取历史数据之前检查历史数据库是否连接成功更新版本 2024-04-05 21:04:47 +08:00
Kimdiego2098
e5dd7cc2fa 强推 2024-04-03 19:01:57 +08:00
Kimdiego2098
358836ef9f 更新版本 2024-04-01 10:00:00 +08:00
Kimdiego2098
aab4fac6c5 modbus DTU模式 修复socketid不同时的变量打包方式,以及心跳注册包等不再影响正常数据收发 2024-04-01 09:59:48 +08:00
Kimdiego2098
525540b603 S7打包方法内变量名称修正 2024-03-31 11:36:56 +08:00
Kimdiego2098
b30eeb4694 mchart 更新 2024-03-30 22:03:19 +08:00
Kimdiego2098
3faf0aa2fc 更新版本 2024-03-29 23:23:28 +08:00
Kimdiego2098
fd728dec5d 更新依赖包 2024-03-29 23:23:15 +08:00
Kimdiego2098
08b14b72d4 读写表达式更换为CS-Script实现 2024-03-29 23:15:52 +08:00
Diego2098
de2e005abf 更新版本 2024-03-27 22:17:55 +08:00
Diego2098
0fc75239a6 添加PreEvaluateVariableEnable配置,读取表达式/写入表达式中可以用变量名称获取全局变量的值,因性能问题默认关闭 2024-03-27 22:15:41 +08:00
Kimdiego2098
390fe30a0d 更新版本 2024-03-26 15:02:05 +08:00
Kimdiego2098
633f49fcd2 opcda导出节点excel表时通道名称错误 2024-03-26 15:01:57 +08:00
Kimdiego2098
30c0ba93b9 修复 s7 通过.n的方式读取字节中布尔量时,如果变量地址带有分号时出现的分包错误 2024-03-25 13:28:58 +08:00
Diego2098
e935fb9621 修正数组类型判断值变化方式 2024-03-24 23:08:55 +08:00
Kimdiego2098
5ce8bb1d08 修复首页刷新线程返回时,option还未赋值成功导致报错问题 2024-03-22 12:19:55 +08:00
Kimdiego2098
1acd12980a 调试页面显示异常堆栈 2024-03-16 16:59:12 +08:00
Kimdiego2098
683235dd8a 发布构建脚本重复错误 2024-03-15 10:53:13 +08:00
Kimdiego2098
65fe183ad4 冗余配置文件丢失时不再报空指针错误 2024-03-15 09:55:34 +08:00
Kimdiego2098
f39d5d355c 更新版本 2024-03-13 10:33:15 +08:00
Kimdiego2098
eccc8e0ff0 更新sqldb,删除不需要的转换 2024-03-13 10:25:26 +08:00
Kimdiego2098
dd4d8e775c 更新版本 2024-03-11 16:39:43 +08:00
Kimdiego2098
7a7f857b2f startUp调整注入顺序 2024-03-11 16:39:00 +08:00
Diego2098
10882b7d93 规范代码 2024-03-10 14:29:33 +08:00
Diego2098
e669b81005 发布构建时,默认删除PDB文件 2024-03-10 13:05:25 +08:00
Diego2098
28a81d9539 更新版本 2024-03-10 11:47:32 +08:00
Diego2098
6bf5e4a6b8 修改设备/变量 初始时间为unix 2024-03-10 11:46:05 +08:00
Diego2098
a51eee93f4 更新版本 2024-03-09 16:20:17 +08:00
Diego2098
bece2555c2 自动刷新图标时,启用echarts组件合并模式 2024-03-09 16:13:02 +08:00
Diego2098
d98d405009 更新touchsocket依赖正式版本 2024-03-09 15:19:19 +08:00
Diego2098
8d0881632c 业务设备初始默认状态为成功 2024-03-09 13:37:17 +08:00
Diego2098
e8b81da897 sqldb按选项建表 2024-03-09 13:19:35 +08:00
Diego2098
acf4fbf750 生产环境打印错误sql 2024-03-09 13:16:20 +08:00
Diego2098
b4f1921d33 更新版本 2024-03-09 11:32:26 +08:00
Diego2098
94b4816f53 修复sqldb查询接口错误,增加历史表-变量id字段 2024-03-09 11:29:04 +08:00
Kimdiego2098
b6ddafde3e 更新版本 2024-03-08 17:31:46 +08:00
Kimdiego2098
b01036818f 整理代码 2024-03-08 16:31:33 +08:00
Kimdiego2098
ad7da1a0c3 历史存储插件增加接口,增加历史查询方法 2024-03-08 16:27:45 +08:00
Kimdiego2098
1e0818d9d9 变量导入时,新增部分按行号排序 2024-03-08 16:27:19 +08:00
Kimdiego2098
a4686f01c3 更新touchsocket依赖 2024-03-08 13:22:40 +08:00
Kimdiego2098
84d76f9aab 更新版本 2024-03-07 19:23:05 +08:00
Kimdiego2098
b90bf5eb86 Revert "回退sqlsugar版本(sqldb分表问题)"
This reverts commit fe258f3fe5.
2024-03-07 18:47:04 +08:00
Kimdiego2098
fe258f3fe5 回退sqlsugar版本(sqldb分表问题) 2024-03-07 18:43:37 +08:00
Kimdiego2098
d339494594 更新版本 2024-03-07 15:03:17 +08:00
Kimdiego2098
adfaf13055 更新版本 2024-03-07 12:21:12 +08:00
Kimdiego2098
8abfeb5923 修复 sqldb oracle11 标识符过长 2024-03-07 12:11:20 +08:00
Kimdiego2098
c1a027a771 更新版本 2024-03-06 17:40:21 +08:00
Kimdiego2098
5f3094d79b 恢复误删代码 2024-03-06 12:49:58 +08:00
Kimdiego2098
925b81aca8 更新版本 2024-03-06 12:32:08 +08:00
Kimdiego2098
c0c8437966 OpcDa添加是否使用服务端时间选项 2024-03-06 12:31:43 +08:00
Kimdiego2098
1d27b2fc4a 表达式运行添加linq扩展方法,长度限制1000 2024-03-06 10:57:11 +08:00
Kimdiego2098
5da43e7808 更新版本 2024-03-05 16:55:12 +08:00
Kimdiego2098
5edbb558ae 更新版本 2024-03-04 13:12:47 +08:00
Kimdiego2098
7347cc1df2 json解析布尔值时,特殊忽略大小写 2024-03-04 12:43:47 +08:00
Kimdiego2098
20cac11b2a 磁盘使用率逻辑,缓存删除日志修改 2024-03-04 10:59:49 +08:00
Kimdiego2098
75c35c4ff8 更新版本 2024-03-04 00:10:43 +08:00
Diego2098
9d573512d0 更新版本 2024-03-03 23:49:47 +08:00
Diego2098
7921365853 更新版本 2024-03-03 23:03:02 +08:00
Diego2098
43263fd3b9 分离Variable类库 2024-03-03 17:43:37 +08:00
Diego2098
59042a5ead 修改echart背景颜色,去除多余的字体颜色 2024-03-02 13:39:17 +08:00
Kimdiego2098
91b14de807 文件编码覆盖 2024-03-01 18:54:36 +08:00
Kimdiego2098
81fab2be08 更新依赖包 2024-03-01 13:36:20 +08:00
Kimdiego2098
165b742782 更新版本 2024-03-01 13:33:49 +08:00
Kimdiego2098
76fef9c807 优化业务插件缓存逻辑 2024-03-01 13:33:43 +08:00
Kimdiego2098
e69ea0b9dc 更新版本 2024-02-28 17:41:02 +08:00
Kimdiego2098
98d3183f2b 修复sqldb历史表动态分表名称查询失效 2024-02-28 17:40:51 +08:00
Kimdiego2098
a29390a951 更新依赖包 2024-02-28 17:13:42 +08:00
Kimdiego2098
6291ce8617 modbusSlave运行时检查恢复启动 2024-02-28 17:08:31 +08:00
Kimdiego2098
c76b1b50a0 更新版本 2024-02-28 16:12:55 +08:00
Kimdiego2098
cc45e2aec0 更新网关双冗余 2024-02-28 16:12:38 +08:00
Kimdiego2098
17efebb8e8 更新版本 2024-02-28 16:05:50 +08:00
Kimdiego2098
5c94c733ee 整理代码 2024-02-28 16:05:18 +08:00
Kimdiego2098
156b89dd9c 更新双网关冗余 2024-02-28 16:04:04 +08:00
Kimdiego2098
34ba9f67e7 更新双网关冗余,sqldb支持历史表名称更改,更改为按周分表 2024-02-28 15:53:46 +08:00
Kimdiego2098
5ddaa6b872 双网关冗余(未完成) 2024-02-27 17:50:23 +08:00
Kimdiego2098
9043fa7f56 整理 2024-02-27 16:58:01 +08:00
Kimdiego2098
4c8e487dc9 双网关冗余(未完成) 2024-02-27 13:59:12 +08:00
Kimdiego2098
d3b87179aa 双网关冗余(未完成) 2024-02-26 19:49:19 +08:00
Kimdiego2098
2166de8331 修改Windows下UDP连接被重置错误10054代码 2024-02-26 12:57:48 +08:00
Diego2098
f0bc3f001f opcda nuget包不包含symbols 2024-02-25 15:31:48 +08:00
Diego2098
50448e7085 nuget包不需要发布源生成库 2024-02-25 15:11:15 +08:00
Diego2098
cd1d42353e 更新版本 2024-02-25 15:01:06 +08:00
Diego2098
5e588bf737 添加null判断 2024-02-25 14:59:17 +08:00
Kimdiego2098
7ff777d178 更新版本 2024-02-25 14:48:23 +08:00
Kimdiego2098
861621189a 底层变量特性实体支持数组 2024-02-25 14:39:08 +08:00
Diego2098
dcc00e08fd 整理代码 2024-02-24 23:32:51 +08:00
Diego2098
a1b8a47d4b 更新示例 2024-02-24 22:43:49 +08:00
Diego2098
1fd6b5e239 更改动态变量类缓存 2024-02-24 21:45:59 +08:00
Diego2098
f91e45bf44 整理代码 2024-02-24 18:42:45 +08:00
Kimdiego2098
0675a45592 更新版本 2024-02-24 18:23:41 +08:00
Kimdiego2098
0c7c6ae451 s7协议首次CR请求时,判断方式错误 2024-02-24 18:23:10 +08:00
Diego2098
cf089e8c4c 更新版本 2024-02-24 17:19:09 +08:00
Diego2098
90928ac679 更新版本 2024-02-24 17:14:57 +08:00
Diego2098
3bbcf71784 整理代码 2024-02-24 17:12:23 +08:00
Diego2098
222734775d 整理代码 2024-02-24 16:32:47 +08:00
Diego2098
f23ee7a6e0 整理代码 2024-02-24 16:08:37 +08:00
Diego2098
5b075aa6d5 更新底层变量类,添加源代码生成方法 2024-02-24 14:39:53 +08:00
Kimdiego2098
80cd6b693e 发行版本5.0.1.0 2024-02-23 13:09:25 +08:00
Kimdiego2098
04721a12b1 发行版本5.0.1.0 2024-02-23 13:03:53 +08:00
Kimdiego2098
64e22c0e46 取消默认PublishReadyToRun 2024-02-23 13:03:46 +08:00
Kimdiego2098
d5a70c5b08 Revert "发行版本5.0.1"
This reverts commit eaac7b6bcf.
2024-02-23 13:03:12 +08:00
Kimdiego2098
eaac7b6bcf 发行版本5.0.1 2024-02-23 12:58:25 +08:00
Kimdiego2098
b062a491cd 调整代码 2024-02-23 12:36:28 +08:00
Kimdiego2098
1e868517bb 默认启用PublishReadyToRun 2024-02-23 11:02:56 +08:00
Kimdiego2098
7b2a93a2d7 更新版本 2024-02-22 18:13:10 +08:00
Kimdiego2098
f57f0447c6 完善modbus写入保持寄存器某一位,比如400001.0的功能 2024-02-22 18:12:58 +08:00
Kimdiego2098
7126ff881e 更新版本 2024-02-22 17:52:32 +08:00
Kimdiego2098
e28da4b165 modbusTcp返回错误码时没有验证头部id 2024-02-22 17:52:20 +08:00
Kimdiego2098
92d9b91f7c 更新依赖包 2024-02-22 17:31:27 +08:00
Kimdiego2098
149c4a30c0 写入表达式支持json数组 2024-02-21 14:50:21 +08:00
Kimdiego2098
84e62062ec 表达式转换支持Json 2024-02-21 13:35:41 +08:00
Kimdiego2098
dc1fb74850 更新readme 2024-02-21 11:33:00 +08:00
Kimdiego2098
00c6010789 更新readme 2024-02-21 11:07:00 +08:00
Kimdiego2098
5d35c058e0 更新readme 2024-02-21 11:05:54 +08:00
Kimdiego2098
1522a521f6 更新readme 2024-02-21 10:59:53 +08:00
Kimdiego2098
6e11b885f9 同步代码 2024-02-21 09:38:34 +08:00
Kimdiego2098
442ae6e0e8 插件初始化失败时设置线程超时 2024-02-20 12:05:02 +08:00
Kimdiego2098
6b49e83464 opcua重连周期改为10s 2024-02-19 17:09:14 +08:00
Kimdiego2098
f1ecf13fe1 更新版本 2024-02-19 14:31:25 +08:00
Kimdiego2098
83d1c8582b 整理signalR代码 2024-02-19 14:31:14 +08:00
Kimdiego2098
179f6cd454 程序启动时清除在线用户统计 2024-02-19 13:42:28 +08:00
Kimdiego2098
91b1474ff0 更新文档 2024-02-19 09:44:55 +08:00
Kimdiego2098
15aabc88a1 更新文档 2024-02-18 18:26:46 +08:00
Kimdiego2098
afc0d3017d 修复等待池超限后没有恢复初始值的问题 2024-02-18 17:43:44 +08:00
Kimdiego2098
9e0b1dc8aa 更新文档 2024-02-18 16:05:18 +08:00
Kimdiego2098
55b482fd26 更新版本 2024-02-18 15:23:32 +08:00
Kimdiego2098
4f9c9a6566 发送方法更改为异步 2024-02-18 15:21:57 +08:00
Kimdiego2098
4725120ee9 添加历史cpu曲线过期时间 2024-02-18 15:04:37 +08:00
Kimdiego2098
a288f50fbb 演示环境默认填写帐户密码 2024-02-18 14:19:37 +08:00
Kimdiego2098
09cf2560a4 更新版本 2024-02-18 12:13:03 +08:00
Kimdiego2098
16353de7b1 修复LiteDB中的表达式缓存导致的内存泄露 2024-02-18 12:12:25 +08:00
Kimdiego2098
eb5834cb5c 更新版本 2024-02-18 10:00:40 +08:00
Kimdiego2098
3ef5736aed 更新依赖 2024-02-18 09:59:11 +08:00
Kimdiego2098
d2e7b77d16 Demo环境不再允许修改个人密码 2024-02-18 09:58:53 +08:00
Kimdiego2098
8f794bce75 更新文档 2024-02-18 09:35:24 +08:00
Kimdiego2098
c33196a50a 更新版本 2024-02-04 09:12:43 +08:00
Kimdiego2098
6e8b5b431f 更改种子数据解析方法 2024-02-04 09:09:29 +08:00
Kimdiego2098
8ca3ecf17f 更新版本 2024-02-02 15:44:12 +08:00
Kimdiego2098
91f7db59ea 更新依赖包 2024-02-02 15:44:02 +08:00
Kimdiego2098
a0b4501352 更新版本 2024-02-02 15:40:08 +08:00
Kimdiego2098
345047820a 更新依赖 2024-02-02 15:39:54 +08:00
Kimdiego2098
ac3525a953 更新版本 2024-02-02 15:15:32 +08:00
Kimdiego2098
c8c3f5b134 更新构建脚本 2024-02-02 15:14:37 +08:00
Kimdiego2098
51319c0718 mqttClient每次发布都作为遗嘱消息 2024-02-02 14:38:24 +08:00
Kimdiego2098
43399b8b47 mqttClient连接失败时缓存数据 2024-02-02 14:36:49 +08:00
Kimdiego2098
a6596042b7 修复上传业务缓存删除逻辑 2024-02-02 14:26:00 +08:00
Kimdiego2098
23ae85fc9c Revert "修复上传业务缓存删除逻辑"
This reverts commit 2da54862f1.
2024-02-02 14:25:21 +08:00
Kimdiego2098
2da54862f1 修复上传业务缓存删除逻辑 2024-02-02 14:24:49 +08:00
Kimdiego2098
f272fb0559 更新版本 2024-02-02 13:00:04 +08:00
Kimdiego2098
bd04e33586 底层通道设备列表更换为线程安全列表 2024-02-02 12:29:19 +08:00
Kimdiego2098
b09b9752ca mqttServer修复客户端连接时,发送初始数据分组错误 2024-02-02 12:16:43 +08:00
Kimdiego2098
a810a48158 更新dockerfile 2024-02-02 08:40:10 +08:00
Kimdiego2098
b4f5792aa8 串口流BeginRead更换为ReadAsync 2024-02-01 16:50:01 +08:00
Kimdiego2098
fdf0330b4f 更新版本 2024-02-01 12:20:11 +08:00
Kimdiego2098
ca73743082 调整服务启动顺序 2024-02-01 12:19:44 +08:00
Kimdiego2098
df0cde2cfd 定长字符串写入时,长度不足也覆盖剩余字节 2024-01-30 17:37:44 +08:00
Kimdiego2098
5a8421e807 更新版本 2024-01-30 14:33:57 +08:00
Kimdiego2098
025ac95d81 修复数据转换无默认构造导致的反序列化错误 2024-01-30 14:27:33 +08:00
Kimdiego2098
71b5824fdc 添加重启事件 2024-01-30 13:52:17 +08:00
Kimdiego2098
1a907c0be7 更新版本 2024-01-30 12:22:43 +08:00
Kimdiego2098
1635cabd32 更新版本 2024-01-30 11:56:58 +08:00
Kimdiego2098
27946a5b0f 调整日志文件路径 2024-01-30 11:56:26 +08:00
Kimdiego2098
e141822fd0 调整sqlsugar 2024-01-30 10:54:35 +08:00
Kimdiego2098
6326828a02 调整依赖 2024-01-30 10:16:35 +08:00
Kimdiego2098
96b5362491 添加modbus的字符串按字反转配置 2024-01-30 10:04:38 +08:00
Kimdiego2098
8ab91a51bc 调整瞬态服务构造 2024-01-30 09:42:15 +08:00
Kimdiego2098
35e7e7af18 更新版本 2024-01-29 18:28:15 +08:00
Kimdiego2098
0e248a7302 更新依赖包 2024-01-29 18:27:58 +08:00
Kimdiego2098
d5ce4d6600 调整代码 2024-01-29 17:55:40 +08:00
Kimdiego2098
2365bb5e87 sqlsugar版本固定5.1.4.122 2024-01-29 16:28:55 +08:00
Kimdiego2098
2230216a7e 调整代码 2024-01-29 14:32:33 +08:00
Kimdiego2098
54f896d25f 调整Task.Delay 2024-01-29 11:28:23 +08:00
Kimdiego2098
e47d239caf 调整种子数据 2024-01-29 09:13:49 +08:00
Kimdiego2098
ac259958d7 更新文档 2024-01-29 08:45:10 +08:00
Diego2098
0505ad88a6 修复mqttRpc写入数组时,字符串解析错误问题 2024-01-27 12:40:48 +08:00
Diego2098
b323de3383 添加属性默认值 2024-01-27 09:57:06 +08:00
Kimdiego2098
c0e023324b 更新文档 2024-01-26 11:51:35 +08:00
Kimdiego2098
495806d5e3 文档添加演示站点 2024-01-26 11:09:13 +08:00
Kimdiego2098
3a9f745a2d 更新Dlt645 nuget包文档 2024-01-26 10:43:19 +08:00
Kimdiego2098
7b15d114a3 适配窗体大小 2024-01-26 10:01:47 +08:00
Kimdiego2098
6ac0f72169 默认开启标签页缓存 2024-01-26 08:52:02 +08:00
Kimdiego2098
ff68030231 添加可空判断方法 2024-01-25 14:02:37 +08:00
Kimdiego2098
d34361b6dd 更新文档 2024-01-25 11:03:46 +08:00
Kimdiego2098
56c6ebe523 修复事务锁异常导致sqlite lock 2024-01-25 11:03:39 +08:00
Kimdiego2098
2c6d2e0eb4 更新文档 2024-01-24 16:56:01 +08:00
Kimdiego2098
8e64196a8f 去除MqttRpc主题的规则限制 2024-01-24 16:51:10 +08:00
Kimdiego2098
926d5faf21 更新文档 2024-01-24 16:15:33 +08:00
Kimdiego2098
18bad2af25 调整MqttRpc提示 2024-01-24 16:15:26 +08:00
Kimdiego2098
6be4dc4aac 更新版本 2024-01-24 15:14:27 +08:00
Kimdiego2098
6398a59dda 修复设备删除后,变量动态属性错误的问题 2024-01-24 15:06:36 +08:00
Kimdiego2098
48158b1db6 更新文档 2024-01-24 14:46:49 +08:00
Kimdiego2098
47fe519e54 更新文档 2024-01-24 14:36:22 +08:00
Kimdiego2098
7e06f19bbc 更新5.0.0.5 2024-01-24 12:19:29 +08:00
Kimdiego2098
0b66c1f0d6 添加using 2024-01-24 11:15:32 +08:00
Kimdiego2098
ff2742ffd8 删除字节转换类的copynew方法 2024-01-24 10:11:10 +08:00
Kimdiego2098
70c2992a5f 调整命名空间 2024-01-24 09:45:13 +08:00
Kimdiego2098
4ac4ee6874 调整命名空间 2024-01-24 08:50:53 +08:00
Kimdiego2098
865164a404 删除多余代码 2024-01-24 08:49:01 +08:00
Diego2098
f9c8069ab2 调整DTU配置,增加心跳回应 2024-01-23 21:32:47 +08:00
Diego2098
2fbf5140e5 调整DTU配置,增加心跳回应 2024-01-23 21:09:57 +08:00
Kimdiego2098
0126f8144a 调整mqtt在线状态判断 2024-01-23 18:06:22 +08:00
Kimdiego2098
71383d7482 调整日志读取策略 2024-01-23 17:23:36 +08:00
Kimdiego2098
4d3bfc5f42 调整封装方法 2024-01-23 15:51:08 +08:00
Kimdiego2098
c173d217de 添加重启后台事件 2024-01-23 08:50:08 +08:00
Kimdiego2098
d2da9a039f 更新5.0.0.4 2024-01-22 23:13:02 +08:00
Kimdiego2098
c915edd458 S7握手失败时直接关闭连接 2024-01-22 23:03:03 +08:00
Kimdiego2098
504948452e 更新TD引用 2024-01-22 22:12:17 +08:00
Kimdiego2098
3daa6c7a54 修复空指针错误 2024-01-22 21:53:59 +08:00
Kimdiego2098
10cd1580a5 调整命名 2024-01-22 21:13:59 +08:00
Kimdiego2098
5b0876e106 修复缓存item没有默认构造函数导致的錯誤 2024-01-22 11:38:16 +08:00
Kimdiego2098
cfcdeaff01 调整常量位置 2024-01-22 11:24:37 +08:00
Kimdiego2098
7c34f233fd 更新文档 2024-01-22 09:50:38 +08:00
Kimdiego2098
686146a7d9 修复导入插件错误 2024-01-22 08:38:48 +08:00
Kimdiego2098
44732d5977 更新5.0.0.3 2024-01-21 22:48:30 +08:00
Kimdiego2098
05c3794cf7 修复属性为可空类型是,excek导入失败的问题 2024-01-21 22:48:04 +08:00
Kimdiego2098
f0431a504a 更新版本5.0.0.2 2024-01-21 21:18:36 +08:00
Kimdiego2098
eccec85ea6 调整解析寄存器地址规则 2024-01-21 21:17:07 +08:00
Kimdiego2098
16ff538804 修复特殊方法执行主体错误 2024-01-21 20:42:20 +08:00
Kimdiego2098
f81e07eb6f 修复特殊方法检测为null的问题 2024-01-21 20:19:44 +08:00
Kimdiego2098
1cbd41ad87 更新文档 2024-01-21 16:50:16 +08:00
Kimdiego2098
d8567b8427 断开连接时 退出 等待数据返回 2024-01-21 16:43:10 +08:00
Kimdiego2098
afe6a1923b 断开连接时 退出 等待数据返回 2024-01-21 16:42:30 +08:00
Kimdiego2098
0f60f4754f 更新文档 2024-01-21 16:42:03 +08:00
Kimdiego2098
7e988d0401 更新文档 2024-01-21 16:08:23 +08:00
Kimdiego2098
d85813c229 更新文档 2024-01-21 16:07:56 +08:00
Kimdiego2098
12eb56809d 更新5.0 2024-01-21 15:38:31 +08:00
Kimdiego2098
d792172779 更新5.0 2024-01-21 15:38:28 +08:00
Kimdiego2098
011562ae73 修复变量 多字节解析顺序配置不生效 2024-01-12 09:50:41 +08:00
Kimdiego2098
71c4e36933 service中的客户端交互没有日志输出;modbusDTU添加定时清理 2024-01-10 12:11:55 +08:00
Kimdiego2098
6261982f6c OPCUA订阅null值时不判定离线 2023-12-29 16:53:05 +08:00
Kimdiego2098
4ac01e0ed0 修复插件外部上传,无法同步识别流的问题 2023-12-29 16:08:41 +08:00
Kimdiego2098
2dfe07f13e opc变量值为null时 不应影响变量质量戳状态 2023-12-27 22:27:13 +08:00
Kimdiego2098
7f4e4017ce 更新版本号 2023-12-12 22:42:56 +08:00
Kimdiego2098
635970f37b 更新版本号 2023-12-12 22:42:34 +08:00
Kimdiego2098
106e740220 修复导出变量偶发丢失上传属性的问题 2023-12-12 22:41:10 +08:00
Kimdiego2098
3e6420ba6f 整理上传插件代码 2023-12-12 22:40:42 +08:00
Diego2098
79be8010d5 Merge pull request #2 from allrightsreserved/master
分离数据库 和上传插件的父类
2023-12-12 21:09:44 +08:00
BadMan
0b6e679f3b 分离数据库 和上传插件的父类 2023-12-12 12:48:28 +08:00
Kimdiego2098
97c43ad2b9 更新依赖包 2023-12-11 21:19:51 +08:00
Kimdiego2098
cbf978745c 修复历史报警数据转储插件错误 2023-12-11 13:36:15 +08:00
Kimdiego2098
63dceada90 dateTimeExtension更改 2023-12-08 17:37:12 +08:00
Kimdiego2098
366aade8b4 整理代码文件 2023-12-08 17:08:57 +08:00
Kimdiego2098
aeb505e3d9 整理代码文件 2023-12-08 16:43:26 +08:00
Kimdiego2098
f9482e4773 Sqlsugar版本更新;
如果出现linux系统中报错sqlite错误,尝试安装依赖
# Debian/Ubuntu
apt-get install libsqlite3-mod-spatialite

# macOS
brew install libspatialite
2023-12-08 16:43:05 +08:00
Kimdiego2098
57dfc22ff7 更新版本号 2023-12-08 10:20:54 +08:00
Kimdiego2098
adc489b6ed 回退sqlsugar版本 2023-12-07 15:12:47 +08:00
Kimdiego2098
0623684315 nuget安装sqlite8.0.0 2023-12-07 14:34:14 +08:00
Kimdiego2098
68afccd859 修复OPC节点空间浏览窗口退出时报错的问题 2023-12-07 14:21:24 +08:00
Kimdiego2098
99eef8fb28 更新依赖包 2023-12-06 19:14:42 +08:00
Kimdiego2098
47e7685d39 串口代码整理 2023-12-06 18:54:33 +08:00
Kimdiego2098
b6ea596ade 整理代码 2023-12-06 18:35:52 +08:00
Kimdiego2098
44d60b469b 同步ts 2023-12-06 15:48:55 +08:00
Kimdiego2098
51087408df 同步ts 2023-12-06 15:16:54 +08:00
Kimdiego2098
96226d9e6e 同步ts 2023-12-06 14:56:12 +08:00
Kimdiego2098
28f0f62424 同步ts 2023-12-06 11:35:57 +08:00
Kimdiego2098
2e772a8cd4 同步touchsocket 2023-12-06 09:16:00 +08:00
Kimdiego2098
3fd192f0cf 变量表达式编辑 改为 多行文本框 2023-12-06 07:42:07 +08:00
Kimdiego2098
d16ae81961 更新demo;更新kafka 生成事件; 2023-12-04 20:28:36 +08:00
Kimdiego2098
211a8e093e 更新版本号 2023-12-01 21:23:51 +08:00
Kimdiego2098
84010a51d6 更改方法参数原;现由,分割 2023-12-01 21:22:27 +08:00
Kimdiego2098
e9700ea19b 更新依赖包 2023-12-01 19:55:17 +08:00
Kimdiego2098
e81ec68072 添加解决方案项 2023-11-30 17:44:26 +08:00
Kimdiego2098
6096e97708 modbusDtu更名 2023-11-30 10:47:37 +08:00
Kimdiego2098
6f302b66b4 添加ModbusRtu格式的DTU驱动 2023-11-30 10:16:26 +08:00
Kimdiego2098
b6e41890f7 同步TouchSocket 2023-11-30 10:16:20 +08:00
Kimdiego2098
be5332a048 添加离线后恢复间隔时间选项,添加重试次数选项 2023-11-29 20:47:23 +08:00
Kimdiego2098
4d72aeb0cd 修复种子数据带转义字符串时错误解析的问题 2023-11-29 19:04:56 +08:00
Kimdiego2098
c7c3c35100 补充git漏掉的props文件 2023-11-29 13:37:52 +08:00
Kimdiego2098
2f0df3c552 修复aop拦截不生效的问题,更新版本号,整理props文件 2023-11-29 12:43:05 +08:00
Kimdiego2098
e6effcd921 更新依赖包 2023-11-28 22:06:43 +08:00
Kimdiego2098
cd462b9523 修正导出设备表的sheet名称 2023-11-28 09:30:47 +08:00
Kimdiego2098
7e2e17d38b 整理部分底层代码 2023-11-27 16:17:12 +08:00
Kimdiego2098
665d616a06 整理部分项目项 2023-11-27 11:11:15 +08:00
Kimdiego2098
ced90f5bb9 更新版本号 2023-11-24 14:48:53 +08:00
Kimdiego2098
ca0ddb6cb4 10功能码写入时 修改需判断的crc长度 2023-11-24 14:48:28 +08:00
Kimdiego2098
3d733813e1 修复 modbusTcpDtu 初始化 空指针错误 2023-11-24 09:44:47 +08:00
Kimdiego2098
45ddc0b154 OPCUA插件afterStop方法重写时需执行父类方法 2023-11-23 20:51:08 +08:00
Kimdiego2098
87294497f3 调整网关状态页面 2023-11-23 20:49:35 +08:00
Kimdiego2098
5f45f9c0d0 修改内存缓存mapster选项 2023-11-23 15:22:39 +08:00
Kimdiego2098
7f78c06793 添加kafka的SecurityProtocol与SaslMechanism参数说明 2023-11-22 21:29:08 +08:00
Kimdiego2098
8ea5b7eebc 修复上个提交导致的excel导入产生空指针错误 2023-11-22 20:52:58 +08:00
Kimdiego2098
e49cd511af excel导入导出设备表时,去除多余的字段 2023-11-22 16:09:41 +08:00
Kimdiego2098
15c88646df socktClient重载toString 2023-11-22 15:28:04 +08:00
Kimdiego2098
f47919543d 更新版本号 2023-11-22 14:06:52 +08:00
Kimdiego2098
a95291d9cd 代码文件编码更改 2023-11-22 14:02:41 +08:00
Kimdiego2098
033deb3d29 修复变量上传属性在编辑页面不显示的问题 2023-11-22 13:35:44 +08:00
Kimdiego2098
923994c1f4 修复变量上传属性在编辑页面不显示的问题 2023-11-22 13:30:42 +08:00
Kimdiego2098
3d45b839b4 去除不存在的菜单 2023-11-21 18:19:14 +08:00
Kimdiego2098
55d1efa212 调整循环延时时间限值 2023-11-21 16:27:11 +08:00
Kimdiego2098
21d794a0e5 调试mqtt依赖 2023-11-21 15:07:07 +08:00
Kimdiego2098
614022a78c 去除上传间隔1s限制 2023-11-21 11:46:33 +08:00
Kimdiego2098
c00688e23a 整理代码 2023-11-21 11:41:44 +08:00
Kimdiego2098
5c69917d19 更新依赖 2023-11-21 08:44:47 +08:00
Kimdiego2098
6a5eb75b6c 更新版本号 2023-11-20 23:05:12 +08:00
Kimdiego2098
727c55eaa2 去除treeview 2023-11-20 23:04:54 +08:00
Kimdiego2098
9b03173ec5 去除treeview显示 2023-11-20 22:53:34 +08:00
Kimdiego2098
ab95855d6d 更新版本号 2023-11-20 22:47:18 +08:00
Kimdiego2098
bb84594c6b mqttserver/client插件支持websocket通道,直接对接前端 2023-11-20 22:42:08 +08:00
Kimdiego2098
97392c76b1 mqttserver/client插件支持websocket通道,直接对接前端 2023-11-20 22:33:26 +08:00
Kimdiego2098
53aec2b306 modbusTcpServer最大连接数设为3w 2023-11-20 19:46:07 +08:00
Kimdiego2098
a0a381dc63 更新依赖 2023-11-20 17:35:42 +08:00
Kimdiego2098
4fa95edeec 添加admin-解决方案 2023-11-20 15:38:33 +08:00
Kimdiego2098
b944f1d70e 修复设备curd服务aop失效的问题 2023-11-19 23:30:11 +08:00
Kimdiego2098
0f1a5d0085 更新版本号 2023-11-19 22:32:53 +08:00
Kimdiego2098
e7e10222e7 modbus server 添加是否立即写入内存的选项 2023-11-19 22:32:13 +08:00
Kimdiego2098
87c4fda588 默认开启多标签 2023-11-19 22:31:47 +08:00
Kimdiego2098
0ff820de6f 添加历史报警插件 2023-11-19 22:19:05 +08:00
Kimdiego2098
0dcf55e6d9 修复4.0代码 s7协议未设置适配器导致初始化/读写失败的问题 2023-11-19 21:49:32 +08:00
Kimdiego2098
a69842c910 增加上传插件 缓存基类 2023-11-19 15:20:01 +08:00
Kimdiego2098
318f635e4d 获取插件继承属性时,去除不重写特性的属性 2023-11-19 14:15:58 +08:00
Kimdiego2098
abf0d72316 整理文件 2023-11-18 23:04:51 +08:00
Kimdiego2098
5cd89c8844 整理文件 2023-11-18 23:04:25 +08:00
Kimdiego2098
501c1af38c 整理文件 2023-11-18 23:03:24 +08:00
Kimdiego2098
8526e130d9 整理文件 2023-11-18 23:03:02 +08:00
Kimdiego2098
76fd08eade 整理文件 2023-11-18 23:02:28 +08:00
Kimdiego2098
bfe48ae9d2 整理文件 2023-11-18 23:01:56 +08:00
Kimdiego2098
8547cdba7c 去除不必要的文件 2023-11-18 22:52:26 +08:00
Kimdiego2098
00d0cd631d 去除不必要的文件 2023-11-18 22:50:03 +08:00
Kimdiego2098
04460d13cd 迁移4.0 2023-11-18 22:45:24 +08:00
Kimdiego2098
a17a15e5d7 迁移4.0 2023-11-18 22:43:36 +08:00
Kimdiego2098
bfe2465658 添加停止线程等待时间 2023-11-16 22:32:22 +08:00
Kimdiego2098
4568987785 s7握手失败后,手动关闭连接 2023-11-11 10:26:05 +08:00
Kimdiego2098
c0e5a1419d fix:修复线程阻塞检测触发重启时,后台变量列表不再刷新的问题! 2023-11-10 09:00:50 +08:00
Kimdiego2098
23ac7ab748 历史数据上传成功后,才上传缓存数据 2023-11-09 18:55:56 +08:00
Kimdiego2098
5622dc74a8 update 2023-11-08 16:19:46 +08:00
Kimdiego2098
528986f4f0 发布3.0.1版本 2023-11-03 11:32:13 +08:00
Kimdiego2098
e6b8ff3f91 update touchsocket 2023-11-03 11:27:12 +08:00
Kimdiego2098
3fc3c5296f update touchsocket 2023-11-03 11:19:26 +08:00
Kimdiego2098
f4f2a14a31 不存在插件时,报错内容优化 2023-11-01 14:51:08 +08:00
Kimdiego2098
fa3f464cb6 update webapiClient 2023-11-01 14:21:53 +08:00
Kimdiego2098
bed20538ae 调整Timeout属性为int数据类型 2023-10-31 23:49:46 +08:00
Kimdiego2098
3da461c6e6 更新发布版3.0.0.28 2023-10-31 17:47:07 +08:00
Kimdiego2098
9c73e8452a 更新OPCUAClient,订阅模式适配 分组 2023-10-31 10:55:50 +08:00
Kimdiego2098
750dab69d3 update 2023-10-31 00:24:00 +08:00
Kimdiego2098
702d0da47c tcpservice停止时执行shutdown方法,修复demo发布不显示页面的问题 2023-10-30 21:31:30 +08:00
Kimdiego2098
3a955b1e53 添加部分Pro内容 2023-10-29 19:39:38 +08:00
Kimdiego2098
d408bd93e8 添加部分Pro内容 2023-10-29 19:34:17 +08:00
Kimdiego2098
63fd9eb1de 更新文档 2023-10-28 22:06:58 +08:00
Kimdiego2098
4718ab6ddf 发布3.0.0.27版本;
优化设备线程启停逻辑
添加winform(blazor) demo
部分页面显示内容优化
2023-10-28 22:03:52 +08:00
Kimdiego2098
affd4b3a26 发布3.0.0.27版本;
优化设备线程启停逻辑
添加winform(blazor) demo
部分页面显示内容优化
2023-10-28 22:00:35 +08:00
Kimdiego2098
6a660dbcda 优化设备线程启停逻辑 2023-10-28 21:58:09 +08:00
Kimdiego2098
5ff3af8b48 添加部分Pro内容 2023-10-28 21:21:03 +08:00
Kimdiego2098
9d49070f93 添加winform(blazor) demo 2023-10-28 15:20:12 +08:00
Kimdiego2098
5b3994a1dd 调整pro类库 2023-10-28 10:54:26 +08:00
Diego2098
bb1e62c580 设备状态页面显示优化 2023-10-27 20:19:26 +08:00
Diego2098
29cc776908 状态显示:已退出自动更新 2023-10-27 20:18:57 +08:00
Kimdiego2098
d2ef60b2ec 报文显示限长500 2023-10-27 14:53:19 +08:00
Kimdiego2098
41ea496d41 tcpserver 报文输出 添加 ip端口 提示 2023-10-27 14:41:35 +08:00
Kimdiego2098
c69bb38929 update the tcpserver class and add log output for start and stop 2023-10-27 14:24:26 +08:00
Kimdiego2098
23b3f8494e 优化线程上下文转换 2023-10-26 19:16:24 +08:00
Kimdiego2098
0ff94eec1b 添加ConfigureAwait 2023-10-26 18:06:33 +08:00
Kimdiego2098
f67a638565 优化设备导出逻辑 2023-10-26 15:15:43 +08:00
Kimdiego2098
778cf71c61 优化设备导出逻辑 2023-10-26 15:10:26 +08:00
Kimdiego2098
e2da083b48 3.0.0.25 2023-10-26 13:21:40 +08:00
Kimdiego2098
dcc48c0d4b Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-10-26 13:20:54 +08:00
Kimdiego2098
2446b4a591 3.0.0.25 2023-10-26 13:20:31 +08:00
Kimdiego2098
a973d633c8 update 2023-10-26 13:19:18 +08:00
Kimdiego2098
c3b11e6e0f s7添加错误返回码提示,组包处理 2023-10-26 13:05:06 +08:00
Kimdiego2098
44bec2d99e 增加硬件信息 相关json配置 2023-10-26 10:54:48 +08:00
Kimdiego2098
0d59d0a3f6 更新nuget依赖 2023-10-26 09:37:01 +08:00
Kimdiego2098
ddc8372b09 硬件信息页面添加刷新条件 2023-10-26 09:20:25 +08:00
Kimdiego2098
ea7325f4e0 更新文档 2023-10-25 00:53:27 +08:00
Kimdiego2098
6048f95415 update touchsocket 2023-10-25 00:53:17 +08:00
Kimdiego2098
5682705b8d <Version>3.0.0.24</Version> 2023-10-24 23:48:20 +08:00
Kimdiego2098
6c3b82607d 更改S7协议 设备属性,注意删除了DstTSAP,改为较直观的 机架号/槽位号 2023-10-24 23:47:35 +08:00
Kimdiego2098
486c9f4ebf 添加属性识别 16进制写入 2023-10-24 23:46:50 +08:00
Kimdiego2098
7c8adebf2d 添加nuget依赖包 2023-10-24 20:50:39 +08:00
Kimdiego2098
ce98bb0dc1 更新nuget包 2023-10-24 00:37:46 +08:00
Kimdiego2098
60b49a4296 调整解决方案文件夹 2023-10-24 00:13:03 +08:00
Kimdiego2098
5d0a2ffae0 暂时屏蔽mqttserver 遗留消息错误 2023-10-23 20:51:11 +08:00
Kimdiego2098
bbcf7c722a 调整编码 2023-10-23 20:47:00 +08:00
Kimdiego2098
66574eec6d 调整mqttlog 2023-10-23 20:46:17 +08:00
Kimdiego2098
305df3a42c 调整mqttlog 2023-10-23 20:43:58 +08:00
Kimdiego2098
323c6f4270 添加部分兼容方法 2023-10-22 02:42:16 +08:00
Kimdiego2098
c056b2b14c 添加部分兼容方法 2023-10-22 02:26:18 +08:00
Kimdiego2098
02ebb07fd8 update touchsocket 2023-10-22 02:26:04 +08:00
Kimdiego2098
59db0890c3 调整代码格式 2023-10-21 19:15:26 +08:00
Kimdiego2098
3ea0d9ed3a update touchsocket 2023-10-21 19:08:21 +08:00
Kimdiego2098
0371d11dd5 调整代码格式 2023-10-21 19:03:15 +08:00
Kimdiego2098
12f1ebaee9 调整代码格式 2023-10-21 19:02:58 +08:00
Kimdiego2098
5202cc22d1 3.0.0.23 2023-10-20 21:38:22 +08:00
Kimdiego2098
07a34bdcbf 优化SQLDB实时表模式,插入/更新 2023-10-20 21:38:07 +08:00
Kimdiego2098
27806da4be sqlsugar提示默认中文 2023-10-20 21:37:42 +08:00
Kimdiego2098
a15dd1a3ce update touchsocket 2023-10-20 21:03:29 +08:00
Kimdiego2098
6cc7451c7c 优化 ModbusServer 内存占用 2023-10-20 01:53:48 +08:00
Kimdiego2098
652aeee782 3.0.0.21 2023-10-20 01:19:18 +08:00
Kimdiego2098
8e1e887b8f 优化OPCUAServer,取消注册,提供多url写入 2023-10-20 01:19:05 +08:00
Kimdiego2098
6601a2de64 更新赞助名单 2023-10-19 21:15:35 +08:00
Kimdiego2098
75a42ffc32 更新文档 2023-10-19 20:36:28 +08:00
Kimdiego2098
8a80a52f5f 更新版本:3.0.0.20 2023-10-19 20:27:31 +08:00
Kimdiego2098
b373a434ba 优化modbusServer内存管理 2023-10-19 20:24:39 +08:00
Kimdiego2098
cd78fdafe6 update touchsocket 2023-10-19 20:23:43 +08:00
Kimdiego2098
7a1b4c6db7 update toucksocket 2023-10-18 21:51:49 +08:00
Kimdiego2098
f2c7664033 更新文档 2023-10-18 20:42:10 +08:00
Kimdiego2098
12b295f067 发布驱动包 2023-10-18 18:04:37 +08:00
Diego2098
3ee46da40f !12 【轻量级 PR】:修正心跳事件中的参数
Merge pull request !12 from youthalan/N/A
2023-10-18 06:59:17 +00:00
youthalan
beadaa7212 修正心跳事件中的参数
Signed-off-by: youthalan <youthalan@126.com>
2023-10-18 06:58:03 +00:00
Kimdiego2098
16ef09426f 更新版本号 2023-10-18 13:13:03 +08:00
Kimdiego2098
b8c1f1f5a9 初始化 采集/上传线程时 直接返回线程控制 2023-10-18 13:11:59 +08:00
Kimdiego2098
e027b5cbd6 更新OPCUAClient类库 2023-10-18 13:09:25 +08:00
Kimdiego2098
bf1bd73ad1 更新OPCUAClient类库 2023-10-18 12:45:26 +08:00
Kimdiego2098
86fc95119a 更新OPCUAClient类库 2023-10-18 12:44:58 +08:00
Kimdiego2098
b3a76ea17b 更新版本号与nuget发布 2023-10-18 12:39:42 +08:00
Kimdiego2098
bababd9d53 更新OPCUAClient类库 2023-10-18 12:38:20 +08:00
Diego2098
8cd5180531 !11 补充OPCClient类库事件的缺失文件
Merge pull request !11 from youthalan/N/A
2023-10-18 04:34:34 +00:00
youthalan
f1ccbade8c 补充OPCClient类库事件的缺失文件
Signed-off-by: youthalan <youthalan@126.com>
2023-10-18 04:32:39 +00:00
Diego2098
a66f4b0417 !10 添加连接或断开事件
Merge pull request !10 from youthalan/N/A
2023-10-18 04:20:22 +00:00
youthalan
ff495b2261 修改OPCUAClient类添加连接或断开事件,修改注入时不需要带参数
Signed-off-by: youthalan <youthalan@126.com>
2023-10-18 03:48:05 +00:00
Kimdiego2098
90e5824212 update 3.0.0.16 2023-10-18 00:38:36 +08:00
Kimdiego2098
3d64021062 opcuaClient浏览空间 添加是否显示子变量的选项 2023-10-18 00:36:44 +08:00
Kimdiego2098
fb8ed7428d 更改日志输出内容 2023-10-18 00:15:07 +08:00
Kimdiego2098
bdc273c10a update 3.0.0.15 2023-10-18 00:07:24 +08:00
Kimdiego2098
2d96cffdc7 增加不支持单文件发布的说明 2023-10-17 23:47:24 +08:00
Kimdiego2098
4356fccbcd update tdengineDB plugin 2023-10-17 23:43:48 +08:00
Kimdiego2098
a169fd4ce7 update touchsocket 2023-10-17 23:12:19 +08:00
Kimdiego2098
dcd418139e TD时序库插件,创建时间更改为主键 2023-10-17 23:08:09 +08:00
Kimdiego2098
0cac2062d3 update touchsocket 2023-10-17 23:06:21 +08:00
Kimdiego2098
854c5d4ade 更新nuget包 2023-10-17 21:00:50 +08:00
Kimdiego2098
0f96c6ec84 update SQLDB 2023-10-16 20:50:10 +08:00
Kimdiego2098
b219bd66c1 update touchsocket and other 2023-10-16 20:36:51 +08:00
Kimdiego2098
cb52f2c0b3 3.0.0.13 2023-10-16 17:44:09 +08:00
Kimdiego2098
d3273e03ef 增加关系库存储插件; 2023-10-16 17:40:17 +08:00
Kimdiego2098
afbfd963f3 增加时序库存储插件; 2023-10-16 17:40:13 +08:00
Kimdiego2098
2cd101c5f3 更新pro用户列表 2023-10-16 17:39:14 +08:00
Kimdiego2098
b10bc24dee 3.0.0.12 2023-10-16 08:47:39 +08:00
Kimdiego2098
51a23df861 opcuaclient添加是否加载服务端数据类型的选项 2023-10-16 08:46:46 +08:00
Kimdiego2098
03a0a9dad9 fix:tcpservice dispose err 2023-10-16 08:46:32 +08:00
Diego2098
362c0affbe !9 增加可选择安全订阅
Merge pull request !9 from youthalan/N/A
2023-10-16 00:33:19 +00:00
youthalan
d5b523479f 增加可选择安全订阅,以加快订阅速度
Signed-off-by: youthalan <youthalan@126.com>
2023-10-16 00:26:59 +00:00
Kimdiego2098
7719b8f6d7 更新3.0.0.11 2023-10-15 20:26:18 +08:00
Diego2098
3656c0d524 读取数据类型方法改为批量 2023-10-15 20:21:23 +08:00
Kimdiego2098
8b9e0dd6ea 同步Pro版本 2023-10-13 20:14:35 +08:00
Kimdiego2098
b3921b1037 update touchsocket 2023-10-13 19:16:12 +08:00
Kimdiego2098
d7d96e5dbf update nuget 2023-10-13 16:14:42 +08:00
Kimdiego2098
3934395b7b update 3.0.0.7 2023-10-13 11:54:27 +08:00
Kimdiego2098
04fbe9a529 添加三菱mc 3e帧二进制通讯协议文档 2023-10-13 11:51:51 +08:00
Kimdiego2098
badd6dd9a2 update demo 2023-10-12 18:52:44 +08:00
Kimdiego2098
059082456d 参数名称修改 2023-10-12 14:57:58 +08:00
Kimdiego2098
405b68e22f fix:mqtt保留消息未更新/更新错误 2023-10-12 14:57:36 +08:00
Kimdiego2098
c90bf6692c 3.0.0.6 2023-10-11 16:35:10 +08:00
Kimdiego2098
b5ea5d0cc5 update nuget 2023-10-11 16:28:18 +08:00
Kimdiego2098
243617a1e1 调整代码执行顺序 2023-10-11 16:19:34 +08:00
Kimdiego2098
9e703edd59 update ManageGateway 2023-10-11 10:59:33 +08:00
Kimdiego2098
d6c2cf2810 update ManageGateway 2023-10-11 10:41:09 +08:00
Kimdiego2098
ae7811acfa update 3.0.0.5 2023-10-10 21:09:34 +08:00
Kimdiego2098
e55731c099 fix:modbusRtu写入返回报文缓存逻辑修复 2023-10-10 21:08:42 +08:00
Kimdiego2098
9df5c74da4 update touchsocket 2023-10-10 20:03:40 +08:00
Kimdiego2098
8b75f9f785 update touchsocket 2023-10-10 20:02:15 +08:00
Kimdiego2098
bf12428cf4 fix:signalR razor dispose接口 2023-10-09 18:11:23 +08:00
Kimdiego2098
b551df978b update uaparser 2023-10-09 10:56:22 +08:00
Kimdiego2098
c91d85d2f0 添加MqttRpcDemo 2023-10-07 12:04:17 +08:00
Kimdiego2098
965237fa1f 添加清理日志任务配置参数 2023-10-06 18:28:06 +08:00
Kimdiego2098
24cd9afc06 update 3.0.0.2 2023-10-05 15:32:50 +08:00
Diego2098
602fdefebd update Directory.Build.props 2023-10-05 15:21:51 +08:00
Kimdiego2098
7e7818aa17 修复重启共享通道中的单个设备时,导致通道内其他设备变量异常 2023-10-05 00:34:12 +08:00
Kimdiego2098
27a6023a6a update opcuaclient 2023-10-04 17:12:47 +08:00
Kimdiego2098
3861879900 update opcuaclient 2023-10-04 16:59:15 +08:00
Kimdiego2098
807eeb8351 update nuget 2023-10-04 02:04:09 +08:00
Kimdiego2098
045fa53d58 update 3.0.0.1 2023-10-04 01:42:27 +08:00
Kimdiego2098
69d405ece7 实时报警列表线程同步 2023-10-04 01:27:03 +08:00
Kimdiego2098
d3dc4d0c5b modbusRtu 适配器 过滤干扰头部数据 2023-10-04 01:26:44 +08:00
Kimdiego2098
7beba1188e 更新种子数据 2023-10-04 01:24:34 +08:00
Kimdiego2098
9779ebe12c update windowsService bat 2023-10-03 19:11:42 +08:00
Kimdiego2098
f72cfaa093 update demo 2023-10-03 18:54:01 +08:00
Kimdiego2098
cf8ccafb4a rpc调用提示优化 2023-10-03 18:20:39 +08:00
Kimdiego2098
7fe281b0b8 fix:rpc 特殊方法分类错误 2023-10-03 17:05:49 +08:00
Kimdiego2098
5f70e9574f update demo 2023-10-02 22:37:50 +08:00
Kimdiego2098
4be51923ba update driverDebugPage 2023-10-02 18:34:55 +08:00
Kimdiego2098
a72c78f4a4 update opcuaClient 2023-10-02 18:30:58 +08:00
Diego2098
b4d32a6de1 add s7 wstring addressSign 2023-10-01 16:54:42 +08:00
Diego2098
8a6b2d5daa add s7 wstring addressSign 2023-10-01 16:49:07 +08:00
Diego2098
bebadeef14 更新demo 2023-10-01 13:33:25 +08:00
Kimdiego2098
3551be67f0 update demo csproj 2023-10-01 00:33:33 +08:00
Kimdiego2098
1103950b25 add EncodingMapper 2023-10-01 00:25:04 +08:00
Kimdiego2098
9d06e01cec 更新文档 2023-09-30 23:28:50 +08:00
Kimdiego2098
24be946b7e 默认不启用远程更新 2023-09-30 23:23:44 +08:00
Kimdiego2098
f56d2fc60f 更新readme 2023-09-30 23:09:48 +08:00
Kimdiego2098
9f8356f409 同步3.0.0版本代码 2023-09-30 23:05:53 +08:00
Kimdiego2098
8e6345d938 更新文档 2023-09-26 20:03:58 +08:00
Kimdiego2098
0eac78bd1c 2.1.0.15 2023-09-20 11:50:06 +08:00
Kimdiego2098
21db2502d0 2.1.0.15 2023-09-20 11:47:10 +08:00
Kimdiego2098
38c3492123 添加kafka/mq/iotsharp的间隔上传 2023-09-20 11:46:17 +08:00
Diego2098
6376bff476 fix:上传设备选择驱动时没有正确刷新 2023-09-18 00:10:02 +08:00
Kimdiego2098
38495a3ebc 2.1.0.14 2023-09-15 14:02:15 +08:00
Kimdiego2098
cf00897be2 ExpressionEvaluator改为多实例 2023-09-15 14:01:54 +08:00
Kimdiego2098
da640f24ec 2.1.0.13 2023-09-15 13:23:59 +08:00
Kimdiego2098
ed6a777c42 add dispose() 2023-09-15 13:23:39 +08:00
Kimdiego2098
81af4485d3 2.1.0.12 2023-09-15 13:20:29 +08:00
Kimdiego2098
94d8f0237d 更新多个依赖包版本 2023-09-15 13:19:04 +08:00
Kimdiego2098
c5e579dd38 修复因重复注册cancellationToken.Register导致的内存暴涨! 2023-09-15 13:17:36 +08:00
Kimdiego2098
7865e76ee2 CancellationToken代替CancellationTokenSource传入 2023-09-15 13:16:56 +08:00
Kimdiego2098
4d37212cc0 2.1.0.11 2023-09-11 09:35:24 +08:00
Kimdiego2098
9ca43f0bb4 feat:ManageGatewayWorker part 2023-09-11 09:31:26 +08:00
Kimdiego2098
fe8d262175 feat:ManageGatewayWorker part 2023-09-11 09:09:48 +08:00
Kimdiego2098
493d6e7165 feat:ManageGatewayWorker part 2023-09-11 09:09:03 +08:00
Kimdiego2098
17b630bcd8 TGAPPInfp更名APPInfo 2023-09-11 08:57:13 +08:00
Kimdiego2098
018c5ad3b4 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-09-11 08:54:01 +08:00
Kimdiego2098
a14b4da977 feat:ManageGatewayWorker part 2023-09-11 08:53:52 +08:00
Diego2098
01b4597cc7 !7 修复无法修改变量值问题
Merge pull request !7 from 如阳如木/master
2023-09-07 10:14:45 +00:00
如阳如木
0b083ccc1c 删除&& LastSetValue?.ToString() != data?.ToString()
Signed-off-by: 如阳如木 <970143933@qq.com>
2023-09-07 08:42:49 +00:00
Kimdiego2098
ca22cb0eae ManageGatewayConfig.json 2023-09-06 17:29:58 +08:00
Kimdiego2098
bcbb8e5f8c fix:_mqttServer null error 2023-09-06 17:27:36 +08:00
Kimdiego2098
bea286cdd4 2.1.0.10 2023-09-06 17:16:28 +08:00
Kimdiego2098
892d2ee8d2 从数据库取原属性 2023-09-06 17:14:24 +08:00
Kimdiego2098
7440608c14 更改变量 最近一次值 为 上次值 2023-09-06 16:44:58 +08:00
Kimdiego2098
6246f0295b 更改 变量最近一次值 为 上次值 2023-09-06 16:44:42 +08:00
Kimdiego2098
53c39d9b43 2.1.0.9 2023-09-06 16:30:50 +08:00
Kimdiego2098
9a50b60031 fix:串口断连/拔出/断电等情况,重新连接 2023-09-06 16:29:48 +08:00
Kimdiego2098
fd74527320 feat:ManageGatewayWorker part 2023-09-06 16:15:38 +08:00
Kimdiego2098
f91fb522ac feat:ManageGatewayWorker part 2023-09-06 16:10:29 +08:00
Kimdiego2098
7019c02b18 feat:ManageGatewayWorker part 2023-09-05 23:59:18 +08:00
Kimdiego2098
94f8422b9b feat:ManageGatewayWorker part 2023-09-05 23:37:02 +08:00
Kimdiego2098
b25c01567a feat:ManageGatewayWorker part 2023-09-05 23:33:02 +08:00
Kimdiego2098
b9329885de 2.1.0.8 2023-09-05 09:19:58 +08:00
Kimdiego2098
ac88c4cff9 fix:PeriodicTimer dispose 2023-09-05 09:17:26 +08:00
Kimdiego2098
9674f2d238 2.1.0.7 2023-09-05 09:06:39 +08:00
Kimdiego2098
38c9ecb6f1 fix:error!the stream dispose 2023-09-05 09:04:34 +08:00
Kimdiego2098
be9e9cdd5a Revert "fix:error!the stearm dispose"
This reverts commit a6d99fe227.
2023-09-05 09:03:49 +08:00
Kimdiego2098
afdaf07446 feat:mqttBroker part 2023-09-05 08:58:49 +08:00
Kimdiego2098
5caaf10225 fix:error!the stearm dispose 2023-09-05 08:57:42 +08:00
Diego2098
daffc3a776 feat:mqttBroker part 2023-09-04 22:34:31 +08:00
Diego2098
34c9748ce5 fix:uploadDeivce复制多个,ID重复问题 2023-09-04 22:11:50 +08:00
Diego2098
f17acbf4d1 刷新后选择行清空 2023-09-04 22:09:26 +08:00
Diego2098
229f56ce2f fix:采集设备线程初始化时更新活跃时间 2023-09-04 20:13:49 +08:00
Diego2098
0847bedc51 fix:特殊情况下无法获取程序集文件修改日期,所以去除 页脚-编译时间显示 2023-09-04 19:49:17 +08:00
Kimdiego2098
9e4546c305 fix:sqlsugar json支持类型改为bigstring 2023-09-04 17:09:38 +08:00
Kimdiego2098
97b01bf26a 更新文档 2023-09-04 15:03:03 +08:00
Kimdiego2098
e7011628d0 恢复Sqlite默认数据库 2023-09-02 19:17:32 +08:00
Kimdiego2098
044ffdecbd fix: page取消注入瞬时服务,改为App.GetService 2023-09-02 19:13:57 +08:00
Kimdiego2098
1a06a3543b feat:mqttBroker part 2023-09-02 13:55:21 +08:00
Kimdiego2098
5fedc0bf1e 更新文档 2023-08-31 09:17:59 +08:00
Kimdiego2098
7a881f867e 更新 变量管理-上传设备筛选功能 2023-08-31 08:58:30 +08:00
Kimdiego2098
dfe73a6cfb 2.1.0.6 2023-08-30 17:19:18 +08:00
Kimdiego2098
45d0fb27ad add windows service create/delete bat 2023-08-30 17:18:35 +08:00
Kimdiego2098
31890af61d update statusPage; 2023-08-30 14:12:50 +08:00
Kimdiego2098
a54b3ecc15 默认检测重连频率为10分钟 2023-08-29 17:56:59 +08:00
Kimdiego2098
c37cd1bd51 2.1.0.5 2023-08-29 17:44:28 +08:00
Kimdiego2098
0e3ee89cbf 添加报文日志入库选项 2023-08-29 17:42:56 +08:00
Kimdiego2098
a049176c14 添加 页脚 编译时间显示 2023-08-29 17:01:46 +08:00
Kimdiego2098
5ef2b0089e 调整导入excel错误提示 2023-08-29 16:45:54 +08:00
Kimdiego2098
1cc4899593 update opcdaclient null error 2023-08-29 15:24:29 +08:00
Kimdiego2098
26d1390be9 update GetBoolValue 2023-08-29 12:40:21 +08:00
Kimdiego2098
dc65584fb3 调整种子文件,增加Pro版本种子文件录入 2023-08-29 09:42:54 +08:00
Kimdiego2098
b3d5a708d5 更新2.1.0.4 2023-08-28 19:31:00 +08:00
Kimdiego2098
904a5d296b 修复串口基类 缓存包 失效错误;完善modbusrtu长度校验 2023-08-28 19:25:22 +08:00
Kimdiego2098
cc82e6a47a 更新touchsocket版本,更新2.1.0.3 2023-08-28 18:12:18 +08:00
Kimdiego2098
a9d02ec854 修复浏览大量节点空间时,BrowseNext方法参数releaseContinuationPoints改为false 2023-08-28 17:44:02 +08:00
Kimdiego2098
6b5a2d3767 修复调试界面-opcuaclient浏览节点展开逻辑错误 2023-08-28 10:51:35 +08:00
Kimdiego2098
10d9060b94 更新小版本2.1.0.2 2023-08-27 17:17:37 +08:00
Kimdiego2098
8441839c01 更新dlt645地址说明 2023-08-27 17:16:59 +08:00
Kimdiego2098
b669f5838f 添加日志查询 时间区间条件 2023-08-27 16:58:45 +08:00
Kimdiego2098
1a942f9ce1 2.1.0.1 2023-08-27 16:31:03 +08:00
Kimdiego2098
ae840758f7 dlt645添加数据标识校验 2023-08-27 16:30:32 +08:00
Kimdiego2098
082c08e5f9 更新dlt645,添加地址/控制码的校验规则 2023-08-27 16:15:51 +08:00
Kimdiego2098
74a43557ab 更新touchsocket 2023-08-27 15:59:57 +08:00
Kimdiego2098
184271789d 更新 Opc.Ua Version="1.4.372.56" 2023-08-27 14:33:24 +08:00
Kimdiego2098
fa61b0cad8 opcda/ua浏览地址空间 初始只加载首层节点 2023-08-27 14:14:47 +08:00
Kimdiego2098
7b197a90d1 opcuaclient浏览地址空间 初始只加载首层节点 2023-08-27 13:06:03 +08:00
Diego2098
62384af2f6 update MqttNetLogger 2023-08-26 21:38:14 +08:00
Diego2098
b466202a1a update MqttNetLogger 2023-08-26 20:40:23 +08:00
Diego2098
7ab38c18d8 添加在线/离线方法参数 2023-08-26 17:18:47 +08:00
Diego2098
39841ee43e 更新opcuaclient 2023-08-26 15:38:22 +08:00
Diego2098
e419800d98 更新opcuaclient,添加checkDomain属性,去除多余代码,更新SelectEndpoint方法 2023-08-26 15:33:03 +08:00
Kimdiego2098
63c99ab69a 更新文档 2023-08-25 19:49:02 +08:00
Kimdiego2098
e2a8fd2279 更新版本2.1.0 2023-08-25 19:45:28 +08:00
Kimdiego2098
bbde520471 更新解决方案 2023-08-25 19:38:47 +08:00
Kimdiego2098
45fb12f98e 更新DLT645文档 2023-08-25 19:33:33 +08:00
Kimdiego2098
4be3dcce50 添加DLT645_2007协议插件 2023-08-25 19:33:08 +08:00
Kimdiego2098
d12a41c769 调整Test位置 2023-08-25 19:32:27 +08:00
Kimdiego2098
ed9a58c9ed 调整非主从协议的状态判断策略;OPCUA去除主动连接 2023-08-25 17:23:00 +08:00
Kimdiego2098
4389cea5a1 crc校验优化 2023-08-22 17:01:10 +08:00
Kimdiego2098
d24854920b OPCUAClient添加是否使用SourceTime的选项 2023-08-22 16:15:34 +08:00
Kimdiego2098
9902443bee 更新文档 2023-08-22 12:21:45 +08:00
Kimdiego2098
8040b2ef16 2.0.9.3 2023-08-22 11:31:36 +08:00
Kimdiego2098
4533680b10 去除mqtt throw an _MqttConnectingFailedException_.报错信息 2023-08-22 11:26:22 +08:00
Kimdiego2098
3b28175135 更新批量写入方法,注意rpc入口参数变化,mqtt等RPC接口参数变化 2023-08-22 11:23:03 +08:00
Kimdiego2098
8e22812265 修正部分代码格式 2023-08-21 19:59:07 +08:00
Kimdiego2098
409bc91b9e 2.0.9.2 2023-08-19 12:08:49 +08:00
Kimdiego2098
61fe543a2a xml 2023-08-19 11:06:05 +08:00
Kimdiego2098
8a949a7e64 修复TcpClient重复释放导致锁异常 2023-08-19 11:05:29 +08:00
Kimdiego2098
b0dc9fb97a mas1.0.2默认中文 2023-08-18 18:36:30 +08:00
Kimdiego2098
83114d1002 更新masa1.0.2 2023-08-18 13:59:17 +08:00
Kimdiego2098
94a25a903f 2.0.9.1 2023-08-18 13:33:45 +08:00
Kimdiego2098
4f402f9e55 修改锁为EasyLock 2023-08-18 12:07:01 +08:00
Kimdiego2098
27bb2e3dcc 代码文件编码统一utf-8 2023-08-18 09:57:03 +08:00
Kimdiego2098
66cc52f6ec 更换DEMO Include为PackageReference 2023-08-17 15:30:35 +08:00
Kimdiego2098
ed1367b116 底层驱动添加netstandard输出 2023-08-17 15:24:07 +08:00
Kimdiego2098
5c055352e4 2.0.8 2023-08-17 10:58:48 +08:00
Kimdiego2098
8dcff5ada1 调整readme,方便copy账密 2023-08-17 10:28:47 +08:00
Kimdiego2098
4b8b23d7d5 优化变量地址输入分割方法;s7读写字符串添加默认编码 2023-08-17 09:50:10 +08:00
Kimdiego2098
e576f6aed3 优化s7读写字符串,更改特殊方法为读写共用 2023-08-16 17:20:20 +08:00
Kimdiego2098
97ab04da91 修复写入返回结果时的解析,0XFF为成功 2023-08-16 15:56:25 +08:00
Kimdiego2098
c6361bb36e 修复s7字符串打包读取 2023-08-16 15:47:37 +08:00
Kimdiego2098
b0b3dc225d 修复s7字符串读取 2023-08-16 15:35:15 +08:00
Kimdiego2098
9cbaba192a 主动释放锁 2023-08-16 14:56:47 +08:00
Kimdiego2098
f511598e13 OPCUA死区不再固定传入 2023-08-16 14:21:19 +08:00
Kimdiego2098
5ffff3b7aa fix: 优化JsonUtils中的获取type语句顺序 2023-08-16 08:59:18 +08:00
Kimdiego2098
24c4fa1c4f OPC系列增加导出excel/导入系统双选项 2023-08-15 17:38:40 +08:00
Kimdiego2098
7f312c1273 OPCUA采集设备写入字符串,不再需要传入双引号 2023-08-15 14:15:39 +08:00
Kimdiego2098
ef5c226c81 历史数据/报警 线程初始化时不再阻塞 2023-08-15 12:12:00 +08:00
Kimdiego2098
3f029cf799 更改ItemGroup Condition条件 2023-08-14 17:36:59 +08:00
Kimdiego2098
5bf64a8bec 传播token;
更新admin解决方案
2023-08-14 16:43:30 +08:00
Kimdiego2098
89f9c537f8 优化适配器解析代码 2023-08-14 14:21:00 +08:00
Kimdiego2098
e8d7f57818 2.0.6 2023-08-13 16:57:12 +08:00
Kimdiego2098
9b42fa78e7 OPCUACClient订阅初始化添加trycatch 2023-08-13 16:29:59 +08:00
Kimdiego2098
96d98e8f39 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-08-13 15:53:33 +08:00
Kimdiego2098
1f3a281e78 更新opcuaclient,初始读取server类型改为动态读取 2023-08-13 15:50:47 +08:00
Diego2098
dab4b66ee0 更新nuget包 2023-08-12 12:09:50 +08:00
Kimdiego2098
64dd192ddb 修复批量令牌强退失效 2023-08-11 15:15:50 +08:00
Kimdiego2098
b0a5c383d0 中间变量导入时添加标识 2023-08-11 14:15:22 +08:00
Kimdiego2098
4836cc99eb 2.0.5 2023-08-10 18:23:40 +08:00
Kimdiego2098
ba33873354 去除不需要的模板 2023-08-10 16:28:52 +08:00
Kimdiego2098
12c838cab0 修改详情模板 2023-08-10 11:23:18 +08:00
Kimdiego2098
a83a1c83a7 添加自定义详情模板 2023-08-10 10:35:19 +08:00
Kimdiego2098
2234f47170 底层修改:如果连接端口断开,停止等待返回 2023-08-10 10:35:01 +08:00
Kimdiego2098
4bae1b17fc 上传DTO添加 单位 参数 2023-08-10 09:09:09 +08:00
Kimdiego2098
6a7a0e0fa6 调整调试页面 2023-08-09 23:45:53 +08:00
Kimdiego2098
bff987c55f 添加单文件发布配置 2023-08-09 15:12:55 +08:00
Kimdiego2098
e467006913 去除页面多余引号 2023-08-09 13:45:27 +08:00
Kimdiego2098
1d646d4a6d 更新2.0.4 2023-08-09 13:00:10 +08:00
Kimdiego2098
70bd4936a1 更新opcua写入 2023-08-09 12:43:05 +08:00
Kimdiego2098
5ae7add6d2 更新opcua调试页面 2023-08-09 12:01:23 +08:00
Kimdiego2098
02b206ce7c 更新opcua 2023-08-09 11:47:04 +08:00
Kimdiego2098
2ea626a567 修复中间变量导入错误 2023-08-09 09:00:49 +08:00
Kimdiego2098
653909ec11 修正错误注释 2023-08-08 18:09:23 +08:00
Kimdiego2098
1d7c148eaf opcua添加初始化连接错误重试 2023-08-08 18:04:24 +08:00
Kimdiego2098
94a7e130ca 更新readme 2023-08-08 16:14:06 +08:00
Kimdiego2098
609abacdf0 优化大量设备线程重启的耗时 2023-08-08 14:02:00 +08:00
Kimdiego2098
033ff2e49a 2.0.3 2023-08-08 12:59:14 +08:00
Kimdiego2098
00a9bf0641 底层部分方法更改 2023-08-08 12:31:42 +08:00
Kimdiego2098
100f322456 报警/历史值查询时区转换 2023-08-08 09:05:15 +08:00
Kimdiego2098
2251e08d30 时间最小最大值时不再转换时区 2023-08-08 08:39:20 +08:00
Kimdiego2098
14e9beef53 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-08-08 08:28:37 +08:00
Kimdiego2098
c7cce23d54 默认不启用单用户登录 2023-08-08 08:28:27 +08:00
Diego2098
7becf32352 更新文档 2023-08-07 22:31:51 +08:00
Diego2098
741eda9f4e 去除DateTimeOffset类型 2023-08-07 22:30:38 +08:00
Kimdiego2098
473f51481c 更新文档 2023-08-07 17:38:53 +08:00
Kimdiego2098
684f9bd11b 更新readme 2023-08-07 17:34:32 +08:00
Kimdiego2098
b4b7f0c360 更新文件 2023-08-07 17:24:28 +08:00
Kimdiego2098
cf42d02628 更新文件 2023-08-07 17:16:53 +08:00
Kimdiego2098
cc9a9eab7b 更新文件 2023-08-07 16:56:45 +08:00
Kimdiego2098
784d6abc9b 更新文件 2023-08-07 16:33:36 +08:00
Kimdiego2098
0eafc07184 更新文件 2023-08-07 16:30:23 +08:00
Kimdiego2098
7e9499bd2e 更新文件 2023-08-07 15:46:30 +08:00
Kimdiego2098
d01a52aa95 更新文件 2023-08-07 15:36:49 +08:00
Kimdiego2098
6bcd492980 去除多余解决方案配置 2023-08-07 15:31:22 +08:00
Kimdiego2098
96b15da04b 添加发布脚本 2023-08-07 15:23:53 +08:00
Kimdiego2098
e0f1801693 更新readme 2023-08-07 15:18:42 +08:00
Kimdiego2098
d195ad85c5 更新readme 2023-08-07 15:13:21 +08:00
Kimdiego2098
773f7b6c1b 更新文档 2023-08-07 15:10:42 +08:00
Kimdiego2098
40f29fe399 2.0.0 2023-08-07 15:09:53 +08:00
Kimdiego2098
b19eb117c1 调试更新Blazor代码时不再跳转登录界面 2023-07-25 22:00:27 +08:00
Kimdiego2098
f930ba5eff 取消不必要的错误日志 2023-07-25 20:50:33 +08:00
Kimdiego2098
fbbda6c230 变量值更新错误提示; 2023-07-25 20:48:17 +08:00
Kimdiego2098
47db4968e5 优化大批量excel变量表导入效率 2023-07-25 18:26:48 +08:00
Kimdiego2098
1aff2e518c 删除不必要延时 2023-07-25 16:52:56 +08:00
Kimdiego2098
24134ca49e 发布1.7.6 2023-07-25 14:22:11 +08:00
Kimdiego2098
aadbe05a5e 优化导入excel效率 2023-07-25 14:21:17 +08:00
Kimdiego2098
18eddf4700 添加上传插件获取采集设备属性值的快捷方法 2023-07-23 13:44:37 +08:00
Kimdiego2098
0869ba7e70 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-07-23 09:59:11 +08:00
Kimdiego2098
cba5db1c53 线程完成时不再需要全局数据移除,有可能会导致偶发全局数据丢失 2023-07-23 09:58:43 +08:00
Kimdiego2098
0aa5430e23 线程完成时不要需要全局数据移除,有可能会导致偶发全局数据丢失 2023-07-23 09:57:03 +08:00
Kimdiego2098
88a91828cb 更新icon包版本 2023-07-23 00:03:46 +08:00
Kimdiego2098
27af89f5fe 更新icon包版本 2023-07-22 23:59:03 +08:00
Kimdiego2098
6f6d483bfe 修改插件日志为自定义日志 2023-07-22 23:34:09 +08:00
Kimdiego2098
915072c191 更新文档 2023-07-22 20:48:29 +08:00
Kimdiego2098
76077b92ae 发布1.7.4 2023-07-22 20:47:26 +08:00
Kimdiego2098
f0d1a527a5 修正错误名称 2023-07-22 20:32:34 +08:00
Kimdiego2098
fdb2a96d1c 添加上传插件最后错误原因 2023-07-22 20:10:45 +08:00
Kimdiego2098
849e3ac187 修复上传设备暂停按钮失效 2023-07-22 19:56:56 +08:00
Kimdiego2098
5c4cf21c59 OPCUAServer 数组维度不再写any;rpc写入添加延时 2023-07-22 17:02:44 +08:00
Kimdiego2098
40ee3e5d9b 更改假死检测间隔5分钟 2023-07-22 11:05:56 +08:00
Kimdiego2098
77a7cc034e 添加OPCUAServer线程间隔配置项,优化最后一次错误提示 2023-07-22 11:03:56 +08:00
Kimdiego2098
82b7881765 支持OPCUAServer数组类型,添加缓存文件存在判断 2023-07-21 21:28:39 +08:00
Kimdiego2098
3515775267 去除OPCUA写入数组维度校验 2023-07-20 17:37:49 +08:00
Kimdiego2098
10e12aa1c1 更新文档 2023-07-20 12:48:13 +08:00
Kimdiego2098
7fb4e62aa3 kafka尝试自动加载c库 2023-07-20 12:40:59 +08:00
Kimdiego2098
2605eaa614 修复中间变量Rpc写入 2023-07-20 10:55:37 +08:00
Kimdiego2098
8e97b4820d ModbusServer添加自定义循环间隔,修复中间变量写入 2023-07-20 10:55:17 +08:00
Kimdiego2098
89af4cdb68 更新文档 2023-07-19 18:02:31 +08:00
Kimdiego2098
6099c1a25a 更新文档 2023-07-19 15:43:28 +08:00
Kimdiego2098
fd23758aea 更改左侧菜单为手风琴效果 2023-07-19 15:00:40 +08:00
Kimdiego2098
8ad0b89db1 更新文档 2023-07-19 14:34:27 +08:00
Kimdiego2098
e7dffa3ff4 修改OPCUAClient心跳频率默认3s 2023-07-18 14:49:27 +08:00
Kimdiego2098
2772b5d2e2 更改OPCUAClient心跳频率为30000 2023-07-18 14:15:02 +08:00
Kimdiego2098
df6d9b5f70 更新1.7.3版本 2023-07-18 12:16:33 +08:00
Kimdiego2098
c9622d6d57 更新masa 稳定版以及其他包 2023-07-18 12:11:37 +08:00
Kimdiego2098
1f0b7c3c7e 修复添加订阅时,值死区过滤逻辑 2023-07-18 11:13:21 +08:00
Kimdiego2098
c12245037e 修复异步锁上下文切换导致OPCUA 心跳事件出错 2023-07-18 09:58:01 +08:00
Kimdiego2098
fe6d2a50a5 修复OPCUAClient调试界面重复输出订阅值 2023-07-18 08:51:27 +08:00
Kimdiego2098
7be84950f8 修改OPCUAClient的心跳频率配置项 2023-07-18 08:48:18 +08:00
Kimdiego2098
ba212da222 添加重启锁 2023-07-17 21:40:47 +08:00
2248356998 qq.com
122b833256 Merge branch 'master' of https://gitee.com/diego2098/thingsgateway-docs 2023-07-17 20:59:53 +08:00
2248356998 qq.com
7c73479041 更新opcua心跳状态日志 2023-07-17 20:59:32 +08:00
Diego2098
151f2e99ae 更新文档 2023-07-16 20:46:16 +08:00
Diego2098
da367e813f 更新授权名单 2023-07-16 20:31:56 +08:00
2248356998 qq.com
9143dfe336 更新文档 2023-07-16 18:27:22 +08:00
2248356998 qq.com
29914d6a72 更新文档 2023-07-16 18:12:55 +08:00
2248356998 qq.com
0dbef72a97 更新文档 2023-07-16 18:07:31 +08:00
2248356998 qq.com
3bb118bfe1 更新文档 2023-07-16 17:49:33 +08:00
2248356998 qq.com
85ce3be077 更新文档 2023-07-16 17:48:22 +08:00
2248356998 qq.com
064c2bf0a8 更新文档 2023-07-16 17:41:52 +08:00
2248356998 qq.com
c96d06ccc5 更新文档 2023-07-16 17:35:04 +08:00
2248356998 qq.com
a658dbb753 更新文档地址 2023-07-16 17:32:49 +08:00
2248356998 qq.com
bf5d5b629e 迁移文档 2023-07-16 17:28:26 +08:00
2248356998 qq.com
241d576519 冗余设备删除后会导致后台出错 2023-07-16 11:36:45 +08:00
2248356998 qq.com
7807e9bdd0 更新readme 2023-07-16 10:28:43 +08:00
2248356998 qq.com
fcbf15fed6 删除无用属性 2023-07-16 09:40:00 +08:00
2248356998 qq.com
cd90a11209 修复1.7.0版本修改导致的mqttrpc映射错误 2023-07-15 22:56:28 +08:00
2248356998 qq.com
ff65707ea2 增加 上传插件的列表分割大小,因为某些情况下传输字节太大会导致失败 2023-07-15 22:42:34 +08:00
2248356998 qq.com
b16026070c 导入提示的当前行显示未初始 2023-07-15 22:35:12 +08:00
2248356998 qq.com
1b5fbf86d8 格式化整理 2023-07-15 22:32:54 +08:00
2248356998 qq.com
5eb1be8101 插件报文截取前200字符,防止页面渲染过多 2023-07-15 20:04:14 +08:00
2248356998 qq.com
6a863cd26a kafka插件增加超时选项 2023-07-15 17:27:35 +08:00
2248356998 qq.com
87ebb7b6c7 历史服务修复变量在线状态显示错误 2023-07-15 15:46:39 +08:00
2248356998 qq.com
1233a74307 发布1.7.2版本 2023-07-15 11:10:29 +08:00
2248356998 qq.com
221890acfb 优化OPCUA错误提示 2023-07-14 17:33:11 +08:00
2248356998 qq.com
687c7e766e OPCUA在取消订阅时应该走读取方法 2023-07-14 17:22:19 +08:00
2248356998 qq.com
ba22c407d3 优化导入excel提示 2023-07-14 16:23:42 +08:00
2248356998 qq.com
a8b9ed56b5 优化导入excel提示 2023-07-14 16:23:35 +08:00
2248356998 qq.com
3004869e19 kafka 插件释放时取消事件注册 2023-07-14 14:35:40 +08:00
2248356998 qq.com
1145853fe1 更改属性说明 2023-07-14 12:23:46 +08:00
2248356998 qq.com
f1617a25b1 添加kafka插件null传播 2023-07-14 10:41:04 +08:00
2248356998 qq.com
932be558d9 opcda JValue转object 2023-07-14 10:14:05 +08:00
2248356998 qq.com
ee3a37d3b9 opcua读取值JValue转为object 2023-07-14 10:04:05 +08:00
2248356998 qq.com
5ac412a582 RabbitMQ,IotSharp添加离线缓存 2023-07-13 19:54:12 +08:00
2248356998 qq.com
1625290bc3 Variable Value数据类型改为object 2023-07-13 18:18:53 +08:00
2248356998 qq.com
1ec169ad49 中间变量页种子ID重复 2023-07-13 17:47:22 +08:00
2248356998 qq.com
53be552e44 复制设备没有及时刷新缓存 2023-07-13 17:38:45 +08:00
2248356998 qq.com
d3a75d46b9 发布1.7.1 2023-07-13 11:19:17 +08:00
2248356998 qq.com
256512c961 代码格式化 2023-07-13 11:18:36 +08:00
2248356998 qq.com
5c12ac5bcc OPCDA增加数组支持,增加写入动态类型支持 2023-07-13 11:16:31 +08:00
2248356998 qq.com
02a2bcb113 优化OPCUA数组类型转换 2023-07-13 09:02:36 +08:00
2248356998 qq.com
1f0a01c725 修复blazor界面null错误 2023-07-12 22:12:11 +08:00
2248356998 qq.com
6ea164ede1 更新ReadMe 2023-07-12 21:33:05 +08:00
2248356998 qq.com
65bae85ecc 删除重复文件 2023-07-12 21:30:41 +08:00
2248356998 qq.com
2fd7dcf4d0 更新nuget包 2023-07-12 21:21:50 +08:00
2248356998 qq.com
aa3bbbe038 V1.7.0发布
1、增加采集通道冗余
2、优化多个界面
3、导出导入功能优化
4、增加中间变量
5、OPCUAClient支持动态类型
6、离线缓存多处覆盖,包含上传插件/历史报警/时序库
7、增加通用调试界面,增加s7调试
8、其他优化
2023-07-12 21:16:38 +08:00
2248356998 qq.com
6cb09a6f95 修复AppDataTable清空MForm模型导致筛选列清空的问题 2023-07-10 13:18:14 +08:00
2248356998 qq.com
45868f05d3 修复写入s7协议 bit值 偏移错误(以byte数据块为准) 2023-07-08 17:01:44 +08:00
2248356998 qq.com
aac7401e20 修复读取s7协议 bit值 偏移错误(以byte数据块为准) 2023-07-08 11:44:57 +08:00
2248356998 qq.com
c2fc290edd 默认添加kafka插件 种子数据 2023-07-07 17:13:00 +08:00
2248356998 qq.com
330357fc36 修复布尔量解析时反转字节导致结果值不符的错误 2023-07-06 14:05:09 +08:00
2248356998 qq.com
f4a3d6a64e null传播 2023-07-03 14:13:00 +08:00
2248356998 qq.com
2e0963ec81 添加x86架构 2023-07-03 10:48:52 +08:00
2248356998 qq.com
897cb6e62a 补充插件实例内容 2023-07-02 19:50:09 +08:00
2248356998 qq.com
80868bd48e blazor组件初始化并行执行,导致sugar单例DB出现线程偶发错误,暂增加copyNew()解决 2023-06-29 16:42:19 +08:00
2248356998 qq.com
b3df78c56f blazor组件初始化并行执行,导致sugar单例DB出现线程偶发错误,暂增加copyNew()解决 2023-06-29 16:36:03 +08:00
2248356998 qq.com
783a4259e3 sqlsugar偶发线程故障,添加copyNew方法 2023-06-28 18:54:45 +08:00
2248356998 qq.com
fcf19b8dc8 登录跳转uri优化 2023-06-28 15:47:35 +08:00
2248356998 qq.com
1f9f89817d 更新开源说明 2023-06-28 10:48:33 +08:00
2248356998 qq.com
7b94da7d85 update openapiUser datatableUI 2023-06-26 19:51:02 +08:00
2248356998 qq.com
164406f6c2 css脚本结果不采用 System.Text.Json.JsonSerializer 2023-06-26 19:44:17 +08:00
2248356998 qq.com
90ef2adc6b OPCUAClient修复当变量为string类型时的数值过滤失败导致添加订阅失效 2023-06-26 19:43:00 +08:00
2248356998 qq.com
d65f10f88b 停用采集设备时,变量获取运行态出错 2023-06-26 16:43:48 +08:00
2248356998 qq.com
dca0ece9e0 登录后跳转原url 2023-06-26 14:46:24 +08:00
2248356998 qq.com
baabc155c8 cookie授权验证失败时返回登录界面 2023-06-26 14:36:41 +08:00
Diego2098
7eb94412d6 更新nuget类库 2023-06-25 18:59:09 +08:00
2248356998 qq.com
0fc8b24f85 添加报警事件None枚举 2023-06-20 13:10:58 +08:00
2248356998 qq.com
88f6ef5b96 修复cpu核心等于1时报错,修正登录错误提示 2023-06-20 09:09:08 +08:00
Diego2098
7442483419 修复modbusServer 初始化错误 2023-06-17 18:14:13 +08:00
2248356998 qq.com
9c61933c04 sugar添加取消令箭 2023-06-15 17:38:36 +08:00
2248356998 qq.com
2b36a99720 增加变量运行态 CollectVariableRuntime 所在设备属性 2023-06-15 16:50:08 +08:00
2248356998 qq.com
c2cfc42ba4 parallel.foreach无序体验不好,退回为foreach 2023-06-14 11:04:09 +08:00
2248356998 qq.com
4f32704e08 update 1.6.1 version 2023-06-13 22:39:47 +08:00
2248356998 qq.com
fccf43685f update nuget package 2023-06-13 22:39:25 +08:00
2248356998 qq.com
39135d81ad update driver messagesui 2023-06-13 22:26:19 +08:00
2248356998 qq.com
ff4b10681e 并行关闭线程 2023-06-12 14:41:08 +08:00
2248356998 qq.com
10b7908fc2 添加mqtt/kafka上传内容显示 2023-06-12 14:40:53 +08:00
2248356998 qq.com
31790da8c6 优化大量变量excel上传的验证过程 2023-06-12 11:35:27 +08:00
2248356998 qq.com
4621201c47 更新文档站点地址 2023-06-11 18:37:50 +08:00
2248356998 qq.com
692ac31dbf 删除docs 2023-06-11 18:22:15 +08:00
2248356998 qq.com
ed1d163d55 更新1.6.0版本 2023-06-11 17:58:57 +08:00
2248356998 qq.com
e931c9040c 缓存最大默认2000 2023-06-11 17:56:34 +08:00
2248356998 qq.com
f23cb48ea4 添加离线缓存大小限制配置 2023-06-11 17:55:03 +08:00
2248356998 qq.com
c3b2b6b07b 上传插件线程等待时间改为10ms 2023-06-11 17:47:16 +08:00
2248356998 qq.com
f89bf590ba 导入变量优化 2023-06-11 17:46:23 +08:00
2248356998 qq.com
fea17dc00b 添加mqttClient离线缓存 2023-06-11 17:45:46 +08:00
2248356998 qq.com
dbb1069920 添加kafka离线缓存 2023-06-11 17:45:27 +08:00
Diego2098
afc4ccfaa9 !6 部分配置会导致SqlServer自动建库失败
Merge pull request !6 from samisgod/master
2023-06-10 06:55:34 +00:00
samisgod
38d55a1c07 fix db init for SqlServer 2023-06-10 14:51:29 +08:00
2248356998 qq.com
5fca29f103 增加pwa 2023-06-09 17:53:41 +08:00
2248356998 qq.com
78f34b2ca4 修复停用验证码时登录失败显示null报错 2023-06-09 17:09:17 +08:00
2248356998 qq.com
8e8028e809 统一文件编码 2023-06-09 15:04:54 +08:00
2248356998 qq.com
8dc70687f8 update solution folder 2023-06-09 14:30:53 +08:00
2248356998 qq.com
fa22f9ee64 upload deviceStatusPage 2023-06-09 10:32:11 +08:00
2248356998 qq.com
b33c0d3f81 update deviceStatusPage 2023-06-09 09:49:03 +08:00
2248356998 qq.com
339009add4 remove dotNET China declaration 2023-06-09 09:10:30 +08:00
2248356998 qq.com
798c823c4b add dotNET China declaration 2023-06-09 09:02:17 +08:00
Diego2098
14ad86f2a3 重启线程时增加运行状态界面空传播防止报错 2023-06-08 21:35:07 +08:00
2248356998 qq.com
a3a714dc17 add upload plugin code description 2023-06-08 17:47:53 +08:00
2248356998 qq.com
e8d8b0d41d 迁移导入变量功能到驱动调试内 2023-06-08 15:11:58 +08:00
2248356998 qq.com
17daad8f89 plugin unload test,but failed 2023-06-08 10:52:39 +08:00
2248356998 qq.com
e178263b3b 更改默认api文档为Knife4j 2023-06-07 20:34:31 +08:00
2248356998 qq.com
4febbc261e 缓存键增加Type-TypeHandle句柄 2023-06-07 18:42:58 +08:00
2248356998 qq.com
ef3a6942fd 修改OPCUA证书路径,增加默认接收不收信任证书与其选项;
OPCDA整理;
2023-06-07 18:03:57 +08:00
2248356998 qq.com
f8ac2be62b 重启线程WebApi修改 2023-06-07 11:32:18 +08:00
2248356998 qq.com
25447c34e5 添加注释提示 2023-06-07 11:28:11 +08:00
2248356998 qq.com
37cdf8fd48 GC策略更改,大量变量实例手动清空以快速内存释放 2023-06-07 11:19:24 +08:00
2248356998 qq.com
ac8e7dc959 上传1.5.1 2023-06-06 19:37:04 +08:00
2248356998 qq.com
8293382840 Merge branch 'master' of https://gitee.com/diego2098/ThingsGateway 2023-06-05 08:33:50 +08:00
Diego2098
d85a3e7743 S7-TCP连接修复死锁 2023-06-02 22:20:21 +08:00
2248356998 qq.com
f3f5ffb5c8 增加KINGVIEW 配置 2023-05-29 01:32:37 +08:00
2248356998 qq.com
99e6702c62 超管用户名称不可更改 2023-05-26 00:14:05 +08:00
2248356998 qq.com
e143c25078 初步添加OPCUAClient调试界面;更新依赖 2023-05-25 23:41:11 +08:00
2248356998 qq.com
3fb67972be OPCUA安全策略添加全部选项 2023-05-25 00:59:21 +08:00
2248356998 qq.com
61c04d4e09 OPCUA安全策略添加全部选项 2023-05-25 00:58:47 +08:00
2248356998 qq.com
b22f728958 添加OPCDAClient调试页面 2023-05-25 00:11:00 +08:00
2248356998 qq.com
112be7e383 修改程序根目录为文件所在目录 2023-05-24 14:37:45 +08:00
2248356998 qq.com
6a7f83fed5 默认添加服务守护支持 2023-05-24 14:32:21 +08:00
2248356998 qq.com
4b9698a735 ModbusServer添加自定义数据类型;修复发布时静态文件路径错误 2023-05-24 12:31:20 +08:00
2248356998 qq.com
ec3d203a6d Add copyright notices 2023-05-23 23:54:28 +08:00
2248356998 qq.com
e77b8f5475 update TGTcpClient 2023-05-23 22:42:48 +08:00
2248356998 qq.com
da8bbd321f 添加Modbus系列插件调试页面;添加Modbus组包解析缓存超时时间; 2023-05-23 20:50:44 +08:00
2248356998 qq.com
98fd011def update HardwareInfoService 2023-05-23 12:04:04 +08:00
2248356998 qq.com
9dccbc5316 nuget更新 2023-05-23 11:59:28 +08:00
2248356998 qq.com
03fa26daf9 硬件界面添加限值防报错 2023-05-23 11:46:19 +08:00
2248356998 qq.com
fbc41e3895 初步添加插件驱动调试页面 2023-05-22 18:50:30 +08:00
2248356998 qq.com
f1a6d0c02c 初步添加插件驱动调试页面 2023-05-22 18:41:09 +08:00
2248356998 qq.com
67f6bb7155 Razor文件格式化清理 2023-05-22 18:40:50 +08:00
2248356998 qq.com
86282f596c 删除调试代码... 2023-05-22 17:09:21 +08:00
2248356998 qq.com
e0f24c795c 更改变量读取间隔限制最低为10ms 2023-05-22 15:17:22 +08:00
2248356998 qq.com
7d44ed860c 明确System.Management版本 2023-05-22 14:51:02 +08:00
2248356998 qq.com
091094a24c 硬件信息获取添加异常拦截 2023-05-22 14:33:30 +08:00
2248356998 qq.com
ba18ee518c update adapter 2023-05-22 12:42:31 +08:00
2248356998 qq.com
513a031691 代码清理 2023-05-21 22:39:33 +08:00
2248356998 qq.com
cc79de1106 优化opcua质量戳提示;添加数据转换基础方法;TCP等待返回时默认断开连接立即返回 2023-05-21 10:51:56 +08:00
2248356998 qq.com
bd90e8efb2 modbus 组包优化 2023-05-20 21:41:16 +08:00
2248356998 qq.com
4bd88ff11d 类型更换 2023-05-20 17:13:14 +08:00
2248356998 qq.com
d27ee61292 可指定OPCUA节点数据类型 2023-05-20 15:40:17 +08:00
2248356998 qq.com
0c20b3345f 更新文档 2023-05-20 13:52:23 +08:00
2248356998 qq.com
0f3c8c7193 添加自定义OPCUAServer数据类型 2023-05-20 12:34:06 +08:00
2248356998 qq.com
16761ec605 导入规则优化,主动抛出名称重复错误 2023-05-19 22:55:53 +08:00
2248356998 qq.com
1069440cda 更改插件时开启刷新设备属性 2023-05-19 22:26:37 +08:00
2248356998 qq.com
60f5702f17 判断OPCUAServer状态时增加tryCatch 2023-05-19 21:27:20 +08:00
2248356998 qq.com
ee70133e47 判断OPCUAServer状态时增加tryCatch 2023-05-19 21:24:56 +08:00
2248356998 qq.com
06a9fdeb2e 优化tcp拆包组包 2023-05-19 20:28:51 +08:00
2248356998 qq.com
f14bd62004 快捷方式null错误 2023-05-19 16:33:57 +08:00
2248356998 qq.com
67cbaf22b7 更新依赖包 2023-05-19 16:23:21 +08:00
2248356998 qq.com
60b166dba2 UDP通讯优化 2023-05-19 16:21:42 +08:00
2248356998 qq.com
66e1647ede 添加链路锁 2023-05-19 14:27:47 +08:00
2248356998 qq.com
a1a35c00a5 分包数量显示错误 2023-05-19 10:13:48 +08:00
2248356998 qq.com
b02e3361c4 Modbus读写锁更新 2023-05-19 10:05:54 +08:00
2248356998 qq.com
2b9ceaa25a Modbus读写锁更新 2023-05-19 09:53:56 +08:00
2248356998 qq.com
109b5a9755 删除sqlsugar旧版本代码,会导致sqlite不兼容 2023-05-19 09:15:32 +08:00
2248356998 qq.com
cc4df86c10 适配mysql;修复写入表达式转换;优化web页面写入体验 2023-05-18 23:38:40 +08:00
2248356998 qq.com
e93532c395 数据库初始化修复 2023-05-18 22:24:27 +08:00
2248356998 qq.com
6ff688326a 数据库连接自动释放 2023-05-18 21:06:06 +08:00
2248356998 qq.com
eda5d2872f 编辑页面添加 变量 允许远程写入选项 2023-05-18 21:03:44 +08:00
2248356998 qq.com
dc88394f5f 修复枚举类型在mysql中类型出错的问题 2023-05-18 20:58:14 +08:00
Diego2098
ec85c9a2c6 修改文件大小限制 2023-05-17 22:29:59 +08:00
Diego2098
1341638556 更新设备读写锁 2023-05-17 22:05:31 +08:00
2248356998 qq.com
4875dfee11 touchSocket修复UDP在windows下重置连接的问题;更新nuget 2023-05-17 16:54:33 +08:00
2248356998 qq.com
d834ba8bd4 代码格式清理 2023-05-17 16:49:25 +08:00
2248356998 qq.com
6191067771 修复CancellationTokenSource未释放导致Linux下偶发内存问题 2023-05-17 16:44:52 +08:00
2248356998 qq.com
6c3a571163 OPCUAServer节点数据类型增加在读取表达式转换后的判断 2023-05-16 09:05:58 +08:00
Diego2098
5efb07e10e ModbusClient添加帧前时间 2023-05-15 22:45:55 +08:00
2248356998 qq.com
b25ec18ce6 修复using作用域导致获取的服务可能被释放的问题 2023-05-15 19:21:35 +08:00
2248356998 qq.com
f3cd281241 nuget更新 2023-05-15 18:55:27 +08:00
2248356998 qq.com
58b93cbf4c mqttClient同步间隔上传的实体类 2023-05-12 18:22:06 +08:00
2248356998 qq.com
57fc0349ff update mqttClient 2023-05-12 16:40:55 +08:00
2248356998 qq.com
d0a2cea772 MqttClient增加间隔上传选项;更改线程循环间隔说明定义 2023-05-12 16:31:57 +08:00
Diego2098
58d5801fb5 update readme 2023-05-10 21:18:43 +08:00
Diego2098
e5f2e59798 增加api控制采集启停等方法 2023-05-10 21:17:34 +08:00
Diego2098
1166921057 提交kafka插件 2023-05-10 21:17:09 +08:00
2248356998 qq.com
aeb49576f2 update readme 2023-05-10 17:49:52 +08:00
2248356998 qq.com
7ef1fecef8 共享链路写入变量修复;Nuget更新 2023-05-10 16:33:59 +08:00
2248356998 qq.com
fd630373b5 更新文档 2023-05-09 17:51:55 +08:00
2248356998 qq.com
d365d8f170 更新文档 2023-05-09 17:47:22 +08:00
2248356998 qq.com
dfa5e1172f OPCUAClient/Server 修改证书有效期为100年 2023-05-09 14:37:18 +08:00
2248356998 qq.com
daf195898a 添加控制台logo 2023-05-08 18:10:07 +08:00
2248356998 qq.com
c61c0a39cf Code Cleanup 2023-05-08 18:03:32 +08:00
2248356998 qq.com
6137e6baa5 add GetSciptValue 2023-05-08 17:45:13 +08:00
2248356998 qq.com
fd16fd9ffe modbus rtu 粘包优化 2023-05-08 15:59:35 +08:00
2248356998 qq.com
2b8bd5f2cc modbus rtu报文粘包优化;共享链路切换延时;上传插件添加报文界面 2023-05-08 15:57:33 +08:00
2248356998 qq.com
d312c2e9e7 plc read with CancellationToken 2023-05-08 13:33:01 +08:00
2248356998 qq.com
578b0d2268 粘包优化 2023-05-08 10:55:16 +08:00
2248356998 qq.com
ffb41b0109 Rpc条件bug修复 2023-05-07 18:06:27 +08:00
2248356998 qq.com
c63fb5d796 OPCUAServer修复匿名登录 2023-05-07 18:06:09 +08:00
2248356998 qq.com
8caee732e8 更新文档 2023-05-07 16:56:41 +08:00
2248356998 qq.com
df5381adce 属性顺序调整 2023-05-05 09:46:11 +08:00
2248356998 qq.com
f34836b7fa 更新文档 2023-05-04 22:58:36 +08:00
2248356998 qq.com
44b459883a update CollectDeviceThread 2023-05-04 10:58:45 +08:00
2248356998 qq.com
14a8592ae3 更新文档 2023-05-02 22:11:55 +08:00
2248356998 qq.com
787d0dce4a 更新1.5.0 2023-05-02 22:06:09 +08:00
2248356998 qq.com
8be05ff93d 1、共享链路支持;
2、设备报文查看;
3、采集线程重构;
2023-05-02 21:58:11 +08:00
2248356998 qq.com
3014af565c mqtt重连锁优化 2023-04-27 11:19:32 +08:00
2248356998 qq.com
315252bdc4 添加常用转换 2023-04-24 17:54:00 +08:00
2248356998 qq.com
c36c3b4607 masa更新 2023-04-24 11:16:28 +08:00
2248356998 qq.com
7d5e939bab 更新包 2023-04-24 09:26:47 +08:00
Diego2098
f75c9d1eed 报警后台服务去除多余接口
Signed-off-by: Diego2098 <2248356998@qq.com>
2023-04-19 00:48:13 +00:00
2248356998 qq.com
38cb9855ea 添加docker文件 2023-04-17 17:39:12 +08:00
2248356998 qq.com
ed8b56d624 单文件发布 2023-04-17 15:13:40 +08:00
2248356998 qq.com
bca48b13ae update SqlSugarConfig 2023-04-17 11:58:41 +08:00
2248356998 qq.com
29426edb05 删除其他信息 2023-04-17 11:05:38 +08:00
2248356998 qq.com
33a2dc687f 验证码更新修复 2023-04-17 09:05:44 +08:00
2248356998 qq.com
e2398a21b2 1、字段null约束修改
2、ModbusServer绑定端口优化
2023-04-16 15:02:09 +08:00
2248356998 qq.com
f19530276e 更新readme 2023-04-16 13:34:29 +08:00
2248356998 qq.com
2b9b92a78c 更新1.4.0
注意Excel导入已不适用以前版本
1、去除动态更新插件
2、改用MiniExcel,支持动态导入,excel配置更简单
3、优化多处界面与后台逻辑,部分方法规范更名
4、修复外网地址获取错误等
2023-04-15 20:48:56 +08:00
2248356998 qq.com
99c55dac10 修复报警文本逻辑 2023-04-11 13:40:13 +08:00
2248356998 qq.com
25667e46f9 1,修复控制台报错(echarts.js问题,已删除)2,多处Dispose修正 2023-04-07 08:48:34 +08:00
2248356998 qq.com
2f4e8f2399 过滤 2023-04-06 14:46:24 +08:00
2248356998 qq.com
9169183769 历史数据库选择为sqlite时查询转换日期错误 2023-04-05 18:04:33 +08:00
2248356998 qq.com
c420f50831 启用开发环境web详细日志,调整App.Razor位置,添加网页ico 2023-04-05 17:14:26 +08:00
2248356998 qq.com
c6c9279ef4 update console/file datetime format 2023-04-05 15:49:00 +08:00
2248356998 qq.com
c125e2991d 更新readme 2023-04-04 18:41:56 +08:00
2248356998 qq.com
5348b19d6a 😀版本1.3.1 2023-04-04 17:55:52 +08:00
2248356998 qq.com
afd426daac 网关软件时间统一UTC 2023-04-04 17:55:15 +08:00
2248356998 qq.com
202c511cfa update iotSharpClient 2023-04-04 11:07:05 +08:00
2248356998 qq.com
651eb295a4 😀 更新1.3.0 2023-04-04 10:15:34 +08:00
2248356998 qq.com
d798aaed33 update iotSharpClient 2023-04-04 09:25:16 +08:00
2248356998 qq.com
63ef347cc9 update iotSharpClient 2023-04-04 09:23:22 +08:00
2248356998 qq.com
3139b2d5a0 IosSharpClient Rpc优化 2023-04-04 09:22:22 +08:00
2248356998 qq.com
2c80bbb244 IotSharp Rpc方法完善 2023-04-04 09:19:48 +08:00
2248356998 qq.com
af06755ada 添加写入多个变量的api方法 2023-04-04 09:18:58 +08:00
2248356998 qq.com
97d6dbaa6c update IotSharpClient 2023-04-03 20:16:38 +08:00
2248356998 qq.com
74cf82a1c7 更新种子 2023-04-03 19:34:12 +08:00
2248356998 qq.com
74634889ab 添加IotSharp插件 2023-04-03 19:30:52 +08:00
2248356998 qq.com
dbe30fcd77 分页显示令牌 2023-04-03 15:29:35 +08:00
2248356998 qq.com
24a7f3a320 后台启动时Furion RootServices NULL值 2023-04-03 15:19:59 +08:00
2248356998 qq.com
d3650f1145 修复不存在采集设备时,初始化报警/历史服务bug 2023-04-03 14:12:56 +08:00
2248356998 qq.com
4801db9050 弹窗消息在SignalR订阅方法中需InvokeAsync 2023-04-03 13:35:14 +08:00
2248356998 qq.com
6445281658 修复规范化结果包装2次导致登录返回结果不正确的问题 2023-04-03 12:45:19 +08:00
2248356998 qq.com
87719f5938 更新演示地址 2023-04-03 10:47:49 +08:00
2248356998 qq.com
5ba1ec433b readme 2023-04-02 18:12:18 +08:00
2248356998 qq.com
7c5b382458 readme 2023-04-02 18:08:56 +08:00
2248356998 qq.com
8960426128 更新readme 2023-04-02 18:05:54 +08:00
2248356998 qq.com
e1d47d5a92 更新readme 2023-04-02 18:05:28 +08:00
2248356998 qq.com
9407c272aa 更新包 2023-04-02 17:10:32 +08:00
2248356998 qq.com
bccbd7b400 添加注释 2023-04-02 16:59:46 +08:00
2248356998 qq.com
a24dc010ec 调整依赖,添加关系图 2023-04-01 17:28:35 +08:00
2248356998 qq.com
c5e5d50fb8 调整依赖,更新版本1.2.1 2023-04-01 15:45:02 +08:00
2248356998 qq.com
be1c520320 整理 2023-04-01 13:57:57 +08:00
2248356998 qq.com
3d18d0f893 😀 OPCUAServer支持历史查询数据 2023-03-31 18:32:55 +08:00
2248356998 qq.com
c3351a38a6 添加ThingsGateway.Foundation注释 2023-03-31 16:25:33 +08:00
2248356998 qq.com
0b86340a8d 硬件信息获取添加延时 2023-03-30 20:51:08 +08:00
2248356998 qq.com
829371b032 脚本显示优化 2023-03-30 19:51:38 +08:00
2248356998 qq.com
b342207bc7 更新文档 2023-03-30 19:39:35 +08:00
2248356998 qq.com
58f4fdced3 mqtt/mq上传 添加上传实体自定义脚本 2023-03-30 19:07:18 +08:00
2248356998 qq.com
253844cbcf 表达式整理 2023-03-30 16:23:03 +08:00
2248356998 qq.com
e2e2b9ffb4 更新版本 2023-03-30 14:12:39 +08:00
2248356998 qq.com
2568042f5f 更新文档 2023-03-30 14:11:16 +08:00
2248356998 qq.com
722edf4b9a readme 2023-03-30 14:06:03 +08:00
2248356998 qq.com
e406d364e4 更新readme,nuget 2023-03-30 14:05:00 +08:00
2248356998 qq.com
31c37f41b2 删除多余代码 2023-03-30 13:53:57 +08:00
2248356998 qq.com
6cd879bbc5 opcua 写入添加用户名日志 2023-03-30 13:32:32 +08:00
2248356998 qq.com
b7974050fe 去除ua数据类型验证 2023-03-30 13:20:26 +08:00
2248356998 qq.com
e9c9d0816e 更新readme 2023-03-30 13:13:44 +08:00
2248356998 qq.com
a437692e1a 类命名错误更改 2023-03-30 13:11:46 +08:00
2248356998 qq.com
2a14d2f3c8 发布文件添加 2023-03-30 13:11:43 +08:00
2248356998 qq.com
559e2d1889 添加OPCUAServer插件,修复个别bug 2023-03-30 13:10:31 +08:00
Diego2098
a1aa919f80 1、OPCUAClient修复客户端证书未自动生成
2、修复异步方法错误使用
2023-03-30 00:15:13 +08:00
2248356998 qq.com
cbccb27a5a 添加部分代码注释 2023-03-29 16:22:01 +08:00
2248356998 qq.com
bbad36d576 驱动支持主机名称 2023-03-29 11:07:21 +08:00
2248356998 qq.com
df6c9d55b5 修复初始化失败导致的一系列问题 2023-03-29 10:53:42 +08:00
2248356998 qq.com
36a1d9c364 上传插件间隔时间修正 2023-03-28 16:40:00 +08:00
2248356998 qq.com
1f3681d5ac 历史变量enable失效 2023-03-28 16:38:29 +08:00
2248356998 qq.com
0159f8e53f 历史报表时间格式改为yyyy-MM-dd HH:mm:ss ffffff 2023-03-28 16:31:53 +08:00
2248356998 qq.com
0432be64fc 采集设备状态判断错误 2023-03-28 16:21:30 +08:00
2248356998 qq.com
481e062961 采集设备状态判断错误 2023-03-28 15:55:01 +08:00
2248356998 qq.com
72b8abdeb6 修复历史保存值 频繁时出现值相同的问题 2023-03-28 15:14:30 +08:00
2248356998 qq.com
7ec3ee41d1 opc 活动时间修正 2023-03-28 14:15:14 +08:00
2248356998 qq.com
b765fa4769 添加写入采集时间的接口,而不是固定DateTime.Now 2023-03-28 14:03:11 +08:00
2248356998 qq.com
06685b162e 更新tcpclient 2023-03-28 13:52:33 +08:00
2248356998 qq.com
7bcad7c424 修复linux 分隔符错误问题 2023-03-28 11:48:16 +08:00
2248356998 qq.com
6e054b3cc6 更改插件文件不存在时的日志信息 2023-03-28 10:21:39 +08:00
2248356998 qq.com
e643f6b0f8 更改项目引用结构 2023-03-28 10:21:23 +08:00
2248356998 qq.com
e44c0f85c2 swagger文档 2023-03-27 19:01:04 +08:00
Iot边缘设备
ea66e968eb !5 添加部署文档
* 添加部署文档
2023-03-27 10:22:30 +00:00
2248356998 qq.com
f7e73d804e 属性/字段缓存获取只包含public 2023-03-27 14:49:09 +08:00
2248356998 qq.com
2ff4df56a1 更新masa-1.0.0-preview.10 2023-03-27 14:27:15 +08:00
2248356998 qq.com
346c45fe0c 优化变量上传属性页 2023-03-27 12:00:10 +08:00
2248356998 qq.com
f98b42a36e 采集设备活动时间应正常刷新 2023-03-27 10:51:54 +08:00
2248356998 qq.com
f77a0a266c 添加设备复制功能 2023-03-27 10:42:02 +08:00
2248356998 qq.com
0be672788f update code collation 2023-03-27 08:49:10 +08:00
2248356998 qq.com
e2e3d11d42 update code collation 2023-03-26 19:48:08 +08:00
2248356998 qq.com
bb127bb567 更新nuget包 2023-03-26 18:52:16 +08:00
2248356998 qq.com
8eb4f89db8 发行1.10版本 2023-03-26 18:10:12 +08:00
2248356998 qq.com
4a87ea3e70 实时数据界面优化 2023-03-26 17:39:05 +08:00
2248356998 qq.com
61115fce99 1、采用异步AutoResetEvent,修复多个设备下采集太慢的问题
2、弃用IntelligentConcurrentQueue(touchsocket集成类)
2023-03-26 17:32:29 +08:00
2248356998 qq.com
4f31120394 1、优化设备状态页,减少signalr刷新所需包大小
2、日志前置等级添加
2023-03-24 18:32:10 +08:00
2248356998 qq.com
b085cd65ce 修复导出表格时,null值报错 2023-03-23 22:09:53 +08:00
2248356998 qq.com
f76ec0721a 导入错误时,忽略大于10行的错误信息显示 2023-03-23 20:01:19 +08:00
2248356998 qq.com
ef3944fbbf 更新readme 2023-03-22 15:29:35 +08:00
2248356998 qq.com
b158fbc0d8 优化log等级、json配置注解 2023-03-22 15:26:42 +08:00
2248356998 qq.com
68f2d66e97 OPCUA写入测试 2023-03-22 14:06:32 +08:00
2248356998 qq.com
0cdd1735bd 设备运行状态页面改为扩展 2023-03-22 13:46:23 +08:00
2248356998 qq.com
70f5ead20b 更新文档 2023-03-22 10:44:44 +08:00
Diego2098
574e5616f8 rbmq插件优化 2023-03-21 23:38:00 +08:00
Diego2098
94fa810590 分包失败提示 2023-03-21 23:28:30 +08:00
Diego2098
37f69da701 设备组列宽调整,补充上传设备组 2023-03-21 23:10:59 +08:00
Diego2098
f2f8448ade 1、更新DataTypeEnum
2、OPCUA写入时需实际数据类型
2023-03-21 22:47:10 +08:00
Diego2098
b357d3fff2 更新Tests 2023-03-21 22:46:12 +08:00
2248356998 qq.com
b417194905 表格无数据时,修改默认宽度 2023-03-21 18:17:18 +08:00
2248356998 qq.com
d8741da20a S7nuget版本 2023-03-21 15:44:50 +08:00
2248356998 qq.com
c469be9a62 masa nuget版本更改 2023-03-21 14:31:36 +08:00
2248356998 qq.com
ff4eb339ef GC策略修改 2023-03-21 14:07:17 +08:00
2248356998 qq.com
78489383c0 更新文档 2023-03-21 14:03:49 +08:00
2248356998 qq.com
f67c1b415f 更新文档 2023-03-21 13:56:14 +08:00
2248356998 qq.com
570c16d921 修改s7属性注释 2023-03-21 13:51:05 +08:00
2248356998 qq.com
c8bc60568a 更新readme 2023-03-21 13:49:10 +08:00
2248356998 qq.com
73de3ba856 更新S7协议插件 2023-03-21 13:45:58 +08:00
2248356998 qq.com
6a69be8537 修改S7特殊方法 2023-03-21 13:41:32 +08:00
2248356998 qq.com
3ee381d505 修改s7 2023-03-21 13:38:43 +08:00
2248356998 qq.com
7ce744e2e4 添加西门子S7协议插件 2023-03-21 13:37:17 +08:00
2248356998 qq.com
b81d21c991 版本恢复 2023-03-21 11:45:18 +08:00
2248356998 qq.com
e9fe0992c6 更新nuget,暂缓链路复用功能 2023-03-20 13:34:59 +08:00
2248356998 qq.com
d5ef9018fa 默认不开启转储 2023-03-20 09:22:11 +08:00
2248356998 qq.com
c2737a7c51 更新opcda文档 2023-03-19 23:18:24 +08:00
2248356998 qq.com
4b6d8733c6 格式清理 2023-03-19 23:12:58 +08:00
2248356998 qq.com
f22a3e0955 修复null值报错 2023-03-19 23:02:08 +08:00
2248356998 qq.com
4b8144a2f7 添加设备组,变量按设备组别搜索 2023-03-19 22:56:02 +08:00
2248356998 qq.com
abac52e23c 更新readme,opcda核心库提示 2023-03-19 20:40:54 +08:00
2248356998 qq.com
9aa089313e 尝试修复中文在mac上乱码 2023-03-19 17:29:01 +08:00
2248356998 qq.com
b18f2c481a 修正中文在mac上乱码 2023-03-19 16:45:14 +08:00
2248356998 qq.com
ec83b9f77b 删除未知文件 2023-03-19 16:35:24 +08:00
2248356998 qq.com
fad5495e02 Merge branch 'master' of https://gitee.com/diego2098/ThingsGateway 2023-03-19 16:34:26 +08:00
2248356998 qq.com
70dec1171e 添加设备组功能 2023-03-19 16:34:15 +08:00
士心
0673a6fce3 !4 修复MacOS环境下,数据库报错的问题
* 修复macos环境下,数据库报错
2023-03-19 08:28:54 +00:00
2248356998 qq.com
8f525b1407 准备更新设备组/变量组功能 2023-03-19 11:49:06 +08:00
2248356998 qq.com
e83a991a4b 更新ReadMe 2023-03-18 17:56:18 +08:00
2248356998 qq.com
c000432a52 1、最后校验失败时应该提示日志
2、暂停时设备状态修正
2023-03-18 17:49:08 +08:00
2248356998 qq.com
c06d2d6927 更新文档 2023-03-18 16:47:29 +08:00
2248356998 qq.com
aa29653a8f ByteBlock实际长度 2023-03-18 16:45:39 +08:00
2248356998 qq.com
3f7e4ad486 修正串口描述类ToString 2023-03-18 16:32:15 +08:00
2248356998 qq.com
0eab546b2f 更新文档 2023-03-18 16:23:23 +08:00
2248356998 qq.com
8830d216d1 更新nuget 2023-03-18 16:16:27 +08:00
2248356998 qq.com
9fa1e3d449 更新readme 2023-03-18 16:15:14 +08:00
2248356998 qq.com
fe5dce7159 添加ModbusRtu种子数据 2023-03-18 16:14:37 +08:00
2248356998 qq.com
952fa31548 添加ModbusRtu插件 2023-03-18 16:14:25 +08:00
2248356998 qq.com
cc058ccc61 添加串口基础类 2023-03-18 16:14:08 +08:00
2248356998 qq.com
bc26ed9701 更新文档 2023-03-17 18:19:14 +08:00
2248356998 qq.com
26135fc1a0 更新文档 2023-03-17 17:52:04 +08:00
2248356998 qq.com
0bd14672ff 种子数据更改 2023-03-17 17:51:58 +08:00
2248356998 qq.com
7c7150cde8 采集检测间隔修改 2023-03-17 17:40:34 +08:00
2248356998 qq.com
b08282b0c1 上传插件添加循环间隔属性 2023-03-17 17:30:06 +08:00
2248356998 qq.com
3bf6e1befc 添加rbmq插件种子数据 2023-03-17 16:30:02 +08:00
2248356998 qq.com
52692371ac rbmq插件文件夹更名 2023-03-17 16:16:23 +08:00
2248356998 qq.com
159ac1d8bb 优化内存queue,修复mqtt插件可能超出字节限制的情况 2023-03-17 16:04:24 +08:00
2248356998 qq.com
7f1ffdbc79 添加rbmq插件 2023-03-17 16:03:44 +08:00
2248356998 qq.com
5fe64931dc 设备禁用时,变量绑定的设备对应选项会显示禁用(灰色) 2023-03-17 11:29:14 +08:00
2248356998 qq.com
ee67855b48 更新readme 2023-03-16 17:33:25 +08:00
2248356998 qq.com
594a97f43f 选择插件时自动更新属性 2023-03-16 17:33:17 +08:00
2248356998 qq.com
7fb435a8b4 更新赞助名单 2023-03-16 11:35:58 +08:00
2248356998 qq.com
01e74d6116 限流服务默认不开启 2023-03-16 09:47:20 +08:00
2248356998 qq.com
b321d75b39 增加简易定时看板 2023-03-15 16:01:54 +08:00
2248356998 qq.com
1e47a45723 更新历史配置说明 2023-03-15 09:11:33 +08:00
Diego2098
88c609e5ef !3 update handbook/docs/05、网关配置/5.5、其他配置.mdx.
Merge pull request !3 from zhubanghao/N/A
2023-03-14 13:39:16 +00:00
zhubanghao
775d1a424e update handbook/docs/05、网关配置/5.5、其他配置.mdx.
Signed-off-by: zhubanghao <58813184@qq.com>
2023-03-14 13:05:33 +00:00
3676 changed files with 381956 additions and 129826 deletions

13
.gitignore vendored
View File

@@ -362,13 +362,8 @@ MigrationBackup/
# Fody - auto-generated XML schema
FodyWeavers.xsd
/src/Plugins/Other
/src/ThingsGateway.Web.Server/*.db
/src/PluginPro*/
/src/*Pro*/
/src/*Pro*
/src/TestResults*/
/src/ThingsGateway.Web.Server/ThingsGateway.db
/handbook/
/src/*pro*
/src/*pro*/
/src/ThingsGateway.Server/Configuration/GiteeOAuthSettings.json

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 KiB

202
LICENSE Normal file
View File

@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is field.
4. Cachetribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2023-present Diego
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

182
README.md
View File

@@ -1,129 +1,101 @@
# ThingsGateway

<div align='center'>
<img src="https://gitee.com/diego2098/ThingsGateway/raw/master/Image/gitLogo.png" height=100 />
</div>
#### 介绍
## Introduction
基于Net6/7+Blazor Server的跨平台边缘采集网关支持南北端插件式开发
并拥有较完善的北端Rpc权限管理。

A cross-platform, high-performance edge data collection gateway based on net9.

[Github地址](https://github.com/kimdiego2098/ThingsGateway)
## Documentation
<div >
如果对您有帮助请点击右上角⭐Star关注感谢支持开源
</div>
#### 开源说明
Apache 2.0+[附加协议](https://diego2098.gitee.io/thingsgateway-docs/docs/)
Apache 2.0 开源协议的核心内容是以保护和尊重原作者的著作权为主要目的。对使用复制修改商用不做过多限制但必须包含原著的License信息。
#### 功能亮点
- Blazor Server架构开发部署更简单
- 采集/上传配置完全支持Excel导入导出
- 插件式驱动,方便驱动二次开发
- 时序数据库存储
- 实时/历史报警(Sql转储),支持布尔/高低限值
#### 演示
http://120.24.62.140:5000/
默认账户密码superAdmin 111111

[Documentation](https://thingsgateway.cn/).

[NuGet](https://www.nuget.org/packages?q=Tags%3A%22ThingsGateway%22)

#### 社区版采集插件
> 支持分包解析/订阅
- Modbus(Rtu/Tcp/Udp)
- OPCDAClient支持导入节点
- OPCUAClient支持导入节点
- 西门子S7协议
## Demo
#### 社区版上传插件
> 支持Rpc写入
- Modbus Server
- OPCUA Server (支持历史查询)
- Mqtt Server (支持自定义json)
- Mqtt Client (支持自定义json)
- IotSharp Client (IotSharp网关插件Rpc待测试)

[Demo](https://demo.thingsgateway.cn/)
> 不支持Rpc
- RabbitMQ (支持自定义json)
- Kafka

Account: **SuperAdmin**
#### nuget

Password: **111111**
- Modbus库支持ModbusTcp、ModbusRtu、ModbusRtuOverTcp、ModbusUdp、ModbusServer等
``` powershell
dotnet add package ThingsGateway.Foundation.Adapter.Modbus
```
- OPCDA客户端库支持X64支持NetCore支持检测重连
``` powershell
dotnet add package ThingsGateway.Foundation.Adapter.OPCDA
```
- OPCUA客户端库
``` powershell
dotnet add package ThingsGateway.Foundation.Adapter.OPCUA

**In the upper-right corner, switch to the IoT Gateway module in the personal popup box**
## Docker
```shell
docker pull registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway
docker pull registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway_arm64
```
- S7库
``` powershell
dotnet add package ThingsGateway.Foundation.Adapter.Siemens
```
#### 效果图
<table>
<tr>
<td><img src="https://gitee.com/diego2098/ThingsGateway/raw/master/Image/1.png"/></td>
<td><img src="https://gitee.com/diego2098/ThingsGateway/raw/master/Image/2.png"/></td>
<td><img src="https://gitee.com/diego2098/ThingsGateway/raw/master/Image/3.png"/></td>
</tr>
<tr>
<td><img src="https://gitee.com/diego2098/ThingsGateway/raw/master/Image/4.png"/></td>
<td><img src="https://gitee.com/diego2098/ThingsGateway/raw/master/Image/5.png"/></td>
<td><img src="https://gitee.com/diego2098/ThingsGateway/raw/master/Image/6.png"/></td>
</tr>
<tr>
<td><img src="https://gitee.com/diego2098/ThingsGateway/raw/master/Image/7.png"/></td>
<td><img src="https://gitee.com/diego2098/ThingsGateway/raw/master/Image/8.png"/></td>
<td><img src="https://gitee.com/diego2098/ThingsGateway/raw/master/Image/9.png"/></td>
</tr>
</table>
#### 文档
### Plugin List
使用前请查看Gitee Pages [文档站点](https://diego2098.gitee.io/thingsgateway-docs/)

#### 特别鸣谢
- Furion[https://dotnetchina.gitee.io/furion](https://dotnetchina.gitee.io/furion)
- SqlSugar[https://gitee.com/dotnetchina/SqlSugar](https://gitee.com/dotnetchina/SqlSugar)
- Simple.Admin[https://gitee.com/zxzyjs/SimpleAdmin](https://gitee.com/zxzyjs/SimpleAdmin)
- Masa.Blazor[https://www.masastack.com/blazor](https://www.masastack.com/blazor)
- MiniExcel[https://gitee.com/dotnetchina/MiniExcel](https://gitee.com/dotnetchina/MiniExcel)
- TouchSocket[https://gitee.com/rrqm_home/touchsocket](https://gitee.com/rrqm_home/touchsocket)
- IdGenerator[https://github.com/yitter/idgenerator](https://github.com/yitter/idgenerator)
- CodingSeb.ExpressionEvaluator[https://github.com/codingseb/ExpressionEvaluator](https://github.com/codingseb/ExpressionEvaluator)
- Hardware.Info[https://github.com/Jinjinov/Hardware.Info](https://github.com/Jinjinov/Hardware.Info)
- UAParser[https://github.com/ua-parser/uap-csharp](https://github.com/ua-parser/uap-csharp)
#### Data Collection Plugins
#### 补充说明
* 使用OPC相关插件时请遵循OPC基金会的授权规则
* 使用OPCDA插件时需安装OPC核心库[文件地址](https://gitee.com/diego2098/ThingsGateway/attach_files)
| Plugin Name | Remarks |
| ----------- | ------------------------------------------------------------- |
| Modbus | Supports Rtu/Tcp message formats, with Serial/Tcp/Udp links |
| SiemensS7 | Siemens PLC S7 series |
| Dlt6452007 | Supports Serial/Tcp/Udp links |
| OpcDaMaster | Compiled for 64-bit |
| OpcUaMaster | Supports certificate login, object extension, Json read/write |
| Webhook | Webhook |
#### 支持作者
如果对您有帮助请点击右上角⭐Star关注感谢支持开源
#### Business Plugins
若希望捐赠项目请查看以下捐赠码或使用Gitee捐赠功能
<img src="https://gitee.com/diego2098/ThingsGateway/raw/master/Image/pay.png" height=180 />
| Plugin Name | Remarks |
| ---------------- | ------------------------------------------------------------------------------------------------- |
| ModbusSlave | Supports Rtu/Tcp message formats, with Serial/Tcp/Udp links, supports Rpc reverse writing |
| OpcUaServer | OpcUa server, supports Rpc reverse writing |
| MqttClient | Mqtt client, supports Rpc reverse writing, script-customizable upload content |
| MqttServer | Mqtt server, supports WebSocket, supports Rpc reverse writing, script-customizable upload content |
| KafkaProducer | Script-customizable upload content |
| RabbitMQProducer | Script-customizable upload content |
| SqlDB | Relational database storage, supports historical storage and real-time data updates |
| SqlHistoryAlarm | Alarm historical data relational database storage |
| TDengineDB | Time-series database storage |
| QuestDB | Time-series database storage |
#### 联系作者
* QQ群605534569
* 邮箱2248356998@qq.com

## License

[License](https://thingsgateway.cn/docs/1)


## Sponsorship

[Sponsorship Approach](https://thingsgateway.cn/docs/1000)

## Community

QQ Group: 605534569 [Jump](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=NnBjPO-8kcNFzo_RzSbdICflb97u2O1i&authKey=V1MI3iJtpDMHc08myszP262kDykbx2Yev6ebE4Me0elTe0P0IFAmtU5l7Sy5w0jx&noverify=0&group_code=605534569)

## Pro Plugins

[Plugin List](https://thingsgateway.cn/docs/1001)

86
README.zh-CN.md Normal file
View File

@@ -0,0 +1,86 @@
# ThingsGateway
## 介绍
基于net9的跨平台高性能边缘采集网关
## 文档
[文档](https://thingsgateway.cn/)
[NuGet](https://www.nuget.org/packages?q=Tags%3A%22ThingsGateway%22)
## 演示
[ThingsGateway演示地址](https://demo.thingsgateway.cn/)
账户 : **SuperAdmin**
密码 : **111111**
**右上角个人弹出框中,切换到物联网关模块**
## Docker
```shell
docker pull registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway
docker pull registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway_arm64
```
### 插件列表
#### 采集插件
| 插件名称 | 备注 |
| ----------- | ------------------------------------- |
| Modbus | Rtu/Tcp报文格式支持串口/Tcp/Udp链路 |
| SiemensS7 | 西门子PLC S7系列 |
| Dlt6452007 | 支持串口/Tcp/Udp链路 |
| OpcDaMaster | 64位编译 |
| OpcUaMaster | 支持证书登录扩展对象Json读写 |
#### 业务插件
| 插件名称 | 备注 |
| ---------------- | ---------------------------------------------------------- |
| ModbusSlave | Rtu/Tcp报文格式支持串口/Tcp/Udp链路支持Rpc反写 |
| OpcUaServer | OpcUa服务端支持Rpc反写 |
| MqttClient | Mqtt客户端支持Rpc反写脚本自定义上传内容 |
| MqttServer | Mqtt服务端支持WebSocket支持Rpc反写脚本自定义上传内容 |
| KafkaProducer | 脚本自定义上传内容 |
| RabbitMQProducer | 脚本自定义上传内容 |
| SqlDB | 关系数据库存储,支持历史存储和实时数据更新 |
| SqlHistoryAlarm | 报警历史数据关系数据库存储 |
| TDengineDB | 时序数据库存储 |
| QuestDB | 时序数据库存储 |
| Webhook | Webhook |
## 协议
[版权声明](https://thingsgateway.cn/docs/1)
## 赞助
[赞助途径](https://thingsgateway.cn/docs/1000)
## 社区
QQ群605534569 [跳转](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=NnBjPO-8kcNFzo_RzSbdICflb97u2O1i&authKey=V1MI3iJtpDMHc08myszP262kDykbx2Yev6ebE4Me0elTe0P0IFAmtU5l7Sy5w0jx&noverify=0&group_code=605534569)
## Pro插件
[插件列表](https://thingsgateway.cn/docs/1001)
## 特别声明
ThingsGateway 项目已加入 [dotNET China](https://gitee.com/dotnetchina) 组织。<br/>
![dotnetchina](https://gitee.com/dotnetchina/home/raw/master/assets/dotnetchina-raw.png "dotNET China LOGO")

BIN
icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

133
src/.editorconfig Normal file
View File

@@ -0,0 +1,133 @@
root = true
# To learn more about .editorconfig see https://aka.ms/editorconfigdocs
###############################
# Core EditorConfig Options #
###############################
[*.cs]
#### 命名样式 ####
# 命名规则
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
# 符号规范
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers =
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =
# 命名样式
dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case
dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
csharp_using_directive_placement = outside_namespace:silent
csharp_style_expression_bodied_methods = false:silent
csharp_style_expression_bodied_constructors = false:silent
csharp_style_expression_bodied_operators = false:silent
csharp_style_expression_bodied_properties = true:silent
csharp_style_expression_bodied_indexers = true:silent
csharp_style_expression_bodied_accessors = true:silent
csharp_style_expression_bodied_lambdas = true:silent
csharp_style_expression_bodied_local_functions = false:silent
csharp_style_conditional_delegate_call = true:suggestion
csharp_style_var_for_built_in_types = false:silent
csharp_style_var_when_type_is_apparent = false:silent
csharp_style_var_elsewhere = false:silent
csharp_prefer_simple_using_statement = true:suggestion
csharp_prefer_braces = true:silent
csharp_style_namespace_declarations = block_scoped:silent
[*.vb]
#### 命名样式 ####
# 命名规则
dotnet_naming_rule.interface_should_be_以_i_开始.severity = suggestion
dotnet_naming_rule.interface_should_be_以_i_开始.symbols = interface
dotnet_naming_rule.interface_should_be_以_i_开始.style = 以_i_开始
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.severity = suggestion
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.symbols = 类型
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.style = 帕斯卡拼写法
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.severity = suggestion
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.symbols = 非字段成员
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.style = 帕斯卡拼写法
# 符号规范
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, friend, private, protected, protected_friend, private_protected
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.类型.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.类型.applicable_accessibilities = public, friend, private, protected, protected_friend, private_protected
dotnet_naming_symbols.类型.required_modifiers =
dotnet_naming_symbols.非字段成员.applicable_kinds = property, event, method
dotnet_naming_symbols.非字段成员.applicable_accessibilities = public, friend, private, protected, protected_friend, private_protected
dotnet_naming_symbols.非字段成员.required_modifiers =
# 命名样式
dotnet_naming_style.以_i_开始.required_prefix = I
dotnet_naming_style.以_i_开始.required_suffix =
dotnet_naming_style.以_i_开始.word_separator =
dotnet_naming_style.以_i_开始.capitalization = pascal_case
dotnet_naming_style.帕斯卡拼写法.required_prefix =
dotnet_naming_style.帕斯卡拼写法.required_suffix =
dotnet_naming_style.帕斯卡拼写法.word_separator =
dotnet_naming_style.帕斯卡拼写法.capitalization = pascal_case
dotnet_naming_style.帕斯卡拼写法.required_prefix =
dotnet_naming_style.帕斯卡拼写法.required_suffix =
dotnet_naming_style.帕斯卡拼写法.word_separator =
dotnet_naming_style.帕斯卡拼写法.capitalization = pascal_case
file_header_template = ------------------------------------------------------------------------------\n此代码版权声明为全文件覆盖如有原作者特别声明会在下方手动补充\n此代码版权除特别声明外的代码归作者本人Diego所有\n源代码使用协议遵循本仓库的开源协议及附加协议\nGitee源代码仓库https://gitee.com/diego2098/ThingsGateway\nGithub源代码仓库https://github.com/kimdiego2098/ThingsGateway\n使用文档https://thingsgateway.cn/\nQQ群605534569\n------------------------------------------------------------------------------
[*.{cs,vb}]
end_of_line = crlf
dotnet_style_qualification_for_field = false:silent
dotnet_style_qualification_for_property = false:silent
dotnet_style_qualification_for_method = false:silent
dotnet_style_qualification_for_event = false:silent
dotnet_diagnostic.RCS1146.severity = warning
dotnet_diagnostic.RCS1059.severity = none
dotnet_diagnostic.RCS1138.severity = suggestion
dotnet_code_quality.CA1822.api_surface = private, internal

View File

@@ -0,0 +1,6 @@
## Release 1.0
### New Rules
Rule ID | Category | Severity | Notes
--------|----------|----------|--------------------
TG0001 | Conflict | Error | SetParametersAsyncGenerator

View File

@@ -0,0 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\PackNuget.props" />
<PropertyGroup>
<TargetFrameworks>netstandard2.0;</TargetFrameworks>
<Version>$(SourceGeneratorVersion)</Version>
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
<NoPackageAnalysis>true</NoPackageAnalysis>
<SignAssembly>false</SignAssembly>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<IncludeBuildOutput>false</IncludeBuildOutput>
<!-- 避免 DLL 被打包到 lib/ -->
<EnableSourceGenerator>true</EnableSourceGenerator>
<!-- 可选 -->
</PropertyGroup>
<ItemGroup>
<None Include="$(OutputPath)\$(TargetFileName)" Pack="true"
PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
<ItemGroup>
<AdditionalFiles Include="AnalyzerReleases.Shipped.md" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0" PrivateAssets="all" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,9 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------

View File

@@ -0,0 +1,534 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace Microsoft.AspNetCore.Components;
[Generator]
public partial class SetParametersAsyncGenerator : ISourceGenerator
{
private string m_DoNotGenerateSetParametersAsyncAttribute = """
using System;
namespace Microsoft.AspNetCore.Components
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)]
internal sealed class DoNotGenerateSetParametersAsyncAttribute : Attribute
{
}
}
"""
;
private string m_GenerateSetParametersAsyncAttribute = """
using System;
namespace Microsoft.AspNetCore.Components
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)]
internal sealed class GenerateSetParametersAsyncAttribute : Attribute
{
public bool RequireExactMatch { get; set; }
}
}
"""
;
private string m_GlobalGenerateSetParametersAsyncAttribute = """
using System;
namespace Microsoft.AspNetCore.Components
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
internal sealed class GlobalGenerateSetParametersAsyncAttribute : Attribute
{
public bool Enable { get; }
public GlobalGenerateSetParametersAsyncAttribute(bool enable = true)
{
Enable = enable;
}
}
}
"""
;
private static readonly DiagnosticDescriptor ParameterNameConflict = new DiagnosticDescriptor(
id: "TG0001",
title: "Parameter name conflict",
messageFormat: "Parameter names are case insensitive. {0} conflicts with {1}.",
category: "Conflict",
defaultSeverity: DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: "Parameter names must be case insensitive to be usable in routes. Rename the parameter to not be in conflict with other parameters.");
public void Initialize(GeneratorInitializationContext context)
{
context.RegisterForPostInitialization(a =>
{
a.AddSource(nameof(m_DoNotGenerateSetParametersAsyncAttribute), m_DoNotGenerateSetParametersAsyncAttribute);
a.AddSource(nameof(m_GenerateSetParametersAsyncAttribute), m_GenerateSetParametersAsyncAttribute);
a.AddSource(nameof(m_GlobalGenerateSetParametersAsyncAttribute), m_GlobalGenerateSetParametersAsyncAttribute);
});
// Register a syntax receiver that will be created for each generation pass
context.RegisterForSyntaxNotifications(() => new SyntaxReceiver());
}
public void Execute(GeneratorExecutionContext context)
{
// https://github.com/dotnet/AspNetCore.Docs/blob/1e199f340780f407a685695e6c4d953f173fa891/aspnetcore/blazor/webassembly-performance-best-practices.md#implement-setparametersasync-manually
if (context.SyntaxReceiver is not SyntaxReceiver receiver)
{
return;
}
var candidate_classes = GetCandidateClasses(receiver, context);
foreach (var class_symbol in candidate_classes.Distinct(SymbolEqualityComparer.Default).Cast<INamedTypeSymbol>())
{
GenerateSetParametersAsyncMethod(context, class_symbol);
}
}
private static void GenerateSetParametersAsyncMethod(GeneratorExecutionContext context, INamedTypeSymbol class_symbol)
{
var force_exact_match = class_symbol.GetAttributes().Any(a => a.NamedArguments.Any(na => na.Key == "RequireExactMatch" && na.Value.Value is bool v && v));
var namespaceName = class_symbol.ContainingNamespace.ToDisplayString();
var type_kind = class_symbol.TypeKind switch { TypeKind.Class => "class", TypeKind.Interface => "interface", _ => "struct" };
var type_parameters = string.Join(", ", class_symbol.TypeArguments.Select(t => t.Name));
type_parameters = string.IsNullOrEmpty(type_parameters) ? type_parameters : "<" + type_parameters + ">";
context.AddCode(class_symbol.ToDisplayString() + "_override.cs", $@"
using Microsoft.AspNetCore.Components;
using System.Collections.Generic;
using System.Threading.Tasks;
#pragma warning disable CA2007
#pragma warning disable CS0162
#pragma warning disable CS8632
namespace {namespaceName}
{{
public partial class {class_symbol.Name}{type_parameters}
{{
private bool _initialized;
/// <summary>
/// <inheritdoc/>
/// </summary>
public override Task SetParametersAsync(ParameterView parameters)
{{
Dictionary<string,object?> parameterValues = new();
foreach (var parameter in parameters)
{{
if(BlazorImplementation__WriteSingleParameter(parameter.Name, parameter.Value)==false)
{{
// 如果没有处理参数,则添加到参数列表中
parameterValues.Add(parameter.Name, parameter.Value);
}}
}}
if(parameterValues.Count > 0)
{{
parameters.SetParameterProperties(this);
}}
if (!_initialized)
{{
_initialized = true;
return RunInitAndSetParametersAsync();
}}
else
{{
return CallOnParametersSetAsync();
}}
}}
// We do not want the debugger to consider NavigationExceptions caught by this method as user-unhandled.
#if NET9_0_OR_GREATER
[System.Diagnostics.DebuggerDisableUserUnhandledExceptions]
#endif
private async Task RunInitAndSetParametersAsync()
{{
Task task;
try
{{
OnInitialized();
task = OnInitializedAsync();
}}
catch (Exception ex) when (ex is not NavigationException)
{{
throw;
}}
if (task.Status != TaskStatus.RanToCompletion && task.Status != TaskStatus.Canceled)
{{
// Call state has changed here so that we render after the sync part of OnInitAsync has run
// and wait for it to finish before we continue. If no async work has been done yet, we want
// to defer calling StateHasChanged up until the first bit of async code happens or until
// the end. Additionally, we want to avoid calling StateHasChanged if no
// async work is to be performed.
StateHasChanged();
try
{{
await task;
}}
catch // avoiding exception filters for AOT runtime support
{{
// Ignore exceptions from task cancellations.
// Awaiting a canceled task may produce either an OperationCanceledException (if produced as a consequence of
// CancellationToken.ThrowIfCancellationRequested()) or a TaskCanceledException (produced as a consequence of awaiting Task.FromCanceled).
// It's much easier to check the state of the Task (i.e. Task.IsCanceled) rather than catch two distinct exceptions.
if (!task.IsCanceled)
{{
throw;
}}
}}
// Don't call StateHasChanged here. CallOnParametersSetAsync should handle that for us.
}}
await CallOnParametersSetAsync();
}}
// We do not want the debugger to consider NavigationExceptions caught by this method as user-unhandled.
#if NET9_0_OR_GREATER
[System.Diagnostics.DebuggerDisableUserUnhandledExceptions]
#endif
private Task CallOnParametersSetAsync()
{{
Task task;
try
{{
OnParametersSet();
task = OnParametersSetAsync();
}}
catch (Exception ex) when (ex is not NavigationException)
{{
#if NET9_0_OR_GREATER
System.Diagnostics.Debugger.BreakForUserUnhandledException(ex);
#endif
throw;
}}
// If no async work is to be performed, i.e. the task has already ran to completion
// or was canceled by the time we got to inspect it, avoid going async and re-invoking
// StateHasChanged at the culmination of the async work.
var shouldAwaitTask = task.Status != TaskStatus.RanToCompletion &&
task.Status != TaskStatus.Canceled;
// We always call StateHasChanged here as we want to trigger a rerender after OnParametersSet and
// the synchronous part of OnParametersSetAsync has run.
StateHasChanged();
return shouldAwaitTask ?
CallStateHasChangedOnAsyncCompletion(task) :
Task.CompletedTask;
}}
// We do not want the debugger to stop more than once per user-unhandled exception.
#if NET9_0_OR_GREATER
[System.Diagnostics.DebuggerDisableUserUnhandledExceptions]
#endif
private async Task CallStateHasChangedOnAsyncCompletion(Task task)
{{
try
{{
await task;
}}
catch // avoiding exception filters for AOT runtime support
{{
// Ignore exceptions from task cancellations, but don't bother issuing a state change.
if (task.IsCanceled)
{{
return;
}}
throw;
}}
StateHasChanged();
}}
}}
}}
#pragma warning restore CS8632
#pragma warning restore CS0162
#pragma warning restore CA2007
");
var bases = class_symbol.GetTypeHierarchy().Where(t => !SymbolEqualityComparer.Default.Equals(t, class_symbol));
var members = class_symbol.GetMembers() // members of the type itself
.Concat(bases.SelectMany(t => t.GetMembers().Where(m => m.DeclaredAccessibility != Accessibility.Private))) // plus accessible members of any base
.Distinct(SymbolEqualityComparer.Default);
var property_symbols = members.OfType<IPropertySymbol>();
var writable_property_symbols = property_symbols.Where(ps =>
!ps.IsReadOnly || ps.GetAttributes().Any(a =>
a.AttributeClass?.Name is "CascadingParameter" or "CascadingParameterAttribute")
);
var parameter_symbols = writable_property_symbols
.Where(ps => ps.GetAttributes().Any(a => false
|| a.AttributeClass.Name == "Parameter"
|| a.AttributeClass.Name == "ParameterAttribute"
|| a.AttributeClass.Name == "CascadingParameter"
|| a.AttributeClass.Name == "CascadingParameterAttribute"
));
var name_conflicts = parameter_symbols.GroupBy(ps => ps.Name.ToLowerInvariant()).Where(g => g.Count() > 1);
foreach (var conflict in name_conflicts)
{
var key = conflict.Key;
var conflicting_parameters = conflict.ToList();
foreach (var parameter in conflicting_parameters)
{
var this_name = parameter.Name;
var conflicting_name = conflicting_parameters.Select(p => p.Name).FirstOrDefault(n => n != this_name);
foreach (var location in parameter.Locations)
{
context.ReportDiagnostic(Diagnostic.Create(ParameterNameConflict, location, this_name, conflicting_name));
}
}
}
var all = parameter_symbols.ToList();
var catch_all_parameter = parameter_symbols.FirstOrDefault(p =>
{
var parameter_attr = p.GetAttributes().FirstOrDefault(a => a.AttributeClass!.Name.StartsWith("Parameter"));
return parameter_attr?.NamedArguments.Any(n => n.Key == "CaptureUnmatchedValues" && n.Value.Value is bool v && v) == true;
});
var lower_case_match_cases = parameter_symbols.Except(new[] { catch_all_parameter }).Select(p => $"case \"{p.Name.ToLowerInvariant()}\": this.{p.Name} = ({p.Type.ToDisplayString()}) value; break;");
var lower_case_match_default = catch_all_parameter == null ? @"default: {return false;}" : $@"
default:
{{
this.{catch_all_parameter.Name} ??= new System.Collections.Generic.Dictionary<string, object>();
var writable_dict = this.{catch_all_parameter.Name};
if (!writable_dict.TryAdd(name, value))
{{
writable_dict[name] = value;
}}
break;
}}";
var exact_match_cases = parameter_symbols.Except(new[] { catch_all_parameter }).Select(p => $"case \"{p!.Name}\": this.{p.Name} = ({p.Type.ToDisplayString()}) value; break;");
string exact_match_default;
if (force_exact_match)
{
if (catch_all_parameter == null) // exact matches are forced, and we do not have a catch-all parameter, therefore we need to throw on unmatched parameter
{
exact_match_default = @"default: { return false;";
}
else // exact matches are forced, and we DO have a catch-all parameter, therefore we simply add that unmatched parameter to the dictionary
{
exact_match_default = $@"
default:
{{
this.{catch_all_parameter.Name} ??= new System.Collections.Generic.Dictionary<string, object>();
var writable_dict = this.{catch_all_parameter.Name};
if (!writable_dict.TryAdd(name, value))
{{
writable_dict[name] = value;
}}
break;
}}";
}
}
else
{
// exact matches are not forced, so if there is no exact match, we fall back to compare it in lower case
exact_match_default = $@"
default:
{{
switch (name.ToLowerInvariant())
{{
{string.Join("\n", lower_case_match_cases)}
{lower_case_match_default}
}}
break;
}}
";
}
context.AddCode(class_symbol.ToDisplayString() + "_implementation.cs", $@"
using System;
#pragma warning disable CS0162
#pragma warning disable CS0618
#pragma warning disable CS8632
namespace {namespaceName}
{{
public partial class {class_symbol.Name}{type_parameters}
{{
private bool BlazorImplementation__WriteSingleParameter(string name, object value)
{{
if(name != ""Body"")
{{
switch (name)
{{
{string.Join("\n", exact_match_cases)}
{exact_match_default}
}}
return true;
}}
return false;
}}
}}
}}
#pragma warning restore CS8632
#pragma warning restore CS0618
#pragma warning restore CS0162");
}
private static bool HasUserDefinedSetParametersAsync(INamedTypeSymbol classSymbol)
{
return classSymbol
.GetMembers("SetParametersAsync")
.OfType<IMethodSymbol>()
.Any(m =>
m.Parameters.Length == 1 &&
m.Parameters[0].Type.ToDisplayString() == "Microsoft.AspNetCore.Components.ParameterView" &&
m.DeclaredAccessibility == Accessibility.Public &&
!m.IsStatic);
}
private static bool IsPartial(INamedTypeSymbol symbol)
{
return symbol.DeclaringSyntaxReferences
.Select(r => r.GetSyntax())
.OfType<ClassDeclarationSyntax>()
.Any(c => c.Modifiers.Any(m => m.IsKind(SyntaxKind.PartialKeyword)));
}
private static bool IsComponent(ClassDeclarationSyntax classDeclarationSyntax, INamedTypeSymbol symbol, Compilation compilation)
{
if (HasUserDefinedSetParametersAsync(symbol))
{
// 用户自己写了方法,不生成
return false;
}
if (!IsPartial(symbol))
{
return false;
}
if (classDeclarationSyntax.SyntaxTree.FilePath.EndsWith(".razor") || classDeclarationSyntax.SyntaxTree.FilePath.EndsWith(".razor.cs"))
{
return true;
}
var iComponent = compilation.GetTypeByMetadataName("Microsoft.AspNetCore.Components.IComponent");
var componentBase = compilation.GetTypeByMetadataName("Microsoft.AspNetCore.Components.ComponentBase");
if (iComponent == null || componentBase == null)
return false;
if (SymbolEqualityComparer.Default.Equals(symbol, iComponent))
return true;
if (SymbolEqualityComparer.Default.Equals(symbol, componentBase))
return true;
return false;
}
/// <summary>
/// Enumerate methods with at least one Group attribute
/// </summary>
private static IEnumerable<INamedTypeSymbol> GetCandidateClasses(SyntaxReceiver receiver, GeneratorExecutionContext context)
{
var compilation = context.Compilation;
var positiveAttributeSymbol = compilation.GetTypeByMetadataName("Microsoft.AspNetCore.Components.GenerateSetParametersAsyncAttribute");
var negativeAttributeSymbol = compilation.GetTypeByMetadataName("Microsoft.AspNetCore.Components.DoNotGenerateSetParametersAsyncAttribute");
// loop over the candidate methods, and keep the ones that are actually annotated
// 找特性
var assemblyAttributes = compilation.Assembly.GetAttributes();
var enableAttr = assemblyAttributes.FirstOrDefault(attr =>
attr.AttributeClass?.ToDisplayString() == "Microsoft.AspNetCore.Components.GlobalGenerateSetParametersAsyncAttribute");
var globalEnable = false;
if (enableAttr != null)
{
var arg = enableAttr.ConstructorArguments.FirstOrDefault();
if (arg.Value is bool b)
globalEnable = b;
}
foreach (ClassDeclarationSyntax class_declaration in receiver.CandidateClasses)
{
var model = compilation.GetSemanticModel(class_declaration.SyntaxTree);
var class_symbol = model.GetDeclaredSymbol(class_declaration);
if (class_symbol is null)
{
continue;
}
if (class_symbol.Name == "_Imports")
{
continue;
}
// 是否拒绝生成
var hasNegative = class_symbol.GetAttributes().Any(ad =>
ad.AttributeClass?.Equals(negativeAttributeSymbol, SymbolEqualityComparer.Default) == true);
if (hasNegative)
continue;
if (IsComponent(class_declaration, class_symbol, compilation))
{
if (globalEnable)
{
yield return class_symbol;
}
else
{
// 必须显式标注 Positive Attribute
var hasPositive = class_symbol.GetAttributes().Any(ad =>
ad.AttributeClass?.Equals(positiveAttributeSymbol, SymbolEqualityComparer.Default) == true);
if (hasPositive)
yield return class_symbol;
}
}
else
{
}
}
}
/// <summary>
/// Created on demand before each generation pass
/// </summary>
internal class SyntaxReceiver : ISyntaxReceiver
{
public List<ClassDeclarationSyntax> CandidateClasses { get; } = new List<ClassDeclarationSyntax>();
/// <summary>
/// Called for every syntax node in the compilation, we can inspect the nodes and save any information useful for generation
/// </summary>
public void OnVisitSyntaxNode(SyntaxNode syntax_node)
{
// any class with at least one attribute is a candidate for property generation
if (syntax_node is ClassDeclarationSyntax classDeclarationSyntax)
{
CandidateClasses.Add(classDeclarationSyntax);
}
else
{
}
}
}
}

View File

@@ -0,0 +1,15 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using System.Text;
namespace Microsoft.AspNetCore.Components
{
internal static class SourceGeneratorContextExtension
{
public static void AddCode(this GeneratorExecutionContext context, string hint_name, string code)
{
context.AddSource(hint_name.Replace("<", "_").Replace(">", "_"), SourceText.From(code, Encoding.UTF8));
}
}
}

View File

@@ -0,0 +1,13 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
namespace Microsoft.AspNetCore.Components
{
internal static class StringExtension
{
public static string NormalizeWhitespace(this string code)
{
return CSharpSyntaxTree.ParseText(code).GetRoot().NormalizeWhitespace().ToFullString();
}
}
}

View File

@@ -0,0 +1,19 @@
using Microsoft.CodeAnalysis;
namespace Microsoft.AspNetCore.Components
{
public static class TypeSymbolExtension
{
public static IEnumerable<INamedTypeSymbol> GetTypeHierarchy(this INamedTypeSymbol symbol)
{
yield return symbol;
if (symbol.BaseType != null)
{
foreach (var type in GetTypeHierarchy(symbol.BaseType))
{
yield return type;
}
}
}
}
}

View File

@@ -0,0 +1,49 @@
param($installPath, $toolsPath, $package, $project)
$analyzersPaths = Join-Path (Join-Path (Split-Path -Path $toolsPath -Parent) "analyzers" ) * -Resolve
foreach($analyzersPath in $analyzersPaths)
{
# Install the language agnostic analyzers.
if (Test-Path $analyzersPath)
{
foreach ($analyzerFilePath in Get-ChildItem $analyzersPath -Filter *.dll)
{
if($project.Object.AnalyzerReferences)
{
$project.Object.AnalyzerReferences.Add($analyzerFilePath.FullName)
}
}
}
}
# $project.Type gives the language name like (C# or VB.NET)
$languageFolder = ""
if($project.Type -eq "C#")
{
$languageFolder = "cs"
}
if($project.Type -eq "VB.NET")
{
$languageFolder = "vb"
}
if($languageFolder -eq "")
{
return
}
foreach($analyzersPath in $analyzersPaths)
{
# Install language specific analyzers.
$languageAnalyzersPath = join-path $analyzersPath $languageFolder
if (Test-Path $languageAnalyzersPath)
{
foreach ($analyzerFilePath in Get-ChildItem $languageAnalyzersPath -Filter *.dll)
{
if($project.Object.AnalyzerReferences)
{
$project.Object.AnalyzerReferences.Add($analyzerFilePath.FullName)
}
}
}
}

View File

@@ -0,0 +1,56 @@
param($installPath, $toolsPath, $package, $project)
$analyzersPaths = Join-Path (Join-Path (Split-Path -Path $toolsPath -Parent) "analyzers" ) * -Resolve
foreach($analyzersPath in $analyzersPaths)
{
# Uninstall the language agnostic analyzers.
if (Test-Path $analyzersPath)
{
foreach ($analyzerFilePath in Get-ChildItem $analyzersPath -Filter *.dll)
{
if($project.Object.AnalyzerReferences)
{
$project.Object.AnalyzerReferences.Remove($analyzerFilePath.FullName)
}
}
}
}
# $project.Type gives the language name like (C# or VB.NET)
$languageFolder = ""
if($project.Type -eq "C#")
{
$languageFolder = "cs"
}
if($project.Type -eq "VB.NET")
{
$languageFolder = "vb"
}
if($languageFolder -eq "")
{
return
}
foreach($analyzersPath in $analyzersPaths)
{
# Uninstall language specific analyzers.
$languageAnalyzersPath = join-path $analyzersPath $languageFolder
if (Test-Path $languageAnalyzersPath)
{
foreach ($analyzerFilePath in Get-ChildItem $languageAnalyzersPath -Filter *.dll)
{
if($project.Object.AnalyzerReferences)
{
try
{
$project.Object.AnalyzerReferences.Remove($analyzerFilePath.FullName)
}
catch
{
}
}
}
}
}

21
src/Admin/README.md Normal file
View File

@@ -0,0 +1,21 @@
<div align="center"><h1 align="center">ThingsBlazor</a></h1></div>
<div align="center"><h3 align="center">权限管理框架</h3></div>
### 🎁 框架介绍
一个通用的AspNetCore小型权限框架BlazorServer实现RBAC权限管理在线会话管理。
### 📙 衍生作品
- 👉[ThingsGateway](https://gitee.com/diego2098/ThingsGateway)
跨平台边缘采集网关
### 💐 特别鸣谢/源码参考(引用)
- 👉[Simple.Admin](https://gitee.com/zxzyjs/SimpleAdmin)
- 👉[Furion](https://gitee.com/dotnetchina/Furion)
- 👉[Bootstrap Blazor](https://www.blazor.zone/)
### 🍎 联系作者
* QQ群605534569
* 邮箱2248356998@qq.com

21
src/Admin/README.zh-CN.md Normal file
View File

@@ -0,0 +1,21 @@
<div align="center"><h1 align="center">ThingsBlazor</a></h1></div>
<div align="center"><h3 align="center">权限管理框架</h3></div>
### 🎁 框架介绍
一个通用的AspNetCore小型权限框架BlazorServer实现RBAC权限管理在线会话管理。
### 📙 衍生作品
- 👉[ThingsGateway](https://gitee.com/diego2098/ThingsGateway)
跨平台边缘采集网关
### 💐 特别鸣谢/源码参考(引用)
- 👉[Simple.Admin](https://gitee.com/zxzyjs/SimpleAdmin)
- 👉[Furion](https://gitee.com/dotnetchina/Furion)
- 👉[Bootstrap Blazor](https://www.blazor.zone/)
### 🍎 联系作者
* QQ群605534569
* 邮箱2248356998@qq.com

View File

@@ -0,0 +1,171 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Rougamo;
using Rougamo.Context;
using Rougamo.Metadatas;
using System.Collections.Concurrent;
using ThingsGateway.Extension;
using ThingsGateway.FriendlyException;
using ThingsGateway.NewLife.Json.Extension;
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// Aop拦截器
/// </summary>
[Pointcut(AccessFlags.Public | AccessFlags.Method)]
[Advice(Feature.OnException | Feature.OnSuccess)]
public sealed class OperDescAttribute : MoAttribute
{
/// <summary>
/// 日志消息队列(线程安全)
/// </summary>
private static readonly ConcurrentQueue<SysOperateLog> _logMessageQueue = new();
private static readonly IAppService AppService;
static OperDescAttribute()
{
// 创建长时间运行的后台任务,并将日志消息队列中数据写入存储中
Task.Factory.StartNew(ProcessQueue, TaskCreationOptions.LongRunning);
AppService = App.RootServices.GetService<IAppService>();
}
public OperDescAttribute(string description, bool isRecordPar = true, object localizerType = null)
{
Description = description;
IsRecordPar = isRecordPar;
LocalizerType = (Type)localizerType;
}
/// <summary>
/// 说明需配置本地化json文件
/// </summary>
public string Description { get; }
/// <summary>
/// 是否记录进出参数
/// </summary>
public bool IsRecordPar { get; }
public Type? LocalizerType { get; }
public override void OnException(MethodContext context)
{
if (App.HttpContext?.Request.Path.StartsWithSegments("/_blazor") == true)
{
//插入异常日志
SysOperateLog log = GetOperLog(LocalizerType, context);
log.Category = LogCateGoryEnum.Exception;//操作类型为异常
log.ExeStatus = false;//操作状态为失败
if (context.Exception is AppFriendlyException exception)
log.ExeMessage = exception?.Message;
else
log.ExeMessage = context.Exception?.ToString();
OperDescAttribute.WriteToQueue(log);
}
}
public override void OnSuccess(MethodContext context)
{
if (App.HttpContext?.Request.Path.StartsWithSegments("/_blazor") == true)
{
//插入操作日志
SysOperateLog log = GetOperLog(LocalizerType, context);
OperDescAttribute.WriteToQueue(log);
}
}
private static SqlSugarClient _db = DbContext.GetDB<SysOperateLog>();
/// <summary>
/// 将日志消息写入数据库中
/// </summary>
private static async Task ProcessQueue()
{
var appLifetime = App.RootServices!.GetService<IHostApplicationLifetime>()!;
while (!appLifetime.ApplicationStopping.IsCancellationRequested)
{
try
{
var data = _logMessageQueue.ToListWithDequeue(); // 从日志队列中获取数据
if (data.Count > 0)
{
await _db.InsertableWithAttr(data).ExecuteCommandAsync(appLifetime.ApplicationStopping).ConfigureAwait(false);//入库
}
}
catch (Exception ex)
{
NewLife.Log.XTrace.WriteException(ex);
}
finally
{
await Task.Delay(3000, appLifetime.ApplicationStopping).ConfigureAwait(false);
}
}
}
private SysOperateLog GetOperLog(Type? localizerType, MethodContext context)
{
var methodBase = context.Method;
var userAgent = AppService.UserAgent;
string? paramJson = null;
if (IsRecordPar)
{
var args = context.Arguments;
var parametersInfo = methodBase.GetParameters();
var parametersDict = new Dictionary<string, object>();
for (int i = 0; i < parametersInfo.Length; i++)
{
parametersDict[parametersInfo[i].Name!] = args[i];
}
paramJson = parametersDict.ToSystemTextJsonString();
}
var result = context.ReturnValue;
var resultJson = IsRecordPar ? result?.ToSystemTextJsonString() : null;
//操作日志表实体
var log = new SysOperateLog
{
Name = (localizerType == null ? App.CreateLocalizerByType(typeof(OperDescAttribute)) : App.CreateLocalizerByType(localizerType))![Description],
Category = LogCateGoryEnum.Operate,
ExeStatus = true,
OpIp = AppService?.RemoteIpAddress ?? string.Empty,
OpBrowser = userAgent?.Browser,
OpOs = userAgent?.Platform,
OpTime = DateTime.Now,
OpAccount = UserManager.UserAccount,
ReqUrl = null,
ReqMethod = "browser",
ResultJson = resultJson,
ClassName = methodBase.ReflectedType!.Name,
MethodName = methodBase.Name,
ParamJson = paramJson,
VerificatId = UserManager.VerificatId,
};
return log;
}
/// <summary>
/// 将日志消息写入队列中等待后台任务出队写入数据库
/// </summary>
/// <param name="logMsg">结构化日志消息</param>
private static void WriteToQueue(SysOperateLog logMsg)
{
_logMessageQueue.Enqueue(logMsg);
}
}

View File

@@ -0,0 +1,28 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 需要角色授权权限
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class RolePermissionAttribute : Attribute
{
}
/// <summary>
/// 忽略角色授权权限
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public sealed class IgnoreRolePermissionAttribute : Attribute
{
}

View File

@@ -0,0 +1,21 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
[AttributeUsage(AttributeTargets.Method)]
public sealed class LoginLogAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Method)]
public sealed class LogoutLogAttribute : Attribute
{
}

View File

@@ -0,0 +1,27 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 管理员才能访问
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public sealed class SuperAdminAttribute : Attribute
{
}
/// <summary>
/// 忽略超级管理员才能访问特性
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public sealed class IgnoreSuperAdminAttribute : Attribute
{
}

View File

@@ -0,0 +1,85 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
[ThingsGateway.DependencyInjection.SuppressSniffer]
public static class CacheConst
{
/// <summary>
/// Token表缓存Key
/// </summary>
public const string Cache_HardwareInfo = $"{CacheConst.Cache_Prefix_Admin}Cache_HardwareInfo:";
public const string Cache_Prefix_Admin = "ThingsGatewayAdmin:";
/// <summary>
/// 系统字典表缓存Key
/// </summary>
public const string Cache_SysDict = $"{CacheConst.Cache_Prefix_Admin}SysDict:";
/// <summary>
/// 关系表缓存Key
/// </summary>
public const string Cache_SysRelation = $"{CacheConst.Cache_Prefix_Admin}SysRelation:";
/// <summary>
/// 资源表缓存Key
/// </summary>
public const string Cache_SysResource = $"{CacheConst.Cache_Prefix_Admin}SysResource:";
/// <summary>
/// 角色表缓存Key
/// </summary>
public const string Cache_SysRole = $"{CacheConst.Cache_Prefix_Admin}SysRole:";
/// <summary>
/// 用户表缓存Key
/// </summary>
public const string Cache_SysUser = $"{CacheConst.Cache_Prefix_Admin}SysUser:";
/// <summary>
/// 用户账号关系缓存Key
/// </summary>
public const string Cache_SysUserAccount = $"{CacheConst.Cache_Prefix_Admin}SysUserAccount:";
/// <summary>
/// 职位表缓存Key
/// </summary>
public const string Cache_SysPosition = $"{CacheConst.Cache_Prefix_Admin}SysPosition:";
/// <summary>
/// 机构表缓存Key
/// </summary>
public const string Cache_SysOrg = $"{CacheConst.Cache_Prefix_Admin}SysOrg:";
/// <summary>
/// 公司表缓存Key
/// </summary>
public const string Cache_SysTenant = $"{CacheConst.Cache_Prefix_Admin}Tenant:";
/// <summary>
/// 公司表缓存Key
/// </summary>
public const string Cache_SysOrgTenant = $"{CacheConst.Cache_Prefix_Admin}OrgTenant:";
/// <summary>
/// Token表缓存Key
/// </summary>
public const string Cache_Token = $"{CacheConst.Cache_Prefix_Admin}Token:";
#region
/// <summary>
/// 登录错误次数缓存Key
/// </summary>
public const string Cache_LoginErrorCount = $"{CacheConst.Cache_Prefix_Admin}LoginErrorCount:";
#endregion
}

View File

@@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://diego2098.gitee.io/thingsgateway-docs/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 通讯器常量
/// </summary>
public static class HubConst
{
/// <summary>
/// 系统HubUrl
/// </summary>
public const string SysHubUrl = "/hubs/thingsgateway";
}

View File

@@ -0,0 +1,28 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 资源表常量
/// </summary>
[ThingsGateway.DependencyInjection.SuppressSniffer]
public static class ResourceConst
{
/// <summary>
/// 系统内置编码
/// </summary>
public const string System = "System";
/// <summary>
/// 系统管理内置ID 1
/// </summary>
public const long SystemId = 2;
}

View File

@@ -0,0 +1,50 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 角色常量
/// </summary>
[ThingsGateway.DependencyInjection.SuppressSniffer]
public static class RoleConst
{
/// <summary>
/// api角色
/// </summary>
public const string ApiRole = "ApiRole";
/// <summary>
/// 业务管理员
/// </summary>
public const string BizAdmin = "BizAdmin";
/// <summary>
/// 超级管理员
/// </summary>
public const string SuperAdmin = "SuperAdmin";
/// <summary>
/// 超级管理员Id
/// </summary>
public const long SuperAdminId = 212725263002001;
/// <summary>
/// 默认租户Id
/// </summary>
public const long DefaultTenantId = 252885263003720;
/// <summary>
/// 默认岗位Id
/// </summary>
public const long DefaultPositionId = 212725263003001;
/// <summary>
/// 超级管理员Id
/// </summary>
public const long SuperAdminRoleId = 212725263001001;
}

View File

@@ -0,0 +1,43 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
/// <summary>
/// SqlSugar系统常量
/// </summary>
[ThingsGateway.DependencyInjection.SuppressSniffer]
public static class SqlSugarConst
{
/// <summary>
/// DB_Admin
/// </summary>
public const string DB_Admin = "DB_Admin";
/// <summary>
/// DB_Custom
/// </summary>
public const string DB_Custom = "DB_Custom";
/// <summary>
/// DB_HardwareInfo
/// </summary>
public const string DB_HardwareInfo = "DB_HardwareInfo";
/// <summary>
/// DB_Log
/// </summary>
public const string DB_Log = "DB_Log";
/// <summary>
/// DB_TokenCache
/// </summary>
public const string DB_TokenCache = "DB_TokenCache";
}

View File

@@ -0,0 +1,60 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace ThingsGateway.Admin.Application;
[ApiDescriptionSettings(false)]
[Route("api/auth")]
[RequestAudit]
public class AuthController : ControllerBase
{
private readonly IAuthService _authService;
public AuthController(IAuthService authService)
{
_authService = authService;
}
[HttpPost("login")]
[AllowAnonymous]
[LoginLog]
public Task<LoginOutput> LoginAsync([FromBody] LoginInput input)
{
return _authService.LoginAsync(input);
}
[HttpGet("oauth-login")]
[AllowAnonymous]
[SuppressRequestAudit]
public IActionResult OAuthLogin(string scheme = "Gitee", string returnUrl = "/")
{
var props = new AuthenticationProperties
{
RedirectUri = returnUrl
};
return Challenge(props, scheme);
}
[HttpPost("logout")]
[Authorize]
[IgnoreRolePermission]
[LogoutLog]
public Task LogoutAsync()
{
return _authService.LoginOutAsync();
}
}

View File

@@ -0,0 +1,72 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using RouteAttribute = Microsoft.AspNetCore.Mvc.RouteAttribute;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 文化 Controller
/// </summary>
[ApiDescriptionSettings(false)]
[Route("[controller]/[action]")]
public class CultureController : Controller
{
/// <summary>
/// 重置文化方法
/// </summary>
/// <param name="redirectUri"></param>
/// <returns></returns>
[HttpGet]
public IActionResult ResetCulture(string redirectUri)
{
HttpContext.Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);
return LocalRedirect(redirectUri);
}
/// <summary>
/// 设置文化方法
/// </summary>
/// <param name="culture"></param>
/// <param name="redirectUri"></param>
/// <returns></returns>
[HttpGet]
public IActionResult SetCulture(string culture, string redirectUri)
{
if (string.IsNullOrEmpty(culture))
{
HttpContext.Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);
}
else
{
HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture, culture)), new CookieOptions()
{
Expires = DateTimeOffset.Now.AddYears(1)
});
//更改全局文化,采集后台也会变化
//var cultureInfo = new CultureInfo(culture);
//CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
//CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
//CultureInfo.CurrentCulture = cultureInfo;
//CultureInfo.CurrentUICulture = cultureInfo;
}
return LocalRedirect(redirectUri);
}
}

View File

@@ -0,0 +1,50 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 文件下载
/// </summary>
[ApiDescriptionSettings(false)]
[Route("api/file")]
public class FileController : ControllerBase
{
/// <summary>
/// 下载wwwroot文件夹下的文件
/// </summary>
/// <param name="fileName">相对路径</param>
/// <returns></returns>
[HttpGet("download")]
public IActionResult Download(string fileName)
{
// Validate the fileName to prevent path injection
if (string.IsNullOrEmpty(fileName))
{
return BadRequest("Invalid file name.");
}
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", fileName);
if (!System.IO.File.Exists(filePath))
{
return NotFound();
}
var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Response.Headers.Append("Access-Control-Expose-Headers", "Content-Disposition");
return File(fileStream, "application/octet-stream", (fileName.Replace('/', '_')));
}
}

View File

@@ -0,0 +1,59 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Mapster;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 登录
/// </summary>
[ApiDescriptionSettings("ThingsGateway.OpenApi", Order = 200)]
[Description("登录")]
[Route("openapi/auth")]
[Authorize(AuthenticationSchemes = "Bearer")]
[RequestAudit]
[ApiController]
public class OpenApiController : ControllerBase
{
private readonly IAuthService _authService;
public OpenApiController(IAuthService authService)
{
_authService = authService;
}
[HttpPost("login")]
[DisplayName("登录")]
[AllowAnonymous]
public async Task<OpenApiLoginOutput> LoginAsync([FromBody] OpenApiLoginInput input)
{
var output = await _authService.LoginAsync(input.Adapt<LoginInput>(), false).ConfigureAwait(false);
var openApiLoginOutput = output.Adapt<OpenApiLoginOutput>();
return openApiLoginOutput;
}
[HttpPost("logout")]
[Authorize]
[DisplayName("登出")]
[IgnoreRolePermission]
public Task LogoutAsync()
{
return _authService.LoginOutAsync();
}
}

View File

@@ -0,0 +1,27 @@
//------------------------------------------------------------------------------
//此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
// ------------------------------------------------------------------------------
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace ThingsGateway.Admin.Application;
[Route("api/[controller]/[action]")]
[AllowAnonymous]
[ApiController]
public class TestController : ControllerBase
{
[HttpGet]
public void Test()
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}

View File

@@ -0,0 +1,59 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using BootstrapBlazor.Components;
using System.ComponentModel.DataAnnotations;
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
[SugarTable("sys_dict", TableDescription = "字典表")]
[Tenant(SqlSugarConst.DB_Admin)]
public class SysDict : BaseEntity
{
/// <summary>
/// 类型
///</summary>
[SugarColumn(ColumnDescription = "类型")]
[AutoGenerateColumn(Ignore = true, Filterable = true, Sortable = true)]
public virtual DictTypeEnum DictType { get; set; }
/// <summary>
/// 分类
///</summary>
[SugarColumn(ColumnDescription = "分类", Length = 200)]
[Required]
[AutoGenerateColumn(Searchable = true, Filterable = true, Sortable = true)]
public string Category { get; set; }
/// <summary>
/// 名称
///</summary>
[SugarColumn(ColumnDescription = "名称", Length = 200)]
[Required]
[AutoGenerateColumn(Searchable = true, Filterable = true, Sortable = true)]
public virtual string Name { get; set; }
/// <summary>
/// 代码
///</summary>
[SugarColumn(ColumnDescription = "代码", ColumnDataType = StaticConfig.CodeFirst_BigString)]
[Required]
[AutoGenerateColumn(Searchable = true, Filterable = true, Sortable = true)]
public virtual string Code { get; set; }
/// <summary>
/// 描述
///</summary>
[SugarColumn(ColumnDescription = "描述", Length = 200, IsNullable = true)]
public string Remark { get; set; }
}

View File

@@ -0,0 +1,136 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using BootstrapBlazor.Components;
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 操作日志表
///</summary>
[SugarTable("sys_operatelog", TableDescription = "操作日志表")]
[Tenant(SqlSugarConst.DB_Log)]
public class SysOperateLog
{
/// <summary>
/// 日志分类
///</summary>
[SugarColumn(ColumnDescription = "日志分类")]
[AutoGenerateColumn(Order = 1, Filterable = true, Sortable = true)]
public LogCateGoryEnum Category { get; set; }
/// <summary>
/// 日志名称
///</summary>
[SugarColumn(ColumnDescription = "日志名称", Length = 200)]
[AutoGenerateColumn(Order = 2, Filterable = true, Sortable = true)]
public string Name { get; set; }
/// <summary>
/// 类名称
///</summary>
[SugarColumn(ColumnDescription = "类名称", Length = 200)]
[AutoGenerateColumn(Visible = false, Filterable = true, Sortable = true)]
public string ClassName { get; set; }
/// <summary>
/// 方法名称
///</summary>
[SugarColumn(ColumnDescription = "方法名称", Length = 200)]
[AutoGenerateColumn(Visible = false, Filterable = true, Sortable = true)]
public string MethodName { get; set; }
/// <summary>
/// 请求参数
///</summary>
[SugarColumn(ColumnDescription = "请求参数", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)]
[AutoGenerateColumn(ShowTips = true, Filterable = true, Sortable = true)]
public string? ParamJson { get; set; }
/// <summary>
/// 请求方式
///</summary>
[SugarColumn(ColumnDescription = "请求方式", Length = 200, IsNullable = true)]
[AutoGenerateColumn(Visible = false, Filterable = true, Sortable = true)]
public string? ReqMethod { get; set; }
/// <summary>
/// 请求地址
///</summary>
[SugarColumn(ColumnDescription = "请求地址", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)]
[AutoGenerateColumn(Visible = false, Filterable = true, Sortable = true)]
public string? ReqUrl { get; set; }
/// <summary>
/// 返回结果
///</summary>
[SugarColumn(ColumnDescription = "返回结果", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)]
[AutoGenerateColumn(ShowTips = true, Filterable = true, Sortable = true)]
public string? ResultJson { get; set; }
/// <summary>
/// 具体消息
///</summary>
[SugarColumn(ColumnDescription = "具体消息", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)]
[AutoGenerateColumn(ShowTips = true, Filterable = true, Sortable = true)]
public string? ExeMessage { get; set; }
/// <summary>
/// 执行状态
///</summary>
[SugarColumn(ColumnDescription = "执行状态")]
[AutoGenerateColumn(Filterable = true, Sortable = true)]
public bool ExeStatus { get; set; }
/// <summary>
/// 操作账号
///</summary>
[SugarColumn(ColumnDescription = "操作账号", Length = 200, IsNullable = true)]
[AutoGenerateColumn(Filterable = true, Sortable = true)]
public string? OpAccount { get; set; }
/// <summary>
/// 操作浏览器
///</summary>
[SugarColumn(ColumnDescription = "操作浏览器", Length = 200)]
[AutoGenerateColumn(Visible = false, Filterable = true, Sortable = true)]
public string OpBrowser { get; set; }
/// <summary>
/// 操作ip
///</summary>
[SugarColumn(ColumnDescription = "操作ip", Length = 200)]
[AutoGenerateColumn(Filterable = true, Sortable = true)]
public string? OpIp { get; set; }
/// <summary>
/// 操作系统
///</summary>
[SugarColumn(ColumnDescription = "操作系统", Length = 200)]
[AutoGenerateColumn(Visible = false, Filterable = true, Sortable = true)]
public string OpOs { get; set; }
/// <summary>
/// 操作时间
///</summary>
[SugarColumn(ColumnDescription = "操作时间")]
[AutoGenerateColumn(Visible = true, DefaultSort = true, Sortable = true, DefaultSortOrder = SortOrder.Desc)]
public DateTime OpTime { get; set; }
/// <summary>
/// 验证Id
///</summary>
[SugarColumn(ColumnDescription = "验证Id")]
[IgnoreExcel]
[AutoGenerateColumn(Visible = false, Filterable = true, Sortable = true)]
public long VerificatId { get; set; }
}

View File

@@ -0,0 +1,81 @@
// ------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
// ------------------------------------------------------------------------------
using BootstrapBlazor.Components;
using System.ComponentModel.DataAnnotations;
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 组织表
///</summary>
[SugarTable("sys_org", TableDescription = "组织表")]
[Tenant(SqlSugarConst.DB_Admin)]
public class SysOrg : BaseEntity
{
/// <summary>
/// 父id
///</summary>
[SugarColumn(ColumnName = "ParentId", ColumnDescription = "父id")]
[AutoGenerateColumn(Ignore = true)]
public long ParentId { get; set; }
[SugarColumn(ColumnName = "ParentIdList", ColumnDescription = "父id列表", IsNullable = true, IsJson = true)]
[AutoGenerateColumn(Ignore = true)]
public List<long> ParentIdList { get; set; } = new List<long>();
/// <summary>
/// 主管ID
///</summary>
[SugarColumn(ColumnName = "DirectorId", ColumnDescription = "主管ID", IsNullable = true)]
[AutoGenerateColumn(Ignore = true)]
public long? DirectorId { get; set; }
/// <summary>
/// 名称
///</summary>
[SugarColumn(ColumnName = "Name", ColumnDescription = "名称", Length = 200)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
[Required]
public string Name { get; set; }
/// <summary>
/// 全称
///</summary>
[SugarColumn(ColumnName = "Names", ColumnDescription = "全称", Length = 500)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public string Names { get; set; }
/// <summary>
/// 编码
///</summary>
[SugarColumn(ColumnName = "Code", ColumnDescription = "编码", Length = 200)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public string Code { get; set; }
/// <summary>
/// 分类
///</summary>
[SugarColumn(ColumnName = "Category", ColumnDescription = "分类")]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public OrgEnum Category { get; set; }
[SugarColumn(ColumnName = "Status", ColumnDescription = "启用")]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public bool Status { get; set; } = true;
}

View File

@@ -0,0 +1,61 @@
// ------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
// ------------------------------------------------------------------------------
using BootstrapBlazor.Components;
using System.ComponentModel.DataAnnotations;
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 职位表
///</summary>
[SugarTable("sys_position", TableDescription = "职位表")]
[Tenant(SqlSugarConst.DB_Admin)]
public class SysPosition : BaseEntity
{
/// <summary>
/// 组织id
///</summary>
[SugarColumn(ColumnName = "OrgId", ColumnDescription = "组织id")]
[AutoGenerateColumn(Ignore = true)]
[MinValue(1)]
public virtual long OrgId { get; set; }
/// <summary>
/// 名称
///</summary>
[SugarColumn(ColumnName = "Name", ColumnDescription = "名称", Length = 200)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
[Required]
public virtual string Name { get; set; }
/// <summary>
/// 编码
///</summary>
[SugarColumn(ColumnName = "Code", ColumnDescription = "编码", Length = 200)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public string Code { get; set; }
[SugarColumn(ColumnName = "Status", ColumnDescription = "启用")]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public bool Status { get; set; } = true;
/// <summary>
/// 分类
///</summary>
[SugarColumn(ColumnName = "Category", ColumnDescription = "分类")]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public virtual PositionCategoryEnum Category { get; set; }
}

View File

@@ -0,0 +1,39 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 系统关系表
///</summary>
[SugarTable("sys_relation", TableDescription = "系统关系表")]
[Tenant(SqlSugarConst.DB_Admin)]
public class SysRelation : PrimaryKeyEntity
{
/// <summary>
/// 分类
///</summary>
[SugarColumn(ColumnDescription = "分类")]
public RelationCategoryEnum Category { get; set; }
/// <summary>
/// 对象ID
///</summary>
[SugarColumn(ColumnDescription = "对象ID")]
public long ObjectId { get; set; }
/// <summary>
/// 目标ID
///</summary>
[SugarColumn(ColumnDescription = "目标ID", IsNullable = true)]
public string? TargetId { get; set; }
}

View File

@@ -0,0 +1,101 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using BootstrapBlazor.Components;
using Microsoft.AspNetCore.Components.Routing;
using Newtonsoft.Json;
using System.ComponentModel.DataAnnotations;
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 系统资源表
///</summary>
[SugarTable("sys_resource", TableDescription = "系统资源表")]
[Tenant(SqlSugarConst.DB_Admin)]
public class SysResource : BaseEntity
{
/// <summary>
/// 父id
///</summary>
[SugarColumn(ColumnDescription = "父id")]
[AutoGenerateColumn(Ignore = true)]
public virtual long ParentId { get; set; } = 0;
/// <summary>
/// 模块
///</summary>
[SugarColumn(ColumnDescription = "模块")]
[AutoGenerateColumn(Ignore = true)]
public virtual long Module { get; set; }
/// <summary>
/// 标题
///</summary>
[SugarColumn(ColumnDescription = "标题", Length = 200)]
[Required]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true, Searchable = true)]
public virtual string Title { get; set; }
/// <summary>
/// 图标
///</summary>
[SugarColumn(ColumnDescription = "图标", Length = 200, IsNullable = true)]
[AutoGenerateColumn(Visible = true, Sortable = false, Filterable = false)]
public virtual string? Icon { get; set; }
/// <summary>
/// 编码
///</summary>
[SugarColumn(ColumnDescription = "编码", Length = 200)]
[Required]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true, IsVisibleWhenAdd = false, IsVisibleWhenEdit = false)]
public virtual string Code { get; set; }
/// <summary>
/// 分类
///</summary>
[SugarColumn(ColumnDescription = "分类")]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public ResourceCategoryEnum Category { get; set; } = ResourceCategoryEnum.Menu;
/// <summary>
/// 目标类型
///</summary>
[SugarColumn(ColumnDescription = "目标类型", IsNullable = true)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public virtual TargetEnum? Target { get; set; }
/// <summary>
/// 菜单匹配类型
/// </summary>
[SugarColumn(ColumnDescription = "菜单匹配类型", IsNullable = true)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public virtual NavLinkMatch? NavLinkMatch { get; set; }
/// <summary>
/// 路径
///</summary>
[SugarColumn(ColumnDescription = "路径", Length = 200, IsNullable = true)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true, Searchable = true)]
public virtual string Href { get; set; }
/// <summary>
/// 子节点
/// </summary>
[SugarColumn(IsIgnore = true)]
[AutoGenerateColumn(Ignore = true)]
public List<SysResource>? Children { get; set; }
}

View File

@@ -0,0 +1,94 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using BootstrapBlazor.Components;
using System.ComponentModel.DataAnnotations;
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 系统角色表
///</summary>
[SugarTable("sys_role", TableDescription = "系统角色表")]
[Tenant(SqlSugarConst.DB_Admin)]
public class SysRole : BaseEntity
{
/// <summary>
/// 名称
///</summary>
[SugarColumn(ColumnDescription = "名称", Length = 200)]
[Required]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public virtual string Name { get; set; }
/// <summary>
/// 编码
///</summary>
[SugarColumn(ColumnDescription = "编码", Length = 200)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public string Code { get; set; }
/// <summary>
/// 分类
///</summary>
[SugarColumn(ColumnDescription = "分类", IsNullable = false)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public virtual RoleCategoryEnum Category { get; set; }
/// <summary>
/// 组织id
///</summary>
[SugarColumn(ColumnName = "OrgId", ColumnDescription = "组织id", IsNullable = false)]
[AutoGenerateColumn(Ignore = true)]
public long OrgId { get; set; }
/// <summary>
/// 默认数据范围
///</summary>
[SugarColumn(ColumnName = "DefaultDataScope", ColumnDescription = "默认数据范围", IsJson = true, ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = false)]
[AutoGenerateColumn(Ignore = true)]
public virtual DefaultDataScope DefaultDataScope { get; set; } = new();
public override bool Equals(object? obj)
{
if (obj == null || !(obj is SysRole))
{
return false;
}
return Id == ((SysRole)obj).Id;
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
/// <summary>
/// 默认数据范围
/// </summary>
public class DefaultDataScope
{
/// <summary>
/// 数据范围
/// </summary>
public DataScopeEnum ScopeCategory { get; set; }
/// <summary>
/// 自定义机构范围列表
/// </summary>
public List<long> ScopeDefineOrgIdList { get; set; } = new List<long>();
}

View File

@@ -0,0 +1,253 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using BootstrapBlazor.Components;
using Mapster;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics.CodeAnalysis;
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 系统用户表
///</summary>
[SugarTable("sys_user", TableDescription = "系统用户表")]
[Tenant(SqlSugarConst.DB_Admin)]
public class SysUser : BaseEntity
{
/// <summary>
/// 头像
///</summary>
[SugarColumn(ColumnDescription = "头像", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)]
[AutoGenerateColumn(Visible = true, Sortable = false, Filterable = false)]
[AdaptIgnore]
public virtual string? Avatar { get; set; }
/// <summary>
/// 账号
///</summary>
[SugarColumn(ColumnDescription = "账号", Length = 200)]
[Required]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public virtual string Account { get; set; }
/// <summary>
/// 密码
///</summary>
[SugarColumn(ColumnDescription = "密码", ColumnDataType = StaticConfig.CodeFirst_BigString)]
[AutoGenerateColumn(Ignore = true)]
public string Password { get; set; }
/// <summary>
/// 状态
///</summary>
[SugarColumn(ColumnDescription = "状态")]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public bool Status { get; set; } = true;
/// <summary>
/// 手机
/// 这里使用了SM4自动加密解密
///</summary>
[SugarColumn(ColumnDescription = "手机", Length = 200, IsNullable = true)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public string? Phone { get; set; }
/// <summary>
/// 邮箱
///</summary>
[SugarColumn(ColumnDescription = "邮箱", Length = 200, IsNullable = true)]
[AutoGenerateColumn(Visible = true, Sortable = true, Filterable = true)]
public string? Email { get; set; }
/// <summary>
/// 上次登录ip
///</summary>
[SugarColumn(ColumnDescription = "上次登录ip", Length = 200, IsNullable = true)]
[AutoGenerateColumn(Visible = false, Sortable = true, Filterable = true, IsVisibleWhenAdd = false, IsVisibleWhenEdit = false)]
public string? LastLoginIp { get; set; }
/// <summary>
/// 上次登录设备
///</summary>
[SugarColumn(ColumnDescription = "上次登录设备", IsNullable = true)]
[AutoGenerateColumn(Visible = false, Sortable = true, Filterable = true, IsVisibleWhenAdd = false, IsVisibleWhenEdit = false)]
public string? LastLoginDevice { get; set; }
/// <summary>
/// 上次登录时间
///</summary>
[SugarColumn(ColumnDescription = "上次登录时间", IsNullable = true)]
[AutoGenerateColumn(Visible = false, Sortable = true, Filterable = true, IsVisibleWhenAdd = false, IsVisibleWhenEdit = false)]
public DateTime? LastLoginTime { get; set; }
/// <summary>
/// 上次登录地点
///</summary>
[SugarColumn(ColumnDescription = "上次登录地点", Length = 200, IsNullable = true)]
[AutoGenerateColumn(Visible = false, Sortable = true, Filterable = true, IsVisibleWhenAdd = false, IsVisibleWhenEdit = false)]
public string LastLoginAddress { get; set; }
/// <summary>
/// 最新登录ip
///</summary>
[SugarColumn(ColumnDescription = "最新登录ip", Length = 200, IsNullable = true)]
[AutoGenerateColumn(Visible = false, Sortable = true, Filterable = true, IsVisibleWhenAdd = false, IsVisibleWhenEdit = false)]
public string? LatestLoginIp { get; set; }
/// <summary>
/// 最新登录时间
///</summary>
[SugarColumn(ColumnDescription = "最新登录时间", IsNullable = true)]
[AutoGenerateColumn(Visible = false, Sortable = true, Filterable = true, IsVisibleWhenAdd = false, IsVisibleWhenEdit = false)]
public DateTime? LatestLoginTime { get; set; }
/// <summary>
/// 最新登录设备
///</summary>
[SugarColumn(ColumnDescription = "最新登录设备", IsNullable = true)]
[AutoGenerateColumn(Visible = false, Sortable = true, Filterable = true, IsVisibleWhenAdd = false, IsVisibleWhenEdit = false)]
public string? LatestLoginDevice { get; set; }
/// <summary>
/// 最新登录地点
///</summary>
[SugarColumn(ColumnDescription = "最新登录地点", Length = 200, IsNullable = true)]
[AutoGenerateColumn(Visible = false, Sortable = true, Filterable = true, IsVisibleWhenAdd = false, IsVisibleWhenEdit = false)]
public string LatestLoginAddress { get; set; }
/// <summary>
/// 机构id
///</summary>
[SugarColumn(ColumnName = "OrgId", ColumnDescription = "机构id", IsNullable = false)]
[AutoGenerateColumn(Ignore = true)]
public virtual long OrgId { get; set; }
/// <summary>
/// 职位id
///</summary>
[SugarColumn(ColumnName = "PositionId", ColumnDescription = "职位id", IsNullable = true)]
[AutoGenerateColumn(Ignore = true)]
[Required]
[NotNull]
public virtual long? PositionId { get; set; }
/// <summary>
/// 主管id
///</summary>
[SugarColumn(ColumnName = "DirectorId", ColumnDescription = "主管id", IsNullable = true)]
[AutoGenerateColumn(Ignore = true)]
public long? DirectorId { get; set; }
#region other
/// <summary>
/// 机构信息
/// </summary>
[SugarColumn(IsIgnore = true)]
[AutoGenerateColumn(Ignore = true)]
public string OrgName { get; set; }
/// <summary>
/// 机构信息全称
/// </summary>
[SugarColumn(IsIgnore = true)]
public string OrgNames { get; set; }
/// <summary>
/// 职位信息
/// </summary>
[SugarColumn(IsIgnore = true)]
public string PositionName { get; set; }
/// <summary>
/// 组织和机构ID列表,组织ID从上到下最后是职位
/// </summary>
[SugarColumn(IsIgnore = true, IsJson = true)]
[AutoGenerateColumn(Ignore = true)]
public List<long> OrgAndPosIdList { get; set; } = new List<long>();
/// <summary>
/// 主管信息
/// </summary>
[SugarColumn(IsIgnore = true)]
[AutoGenerateColumn(Ignore = true)]
public UserSelectorOutput DirectorInfo { get; set; }
#endregion
#region other
/// <summary>
/// 按钮码集合
/// </summary>
[SugarColumn(IsIgnore = true)]
[AutoGenerateColumn(Ignore = true)]
public Dictionary<string, List<string>> ButtonCodeList { get; set; } = new();
/// <summary>
/// 权限码集合
/// </summary>
[SugarColumn(IsIgnore = true)]
[AutoGenerateColumn(Ignore = true)]
public HashSet<string> PermissionCodeList { get; set; } = new();
/// <summary>
/// 角色ID集合
/// </summary>
[SugarColumn(IsIgnore = true)]
[AutoGenerateColumn(Ignore = true)]
public HashSet<long> RoleIdList { get; set; } = new();
/// <summary>
/// 机构及以下机构ID集合
/// </summary>
[SugarColumn(IsIgnore = true)]
[AutoGenerateColumn(Ignore = true)]
public HashSet<long> ScopeOrgChildList { get; set; }
/// <summary>
/// 模块集合
/// </summary>
[SugarColumn(IsIgnore = true)]
[AutoGenerateColumn(Ignore = true)]
public List<SysResource> ModuleList { get; set; } = new();
/// <summary>
/// 租户Id
/// </summary>
[SugarColumn(IsIgnore = true)]
[AutoGenerateColumn(Ignore = true)]
public long? TenantId { get; set; }
/// <summary>
/// 全局用戶
/// </summary>
[SugarColumn(IsIgnore = true)]
[AutoGenerateColumn(Ignore = true)]
public bool IsGlobal { get; set; }
#endregion other
}
/// <summary>
/// 数据范围类
/// </summary>
public class DataScope
{
/// <summary>
/// API接口
/// </summary>
public string ApiUrl { get; set; }
}

View File

@@ -0,0 +1,87 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using BootstrapBlazor.Components;
using ThingsGateway.List;
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 会话信息
/// </summary>
[SugarTable("verificatinfo", TableDescription = "验证缓存表")]
[Tenant(SqlSugarConst.DB_TokenCache)]
public class VerificatInfo : PrimaryIdEntity
{
/// <summary>
/// 客户端ID列表
/// </summary>
[AutoGenerateColumn(Ignore = true)]
[SugarColumn(ColumnDescription = "客户端ID列表", IsNullable = true, IsJson = true)]
public ConcurrentList<string> ClientIds { get; set; } = new();
/// <summary>
/// 验证Id
/// </summary>
[AutoGenerateColumn(Ignore = true)]
public long UserId { get; set; }
/// <summary>
/// 验证Id
/// </summary>
[AutoGenerateColumn(Filterable = true, Sortable = true)]
[SugarColumn(ColumnDescription = "Id", IsPrimaryKey = true)]
[IgnoreExcel]
public override long Id { get; set; }
/// <summary>
/// 登录IP
/// </summary>
[AutoGenerateColumn(Filterable = true, Sortable = true, Width = 200)]
public string LoginIp { get; set; }
/// <summary>
/// 登录时间
/// </summary>
[AutoGenerateColumn(Filterable = true, Sortable = true, Width = 200)]
public DateTime LoginTime { get; set; }
/// <summary>
/// 在线状态
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
[AutoGenerateColumn(Filterable = true, Sortable = true, Width = 120)]
[SugarColumn(IsIgnore = true)]
public bool Online => ClientIds.Count > 0;
/// <summary>
/// 过期时间
/// </summary>
[AutoGenerateColumn(Filterable = true, Sortable = true)]
public int Expire { get; set; }
/// <summary>
/// 超时时间
/// </summary>
[AutoGenerateColumn(Filterable = true, Sortable = true)]
public DateTime VerificatTimeout { get; set; }
/// <summary>
/// 登录设备
/// </summary>
[AutoGenerateColumn(Filterable = true, Sortable = true, Width = 100)]
public string Device { get; set; }
}

View File

@@ -0,0 +1,41 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
public enum DataScopeEnum
{
/// <summary>
/// 仅自己
/// </summary>
SCOPE_SELF,
/// <summary>
/// 所有
/// </summary>
SCOPE_ALL,
/// <summary>
/// 仅所属组织
/// </summary>
SCOPE_ORG,
/// <summary>
/// 所属组织及以下
/// </summary>
SCOPE_ORG_CHILD,
/// <summary>
/// 自定义
/// </summary>
SCOPE_ORG_DEFINE,
}

View File

@@ -0,0 +1,27 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 字典表类型
/// </summary>
public enum DictTypeEnum
{
/// <summary>
/// 系统使用
/// </summary>
System,
/// <summary>
/// 用户自定义
/// </summary>
Define,
}

View File

@@ -0,0 +1,19 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
public enum LogCateGoryEnum
{
Login,
Logout,
Operate,
Exception
}

View File

@@ -0,0 +1,17 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
public enum OrgEnum
{
DEPT,
COMPANY,
}

View File

@@ -0,0 +1,18 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
public enum PositionCategoryEnum
{
HIGH,
MIDDLE,
LOW,
}

View File

@@ -0,0 +1,25 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
public enum RelationCategoryEnum
{
UserHasRole,
UserHasResource,
UserHasPermission,
UserHasOpenApiPermission,
UserHasModule,
UserWorkbenchData,
RoleHasResource,
RoleHasPermission,
RoleHasOpenApiPermission,
RoleHasModule,
}

View File

@@ -0,0 +1,18 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
public enum ResourceCategoryEnum
{
Module,
Menu,
Button,
}

View File

@@ -0,0 +1,17 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
public enum RoleCategoryEnum
{
Global = 0,
Org = 2,
}

View File

@@ -0,0 +1,19 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
public enum TargetEnum
{
_self,
_blank,
_parent,
_top
}

View File

@@ -0,0 +1,55 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Microsoft.AspNetCore.Http;
using System.Net;
using System.Text.Json;
namespace Microsoft.AspNetCore.Builder;
[ThingsGateway.DependencyInjection.SuppressSniffer]
public static class ApplicationBuilderExtensions
{
public static IApplicationBuilder UseBootstrapBlazor(this IApplicationBuilder builder)
{
// 获得客户端 IP 地址
builder.UseWhen(context => context.Request.Path.StartsWithSegments("/ip.axd"), app => app.Run(async context =>
{
var ip = "";
var headers = context.Request.Headers;
if (headers.TryGetValue("X-Forwarded-For", out var value))
{
var ips = new List<string>();
foreach (var xf in value)
{
if (!string.IsNullOrEmpty(xf))
{
ips.Add(xf);
}
}
ip = string.Join(";", ips);
}
else
{
ip = context.Connection.RemoteIpAddress.ToIPv4String();
}
context.Response.Headers.TryAdd("Content-Type", new Microsoft.Extensions.Primitives.StringValues("application/json; charset=utf-8"));
await context.Response.WriteAsync(JsonSerializer.Serialize(new { Id = context.TraceIdentifier, Ip = ip })).ConfigureAwait(false);
}));
return builder;
}
public static string ToIPv4String(this IPAddress? address)
{
var ipv4Address = (address ?? IPAddress.IPv6Loopback).ToString();
return ipv4Address.StartsWith("::ffff:") ? (address ?? IPAddress.IPv6Loopback).MapToIPv4().ToString() : ipv4Address;
}
}

View File

@@ -0,0 +1,88 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Configuration;
using Microsoft.Net.Http.Headers;
namespace ThingsGateway.Admin.Application;
/// <inheritdoc/>
[ThingsGateway.DependencyInjection.SuppressSniffer]
public static class CacheExtensions
{
private static int? _age;
private static List<string>? _files;
public static void ProcessCache(this StaticFileResponseContext context, IConfiguration configuration)
{
if (context.CanCache(configuration, out var age))
{
context.Context.Response.Headers[HeaderNames.CacheControl] = $"public, max-age={age}";
}
}
private static bool CanCache(this StaticFileResponseContext context, IConfiguration configuration, out int age)
{
var ret = false;
age = 0;
var files = configuration.GetFiles();
if (files.Any(i => context.CanCache(i)))
{
ret = true;
age = configuration.GetAge();
}
return ret;
}
private static bool CanCache(this StaticFileResponseContext context, string file)
{
var ext = Path.GetExtension(context.File.PhysicalPath) ?? "";
bool ret = file.Equals(ext, StringComparison.OrdinalIgnoreCase);
if (ret && ext.Equals(".js", StringComparison.OrdinalIgnoreCase))
{
// process javascript file
ret = false;
if (context.Context.Request.QueryString.HasValue)
{
var paras = QueryHelpers.ParseQuery(context.Context.Request.QueryString.Value);
ret = paras.ContainsKey("v");
}
}
return ret;
}
private static int GetAge(this IConfiguration configuration)
{
_age ??= GetAge();
return _age.Value;
int GetAge()
{
var cacheSection = configuration.GetSection("Cache-Control");
return cacheSection.GetValue<int>("Max-Age", 1000 * 60 * 10);
}
}
private static List<string> GetFiles(this IConfiguration configuration)
{
_files ??= GetFiles();
return _files;
List<string> GetFiles()
{
var cacheSection = configuration.GetSection("Cache-Control");
return cacheSection.GetSection("Files").Get<List<string>>() ?? new();
}
}
}

View File

@@ -0,0 +1,15 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace System.Logging;
public class RequestAudit
{
}

View File

@@ -0,0 +1,10 @@

using ThingsGateway.DependencyInjection;
namespace System;
[SuppressSniffer, AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public sealed class RequestAuditAttribute : Attribute
{
}

View File

@@ -0,0 +1,101 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using System.Reflection;
namespace ThingsGateway.Admin.Application;
public class RequestAuditData
{
/// <summary>
/// 分类
/// </summary>
public string CateGory { get; set; }
/// <summary>
/// 客户端信息
/// </summary>
public UserAgent Client { get; set; }
/// <summary>
/// 请求方法POST/GET
/// </summary>
public string Method { get; set; }
/// <summary>
/// 操作名称
/// </summary>
public string Operation { get; set; }
/// <summary>
/// 请求地址
/// </summary>
public string Path { get; set; }
/// <summary>
/// 方法名称
/// </summary>
public string ActionName { get; set; }
/// <summary>
/// 认证信息
/// </summary>
public List<AuthorizationClaims> AuthorizationClaims { get; set; }
/// <summary>
/// 控制器名
/// </summary>
public string ControllerName { get; set; }
/// <summary>
/// 异常信息
/// </summary>
public LogException Exception { get; set; }
public long TimeOperationElapsedMilliseconds { get; set; }
/// <summary>
/// 服务端
/// </summary>
public string LocalIPv4 { get; set; }
/// <summary>
/// 日志时间
/// </summary>
public DateTimeOffset LogDateTime { get; set; }
/// <summary>
/// 参数列表
/// </summary>
public List<Parameters> Parameters { get; set; }
/// <summary>
/// 客户端IPV4地址
/// </summary>
public string RemoteIPv4 { get; set; }
/// <summary>
/// 请求地址
/// </summary>
public string RequestUrl { get; set; }
/// <summary>
/// 返回信息
/// </summary>
public object ReturnInformation { get; set; }
/// <summary>
/// 验证错误信息
/// </summary>
public Validation Validation { get; set; }
public MethodInfo MethodInfo { get; set; }
}

View File

@@ -0,0 +1,301 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System.Diagnostics;
using System.Logging;
using ThingsGateway.FriendlyException;
using ThingsGateway.Logging;
using ThingsGateway.NewLife.Json.Extension;
using ThingsGateway.UnifyResult;
namespace ThingsGateway.Admin.Application;
public class RequestAuditFilter : IAsyncActionFilter, IOrderedFilter
{
private const int FilterOrder = -3000;
public int Order => FilterOrder;
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var timeOperation = Stopwatch.StartNew();
var resultContext = await next().ConfigureAwait(false);
// 计算接口执行时间
timeOperation.Stop();
var controllerActionDescriptor = (context.ActionDescriptor as ControllerActionDescriptor);
// 获取动作方法描述器
var actionMethod = controllerActionDescriptor?.MethodInfo;
// 处理 Blazor Server
if (actionMethod == null)
{
return;
}
// 排除 WebSocket 请求处理
if (context.HttpContext.IsWebSocketRequest())
{
return;
}
// 如果贴了 [SuppressMonitor] 特性则跳过
if (actionMethod.IsDefined(typeof(SuppressRequestAuditAttribute), true)
|| actionMethod.DeclaringType.IsDefined(typeof(SuppressRequestAuditAttribute), true))
{
return;
}
// 只有方法贴有特性才进行审计
if (
!actionMethod.DeclaringType.IsDefined(typeof(RequestAuditAttribute), true)
&&
!actionMethod.IsDefined(typeof(RequestAuditAttribute), true))
{
return;
}
var logData = new RequestAuditData();
logData.TimeOperationElapsedMilliseconds = timeOperation.ElapsedMilliseconds;
var resultHttpContext = (resultContext as FilterContext).HttpContext;
// 获取 HttpContext 和 HttpRequest 对象
var httpContext = context.HttpContext;
var httpRequest = httpContext.Request;
// 获取客户端 Ipv4 地址
var remoteIPv4 = httpContext.GetRemoteIpAddressToIPv4();
logData.RemoteIPv4 = remoteIPv4;
var requestUrl = Uri.UnescapeDataString(httpRequest.GetRequestUrlAddress());
logData.RequestUrl = requestUrl;
object returnValue = null;
Type finalReturnType;
var result = resultContext.Result as IActionResult;
// 解析返回值
if (UnifyContext.CheckVaildResult(result, out var data))
{
returnValue = data;
finalReturnType = data?.GetType();
}
// 处理文件类型
else if (result is FileResult fresult)
{
returnValue = new
{
FileName = fresult.FileDownloadName,
fresult.ContentType,
Length = fresult is FileContentResult cresult ? (object)cresult.FileContents.Length : null
};
finalReturnType = fresult?.GetType();
}
else finalReturnType = result?.GetType();
logData.ReturnInformation = returnValue;
//获取客户端信息
var client = App.GetService<IAppService>().UserAgent;
//操作名称默认是控制器名加方法名,自定义操作名称要在action上加Description特性
var option = $"{controllerActionDescriptor.ControllerName}/{controllerActionDescriptor.ActionName}";
var desc = App.CreateLocalizerByType(controllerActionDescriptor.ControllerTypeInfo.AsType())[actionMethod.Name];
//获取特性
logData.CateGory = desc.Value;//传操作名称
logData.Operation = desc.Value;//传操作名称
logData.Client = client;
logData.Path = httpContext.Request.Path.Value;//请求地址
logData.Method = httpContext.Request.Method;//请求方法
logData.MethodInfo = actionMethod;//请求方法
logData.ControllerName = controllerActionDescriptor.ControllerName;
logData.ActionName = controllerActionDescriptor.ActionName;
logData.AuthorizationClaims = new();
// 获取授权用户
var user = httpContext.User;
foreach (var claim in user.Claims)
{
logData.AuthorizationClaims.Add(new AuthorizationClaims
{
Type = claim.Type,
Value = claim.Value,
});
}
logData.LocalIPv4 = httpContext.GetLocalIpAddressToIPv4();
logData.LogDateTime = DateTimeOffset.Now;
var parameterValues = context.ActionArguments;
logData.Parameters = new();
var parameters = actionMethod.GetParameters();
foreach (var parameter in parameters)
{
// 判断是否禁用记录特定参数
if (parameter.IsDefined(typeof(SuppressRequestAuditAttribute), false)) continue;
// 排除标记 [FromServices] 的解析
if (parameter.IsDefined(typeof(FromServicesAttribute), false)) continue;
var name = parameter.Name;
var parameterType = parameter.ParameterType;
_ = parameterValues.TryGetValue(name, out var value);
var par = new Parameters()
{
Name = name,
};
logData.Parameters.Add(par);
object rawValue = default;
// 文件类型参数
if (value is IFormFile || value is List<IFormFile>)
{
// 单文件
if (value is IFormFile formFile)
{
var fileSize = Math.Round(formFile.Length / 1024D);
rawValue = new
{
name = formFile.Name,
fileName = formFile.FileName,
length = formFile.Length,
contentType = formFile.ContentType
};
}
// 多文件
else if (value is List<IFormFile> formFiles)
{
var rawValues1 = new List<object>();
for (var i = 0; i < formFiles.Count; i++)
{
var file = formFiles[i];
var size = Math.Round(file.Length / 1024D);
var rawValue1 = new
{
name = file.Name,
fileName = file.FileName,
length = file.Length,
contentType = file.ContentType
};
rawValues1.Add(rawValue1);
}
rawValue = rawValues1;
}
}
// 处理 byte[] 参数类型
else if (value is byte[] byteArray)
{
rawValue = new
{
length = byteArray.Length,
};
}
// 处理基元类型,字符串类型和空值
else if (parameterType.IsPrimitive || value is string || value == null)
{
rawValue = value;
}
// 其他类型统一进行序列化
else
{
rawValue = value;
}
par.Value = rawValue;
}
// 获取异常对象情况
Exception exception = resultContext.Exception;
if (exception is AppFriendlyException friendlyException)
{
logData.Validation = new();
logData.Validation.Message = friendlyException.Message;
}
else if (exception != null)
{
logData.Exception = new();
logData.Exception.Message = exception.Message;
logData.Exception.StackTrace = exception.StackTrace;
logData.Exception.Type = HandleGenericType(exception.GetType());
}
// 创建日志记录器
var logger = httpContext.RequestServices.GetRequiredService<ILogger<RequestAudit>>();
var logContext = new LogContext();
logContext.Set(nameof(RequestAuditData), logData);
// 设置日志上下文
using var scope = logger.ScopeContext(logContext);
if (exception == null)
{
logger.Log(LogLevel.Information, $"{logData.Method}:{logData.Path}-{logData.Operation}");
}
else
{
logger.Log(LogLevel.Warning, $"{logData.Method}:{logData.Path}-{logData.Operation}{Environment.NewLine}{logData.Exception?.ToSystemTextJsonString()}{Environment.NewLine}{logData.Validation?.ToSystemTextJsonString()}");
}
}
/// <summary>
/// 处理泛型类型转字符串打印问题
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
private static string HandleGenericType(Type type)
{
if (type == null) return string.Empty;
var typeName = type.FullName ?? (!string.IsNullOrEmpty(type.Namespace) ? type.Namespace + "." : string.Empty) + type.Name;
// 处理泛型类型问题
if (type.IsConstructedGenericType)
{
var prefix = type.GetGenericArguments()
.Select(genericArg => HandleGenericType(genericArg))
.Aggregate((previous, current) => previous + ", " + current);
typeName = typeName.Split('`').First() + "<" + prefix + ">";
}
return typeName;
}
}

View File

@@ -0,0 +1,10 @@

using ThingsGateway.DependencyInjection;
namespace System;
[SuppressSniffer, AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public sealed class SuppressRequestAuditAttribute : Attribute
{
}

View File

@@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<Rougamo />
</Weavers>

View File

@@ -0,0 +1,11 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
global using ThingsGateway.NewLife.Extension;

View File

@@ -0,0 +1,60 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using BootstrapBlazor.Components;
using ThingsGateway.NewLife;
namespace ThingsGateway.Admin.Application;
/// <inheritdoc/>
public class HardwareInfo
{
/// <summary>
/// 当前磁盘信息
/// </summary>
public DriveInfo DriveInfo { get; set; }
/// <summary>
/// 硬件信息获取
/// </summary>
public MachineInfo? MachineInfo { get; set; }
/// <summary>
/// 主机环境
/// </summary>
public string Environment { get; set; }
/// <summary>
/// NET框架
/// </summary>
public string FrameworkDescription { get; set; }
/// <summary>
/// 系统架构
/// </summary>
public string OsArchitecture { get; set; }
/// <summary>
/// 唯一编码
/// </summary>
public string UUID { get; set; }
/// <summary>
/// 进程占用内存
/// </summary>
[AutoGenerateColumn(Ignore = true)]
public int WorkingSet { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public string UpdateTime { get; set; }
}

View File

@@ -0,0 +1,162 @@
// ------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
// ------------------------------------------------------------------------------
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System.Runtime.InteropServices;
using ThingsGateway.Extension;
using ThingsGateway.NewLife;
using ThingsGateway.NewLife.Caching;
using ThingsGateway.NewLife.Threading;
using ThingsGateway.Schedule;
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 获取硬件信息作业任务
/// </summary>
[JobDetail("hardware_log", Description = "获取硬件信息", GroupName = "Hardware", Concurrent = false)]
[PeriodSeconds(30, TriggerId = "trigger_hardware", Description = "获取硬件信息", RunOnStart = true)]
public class HardwareJob : IJob, IHardwareJob
{
private readonly ILogger _logger;
private readonly IStringLocalizer _localizer;
/// <inheritdoc/>
public HardwareJob(ILogger<HardwareJob> logger, IStringLocalizer<HardwareJob> localizer, IOptions<HardwareInfoOptions> options)
{
_logger = logger;
_localizer = localizer;
HardwareInfoOptions = options.Value;
}
#region
/// <summary>
/// 运行信息获取
/// </summary>
public HardwareInfo HardwareInfo { get; } = new();
/// <inheritdoc/>
public HardwareInfoOptions HardwareInfoOptions { get; private set; }
#endregion
private MemoryCache MemoryCache = new() { };
private const string CacheKey = "HistoryHardwareInfo";
/// <inheritdoc/>
public async Task<List<HistoryHardwareInfo>> GetHistoryHardwareInfos()
{
var historyHardwareInfos = MemoryCache.Get<List<HistoryHardwareInfo>>(CacheKey);
if (historyHardwareInfos == null)
{
using var db = DbContext.GetDB<HistoryHardwareInfo>(); ;
historyHardwareInfos = await db.Queryable<HistoryHardwareInfo>().Where(a => a.Date > DateTime.Now.AddDays(-3)).Take(1000).ToListAsync().ConfigureAwait(false);
MemoryCache.Set(CacheKey, historyHardwareInfos);
}
return historyHardwareInfos;
}
private bool error = false;
private DateTime hisInsertTime = default;
private SqlSugarClient _db = DbContext.GetDB<HistoryHardwareInfo>();
public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
{
if (HardwareInfoOptions.Enable)
{
try
{
if (HardwareInfo.MachineInfo == null)
{
MachineInfo.Register();
HardwareInfo.MachineInfo = MachineInfo.Current;
string currentPath = Directory.GetCurrentDirectory();
DriveInfo drive = new(Path.GetPathRoot(currentPath));
HardwareInfoOptions.DaysAgo = Math.Min(Math.Max(HardwareInfoOptions.DaysAgo, 1), 7);
if (HardwareInfoOptions.HistoryInterval < 60000) HardwareInfoOptions.HistoryInterval = 60000;
HardwareInfo.DriveInfo = drive;
HardwareInfo.OsArchitecture = Environment.OSVersion.Platform.ToString() + " " + RuntimeInformation.OSArchitecture.ToString(); // 系统架构
HardwareInfo.FrameworkDescription = RuntimeInformation.FrameworkDescription; // NET框架
HardwareInfo.Environment = App.HostEnvironment.IsDevelopment() ? "Development" : "Production";
HardwareInfo.UUID = HardwareInfo.MachineInfo.UUID;
HardwareInfo.UpdateTime = TimerX.Now.ToDefaultDateTimeFormat();
}
}
catch
{
}
try
{
HardwareInfo.MachineInfo.Refresh();
HardwareInfo.UpdateTime = TimerX.Now.ToDefaultDateTimeFormat();
HardwareInfo.WorkingSet = (Environment.WorkingSet / 1024.0 / 1024.0).ToInt();
error = false;
}
catch (Exception ex)
{
if (!error)
_logger.LogWarning(ex, "Get Hardwareinfo Fail");
error = true;
}
try
{
if (HardwareInfoOptions.Enable)
{
if (DateTime.Now > hisInsertTime.Add(TimeSpan.FromMilliseconds(HardwareInfoOptions.HistoryInterval)))
{
hisInsertTime = DateTime.Now;
{
var his = new HistoryHardwareInfo()
{
Date = TimerX.Now,
DriveUsage = (100 - (HardwareInfo.DriveInfo.TotalFreeSpace * 100.00 / HardwareInfo.DriveInfo.TotalSize)).ToInt(),
Battery = (HardwareInfo.MachineInfo.Battery * 100).ToInt(),
MemoryUsage = (HardwareInfo.WorkingSet),
CpuUsage = (HardwareInfo.MachineInfo.CpuRate * 100).ToInt(),
Temperature = (HardwareInfo.MachineInfo.Temperature).ToInt(),
};
await _db.Insertable(his).ExecuteCommandAsync(stoppingToken).ConfigureAwait(false);
MemoryCache.Remove(CacheKey);
}
var sevenDaysAgo = TimerX.Now.AddDays(-HardwareInfoOptions.DaysAgo);
//删除特定信息
var result = await _db.Deleteable<HistoryHardwareInfo>(a => a.Date <= sevenDaysAgo).ExecuteCommandAsync(stoppingToken).ConfigureAwait(false);
if (result > 0)
{
MemoryCache.Remove(CacheKey);
}
}
}
error = false;
}
catch (OperationCanceledException)
{
}
catch (Exception ex)
{
if (!error)
_logger.LogWarning(ex, "Get Hardwareinfo Fail");
error = true;
}
}
}
}

View File

@@ -0,0 +1,43 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <inheritdoc/>
[SugarTable("his_hardwareinfo", TableDescription = "硬件信息历史表")]
[Tenant(SqlSugarConst.DB_HardwareInfo)]
public class HistoryHardwareInfo
{
/// <inheritdoc/>
[SugarColumn(ColumnDescription = "磁盘使用率")]
public int DriveUsage { get; set; }
/// <inheritdoc/>
[SugarColumn(ColumnDescription = "内存")]
public int MemoryUsage { get; set; }
/// <inheritdoc/>
[SugarColumn(ColumnDescription = "CPU使用率")]
public int CpuUsage { get; set; }
/// <inheritdoc/>
[SugarColumn(ColumnDescription = "温度")]
public int Temperature { get; set; }
/// <inheritdoc/>
[SugarColumn(ColumnDescription = "电池")]
public int Battery { get; set; }
/// <inheritdoc/>
[SugarColumn(ColumnDescription = "时间")]
public DateTime Date { get; set; }
}

View File

@@ -0,0 +1,18 @@
// ------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
// ------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
public interface IHardwareJob
{
HardwareInfo HardwareInfo { get; }
HardwareInfoOptions HardwareInfoOptions { get; }
Task<List<HistoryHardwareInfo>> GetHistoryHardwareInfos();
}

View File

@@ -0,0 +1,76 @@
// ------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
// ------------------------------------------------------------------------------
using ThingsGateway.Schedule;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 作业持久化(数据库)
/// </summary>
public class JobPersistence : IJobPersistence
{
/// <summary>
/// 作业调度服务启动时
/// </summary>
/// <param name="stoppingToken"></param>
/// <returns></returns>
/// <exception cref="NotSupportedException"></exception>
public async Task<IEnumerable<SchedulerBuilder>> PreloadAsync(CancellationToken stoppingToken)
{
await Task.CompletedTask.ConfigureAwait(false);
// 获取所有定义的作业
var allJobs = App.EffectiveTypes.ScanToBuilders().ToList();
return allJobs;
}
/// <summary>
/// 作业计划初始化通知
/// </summary>
/// <param name="builder"></param>
/// <param name="stoppingToken"></param>
/// <returns></returns>
public Task<SchedulerBuilder> OnLoadingAsync(SchedulerBuilder builder, CancellationToken stoppingToken)
{
return Task.FromResult(builder);
}
/// <summary>
/// 作业计划Scheduler的JobDetail变化时
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task OnChangedAsync(PersistenceContext context)
{
await Task.CompletedTask.ConfigureAwait(false);
}
/// <summary>
/// 作业计划Scheduler的触发器Trigger变化时
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task OnTriggerChangedAsync(PersistenceTriggerContext context)
{
await Task.CompletedTask.ConfigureAwait(false);
}
/// <summary>
/// 作业触发器运行记录
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task OnExecutionRecordAsync(PersistenceExecutionRecordContext context)
{
await Task.CompletedTask.ConfigureAwait(false);
}
}

View File

@@ -0,0 +1,34 @@
// ------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
// ------------------------------------------------------------------------------
using ThingsGateway.Schedule;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 清理日志作业任务
/// </summary>
[JobDetail("job_log", Description = "清理操作日志", GroupName = "Log", Concurrent = false)]
[Daily(TriggerId = "trigger_log", Description = "清理操作日志", RunOnStart = true)]
public class LogJob : IJob
{
public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
{
var daysAgo = App.GetOptions<AdminLogOptions>()?.OperateLogDaysAgo ?? 7;
await LogJob.DeleteSysOperateLog(daysAgo, stoppingToken).ConfigureAwait(false);
}
private static async Task DeleteSysOperateLog(int daysAgo, CancellationToken stoppingToken)
{
using var db = DbContext.GetDB<SysOperateLog>();
var time = DateTime.Now.AddDays(-daysAgo);
await db.DeleteableWithAttr<SysOperateLog>().Where(u => u.OpTime < time).ExecuteCommandAsync(stoppingToken).ConfigureAwait(false); // 删除操作日志
}
}

View File

@@ -0,0 +1,402 @@
{
"ThingsGateway.Admin.Application.AppConfig": {
"LoginPolicy": "LoginPolicy",
"PagePolicy": "PagePolicy",
"PasswordPolicy": "PasswordPolicy",
"WebsitePolicy": "WebsitePolicy"
},
"ThingsGateway.Admin.Application.AuthController": {
"AuthController": "Login API",
"LoginAsync": "Login",
"LogoutAsync": "Logout"
},
"ThingsGateway.Admin.Application.AuthService": {
"AuthErrorMax": "Account password error, will be locked for {1} minutes after exceeding {0} times, error count {2}",
"MustDesc": "Password needs to be encrypted with DESC before passing",
"OrgDisable": "The affiliated company/department has been deactivated, please contact the administrator",
"PasswordError": "Too many password errors, please try again in {0} minutes",
"SingleLoginWarn": "Your account is logged in elsewhere",
"TenantNull": "The tenant does not exist",
"UserDisable": "Account {0} has been disabled",
"UserNoModule": "This account has not been assigned a module. Please contact the administrator",
"UserNull": "User {0} does not exist"
},
"ThingsGateway.Admin.Application.BaseDataEntity": {
"CreateOrgId": "CreateOrgId"
},
"ThingsGateway.Admin.Application.BaseEntity": {
"CreateTime": "CreateTime",
"CreateUser": "CreateUser",
"SortCode": "SortCode",
"UpdateTime": "UpdateTime",
"UpdateUser": "UpdateUser"
},
"ThingsGateway.Admin.Application.BlazorAuthenticationHandler": {
"UserExpire": "User expired, please login again"
},
"ThingsGateway.Admin.Application.DataScopeEnum": {
"SCOPE_ALL": "All",
"SCOPE_ORG": "OnlyOrg",
"SCOPE_ORG_CHILD": "OrgChild",
"SCOPE_ORG_DEFINE": "Define",
"SCOPE_SELF": "Self"
},
"ThingsGateway.Admin.Application.DefaultDataScope": {
"ScopeCategory": "DataScope",
"ScopeDefineOrgIdList": "DefineOrgList"
},
"ThingsGateway.Admin.Application.DictTypeEnum": {
"Define": "Business",
"System": "System"
},
"ThingsGateway.Admin.Application.FileService": {
"FileLengthError": "File size cannot exceed {0} M",
"FileNullError": "File cannot be empty",
"FileTypeError": "Not supported format {0}"
},
"ThingsGateway.Admin.Application.HardwareInfo": {
"Environment": "HostEnvironment",
"FrameworkDescription": ".NETFramework",
"OsArchitecture": "System Architecture",
"UpdateTime": "UpdateTime",
"UUID": "UUID"
},
"ThingsGateway.Admin.Application.HardwareJob": {
"GetHardwareInfoFail": "Get Hardwareinfo Fail"
},
"ThingsGateway.Admin.Application.HistoryHardwareInfo": {
"Battery": "Battery",
"CpuUsage": "CPU Usage",
"DriveUsage": "Disk Usage",
"MemoryUsage": "Memory",
"Temperature": "Temperature"
},
"ThingsGateway.Admin.Application.LogCateGoryEnum": {
"Exception": "Exception",
"Login": "Login",
"Logout": "Logout",
"Operate": "Operation"
},
"ThingsGateway.Admin.Application.LogEnum": {
"FAIL": "Fail",
"SUCCESS": "Success"
},
"ThingsGateway.Admin.Application.LoginInput": {
"Account": "Account",
"Account.Required": "{0} is required",
"Password": "Password",
"Password.Required": "{0} is required"
},
"ThingsGateway.Admin.Application.LoginPolicy": {
"ErrorCount": "Login error count lock threshold",
"ErrorCount.MinValue": "{0} value is too small",
"ErrorLockTime": "Login error lock duration (min)",
"ErrorLockTime.MinValue": "{0} value is too small",
"ErrorResetTime": "Login error count expiration duration (min)",
"ErrorResetTime.MinValue": "{0} value is too small",
"SingleOpen": "Single user login switch",
"VerificatExpireTime": "Login expiration time (min)",
"VerificatExpireTime.MinValue": "{0} value is too small"
},
"ThingsGateway.Admin.Application.LogoutInput": {
"VerificatId.Required": "{0} is required"
},
"ThingsGateway.Admin.Application.OpenApiAuthController": {
"LoginAsync": "Login",
"LogoutAsync": "Logout",
"OpenApiAuthController": "Login API"
},
"ThingsGateway.Admin.Application.OperateLogPageInput": {
"Account": "Account",
"Category": "Category",
"SearchDate": "SearchDate"
},
"ThingsGateway.Admin.Application.OperDescAttribute": {
"ChangeParentResource": "ChangeParentResource",
"CopyOrg": "Copy Organization",
"CopyResource": "CopyResource",
"DeleteDict": "Delete dictionary",
"DeleteOperLog": "Delete operation log",
"DeleteOrg": "Delete Organization",
"DeletePosition": "Delete Position",
"DeleteResource": "Delete resource",
"DeleteRole": "Delete role",
"DeleteuSER": "Delete user",
"EditLoginPolicy": "Modify login policy",
"EditPagePolicy": "Modify page policy",
"EditPasswordPolicy": "Modify password policy",
"EditWebsitePolicy": "Modify website settings",
"ExitSession": "Force session off",
"ExitVerificat": "Force token off",
"ExportOperLog": "Export operation log",
"GrantApi": "GrantApi",
"GrantResource": "GrantResource",
"GrantRole": "GrantRole",
"GrantUser": "GrantUser",
"NoPermission": "No Permission",
"ResetPassword": "Reset pw",
"RoleGrantApiPermission": "Role grant OpenApi",
"RoleGrantResource": "Role grant resource",
"RoleGrantUser": "Role grant user",
"SaveDict": "Modify dictionary",
"SaveOrg": "Save Organization",
"SavePosition": "Save Position",
"SaveResource": "Modify resource",
"SaveRole": "Modify role",
"SaveUser": "Modify user",
"UpdatePassword": "Update personal password",
"UpdateUserInfo": "Update personal information",
"UserGrantApiPermission": "User grant OpenApi",
"UserGrantResource": "User grant resource",
"UserGrantRole": "User grant role",
"WorkbenchInfo": "Update personal workbench"
},
"ThingsGateway.Admin.Application.OrgEnum": {
"COMPANY": "Company",
"DEPT": "Dept"
},
"ThingsGateway.Admin.Application.PagePolicy": {
"Razor": "Default homepage",
"Shortcuts": "Default shortcuts"
},
"ThingsGateway.Admin.Application.PasswordPolicy": {
"DefaultPassword": "Default user password",
"DefaultPassword.Required": "{0} is required",
"PasswordContainChar": "Contain special characters",
"PasswordContainLower": "Contain lowercase letters",
"PasswordContainNum": "Contain numbers",
"PasswordContainUpper": "Contain uppercase letters",
"PasswordMinLen": "Minimum password length",
"PasswordMinLen.MinValue": "{0} value is too small"
},
"ThingsGateway.Admin.Application.PositionCategoryEnum": {
"HIGH": "High",
"LOW": "Low",
"MIDDLE": "Middle"
},
"ThingsGateway.Admin.Application.ResourceCategoryEnum": {
"Button": "Button",
"Menu": "Menu",
"Module": "Module"
},
"ThingsGateway.Admin.Application.ResourceTableSearchModel": {
"Href": "Path",
"Module": "Module",
"Title": "Title"
},
"ThingsGateway.Admin.Application.RoleCategoryEnum": {
"Global": "Global",
"Org": "Org"
},
"ThingsGateway.Admin.Application.SessionOutput": {
"Account": "Account",
"LatestLoginIp": "Latest login IP",
"LatestLoginTime": "Latest login time",
"Online": "Online status",
"VerificatCount": "Token count"
},
"ThingsGateway.Admin.Application.SysDict": {
"Category": "Category",
"Category.Required": "{0} is required",
"Code": "Code",
"Code.Required": "{0} is required",
"DemoCanotUpdateWebsitePolicy": "DEMO environment does not allow modifying website settings",
"DictDup": "Duplicate configuration exists, category {0}, name {1}",
"Name": "Name",
"Name.Required": "{0} is required",
"Remark": "Remark"
},
"ThingsGateway.Admin.Application.SysOperateLog": {
"Category": "Category",
"ClassName": "ClassName",
"ExeMessage": "ExeMessage",
"ExeStatus": "ExeStatus",
"MethodName": "MethodName",
"Name": "Name",
"OpAccount": "OpAccount",
"OpBrowser": "OpBrowser",
"OpIp": "OpIp",
"OpOs": "OpOs",
"OpTime": "OpTime",
"ParamJson": "ParamJson",
"ReqMethod": "RequestMethod",
"ReqUrl": "RequestUrl",
"ResultJson": "ResultJson",
"VerificatId": "VerificatId"
},
"ThingsGateway.Admin.Application.SysOrg": {
"CanotContainsSelf": "Cannot contain itself",
"Category": "Category",
"Category.Required": "{0} is a required field",
"Code": "Code",
"Code.Required": "{0} is a required field",
"CodeDup": "Duplicate code {0} exists",
"DeletePositionFirst": "Please remove the positions under the organization first",
"DeleteRoleFirst": "Please remove the roles under the organization first",
"DeleteUserFirst": "Please remove the users under the organization first",
"DirectorId": "Director",
"Dup": "Duplicate organization exists with Category {0} and Name {1}",
"Name": "Name",
"Name.Required": "{0} is a required field",
"NameDup": "Duplicate name {0} exists",
"Names": "Names",
"ParentChoiceSelf": "Parent cannot be itself",
"ParentId": "ParentOrg",
"ParentNull": "Parent does not exist {0}",
"Remark": "Remarks",
"RootOrg": "Unable to create top-level organization",
"Status": "Status",
"TargetNameDup": "Target node has duplicate name {0}"
},
"ThingsGateway.Admin.Application.SysOrgCopyInput": {
"ContainsChild": "ContainsChild",
"ContainsPosition": "ContainsPosition",
"TargetId": "Target"
},
"ThingsGateway.Admin.Application.SysPosition": {
"CanotContainsSelf": "Cannot contain itself",
"Category": "Category",
"Category.Required": "{0} is a required field",
"Code": "Code",
"Code.Required": "{0} is a required field",
"CodeDup": "Duplicate code {0} exists",
"DeleteUserFirst": "Please remove the users under the position first",
"Dup": "Duplicate position exists with Category {0} and Name {1}",
"Name": "Name",
"Name.Required": "{0} is a required field",
"NameDup": "Duplicate name {0} exists",
"OrgId": "Organization",
"OrgId.MinValue": "{0} is a required field",
"ParentChoiceSelf": "Parent cannot be itself",
"ParentNull": "Parent does not exist {0}",
"Remark": "Remarks",
"Status": "Status",
"TargetNameDup": "Target node has duplicate name {0}"
},
"ThingsGateway.Admin.Application.SysResource": {
"CanotDeleteSystemResource": "Cannot delete system resource {0}",
"Category": "Category",
"Code": "Code",
"Href": "Path",
"Href.Required": "{0} is required",
"Icon": "Icon",
"Module": "Module",
"ModuleIdDiff": "Module is inconsistent with parent menu",
"NavLinkMatch": "NavLinkMatch",
"NotFoundResource": "System exception, menu not found",
"ParentId": "Parent",
"ResourceDup": "Duplicate name {0} exists",
"ResourceMenuHrefNotNull": "Menu href cannot null",
"ResourceParentChoiceSelf": "Parent cannot choose itself",
"ResourceParentNull": "Parent does not exist {0}",
"Target": "Target",
"Title": "Title",
"Title.Required": "{0} is required"
},
"ThingsGateway.Admin.Application.SysRole": {
"CannotRoleScopeAll": "Organization role cannot select global data scope",
"CanotDeleteAdmin": "Cannot delete built-in super admin role",
"CanotEditAdmin": "Cannot edit super admin role",
"CanotGrantAdmin": "Cannot assign admins roles",
"Category": "Category",
"Code": "Code",
"CodeDup": "Duplicate code exists: {0}",
"Global": "Global",
"Name": "Name",
"Name.Required": "{0} is required",
"NameDup": "Duplicate role name {0}",
"OrgId": "Org",
"OrgNotNull": "Organization cannot be null",
"SameOrgNameDup": "Duplicate role name exists: {0}",
"Status": "Status"
},
"ThingsGateway.Admin.Application.SysUser": {
"Account": "Account",
"Account.Required": "Account.Required",
"AccountDup": "Duplicate account {0} exists",
"Avatar": "Avatar",
"CanotDeleteAdminUser": "Cannot delete built-in super admin user",
"CanotDeleteSelf": "Cannot delete yourself",
"CanotEditAdminUser": "Cannot edit super admin user",
"CanotGrantAdmin": "Cannot assign admins roles",
"CheckSelf": "Prohibit {0} yourself",
"ConfirmPasswordDiff": "Passwords entered twice are inconsistent",
"DemoCanotUpdatePassword": "DEMO environment does not allow password modification",
"DirectorId": "Director",
"DirectorSelf": "Cannot set oneself as the supervisor",
"Disable": "Disable",
"Email": "Email",
"EmailDup": "Duplicate email {0} exists",
"EmailError": "Email format error {0}",
"Enable": "Enable",
"ExitVerificat": "You have been forcibly logged out",
"GrantRole": "GrantRole",
"LastLoginAddress": "LastLoginAddress",
"LastLoginDevice": "LastLoginDevice",
"LastLoginIp": "LastLoginIp",
"LastLoginTime": "LastLoginTime",
"LatestLoginAddress": "LatestLoginAddress",
"LatestLoginDevice": "LatestLoginDevice",
"LatestLoginIp": "LatestLoginIp",
"LatestLoginTime": "LatestLoginTime",
"NoOrg": "The organization does not exist",
"OldPasswordError": "Incorrect old password",
"OrgId": "Org",
"OrgNames": "OrgNames",
"Password": "Password",
"PasswordEdited": "Password changed, logged out",
"PasswordLengthLess": "Password length cannot be less than {0}",
"PasswordMustLow": "Password must contain lowercase letters",
"PasswordMustNum": "Password must contain numbers",
"PasswordMustSpecial": "Password must contain special characters",
"PasswordMustUpp": "Password must contain uppercase letters",
"Phone": "Phone",
"PhoneError": "Phone number format error {0}",
"PositionId": "Position",
"PositionName": "PositionName",
"Status": "Status"
},
"ThingsGateway.Admin.Application.TargetEnum": {
"_blank": "New window",
"_parent": "Parent window",
"_self": "Current window",
"_top": "Top window"
},
"ThingsGateway.Admin.Application.TestController": {
"Test": "Test",
"TestController": "Test API"
},
"ThingsGateway.Admin.Application.UnifyResultProvider": {
"NoPermission": "Access denied, no permission",
"TokenOver": "Login has expired, please login again"
},
"ThingsGateway.Admin.Application.UpdatePasswordInput": {
"ConfirmPassword": "Confirm password",
"ConfirmPassword.Required": "{0} is required",
"NewPassword": "New password",
"NewPassword.Required": "{0} is required",
"Password": "Password",
"Password.Required": "{0} is required"
},
"ThingsGateway.Admin.Application.UserSelectorOutput": {
"Account": "Account",
"OrgId": "Org"
},
"ThingsGateway.Admin.Application.VerificatInfo": {
"Device": "Device",
"Expire": "Expire(min)",
"LoginIp": "LoginIp",
"LoginTime": "LoginTime",
"Online": "Online",
"VerificatTimeout": "VerificatTimeout"
},
"ThingsGateway.Admin.Application.WebsitePolicy": {
"CloseTip": "CloseTip",
"CloseTip.Required": "{0} is required",
"WebStatus": "WebStatus"
},
"ThingsGateway.Admin.Application.WorkbenchInfo": {
"Razor": "Homepage",
"Shortcuts": "Shortcuts"
}
}

View File

@@ -0,0 +1,402 @@
{
"ThingsGateway.Admin.Application.AppConfig": {
"LoginPolicy": "登录策略",
"PagePolicy": "页面设置",
"PasswordPolicy": "密码策略",
"WebsitePolicy": "网站设置"
},
"ThingsGateway.Admin.Application.AuthController": {
"AuthController": "登录API",
"LoginAsync": "登录",
"LogoutAsync": "注销"
},
"ThingsGateway.Admin.Application.AuthService": {
"AuthErrorMax": "账号密码错误,超过 {0} 次后将锁定 {1} 分钟,错误次数 {2} ",
"MustDesc": "密码需要DESC加密后传入",
"OrgDisable": "所属公司/部门已停用,请联系管理员",
"PasswordError": "密码错误次数过多,请 {0} 分钟后再试",
"SingleLoginWarn": "您的账号已在别处登录",
"TenantNull": "租户不存在",
"UserDisable": "账号 {0} 已停用",
"UserNoModule": "该账号未分配模块,请联系管理员",
"UserNull": "用户 {0} 不存在"
},
"ThingsGateway.Admin.Application.BaseDataEntity": {
"CreateOrgId": "创建机构Id"
},
"ThingsGateway.Admin.Application.BaseEntity": {
"CreateTime": "创建时间",
"CreateUser": "创建人",
"SortCode": "排序",
"UpdateTime": "更新时间",
"UpdateUser": "更新人"
},
"ThingsGateway.Admin.Application.BlazorAuthenticationHandler": {
"UserExpire": "用户登录已过期,请重新登录"
},
"ThingsGateway.Admin.Application.DataScopeEnum": {
"SCOPE_ALL": "全部",
"SCOPE_ORG": "仅所属组织",
"SCOPE_ORG_CHILD": "所属组织及以下",
"SCOPE_ORG_DEFINE": "自定义",
"SCOPE_SELF": "仅自己"
},
"ThingsGateway.Admin.Application.DefaultDataScope": {
"ScopeCategory": "数据范围",
"ScopeDefineOrgIdList": "自定义列表"
},
"ThingsGateway.Admin.Application.DictTypeEnum": {
"Define": "业务配置",
"System": "系统配置"
},
"ThingsGateway.Admin.Application.FileService": {
"FileLengthError": "文件大小不允许超过 {0} M",
"FileNullError": "文件不能为空",
"FileTypeError": "不支持 {0} 格式"
},
"ThingsGateway.Admin.Application.HardwareInfo": {
"Environment": "主机环境",
"FrameworkDescription": "NET框架",
"OsArchitecture": "系统架构",
"UpdateTime": "更新时间",
"UUID": "唯一编码"
},
"ThingsGateway.Admin.Application.HardwareJob": {
"GetHardwareInfoFail": "获取硬件信息出错"
},
"ThingsGateway.Admin.Application.HistoryHardwareInfo": {
"Battery": "电池",
"CpuUsage": "CPU使用率",
"DriveUsage": "磁盘使用率",
"MemoryUsage": "内存",
"Temperature": "温度"
},
"ThingsGateway.Admin.Application.LogCateGoryEnum": {
"Exception": "异常",
"Login": "登录",
"Logout": "注销",
"Operate": "操作"
},
"ThingsGateway.Admin.Application.LogEnum": {
"FAIL": "失败",
"SUCCESS": "成功"
},
"ThingsGateway.Admin.Application.LoginInput": {
"Account": "登录账号",
"Account.Required": "{0} 是必填项",
"Password": "登录密码",
"Password.Required": "{0} 是必填项"
},
"ThingsGateway.Admin.Application.LoginPolicy": {
"ErrorCount": "登录错误次数锁定阈值",
"ErrorCount.MinValue": " {0} 值太小",
"ErrorLockTime": "登录错误锁定时长(分)",
"ErrorLockTime.MinValue": " {0} 值太小",
"ErrorResetTime": "登录错误次数过期时长(分)",
"ErrorResetTime.MinValue": " {0} 值太小",
"SingleOpen": "单用户登录开关",
"VerificatExpireTime": "登录过期时间(分)",
"VerificatExpireTime.MinValue": " {0} 值太小"
},
"ThingsGateway.Admin.Application.LogoutInput": {
"VerificatId.Required": "{0} 是必填项"
},
"ThingsGateway.Admin.Application.OpenApiAuthController": {
"LoginAsync": "登录",
"LogoutAsync": "注销",
"OpenApiAuthController": "登录API"
},
"ThingsGateway.Admin.Application.OperateLogPageInput": {
"Account": "操作账号",
"Category": "分类",
"SearchDate": "时间范围"
},
"ThingsGateway.Admin.Application.OperDescAttribute": {
"ChangeParentResource": "更改父节点",
"CopyOrg": "复制机构",
"CopyResource": "复制资源",
"DeleteDict": "删除字典",
"DeleteOperLog": "删除操作日志",
"DeleteOrg": "删除机构",
"DeletePosition": "删除岗位",
"DeleteResource": "删除资源",
"DeleteRole": "删除角色",
"DeleteuSER": "删除用户",
"EditLoginPolicy": "修改登录策略",
"EditPagePolicy": "修改页面策略",
"EditPasswordPolicy": "修改密码策略",
"EditWebsitePolicy": "修改网站设置",
"ExitSession": "强退会话",
"ExitVerificat": "强退令牌",
"ExportOperLog": "导出操作日志",
"GrantApi": "API",
"GrantResource": "资源",
"GrantRole": "角色",
"GrantUser": "用户",
"NoPermission": "无权限操作",
"ResetPassword": "重置密码",
"RoleGrantApiPermission": "角色授权OpenApi",
"RoleGrantResource": "角色授权资源",
"RoleGrantUser": "角色授权用户",
"SaveDict": "修改字典",
"SaveOrg": "保存机构",
"SavePosition": "保存岗位",
"SaveResource": "修改资源",
"SaveRole": "修改角色",
"SaveUser": "修改用户",
"UpdatePassword": "更新个人密码",
"UpdateUserInfo": "更新个人信息",
"UserGrantApiPermission": "用户授权OpenApi",
"UserGrantResource": "用户授权资源",
"UserGrantRole": "用户授权角色",
"WorkbenchInfo": "更新个人工作台"
},
"ThingsGateway.Admin.Application.OrgEnum": {
"COMPANY": "公司",
"DEPT": "部门"
},
"ThingsGateway.Admin.Application.PagePolicy": {
"Razor": "默认主页",
"Shortcuts": "默认快捷方式"
},
"ThingsGateway.Admin.Application.PasswordPolicy": {
"DefaultPassword": "默认用户密码",
"DefaultPassword.Required": " {0} 是必填项",
"PasswordContainChar": "包含特殊字符",
"PasswordContainLower": "包含小写字母",
"PasswordContainNum": "包含数字",
"PasswordContainUpper": "包含大写字母",
"PasswordMinLen": "密码最小长度",
"PasswordMinLen.MinValue": " {0} 值太小"
},
"ThingsGateway.Admin.Application.PositionCategoryEnum": {
"HIGH": "高层",
"LOW": "低层",
"MIDDLE": "中层"
},
"ThingsGateway.Admin.Application.ResourceCategoryEnum": {
"Button": "按钮",
"Menu": "菜单",
"Module": "模块"
},
"ThingsGateway.Admin.Application.ResourceTableSearchModel": {
"Href": "路径",
"Module": "模块",
"Title": "标题"
},
"ThingsGateway.Admin.Application.RoleCategoryEnum": {
"Global": "全局",
"Org": "机构"
},
"ThingsGateway.Admin.Application.SessionOutput": {
"Account": "账号",
"LatestLoginIp": "最新登录ip",
"LatestLoginTime": "最新登录时间",
"Online": "在线状态",
"VerificatCount": "令牌数量"
},
"ThingsGateway.Admin.Application.SysDict": {
"Category": "分类",
"Category.Required": "{0} 是必填项",
"Code": "代码",
"Code.Required": "{0} 是必填项",
"DemoCanotUpdateWebsitePolicy": "DEMO环境不允许修改网站设置",
"DictDup": "存在重复的配置 分类 {0} 名称 {1}",
"Name": "名称",
"Name.Required": "{0} 是必填项",
"Remark": "备注"
},
"ThingsGateway.Admin.Application.SysOperateLog": {
"Category": "日志分类",
"ClassName": "类名",
"ExeMessage": "具体消息",
"ExeStatus": "执行状态",
"MethodName": "方法名称",
"Name": "日志名称",
"OpAccount": "账号",
"OpBrowser": "浏览器",
"OpIp": "ip",
"OpOs": "系统",
"OpTime": "操作时间",
"ParamJson": "请求参数",
"ReqMethod": "请求方式",
"ReqUrl": "请求地址",
"ResultJson": "返回结果",
"VerificatId": "验证Id"
},
"ThingsGateway.Admin.Application.SysOrg": {
"CanotContainsSelf": "不可包含自己",
"Category": "分类",
"Category.Required": "{0} 是必填项",
"Code": "代码",
"Code.Required": "{0} 是必填项",
"CodeDup": "存在重复的编码 {0}",
"DeletePositionFirst": "请先删除机构下的职位",
"DeleteRoleFirst": "请先删除机构下的角色",
"DeleteUserFirst": "请先删除机构下的用户",
"DirectorId": "主管",
"Dup": "存在重复的机构 分类 {0} 名称 {1}",
"Name": "名称",
"Name.Required": "{0} 是必填项",
"NameDup": "存在重复的名称 {0}",
"Names": "机构全称",
"ParentChoiceSelf": "父级不能选择自己",
"ParentId": "上级机构",
"ParentNull": "父级不存在 {0}",
"Remark": "备注",
"RootOrg": "无法创建顶层机构",
"Status": "状态",
"TargetNameDup": "目标节点存在重复的名称 {0}"
},
"ThingsGateway.Admin.Application.SysOrgCopyInput": {
"ContainsChild": "包含下级",
"ContainsPosition": "包含职位",
"TargetId": "目标机构"
},
"ThingsGateway.Admin.Application.SysPosition": {
"CanotContainsSelf": "不可包含自己",
"Category": "分类",
"Category.Required": "{0} 是必填项",
"Code": "代码",
"Code.Required": "{0} 是必填项",
"CodeDup": "存在重复的编码 {0}",
"DeleteUserFirst": "请先删除职位下的用户",
"Dup": "存在重复的岗位 分类 {0} 名称 {1}",
"Name": "名称",
"Name.Required": "{0} 是必填项",
"NameDup": "存在重复的名称 {0}",
"OrgId": "机构",
"OrgId.MinValue": "{0} 是必填项",
"ParentChoiceSelf": "父级不能选择自己",
"ParentNull": "父级不存在 {0}",
"Remark": "备注",
"Status": "状态",
"TargetNameDup": "目标节点存在重复的名称 {0}"
},
"ThingsGateway.Admin.Application.SysResource": {
"CanotDeleteSystemResource": "不可删除系统资源 {0}",
"Category": "分类",
"Code": "编码",
"Href": "路径",
"Href.Required": "{0} 是必填项",
"Icon": "图标",
"Module": "模块",
"ModuleIdDiff": "模块与上级菜单不一致",
"NavLinkMatch": "匹配类型",
"NotFoundResource": "系统异常,没找到该菜单",
"ParentId": "上级菜单",
"ResourceDup": "存在重复的名称 {0}",
"ResourceMenuHrefNotNull": "菜单的路径不能为空",
"ResourceParentChoiceSelf": "父级不能选择自己",
"ResourceParentNull": "父级不存在 {0}",
"Target": "跳转类型",
"Title": "标题",
"Title.Required": "{0} 是必填项"
},
"ThingsGateway.Admin.Application.SysRole": {
"CannotRoleScopeAll": "机构角色不能选择全局数据范围",
"CanotDeleteAdmin": "不可删除系统内置超管角色",
"CanotEditAdmin": "不可编辑超管角色",
"CanotGrantAdmin": "不能分配超管角色",
"Category": "分类",
"Code": "编码",
"CodeDup": "存在重复的编码 {0}",
"Global": "全局",
"Name": "名称",
"Name.Required": " {0} 是必填项",
"NameDup": "存在重复的角色名称 {0}",
"OrgId": "机构",
"OrgNotNull": "机构不能为空",
"SameOrgNameDup": "存在重复的角色名称 {0}",
"Status": "状态"
},
"ThingsGateway.Admin.Application.SysUser": {
"Account": "账号",
"Account.Required": " {0} 是必填项",
"AccountDup": "存在重复的账号 {0}",
"Avatar": "头像",
"CanotDeleteAdminUser": "不可删除系统内置超管用户",
"CanotDeleteSelf": "不可删除自己",
"CanotEditAdminUser": "不可编辑超管用户",
"CanotGrantAdmin": "不能分配超管角色",
"CheckSelf": "禁止 {0} 自己",
"ConfirmPasswordDiff": "两次输入的密码不一致",
"DemoCanotUpdatePassword": "DEMO环境不允许修改密码",
"DirectorId": "主管",
"DirectorSelf": "不能设置自己为主管",
"Disable": "禁用",
"Email": "邮箱",
"EmailDup": "存在重复的邮箱 {0}",
"EmailError": "邮箱 {0} 格式错误",
"Enable": "启用",
"ExitVerificat": "您已被强制下线",
"GrantRole": "分配角色",
"LastLoginAddress": "上次登录地点",
"LastLoginDevice": "上次登录设备",
"LastLoginIp": "上次登录ip",
"LastLoginTime": "上次登录时间",
"LatestLoginAddress": "最新登录地点",
"LatestLoginDevice": "最新登录设备",
"LatestLoginIp": "最新登录ip",
"LatestLoginTime": "最新登录时间",
"NoOrg": "组织机构不存在",
"OldPasswordError": "原密码错误",
"OrgId": "机构",
"OrgNames": "机构名称",
"Password": "密码",
"PasswordEdited": "密码被修改,已退出登录",
"PasswordLengthLess": "密码长度不能小于 {0} ",
"PasswordMustLow": "密码必须包含小写字母",
"PasswordMustNum": "密码必须包含数字",
"PasswordMustSpecial": "密码必须包含特殊字符",
"PasswordMustUpp": "密码必须包含大写字母",
"Phone": "手机",
"PhoneError": "手机号码 {0} 格式错误",
"PositionId": "职位",
"PositionName": "职位名称",
"Status": "状态"
},
"ThingsGateway.Admin.Application.TargetEnum": {
"_blank": "新窗口",
"_parent": "父级窗口",
"_self": "本窗口",
"_top": "顶级窗口"
},
"ThingsGateway.Admin.Application.TestController": {
"Test": "测试",
"TestController": "测试API"
},
"ThingsGateway.Admin.Application.UnifyResultProvider": {
"NoPermission": "禁止访问,没有权限",
"TokenOver": "登录已过期,请重新登录"
},
"ThingsGateway.Admin.Application.UpdatePasswordInput": {
"ConfirmPassword": "确认密码",
"ConfirmPassword.Required": " {0} 是必填项",
"NewPassword": "新密码",
"NewPassword.Required": " {0} 是必填项",
"Password": "密码",
"Password.Required": " {0} 是必填项"
},
"ThingsGateway.Admin.Application.UserSelectorOutput": {
"Account": "账号",
"OrgId": "机构"
},
"ThingsGateway.Admin.Application.VerificatInfo": {
"Device": "登录设备",
"Expire": "过期时间(分)",
"LoginIp": "登录IP",
"LoginTime": "登录时间",
"Online": "在线状态",
"VerificatTimeout": "超时时间"
},
"ThingsGateway.Admin.Application.WebsitePolicy": {
"CloseTip": "关闭提示",
"CloseTip.Required": " {0} 是必填项",
"WebStatus": "是否开放"
},
"ThingsGateway.Admin.Application.WorkbenchInfo": {
"Razor": "主页",
"Shortcuts": "快捷方式"
}
}

View File

@@ -0,0 +1,211 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using System.Collections.Concurrent;
using System.Reflection;
using ThingsGateway.Extension;
using ThingsGateway.FriendlyException;
using ThingsGateway.Logging;
using ThingsGateway.NewLife.Json.Extension;
using ThingsGateway.Razor;
using ThingsGateway.SqlSugar;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 数据库写入器
/// </summary>
public class DatabaseLoggingWriter : IDatabaseLoggingWriter
{
/// <summary>
/// 日志消息队列(线程安全)
/// </summary>
private readonly ConcurrentQueue<SysOperateLog> _operateLogMessageQueue = new();
private SqlSugarClient SqlSugarClient;
/// <summary>
/// 此方法只会写入经由MVCFilter捕捉的方法日志对于BlazorServer的内部操作由<see cref="OperDescAttribute"/>执行
/// </summary>
/// <param name="logMsg"></param>
/// <param name="flush"></param>
public async Task WriteAsync(LogMessage logMsg, bool flush)
{
//转成实体
var requestAuditData = logMsg.Context.Get(nameof(RequestAuditData)) as RequestAuditData;
//日志时间赋值
requestAuditData.LogDateTime = logMsg.LogDateTime;
// requestAuditData.ReturnInformation.Value
//验证失败不记录日志
bool save = false;
if (requestAuditData.Validation == null)
{
var operation = requestAuditData.Operation;//获取操作名称
var client = requestAuditData.Client;//获取客户端信息
var path = requestAuditData.Path;//获取操作名称
var method = requestAuditData.Method;//获取方法
var methodInfo = requestAuditData.MethodInfo;
var login = methodInfo.GetCustomAttribute(typeof(LoginLogAttribute));
var logout = methodInfo.GetCustomAttribute(typeof(LogoutLogAttribute));
//表示访问日志
if (login != null || logout != null)
{
//如果没有异常信息
if (requestAuditData.Exception == null)
{
LogCateGoryEnum logCateGoryEnum = login != null ? LogCateGoryEnum.Login : LogCateGoryEnum.Logout;
save = await CreateVisitLog(operation, path, requestAuditData, client, logCateGoryEnum, flush).ConfigureAwait(false);//添加到访问日志
}
else
{
//添加到异常日志
save = await CreateOperationLog(operation, path, requestAuditData, client, flush).ConfigureAwait(false);
}
}
else
{
//只有定义了Title的POST方法才记录日志
if (!operation.IsNullOrWhiteSpace() && method == "POST")
{
//添加到操作日志
save = await CreateOperationLog(operation, path, requestAuditData, client, flush).ConfigureAwait(false);
}
}
}
if (save)
{
await Task.Delay(1000).ConfigureAwait(false);
}
}
/// <summary>
/// 创建操作日志
/// </summary>
/// <param name="operation">操作名称</param>
/// <param name="path">请求地址</param>
/// <param name="requestAuditData">requestAuditData</param>
/// <param name="userAgent">客户端信息</param>
/// <param name="flush"></param>
/// <returns></returns>
private async Task<bool> CreateOperationLog(string operation, string path, RequestAuditData requestAuditData, UserAgent userAgent, bool flush)
{
//账号
var opAccount = requestAuditData.AuthorizationClaims?.Where(it => it.Type == ClaimConst.Account).Select(it => it.Value).FirstOrDefault();
//获取参数json字符串
var paramJson = requestAuditData.Parameters == null || requestAuditData.Parameters.Count == 0 ? null : requestAuditData.Parameters.ToSystemTextJsonString();
//获取结果json字符串
var resultJson = requestAuditData.ReturnInformation?.ToSystemTextJsonString();
//操作日志表实体
var sysLogOperate = new SysOperateLog
{
Name = operation,
Category = LogCateGoryEnum.Operate,
ExeStatus = true,
OpIp = requestAuditData.RemoteIPv4,
OpBrowser = userAgent?.Browser,
OpOs = userAgent?.Platform,
OpTime = requestAuditData.LogDateTime.LocalDateTime,
OpAccount = opAccount,
ReqMethod = requestAuditData.Method,
ReqUrl = path,
ResultJson = resultJson,
ClassName = requestAuditData.ControllerName,
MethodName = requestAuditData.ActionName,
ParamJson = paramJson,
VerificatId = UserManager.VerificatId,
};
//如果异常不为空
if (requestAuditData.Exception != null)
{
sysLogOperate.Category = LogCateGoryEnum.Exception;//操作类型为异常
sysLogOperate.ExeStatus = false;//操作状态为失败
if (requestAuditData.Exception.Type == typeof(AppFriendlyException).ToString())
sysLogOperate.ExeMessage = requestAuditData?.Exception.Message;
else
sysLogOperate.ExeMessage = $"{requestAuditData.Exception.Type}:{requestAuditData.Exception.Message}{Environment.NewLine}{requestAuditData.Exception.StackTrace}";
}
_operateLogMessageQueue.Enqueue(sysLogOperate);
if (flush)
{
SqlSugarClient ??= DbContext.GetDB<SysOperateLog>();
await SqlSugarClient.InsertableWithAttr(_operateLogMessageQueue.ToListWithDequeue()).ExecuteCommandAsync().ConfigureAwait(false);//入库
return true;
}
return false;
}
/// <summary>
/// 创建访问日志
/// </summary>
/// <param name="operation">访问类型</param>
/// <param name="path"></param>
/// <param name="requestAuditData">requestAuditData</param>
/// <param name="userAgent">客户端信息</param>
/// <param name="logCateGoryEnum">logCateGory</param>
/// <param name="flush"></param>
private async Task<bool> CreateVisitLog(string operation, string path, RequestAuditData requestAuditData, UserAgent userAgent, LogCateGoryEnum logCateGoryEnum, bool flush)
{
long verificatId = 0;//验证Id
var opAccount = "";//用户账号
if (logCateGoryEnum == LogCateGoryEnum.Login)
{
//如果是登录,用户信息就从返回值里拿
if (requestAuditData.ReturnInformation is UnifyResult<LoginOutput> userInfo)
{
opAccount = userInfo.Data.Account;//赋值账号
verificatId = userInfo.Data.VerificatId;
}
}
else
{
//如果是登录出用户信息就从AuthorizationClaims里拿
opAccount = requestAuditData.AuthorizationClaims.Where(it => it.Type == ClaimConst.Account).Select(it => it.Value).FirstOrDefault();
verificatId = requestAuditData.AuthorizationClaims.Where(it => it.Type == ClaimConst.VerificatId).Select(it => it.Value).FirstOrDefault().ToLong();
}
//日志表实体
var sysLogVisit = new SysOperateLog
{
Name = operation,
Category = logCateGoryEnum,
ExeStatus = true,
OpIp = requestAuditData.RemoteIPv4,
OpBrowser = userAgent?.Browser,
OpOs = userAgent?.Platform,
OpTime = requestAuditData.LogDateTime.LocalDateTime,
VerificatId = verificatId,
OpAccount = opAccount,
ReqMethod = requestAuditData.Method,
ReqUrl = path,
ResultJson = requestAuditData.ReturnInformation?.ToSystemTextJsonString(),
ClassName = requestAuditData.ControllerName,
MethodName = requestAuditData.ActionName,
ParamJson = requestAuditData.Parameters?.ToSystemTextJsonString(),
};
_operateLogMessageQueue.Enqueue(sysLogVisit);
if (flush)
{
SqlSugarClient ??= DbContext.GetDB<SysOperateLog>();
await SqlSugarClient.InsertableWithAttr(_operateLogMessageQueue.ToListWithDequeue()).ExecuteCommandAsync().ConfigureAwait(false);//入库
return true;
}
return false;
}
}

View File

@@ -0,0 +1,42 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 日志常量
/// </summary>
public static class LoggingConst
{
/// <summary>
/// 分类
/// </summary>
public const string CateGory = "CateGory";
/// <summary>
/// 客户端信息
/// </summary>
public const string Client = "Client";
/// <summary>
/// 请求方法POST/GET
/// </summary>
public const string Method = "Method";
/// <summary>
/// 操作名称
/// </summary>
public const string Operation = "Operation";
/// <summary>
/// 请求地址
/// </summary>
public const string Path = "Path";
}

View File

@@ -0,0 +1,187 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 认证信息
/// </summary>
public class AuthorizationClaims
{
/// <summary>
/// 类型
/// </summary>
public string Type { get; set; }
/// <summary>
/// 值
/// </summary>
public string Value { get; set; }
}
/// <summary>
/// 异常信息
/// </summary>
public class LogException
{
/// <summary>
/// 异常内容
/// </summary>
public string Message { get; set; }
/// <summary>
/// 堆栈信息
/// </summary>
public string StackTrace { get; set; }
/// <summary>
/// 异常类型
/// </summary>
public string Type { get; set; }
}
/// <summary>
/// 请求信息格式化
/// </summary>
public class LoggingMonitorJson
{
/// <summary>
/// 方法名称
/// </summary>
public string ActionName { get; set; }
/// <summary>
/// 认证信息
/// </summary>
public List<AuthorizationClaims> AuthorizationClaims { get; set; }
/// <summary>
/// 控制器名
/// </summary>
public string ControllerName { get; set; }
/// <summary>
/// 类名称
/// </summary>
public string DisplayName { get; set; }
/// <summary>
/// 环境
/// </summary>
public string Environment { get; set; }
/// <summary>
/// 异常信息
/// </summary>
public LogException Exception { get; set; }
/// <summary>
/// 请求方法
/// </summary>
public string HttpMethod { get; set; }
/// <summary>
/// 服务端
/// </summary>
public string LocalIPv4 { get; set; }
/// <summary>
/// 日志时间
/// </summary>
public DateTimeOffset LogDateTime { get; set; }
/// <summary>
/// 系统架构
/// </summary>
public string OsArchitecture { get; set; }
/// <summary>
/// 系统名称
/// </summary>
public string OsDescription { get; set; }
/// <summary>
/// 参数列表
/// </summary>
public List<Parameters> Parameters { get; set; }
/// <summary>
/// 客户端IPV4地址
/// </summary>
public string RemoteIPv4 { get; set; }
/// <summary>
/// 认证信息
/// </summary>
public string RequestHeaderAuthorization { get; set; }
/// <summary>
/// 认证信息
/// </summary>
public string RequestHeaderCookies { get; set; }
/// <summary>
/// 请求地址
/// </summary>
public string RequestUrl { get; set; }
/// <summary>
/// 返回信息
/// </summary>
public ReturnInformation ReturnInformation { get; set; }
/// <summary>
/// 浏览器标识
/// </summary>
public string UserAgent { get; set; }
/// <summary>
/// 验证错误信息
/// </summary>
public Validation Validation { get; set; }
}
/// <summary>
/// 请求参数
/// </summary>
public class Parameters
{
/// <summary>
/// 参数名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 值
/// </summary>
public object Value { get; set; }
}
/// <summary>
/// 返回信息
/// </summary>
public class ReturnInformation
{
/// <summary>
/// 返回值
/// </summary>
public object Value { get; set; }
}
/// <summary>
/// 验证失败信息
/// </summary>
public class Validation
{
/// <summary>
/// 错误详情
/// </summary>
public string Message { get; set; }
}

View File

@@ -0,0 +1,239 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OAuth;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System.Collections.Concurrent;
using System.Security.Claims;
using System.Text.Encodings.Web;
using ThingsGateway.Extension;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 只适合 Demo 登录,会直接授权超管的权限
/// </summary>
public class AdminOAuthHandler<TOptions>(
IVerificatInfoService verificatInfoService,
IAppService appService,
ISysUserService sysUserService,
ISysDictService configService,
IOptionsMonitor<TOptions> options,
ILoggerFactory logger,
IUserAgentService userAgentService,
UrlEncoder encoder
) : OAuthHandler<TOptions>(options, logger, encoder)
where TOptions : AdminOAuthOptions, new()
{
static AdminOAuthHandler()
{
Task.Factory.StartNew(Insertable, TaskCreationOptions.LongRunning);
}
/// <summary>
/// 日志消息队列(线程安全)
/// </summary>
protected static readonly ConcurrentQueue<SysOperateLog> _operateLogMessageQueue = new();
/// <summary>
/// 创建访问日志
/// </summary>
private static async Task Insertable()
{
var db = DbContext.GetDB<SysOperateLog>();
var appLifetime = App.RootServices!.GetService<IHostApplicationLifetime>()!;
while (!appLifetime.ApplicationStopping.IsCancellationRequested)
{
try
{
var data = _operateLogMessageQueue.ToListWithDequeue(); // 从日志队列中获取数据
if (data.Count > 0)
{
await db.InsertableWithAttr(data).ExecuteCommandAsync(appLifetime.ApplicationStopping).ConfigureAwait(false);//入库
}
}
catch (Exception ex)
{
NewLife.Log.XTrace.WriteException(ex);
}
finally
{
await Task.Delay(3000, appLifetime.ApplicationStopping).ConfigureAwait(false);
}
}
}
protected override async Task<AuthenticationTicket> CreateTicketAsync(
ClaimsIdentity identity,
AuthenticationProperties properties,
OAuthTokenResponse tokens)
{
Backchannel.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", tokens.AccessToken);
properties.RedirectUri = Options.HomePath;
properties.IsPersistent = true;
var appConfig = await configService.GetAppConfigAsync().ConfigureAwait(false);
int expire = appConfig.LoginPolicy.VerificatExpireTime;
if (!string.IsNullOrEmpty(tokens.ExpiresIn) && int.TryParse(tokens.ExpiresIn, out var result))
{
properties.ExpiresUtc = TimeProvider.System.GetUtcNow().AddSeconds(result);
expire = (int)(result / 60.0);
}
var user = await Options.HandleUserInfoAsync(Context, tokens).ConfigureAwait(false);
var loginEvent = await GetLogin(expire).ConfigureAwait(false);
await UpdateUser(loginEvent).ConfigureAwait(false);
identity.AddClaim(new Claim(ClaimConst.VerificatId, loginEvent.VerificatId.ToString()));
identity.AddClaim(new Claim(ClaimConst.UserId, RoleConst.SuperAdminId.ToString()));
identity.AddClaim(new Claim(ClaimConst.SuperAdmin, "true"));
identity.AddClaim(new Claim(ClaimConst.OrgId, RoleConst.DefaultTenantId.ToString()));
identity.AddClaim(new Claim(ClaimConst.TenantId, RoleConst.DefaultTenantId.ToString()));
var context = new OAuthCreatingTicketContext(
new ClaimsPrincipal(identity),
properties,
Context,
Scheme,
Options,
Backchannel,
tokens,
user
);
context.RunClaimActions();
await Events.CreatingTicket(context).ConfigureAwait(false);
var httpContext = context.HttpContext;
UserAgent? userAgent = null;
var str = httpContext?.Request?.Headers?.UserAgent;
if (!string.IsNullOrEmpty(str))
{
userAgent = userAgentService.Parse(str);
}
var sysOperateLog = new SysOperateLog()
{
Name = this.Scheme.Name,
Category = LogCateGoryEnum.Login,
ExeStatus = true,
OpIp = httpContext.GetRemoteIpAddressToIPv4(),
OpBrowser = userAgent?.Browser,
OpOs = userAgent?.Platform,
OpTime = DateTime.Now,
VerificatId = loginEvent.VerificatId,
OpAccount = Options.GetName(user),
ReqMethod = "OAuth",
ReqUrl = string.Empty,
ResultJson = string.Empty,
ClassName = nameof(AdminOAuthHandler<TOptions>),
MethodName = string.Empty,
ParamJson = string.Empty,
};
_operateLogMessageQueue.Enqueue(sysOperateLog);
return new AuthenticationTicket(context.Principal, context.Properties, Scheme.Name);
}
private async Task<LoginEvent> GetLogin(int expire)
{
var sysUser = await sysUserService.GetUserByIdAsync(RoleConst.SuperAdminId).ConfigureAwait(false);//获取用户信息
var loginEvent = new LoginEvent
{
Ip = appService.RemoteIpAddress,
Device = appService.UserAgent?.Platform,
Expire = expire,
SysUser = sysUser,
VerificatId = CommonUtils.GetSingleId()
};
//获取verificat列表
var tokenTimeout = loginEvent.DateTime.AddMinutes(loginEvent.Expire);
//生成verificat信息
var verificatInfo = new VerificatInfo
{
Device = loginEvent.Device,
Expire = loginEvent.Expire,
VerificatTimeout = tokenTimeout,
Id = loginEvent.VerificatId,
UserId = loginEvent.SysUser.Id,
LoginIp = loginEvent.Ip,
LoginTime = loginEvent.DateTime
};
//添加到verificat列表
verificatInfoService.Add(verificatInfo);
return loginEvent;
}
/// <summary>
/// 登录事件
/// </summary>
/// <param name="loginEvent"></param>
/// <returns></returns>
private async Task UpdateUser(LoginEvent loginEvent)
{
var sysUser = loginEvent.SysUser;
#region /
var key = CacheConst.Cache_LoginErrorCount + sysUser.Account;//获取登录错误次数Key值
App.CacheService.Remove(key);//移除登录错误次数
//获取用户verificat列表
var userToken = verificatInfoService.GetOne(loginEvent.VerificatId);
#endregion /
#region ,
sysUser.LastLoginIp = sysUser.LatestLoginIp;
sysUser.LastLoginTime = sysUser.LatestLoginTime;
sysUser.LatestLoginIp = loginEvent.Ip;
sysUser.LatestLoginTime = loginEvent.DateTime;
#endregion ,
using var db = DbContext.GetDB<SysUser>();
//更新用户登录信息
if (await db.Updateable(sysUser).UpdateColumns(it => new
{
it.LastLoginIp,
it.LastLoginTime,
it.LatestLoginIp,
it.LatestLoginTime,
}).ExecuteCommandAsync().ConfigureAwait(false) > 0)
App.CacheService.HashAdd(CacheConst.Cache_SysUser, sysUser.Id.ToString(), sysUser);//更新Cache信息
}
}
/// <summary>自定义 Token 异常</summary>
public class OAuthTokenException : Exception
{
public OAuthTokenException() : base()
{
}
public OAuthTokenException(string? message, Exception? innerException) : base(message, innerException)
{
}
public OAuthTokenException(string? message) : base(message)
{
}
}

View File

@@ -0,0 +1,87 @@
using Microsoft.AspNetCore.Authentication.OAuth;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.WebUtilities;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
namespace ThingsGateway.Admin.Application;
/// <summary>OAuthOptions 配置类</summary>
public abstract class AdminOAuthOptions : OAuthOptions
{
/// <summary>默认构造函数</summary>
protected AdminOAuthOptions()
{
ConfigureClaims();
this.Events.OnRemoteFailure = context =>
{
var redirectUri = string.IsNullOrEmpty(HomePath) ? "/" : HomePath;
context.Response.Redirect(redirectUri);
context.HandleResponse();
return Task.CompletedTask;
};
Backchannel = new HttpClient(new HttpClientHandler
{
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
});
Backchannel.DefaultRequestHeaders.UserAgent.Add(
new ProductInfoHeaderValue("ThingsGateway", "1.0"));
}
/// <summary>配置 Claims 映射</summary>
protected virtual void ConfigureClaims()
{
}
public virtual string GetName(JsonElement element)
{
JsonElement.ObjectEnumerator target = element.EnumerateObject();
return target.TryGetValue("name");
}
/// <summary>获得/设置 登陆后首页</summary>
public string HomePath { get; set; } = "/";
/// <summary>处理用户信息方法</summary>
public virtual async Task<JsonElement> HandleUserInfoAsync(HttpContext context, OAuthTokenResponse tokens)
{
var request = new HttpRequestMessage(HttpMethod.Get, BuildUserInfoUrl(tokens));
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await Backchannel.SendAsync(request, context.RequestAborted).ConfigureAwait(false);
var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
return JsonDocument.Parse(content).RootElement;
}
throw new OAuthTokenException($"OAuth user info endpoint failure: {await Display(response).ConfigureAwait(false)}");
}
/// <summary>生成用户信息请求地址方法</summary>
protected virtual string BuildUserInfoUrl(OAuthTokenResponse tokens)
{
return QueryHelpers.AddQueryString(UserInformationEndpoint, new Dictionary<string, string>
{
{ "access_token", tokens.AccessToken }
});
}
/// <summary>生成错误信息方法</summary>
protected async Task<string> Display(HttpResponseMessage response)
{
var output = new StringBuilder();
output.Append($"Status: {response.StatusCode}; ");
output.Append($"Headers: {response.Headers}; ");
output.Append($"Body: {await response.Content.ReadAsStringAsync().ConfigureAwait(false)};");
return output.ToString();
}
}

View File

@@ -0,0 +1,122 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OAuth;
using Microsoft.AspNetCore.WebUtilities;
using System.Net.Http.Headers;
using System.Text.Json;
using ThingsGateway.NewLife.Log;
namespace ThingsGateway.Admin.Application;
public class GiteeOAuthOptions : AdminOAuthOptions
{
INoticeService _noticeService;
IVerificatInfoService _verificatInfoService;
public GiteeOAuthOptions() : base()
{
_noticeService = App.GetService<INoticeService>();
_verificatInfoService = App.GetService<IVerificatInfoService>();
this.SignInScheme = ClaimConst.Scheme;
this.AuthorizationEndpoint = "https://gitee.com/oauth/authorize";
this.TokenEndpoint = "https://gitee.com/oauth/token";
this.UserInformationEndpoint = "https://gitee.com/api/v5/user";
this.HomePath = "/";
this.CallbackPath = "/signin-gitee";
Scope.Add("user_info");
Scope.Add("projects");
Events.OnCreatingTicket = async context =>
{
await HandlerGiteeStarredUrl(context).ConfigureAwait(false);
};
Events.OnRedirectToAuthorizationEndpoint = context =>
{
context.Response.Redirect(context.RedirectUri);
return Task.CompletedTask;
};
Events.OnRemoteFailure = context =>
{
XTrace.WriteException(context.Failure);
return Task.CompletedTask;
};
}
/// <summary>刷新 Token 方法</summary>
protected virtual async Task<OAuthTokenResponse> RefreshTokenAsync(TicketReceivedContext ticketReceivedContext, string refreshToken)
{
var query = new Dictionary<string, string>
{
{ "refresh_token", refreshToken },
{ "grant_type", "refresh_token" }
};
var request = new HttpRequestMessage(HttpMethod.Post, QueryHelpers.AddQueryString(TokenEndpoint, query));
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await Backchannel.SendAsync(request, ticketReceivedContext.HttpContext.RequestAborted).ConfigureAwait(false);
var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
return OAuthTokenResponse.Success(JsonDocument.Parse(content));
}
return OAuthTokenResponse.Failed(new OAuthTokenException($"OAuth token endpoint failure: {await Display(response).ConfigureAwait(false)}"));
}
public override string GetName(JsonElement element)
{
JsonElement.ObjectEnumerator target = element.EnumerateObject();
return target.TryGetValue("name");
}
private async Task HandlerGiteeStarredUrl(OAuthCreatingTicketContext context, string repoFullName = "ThingsGateway/ThingsGateway")
{
if (string.IsNullOrWhiteSpace(context.AccessToken))
throw new InvalidOperationException("Access token is missing.");
var uri = $"https://gitee.com/api/v5/user/starred/{repoFullName}";
var queryString = new Dictionary<string, string>
{
{ "access_token", context.AccessToken }
};
var request = new HttpRequestMessage(HttpMethod.Get, QueryHelpers.AddQueryString(uri, queryString))
{
Headers = { Accept = { new MediaTypeWithQualityHeaderValue("application/json") } }
};
var response = await context.Backchannel.SendAsync(request, context.HttpContext.RequestAborted).ConfigureAwait(false);
if (!response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
var id = context.Identity.Claims.FirstOrDefault(a => a.Type == ClaimConst.VerificatId).Value;
var verificatInfoIds = _verificatInfoService.GetOne(id.ToLong());
_ = Task.Run(async () =>
{
await Task.Delay(5000).ConfigureAwait(false);
await _noticeService.NavigationMesage(verificatInfoIds.ClientIds, "https://gitee.com/ThingsGateway/ThingsGateway", "创作不易如有帮助请star仓库").ConfigureAwait(false);
});
//throw new Exception($"Failed to star repository: {response.StatusCode}, {content}");
}
}
protected override void ConfigureClaims()
{
ClaimActions.MapJsonKey(ClaimConst.AvatarUrl, "avatar_url");
ClaimActions.MapJsonKey(ClaimConst.Account, "name");
base.ConfigureClaims();
}
}

View File

@@ -0,0 +1,7 @@
namespace ThingsGateway.Admin.Application;
public class GiteeOAuthSettings
{
public string ClientId { get; set; }
public string ClientSecret { get; set; }
}

View File

@@ -0,0 +1,122 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OAuth;
using Microsoft.AspNetCore.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using ThingsGateway.NewLife.Log;
namespace ThingsGateway.Admin.Application;
public class GitHubOAuthOptions : AdminOAuthOptions
{
INoticeService _noticeService;
IVerificatInfoService _verificatInfoService;
public GitHubOAuthOptions() : base()
{
_noticeService = App.GetService<INoticeService>();
_verificatInfoService = App.GetService<IVerificatInfoService>();
SignInScheme = ClaimConst.Scheme;
AuthorizationEndpoint = "https://github.com/login/oauth/authorize";
TokenEndpoint = "https://github.com/login/oauth/access_token";
UserInformationEndpoint = "https://api.github.com/user";
HomePath = "/";
CallbackPath = "/signin-github";
Scope.Add("read:user");
Scope.Add("public_repo"); // 需要用于 Star 仓库
Events.OnCreatingTicket = async context =>
{
await HandleGitHubStarAsync(context).ConfigureAwait(false);
};
Events.OnRedirectToAuthorizationEndpoint = context =>
{
context.Response.Redirect(context.RedirectUri);
return Task.CompletedTask;
};
Events.OnRemoteFailure = context =>
{
XTrace.WriteException(context.Failure);
return Task.CompletedTask;
};
}
protected override void ConfigureClaims()
{
ClaimActions.MapJsonKey(ClaimConst.AvatarUrl, "avatar_url");
ClaimActions.MapJsonKey(ClaimConst.Account, "login");
base.ConfigureClaims();
}
public override string GetName(JsonElement element)
{
if (element.TryGetProperty("login", out var loginProp))
{
return loginProp.GetString() ?? string.Empty;
}
return string.Empty;
}
private async Task HandleGitHubStarAsync(OAuthCreatingTicketContext context, string repoFullName = "ThingsGateway/ThingsGateway")
{
if (string.IsNullOrWhiteSpace(context.AccessToken))
throw new InvalidOperationException("Access token is missing.");
var request = new HttpRequestMessage(HttpMethod.Put, $"https://api.github.com/user/starred/{repoFullName}")
{
Headers =
{
Accept = { new MediaTypeWithQualityHeaderValue("application/vnd.github+json") },
Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken),
},
Content = new StringContent(string.Empty) // GitHub Star 接口需要空内容
};
request.Headers.UserAgent.Add(new ProductInfoHeaderValue("ThingsGateway", "1.0")); // GitHub API 要求 User-Agent
var response = await context.Backchannel.SendAsync(request, context.HttpContext.RequestAborted).ConfigureAwait(false);
if (!response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
var id = context.Identity.Claims.FirstOrDefault(a => a.Type == ClaimConst.VerificatId).Value;
var verificatInfoIds = _verificatInfoService.GetOne(id.ToLong());
_ = Task.Run(async () =>
{
await Task.Delay(5000).ConfigureAwait(false);
await _noticeService.NavigationMesage(verificatInfoIds.ClientIds, "https://github.com/ThingsGateway/ThingsGateway", "创作不易如有帮助请star仓库").ConfigureAwait(false);
});
}
}
/// <summary>处理用户信息方法</summary>
public override async Task<JsonElement> HandleUserInfoAsync(HttpContext context, OAuthTokenResponse tokens)
{
var request = new HttpRequestMessage(HttpMethod.Get, UserInformationEndpoint);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokens.AccessToken);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.github+json"));
request.Headers.UserAgent.Add(new ProductInfoHeaderValue("ThingsGateway", "1.0")); // GitHub API 要求 User-Agent
var response = await Backchannel.SendAsync(request, context.RequestAborted).ConfigureAwait(false);
var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
return JsonDocument.Parse(content).RootElement;
}
throw new OAuthTokenException($"OAuth user info endpoint failure: {await Display(response).ConfigureAwait(false)}");
}
}

View File

@@ -0,0 +1,6 @@
namespace ThingsGateway.Admin.Application;
public class GithubOAuthSettings : GiteeOAuthSettings
{
}

View File

@@ -0,0 +1,11 @@
using System.Text.Json;
namespace ThingsGateway.Admin.Application;
public static class OAuthUserExtensions
{
public static string TryGetValue(this JsonElement.ObjectEnumerator target, string propertyName)
{
return target.FirstOrDefault<JsonProperty>((Func<JsonProperty, bool>)(t => t.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase))).Value.ToString() ?? string.Empty;
}
}

View File

@@ -0,0 +1,21 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using ThingsGateway.ConfigurableOptions;
namespace ThingsGateway.Admin.Application;
public sealed class AdminLogOptions : IConfigurableOptions
{
public int OperateLogDaysAgo { get; set; }
}

View File

@@ -0,0 +1,60 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using ThingsGateway.ConfigurableOptions;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 邮件配置选项
/// </summary>
public sealed class EmailOptions : IConfigurableOptions
{
/// <summary>
/// 主机
/// </summary>
public string Host { get; set; }
/// <summary>
/// 端口
/// </summary>
public int Port { get; set; }
/// <summary>
/// 默认发件者邮箱
/// </summary>
public string DefaultFromEmail { get; set; }
/// <summary>
/// 默认接收人邮箱
/// </summary>
public string DefaultToEmail { get; set; }
/// <summary>
/// 启用SSL
/// </summary>
public bool EnableSsl { get; set; }
/// <summary>
/// 邮箱账号
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 邮箱密码
/// </summary>
public string Password { get; set; }
/// <summary>
/// 默认邮件标题
/// </summary>
public string DefaultFromName { get; set; }
}

View File

@@ -0,0 +1,34 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using ThingsGateway.ConfigurableOptions;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 历史硬件信息
/// </summary>
public class HardwareInfoOptions : IConfigurableOptions
{
/// <summary>
/// 启用
/// </summary>
public bool Enable { get; set; } = true;
/// <summary>
/// 历史保存间隔
/// </summary>
public int HistoryInterval { get; set; } = 60000;
/// <summary>
/// 历史保留天数
/// </summary>
public int DaysAgo { get; set; } = 7;
}

View File

@@ -0,0 +1,23 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using ThingsGateway.ConfigurableOptions;
namespace ThingsGateway.Admin.Application;
public sealed class TenantOptions : IConfigurableOptions
{
/// <summary>
/// 启用
/// </summary>
public bool Enable { get; set; }
}

View File

@@ -0,0 +1,283 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Http;
using System.Security.Claims;
using ThingsGateway.Authorization;
using ThingsGateway.DataEncryption;
namespace ThingsGateway.Admin.Application;
/// <inheritdoc/>
public class BlazorAuthenticationHandler : AppAuthorizeHandler
{
private readonly ISysDictService _sysDictService;
private readonly ISysRoleService _sysRoleService;
private readonly ISysUserService _sysUserService;
public BlazorAuthenticationHandler(ISysUserService sysUserService, ISysRoleService sysRoleService, ISysDictService sysDictService)
{
_sysUserService = sysUserService;
_sysRoleService = sysRoleService;
_sysDictService = sysDictService;
}
/// <inheritdoc/>
public override async Task HandleAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
{
var isAuthenticated = context.User.Identity?.IsAuthenticated;
if (isAuthenticated == true)
{
if (await CheckVerificatFromCacheAsync(context).ConfigureAwait(false))
{
await AuthorizeHandleAsync(context).ConfigureAwait(false);
}
else
{
await Fail(context).ConfigureAwait(false);
}
}
else
{
await Fail(context).ConfigureAwait(false);// 授权失败
}
}
static async Task Fail(AuthorizationHandlerContext context)
{
var verificatId = UserManager.VerificatId;
var verificatInfo = App.GetService<IVerificatInfoService>().GetOne(verificatId, false);
if (App.HttpContext != null)
{
var identity = new ClaimsIdentity();
App.HttpContext.User = new ClaimsPrincipal(identity);
}
context.Fail(); // 授权失败
if (verificatInfo != null)
await App.GetService<INoticeService>().UserLoginOut(verificatInfo.ClientIds, App.CreateLocalizerByType(typeof(BlazorAuthenticationHandler))["UserExpire"]).ConfigureAwait(false);
DefaultHttpContext currentHttpContext = context.GetCurrentHttpContext();
if (currentHttpContext == null)
return;
currentHttpContext.Response.StatusCode = 401; //返回401给授权筛选器用
currentHttpContext.SignoutToSwagger();
await currentHttpContext.SignOutAsync().ConfigureAwait(false);
}
/// <inheritdoc/>
public override async Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
{
var userId = context.User.Claims.FirstOrDefault(it => it.Type == ClaimConst.UserId)?.Value?.ToLong(0) ?? 0;
var user = await _sysUserService.GetUserByIdAsync(userId).ConfigureAwait(false);
if (context.Resource is Microsoft.AspNetCore.Components.RouteData routeData)
{
var roles = await _sysRoleService.GetRoleListByUserIdAsync(userId).ConfigureAwait(false);
//这里鉴别用户使能状态
if (user?.Status != true)
{
return false;
}
//超级管理员都能访问
var isSuperAdmin = context.User.Claims.FirstOrDefault(it => it.Type == ClaimConst.SuperAdmin)?.Value.ToBoolean();
if (isSuperAdmin == true) return true;
// 获取超级管理员特性
var superAdminAttr = routeData.PageType.CustomAttributes.FirstOrDefault(x =>
x.AttributeType == typeof(SuperAdminAttribute));
if (superAdminAttr != null) //如果是超级管理员才能访问的接口
{
return false; //直接没权限
}
//获取角色授权特性
var isRolePermission = routeData.PageType.CustomAttributes.FirstOrDefault(x =>
x.AttributeType == typeof(RolePermissionAttribute));
if (isRolePermission != null)
{
//获取忽略角色授权特性
var isIgnoreRolePermission = routeData.PageType.CustomAttributes.FirstOrDefault(x =>
x.AttributeType == typeof(IgnoreRolePermissionAttribute));
if (isIgnoreRolePermission == null)
{
// 路由名称
var routeName = routeData.PageType.CustomAttributes.FirstOrDefault(x =>
x.AttributeType == typeof(RouteAttribute))?.ConstructorArguments?[0].Value as string;
if (routeName == null) return true;
if ((!user.PermissionCodeList.Contains(routeName.CutStart("/")) && !user.PermissionCodeList.Contains(routeName))) //如果当前路由信息不包含在角色授权路由列表中则认证失败
return false;
else
return true;
}
else
{
return true;
}
}
else
{
return true;
}
}
else
{
//这里鉴别用户使能状态
if (user?.Status != true)
{
return false;
}
//超级管理员都能访问
var isSuperAdmin = context.User.Claims.FirstOrDefault(it => it.Type == ClaimConst.SuperAdmin)?.Value?.ToBoolean();
if (isSuperAdmin == true) return true;
if (httpContext == null)
{
//非API请求
return true;
}
var superAdminAttr = httpContext.GetMetadata<SuperAdminAttribute>();
if (superAdminAttr != null) //如果是超级管理员才能访问的接口
{
//获取忽略超级管理员特性
var ignoreSpuerAdmin = httpContext.GetMetadata<IgnoreSuperAdminAttribute>();
if (ignoreSpuerAdmin == null && isSuperAdmin != true) //如果只能超级管理员访问并且用户不是超级管理员
return false; //直接没权限
}
//获取角色授权特性
var isRolePermission = httpContext.GetMetadata<RolePermissionAttribute>();
if (isRolePermission != null)
{
//获取忽略角色授权特性
var ignoreRolePermission = httpContext.GetMetadata<IgnoreRolePermissionAttribute>();
if (ignoreRolePermission == null)
{
// 路由名称
var routeName = httpContext.Request.Path.Value;
if (routeName == null) return true;
if ((!user.PermissionCodeList.Contains(routeName.CutStart("/")) && !user.PermissionCodeList.Contains(routeName))) //如果当前路由信息不包含在角色授权路由列表中则认证失败
return false;
else
{
return true; //没有用户信息则返回认证失败
}
}
}
else
{
return true;
}
}
return true;
}
/// <summary>
/// 检查 BearerToken/Cookie 有效性
/// </summary>
/// <param name="context">DefaultHttpContext</param>
/// <returns></returns>
private async Task<bool> CheckVerificatFromCacheAsync(AuthorizationHandlerContext context)
{
DefaultHttpContext currentHttpContext = context.GetCurrentHttpContext();
var userId = context.User.Claims.FirstOrDefault(it => it.Type == ClaimConst.UserId)?.Value?.ToLong();
var verificatId = context.User.Claims.FirstOrDefault(it => it.Type == ClaimConst.VerificatId)?.Value?.ToLong();
var expire = (await _sysDictService.GetAppConfigAsync().ConfigureAwait(false)).LoginPolicy.VerificatExpireTime;
if (currentHttpContext == null)
{
return CheckVerificat(userId, verificatId);
}
else
{
if (await JWTEncryption.AutoRefreshToken(context, currentHttpContext, expire, expire * 2).ConfigureAwait(false))
{
//var token = JWTEncryption.GetJwtBearerToken(currentHttpContext); //获取当前token
var verificatInfo = userId != null ? VerificatInfoService.GetOne(verificatId ?? 0, false) : null;//获取token信息
if (verificatInfo != null)
{
if (verificatInfo.VerificatTimeout < DateTime.Now.AddMinutes(1))
{
verificatInfo.VerificatTimeout = verificatInfo.VerificatTimeout.AddMinutes(verificatInfo.Expire); //新的过期时间
VerificatInfoService.Update(verificatInfo); //更新tokne信息到cache
}
return true;
}
else
{
return false;
}
}
else
{
//失败
return false;
}
}
}
private static IVerificatInfoService _verificatInfoService;
private static IVerificatInfoService VerificatInfoService
{
get
{
if (_verificatInfoService == null)
_verificatInfoService = App.GetService<IVerificatInfoService>();
return _verificatInfoService;
}
}
public static bool CheckVerificat(long? userId, long? verificatId, bool autoUpdate = true)
{
var verificatInfo = userId != null ? VerificatInfoService.GetOne(verificatId ?? 0, false) : null;//获取token信息
if (verificatInfo != null)
{
if (verificatInfo.VerificatTimeout < DateTime.Now.AddMinutes(1))
{
if (!autoUpdate && verificatInfo.VerificatTimeout < DateTime.Now)
return false;
if (verificatInfo.VerificatTimeout.AddMinutes(verificatInfo.Expire) < DateTime.Now)
{
return false;
}
if (autoUpdate)
{
verificatInfo.VerificatTimeout = verificatInfo.VerificatTimeout.AddMinutes(verificatInfo.Expire); //新的过期时间
VerificatInfoService.Update(verificatInfo); //更新tokne信息到cache
}
//无法在server中刷新cookies单页面应用会一直保持登录状态所以这里不需要刷新cookies但是F5刷新后会重新登录
}
return true;
}
else
{
return false;
}
}
}

View File

@@ -0,0 +1,105 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Microsoft.AspNetCore.Components.Authorization;
using System.Security.Claims;
namespace ThingsGateway.Admin.Application;
/// <inheritdoc/>
public class BlazorHybridAuthenticationStateProvider : AuthenticationStateProvider
{
private readonly IAppService _appService;
private CancellationTokenSource _loopCancellationTokenSource = new CancellationTokenSource();
public BlazorHybridAuthenticationStateProvider(IAppService appService)
{
_appService = appService;
}
private AuthenticationState AuthenticationState = new AuthenticationState(new ClaimsPrincipal());
public void UserChanged(ClaimsPrincipal user)
{
AuthenticationState = new AuthenticationState(user);
NotifyAuthenticationStateChanged(GetAuthenticationStateAsync());
var oldCancellationTokenSource = _loopCancellationTokenSource;
if (oldCancellationTokenSource is not null)
{
oldCancellationTokenSource.Cancel();
oldCancellationTokenSource.Dispose();
}
_loopCancellationTokenSource = new CancellationTokenSource();
if (AuthenticationState.User?.Identity?.IsAuthenticated == true)
_ = RevalidationLoop(_loopCancellationTokenSource.Token);
}
private async Task RevalidationLoop(CancellationToken cancellationToken)
{
try
{
if (AuthenticationState.User.Identity?.IsAuthenticated == true)
{
while (!cancellationToken.IsCancellationRequested)
{
bool isValid = false;
try
{
await Task.Delay(30000, cancellationToken).ConfigureAwait(false);
isValid = await ValidateAuthenticationStateAsync(AuthenticationState, cancellationToken).ConfigureAwait(false);
}
catch (TaskCanceledException)
{
break;
}
if (!isValid)
{
ForceSignOut();
break;
}
}
}
}
catch
{
ForceSignOut();
}
}
protected virtual async Task<bool> ValidateAuthenticationStateAsync(AuthenticationState authenticationState, CancellationToken cancellationToken)
{
var userId = authenticationState.User.Claims.FirstOrDefault(it => it.Type == ClaimConst.UserId)?.Value?.ToLong();
var verificatId = authenticationState.User.Claims.FirstOrDefault(it => it.Type == ClaimConst.VerificatId)?.Value?.ToLong();
var result = BlazorAuthenticationHandler.CheckVerificat(userId, verificatId, false);
if (!result)
{
var verificatInfo = App.GetService<IVerificatInfoService>().GetOne(verificatId ?? 0, false);
if (App.HttpContext != null)
{
var identity = new ClaimsIdentity();
App.HttpContext.User = new ClaimsPrincipal(identity);
}
if (verificatInfo != null)
await App.GetService<INoticeService>().UserLoginOut(verificatInfo.ClientIds, App.CreateLocalizerByType(typeof(BlazorAuthenticationHandler))["UserExpire"]).ConfigureAwait(false);
}
return result;
}
private void ForceSignOut()
{
var anonymousUser = new ClaimsPrincipal(new ClaimsIdentity());
UserChanged(anonymousUser);
}
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
return Task.FromResult(AuthenticationState);
}
}

View File

@@ -0,0 +1,21 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
/// <inheritdoc/>
public class BlazorHybridAuthorizationHandler : BlazorAuthenticationHandler
{
public BlazorHybridAuthorizationHandler(ISysUserService sysUserService, ISysRoleService sysRoleService, ISysDictService sysDictService) : base(sysUserService, sysRoleService, sysDictService)
{
}
}

View File

@@ -0,0 +1,19 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
namespace ThingsGateway.Admin.Application;
/// <inheritdoc/>
public class BlazorServerAuthenticationHandler : BlazorAuthenticationHandler
{
public BlazorServerAuthenticationHandler(ISysUserService sysUserService, ISysRoleService sysRoleService, ISysDictService sysDictService) : base(sysUserService, sysRoleService, sysDictService)
{
}
}

View File

@@ -0,0 +1,50 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Server;
using Microsoft.Extensions.Logging;
using System.Security.Claims;
namespace ThingsGateway.Admin.Application;
/// <inheritdoc/>
public class BlazorServerAuthenticationStateProvider : RevalidatingServerAuthenticationStateProvider
{
private readonly IAppService _appService;
public BlazorServerAuthenticationStateProvider(ILoggerFactory loggerFactory, IAppService appService) : base(loggerFactory)
{
_appService = appService;
}
protected override TimeSpan RevalidationInterval => TimeSpan.FromSeconds(30);
protected override async Task<bool> ValidateAuthenticationStateAsync(AuthenticationState authenticationState, CancellationToken cancellationToken)
{
var userId = authenticationState.User.Claims.FirstOrDefault(it => it.Type == ClaimConst.UserId)?.Value?.ToLong();
var verificatId = authenticationState.User.Claims.FirstOrDefault(it => it.Type == ClaimConst.VerificatId)?.Value?.ToLong();
var result = BlazorAuthenticationHandler.CheckVerificat(userId, verificatId, false);
if (!result)
{
var verificatInfo = App.GetService<IVerificatInfoService>().GetOne(verificatId ?? 0, false);
if (App.HttpContext != null)
{
var identity = new ClaimsIdentity();
App.HttpContext.User = new ClaimsPrincipal(identity);
}
if (verificatInfo != null)
await App.GetService<INoticeService>().UserLoginOut(verificatInfo.ClientIds, App.CreateLocalizerByType(typeof(BlazorAuthenticationHandler))["UserExpire"]).ConfigureAwait(false);
}
return result;
}
}

View File

@@ -0,0 +1,102 @@
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://thingsgateway.cn/
// QQ群605534569
//------------------------------------------------------------------------------
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Localization;
using ThingsGateway.DataValidation;
using ThingsGateway.FriendlyException;
using ThingsGateway.Razor;
using ThingsGateway.UnifyResult;
namespace ThingsGateway.Admin.Application;
/// <summary>
/// 规范化RESTful风格返回值
/// </summary>
[UnifyModel(typeof(UnifyResult<>))]
public class UnifyResultProvider : IUnifyResultProvider
{
private static IStringLocalizer Localizer = App.CreateLocalizerByType(typeof(UnifyResultProvider))!;
/// <summary>
/// 状态码响应拦截
/// </summary>
public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings = null)
{
switch (statusCode)
{
// 处理 401 状态码
case StatusCodes.Status401Unauthorized:
await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, false, Localizer["TokenOver"].Value)).ConfigureAwait(false);
break;
// 处理 403 状态码
case StatusCodes.Status403Forbidden:
await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, false, default, Localizer["NoPermission"].Value)).ConfigureAwait(false);
break;
default: break;
}
}
/// <summary>
/// 成功返回
/// </summary>
/// <param name="context"></param>
/// <param name="data"></param>
/// <returns></returns>
public IActionResult OnSucceeded(ActionExecutedContext context, object? data)
{
return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data));
}
/// <summary>
/// 返回 RESTful 风格结果集
/// </summary>
/// <param name="statusCode">状态码</param>
/// <param name="succeeded">是否成功</param>
/// <param name="data">数据</param>
/// <param name="errors">错误信息</param>
/// <returns></returns>
private static UnifyResult<object> RESTfulResult(int statusCode, bool succeeded = default, object? data = default, object? errors = default)
{
return new UnifyResult<object>
{
Code = statusCode,
Msg = statusCode == StatusCodes.Status200OK ? "Success" : errors,
Data = data,
Time = DateTime.Now,
};
}
public IActionResult OnAuthorizeException(DefaultHttpContext context, ExceptionMetadata metadata)
{
return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors ?? metadata.Exception?.Message)
, UnifyContext.GetSerializerSettings(context));
}
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
{
return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors ?? metadata.Exception?.Message)
, UnifyContext.GetSerializerSettings(context));
}
public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
{
return new JsonResult(RESTfulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, data: metadata.Data, errors: metadata.ValidationResult) // 如果需要只显示第一条错误修改为errors: metadata.FirstErrorMessage
, UnifyContext.GetSerializerSettings(context));
}
}

View File

@@ -0,0 +1,124 @@
{
"RECORDS": [
{
"Id": 252875263003121,
"DictType": "System",
"Category": "LoginPolicy",
"Name": "VerificatExpireTime",
"Code": "14400",
"Remark": "Verificat过期时间(分)",
"IsDelete": "0",
"SortCode": 9
},
{
"Id": 252875263003720,
"DictType": "System",
"Category": "PagePolicy",
"Name": "Shortcuts",
"Code": "[100]",
"Remark": "系统默认工作台数据",
"IsDelete": "0",
"SortCode": 1
},
{
"Id": 252875263003728,
"DictType": "System",
"Category": "PasswordPolicy",
"Name": "DefaultPassword",
"Code": "111111",
"Remark": "默认用户密码",
"IsDelete": "0",
"SortCode": 1
},
{
"Id": 364564896825413,
"DictType": "System",
"Category": "LoginPolicy",
"Name": "SingleOpen",
"Code": "False",
"Remark": "单用户登录开关",
"IsDelete": "0",
"SortCode": 1
},
{
"Id": 432079540875333,
"DictType": "System",
"Category": "LoginPolicy",
"Name": "ErrorCount",
"Code": "10",
"Remark": "登录错误次数",
"IsDelete": "0",
"SortCode": 99
},
{
"Id": 432079718375493,
"DictType": "System",
"Category": "LoginPolicy",
"Name": "ErrorResetTime",
"Code": "1",
"Remark": "错误重置时间",
"IsDelete": "0",
"SortCode": 99
},
{
"Id": 432079850803269,
"DictType": "System",
"Category": "LoginPolicy",
"Name": "ErrorLockTime",
"Code": "2",
"Remark": "登录错误锁定时长",
"IsDelete": "0",
"SortCode": 99
},
{
"Id": 432111701160005,
"DictType": "System",
"Category": "PasswordPolicy",
"Name": "PasswordMinLen",
"Code": "6",
"Remark": "密码最小长度",
"IsDelete": "0",
"SortCode": 99
},
{
"Id": 432112135159877,
"DictType": "System",
"Category": "PasswordPolicy",
"Name": "PasswordContainNum",
"Code": "False",
"Remark": "包含数字",
"IsDelete": "0",
"SortCode": 99
},
{
"Id": 432112321953861,
"DictType": "System",
"Category": "PasswordPolicy",
"Name": "PasswordContainLower",
"Code": "False",
"Remark": "包含小写字母",
"IsDelete": "0",
"SortCode": 99
},
{
"Id": 432112380907589,
"DictType": "System",
"Category": "PasswordPolicy",
"Name": "PasswordContainUpper",
"Code": "False",
"Remark": "包含大写字母",
"IsDelete": "0",
"SortCode": 99
},
{
"Id": 432112495247429,
"DictType": "System",
"Category": "PasswordPolicy",
"Name": "PasswordContainChar",
"Code": "False",
"Remark": "包含特殊字符",
"IsDelete": "0",
"SortCode": 99
}
]
}

Some files were not shown because too many files have changed in this diff Show More