diff --git a/JSD-8813配置使用文档.docx b/JSD-8813配置使用文档.docx
new file mode 100644
index 0000000..62afe3f
Binary files /dev/null and b/JSD-8813配置使用文档.docx differ
diff --git a/JSD-8813需求确认书.docx b/JSD-8813需求确认书.docx
new file mode 100644
index 0000000..7cf6b76
Binary files /dev/null and b/JSD-8813需求确认书.docx differ
diff --git a/README.md b/README.md
index fee7252..628b365 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,6 @@
# open-JSD-8813
-JSD-8813 开源任务材料
\ No newline at end of file
+JSD-8813 用户操作接口(WS开放) + token单点 开源任务材料\
+免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\
+仅作为开发者学习参考使用!禁止用于任何商业用途!\
+为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。
\ No newline at end of file
diff --git a/lib/cxf-core-3.2.14.jar b/lib/cxf-core-3.2.14.jar
new file mode 100644
index 0000000..c549783
Binary files /dev/null and b/lib/cxf-core-3.2.14.jar differ
diff --git a/lib/cxf-integration-jca-3.2.14.jar b/lib/cxf-integration-jca-3.2.14.jar
new file mode 100644
index 0000000..a3c9d9e
Binary files /dev/null and b/lib/cxf-integration-jca-3.2.14.jar differ
diff --git a/lib/cxf-manifest.jar b/lib/cxf-manifest.jar
new file mode 100644
index 0000000..482d594
Binary files /dev/null and b/lib/cxf-manifest.jar differ
diff --git a/lib/cxf-rt-bindings-coloc-3.2.14.jar b/lib/cxf-rt-bindings-coloc-3.2.14.jar
new file mode 100644
index 0000000..f136e4a
Binary files /dev/null and b/lib/cxf-rt-bindings-coloc-3.2.14.jar differ
diff --git a/lib/cxf-rt-bindings-corba-3.2.14.jar b/lib/cxf-rt-bindings-corba-3.2.14.jar
new file mode 100644
index 0000000..7d326cd
Binary files /dev/null and b/lib/cxf-rt-bindings-corba-3.2.14.jar differ
diff --git a/lib/cxf-rt-bindings-soap-3.2.14.jar b/lib/cxf-rt-bindings-soap-3.2.14.jar
new file mode 100644
index 0000000..5ee206b
Binary files /dev/null and b/lib/cxf-rt-bindings-soap-3.2.14.jar differ
diff --git a/lib/cxf-rt-bindings-xml-3.2.14.jar b/lib/cxf-rt-bindings-xml-3.2.14.jar
new file mode 100644
index 0000000..4163650
Binary files /dev/null and b/lib/cxf-rt-bindings-xml-3.2.14.jar differ
diff --git a/lib/cxf-rt-databinding-aegis-3.2.14.jar b/lib/cxf-rt-databinding-aegis-3.2.14.jar
new file mode 100644
index 0000000..586b037
Binary files /dev/null and b/lib/cxf-rt-databinding-aegis-3.2.14.jar differ
diff --git a/lib/cxf-rt-databinding-jaxb-3.2.14.jar b/lib/cxf-rt-databinding-jaxb-3.2.14.jar
new file mode 100644
index 0000000..e60d8b7
Binary files /dev/null and b/lib/cxf-rt-databinding-jaxb-3.2.14.jar differ
diff --git a/lib/cxf-rt-features-clustering-3.2.14.jar b/lib/cxf-rt-features-clustering-3.2.14.jar
new file mode 100644
index 0000000..cc5dd53
Binary files /dev/null and b/lib/cxf-rt-features-clustering-3.2.14.jar differ
diff --git a/lib/cxf-rt-frontend-jaxrs-3.2.14.jar b/lib/cxf-rt-frontend-jaxrs-3.2.14.jar
new file mode 100644
index 0000000..462a43a
Binary files /dev/null and b/lib/cxf-rt-frontend-jaxrs-3.2.14.jar differ
diff --git a/lib/cxf-rt-frontend-jaxws-3.2.14.jar b/lib/cxf-rt-frontend-jaxws-3.2.14.jar
new file mode 100644
index 0000000..c9e0a26
Binary files /dev/null and b/lib/cxf-rt-frontend-jaxws-3.2.14.jar differ
diff --git a/lib/cxf-rt-frontend-js-3.2.14.jar b/lib/cxf-rt-frontend-js-3.2.14.jar
new file mode 100644
index 0000000..121e51e
Binary files /dev/null and b/lib/cxf-rt-frontend-js-3.2.14.jar differ
diff --git a/lib/cxf-rt-frontend-simple-3.2.14.jar b/lib/cxf-rt-frontend-simple-3.2.14.jar
new file mode 100644
index 0000000..c3c2684
Binary files /dev/null and b/lib/cxf-rt-frontend-simple-3.2.14.jar differ
diff --git a/lib/cxf-rt-javascript-3.2.14.jar b/lib/cxf-rt-javascript-3.2.14.jar
new file mode 100644
index 0000000..a530b20
Binary files /dev/null and b/lib/cxf-rt-javascript-3.2.14.jar differ
diff --git a/lib/cxf-rt-management-3.2.14.jar b/lib/cxf-rt-management-3.2.14.jar
new file mode 100644
index 0000000..55daa39
Binary files /dev/null and b/lib/cxf-rt-management-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-client-3.2.14.jar b/lib/cxf-rt-rs-client-3.2.14.jar
new file mode 100644
index 0000000..7bea615
Binary files /dev/null and b/lib/cxf-rt-rs-client-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-extension-providers-3.2.14.jar b/lib/cxf-rt-rs-extension-providers-3.2.14.jar
new file mode 100644
index 0000000..18fe11e
Binary files /dev/null and b/lib/cxf-rt-rs-extension-providers-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-extension-search-3.2.14.jar b/lib/cxf-rt-rs-extension-search-3.2.14.jar
new file mode 100644
index 0000000..ab9aad2
Binary files /dev/null and b/lib/cxf-rt-rs-extension-search-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-json-basic-3.2.14.jar b/lib/cxf-rt-rs-json-basic-3.2.14.jar
new file mode 100644
index 0000000..e76017c
Binary files /dev/null and b/lib/cxf-rt-rs-json-basic-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-security-cors-3.2.14.jar b/lib/cxf-rt-rs-security-cors-3.2.14.jar
new file mode 100644
index 0000000..ffe6060
Binary files /dev/null and b/lib/cxf-rt-rs-security-cors-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-security-jose-3.2.14.jar b/lib/cxf-rt-rs-security-jose-3.2.14.jar
new file mode 100644
index 0000000..1ea60b7
Binary files /dev/null and b/lib/cxf-rt-rs-security-jose-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-security-jose-jaxrs-3.2.14.jar b/lib/cxf-rt-rs-security-jose-jaxrs-3.2.14.jar
new file mode 100644
index 0000000..ea0d6f3
Binary files /dev/null and b/lib/cxf-rt-rs-security-jose-jaxrs-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-security-oauth-3.2.14.jar b/lib/cxf-rt-rs-security-oauth-3.2.14.jar
new file mode 100644
index 0000000..269336f
Binary files /dev/null and b/lib/cxf-rt-rs-security-oauth-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-security-oauth2-3.2.14.jar b/lib/cxf-rt-rs-security-oauth2-3.2.14.jar
new file mode 100644
index 0000000..0491c87
Binary files /dev/null and b/lib/cxf-rt-rs-security-oauth2-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-security-sso-saml-3.2.14.jar b/lib/cxf-rt-rs-security-sso-saml-3.2.14.jar
new file mode 100644
index 0000000..73dca60
Binary files /dev/null and b/lib/cxf-rt-rs-security-sso-saml-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-security-xml-3.2.14.jar b/lib/cxf-rt-rs-security-xml-3.2.14.jar
new file mode 100644
index 0000000..4f1903e
Binary files /dev/null and b/lib/cxf-rt-rs-security-xml-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-service-description-3.2.14.jar b/lib/cxf-rt-rs-service-description-3.2.14.jar
new file mode 100644
index 0000000..f9902e9
Binary files /dev/null and b/lib/cxf-rt-rs-service-description-3.2.14.jar differ
diff --git a/lib/cxf-rt-rs-sse-3.2.14.jar b/lib/cxf-rt-rs-sse-3.2.14.jar
new file mode 100644
index 0000000..4e411fe
Binary files /dev/null and b/lib/cxf-rt-rs-sse-3.2.14.jar differ
diff --git a/lib/cxf-rt-security-3.2.14.jar b/lib/cxf-rt-security-3.2.14.jar
new file mode 100644
index 0000000..3bfb092
Binary files /dev/null and b/lib/cxf-rt-security-3.2.14.jar differ
diff --git a/lib/cxf-rt-security-saml-3.2.14.jar b/lib/cxf-rt-security-saml-3.2.14.jar
new file mode 100644
index 0000000..5c79eab
Binary files /dev/null and b/lib/cxf-rt-security-saml-3.2.14.jar differ
diff --git a/lib/cxf-rt-transports-http-3.2.14.jar b/lib/cxf-rt-transports-http-3.2.14.jar
new file mode 100644
index 0000000..173f633
Binary files /dev/null and b/lib/cxf-rt-transports-http-3.2.14.jar differ
diff --git a/lib/cxf-rt-transports-http-hc-3.2.14.jar b/lib/cxf-rt-transports-http-hc-3.2.14.jar
new file mode 100644
index 0000000..e3d9692
Binary files /dev/null and b/lib/cxf-rt-transports-http-hc-3.2.14.jar differ
diff --git a/lib/cxf-rt-transports-http-jetty-3.2.14.jar b/lib/cxf-rt-transports-http-jetty-3.2.14.jar
new file mode 100644
index 0000000..324ea8d
Binary files /dev/null and b/lib/cxf-rt-transports-http-jetty-3.2.14.jar differ
diff --git a/lib/cxf-rt-transports-http-netty-client-3.2.14.jar b/lib/cxf-rt-transports-http-netty-client-3.2.14.jar
new file mode 100644
index 0000000..5768b77
Binary files /dev/null and b/lib/cxf-rt-transports-http-netty-client-3.2.14.jar differ
diff --git a/lib/cxf-rt-transports-http-netty-server-3.2.14.jar b/lib/cxf-rt-transports-http-netty-server-3.2.14.jar
new file mode 100644
index 0000000..6efb039
Binary files /dev/null and b/lib/cxf-rt-transports-http-netty-server-3.2.14.jar differ
diff --git a/lib/cxf-rt-transports-jms-3.2.14.jar b/lib/cxf-rt-transports-jms-3.2.14.jar
new file mode 100644
index 0000000..9b0977e
Binary files /dev/null and b/lib/cxf-rt-transports-jms-3.2.14.jar differ
diff --git a/lib/cxf-rt-transports-local-3.2.14.jar b/lib/cxf-rt-transports-local-3.2.14.jar
new file mode 100644
index 0000000..3313f21
Binary files /dev/null and b/lib/cxf-rt-transports-local-3.2.14.jar differ
diff --git a/lib/cxf-rt-transports-udp-3.2.14.jar b/lib/cxf-rt-transports-udp-3.2.14.jar
new file mode 100644
index 0000000..4f999e9
Binary files /dev/null and b/lib/cxf-rt-transports-udp-3.2.14.jar differ
diff --git a/lib/cxf-rt-ws-addr-3.2.14.jar b/lib/cxf-rt-ws-addr-3.2.14.jar
new file mode 100644
index 0000000..e1bd97b
Binary files /dev/null and b/lib/cxf-rt-ws-addr-3.2.14.jar differ
diff --git a/lib/cxf-rt-ws-mex-3.2.14.jar b/lib/cxf-rt-ws-mex-3.2.14.jar
new file mode 100644
index 0000000..abd793a
Binary files /dev/null and b/lib/cxf-rt-ws-mex-3.2.14.jar differ
diff --git a/lib/cxf-rt-ws-policy-3.2.14.jar b/lib/cxf-rt-ws-policy-3.2.14.jar
new file mode 100644
index 0000000..10c7f21
Binary files /dev/null and b/lib/cxf-rt-ws-policy-3.2.14.jar differ
diff --git a/lib/cxf-rt-ws-rm-3.2.14.jar b/lib/cxf-rt-ws-rm-3.2.14.jar
new file mode 100644
index 0000000..40455e8
Binary files /dev/null and b/lib/cxf-rt-ws-rm-3.2.14.jar differ
diff --git a/lib/cxf-rt-ws-security-3.2.14.jar b/lib/cxf-rt-ws-security-3.2.14.jar
new file mode 100644
index 0000000..20a10ec
Binary files /dev/null and b/lib/cxf-rt-ws-security-3.2.14.jar differ
diff --git a/lib/cxf-rt-wsdl-3.2.14.jar b/lib/cxf-rt-wsdl-3.2.14.jar
new file mode 100644
index 0000000..f356927
Binary files /dev/null and b/lib/cxf-rt-wsdl-3.2.14.jar differ
diff --git a/lib/cxf-services-sts-core-3.2.14.jar b/lib/cxf-services-sts-core-3.2.14.jar
new file mode 100644
index 0000000..2a88c2d
Binary files /dev/null and b/lib/cxf-services-sts-core-3.2.14.jar differ
diff --git a/lib/cxf-services-ws-discovery-api-3.2.14.jar b/lib/cxf-services-ws-discovery-api-3.2.14.jar
new file mode 100644
index 0000000..1d153b8
Binary files /dev/null and b/lib/cxf-services-ws-discovery-api-3.2.14.jar differ
diff --git a/lib/cxf-services-ws-discovery-service-3.2.14.jar b/lib/cxf-services-ws-discovery-service-3.2.14.jar
new file mode 100644
index 0000000..b84cb2a
Binary files /dev/null and b/lib/cxf-services-ws-discovery-service-3.2.14.jar differ
diff --git a/lib/cxf-services-wsn-api-3.2.14.jar b/lib/cxf-services-wsn-api-3.2.14.jar
new file mode 100644
index 0000000..dbd3277
Binary files /dev/null and b/lib/cxf-services-wsn-api-3.2.14.jar differ
diff --git a/lib/cxf-services-wsn-core-3.2.14.jar b/lib/cxf-services-wsn-core-3.2.14.jar
new file mode 100644
index 0000000..f0f7df5
Binary files /dev/null and b/lib/cxf-services-wsn-core-3.2.14.jar differ
diff --git a/lib/cxf-tools-common-3.2.14.jar b/lib/cxf-tools-common-3.2.14.jar
new file mode 100644
index 0000000..491ef6a
Binary files /dev/null and b/lib/cxf-tools-common-3.2.14.jar differ
diff --git a/lib/cxf-tools-corba-3.2.14.jar b/lib/cxf-tools-corba-3.2.14.jar
new file mode 100644
index 0000000..7dd4f06
Binary files /dev/null and b/lib/cxf-tools-corba-3.2.14.jar differ
diff --git a/lib/cxf-tools-java2ws-3.2.14.jar b/lib/cxf-tools-java2ws-3.2.14.jar
new file mode 100644
index 0000000..efe3bef
Binary files /dev/null and b/lib/cxf-tools-java2ws-3.2.14.jar differ
diff --git a/lib/cxf-tools-misctools-3.2.14.jar b/lib/cxf-tools-misctools-3.2.14.jar
new file mode 100644
index 0000000..a8db249
Binary files /dev/null and b/lib/cxf-tools-misctools-3.2.14.jar differ
diff --git a/lib/cxf-tools-validator-3.2.14.jar b/lib/cxf-tools-validator-3.2.14.jar
new file mode 100644
index 0000000..97ab2d9
Binary files /dev/null and b/lib/cxf-tools-validator-3.2.14.jar differ
diff --git a/lib/cxf-tools-wadlto-jaxrs-3.2.14.jar b/lib/cxf-tools-wadlto-jaxrs-3.2.14.jar
new file mode 100644
index 0000000..0a38e40
Binary files /dev/null and b/lib/cxf-tools-wadlto-jaxrs-3.2.14.jar differ
diff --git a/lib/cxf-tools-wsdlto-core-3.2.14.jar b/lib/cxf-tools-wsdlto-core-3.2.14.jar
new file mode 100644
index 0000000..e6add10
Binary files /dev/null and b/lib/cxf-tools-wsdlto-core-3.2.14.jar differ
diff --git a/lib/cxf-tools-wsdlto-databinding-jaxb-3.2.14.jar b/lib/cxf-tools-wsdlto-databinding-jaxb-3.2.14.jar
new file mode 100644
index 0000000..d330a52
Binary files /dev/null and b/lib/cxf-tools-wsdlto-databinding-jaxb-3.2.14.jar differ
diff --git a/lib/cxf-tools-wsdlto-frontend-javascript-3.2.14.jar b/lib/cxf-tools-wsdlto-frontend-javascript-3.2.14.jar
new file mode 100644
index 0000000..9b85c84
Binary files /dev/null and b/lib/cxf-tools-wsdlto-frontend-javascript-3.2.14.jar differ
diff --git a/lib/cxf-tools-wsdlto-frontend-jaxws-3.2.14.jar b/lib/cxf-tools-wsdlto-frontend-jaxws-3.2.14.jar
new file mode 100644
index 0000000..15c894e
Binary files /dev/null and b/lib/cxf-tools-wsdlto-frontend-jaxws-3.2.14.jar differ
diff --git a/lib/cxf-xjc-boolean-3.2.3.jar b/lib/cxf-xjc-boolean-3.2.3.jar
new file mode 100644
index 0000000..02ab6ce
Binary files /dev/null and b/lib/cxf-xjc-boolean-3.2.3.jar differ
diff --git a/lib/cxf-xjc-bug671-3.2.3.jar b/lib/cxf-xjc-bug671-3.2.3.jar
new file mode 100644
index 0000000..6b52a3d
Binary files /dev/null and b/lib/cxf-xjc-bug671-3.2.3.jar differ
diff --git a/lib/cxf-xjc-dv-3.2.3.jar b/lib/cxf-xjc-dv-3.2.3.jar
new file mode 100644
index 0000000..07969c3
Binary files /dev/null and b/lib/cxf-xjc-dv-3.2.3.jar differ
diff --git a/lib/cxf-xjc-javadoc-3.2.3.jar b/lib/cxf-xjc-javadoc-3.2.3.jar
new file mode 100644
index 0000000..7cf62ba
Binary files /dev/null and b/lib/cxf-xjc-javadoc-3.2.3.jar differ
diff --git a/lib/cxf-xjc-runtime-3.2.3.jar b/lib/cxf-xjc-runtime-3.2.3.jar
new file mode 100644
index 0000000..a902063
Binary files /dev/null and b/lib/cxf-xjc-runtime-3.2.3.jar differ
diff --git a/lib/cxf-xjc-ts-3.2.3.jar b/lib/cxf-xjc-ts-3.2.3.jar
new file mode 100644
index 0000000..87ceb9a
Binary files /dev/null and b/lib/cxf-xjc-ts-3.2.3.jar differ
diff --git a/lib/finekit-10.0.jar b/lib/finekit-10.0.jar
new file mode 100644
index 0000000..f4482fc
Binary files /dev/null and b/lib/finekit-10.0.jar differ
diff --git a/lib/jasypt-1.9.3.jar b/lib/jasypt-1.9.3.jar
new file mode 100644
index 0000000..f4c4606
Binary files /dev/null and b/lib/jasypt-1.9.3.jar differ
diff --git a/lib/java-support-7.3.0.jar b/lib/java-support-7.3.0.jar
new file mode 100644
index 0000000..fbd8a18
Binary files /dev/null and b/lib/java-support-7.3.0.jar differ
diff --git a/lib/javax.annotation-api-1.3.jar b/lib/javax.annotation-api-1.3.jar
new file mode 100644
index 0000000..3f9da00
Binary files /dev/null and b/lib/javax.annotation-api-1.3.jar differ
diff --git a/lib/javax.servlet-api-3.1.0.jar b/lib/javax.servlet-api-3.1.0.jar
new file mode 100644
index 0000000..6b14c3d
Binary files /dev/null and b/lib/javax.servlet-api-3.1.0.jar differ
diff --git a/lib/javax.ws.rs-api-2.1.1.jar b/lib/javax.ws.rs-api-2.1.1.jar
new file mode 100644
index 0000000..3eabbf0
Binary files /dev/null and b/lib/javax.ws.rs-api-2.1.1.jar differ
diff --git a/lib/jaxb-core-2.2.11.jar b/lib/jaxb-core-2.2.11.jar
new file mode 100644
index 0000000..f3c8412
Binary files /dev/null and b/lib/jaxb-core-2.2.11.jar differ
diff --git a/lib/jcl-over-slf4j-1.7.26.jar b/lib/jcl-over-slf4j-1.7.26.jar
new file mode 100644
index 0000000..b060a0d
Binary files /dev/null and b/lib/jcl-over-slf4j-1.7.26.jar differ
diff --git a/lib/jettison-1.4.1.jar b/lib/jettison-1.4.1.jar
new file mode 100644
index 0000000..e6e593b
Binary files /dev/null and b/lib/jettison-1.4.1.jar differ
diff --git a/lib/jetty-continuation-9.4.30.v20200611.jar b/lib/jetty-continuation-9.4.30.v20200611.jar
new file mode 100644
index 0000000..0385461
Binary files /dev/null and b/lib/jetty-continuation-9.4.30.v20200611.jar differ
diff --git a/lib/jetty-http-9.4.30.v20200611.jar b/lib/jetty-http-9.4.30.v20200611.jar
new file mode 100644
index 0000000..bc05810
Binary files /dev/null and b/lib/jetty-http-9.4.30.v20200611.jar differ
diff --git a/lib/jetty-io-9.4.30.v20200611.jar b/lib/jetty-io-9.4.30.v20200611.jar
new file mode 100644
index 0000000..f91c8db
Binary files /dev/null and b/lib/jetty-io-9.4.30.v20200611.jar differ
diff --git a/lib/jetty-security-9.4.30.v20200611.jar b/lib/jetty-security-9.4.30.v20200611.jar
new file mode 100644
index 0000000..52221c3
Binary files /dev/null and b/lib/jetty-security-9.4.30.v20200611.jar differ
diff --git a/lib/jetty-server-9.4.30.v20200611.jar b/lib/jetty-server-9.4.30.v20200611.jar
new file mode 100644
index 0000000..1da23ec
Binary files /dev/null and b/lib/jetty-server-9.4.30.v20200611.jar differ
diff --git a/lib/jetty-util-9.4.30.v20200611.jar b/lib/jetty-util-9.4.30.v20200611.jar
new file mode 100644
index 0000000..b2330d5
Binary files /dev/null and b/lib/jetty-util-9.4.30.v20200611.jar differ
diff --git a/lib/joda-time-2.9.jar b/lib/joda-time-2.9.jar
new file mode 100644
index 0000000..340af06
Binary files /dev/null and b/lib/joda-time-2.9.jar differ
diff --git a/lib/js-1.7R2.jar b/lib/js-1.7R2.jar
new file mode 100644
index 0000000..2369f99
Binary files /dev/null and b/lib/js-1.7R2.jar differ
diff --git a/lib/metrics-core-3.2.6.jar b/lib/metrics-core-3.2.6.jar
new file mode 100644
index 0000000..cadf4df
Binary files /dev/null and b/lib/metrics-core-3.2.6.jar differ
diff --git a/lib/mina-core-2.0.21.jar b/lib/mina-core-2.0.21.jar
new file mode 100644
index 0000000..7660a4e
Binary files /dev/null and b/lib/mina-core-2.0.21.jar differ
diff --git a/lib/neethi-3.1.1.jar b/lib/neethi-3.1.1.jar
new file mode 100644
index 0000000..db72dc2
Binary files /dev/null and b/lib/neethi-3.1.1.jar differ
diff --git a/lib/oauth-20100527.jar b/lib/oauth-20100527.jar
new file mode 100644
index 0000000..e657953
Binary files /dev/null and b/lib/oauth-20100527.jar differ
diff --git a/lib/oauth-provider-20100527.jar b/lib/oauth-provider-20100527.jar
new file mode 100644
index 0000000..2bece29
Binary files /dev/null and b/lib/oauth-provider-20100527.jar differ
diff --git a/lib/slf4j-api-1.7.26.jar b/lib/slf4j-api-1.7.26.jar
new file mode 100644
index 0000000..d2f27ac
Binary files /dev/null and b/lib/slf4j-api-1.7.26.jar differ
diff --git a/lib/slf4j-jdk14-1.7.26.jar b/lib/slf4j-jdk14-1.7.26.jar
new file mode 100644
index 0000000..cb1c784
Binary files /dev/null and b/lib/slf4j-jdk14-1.7.26.jar differ
diff --git a/lib/spring-aop-4.3.27.RELEASE.jar b/lib/spring-aop-4.3.27.RELEASE.jar
new file mode 100644
index 0000000..3702a51
Binary files /dev/null and b/lib/spring-aop-4.3.27.RELEASE.jar differ
diff --git a/lib/spring-beans-4.3.27.RELEASE.jar b/lib/spring-beans-4.3.27.RELEASE.jar
new file mode 100644
index 0000000..4cad334
Binary files /dev/null and b/lib/spring-beans-4.3.27.RELEASE.jar differ
diff --git a/lib/spring-context-4.3.27.RELEASE.jar b/lib/spring-context-4.3.27.RELEASE.jar
new file mode 100644
index 0000000..be46cf3
Binary files /dev/null and b/lib/spring-context-4.3.27.RELEASE.jar differ
diff --git a/lib/spring-core-4.3.27.RELEASE.jar b/lib/spring-core-4.3.27.RELEASE.jar
new file mode 100644
index 0000000..36a6276
Binary files /dev/null and b/lib/spring-core-4.3.27.RELEASE.jar differ
diff --git a/lib/spring-expression-4.3.27.RELEASE.jar b/lib/spring-expression-4.3.27.RELEASE.jar
new file mode 100644
index 0000000..ce7c807
Binary files /dev/null and b/lib/spring-expression-4.3.27.RELEASE.jar differ
diff --git a/lib/spring-web-4.3.27.RELEASE.jar b/lib/spring-web-4.3.27.RELEASE.jar
new file mode 100644
index 0000000..6b1ae44
Binary files /dev/null and b/lib/spring-web-4.3.27.RELEASE.jar differ
diff --git a/lib/sso.jar b/lib/sso.jar
new file mode 100644
index 0000000..24e87e3
Binary files /dev/null and b/lib/sso.jar differ
diff --git a/lib/stax2-api-3.1.4.jar b/lib/stax2-api-3.1.4.jar
new file mode 100644
index 0000000..dded036
Binary files /dev/null and b/lib/stax2-api-3.1.4.jar differ
diff --git a/lib/velocity-engine-core-2.0.jar b/lib/velocity-engine-core-2.0.jar
new file mode 100644
index 0000000..c48d660
Binary files /dev/null and b/lib/velocity-engine-core-2.0.jar differ
diff --git a/lib/woodstox-core-5.0.3.jar b/lib/woodstox-core-5.0.3.jar
new file mode 100644
index 0000000..1c26864
Binary files /dev/null and b/lib/woodstox-core-5.0.3.jar differ
diff --git a/lib/wsdl4j-1.6.3.jar b/lib/wsdl4j-1.6.3.jar
new file mode 100644
index 0000000..b9c10b9
Binary files /dev/null and b/lib/wsdl4j-1.6.3.jar differ
diff --git a/lib/xml-resolver-1.2.jar b/lib/xml-resolver-1.2.jar
new file mode 100644
index 0000000..e535bdc
Binary files /dev/null and b/lib/xml-resolver-1.2.jar differ
diff --git a/lib/xmlschema-core-2.2.5.jar b/lib/xmlschema-core-2.2.5.jar
new file mode 100644
index 0000000..b49a861
Binary files /dev/null and b/lib/xmlschema-core-2.2.5.jar differ
diff --git a/plugin.xml b/plugin.xml
new file mode 100644
index 0000000..ad1ce6f
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,24 @@
+
+
+ com.fr.plugin.hbir.sso
+
+ yes
+ 1.1.4
+ 10.0
+ 2018-07-31
+ louis
+
+
+ com.fr.plugin.hbir
+
+ com.fanruan.api
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/LocaleFinder.java b/src/main/java/com/fr/plugin/hbir/LocaleFinder.java
new file mode 100644
index 0000000..96be995
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/LocaleFinder.java
@@ -0,0 +1,37 @@
+ /*
+ * Copyright (C), 2018-2020
+ * Project: starter
+ * FileName: LocaleFinder
+ * Author: Louis
+ * Date: 2020/8/31 22:19
+ */
+ package com.fr.plugin.hbir;
+
+ import com.fr.intelli.record.Focus;
+import com.fr.intelli.record.Original;
+import com.fr.record.analyzer.EnableMetrics;
+import com.fr.stable.fun.impl.AbstractLocaleFinder;
+
+import static com.fr.plugin.hbir.config.SsoConfig.PLUGIN_ID;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @EnableMetrics
+ public class LocaleFinder extends AbstractLocaleFinder {
+
+ @Override
+ @Focus(id = PLUGIN_ID, text = "Plugin-hbir", source = Original.PLUGIN)
+ public String find() {
+ return "com/fr/plugin/hbir/locale/lang";
+ }
+
+ @Override
+ public int currentAPILevel() {
+ return CURRENT_LEVEL;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/PluginLifecycleMonitor.java b/src/main/java/com/fr/plugin/hbir/PluginLifecycleMonitor.java
new file mode 100644
index 0000000..46906ce
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/PluginLifecycleMonitor.java
@@ -0,0 +1,41 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: LifeCycleMonitorImpl
+ * Author: Louis
+ * Date: 2021/3/30 15:10
+ */
+ package com.fr.plugin.hbir;
+
+ import com.fanruan.api.log.LogKit;
+ import com.fr.plugin.context.PluginContext;
+ import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor;
+ import com.fr.plugin.hbir.config.SsoConfig;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ public class PluginLifecycleMonitor extends AbstractPluginLifecycleMonitor {
+ public PluginLifecycleMonitor() {
+ }
+
+ @Override
+ public void afterRun(PluginContext pluginContext) {
+ SsoConfig.getInstance();
+ boolean isStarted = StartServer.createServer();
+ if (isStarted) {
+ LogKit.info("sso-PluginLifecycleMonitor-[WS]服务启动成功");
+ } else {
+ LogKit.info("sso-PluginLifecycleMonitor-[WS]服务启动失败");
+ }
+ }
+
+ @Override
+ public void beforeStop(PluginContext pluginContext) {
+
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/StartServer.java b/src/main/java/com/fr/plugin/hbir/StartServer.java
new file mode 100644
index 0000000..42ac3d5
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/StartServer.java
@@ -0,0 +1,47 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: StartServer
+ * Author: Louis
+ * Date: 2021/7/12 10:59
+ */
+ package com.fr.plugin.hbir;
+
+ import com.fanruan.api.log.LogKit;
+ import com.fr.plugin.hbir.config.SsoConfig;
+ import com.fr.plugin.hbir.service.UserManager;
+ import com.fr.plugin.hbir.service.UserManagerImpl;
+ import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
+
+ import static com.fr.plugin.hbir.service.UserManager.SERVICE_NAME;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ public class StartServer {
+
+ public static boolean createServer() {
+ LogKit.info("sso-StartServer-WS start");
+ publishServer(SERVICE_NAME, UserManager.class, new UserManagerImpl());
+ return true;
+ }
+
+ private static void publishServer(String servername, Class serviceClass, Object impBean) {
+ JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
+ factory.setServiceClass(serviceClass);
+ factory.setServiceBean(impBean);
+ factory.setAddress(SsoConfig.getInstance().getWsUri() + servername);
+// factory.setAddress(address + servername);
+ factory.create();
+ }
+
+// public static String address = "http://localhost:8888/fr/ws"; // http://localhost:8888/fr/ws
+//
+// public static void main(String[] args){
+// boolean server = createServer();
+// }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/DeptChange.java b/src/main/java/com/fr/plugin/hbir/bean/DeptChange.java
new file mode 100644
index 0000000..60cedb0
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/DeptChange.java
@@ -0,0 +1,46 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: DeptChange
+ * Author: Louis
+ * Date: 2021/7/14 21:57
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.*;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "OrderDeptChange", propOrder = {"deptCode", "deptName"})
+ @XmlRootElement(name = "DICT")
+ public class DeptChange {
+ @XmlElement(name = "DEPT_CODE", required = true)
+ private String deptCode;
+ @XmlElement(name = "DEPT_NAME", required = true)
+ private String deptName;
+
+ public DeptChange() {
+ }
+
+ public String getDeptCode() {
+ return deptCode;
+ }
+
+ public void setDeptCode(String deptCode) {
+ this.deptCode = deptCode;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/DeptChangeRequest.java b/src/main/java/com/fr/plugin/hbir/bean/DeptChangeRequest.java
new file mode 100644
index 0000000..eefa5b3
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/DeptChangeRequest.java
@@ -0,0 +1,34 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: DeptChangeRequest
+ * Author: Louis
+ * Date: 2021/7/14 21:54
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.*;
+ import java.util.List;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "OrderDeptChangeRequest", propOrder = {"value"})
+ @XmlRootElement
+ public class DeptChangeRequest extends Request {
+ @XmlElement(name = "VALUE", required = true)
+ private List value;
+
+ public List getValue() {
+ return value;
+ }
+
+ public void setValue(List value) {
+ this.value = value;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/DeptDelete.java b/src/main/java/com/fr/plugin/hbir/bean/DeptDelete.java
new file mode 100644
index 0000000..ee29819
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/DeptDelete.java
@@ -0,0 +1,56 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: DeptDelete
+ * Author: Louis
+ * Date: 2021/7/14 22:05
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.*;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "OrderDeptDelete", propOrder = {"key", "deptCode", "time"})
+ @XmlRootElement
+ public class DeptDelete {
+ @XmlElement(name = "KEY", required = false)
+ private String key;
+ @XmlElement(name = "DEPT_CODE", required = true)
+ private String deptCode;
+ @XmlElement(name = "TIME", required = false)
+ private String time;
+
+ public DeptDelete() {
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getDeptCode() {
+ return deptCode;
+ }
+
+ public void setDeptCode(String deptCode) {
+ this.deptCode = deptCode;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/DeptDeleteRequest.java b/src/main/java/com/fr/plugin/hbir/bean/DeptDeleteRequest.java
new file mode 100644
index 0000000..7ea8313
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/DeptDeleteRequest.java
@@ -0,0 +1,34 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: DeptDeleteRequest
+ * Author: Louis
+ * Date: 2021/7/14 22:02
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.*;
+ import java.util.List;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "OrderDeptDeleteRequest", propOrder = {"value"})
+ @XmlRootElement
+ public class DeptDeleteRequest extends Request {
+ @XmlElement(name = "VALUE", required = true)
+ private List value;
+
+ public List getValue() {
+ return value;
+ }
+
+ public void setValue(List value) {
+ this.value = value;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/Request.java b/src/main/java/com/fr/plugin/hbir/bean/Request.java
new file mode 100644
index 0000000..a86fcc7
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/Request.java
@@ -0,0 +1,66 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: request
+ * Author: Louis
+ * Date: 2021/7/14 15:31
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.*;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "OrderRequest", propOrder = {"aliasName", "tableName", "identification", "subscribers"})
+ @XmlRootElement
+ public abstract class Request {
+ @XmlElement(name = "ALIASNAME", required = true)
+ private String aliasName;
+ @XmlElement(name = "TABLENAME", required = true)
+ private String tableName;
+ @XmlElement(name = "IDENTIFICATION", required = true)
+ private String identification;
+ @XmlElement(name = "SUBSCRIBERS", required = true)
+ private String subscribers;
+
+ public Request() {
+ }
+
+ public String getAliasName() {
+ return aliasName;
+ }
+
+ public void setAliasName(String aliasName) {
+ this.aliasName = aliasName;
+ }
+
+ public String getTableName() {
+ return tableName;
+ }
+
+ public void setTableName(String tableName) {
+ this.tableName = tableName;
+ }
+
+ public String getIdentification() {
+ return identification;
+ }
+
+ public void setIdentification(String identification) {
+ this.identification = identification;
+ }
+
+ public String getSubscribers() {
+ return subscribers;
+ }
+
+ public void setSubscribers(String subscribers) {
+ this.subscribers = subscribers;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/RequestAction.java b/src/main/java/com/fr/plugin/hbir/bean/RequestAction.java
new file mode 100644
index 0000000..dec91f7
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/RequestAction.java
@@ -0,0 +1,48 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: RequestAction
+ * Author: Louis
+ * Date: 2021/7/22 21:43
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.XmlAccessType;
+ import javax.xml.bind.annotation.XmlAccessorType;
+ import javax.xml.bind.annotation.XmlElement;
+ import javax.xml.bind.annotation.XmlRootElement;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlRootElement(name = "REQUEST")
+ public class RequestAction {
+ @XmlElement(name = "ACTION", required = false)
+ private String action;
+ @XmlElement(name = "PARG", required = true)
+ private String parg;
+
+ public RequestAction() {
+ }
+
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+ public String getParg() {
+ return parg;
+ }
+
+ public void setParg(String parg) {
+ this.parg = parg;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/Response.java b/src/main/java/com/fr/plugin/hbir/bean/Response.java
new file mode 100644
index 0000000..ebc2b7e
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/Response.java
@@ -0,0 +1,60 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: Response
+ * Author: Louis
+ * Date: 2021/7/14 21:32
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.*;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "OrderResponse", propOrder = {"resultCode", "resultContent"})
+ @XmlRootElement
+ public class Response {
+ @XmlElement(name = "RESULT_CODE", required = true)
+ private String resultCode;
+ @XmlElement(name = "RESULT_CONTENT", required = true)
+ private String resultContent;
+
+ public Response() {
+ }
+
+ public static Response success() {
+ Response response = new Response();
+ response.setResultCode("true");
+ response.setResultContent("成功");
+ return response;
+ }
+
+ public static Response failed() {
+ Response response = new Response();
+ response.setResultCode("false");
+ response.setResultContent("失败");
+ return response;
+ }
+
+ public String getResultCode() {
+ return resultCode;
+ }
+
+ public void setResultCode(String resultCode) {
+ this.resultCode = resultCode;
+ }
+
+ public String getResultContent() {
+ return resultContent;
+ }
+
+ public void setResultContent(String resultContent) {
+ this.resultContent = resultContent;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/UserChangeRequest.java b/src/main/java/com/fr/plugin/hbir/bean/UserChangeRequest.java
new file mode 100644
index 0000000..2abaa62
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/UserChangeRequest.java
@@ -0,0 +1,34 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: UserChangeRequest
+ * Author: Louis
+ * Date: 2021/7/14 21:07
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.*;
+ import java.util.List;
+
+ /**
+ *
+ * <用户新增和更新Request>
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "OrderUserChangeRequest", propOrder = {"value"})
+ @XmlRootElement
+ public class UserChangeRequest extends Request {
+ @XmlElement(name = "VALUE", required = true)
+ private List value;
+
+ public List getValue() {
+ return value;
+ }
+
+ public void setValue(List value) {
+ this.value = value;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/UserData.java b/src/main/java/com/fr/plugin/hbir/bean/UserData.java
new file mode 100644
index 0000000..b3a7b91
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/UserData.java
@@ -0,0 +1,93 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: UserData
+ * Author: Louis
+ * Date: 2021/7/14 15:52
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.*;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "OrderUserData", propOrder = {"empNo", "name", "departmentId", "jobName", "title", "phone", "flag"})
+ @XmlRootElement(name = "DICT")
+ public class UserData {
+ @XmlElement(name = "EMP_NO", required = true)
+ private String empNo;
+ @XmlElement(name = "NAME", required = true)
+ private String name;
+ @XmlElement(name = "DEPT_CODE", required = true)
+ private String departmentId;
+ @XmlElement(name = "JOB_NAME", required = true)
+ private String jobName;
+ @XmlElement(name = "TITLE", required = true)
+ private String title;
+ @XmlElement(name = "PHONE", required = true)
+ private String phone;
+ @XmlElement(name = "FLAG", required = true)
+ private String flag;
+
+ public String getEmpNo() {
+ return empNo;
+ }
+
+ public void setEmpNo(String empNo) {
+ this.empNo = empNo;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDepartmentId() {
+ return departmentId;
+ }
+
+ public void setDepartmentId(String departmentId) {
+ this.departmentId = departmentId;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getJobName() {
+ return jobName;
+ }
+
+ public void setJobName(String jobName) {
+ this.jobName = jobName;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public String getFlag() {
+ return flag;
+ }
+
+ public void setFlag(String flag) {
+ this.flag = flag;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/UserDelete.java b/src/main/java/com/fr/plugin/hbir/bean/UserDelete.java
new file mode 100644
index 0000000..29dbb02
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/UserDelete.java
@@ -0,0 +1,56 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: UserDelete
+ * Author: Louis
+ * Date: 2021/7/14 21:13
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.*;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "OrderUserDelete", propOrder = {"key", "empNo", "time"})
+ @XmlRootElement
+ public class UserDelete {
+ @XmlElement(name = "KEY", required = false)
+ private String key;
+ @XmlElement(name = "EMP_NO", required = true)
+ private String empNo;
+ @XmlElement(name = "TIME", required = false)
+ private String time;
+
+ public UserDelete() {
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getEmpNo() {
+ return empNo;
+ }
+
+ public void setEmpNo(String empNo) {
+ this.empNo = empNo;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/UserDeleteRequest.java b/src/main/java/com/fr/plugin/hbir/bean/UserDeleteRequest.java
new file mode 100644
index 0000000..43fe817
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/UserDeleteRequest.java
@@ -0,0 +1,34 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: UserDeleteRequest
+ * Author: Louis
+ * Date: 2021/7/14 21:12
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.*;
+ import java.util.List;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "OrderUserDeleteRequest", propOrder = {"value"})
+ @XmlRootElement
+ public class UserDeleteRequest extends Request {
+ @XmlElement(name = "VALUE", required = true)
+ private List value;
+
+ public List getValue() {
+ return value;
+ }
+
+ public void setValue(List value) {
+ this.value = value;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/bean/UserDict.java b/src/main/java/com/fr/plugin/hbir/bean/UserDict.java
new file mode 100644
index 0000000..adae62f
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/bean/UserDict.java
@@ -0,0 +1,298 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: UserDict
+ * Author: Louis
+ * Date: 2021/7/22 22:39
+ */
+ package com.fr.plugin.hbir.bean;
+
+ import javax.xml.bind.annotation.XmlAccessType;
+ import javax.xml.bind.annotation.XmlAccessorType;
+ import javax.xml.bind.annotation.XmlElement;
+ import javax.xml.bind.annotation.XmlRootElement;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlRootElement(name = "DICT")
+ public class UserDict {
+ @XmlElement(name = "KEY")
+ private String key;
+ @XmlElement(name = "NAME", required = true)
+ private String name;
+ @XmlElement(name = "EMP_NO", required = true)
+ private String empNo;
+ @XmlElement(name = "OLD_NO")
+ private String oldNo;
+ @XmlElement(name = "DEPT_CODE", required = true)
+ private String departmentId;
+ @XmlElement(name = "DEPT_NAME")
+ private String deptName;
+ @XmlElement(name = "INPUT_CODE")
+ private String inputCode;
+ @XmlElement(name = "SEX")
+ private String sex;
+ @XmlElement(name = "AGE")
+ private String age;
+ @XmlElement(name = "BIRTH")
+ private String birth;
+ @XmlElement(name = "CARD")
+ private String card;
+ @XmlElement(name = "JOB_CODE")
+ private String jobCode;
+ @XmlElement(name = "JOB_NAME")
+ private String jobName;
+ @XmlElement(name = "PHONE", required = true)
+ private String phone;
+ @XmlElement(name = "NATION_NAME")
+ private String nationName;
+ @XmlElement(name = "MARRUIAGE_NAME")
+ private String marruiageName;
+ @XmlElement(name = "POLITICAL_NAME")
+ private String politicalName;
+ @XmlElement(name = "EDUCATION_NAME")
+ private String educationName;
+ @XmlElement(name = "NATIVE_PLACE")
+ private String nativePlace;
+ @XmlElement(name = "FOREIGNANG_LEVEL")
+ private String foreignangLevel;
+ @XmlElement(name = "REMARK")
+ private String remark;
+ @XmlElement(name = "AUTHODEPTS")
+ private String authodepts;
+ @XmlElement(name = "PROPERTYS")
+ private String propertys;
+ @XmlElement(name = "RYID")
+ private String ryid;
+ @XmlElement(name = "FLAG", required = true)
+ private String flag;
+ @XmlElement(name = "TIME")
+ private String time;
+ @XmlElement(name = "TITLE")
+ private String title;
+
+ public UserDict() {
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmpNo() {
+ return empNo;
+ }
+
+ public void setEmpNo(String empNo) {
+ this.empNo = empNo;
+ }
+
+ public String getOldNo() {
+ return oldNo;
+ }
+
+ public void setOldNo(String oldNo) {
+ this.oldNo = oldNo;
+ }
+
+ public String getDepartmentId() {
+ return departmentId;
+ }
+
+ public void setDepartmentId(String departmentId) {
+ this.departmentId = departmentId;
+ }
+
+ public String getDeptName() {
+ return deptName;
+ }
+
+ public void setDeptName(String deptName) {
+ this.deptName = deptName;
+ }
+
+ public String getInputCode() {
+ return inputCode;
+ }
+
+ public void setInputCode(String inputCode) {
+ this.inputCode = inputCode;
+ }
+
+ public String getSex() {
+ return sex;
+ }
+
+ public void setSex(String sex) {
+ this.sex = sex;
+ }
+
+ public String getAge() {
+ return age;
+ }
+
+ public void setAge(String age) {
+ this.age = age;
+ }
+
+ public String getBirth() {
+ return birth;
+ }
+
+ public void setBirth(String birth) {
+ this.birth = birth;
+ }
+
+ public String getCard() {
+ return card;
+ }
+
+ public void setCard(String card) {
+ this.card = card;
+ }
+
+ public String getJobCode() {
+ return jobCode;
+ }
+
+ public void setJobCode(String jobCode) {
+ this.jobCode = jobCode;
+ }
+
+ public String getJobName() {
+ return jobName;
+ }
+
+ public void setJobName(String jobName) {
+ this.jobName = jobName;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public String getNationName() {
+ return nationName;
+ }
+
+ public void setNationName(String nationName) {
+ this.nationName = nationName;
+ }
+
+ public String getMarruiageName() {
+ return marruiageName;
+ }
+
+ public void setMarruiageName(String marruiageName) {
+ this.marruiageName = marruiageName;
+ }
+
+ public String getPoliticalName() {
+ return politicalName;
+ }
+
+ public void setPoliticalName(String politicalName) {
+ this.politicalName = politicalName;
+ }
+
+ public String getEducationName() {
+ return educationName;
+ }
+
+ public void setEducationName(String educationName) {
+ this.educationName = educationName;
+ }
+
+ public String getNativePlace() {
+ return nativePlace;
+ }
+
+ public void setNativePlace(String nativePlace) {
+ this.nativePlace = nativePlace;
+ }
+
+ public String getForeignangLevel() {
+ return foreignangLevel;
+ }
+
+ public void setForeignangLevel(String foreignangLevel) {
+ this.foreignangLevel = foreignangLevel;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getAuthodepts() {
+ return authodepts;
+ }
+
+ public void setAuthodepts(String authodepts) {
+ this.authodepts = authodepts;
+ }
+
+ public String getPropertys() {
+ return propertys;
+ }
+
+ public void setPropertys(String propertys) {
+ this.propertys = propertys;
+ }
+
+ public String getRyid() {
+ return ryid;
+ }
+
+ public void setRyid(String ryid) {
+ this.ryid = ryid;
+ }
+
+ public String getFlag() {
+ return flag;
+ }
+
+ public void setFlag(String flag) {
+ this.flag = flag;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/config/SsoConfig.java b/src/main/java/com/fr/plugin/hbir/config/SsoConfig.java
new file mode 100644
index 0000000..b401687
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/config/SsoConfig.java
@@ -0,0 +1,70 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: OneAccessConfig
+ * Author: Louis
+ * Date: 2021/3/30 9:38
+ */
+ package com.fr.plugin.hbir.config;
+
+ import com.fanruan.api.util.StringKit;
+ import com.fr.config.*;
+ import com.fr.config.holder.Conf;
+ import com.fr.config.holder.factory.Holders;
+ import com.fr.intelli.record.Focus;
+ import com.fr.intelli.record.Original;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @Visualization(category = "Plugin-hbir_Group")
+ public class SsoConfig extends DefaultConfiguration {
+ public static final String PLUGIN_ID = "com.fr.plugin.hbir.sso";
+ public static final String USER_INFO_URL = "http://xxxx:xxxx/portal/services/userinfo";
+ public static final String WS_URL = "http://localhost:8888/fr/ws";
+
+ private static volatile SsoConfig config = null;
+
+ @Focus(id = PLUGIN_ID, text = "Plugin-hbir", source = Original.PLUGIN)
+ public static SsoConfig getInstance() {
+ if (config == null) {
+ config = ConfigContext.getConfigInstance(SsoConfig.class);
+ }
+ return config;
+ }
+
+ @Identifier(value = "systemCode", name = "Plugin-hbir_Config_SystemCode", description = "Plugin-hbir_Config_SystemCode_Description", status = Status.SHOW)
+ private Conf systemCode = Holders.simple(StringKit.EMPTY);
+ @Identifier(value = "userInfoUrl", name = "Plugin-hbir_Config_UserInfoUrl", description = "Plugin-hbir_Config_UserInfoUrl_Description", status = Status.SHOW)
+ private Conf userInfoUrl = Holders.simple(USER_INFO_URL);
+ @Identifier(value = "wsUri", name = "Plugin-hbir_Config_WsUri", description = "Plugin-hbir_Config_WsUri_Description", status = Status.SHOW)
+ private Conf wsUri = Holders.simple(WS_URL);
+
+ public String getSystemCode() {
+ return systemCode.get();
+ }
+
+ public void setSystemCode(String systemCode) {
+ this.systemCode.set(systemCode);
+ }
+
+ public String getUserInfoUrl() {
+ return userInfoUrl.get();
+ }
+
+ public void setUserInfoUrl(String userInfoUrl) {
+ this.userInfoUrl.set(userInfoUrl);
+ }
+
+ public String getWsUri() {
+ return wsUri.get();
+ }
+
+ public void setWsUri(String wsUri) {
+ this.wsUri.set(wsUri);
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/kit/UserServiceKit.java b/src/main/java/com/fr/plugin/hbir/kit/UserServiceKit.java
new file mode 100644
index 0000000..6d7e3df
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/kit/UserServiceKit.java
@@ -0,0 +1,318 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: UserServiceKit
+ * Author: Louis
+ * Date: 2021/6/7 10:00
+ */
+ package com.fr.plugin.hbir.kit;
+
+ import com.fanruan.api.log.LogKit;
+import com.fanruan.api.util.StringKit;
+import com.fr.decision.authority.AuthorityContext;
+import com.fr.decision.authority.base.constant.SoftRoleType;
+import com.fr.decision.authority.base.constant.type.operation.ManualOperationType;
+import com.fr.decision.authority.data.BaseUserDataRecord;
+import com.fr.decision.authority.data.CustomRole;
+import com.fr.decision.authority.data.Post;
+import com.fr.decision.authority.data.User;
+import com.fr.decision.authority.data.personnel.DepRole;
+ import com.fr.decision.base.util.UUIDUtil;
+ import com.fr.decision.privilege.TransmissionTool;
+import com.fr.decision.privilege.encrpt.PasswordValidator;
+import com.fr.decision.webservice.bean.user.DepartmentPostBean;
+ import com.fr.decision.webservice.bean.user.RoleBean;
+ import com.fr.decision.webservice.bean.user.UserBean;
+import com.fr.decision.webservice.bean.user.UserUpdateBean;
+import com.fr.decision.webservice.exception.general.DuplicatedNameException;
+import com.fr.decision.webservice.exception.general.SpecialCharProhibitException;
+import com.fr.decision.webservice.exception.user.UserNotExistException;
+import com.fr.decision.webservice.utils.CharLimitType;
+import com.fr.decision.webservice.utils.UserSourceFactory;
+import com.fr.decision.webservice.utils.WebServiceUtils;
+import com.fr.decision.webservice.v10.login.kickout.KickOutConfig;
+import com.fr.decision.webservice.v10.login.kickout.KickOutUserEvent;
+ import com.fr.decision.webservice.v10.user.CustomRoleService;
+ import com.fr.decision.webservice.v10.user.PositionService;
+import com.fr.decision.webservice.v10.user.UserService;
+import com.fr.event.EventDispatcher;
+import com.fr.general.ComparatorUtils;
+import com.fr.json.JSONObject;
+import com.fr.stable.ArrayUtils;
+import com.fr.stable.StringUtils;
+import com.fr.stable.collections.CollectionUtils;
+import com.fr.stable.query.QueryFactory;
+import com.fr.stable.query.condition.QueryCondition;
+import com.fr.stable.query.restriction.Restriction;
+import com.fr.stable.query.restriction.RestrictionFactory;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+ /**
+ *
+ *
+ * 适配jar版本20210526
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ public class UserServiceKit extends UserService {
+ private static volatile UserServiceKit userServiceKit = null;
+
+ public UserServiceKit() {
+ }
+
+ public static UserServiceKit getInstance() {
+ if (userServiceKit == null) {
+ userServiceKit = new UserServiceKit();
+ }
+ return userServiceKit;
+ }
+
+ public int deleteUsers(UserUpdateBean var1) throws Exception {
+ String[] var2 = var1.getRemoveUserIds();
+ int var3 = 0;
+ if (var2 != null) {
+ String[] var4 = var2;
+ int var5 = var2.length;
+
+ for (int var6 = 0; var6 < var5; ++var6) {
+ String var7 = var4[var6];
+ User var8 = (User) AuthorityContext.getInstance().getUserController().getById(var7);
+ EventDispatcher.fire(KickOutUserEvent.KickOutUser, new KickOutConfig(new UserNotExistException(), new String[]{var8.getUserName()}));
+ AuthorityContext.getInstance().getUserController().remove(var7);
+ ++var3;
+// MetricRegistry.getMetric().submit(OperateMessage.build("Dec-Module-User_Manager", "Dec-User", var8.getDisplayName(), "Dec-Log_Delete"));
+ }
+ }
+
+ return var3;
+ }
+
+ public void addUser(UserBean var1) throws Exception {
+ String var2 = var1.getUsername();
+ String var3 = var1.getMobile();
+ String var4 = var1.getEmail();
+ String var5 = TransmissionTool.decrypt(var1.getPassword());
+ this.checkUsernameLegal(var2, CharLimitType.USER_LIMIT);
+ this.checkNonRequiredField(var3, CharLimitType.MOBILE_LIMIT);
+ this.checkNonRequiredField(var4, CharLimitType.EMAIL_LIMIT);
+ this.checkDuplicatedUser(var2);
+ String[] var6 = var1.getRoleIds();
+ PasswordValidator var7 = UserSourceFactory.getInstance().getUserSource(ManualOperationType.KEY).getPasswordValidator();
+ User var8 = (new User()).userName(var2).realName(var1.getRealName()).password(var7.encode(var2, var5)).email(var1.getEmail()).mobile(var1.getMobile()).creationType(ManualOperationType.KEY).lastOperationType(ManualOperationType.KEY).enable(true);
+ AuthorityContext.getInstance().getUserController().add(var8);
+ this.deleteSoftData(var8.getUserName());
+ String var9 = var8.getId();
+ if (ArrayUtils.isNotEmpty(var6)) {
+ String[] var10 = var6;
+ int var11 = var6.length;
+
+ for (int var12 = 0; var12 < var11; ++var12) {
+ String var13 = var10[var12];
+ UserSourceFactory.getInstance().checkSource(var8, (BaseUserDataRecord) AuthorityContext.getInstance().getCustomRoleController().getById(var13));
+ AuthorityContext.getInstance().getUserController().addUserToCustomRole(var9, var13);
+ }
+ }
+
+ if (!CollectionUtils.isEmpty(var1.getDepartmentPostIds())) {
+ Iterator var14 = var1.getDepartmentPostIds().iterator();
+
+ while (var14.hasNext()) {
+ String var15 = (String) var14.next();
+ if (StringUtils.isNotEmpty(var15)) {
+ DepRole var16 = WebServiceUtils.parseUniqueDepartmentPostId(var15);
+ UserSourceFactory.getInstance().checkSource(var8, (BaseUserDataRecord) AuthorityContext.getInstance().getDepartmentController().getById(var16.getDepartmentId()));
+ AuthorityContext.getInstance().getUserController().addUserToDepartmentAndPost(var9, var16.getDepartmentId(), var16.getPostId());
+ }
+ }
+ }
+
+// MetricRegistry.getMetric().submit(OperateMessage.build("Dec-Module-User_Manager", "Dec-User", var8.getDisplayName(), "Dec-Log_Add"));
+ }
+
+ public void editUserInfo(UserBean var1) throws Exception {
+ User var2 = (User) AuthorityContext.getInstance().getUserController().getById(var1.getId());
+ String var3 = var1.getUsername();
+ String var4 = var2.getUserName();
+ String var5 = var1.getRealName();
+ String var6 = var1.getEmail();
+ String var7 = var1.getMobile();
+ this.checkNonRequiredField(var7, CharLimitType.MOBILE_LIMIT);
+ this.checkNonRequiredField(var6, CharLimitType.EMAIL_LIMIT);
+ if (StringUtils.isNotEmpty(var3) && !ComparatorUtils.equals(var4, var3)) {
+ this.checkDuplicatedUser(var3);
+ }
+
+ if (StringUtils.isNotEmpty(var5)) {
+ var2.setRealName(var5);
+ }
+
+ var2.setEmail(var6);
+ var2.setMobile(var7);
+ AuthorityContext.getInstance().getUserController().update(var2.lastOperationType(ManualOperationType.KEY));
+ this.deleteSoftData(var2.getUserName());
+// MetricRegistry.getMetric().submit(OperateMessage.build("Dec-Module-User_Manager", "Dec-User", var2.getDisplayName(), "Dec-Log_Update"));
+ }
+
+ public UserBean createUserBean(JSONObject params) throws Exception {
+ UserBean userBean = new UserBean();
+ userBean.setUsername(params.getString("username"));
+ userBean.setEnable(!params.getBoolean("disabled"));
+ if (params.has("name")) {
+ userBean.setRealName(params.getString("name"));
+ }
+ if (params.has("mobile")) {
+ userBean.setMobile(params.getString("mobile"));
+ }
+ if (params.has("email")) {
+ userBean.setEmail(params.getString("email"));
+ }
+ userBean.setPassword(TransmissionTool.defaultEncrypt(params.getString("username") + "123456"));
+ if (params.has("organizationId") || params.has("organizationid")) {
+ String organizationId = params.has("organizationId") ? params.getString("organizationId") : params.getString("organizationid", StringUtils.EMPTY);
+ List departmentPostIds = createDepartmentPostIds(organizationId, params.getString("position"));
+ userBean.setDepartmentPostIds(departmentPostIds);
+ }
+ return userBean;
+ }
+
+ /**
+ * 部门id转为部门职务组合list
+ *
+ * @param departmentPostId
+ * @param title
+ * @return
+ * @throws Exception
+ */
+ public List createDepartmentPostIds(String departmentPostId, String title) throws Exception {
+ List departmentPostIds = new ArrayList<>();
+ // 职务处理
+ String positionId = positionSynOperation(title, departmentPostId);
+ if (StringKit.isNotBlank(positionId)) {
+ departmentPostId = departmentPostId + "@@@" + positionId;
+ }
+ departmentPostIds.add(departmentPostId);
+ return departmentPostIds;
+ }
+
+ /**
+ * 职务同步操作
+ *
+ * @param title
+ * @return
+ * @throws Exception
+ */
+ public String positionSynOperation(String title, String departmentId) throws Exception {
+ String position = StringKit.isNotBlank(title) ? title : "职员";
+ Post post = AuthorityContext.getInstance().getPostController().findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("name", position)));
+ String positionId;
+ if (post == null) {
+ positionId = PositionService.getInstance().addPosition(position, position);
+ } else {
+ positionId = post.getId();
+ }
+ List departmentPostBeanList = PositionService.getInstance().getPositionsUnderParentDepartment(getAdminUserId(), departmentId, position);
+ if (departmentPostBeanList == null || departmentPostBeanList.isEmpty()) {
+ try {
+ AuthorityContext.getInstance().getPostController().addPostToDepartment(positionId, departmentId);
+ } catch (Exception e) {
+ LogKit.info("oneaccess-UserServiceKit-positionSynOperation-addPostToDepartmentFailed-position:{}, departmentId:{}", positionId + position, departmentId);
+ LogKit.error(e.getMessage(), e);
+ }
+ }
+ return positionId;
+ }
+
+ public String roleSynOperation(String role) throws Exception {
+ QueryCondition condition = QueryFactory.create().addRestriction(RestrictionFactory.eq("name", role));
+ CustomRole customRole = AuthorityContext.getInstance().getCustomRoleController().findOne(condition);
+ if (customRole != null) {
+ return customRole.getId();
+ }
+ String roleId = UUIDUtil.generate();
+ RoleBean roleBean = new RoleBean(role, roleId, role, ManualOperationType.KEY.toInteger());
+ CustomRoleService.getInstance().addCustomRole(this.getAdminUserId(), roleBean);
+ return roleId;
+ }
+
+ /**
+ * 获取管理员id
+ *
+ * @return
+ * @throws Exception
+ */
+ public String getAdminUserId() throws Exception {
+ List adminUserIdList = UserService.getInstance().getAdminUserIdList();
+ if (adminUserIdList.isEmpty()) {
+ return "admin";
+ }
+ return StringKit.isNotBlank(adminUserIdList.get(0)) ? adminUserIdList.get(0) : "admin";
+ }
+
+
+ @Override
+ public void editUser(UserBean userBean) throws Exception {
+ super.editUser(userBean);
+ this.forbidUser(userBean.getId(), userBean.isEnable());
+ this.updateUserRoles(this.getAdminUserId(), userBean);
+ this.updateUserDepartmentPost(this.getAdminUserId(), userBean);
+ }
+
+ public UserBean updateUserBean(JSONObject params) throws Exception {
+ User user = this.getUserByUserId(params.getString("id"));
+ if (user == null) {
+ return null;
+ }
+ UserBean userBean = new UserBean();
+ userBean.setId(params.getString("id"));
+ userBean.setUsername(params.getString("username"));
+ userBean.setEnable(!params.getBoolean("disabled"));
+ if (params.has("name")) {
+ userBean.setRealName(params.getString("name"));
+ } else {
+ userBean.setRealName(user.getRealName());
+ }
+ if (params.has("mobile")) {
+ userBean.setMobile(params.getString("mobile"));
+ } else {
+ userBean.setMobile(user.getMobile());
+ }
+ if (params.has("email")) {
+ userBean.setEmail(params.getString("email"));
+ } else {
+ userBean.setEmail(user.getEmail());
+ }
+ if (params.has("organizationId")) {
+ List departmentPostIds = createDepartmentPostIds(params.getString("organizationId"), params.getString("position"));
+ userBean.setDepartmentPostIds(departmentPostIds);
+ }
+ return userBean;
+ }
+
+ private void checkNonRequiredField(String var1, CharLimitType var2) {
+ if (StringUtils.isNotEmpty(var1) && WebServiceUtils.containIllegalChars(var2, var1)) {
+ throw new SpecialCharProhibitException();
+ }
+ }
+
+ private void checkDuplicatedUser(String var1) throws Exception {
+ User var2 = this.getUserByUserName(var1);
+ if (var2 != null) {
+ throw new DuplicatedNameException();
+ }
+ }
+
+ private void deleteSoftData(String var1) throws Exception {
+ QueryCondition var2 = QueryFactory.create().addRestriction(RestrictionFactory.and(new Restriction[]{RestrictionFactory.eq("deletedName", var1), RestrictionFactory.eq("type", SoftRoleType.USER)}));
+ AuthorityContext.getInstance().getSoftDataController().remove(var2);
+ }
+
+ private void checkUsernameLegal(String var1, CharLimitType var2) throws SpecialCharProhibitException {
+ if (WebServiceUtils.containSQLChars(var1) || WebServiceUtils.containIllegalChars(var2, var1)) {
+ throw new SpecialCharProhibitException();
+ }
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/request/OAuthLogin.java b/src/main/java/com/fr/plugin/hbir/request/OAuthLogin.java
new file mode 100644
index 0000000..4cf64d6
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/request/OAuthLogin.java
@@ -0,0 +1,175 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: OAuthLogin
+ * Author: Louis
+ * Date: 2021/3/30 22:09
+ */
+ package com.fr.plugin.hbir.request;
+
+ import com.fanruan.api.decision.login.LoginKit;
+ import com.fanruan.api.decision.user.UserKit;
+ import com.fanruan.api.log.LogKit;
+ import com.fanruan.api.net.NetworkKit;
+ import com.fanruan.api.net.http.HttpKit;
+ import com.fanruan.api.net.http.rs.HttpRequest;
+ import com.fanruan.api.util.RenderKit;
+ import com.fanruan.api.util.StringKit;
+ import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
+ import com.fr.decision.webservice.utils.DecisionServiceConstants;
+ import com.fr.decision.webservice.v10.login.LoginService;
+ import com.fr.plugin.hbir.config.SsoConfig;
+ import com.fr.third.org.apache.http.entity.ContentType;
+ import com.fr.third.org.apache.http.entity.StringEntity;
+ import org.dom4j.DocumentException;
+
+ import javax.servlet.FilterChain;
+ import javax.servlet.FilterConfig;
+ import javax.servlet.http.HttpServletRequest;
+ import javax.servlet.http.HttpServletResponse;
+ import java.util.HashMap;
+ import java.util.Map;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ public class OAuthLogin extends AbstractGlobalRequestFilterProvider {
+ public static final String REMOTE_DESIGN = "/remote/design";
+ public static final String RESOURCES_PATH = "/resources";
+ public static final String FILE_PATH = "/file";
+ public static final String SYSTEM_INFO = "/system/info";
+ public static final String MATERIALS_MIN_JS_MAP = "/materials.min.js.map";
+ public static final String LOGIN_PATH = "/login";
+ public static final String LOGIN_OTHER = "/login/";
+ public static final String LOGOUT_PATH = "/logout";
+ public static final String USER_LANGUAGE = "/v10/user/language";
+ public static final String SYSTEM_HEALTH = "/system/health";
+
+ public static final String VALIDATE_USER_XML = "${sessionId}${systemCode}]]>";
+ public static final String XML_LABEL_START = "<USER_CODE>";
+ public static final String XML_LABEL_END = "</USER_CODE>";
+
+ private SsoConfig config;
+
+ /**
+ * 解析xml结果
+ *
+ * @param xml
+ * @return
+ */
+ public static String parseUserXML(String xml) {
+ int startIndex = xml.indexOf(XML_LABEL_START) + XML_LABEL_START.length();
+ int endIndex = xml.indexOf(XML_LABEL_END);
+ return xml.substring(startIndex, endIndex);
+ }
+
+
+ /**
+ * 过滤器名称
+ *
+ * @return
+ */
+ @Override
+ public String filterName() {
+ return "hbirFilter";
+ }
+
+ /**
+ * 过滤规则
+ *
+ * @return
+ */
+ @Override
+ public String[] urlPatterns() {
+ return new String[]{"/*"};
+ }
+
+ /**
+ * 过滤器初始化
+ *
+ * @param filterConfig
+ */
+ @Override
+ public void init(FilterConfig filterConfig) {
+ this.config = SsoConfig.getInstance();
+ super.init(filterConfig);
+ }
+
+ /**
+ * 过滤器处理
+ *
+ * @param request
+ * @param response
+ * @param filterChain
+ */
+ @Override
+ public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
+ try {
+ if (operation(request, response)) {
+ filterChain.doFilter(request, response);
+ }
+ } catch (Exception e) {
+ LogKit.error(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 用户验证登陆操作
+ *
+ * @param req
+ * @param res
+ * @throws Exception
+ */
+ private boolean operation(HttpServletRequest req, HttpServletResponse res) throws Exception {
+ String pathInfo = (req.getPathInfo() != null) ? req.getPathInfo() : StringKit.EMPTY;
+// LogKit.info("sso-OAuthLogin-operation-pathInfo:{}", pathInfo);
+ if (pathInfo.startsWith(REMOTE_DESIGN) || pathInfo.startsWith(LOGIN_OTHER)
+ || StringKit.equals(LOGIN_PATH, pathInfo) || pathInfo.startsWith(SYSTEM_HEALTH)
+ || pathInfo.startsWith(RESOURCES_PATH) || pathInfo.startsWith(LOGOUT_PATH)
+ || pathInfo.startsWith(SYSTEM_INFO) || pathInfo.startsWith(MATERIALS_MIN_JS_MAP)
+ || pathInfo.startsWith(USER_LANGUAGE) || pathInfo.startsWith(FILE_PATH)) {
+ return true;
+ }
+ String token = NetworkKit.getHTTPRequestParameter(req, "token");
+ if (StringKit.isBlank(token)) {
+ return true;
+ }
+ LogKit.info("sso-OAuthLogin-operation-token:{}", token);
+ String username = getUsername(token);
+ if (StringKit.isBlank(username) || !UserKit.existUsername(username)) {
+ return true;
+ }
+ if (LoginService.getInstance().isLogged(req) && StringKit.equals(username, LoginService.getInstance().getCurrentUserNameFromRequestCookie(req))) {
+ return true;
+ }
+ String tokenFR = LoginKit.login(req, res, username);
+ req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, tokenFR);
+ return true;
+ }
+
+ /**
+ * 通过凭证获得username
+ *
+ * @param token
+ * @return
+ */
+ private String getUsername(String token) throws Exception {
+ Map params = new HashMap<>();
+ params.put("sessionId", token);
+ params.put("systemCode", this.config.getSystemCode());
+ String soapXml = RenderKit.renderParameter4Tpl(VALIDATE_USER_XML, params);
+ LogKit.info("sso-OAuthLogin-getUsername-soapXml:{}", soapXml);
+ StringEntity stringEntity = new StringEntity(soapXml, ContentType.create(ContentType.TEXT_XML.getMimeType(), "UTF-8"));
+ Map headers = new HashMap<>();
+ headers.put("Content-Type", "text/xml;charset=UTF-8");
+ headers.put("SOAPAction", "");
+ headers.put("Accept-Encoding", "deflate");
+ String res = HttpKit.executeAndParse(HttpRequest.custom().url(this.config.getUserInfoUrl()).post(stringEntity).headers(headers).build());
+ LogKit.info("sso-OAuthLogin-getUsername-res:{}", res);
+ return parseUserXML(res);
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/service/UserManager.java b/src/main/java/com/fr/plugin/hbir/service/UserManager.java
new file mode 100644
index 0000000..b138798
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/service/UserManager.java
@@ -0,0 +1,44 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: UserManager
+ * Author: Louis
+ * Date: 2021/7/12 11:32
+ */
+ package com.fr.plugin.hbir.service;
+
+ import com.fr.plugin.hbir.bean.*;
+
+ import javax.jws.WebParam;
+import javax.jws.WebResult;
+import javax.jws.WebService;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @WebService
+ public interface UserManager {
+ public static final String SERVICE_NAME = "/user";
+
+ @WebResult(name = "RESPONSE")
+ public Response addUser(@WebParam(name = "inputParam") String inputParam);
+
+ @WebResult(name = "RESPONSE")
+ public Response editUser(@WebParam(name = "inputParam") String inputParam);
+
+ @WebResult(name = "RESPONSE")
+ public Response deleteUser(@WebParam(name = "inputParam") String inputParam);
+
+ @WebResult(name = "RESPONSE")
+ public Response addDept(@WebParam(name = "inputParam") String inputParam);
+
+ @WebResult(name = "RESPONSE")
+ public Response updateDept(@WebParam(name = "inputParam") String inputParam);
+
+ @WebResult(name = "RESPONSE")
+ public Response delDept(@WebParam(name = "inputParam") String inputParam);
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/service/UserManagerImpl.java b/src/main/java/com/fr/plugin/hbir/service/UserManagerImpl.java
new file mode 100644
index 0000000..f5a456b
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/service/UserManagerImpl.java
@@ -0,0 +1,211 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: UserManagerImpl
+ * Author: Louis
+ * Date: 2021/7/12 11:34
+ */
+ package com.fr.plugin.hbir.service;
+
+ import com.fanruan.api.log.LogKit;
+import com.fanruan.api.util.StringKit;
+import com.fr.decision.authority.AuthorityContext;
+import com.fr.decision.authority.base.constant.type.operation.ManualOperationType;
+import com.fr.decision.authority.data.Department;
+import com.fr.decision.authority.data.User;
+import com.fr.decision.webservice.bean.user.DepartmentPostBean;
+import com.fr.decision.webservice.bean.user.UserBean;
+import com.fr.decision.webservice.bean.user.UserUpdateBean;
+import com.fr.decision.webservice.exception.general.DuplicatedNameException;
+import com.fr.decision.webservice.v10.user.DepartmentService;
+import com.fr.general.ComparatorUtils;
+import com.fr.plugin.hbir.bean.*;
+import com.fr.plugin.hbir.kit.UserServiceKit;
+ import com.fr.plugin.hbir.utils.JaxbUtil;
+ import com.fr.stable.query.QueryFactory;
+import com.fr.stable.query.condition.QueryCondition;
+import com.fr.stable.query.restriction.Restriction;
+import com.fr.stable.query.restriction.RestrictionFactory;
+
+import javax.jws.WebService;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ @WebService(endpointInterface = "com.fr.plugin.hbir.service.UserManager", serviceName = UserManager.SERVICE_NAME)
+ public class UserManagerImpl implements UserManager {
+ public static final String DECISION_DEP_ROOT = "decision-dep-root";
+
+ @Override
+ public Response addUser(String request) {
+ try {
+ LogKit.info("hbir-UserManagerImpl-addUser-request:{}", request);
+ String userXml = cutDICT(request);
+ UserData userData = JaxbUtil.converyToJavaBean(userXml, UserData.class);
+ UserBean userBean = new UserBean();
+ userBean.setUsername(userData.getEmpNo());
+ userBean.setRealName(userData.getName());
+ userBean.setMobile(userData.getPhone());
+ userBean.setEnable(StringKit.equals(userData.getFlag(), "0"));
+ if (StringKit.isNotBlank(userData.getJobName())) {
+ String roleId = UserServiceKit.getInstance().roleSynOperation(userData.getJobName());
+ userBean.setRoleIds(new String[]{roleId});
+ }
+ if (StringKit.isNotBlank(userData.getDepartmentId())) {
+ List departmentPostIds = UserServiceKit.getInstance().createDepartmentPostIds(userData.getDepartmentId(), userData.getTitle());
+ userBean.setDepartmentPostIds(departmentPostIds);
+ }
+ userBean.setPassword(StringKit.EMPTY);
+ UserServiceKit.getInstance().addUser(userBean);
+ UserServiceKit.getInstance().forbidUser(userBean.getId(), userBean.isEnable());
+ return Response.success();
+ } catch (Exception e) {
+ LogKit.error(e.getMessage(), e);
+ return Response.failed();
+ }
+ }
+
+ private String cutDICT(String xml) {
+ String labelStart = "";
+ String labelEnd = "";
+ int startIndex = xml.indexOf(labelStart) + labelStart.length();
+ int endIndex = xml.indexOf(labelEnd);
+ return labelStart + xml.substring(startIndex, endIndex) + labelEnd;
+ }
+
+ @Override
+ public Response editUser(String request) {
+ try {
+ LogKit.info("hbir-UserManagerImpl-editUser-request:{}", request);
+ String userXml = cutDICT(request);
+ UserData userData = JaxbUtil.converyToJavaBean(userXml, UserData.class);
+ User user = UserServiceKit.getInstance().getUserByUserName(userData.getEmpNo());
+ if (user == null) {
+ return Response.failed();
+ }
+ UserBean userBean = new UserBean();
+ userBean.setId(user.getId());
+ userBean.setUsername(userData.getEmpNo());
+ userBean.setRealName(userData.getName());
+ userBean.setMobile(userData.getPhone());
+ userBean.setEnable(StringKit.equals(userData.getFlag(), "0"));
+ if (StringKit.isNotBlank(userData.getJobName())) {
+ String roleId = UserServiceKit.getInstance().roleSynOperation(userData.getJobName());
+ userBean.setRoleIds(new String[]{roleId});
+ }
+ if (StringKit.isNotBlank(userData.getDepartmentId())) {
+ List departmentPostIds = UserServiceKit.getInstance().createDepartmentPostIds(userData.getDepartmentId(), userData.getTitle());
+ userBean.setDepartmentPostIds(departmentPostIds);
+ }
+ UserServiceKit.getInstance().editUser(userBean);
+ return Response.success();
+ } catch (Exception e) {
+ LogKit.error(e.getMessage(), e);
+ return Response.failed();
+ }
+ }
+
+ @Override
+ public Response deleteUser(String request) {
+ try {
+ UserDeleteRequest userDeleteRequest = JaxbUtil.converyToJavaBean(request, UserDeleteRequest.class);
+ List userDeleteList = userDeleteRequest.getValue();
+ Set removeUserIdSet = new HashSet<>();
+ for (UserDelete userDelete : userDeleteList) {
+ User user = UserServiceKit.getInstance().getUserByUserName(userDelete.getEmpNo());
+ removeUserIdSet.add(user.getId());
+ }
+ UserUpdateBean userUpdateBean = new UserUpdateBean();
+ userUpdateBean.setRemoveUserIds(removeUserIdSet.toArray(new String[0]));
+ UserServiceKit.getInstance().deleteUsers(userUpdateBean);
+ return Response.success();
+ } catch (Exception e) {
+ LogKit.error(e.getMessage(), e);
+ return Response.failed();
+ }
+ }
+
+ @Override
+ public Response addDept(String request) {
+ try {
+ LogKit.info("hbir-UserManagerImpl-addDept-request:{}", request);
+ String deptXml = cutDICT(request);
+ DeptChange deptChange = JaxbUtil.converyToJavaBean(deptXml, DeptChange.class);
+ this.addDepartment(deptChange.getDeptCode(), DECISION_DEP_ROOT, deptChange.getDeptName());
+ return Response.success();
+ } catch (Exception e) {
+ LogKit.error(e.getMessage(), e);
+ return Response.failed();
+ }
+ }
+
+ private DepartmentPostBean addDepartment(String id, String pId, String depName) throws Exception {
+ if (ComparatorUtils.equals(pId, DECISION_DEP_ROOT)) {
+ pId = null;
+ }
+ this.checkDuplicatedDepartmentName(pId, depName);
+ Department department = (new Department()).id(id).name(depName).parentId(pId).creationType(ManualOperationType.KEY).lastOperationType(ManualOperationType.KEY).enable(true);
+ AuthorityContext.getInstance().getDepartmentController().add(department);
+// MetricRegistry.getMetric().submit(OperateMessage.build("Dec-Module-User_Manager", "Dec-Department", this.getDepartmentFullPath(pId, depName, "/"), "Dec-Log_Add"));
+ return new DepartmentPostBean(department.getId(), false, false, department.getParentId(), "", department.getName());
+ }
+
+ private void checkDuplicatedDepartmentName(String parentId, String depName) throws Exception {
+ QueryCondition condition = QueryFactory.create().addRestriction(RestrictionFactory.and(new Restriction[]{RestrictionFactory.eq("name", depName), RestrictionFactory.eq("parentId", parentId)}));
+ Department sameNameDep = (Department) AuthorityContext.getInstance().getDepartmentController().findOne(condition);
+ if (sameNameDep != null) {
+ throw new DuplicatedNameException();
+ }
+ }
+
+ @Override
+ public Response updateDept(String request) {
+ try {
+ LogKit.info("hbir-UserManagerImpl-updateDept-request:{}", request);
+ String deptXml = cutDICT(request);
+ DeptChange deptChange = JaxbUtil.converyToJavaBean(deptXml, DeptChange.class);
+ this.editDepartment(deptChange.getDeptCode(), deptChange.getDeptName(), DECISION_DEP_ROOT);
+ return Response.success();
+ } catch (Exception e) {
+ LogKit.error(e.getMessage(), e);
+ return Response.failed();
+ }
+ }
+
+ private void editDepartment(String departmentId, String depName, String pId) throws Exception {
+ if (ComparatorUtils.equals(pId, DECISION_DEP_ROOT)) {
+ pId = null;
+ }
+ Department department = AuthorityContext.getInstance().getDepartmentController().getById(departmentId);
+ String departmentFullPath = DepartmentService.getInstance().getDepartmentFullPath(departmentId);
+ if (!ComparatorUtils.equals(department.getName(), depName)) {
+ this.checkDuplicatedDepartmentName(department.getParentId(), depName);
+ department.setName(depName);
+ department.setParentId(pId);
+ AuthorityContext.getInstance().getDepartmentController().update(department);
+ }
+// MetricRegistry.getMetric().submit(OperateMessage.build("Dec-Module-User_Manager", "Dec-Department", DepartmentService.getInstance().getDepartmentFullPath(departmentId), "Dec-Log_Update", InterProviderFactory.getProvider().getLocText("Fine-Dec_Department") + ":" + departmentFullPath));
+ }
+
+ @Override
+ public Response delDept(String request) {
+ try {
+ DeptDeleteRequest deptDeleteRequest = JaxbUtil.converyToJavaBean(request, DeptDeleteRequest.class);
+ List deptDeleteList = deptDeleteRequest.getValue();
+ for (DeptDelete deptDelete : deptDeleteList) {
+ DepartmentService.getInstance().deleteDepartment(deptDelete.getDeptCode());
+ }
+ return Response.success();
+ } catch (Exception e) {
+ LogKit.error(e.getMessage(), e);
+ return Response.failed();
+ }
+ }
+ }
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/hbir/utils/JaxbUtil.java b/src/main/java/com/fr/plugin/hbir/utils/JaxbUtil.java
new file mode 100644
index 0000000..675d735
--- /dev/null
+++ b/src/main/java/com/fr/plugin/hbir/utils/JaxbUtil.java
@@ -0,0 +1,76 @@
+ /*
+ * Copyright (C), 2018-2021
+ * Project: starter
+ * FileName: JaxbUtil
+ * Author: Louis
+ * Date: 2021/7/22 22:26
+ */
+ package com.fr.plugin.hbir.utils;
+
+ import com.fanruan.api.log.LogKit;
+import com.fr.plugin.hbir.bean.DeptChange;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+ /**
+ *
+ *
+ *
+ * @author Louis
+ * @since 1.0.0
+ */
+ public class JaxbUtil {
+
+ public static String convertToXml(Object obj) {
+ return convertToXml(obj, "UTF-8");
+ }
+
+ /**
+ * JavaBean转换成xml
+ *
+ * @param obj
+ * @param encoding
+ * @return
+ */
+ public static String convertToXml(Object obj, String encoding) {
+ String result = null;
+ try {
+ JAXBContext context = JAXBContext.newInstance(obj.getClass());
+ Marshaller marshaller = context.createMarshaller();
+ marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+ marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
+ StringWriter writer = new StringWriter();
+ marshaller.marshal(obj, writer);
+ result = writer.toString();
+ } catch (Exception ex) {
+ LogKit.error(ex.getMessage(), ex);
+ }
+ return result;
+ }
+
+ /**
+ * xml转换成JavaBean
+ *
+ * @param xml
+ * @param c
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ public static T converyToJavaBean(String xml, Class c) {
+ T t = null;
+ try {
+ JAXBContext context = JAXBContext.newInstance(c);
+ Unmarshaller unmarshaller = context.createUnmarshaller();
+ t = (T) unmarshaller.unmarshal(new StringReader(xml));
+ } catch (Exception ex) {
+ LogKit.error(ex.getMessage(), ex);
+ }
+ return t;
+ }
+
+
+ }
\ No newline at end of file
diff --git a/src/main/resources/com/fr/plugin/hbir/locale/lang.properties b/src/main/resources/com/fr/plugin/hbir/locale/lang.properties
new file mode 100644
index 0000000..ec71aca
--- /dev/null
+++ b/src/main/resources/com/fr/plugin/hbir/locale/lang.properties
@@ -0,0 +1,8 @@
+Plugin-hbir=Sso Plugin
+Plugin-hbir_Group=Sso Plugin
+Plugin-hbir_Config_SystemCode=System Code
+Plugin-hbir_Config_SystemCode_Description=System Code
+Plugin-hbir_Config_UserInfoUrl=User Info Url
+Plugin-hbir_Config_UserInfoUrl_Description=User Info Url
+Plugin-hbir_Config_WsUri=WebService Uri
+Plugin-hbir_Config_WsUri_Description=WebService Uri
\ No newline at end of file
diff --git a/src/main/resources/com/fr/plugin/hbir/locale/lang_zh_CN.properties b/src/main/resources/com/fr/plugin/hbir/locale/lang_zh_CN.properties
new file mode 100644
index 0000000..5f7e433
--- /dev/null
+++ b/src/main/resources/com/fr/plugin/hbir/locale/lang_zh_CN.properties
@@ -0,0 +1,8 @@
+Plugin-hbir=\u5355\u70B9\u767B\u9646\u63D2\u4EF6
+Plugin-hbir_Group=\u5355\u70B9\u767B\u9646\u63D2\u4EF6
+Plugin-hbir_Config_SystemCode=\u7CFB\u7EDF\u4EE3\u7801
+Plugin-hbir_Config_SystemCode_Description=\u7CFB\u7EDF\u4EE3\u7801
+Plugin-hbir_Config_UserInfoUrl=\u5355\u70B9\u83B7\u53D6\u7528\u6237\u4FE1\u606F\u63A5\u53E3
+Plugin-hbir_Config_UserInfoUrl_Description=\u5355\u70B9\u83B7\u53D6\u7528\u6237\u4FE1\u606F\u63A5\u53E3
+Plugin-hbir_Config_WsUri=WebService\u63A5\u53E3\u5730\u5740
+Plugin-hbir_Config_WsUri_Description=WebService\u63A5\u53E3\u5730\u5740
\ No newline at end of file