分类 默认分类 下的文章 - 记录笔记的地方
首页
联系
关于
搜 索
1
chrony同步阿里云时间
171 阅读
2
分布式定时任务
121 阅读
3
Frp配置
113 阅读
4
Swagger 3.0 集成
104 阅读
5
Dubbo 服务间通信
87 阅读
未分类
默认分类
Docker相关
Nginx相关
Ant Design Pro of Vue
Spring Boot 相关
Flutter
MAUI
登录
搜 索
标签搜索
随身WIFI
Skwax
累计撰写
27
篇文章
累计收到
3
条评论
首页
栏目
未分类
默认分类
Docker相关
Nginx相关
Ant Design Pro of Vue
Spring Boot 相关
Flutter
MAUI
页面
联系
关于
用户登录
登录
找到
16
篇与
默认分类
相关的结果
2021-08-10
Spring Cloud Gateway 使用
Spring Cloud Gateway基础使用//依赖 spring-cloud-starter-gateway //不能添加springweb依赖,网关采用netty,web采用tomcatapplication.yml//application.yml server: 80 spring: application: #服务名称 name: gateway cloud: #配置网关 gateway: discovery: locator: enable: true #启用DiscoveryClient网关集成,可以实现服务发现 #配置网关路由转发规则,是否转发以及转发路径 routes: - id: route1 #负载均衡 + 服务名称 uri: lb://demo #谓词:是否匹配,可用正则,共11种谓词,以下为Path predicates: - Path=/test, /index, /test*/** #过滤器,提供31种,可对请求和响应进行操作 filters: - AddRequestHeader=Context-Type, application-json #服务注册发现 nacos: discovery: server-addr: 192.168.2.8:8848 password: nacos username: nacos #哨兵 sentinel: eager: true transport: dashboard: 192.168.2.8:8849集成Swagger3.0.0pom.xml 添加<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>$</version> </dependency>添加 SwaggerProvider/** * 聚合系统接口 * @author Skwax */ @Component @Primary public class SwaggerProvider implements SwaggerResourcesProvider { /** * swagger3默认的url后缀 */ private static final String SWAGGER3URL = "/v3/api-docs"; /** * 网关路由 */ private final RouteLocator routeLocator; /** * gateway配置文件 */ private final GatewayProperties gatewayProperties; /** * 网关应用名称 */ @Value("$") private String self; @Autowired public SwaggerProvider(RouteLocator routeLocator, GatewayProperties gatewayProperties) { this.routeLocator = routeLocator; this.gatewayProperties = gatewayProperties; } /** * 对于gateway来说这块比较重要 让swagger能找到对应的服务 * * @return */ @Override public List<SwaggerResource> get() { List<SwaggerResource> resources = new ArrayList<>(); List<String> routes = new ArrayList<>(); routeLocator.getRoutes().subscribe(route -> routes.add(route.getId())); //从配置文件中获取并配置SwaggerResource gatewayProperties.getRoutes().stream() //过滤路由 .filter(routeDefinition -> routes.contains(routeDefinition.getId())) //循环添加,从路由的断言中获取,一般来说路由都会配置断言Path信息,这就不多说了 .forEach(route -> { route.getPredicates().stream() //获取Path信息 .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName())) //开始添加SwaggerResource .forEach(predicateDefinition -> resources.add(swaggerResource(route.getId(), predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0") .replace("**", SWAGGER3URL)))); }); return resources; } private SwaggerResource swaggerResource(String name, String location) { SwaggerResource swaggerResource = new SwaggerResource(); swaggerResource.setName(name); swaggerResource.setLocation(location); swaggerResource.setSwaggerVersion(DocumentationType.OAS_30.getVersion()); return swaggerResource; } }集成Sentinelpom.xml 添加 <!-- SpringCloud Alibaba Sentinel --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!-- SpringCloud Alibaba Sentinel Gateway --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency> <!-- Sentinel Datasource Nacos --> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>自定义谓词predicates: - Token=12345定义配置类,用于承载配置参数import lombok.Data; @Data public class TokenConfig { private String Token; }定义路由谓词工厂,类名固定格式import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory; import org.springframework.web.server.ServerWebExchange; import java.util.Collections; import java.util.List; import java.util.function.Predicate; @Component public class TokenRoutePredicateFactory extends AbstractRoutePredicateFactory<TokenConfig> { public TokenRoutePredicateFactory() { super(TokenConfig.class); } /* 将yml配置中的Token值存入TokenConfig类 */ @Override public List<String> shortcutFieldOrder() { return Collections.singletonList("token"); } /* 具体判断逻辑,返回true/false */ @Override public Predicate<ServerWebExchange> apply(TokenConfig config) { return exchange -> { //获取yml中配置的Token var token = config.getToken(); //获取请求的request var request = exchange.getRequest(); return true; }; } }自定义过滤器filters: - RequestLog=user, dsqda自定义网关过滤工厂import org.springframework.cloud.gateway.filter.GatewayFilter;import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;import org.springframework.stereotype.Component;@Componentpublic class RequestLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory ; }}自定义全局过滤器import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Component public class CustomeGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter(exchange); } //数值越小越靠前 @Override public int getOrder() { return 0; } }跨域增加配置类import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import org.springframework.web.util.pattern.PathPatternParser; @Configuration public class CorsConfig { @Bean public CorsWebFilter corsWebFilter(){ CorsConfiguration config = new CorsConfiguration(); config.addAllowedMethod("*"); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser()); source.registerCorsConfiguration("/**",config); return new CorsWebFilter(source); } }
2021年08月10日
23 阅读
0 评论
0 点赞
2021-08-10
SkyWalking 链路追踪
复制 192.168.2.9 上 /home/etier/skywalking 内 agent 目录至微服务运行服务器在微服务 运行启动时 加入参数埋点需要时指定 Skywalking Server 地址java -javaagent:/home/etier/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=yourappname -Dskywalking.collector.backend_service=192.168.2.9:11800 -jar yourappname.jaridea如何使用配置vm参数idea配置vm参数图:-javaagent:D:/agent/skywalking-agent.jar-Dskywalking.agent.service_name=ecloud-test-Dskywalking.collector.backend_service=192.168.2.9:11800
2021年08月10日
11 阅读
0 评论
0 点赞
2021-03-02
Frp配置
FRPfrp.servicevim /etc/systemd/system/frp.service刷新服务列表:systemctl daemon-reload设置开机自启systemctl enable frp关闭开机自启systemctl disable frp启动服务systemctl start frp停止服务systemctl stop frp服务状态systemctl status frp[Unit] Description=Frp Server Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/usr/local/frp_0.37.0/frps -c /usr/local/frp_0.37.0/frps.ini [Install] WantedBy=multi-user.targetfrps.ini[common] bind_port = 7000 bind_udp_port = 7000 max_pool_count = 10 token = password dashboard_port = 7500 dashboard_user = admin dashboard_pwd = passwordfrpc.ini[common] server_addr = 114.114.170.62 server_port = 7000 token = password [web] type = tcp local_ip = 127.0.0.1 local_port = 8072 remote_port = 8080
2021年03月02日
113 阅读
0 评论
0 点赞
2021-01-30
ELink 部署配置
ELink Wiki[TOC]环境依赖.NET Core 3.1Windows Server 2008 R2 SP1 以上Windows 7 SP1以上CentOS 7+ x64Debian 9+ x64部署于Linux时 连接的数据库版本 要求高于 SqlServer 2008 SP3.NET Core 3.1 微软系统要求说明:https://github.com/dotnet/core/blob/main/release-notes/3.1/3.1-supported-os.md版本更新详见每次迭代发布部署与说明打包为Windows 服务: 在软件根目录找到脚本:Install_Service.bat (安装服务) Uninstall_Service (卸载服务)主服务ELinkV5客服端的后台服务 包含V5运行所必须的各项内容。各个微服务的 主服务框架。适用于2021-02 月之后发布版本节点 Connection 修改 MsSql 的数据库连接字符串 ,不可使用本地连接,该连接会分发给客户端用以连接服务器主服务端口默认为8072授权文件在App_Data内(主服务版本1.0.2以上),关于响应压缩 :根据服务器配置选择 修改 appsettings.json 编辑 节点 Startup 修改 CompressionLevel 的值 (0-2),值越小 压缩越严格,占用服务器硬件资源越多,占用带宽越少 建议值为 1首次打开会自动在浏览器打开主服务的部署地址(如未打开可能被拦截,请手动打开:主服务地址/elinkinstall/),根据流程完成部署删除根目录下的 end 文件再次打开重新进入部署引导; 如果APIConfig.json内存在参数InstallFinish则需要删除该参数(目录下存在end 文件 或者 APIConfig.json内参数InstallFinish 为 true 不会进入部署引导)以下为非必须操作[ ] 打开 appsettings.json编辑 节点 Startup 修改 ApiUrls 的端口值 该值为程序启动占用的端口,该端口不可以被其他程序使用 (端口被其他程序占用时才需要修改)[ ] 打开 APIConfig.json编辑 节点 System 修改 消息推送 为 钉钉 或者 微信 需要发送消息 多个用 | 隔开启用 https[ ] 编辑 appsettings.json :编辑 节点 Startup 修改 ApiUrls 为https地址 如(https://*:443) 多端口 用 ; 隔开各个地址[ ] 编辑 APIConfig.json :编辑 节点 System 修改 SSLPath 为 ssl证书文件绝对路径 ( 路径内 \ 需要转义 即 修改为 \\ 例如 E:\\zhengshu.crt)编辑 节点 System 修改 SSLPassword 为 ssl证书密钥报错日志在根目录的 Log 文件加内查看主服务插件钉钉插件(DingTalkDocking)集成与主服务中,签卡回调如需要使用钉钉签卡回调, (该回调对应钉钉考勤签到应用) 详细见 钉钉回调说明文档需要在钉钉后台配置 事件订阅,事件回调地址为 http://ceshi.etiersoft.com:8072/DingTalkDocking/V1/CallBack 域名端口替换为客户的公网地址并将事件订阅的 aes_key 和 token 填入 主服务的APIConfig.json文件 DingTalk 节点下的 Event_Aes_Key 和 Event_Token重要 钉钉考勤签到应用 签卡回调不区分外签还是内签 需要设置钉钉不允许再考勤签到内打外签卡签卡拉取如需要使用钉钉签卡拉取,配置主服务内 APIConfig.json 参数 DingTalk=> PullOutRecordInsertToRecord 是否将拉取到的钉钉外签卡写入t_attrecord 默认false;添加计划任务 http://ceshi.etiersoft.com:8072/DingTalkDocking/V1/Record/Pull 域名端口替换为客户的公网地址计划任务 每次执行拉取时取上次执行结束时间作为本次的开始时间,指定开始结束时间 http://ceshi.etiersoft.com:8072/DingTalkDocking/V1/Record/Pull?startDate=2020-02-01&endDate=2020-02-05`参数 syncInSideRecord 是否将拉取到的钉钉内签卡写入 t_attrecord 默认true; 参数 syncOutSideRecord 是否将拉取到的钉钉外签卡写入t_attyunrecord 默认true;http://ceshi.etiersoft.com:8072/DingTalkDocking/V1/Record/Pull?startDate=2020-02-01&endDate=2020-02-05&syncInSideRecord=true&syncOutSideRecord=true`syncInSideRecord 与 syncOutSideRecord 都为false时 接口将返回拉取到的签卡记录用于排查参数 deptid (hr部门id)表示只拉取该部门及其子部门的人员签卡http://ceshi.etiersoft.com:8072/DingTalkDocking/V1/Record/Pull?deptid=1微信插件(WeChatDocking)集成与主服务中, 需要验证回调域名 将从微信下载的txt文件置于ELink根目录下wwwroot文件夹内即可签卡拉取如需要使用微信签卡拉取, 主服务内 APIConfig.json 参数 WeChat=> PullOutRecordInsertToRecord 是否将拉取到的微信外出签卡写入t_attrecord 默认false;配置主服务内 APIConfig.json 参数 WeChat=> PullOutRecordInsertToRecord 是否将拉取到的微信外出签卡写入t_attrecord 默认false;配置主服务内 APIConfig.json 参数 WeChat=> RecordAgentId 和 RecordAppSecret 对应微信后台签卡应用的AgentId和Secret;添加计划任务 http://ceshi.etiersoft.com:8072/WeChatDocking/V1/Record/Pull **域名端口替换为客户的公网地址计划任务 每次执行拉取时取上次执行结束时间作为本次的开始时间,指定开始结束时间 http://ceshi.etiersoft.com:8072/WeChatDocking/V1/Record/Pull?startDate=2020-02-01&endDate=2020-02-05`参数 syncInSideRecord 是否将拉取到的微信内签卡写入 t_attrecord 默认true; 参数 syncOutSideRecord 是否将拉取到的微信外签卡写入t_attyunrecord 默认true;http://ceshi.etiersoft.com:8072/WeChatDocking/V1/Record/Pull?startDate=2020-02-01&endDate=2020-02-05&syncInSideRecord=true&syncOutSideRecord=true`syncInSideRecord 与 syncOutSideRecord 都为false时 接口将返回拉取到的签卡记录用于排查参数 deptid (hr部门id)表示只拉取该部门及其子部门的人员签卡http://ceshi.etiersoft.com:8072/WeChatDocking/V1/Record/Pull?deptid=1小微云插件 (CloudDocking)在三方管理内配置 账号 密码每7200秒默认为token过期会重新请求token;同步:将hr内人员部门推送至云端(云端已有则绑定)。 不会将云端头像拉取过来云端后台如果配置园区回调地址 https://elink公网地址/CloudDocking/V1/CallBack 则表示将云端人员部门的增删改同步至hr(hr内需要有人员部门的绑定关系)以下为非必须操做[ ] 打开APIConfig.json编辑 节点 Cloud 修改 BASE_URL 配置 小微云的接口地址, 不配置默认为 https://v6.etiersoft.com员工助手 (YunAppService)提供员工助手的接口[x] 打开放置前端文件将最新的手机前端文件放入ELink 园区服务的 wwwroot文件夹内; 访问地址为 园区服务地址加前端文件夹的名称(如文件夹名:HrWeChat 则:ELink地址/HrWeChat )[x] 打开APIConfig.json编辑 节点 hrwechat 修改 内容 控制手机页面界面; Sort 控制显示顺序 Model 控制显示模块注意 节点 hrwechat 为 前端文件的文件夹名小写字母 实际情况根据 放置前端文件时命名的文件夹名称为准编辑 节点 System 修改 DataCenterUrl 配置 计算服务的地址 ,必须为公网地址企业微信后台配置主页 : ELink地址+ /WeChatDocking/V1/User/Login钉钉后台配置主页 : ELink地址+ /DingTalkDocking/V1/User/Login如果放置的前端文件夹名不为 HrWeChat 如 命名为 kaoqing 只要显示考勤模块 :企业微信后台配置主页 : ELink地址+ /WeChatDocking/V1/User/Login?returnurl=ELink地址+/kaoqing钉钉后台配置主页 : ELink地址+ /DingTalkDocking/V1/User/Login?returnurl=ELink地址+/kaoqing编辑 节点 kaoqing (自定义的名称需要复制原配置自行修改) 修改 内容 控制手机页面界面; Sort 控制显示顺序 Model 控制显示模块独立微服务海康适配器服务(HIKVisionAdapter)连接海康人脸设备一体机使用通用部署引导删除根目录下的 end 文件再次打开重新进入部署引导海康设备进行计次消费使用海康设备进行计次消费时,HR内录入 设备类型为考勤门禁机,品牌为海康计次 的设备, 再配置计次设备的消费方案,门禁记录将进入消费记录内,单时段最多写入次数为消费方案内设定的次数需要联动校讯通需要联动校讯通时 需要在 APIConfig.json 的 SiXun 节点内配置 AttPush(是否启用考勤签卡推送) AccessPush(是否启用门禁签卡推送) Token(校讯通学校令牌) ServerUrl(校讯通服务器地址) 目前前端显示 重发等依赖iis中台 仅在业务中排除了物联中台 或者依赖ELink 三方接口内的校讯通模块需要推送打卡提醒在 APIConfig.json 的 System 节点内配置 消息推送 (配置需要推送的类型 “微信|钉钉”) 需要将适配器注册至主服务如需要推送至IIS 在 APIConfig.json 的 IIS 节点内配置 NotifyPush (是否启用推送至IIS) NotifyUrl (IIS中台地址 http://192.168.2.211:8081)配置文件说明:[ ] 打开 appsettings.json编辑 节点 Startup 修改 ApiUrls 的端口值 该值为程序启动占用的端口,该端口不可以被其他程序使用编辑 节点 MicroService 修改 MasterService 的主服务连接地址。 节点内 Enable 值为 false 表示不向主服务注册编辑 节点 Connection 修改 MsSql 的数据库连接字符串 (如果配置主服务地址,跳过该步骤,适配器会向主服务请求数据库连接)编辑 节点 MicroService 修改 UrlPath 的连接 为本适配器的连接地址。 该链接需要可以让主服务程序访问[ ] 打开APIConfig.json编辑 节点 HIKVisionAdapter 修改 UseEnrollNo 配置 false 表示使用EmployeeId做为Pin码编辑 节点 HIKVisionAdapter 修改 GardenSdkType 配置 连接的设备接口类型 多个接口用, 隔开, 默认 海康接口 对应V5客户端的设备接口以下操作需要注意:如果服务器上原本已运行任何 中控软件 ,注册中控sdk 可能导致原有程序报错注册中控Sdk :进入适配器目录 > x86 > dll 先运行脚本 Delete_SDK.bat 再运行 install.bat如果适配器运行报错 请多重试注册Sdk; 如果无效请收集日志Pin码默认EmployeeId (根据目录内APIConfig.json内 ZKTPullAdapter 节点 UseEnrollNo 配置 true 表示使用考勤登记号,推荐使用EmployeeId 做为Pin码)下发照片进行压缩到200k以内 系统录入照片时建议大小控制在100~200k之间 不可小于100k 像素点过低无法识别,人脸需要居中于照片, 如果人脸占用照片画面大部分,请尝试手动压缩至200k以内再录入系统读取人事表内卡号人员无卡号时 卡号填充为Pin码连接设备时默认下发一组时间区 00:00 - 23:59 占用设备TimezoneId为1 门号1111 全部门有权限下发人员默认设置权限为,TimezoneId为1访问 适配器地址/ZKTPullAdapter/V1/Driver/SearchMachine 扫描获取局域网内的设备 当前返回Json 数据在V5客户端添加门禁设备 数据由 适配器返回的 Json 内查看,或者使用中控的软件查看中控Pull适配器(ZKTPullAdapter)连接中控门禁板使用通用部署引导删除根目录下的 end 文件再次打开重新进入部署引导配置文件说明:[ ] 打开 appsettings.json编辑 节点 Startup 修改 ApiUrls 的端口值 该值为程序启动占用的端口,该端口不可以被其他程序使用编辑 节点 MicroService 修改 MasterService 的主服务连接地址。 节点内 Enable 值为 false 表示不向主服务注册编辑 节点 Connection 修改 MsSql 的数据库连接字符串 (如果配置主服务地址,跳过该步骤,适配器会向主服务请求数据库连接)编辑 节点 MicroService 修改 UrlPath 的连接 为本适配器的连接地址。 该链接需要可以让主服务程序访问[ ] 打开APIConfig.json编辑 节点 ZKTPullAdapter 修改 UseEnrollNo 配置 false 表示使用EmployeeId做为Pin码编辑 节点 ZKTPullAdapter 修改 GardenSdkType 配置 连接的设备接口类型 多个接口用, 隔开, 默认 物联中台接口 对应V5客户端的设备接口以下操作需要注意:如果服务器上原本已运行任何 中控软件 ,中控适配器 可能导致原有程序报错注册中控Sdk :进入适配器目录 > x86 > dll 先运行脚本 Delete_SDK.bat 再运行 install.bat如果适配器运行报错 请多重试注册Sdk; 如果无效请收集日志Pin码默认EmployeeId (根据目录内APIConfig.json内 ZKTPullAdapter 节点 UseEnrollNo 配置 true 表示使用考勤登记号,推荐使用EmployeeId 做为Pin码)读取人事表内卡号人员无卡号时 卡号填充为Pin码连接设备时默认下发一组时间区 00:00 - 23:59 占用设备TimezoneId为1 门号1111 全部门有权限下发人员默认设置权限为,TimezoneId为1访问 适配器地址/ZKTPullAdapter/V1/Driver/SearchMachine 扫描获取局域网内的设备 当前返回Json 数据在V5客户端添加门禁设备 数据由 适配器返回的 Json 内查看,或者使用中控的软件查看中控Push适配器(ZKTPushAdapter)连接中控考勤机 设备内配置服务器地址为本适配器的通讯地址 设备pushver需要大于2.2.14使用通用部署引导删除根目录下的 end 文件再次打开重新进入部署引导配置文件说明:[ ] 打开 appsettings.json编辑 节点 Startup 修改 ApiUrls 的端口值 该值为程序启动占用的端口,该端口不可以被其他程序使用编辑 节点 MicroService 修改 MasterService 的主服务连接地址。 节点内 Enable 值为 false 表示不向主服务注册编辑 节点 Connection 修改 MsSql 的数据库连接字符串 (如果配置主服务地址,跳过该步骤,适配器会向主服务请求数据库连接)编辑 节点 MicroService 修改 UrlPath 的连接 为本适配器的连接地址。 该链接需要可以让主服务程序访问[ ] 打开APIConfig.json编辑 节点 ZKTPushAdapter 修改 UseEnrollNo 配置 false 表示使用EmployeeId做为Pin码编辑 节点 ZKTPushAdapter 修改 GardenSdkType 配置 连接的设备接口类型 多个接口用, 隔开, 默认 物联中台接口 对应V5客户端的设备接口设备存储人脸和指纹 为特征码, 新录入人员步骤: 客户端录入信息 > 下发至设备 > 设备上录入人脸 和 指纹 > 采集刚刚下发的人员(采集人脸和指纹)> 下发人员至其他设备由于存储为特征码 上传再下发后部分人员可能存在识别精度问题,需要在设备设置内调低识别 阈值Pin码默认EmployeeId (根据目录内APIConfig.json内 ZKTPushAdapter 节点 UseEnrollNo 配置 true 表示使用考勤登记号,推荐使用EmployeeId 做为Pin码)读取人事表内卡号人员无卡号时 卡号填充为Pin码设备需要刷机升级固件支持 pushver2.2.14 以上才可用于本适配器指纹特征 和人脸特征存于 t_attfingerprint设备需要厂家刷机后才能支持 pushver 2.2.14 !!!!!微耕适配器(WGAdapter)连接微耕门禁控制板使用通用部署引导删除根目录下的 end 文件再次打开重新进入部署引导配置文件说明:[ ] 打开 appsettings.json编辑 节点 Startup 修改 ApiUrls 的端口值 该值为程序启动占用的端口,该端口不可以被其他程序使用编辑 节点 MicroService 修改 MasterService 的主服务连接地址。 节点内 Enable 值为 false 表示不向主服务注册编辑 节点 Connection 修改 MsSql 的数据库连接字符串 (如果配置主服务地址,跳过该步骤,适配器会向主服务请求数据库连接)编辑 节点 MicroService 修改 UrlPath 的连接 为本适配器的连接地址。 该链接需要可以让主服务程序访问[ ] 打开APIConfig.json编辑 节点 WGAdapter 修改 UseEnrollNo 配置 false 表示使用EmployeeId做为Pin码编辑 节点 WGAdapter 修改 GardenSdkType 配置 连接的设备接口类型 多个接口用, 隔开, 默认 易天门禁接口 对应V5客户端的设备接口微耕设备无Pin码概念,无人员姓名概念, 以卡号为人员标识, 门禁权限下发 仅支持类型 每日 每周 , 人员通行时间段以周为单位存储读取人事表内卡号人员无卡号时 卡号填充为EmployeeId松美消费适配器(SongMeiConsumeAdapter)连接松美消费机 设备内配置服务器地址为本适配器的通讯地址使用通用部署引导删除根目录下的 end 文件再次打开重新进入部署引导机器出厂密码 11223344 进入机器后台 后在《网络配置》内配置《服务器地址》 为适配器的地址[x] 打开 appsettings.json编辑 节点 Startup 修改 ApiUrls 的端口值 该值为程序启动占用的端口,该端口不可以被其他程序使用编辑 节点 MicroService 修改 MasterService 的主服务连接地址。 节点内 Enable 值为 false 表示不向主服务注册编辑 节点 Connection 修改 MsSql 的数据库连接字符串 (如果配置主服务地址,跳过该步骤,适配器会向主服务请求数据库连接)编辑 节点 MicroService 修改 UrlPath 的连接 为本适配器的连接地址。 该链接需要可以让主服务程序访问[x] 打开APIConfig.json编辑 节点 SongMeiConsumeAdapter 修改 UseEnrollNo 配置 false 表示使用EmployeeId做为Pin码编辑 节点 SongMeiConsumeAdapter 修改 HeartBeatTime 配置 设备心跳的间隔 (注意如果配置过长,只能重置设备来恢复)[x] 离线消费支持离线消费(需要在机器上设置,或者下发参数(园区客户端消费机模块内配置后由指令下发)), 连上服务器后 会将离线记录传给服务器[x] 在线消费消费成功与否由服务器判断 可实现现行消费功能[x] 消费记录在线消费时 直接写入数据库通过下发设备参数指定恢复最近的消费记录(条数,不支时间范围),要求设备重新上传记录海康消费适配器(HIKVisionConsumeAdapter)hr消费机管理模块内录入 设备 ip, 账号, 密码, 序列号 , 品牌填写 海康人脸 端口填写 80配置appsettings.json(见下方)后启动适配器hr消费机管理用用指令下发人员至设备[x] 打开 appsettings.json编辑 节点 Startup 修改 ApiUrls 的端口值 该值为程序启动占用的端口,该端口不可以被其他程序使用编辑 节点 MicroService 修改 MasterService 的主服务连接地址。 节点内 Enable 值为 false 表示不向主服务注册编辑 节点 Connection 修改 MsSql 的数据库连接字符串 (如果配置主服务地址,跳过该步骤,适配器会向主服务请求数据库连接)编辑 节点 MicroService 修改 UrlPath 的连接 为本适配器的连接地址。 该链接需要可以让主服务程序访问[x] 离线消费支持离线消费(需要在机器上设置,), 连上服务器后 会将离线记录传给服务器[x] 在线消费消费成功与否由服务器判断 可实现现行消费功能[x] 消费记录在线消费时 直接写入数据库[x] 消费退款设备点击退款, 验证人脸 , 输入纠错密码 并确认设备仅可退款上一笔消费,且不可重复退款,纠错密码在设备设置内修改,如未设置 不可进行退款操作浩顺适配器(HSunAdapter)浩顺设备序列号在设备菜单内的 《云序列号》中查看 ,设备内配置服务器地址为本适配器的通讯地址使用通用部署引导删除根目录下的 end 文件再次打开重新进入部署引导配置文件说明:[ ] 打开 appsettings.json编辑 节点 Startup 修改 ApiUrls 的端口值 该值为程序启动占用的端口,该端口不可以被其他程序使用编辑 节点 MicroService 修改 MasterService 的主服务连接地址。 节点内 Enable 值为 false 表示不向主服务注册编辑 节点 Connection 修改 MsSql 的数据库连接字符串 (如果配置主服务地址,跳过该步骤,适配器会向主服务请求数据库连接)编辑 节点 MicroService 修改 UrlPath 的连接 为本适配器的连接地址。 该链接需要可以让主服务程序访问[ ] 打开APIConfig.json编辑 节点 HSunAdapter 修改 UseEnrollNo 配置 false 表示使用EmployeeId做为Pin码设备存储人脸和指纹 为特征码, 新录入人员步骤: 客户端录入信息 > 下发至设备 > 设备上录入人脸 和 指纹 > 采集刚刚下发的人员(采集人脸和指纹)> 下发人员至其他设备读取人事表内卡号人员无卡号时 卡号填充为Pin码指纹特征 和人脸特征存于 t_attfingerprintActiveReport服务(ARReport)AR报表服务提供客户端 和手机端 的报表支持提供b/s端的报表查看和编辑 账号与客户端账号通用使用通用部署引导删除根目录下的 end 文件再次打开重新进入部署引导配置文件说明:[ ] 打开 appsettings.json编辑 节点 Startup 修改 ApiUrls 的端口值 该值为程序启动占用的端口,该端口不可以被其他程序使用编辑 节点 MicroService 修改 MasterService 的主服务连接地址。 节点内 Enable 值为 false 表示不向主服务注册编辑 节点 Connection 修改 MsSql 的数据库连接字符串 (如果配置主服务地址,跳过该步骤,适配器会向主服务请求数据库连接)编辑 节点 MicroService 修改 UrlPath 的连接 为本适配器的连接地址。 该链接需要可以让主服务程序访问工具相关说明IIS微信钉钉同步关系迁移至ELink打开ELink根目录,找到目录Tools 找到程序 IIS2ELink.exe 双击运行, 填入老IIS中台数据库连接 和HR数据库连接 点击迁移。 (如无法运行先安装.NetCore3.1 Runtime x64 运行环境)计划任务 相关说明计划任务配置字段字段名称备注JobName你给这个httpjob起的名称【必填项】 不与其他job名称重复Method这个httpjob的请求方式 “get” 或者 “post” 【必填项】ContentType这个httpjob的请求ContentType 默认”application/json” 【必填项】Url这个httpjob的请求url 【必填项】CronCron表达式 可以先用【Cron表达式生成】功能生成好,如果为空则代表只能是手动出发执行!Data这个httpjob在Method=“post”的时候可以指定post的内容,可以是一个对象也可以是一个string或者其他类型Timeout这个httpjob请求的超时时间(单位是毫秒 例如5000 代表是5秒)BasicUserName这个httpjob请求需要启用basic认证时设置的usernameBasicPassword这个httpjob请求需要启用basic认证时设置的密码EnableRetry失败的时候(比如超时 远程服务器请求错误等)是否启用重试 默认falseRetryTimes错误尝试次数自定义,EnableRetry=true的时候启用RetryDelaysInSeconds失败重试区间,半角逗号隔开,EnableRetry=true的时候启用SendSuccesstrue 或 false 任务执行成功时是否发送通知(钉钉或微信)SendFailtrue 或 false 任务执行成功时是否发送通知(钉钉或企业微信)DingTalk钉钉通知配置-Token钉钉群自定义机器人的 Token 安全设置请配置关键词为 “任务”-AtPhones需要@的人员手机号 多个用英文“,”隔开-IsAtAll是否@所有人WeChat微信通知配置-Token企业微信群机器人的 Token-AtPhones需要@的人员手机号 多个用英文“,”隔开-IsAtAll是否@所有人需要向钉钉或微信发送执行结果时 需要为任务配置 DingTalk 和 WeChat 参数(参数说明见 计划任务配置字段)计划任务汇总任务名称Url地址请求方式参数备注签到签退提醒/ELink/V1/Plan/AttCheckRemindGET每次执行根据排班添加或更新当天和明天的签到签退消息提醒任务昨天未签到提醒/ELink/V1/Plan/UnCheckedRemindGET根据昨天日报表提醒员工助手订阅报表推送/HRDefaultJob/ReportCenter/InspectMinuteGET日报表生成/ELink/V1/Plan/GreateDailyReportGETStartDate=2020-01-01&EndDate&2020-01-02&day=1day默认值为1;StartDate默认为当前时间减天数day; EndDate 默认当前时间月报表生成/ELink/V1/Plan/GreateMonthReportGETStartDate=2020-01-01&EndDate&2020-01-02&month=1month默认值为1;StartDate开始日期; EndDate 结束日期;【month代表生成前多少月的报表(含本月),StartDate-EndDate自定义生成日期】每月定时生成上月的报表/HRDefaultJob/Attendance/GenerateMonthReportGET媒体分发刷新时间设置/HRMedia/Message/RefreshMachineGET从考勤设备中删除时间范围内离职人员/HRDefaultJob/Employee/DeleteAttMachineEmployeeGETstart=-1&end=0start表示开始的时间,前一天-1,end表示结束的时间,当天0,不填写默认当天从门禁设备中删除时间范围内离职人员/HRDefaultJob/Employee/DeleteAccessMachineEmployeeGETstart=-1&end=0start表示开始的时间,前一天-1,end表示结束的时间,当天0,不填写默认当天上传时间段内入职人员至门禁设备/HRDefaultJob/Employee/UploadAccessMachineEmployeeGETstart=-1&end=0start表示开始的时间,前一天-1,end表示结束的时间,当天0,不填写默认当天上传时间段内入职人员至门禁设备(无门禁授权人员不下发)/HRDefaultJob/Employee/UploadAccessMachineEmployeeExGETstart=-1&end=0start表示开始的时间,前一天-1,end表示结束的时间,当天0,不填写默认当天更新当前在职员工门禁授权/HRDefaultJob/Employee/UpdateEmployeeAccessAuthorizeGET如果当前无授权,且未下发授权,则人员不下发;如果当前无授权,但已下发授权,则从设备删除此人员如果当前授权与已下发授权一致,则不下发上传时间段内入职人员至考勤设备/HRDefaultJob/Employee/UploadAttMachineEmployeeGETstart=-1&end=0start表示开始的时间,前一天-1,end表示结束的时间,当天0,不填写默认当天同步HR和钉钉部门/DingTalkDocking/V1/Department/SyncAllGETHR作为源数据;新增,删除(HR内已撤销),修改钉钉部门同步HR和钉钉人员/DingTalkDocking/V1/User/SyncAllGETHR作为源数据;新增,删除钉钉人员拉取钉钉人员对应HR人员/DingTalkDocking/V1/User/SyncPullGET需要钉钉开放人员权限(需要能获取手机号) 不会新增HR内不存在的人员钉钉签卡拉取 (拉取钉钉 考勤打卡应用数据)/DingTalkDocking/V1/Record/PullGET详见上方部署说明(请务必查看)每次执行拉取时取上次执行结束时间作为本次的开始时间,同步HR和微信部门/WeChatDocking/V1/Department/SyncAllGETHR作为源数据;新增,删除(HR内已撤销),修改微信部门同步HR和微信人员/WeChatDocking/V1/User/SyncAllGETHR作为源数据;新增,删除微信人员拉取微信人员对应HR人员/WeChatDocking/V1/User/SyncPullGETweChatRootId=1weChatRootId默认值为1,表示微信的部门id, 只拉取该部门及其子部门下的人员微信签卡拉取(拉取微信 打卡应用数据)/WeChatDocking/V1/Record/PullGET详见上方部署说明(请务必查看)每次执行拉取时取上次执行结束时间作为本次的开始时间,
2021年01月30日
14 阅读
0 评论
0 点赞
2021-01-19
主框架ELink说明
.NET Core 园区服务框架[TOC]环境依赖.NET Core 3.1特性ELink 身份认证 :通过登陆接口获取身份 JwtToken,在请求头内 添加值 Key:Authorization Value:Bearer JwtToken程序内 HttpContext.User.Identity.IsAuthenticated 状态为True推荐使用 服务端 无状态 各个服务Token通用通过登陆接口获取身份 JwtToken,在Cookie内 添加值 Key:token Value:JWTTokenHttpContext.User.Identity.IsAuthenticated 状态为False服务端 无状态 各个服务Token通用不推荐,做了多余解析消耗性能, 仅为了 钉钉微信登陆跳转而支持通过登陆接口获取工号,在Cookie内 添加值 Key:euid Value:工号该方式年后废弃 不在支持环境配置database.json 内配置数据库连接 2021-02-04 已统一至 appsettings.json内appsettings.json 内 Startup 节点 配置程序端口APIConfig.json 内配置插件参数, 详细参考各个插件自身说明介绍在主程序中启用通过IHostBuilder的UsePluginFactory方法启用插件库var builder = Host.CreateDefaultBuilder(args); builder.UsePluginFactory(); 使用程序运行目录下的plugins目录作为插件程序集目录, 使用appsettings.json配置文件作为插件配置文件注意 直接生成dll到宿主插件目录 ,在宿主自动重载插件时目录可能会出现dll引用错误, 建议手动覆盖插件的文件到目录内去除不必须的dll编写支持初始化的插件插件是实现了IPlugin接口的类,提供了PluginBase基类,一般从此类继承即可。标准插件具有启动和停止方法,通过IPluginFactory进行控制。要编写插件,一般遵循以下步骤:创建插件项目(.NET Core 类库),如TestPluginA添加ELink.IPluginFactory.dll创建插件类,如Plugin,从PluginBase继承在插件中控制宿主的依赖注入,如注入新的服务等,这时候可通过实现支持初始化的插件(ISupportInitPlugin)来实现,该接口的Init方法将在依赖注入构建之前调用,通过方法参数IPluginInitContext中的ServiceCollection可以注入容器。 public class Plugin : PluginBase, ISupportInitPlugin { public void Init(IPluginInitContext context) { // 注入服务 // 宿主 依赖注入构建前执行 //context.ServiceCollection.TryAddScoped<ICustomerService>(); // 宿主会自动注入插件内继承【ControllerBase】的Controller } public override Task StartAsync(IPluginContext context) { // 插件启动前执行 // 宿主 依赖注入构建后执行 Console.WriteLine("插件A已启动"); return base.StartAsync(context); } public override Task StopAsync(IPluginContext context) { Console.WriteLine("插件A已停止"); return base.StopAsync(context); } } //Route 注意插件间不要重复 [Route("TestPlugin/[controller]/[action]")] public class TestController : ControllerBase { [HttpGet] public ActionResult<List<Employee>> Get() { var sdf = new BaseService<Employee>(); return sdf.GetWhere(p => 1 == 1); //return sdf.GetFirst(p => 1 == 1); } [SugarTable("t_employee")] public class Employee { [SugarColumn(IsPrimaryKey = true)] public string employeeid public string employeename public string employeeno } } *启动或停止方法中可通过context中的ServiceProvider获取注入服务* 通过PluginAttribute特性设置插件的元数据[Plugin(Alias = "PluginA", Description = "测试插件")]public class Plugin : PluginBase*载入的插件列表信息可以通过`PluginFactory.PluginInfoList`获取* 插件启动IPluginFactory 本身实现了 .NET Core扩展库的IHostedService机制,插件的启动及停止将自动跟随宿主进行使用插件配置建议还是自定义一个配置文件来读取插件支持 .NET Core 扩展库中的Options及Configuration机制,只需要从SupportConfigPluginBase<TOptions>类继承实现插件即可,其中TOptions泛型为插件的配置类型。插件配置自动从宿主配置或启用插件工厂时传入的配置中获取,插件配置位于配置下的plugins节点,该节点下以插件类名称或插件别名(通过PluginAttribute特性指定)作为键名,此键之下为插件的配置,如以下配置文件: { "Plugins": { "PluginA": { "TestConfig": "Hello World" }, } }扩展PluginA实现配置:定义配置类,如PluginOptions public class PluginOptions { public string TestConfig } 实现插件 [Plugin(Alias = "PluginA", Description = "测试插件")] public class Plugin : SupportConfigPluginBase<PluginOptions>, ISupportInitPlugin { public Plugin(IOptionsMonitor<PluginOptions> options) : base(options) { } public void Init(IPluginInitContext context) { // 注入服务 初始化方法中也可使用注入的配置 //context.ServiceCollection.TryAddScoped<ICustomerService>(); Console.WriteLine($"Init 插件配置:"); } public override Task StartAsync(IPluginContext context) { Console.WriteLine("插件A已启动"); Console.WriteLine($"StartAsync 插件配置:"); return base.StartAsync(context); } public override Task StopAsync(IPluginContext context) { Console.WriteLine("插件A已停止"); return base.StopAsync(context); } 特性:接口路由请使用接口项目名/版本/url的形式 如testplugin/v1/user支持热加载插件目录只允许出现dll结尾的文件,防止引用时出错, 如和主程序dll重复 默认优先使用插件目录下的dll采用 SqlSugar ORM 组件 https://github.com/sunkaixuan/SqlSugar采用 服务 + 接口 的形式封装框架采用 NLog 日志组件采用 Swagger 自动生成 WebAPI 说明文档封装全局 异常 拦截器 (自动记录系统异常日志)封装全局 请求 拦截器 (自动记录接口请求日志)appsettings.json 配置 CORS 跨域database.json 配置 数据库连接多数据库支持(待实现) SqlSugar 支持缓存关系数据库查询结果 配合redis 待实现#模块功能项目文件说明1公共库ELink.Common存放常用类库 、加密解密单元等 , 类扩展2核心库ELink.Core ELink.DataAccess数据库、缓存相关类4服务层BLLService 、 IServer, Model, Dto 基础服务类5业务层ELink.WebWebAPI 主程序 插件宿主6插件库ELink.PluginFactory ELink.IPluginFactory插件实现 分离防止热加载时出现找不到实现Hangfire.HttpJob Josn配置#字段名称备注1JobName你给这个httpjob起的名称【必填项】2Method这个httpjob的请求方式 "get" 或者 "post" 【必填项】4ContentType这个httpjob的请求ContentType 默认"application/json" 【必填项】5Url这个httpjob的请求url 【必填项】6DelayFromMinutes需要延迟执行的分钟,==注意:0 代表立刻执行; -1代表只能手动触发; >=1代表延迟分钟数== 【必填项】7Data这个httpjob在Method=“post”的时候可以指定post的内容,可以是一个对象也可以是一个string或者其他类型8Timeout这个httpjob请求的超时时间(单位是毫秒 例如5000 代表是5秒)9BasicUserName这个httpjob请求需要启用basic认证时设置的username10BasicPassword这个httpjob请求需要启用basic认证时设置的密码11EnableRetry失败的时候(比如超时 远程服务器请求错误等)是否启用重试 默认false12RetryTimes错误尝试次数自定义,EnableRetry=true的时候启用13RetryDelaysInSeconds失败重试区间,半角逗号隔开,EnableRetry=true的时候启用14SendSuccess这个httpjob请求无异常的时候是否发送通知 默认false15SendFail这个httpjob请求异常的时候是否发送通知 默认true16DingTalk.Token设置钉钉机器人的群Token 没有这个不会发送的17DingTalk.AtPhones设置钉钉机器人发送消息的时候要不要@人,多个用半角逗号隔开18DingTalk.IsAtAll设置钉钉机器人发送消息的时候要不要@所有的人,默认false
2021年01月19日
15 阅读
0 评论
0 点赞
1
2
3
4