From 890f497b85e8c5722e81729b707c9f9972ea2fd6 Mon Sep 17 00:00:00 2001 From: "LAPTOP-SB56SG4Q\\86185" Date: Sun, 26 Sep 2021 19:13:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=BC=80=E6=BA=90=E6=9D=90?= =?UTF-8?q?=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...户向门户推送)-需求确认书V1.docx | Bin 0 -> 63207 bytes JSD-8170-需求确认书V1.docx | Bin 0 -> 62361 bytes README.md | 7 +- 微信同步/plugin.xml | 21 ++ .../com/fr/plugin/wechat/sync/HttpUtil.java | 310 ++++++++++++++++++ .../plugin/wechat/sync/PluginConstants.java | 11 + .../wechat/sync/SyncDBAccessProvider.java | 43 +++ .../com/fr/plugin/wechat/sync/SyncFilter.java | 76 +++++ .../fr/plugin/wechat/sync/dao/TagRoleDao.java | 20 ++ .../wechat/sync/dao/TagRoleService.java | 75 +++++ .../wechat/sync/entity/TagRoleEntity.java | 47 +++ .../wechat/sync/schedule/SyncThread.java | 209 ++++++++++++ .../src/main/resources/wechat.properties | 6 + 门户同步/plugin.xml | 16 + .../com/fr/plugin/patrol/sync/HttpUtil.java | 310 ++++++++++++++++++ .../plugin/patrol/sync/PluginConstants.java | 11 + .../com/fr/plugin/patrol/sync/SyncFilter.java | 74 +++++ .../patrol/sync/schedule/SyncThread.java | 188 +++++++++++ .../plugin/patrol/sync/schedule/UserInfo.java | 37 +++ .../src/main/resources/patrol.properties | 18 + 门户应用授权接口文档v1.2.docx | Bin 0 -> 43850 bytes 21 files changed, 1477 insertions(+), 2 deletions(-) create mode 100644 JSD-8170(增补角色用户向门户推送)-需求确认书V1.docx create mode 100644 JSD-8170-需求确认书V1.docx create mode 100644 微信同步/plugin.xml create mode 100644 微信同步/src/main/java/com/fr/plugin/wechat/sync/HttpUtil.java create mode 100644 微信同步/src/main/java/com/fr/plugin/wechat/sync/PluginConstants.java create mode 100644 微信同步/src/main/java/com/fr/plugin/wechat/sync/SyncDBAccessProvider.java create mode 100644 微信同步/src/main/java/com/fr/plugin/wechat/sync/SyncFilter.java create mode 100644 微信同步/src/main/java/com/fr/plugin/wechat/sync/dao/TagRoleDao.java create mode 100644 微信同步/src/main/java/com/fr/plugin/wechat/sync/dao/TagRoleService.java create mode 100644 微信同步/src/main/java/com/fr/plugin/wechat/sync/entity/TagRoleEntity.java create mode 100644 微信同步/src/main/java/com/fr/plugin/wechat/sync/schedule/SyncThread.java create mode 100644 微信同步/src/main/resources/wechat.properties create mode 100644 门户同步/plugin.xml create mode 100644 门户同步/src/main/java/com/fr/plugin/patrol/sync/HttpUtil.java create mode 100644 门户同步/src/main/java/com/fr/plugin/patrol/sync/PluginConstants.java create mode 100644 门户同步/src/main/java/com/fr/plugin/patrol/sync/SyncFilter.java create mode 100644 门户同步/src/main/java/com/fr/plugin/patrol/sync/schedule/SyncThread.java create mode 100644 门户同步/src/main/java/com/fr/plugin/patrol/sync/schedule/UserInfo.java create mode 100644 门户同步/src/main/resources/patrol.properties create mode 100644 门户应用授权接口文档v1.2.docx diff --git a/JSD-8170(增补角色用户向门户推送)-需求确认书V1.docx b/JSD-8170(增补角色用户向门户推送)-需求确认书V1.docx new file mode 100644 index 0000000000000000000000000000000000000000..3f90575922fac4b938123e1a07a204caaba48246 GIT binary patch literal 63207 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 z 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ⅈ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 + + com.fr.plugin.wechat.sync + + yes + 1.2 + 10.0 + 2018-07-31 + fr.open + + + + + + + + + + \ No newline at end of file diff --git a/微信同步/src/main/java/com/fr/plugin/wechat/sync/HttpUtil.java b/微信同步/src/main/java/com/fr/plugin/wechat/sync/HttpUtil.java new file mode 100644 index 0000000..5ca544c --- /dev/null +++ b/微信同步/src/main/java/com/fr/plugin/wechat/sync/HttpUtil.java @@ -0,0 +1,310 @@ +package com.fr.plugin.wechat.sync; + +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.third.org.apache.http.HttpResponse; +import com.fr.third.org.apache.http.HttpStatus; +import com.fr.third.org.apache.http.client.HttpClient; +import com.fr.third.org.apache.http.client.methods.HttpPost; +import com.fr.third.org.apache.http.config.Registry; +import com.fr.third.org.apache.http.config.RegistryBuilder; +import com.fr.third.org.apache.http.conn.socket.ConnectionSocketFactory; +import com.fr.third.org.apache.http.conn.socket.PlainConnectionSocketFactory; +import com.fr.third.org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import com.fr.third.org.apache.http.entity.StringEntity; +import com.fr.third.org.apache.http.impl.client.HttpClients; +import com.fr.third.org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import com.fr.third.org.apache.http.util.EntityUtils; + +import javax.net.ssl.*; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.security.cert.CertificateException; +import java.util.Iterator; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author fr.open + * @date 2021/7/29 + */ +public class HttpUtil { + + private static HostnameVerifier hv = new HostnameVerifier() { + @Override + public boolean verify(String urlHostName, SSLSession session) { + System.out.println("Warning: URL Host: " + urlHostName + " vs. " + + session.getPeerHost()); + return true; + } + }; + + /** + * 发送get请求 + * + * @param url + * @param param + * @param header + * @return + * @throws IOException + */ + public static String sendGet(String url, Map param, Map header) { + String result = ""; + BufferedReader in = null; + String urlNameString = url; + try { + if (param != null) { + urlNameString += "?"; + urlNameString += param.entrySet() + .stream() + .map(entry -> entry.getKey() + "=" + entry.getValue()) + .collect(Collectors.joining("&")); + } + + URL realUrl = new URL(urlNameString); + // 打开和URL之间的连接 + HttpURLConnection connection; + if (url.startsWith("https")) { + trustAllHttpsCertificates(); + HttpsURLConnection.setDefaultHostnameVerifier(hv); + connection = (HttpURLConnection) realUrl.openConnection(); + } else { + connection = (HttpURLConnection) realUrl.openConnection(); + } + //设置超时时间 + connection.setDoInput(true); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(5000); + connection.setReadTimeout(15000); + // 设置通用的请求属性 + if (header != null) { + Iterator> it = header.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + System.out.println(entry.getKey() + ":::" + entry.getValue()); + connection.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 建立实际的连接 + connection.connect(); + // 定义 BufferedReader输入流来读取URL的响应,设置utf8防止中文乱码 + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + if (in != null) { + in.close(); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e, "get url error ,url is:{},error is {}", urlNameString, e.getMessage()); + } + return result; + } + + public static String sendPost(String url, Map header, JSONObject body) { + PrintWriter out = null; + BufferedReader in = null; + String result = null; + String res = null; + try { + String urlNameString = url; + + URL realUrl = new URL(urlNameString); + // 打开和URL之间的连接 + HttpURLConnection conn; + if (url.startsWith("https")) { + trustAllHttpsCertificates(); + HttpsURLConnection.setDefaultHostnameVerifier(hv); + conn = (HttpURLConnection) realUrl.openConnection(); + } else { + conn = (HttpURLConnection) realUrl.openConnection(); + } + // 设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); +// conn.setRequestProperty("user-agent", +// "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); + if (header != null) { + header.forEach((k, v) -> { + conn.setRequestProperty(k, String.valueOf(v)); + }); + } + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + //获取请求头 + + // 获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + // 发送请求参数 + if (body != null) { + FineLoggerFactory.getLogger().info("content data: {}", body.toString()); + FineLoggerFactory.getLogger().info("content cover data: {}", new String(body.toString().getBytes("UTF-8"), "UTF-8")); + out.print(new String(body.toString().getBytes("UTF-8"), "UTF-8")); + } + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 + in = new BufferedReader( + new InputStreamReader(conn.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + res = result; + if (res.startsWith("null")) { + res = res.replace("null", ""); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + //使用finally块来关闭输出流、输入流 + finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + return res; + } + + + public static String doPost(String url, Map header, JSONObject json) { + HttpClient client = HttpClients.createDefault(); + if (url.startsWith("https")) { + SSLContext sslcontext = createIgnoreVerifySSL(); + Registry socketFactoryRegistry = RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.INSTANCE) + .register("https", new SSLConnectionSocketFactory(sslcontext)) + .build(); + PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); + HttpClients.custom().setConnectionManager(connManager); + client = HttpClients.custom().setConnectionManager(connManager).build(); + } + HttpPost post = new HttpPost(url); + post.setHeader("accept", "*/*"); + post.setHeader("connection", "Keep-Alive"); + post.setHeader("Content-Type", "application/json"); + if (header != null) { + header.forEach((k, v) -> { + post.setHeader(k, String.valueOf(v)); + }); + } + try { + StringEntity s = new StringEntity(json.toString(),"UTF-8"); + s.setContentEncoding("UTF-8"); + s.setContentType("application/json; charset=UTF-8");//发送json数据需要设置contentType + post.setEntity(s); + HttpResponse res = client.execute(post); + if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + String result = EntityUtils.toString(res.getEntity());// 返回json格式: + return result; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(),e); + } + return null; + } + + private static void trustAllHttpsCertificates() throws Exception { + TrustManager[] trustAllCerts = new TrustManager[1]; + TrustManager tm = new miTM(); + trustAllCerts[0] = tm; + SSLContext sc = SSLContext.getInstance("SSL", "SunJSSE"); + sc.init(null, trustAllCerts, null); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + + /** + * encode url by UTF-8 + * + * @param url url before encoding + * @return url after encoding + */ + public static String encodeUrl(String url) { + String eurl = url; + try { + eurl = URLEncoder.encode(url, "UTF-8"); + } catch (UnsupportedEncodingException e) { + } + return eurl; + } + + private static class miTM implements TrustManager, + X509TrustManager { + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + public boolean isServerTrusted( + java.security.cert.X509Certificate[] certs) { + return true; + } + + public boolean isClientTrusted( + java.security.cert.X509Certificate[] certs) { + return true; + } + + @Override + public void checkServerTrusted( + java.security.cert.X509Certificate[] certs, String authType) + throws CertificateException { + return; + } + + @Override + public void checkClientTrusted( + java.security.cert.X509Certificate[] certs, String authType) + throws CertificateException { + return; + } + } + + public static SSLContext createIgnoreVerifySSL() { + try { + SSLContext sc = SSLContext.getInstance("SSLv3"); + + // 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法 + X509TrustManager trustManager = new X509TrustManager() { + @Override + public void checkClientTrusted( + java.security.cert.X509Certificate[] paramArrayOfX509Certificate, + String paramString) throws CertificateException { + } + + @Override + public void checkServerTrusted( + java.security.cert.X509Certificate[] paramArrayOfX509Certificate, + String paramString) throws CertificateException { + } + + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + }; + + sc.init(null, new TrustManager[]{trustManager}, null); + return sc; + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return null; + } +} diff --git a/微信同步/src/main/java/com/fr/plugin/wechat/sync/PluginConstants.java b/微信同步/src/main/java/com/fr/plugin/wechat/sync/PluginConstants.java new file mode 100644 index 0000000..e8c8201 --- /dev/null +++ b/微信同步/src/main/java/com/fr/plugin/wechat/sync/PluginConstants.java @@ -0,0 +1,11 @@ +package com.fr.plugin.wechat.sync; + +/** + * @Author fr.open + * @Date 2021/3/1 + * @Description + **/ +public class PluginConstants { + + public static final String PLUGIN_ID = "com.fr.plugin.wechat.sync"; +} diff --git a/微信同步/src/main/java/com/fr/plugin/wechat/sync/SyncDBAccessProvider.java b/微信同步/src/main/java/com/fr/plugin/wechat/sync/SyncDBAccessProvider.java new file mode 100644 index 0000000..8338f4e --- /dev/null +++ b/微信同步/src/main/java/com/fr/plugin/wechat/sync/SyncDBAccessProvider.java @@ -0,0 +1,43 @@ +package com.fr.plugin.wechat.sync; + +import com.fr.db.fun.impl.AbstractDBAccessProvider; +import com.fr.plugin.wechat.sync.dao.TagRoleDao; +import com.fr.plugin.wechat.sync.entity.TagRoleEntity; +import com.fr.stable.db.accessor.DBAccessor; +import com.fr.stable.db.dao.BaseDAO; +import com.fr.stable.db.dao.DAOProvider; + +/** + * @Author fr.open + * @Date 2021/7/29 + **/ +public class SyncDBAccessProvider extends AbstractDBAccessProvider { + + private static DBAccessor dbAccessor = null; + + public static DBAccessor getDbAccessor() { + return dbAccessor; + } + + @Override + public DAOProvider[] registerDAO() { + return new DAOProvider[]{ + new DAOProvider() { + @Override + public Class getEntityClass() { + return TagRoleEntity.class; + } + + @Override + public Class getDAOClass() { + return TagRoleDao.class; + } + } + }; + } + + @Override + public void onDBAvailable(DBAccessor dbAccessor) { + SyncDBAccessProvider.dbAccessor = dbAccessor; + } +} diff --git a/微信同步/src/main/java/com/fr/plugin/wechat/sync/SyncFilter.java b/微信同步/src/main/java/com/fr/plugin/wechat/sync/SyncFilter.java new file mode 100644 index 0000000..5e6b2c5 --- /dev/null +++ b/微信同步/src/main/java/com/fr/plugin/wechat/sync/SyncFilter.java @@ -0,0 +1,76 @@ +package com.fr.plugin.wechat.sync; + +import com.fr.base.PropertiesUtils; +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.context.PluginContexts; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.plugin.wechat.sync.schedule.SyncThread; +import com.fr.scheduler.QuartzContext; +import com.fr.scheduler.ScheduleJobManager; +import com.fr.stable.StringUtils; +import com.fr.stable.fun.Authorize; +import com.fr.third.v2.org.quartz.CronScheduleBuilder; +import com.fr.third.v2.org.quartz.JobKey; +import com.fr.third.v2.org.quartz.SchedulerException; +import com.fr.third.v2.org.quartz.TriggerBuilder; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Author fr.open + * @Date 2021/7/29 + * @Description + **/ +@FunctionRecorder +@Authorize(callSignKey = PluginConstants.PLUGIN_ID) +public class SyncFilter extends AbstractGlobalRequestFilterProvider { + @Override + public String filterName() { + return "sync"; + } + + @Override + @Focus(id = PluginConstants.PLUGIN_ID, text = "微信同步", source = Original.PLUGIN) + public String[] urlPatterns() { + if (PluginContexts.currentContext().isAvailable()) { + initSchedule(); + } + return new String[]{"/syncWechat"}; + } + + + public static void initSchedule() { + JobKey jobKey = new JobKey("syncWechat", "syncGroup"); + try { + if (QuartzContext.getInstance().getScheduler().checkExists(jobKey)) { + ScheduleJobManager.getInstance().removeJob(jobKey.getName(), jobKey.getGroup()); + } + } catch (SchedulerException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + + addSchedule(jobKey); + } + + private static void addSchedule(JobKey jobKey) { + Map param = new HashMap(); + TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger(); + triggerBuilder.forJob(jobKey.getName(), jobKey.getGroup()).withIdentity(jobKey.getName(), jobKey.getGroup()).startNow(); + String cron = PropertiesUtils.getProperties("wechat").getProperty("cron"); + if (StringUtils.isBlank(cron)) { + FineLoggerFactory.getLogger().error("cron is null schedule start failed"); + return; + } + CronScheduleBuilder schedule = CronScheduleBuilder.cronSchedule(cron); + triggerBuilder.withSchedule(schedule); + try { + ScheduleJobManager.getInstance().addJob(jobKey.getName(), jobKey.getGroup(), "sync job", SyncThread.class, triggerBuilder.build(), param); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } +} diff --git a/微信同步/src/main/java/com/fr/plugin/wechat/sync/dao/TagRoleDao.java b/微信同步/src/main/java/com/fr/plugin/wechat/sync/dao/TagRoleDao.java new file mode 100644 index 0000000..1a6962b --- /dev/null +++ b/微信同步/src/main/java/com/fr/plugin/wechat/sync/dao/TagRoleDao.java @@ -0,0 +1,20 @@ +package com.fr.plugin.wechat.sync.dao; + +import com.fr.plugin.wechat.sync.entity.TagRoleEntity; +import com.fr.stable.db.dao.BaseDAO; +import com.fr.stable.db.session.DAOSession; + +/** + * @Author fr.open + * @Date 2021/7/29 + * @Description + **/ +public class TagRoleDao extends BaseDAO { + public TagRoleDao(DAOSession daoSession) { + super(daoSession); + } + @Override + protected Class getEntityClass() { + return TagRoleEntity.class; + } +} diff --git a/微信同步/src/main/java/com/fr/plugin/wechat/sync/dao/TagRoleService.java b/微信同步/src/main/java/com/fr/plugin/wechat/sync/dao/TagRoleService.java new file mode 100644 index 0000000..36d7b1c --- /dev/null +++ b/微信同步/src/main/java/com/fr/plugin/wechat/sync/dao/TagRoleService.java @@ -0,0 +1,75 @@ +package com.fr.plugin.wechat.sync.dao; + +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.wechat.sync.SyncDBAccessProvider; +import com.fr.plugin.wechat.sync.entity.TagRoleEntity; +import com.fr.stable.db.action.DBAction; +import com.fr.stable.db.dao.DAOContext; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.restriction.RestrictionFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * @Author fr.open + * @Date 2021/7/29 + * @Description + **/ +public class TagRoleService { + + public static TagRoleEntity create(TagRoleEntity entity) { + try { + return SyncDBAccessProvider.getDbAccessor().runDMLAction(new DBAction() { + + @Override + public TagRoleEntity run(DAOContext daoContext) throws Exception { + entity.setId(UUID.randomUUID().toString()); + daoContext.getDAO(TagRoleDao.class).add(entity); + return entity; + } + }); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return entity; + } + + public static TagRoleEntity delete(String tagId) { + try { + return SyncDBAccessProvider.getDbAccessor().runDMLAction(new DBAction() { + + @Override + public TagRoleEntity run(DAOContext daoContext) throws Exception { + TagRoleDao dao = daoContext.getDAO(TagRoleDao.class); + TagRoleEntity entity = dao.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("tagId", tagId))); + dao.remove(entity.getId()); + return entity; + } + }); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return null; + } + + public static Map getLinkMap() { + Map map = new HashMap<>(); + try { + List tagRoleEntities = SyncDBAccessProvider.getDbAccessor().runDMLAction(new DBAction>() { + @Override + public List run(DAOContext daoContext) throws Exception { + TagRoleDao dao = daoContext.getDAO(TagRoleDao.class); + return dao.find(QueryFactory.create()); + } + }); + return tagRoleEntities.stream().collect(Collectors.toMap(e->e.getTagId(),e->e.getRoleId(),(k1,k2)->k2)); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return map; + } +} diff --git a/微信同步/src/main/java/com/fr/plugin/wechat/sync/entity/TagRoleEntity.java b/微信同步/src/main/java/com/fr/plugin/wechat/sync/entity/TagRoleEntity.java new file mode 100644 index 0000000..a7ffad0 --- /dev/null +++ b/微信同步/src/main/java/com/fr/plugin/wechat/sync/entity/TagRoleEntity.java @@ -0,0 +1,47 @@ +package com.fr.plugin.wechat.sync.entity; + +import com.fr.stable.db.entity.BaseEntity; +import com.fr.third.javax.persistence.Column; +import com.fr.third.javax.persistence.Entity; +import com.fr.third.javax.persistence.Table; + +/** + * @Author fr.open + * @Date 2021/7/29 + * @Description + **/ + +@Entity +@Table(name = "plugin_tag_role") +public class TagRoleEntity extends BaseEntity { + + @Column(name = "tagId") + private String tagId; + + @Column(name = "roleId") + private String roleId; + + public TagRoleEntity() { + } + + public TagRoleEntity(String tagId, String roleId) { + this.tagId = tagId; + this.roleId = roleId; + } + + public String getTagId() { + return tagId; + } + + public void setTagId(String tagId) { + this.tagId = tagId; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } +} diff --git a/微信同步/src/main/java/com/fr/plugin/wechat/sync/schedule/SyncThread.java b/微信同步/src/main/java/com/fr/plugin/wechat/sync/schedule/SyncThread.java new file mode 100644 index 0000000..026f42c --- /dev/null +++ b/微信同步/src/main/java/com/fr/plugin/wechat/sync/schedule/SyncThread.java @@ -0,0 +1,209 @@ +package com.fr.plugin.wechat.sync.schedule; + +import com.fr.base.TableData; +import com.fr.cluster.core.ClusterNode; +import com.fr.decision.authority.AuthorityContext; +import com.fr.decision.authority.data.CustomRole; +import com.fr.decision.authority.data.User; +import com.fr.decision.webservice.service.user.UserMiddleRoleService; +import com.fr.file.TableDataConfig; +import com.fr.general.PropertiesUtils; +import com.fr.general.data.DataModel; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.wechat.sync.HttpUtil; +import com.fr.plugin.wechat.sync.dao.TagRoleService; +import com.fr.plugin.wechat.sync.entity.TagRoleEntity; +import com.fr.scheduler.job.FineScheduleJob; +import com.fr.script.Calculator; +import com.fr.stable.StringUtils; +import com.fr.stable.query.QueryFactory; +import com.fr.third.org.apache.http.entity.StringEntity; +import com.fr.third.v2.org.quartz.JobExecutionContext; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @Author fr.open + * @Date 2021/7/29 + * @Description + **/ +public class SyncThread extends FineScheduleJob { + + private static final String tagList = "https://qyapi.weixin.qq.com/cgi-bin/tag/list?access_token="; + + private static final String TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET"; + + private static final String DELETE_TAG_URL = "https://qyapi.weixin.qq.com/cgi-bin/tag/delete?access_token=ACCESS_TOKEN&tagid=TAGID"; + + private static final String TAG_LIST = "https://qyapi.weixin.qq.com/cgi-bin/tag/get?access_token=ACCESS_TOKEN&tagid=TAGID"; + + private static final String DELETE_USER_LIST = "https://qyapi.weixin.qq.com/cgi-bin/tag/deltagusers?access_token=ACCESS_TOKEN"; + + private static final String ADD_USER_LIST = "https://qyapi.weixin.qq.com/cgi-bin/tag/addtagusers?access_token=ACCESS_TOKEN"; + + private static final String ADD_TAG_URL = "https://qyapi.weixin.qq.com/cgi-bin/tag/create?access_token=ACCESS_TOKEN"; + + private DataModel dataModel; + + public SyncThread() { + String name = PropertiesUtils.getProperties("wechat").getProperty("name"); + FineLoggerFactory.getLogger().info("get table data config is {}", name); + TableData tableData = TableDataConfig.getInstance().getTableData(name); + dataModel = tableData.createDataModel(Calculator.createCalculator()); + } + + @Override + public void run(JobExecutionContext jobExecutionContext, ClusterNode clusterNode) throws Exception { + FineLoggerFactory.getLogger().info("start sync wechat users"); + String secret = PropertiesUtils.getProperties("wechat").getProperty("secret"); + String apid = PropertiesUtils.getProperties("wechat").getProperty("apid"); + String token = getToken(apid, secret); + if (StringUtils.isBlank(token)) { + return; + } + List customRoles = AuthorityContext.getInstance().getCustomRoleController().find(QueryFactory.create()); + customRoles = customRoles.stream().filter(e -> !"superusers".equals(e.getName())).collect(Collectors.toList()); + FineLoggerFactory.getLogger().info("get role size is {}", customRoles.size()); + Map map = customRoles.stream().collect(Collectors.toMap(e -> e.getId(), e -> e, (k1, k2) -> k2)); + Map link = TagRoleService.getLinkMap(); + JSONArray tagList = getTagList(token); + Set exist = new HashSet<>(); + for (int i = 0; i < tagList.size(); i++) { + JSONObject object = tagList.getJSONObject(i); + String tagid = object.getString("tagid"); + String name = object.getString("tagname"); + //不存在的tag不进行处理 + String roleId = link.get(tagid); + if (StringUtils.isBlank(roleId)) { + continue; + } + //如果 + CustomRole role = map.get(roleId); + if (role == null) { + //删除当前标签 + FineLoggerFactory.getLogger().info("delete tag is {}", name); + deleteTag(token, tagid); + TagRoleService.delete(tagid); + continue; + } + exist.add(roleId); + //获取当前角色下的用户 + Set users = getUsers(roleId); + //获取当前标签下的用户 + Set tagUserList = getTagUser(token, tagid); + //待删除tag的用户 + Set deleteUsers = tagUserList.stream().filter(e -> !users.contains(e)).collect(Collectors.toSet()); + FineLoggerFactory.getLogger().info("delete users {} to tag:{}",deleteUsers,name); + deleteUser(token, tagid, deleteUsers); + //待添加的用户 + Set addUsers = users.stream().filter(e -> !tagUserList.contains(e)).collect(Collectors.toSet()); + FineLoggerFactory.getLogger().info("add users {} to tag:{}",addUsers,name); + addUser(token, tagid, addUsers); + } + //角色中不存在的需要添加标签 + List addTags = map.keySet().stream().filter(e -> !exist.contains(e)).collect(Collectors.toList()); + for (String role : addTags) { + CustomRole customRole = map.get(role); + String tagid = addTag(token, customRole.getName()); + TagRoleService.create(new TagRoleEntity(tagid, role)); + addUser(token, tagid, getUsers(role)); + } + + } + + private String addTag(String token, String name) { + JSONObject object = JSONObject.create().put("tagname", name); + StringEntity s = new StringEntity(object.toString(), "UTF-8"); + s.setContentEncoding("UTF-8"); + String res = HttpUtil.sendPost(ADD_TAG_URL.replace("ACCESS_TOKEN", token), null, object); + FineLoggerFactory.getLogger().info("add tag res is {}", res); + JSONObject resObj = new JSONObject(res); + return resObj.getString("tagid"); + } + + + private Set getUsers(String roleId) throws Exception { + Set ids = UserMiddleRoleService.getInstance().getAllUserIdsByCustomRole(roleId); + List all = AuthorityContext.getInstance().getUserController().find(QueryFactory.create()); + Set names = all.stream().filter(e -> ids.contains(e.getId())).map(e -> e.getUserName()).collect(Collectors.toSet()); + Set userids = new HashSet<>(); + try { + for (int i = 0; i < dataModel.getRowCount(); i++) { + Object valueAt = dataModel.getValueAt(i, 4); + if (valueAt != null && names.contains(valueAt.toString())) { + Object id = dataModel.getValueAt(i, 6); + if(id != null && StringUtils.isNotBlank(id.toString())){ + userids.add(String.valueOf(id)); + } + } + } + } catch (Exception e) { + } + FineLoggerFactory.getLogger().info("get users ids {} by usernames {}",userids,names); + return userids; + } + + private void addUser(String token, String tagid, Set addUsers) { + if (addUsers == null || addUsers.isEmpty()) { + return; + } + JSONObject object = JSONObject.create().put("tagid", Integer.valueOf(tagid)); + object.put("userlist", addUsers); + String res = HttpUtil.sendPost(ADD_USER_LIST.replace("ACCESS_TOKEN", token), null, object); + FineLoggerFactory.getLogger().info("add tag user res is {}", res); + } + + private void deleteUser(String token, String tagid, Set deleteUsers) { + if (deleteUsers == null || deleteUsers.isEmpty()) { + return; + } + JSONObject object = JSONObject.create().put("tagid", Integer.valueOf(tagid)); + object.put("userlist", deleteUsers); + String res = HttpUtil.sendPost(DELETE_USER_LIST.replace("ACCESS_TOKEN", token), null, object); + FineLoggerFactory.getLogger().info("delete tag user res is {}", res); + } + + private Set getTagUser(String token, String tagid) { + String res = HttpUtil.sendGet(TAG_LIST.replace("ACCESS_TOKEN", token).replace("TAGID", tagid), null, null); + FineLoggerFactory.getLogger().info("get tag user res is {}", res); + JSONObject object = new JSONObject(res); + JSONArray userlist = object.getJsonArray("userlist"); + Set list = new HashSet<>(); + for (int i = 0; i < userlist.size(); i++) { + JSONObject jsonObject = userlist.getJSONObject(i); + list.add(jsonObject.getString("userid")); + } + return list; + } + + /** + * 删除tag + * + * @param token + * @param tagid + */ + private void deleteTag(String token, String tagid) { + String res = HttpUtil.sendGet(DELETE_TAG_URL.replace("ACCESS_TOKEN", token).replace("TAGID", tagid), null, null); + FineLoggerFactory.getLogger().info("delete tag res is {}", res); + } + + private String getToken(String apid, String secret) { + String res = HttpUtil.sendGet(TOKEN_URL.replace("ID", apid).replace("SECRET", secret), null, null); + FineLoggerFactory.getLogger().info("get Token res is {}", res); + JSONObject object = new JSONObject(res); + return object.getString("access_token"); + } + + private JSONArray getTagList(String token) { + String res = HttpUtil.sendGet(tagList + token, null, null); + FineLoggerFactory.getLogger().info("get Tag res is {}", res); + JSONObject object = new JSONObject(res); + return object.getJsonArray("taglist"); + } +} diff --git a/微信同步/src/main/resources/wechat.properties b/微信同步/src/main/resources/wechat.properties new file mode 100644 index 0000000..a10dfad --- /dev/null +++ b/微信同步/src/main/resources/wechat.properties @@ -0,0 +1,6 @@ +apid=xxxx +secret=xxxx +##定时器参数,此配置为默认每小时执行一次 +cron=0 0/1 * * * ? * +##数据集名称 +name=xxxx \ No newline at end of file diff --git a/门户同步/plugin.xml b/门户同步/plugin.xml new file mode 100644 index 0000000..4ba8b5a --- /dev/null +++ b/门户同步/plugin.xml @@ -0,0 +1,16 @@ + + + com.fr.plugin.patrol.sync + + yes + 1.4 + 10.0 + 2018-07-31 + fr.open + + + + + + + \ No newline at end of file diff --git a/门户同步/src/main/java/com/fr/plugin/patrol/sync/HttpUtil.java b/门户同步/src/main/java/com/fr/plugin/patrol/sync/HttpUtil.java new file mode 100644 index 0000000..619b419 --- /dev/null +++ b/门户同步/src/main/java/com/fr/plugin/patrol/sync/HttpUtil.java @@ -0,0 +1,310 @@ +package com.fr.plugin.patrol.sync; + +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.third.org.apache.http.HttpResponse; +import com.fr.third.org.apache.http.HttpStatus; +import com.fr.third.org.apache.http.client.HttpClient; +import com.fr.third.org.apache.http.client.methods.HttpPost; +import com.fr.third.org.apache.http.config.Registry; +import com.fr.third.org.apache.http.config.RegistryBuilder; +import com.fr.third.org.apache.http.conn.socket.ConnectionSocketFactory; +import com.fr.third.org.apache.http.conn.socket.PlainConnectionSocketFactory; +import com.fr.third.org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import com.fr.third.org.apache.http.entity.StringEntity; +import com.fr.third.org.apache.http.impl.client.HttpClients; +import com.fr.third.org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import com.fr.third.org.apache.http.util.EntityUtils; + +import javax.net.ssl.*; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.security.cert.CertificateException; +import java.util.Iterator; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author fr.open + * @date 2021/7/29 + */ +public class HttpUtil { + + private static HostnameVerifier hv = new HostnameVerifier() { + @Override + public boolean verify(String urlHostName, SSLSession session) { + System.out.println("Warning: URL Host: " + urlHostName + " vs. " + + session.getPeerHost()); + return true; + } + }; + + /** + * 发送get请求 + * + * @param url + * @param param + * @param header + * @return + * @throws IOException + */ + public static String sendGet(String url, Map param, Map header) { + String result = ""; + BufferedReader in = null; + String urlNameString = url; + try { + if (param != null) { + urlNameString += "?"; + urlNameString += param.entrySet() + .stream() + .map(entry -> entry.getKey() + "=" + entry.getValue()) + .collect(Collectors.joining("&")); + } + + URL realUrl = new URL(urlNameString); + // 打开和URL之间的连接 + HttpURLConnection connection; + if (url.startsWith("https")) { + trustAllHttpsCertificates(); + HttpsURLConnection.setDefaultHostnameVerifier(hv); + connection = (HttpURLConnection) realUrl.openConnection(); + } else { + connection = (HttpURLConnection) realUrl.openConnection(); + } + //设置超时时间 + connection.setDoInput(true); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(5000); + connection.setReadTimeout(15000); + // 设置通用的请求属性 + if (header != null) { + Iterator> it = header.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + System.out.println(entry.getKey() + ":::" + entry.getValue()); + connection.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 建立实际的连接 + connection.connect(); + // 定义 BufferedReader输入流来读取URL的响应,设置utf8防止中文乱码 + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + if (in != null) { + in.close(); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e, "get url error ,url is:{},error is {}", urlNameString, e.getMessage()); + } + return result; + } + + public static String sendPost(String url, Map header, JSONObject body) { + PrintWriter out = null; + BufferedReader in = null; + String result = null; + String res = null; + try { + String urlNameString = url; + + URL realUrl = new URL(urlNameString); + // 打开和URL之间的连接 + HttpURLConnection conn; + if (url.startsWith("https")) { + trustAllHttpsCertificates(); + HttpsURLConnection.setDefaultHostnameVerifier(hv); + conn = (HttpURLConnection) realUrl.openConnection(); + } else { + conn = (HttpURLConnection) realUrl.openConnection(); + } + // 设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); +// conn.setRequestProperty("user-agent", +// "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); + if (header != null) { + header.forEach((k, v) -> { + conn.setRequestProperty(k, String.valueOf(v)); + }); + } + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + //获取请求头 + + // 获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + // 发送请求参数 + if (body != null) { + FineLoggerFactory.getLogger().info("content data: {}", body.toString()); + FineLoggerFactory.getLogger().info("content cover data: {}", new String(body.toString().getBytes("UTF-8"), "UTF-8")); + out.print(new String(body.toString().getBytes("UTF-8"), "UTF-8")); + } + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 + in = new BufferedReader( + new InputStreamReader(conn.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + res = result; + if (res.startsWith("null")) { + res = res.replace("null", ""); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + //使用finally块来关闭输出流、输入流 + finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + return res; + } + + + public static String doPost(String url, Map header, JSONObject json) { + HttpClient client = HttpClients.createDefault(); + if (url.startsWith("https")) { + SSLContext sslcontext = createIgnoreVerifySSL(); + Registry socketFactoryRegistry = RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.INSTANCE) + .register("https", new SSLConnectionSocketFactory(sslcontext)) + .build(); + PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); + HttpClients.custom().setConnectionManager(connManager); + client = HttpClients.custom().setConnectionManager(connManager).build(); + } + HttpPost post = new HttpPost(url); + post.setHeader("accept", "*/*"); + post.setHeader("connection", "Keep-Alive"); + post.setHeader("Content-Type", "application/json"); + if (header != null) { + header.forEach((k, v) -> { + post.setHeader(k, String.valueOf(v)); + }); + } + try { + StringEntity s = new StringEntity(json.toString(),"UTF-8"); + s.setContentEncoding("UTF-8"); + s.setContentType("application/json; charset=UTF-8");//发送json数据需要设置contentType + post.setEntity(s); + HttpResponse res = client.execute(post); + if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + String result = EntityUtils.toString(res.getEntity());// 返回json格式: + return result; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(),e); + } + return null; + } + + private static void trustAllHttpsCertificates() throws Exception { + TrustManager[] trustAllCerts = new TrustManager[1]; + TrustManager tm = new miTM(); + trustAllCerts[0] = tm; + SSLContext sc = SSLContext.getInstance("SSL", "SunJSSE"); + sc.init(null, trustAllCerts, null); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + + /** + * encode url by UTF-8 + * + * @param url url before encoding + * @return url after encoding + */ + public static String encodeUrl(String url) { + String eurl = url; + try { + eurl = URLEncoder.encode(url, "UTF-8"); + } catch (UnsupportedEncodingException e) { + } + return eurl; + } + + private static class miTM implements TrustManager, + X509TrustManager { + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + public boolean isServerTrusted( + java.security.cert.X509Certificate[] certs) { + return true; + } + + public boolean isClientTrusted( + java.security.cert.X509Certificate[] certs) { + return true; + } + + @Override + public void checkServerTrusted( + java.security.cert.X509Certificate[] certs, String authType) + throws CertificateException { + return; + } + + @Override + public void checkClientTrusted( + java.security.cert.X509Certificate[] certs, String authType) + throws CertificateException { + return; + } + } + + public static SSLContext createIgnoreVerifySSL() { + try { + SSLContext sc = SSLContext.getInstance("SSLv3"); + + // 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法 + X509TrustManager trustManager = new X509TrustManager() { + @Override + public void checkClientTrusted( + java.security.cert.X509Certificate[] paramArrayOfX509Certificate, + String paramString) throws CertificateException { + } + + @Override + public void checkServerTrusted( + java.security.cert.X509Certificate[] paramArrayOfX509Certificate, + String paramString) throws CertificateException { + } + + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + }; + + sc.init(null, new TrustManager[]{trustManager}, null); + return sc; + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return null; + } +} diff --git a/门户同步/src/main/java/com/fr/plugin/patrol/sync/PluginConstants.java b/门户同步/src/main/java/com/fr/plugin/patrol/sync/PluginConstants.java new file mode 100644 index 0000000..9ed89ec --- /dev/null +++ b/门户同步/src/main/java/com/fr/plugin/patrol/sync/PluginConstants.java @@ -0,0 +1,11 @@ +package com.fr.plugin.patrol.sync; + +/** + * @Author fr.open + * @Date 2021/3/1 + * @Description + **/ +public class PluginConstants { + + public static final String PLUGIN_ID = "com.fr.plugin.patrol.sync"; +} diff --git a/门户同步/src/main/java/com/fr/plugin/patrol/sync/SyncFilter.java b/门户同步/src/main/java/com/fr/plugin/patrol/sync/SyncFilter.java new file mode 100644 index 0000000..15bfe5c --- /dev/null +++ b/门户同步/src/main/java/com/fr/plugin/patrol/sync/SyncFilter.java @@ -0,0 +1,74 @@ +package com.fr.plugin.patrol.sync; + +import com.fr.base.PropertiesUtils; +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.context.PluginContexts; +import com.fr.plugin.patrol.sync.schedule.SyncThread; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.scheduler.QuartzContext; +import com.fr.scheduler.ScheduleJobManager; +import com.fr.stable.StringUtils; +import com.fr.stable.fun.Authorize; +import com.fr.third.v2.org.quartz.CronScheduleBuilder; +import com.fr.third.v2.org.quartz.JobKey; +import com.fr.third.v2.org.quartz.SchedulerException; +import com.fr.third.v2.org.quartz.TriggerBuilder; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Author fr.open + * @Date 2021/7/29 + * @Description + **/ +@FunctionRecorder +@Authorize(callSignKey = PluginConstants.PLUGIN_ID) +public class SyncFilter extends AbstractGlobalRequestFilterProvider { + @Override + public String filterName() { + return "syncPatrol"; + } + + @Override + @Focus(id = PluginConstants.PLUGIN_ID, text = "门户角色同步", source = Original.PLUGIN) + public String[] urlPatterns() { + if (PluginContexts.currentContext().isAvailable()) { + initSchedule(); + } + return new String[]{"/syncPatrol"}; + } + + public static void initSchedule() { + JobKey jobKey = new JobKey("syncPatrol", "syncGroup"); + try { + if (QuartzContext.getInstance().getScheduler().checkExists(jobKey)) { + ScheduleJobManager.getInstance().removeJob(jobKey.getName(), jobKey.getGroup()); + } + } catch (SchedulerException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + addSchedule(jobKey); + } + + private static void addSchedule(JobKey jobKey) { + Map param = new HashMap(); + TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger(); + triggerBuilder.forJob(jobKey.getName(), jobKey.getGroup()).withIdentity(jobKey.getName(), jobKey.getGroup()).startNow(); + String cron = PropertiesUtils.getProperties("patrol").getProperty("cron"); + if (StringUtils.isBlank(cron)) { + FineLoggerFactory.getLogger().error("cron is null schedule start failed"); + return; + } + CronScheduleBuilder schedule = CronScheduleBuilder.cronSchedule(cron); + triggerBuilder.withSchedule(schedule); + try { + ScheduleJobManager.getInstance().addJob(jobKey.getName(), jobKey.getGroup(), "sync job", SyncThread.class, triggerBuilder.build(), param); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } +} diff --git a/门户同步/src/main/java/com/fr/plugin/patrol/sync/schedule/SyncThread.java b/门户同步/src/main/java/com/fr/plugin/patrol/sync/schedule/SyncThread.java new file mode 100644 index 0000000..af1badc --- /dev/null +++ b/门户同步/src/main/java/com/fr/plugin/patrol/sync/schedule/SyncThread.java @@ -0,0 +1,188 @@ +package com.fr.plugin.patrol.sync.schedule; + +import com.fr.base.TableData; +import com.fr.cluster.core.ClusterNode; +import com.fr.decision.authority.AuthorityContext; +import com.fr.decision.authority.data.CustomRole; +import com.fr.decision.authority.data.User; +import com.fr.decision.webservice.service.user.UserMiddleRoleService; +import com.fr.file.TableDataConfig; +import com.fr.general.PropertiesUtils; +import com.fr.general.data.DataModel; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.patrol.sync.HttpUtil; +import com.fr.scheduler.job.FineScheduleJob; +import com.fr.script.Calculator; +import com.fr.stable.query.QueryFactory; +import com.fr.third.v2.org.quartz.JobExecutionContext; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author fr.open + * @Date 2021/7/29 + * @Description + **/ +public class SyncThread extends FineScheduleJob { + + private DataModel dataModel; + + private String addRole; + + private String getUser; + + private String addUser; + + private String deleteUser; + + private String createId; + + private String findRole; + + private String editRole; + + + public SyncThread() { + String name = PropertiesUtils.getProperties("patrol").getProperty("name"); + FineLoggerFactory.getLogger().info("get table data config is {}", name); + + addRole = PropertiesUtils.getProperties("patrol").getProperty("addRole"); + FineLoggerFactory.getLogger().info("get addRole config is {}", addRole); + + getUser = PropertiesUtils.getProperties("patrol").getProperty("getUser"); + FineLoggerFactory.getLogger().info("get getUser config is {}", getUser); + + addUser = PropertiesUtils.getProperties("patrol").getProperty("addUser"); + FineLoggerFactory.getLogger().info("get addUser config is {}", addUser); + + deleteUser = PropertiesUtils.getProperties("patrol").getProperty("deleteUser"); + FineLoggerFactory.getLogger().info("get deleteUser config is {}", deleteUser); + + createId = PropertiesUtils.getProperties("patrol").getProperty("createId"); + FineLoggerFactory.getLogger().info("get createId config is {}", createId); + + findRole = PropertiesUtils.getProperties("patrol").getProperty("findRole"); + FineLoggerFactory.getLogger().info("get findRole config is {}", findRole); + + editRole = PropertiesUtils.getProperties("patrol").getProperty("editRole"); + FineLoggerFactory.getLogger().info("get editRole config is {}", editRole); + TableData tableData = TableDataConfig.getInstance().getTableData(name); + dataModel = tableData.createDataModel(Calculator.createCalculator()); + } + + @Override + public void run(JobExecutionContext jobExecutionContext, ClusterNode clusterNode) throws Exception { + List customRoles = AuthorityContext.getInstance().getCustomRoleController().find(QueryFactory.create()); + customRoles = customRoles.stream().filter(e -> !"superusers".equals(e.getName())).collect(Collectors.toList()); + FineLoggerFactory.getLogger().info("get role size is {}", customRoles); + Map roleMap = getRoleMap(); + for (CustomRole role : customRoles) { + String roleCode = role.getId().replace("-", ""); + if (roleMap.containsKey(roleCode)) { + //角色名称不同则更新角色名称 + if (!role.getName().equals(roleMap.get(roleCode))) { + editRole(roleCode, role.getName()); + } + } else { + //首先新建角色 + roleCode = addRole(role); + } + //系统下的角色用户 + Map users = getUsers(role.getId()); + //门户角色下用户 + Set roleUsers = getRoleUser(roleCode); + + Set delete = roleUsers.stream().filter(e -> !users.keySet().contains(e)).collect(Collectors.toSet()); + deleteRoleUser(roleCode, delete); + + Set add = users.keySet().stream().filter(e -> !delete.contains(e)).collect(Collectors.toSet()); + addRoleUser(roleCode, add); + + } + } + + private void editRole(String code, String name) { + String res = HttpUtil.sendPost(editRole, null, new JSONObject().put("roleId", code).put("roleName", name).put("createId", createId)); + FineLoggerFactory.getLogger().info("edit role res is {}", res); + } + + private Map getRoleMap() { + String res = HttpUtil.sendPost(findRole, null, new JSONObject().put("createId", createId)); + FineLoggerFactory.getLogger().info("get role res is {}", res); + JSONObject object = new JSONObject(res); + Map map = new HashMap<>(); + JSONArray date = object.getJSONArray("data"); + for (int i = 0; i < date.size(); i++) { + JSONObject entries = date.getJSONObject(i); + map.put(entries.getString("roleId"), entries.getString("roleName")); + } + return map; + } + + private void addRoleUser(String roleCode, Set add) { + if (add == null || add.isEmpty()) { + return; + } + Iterator it = add.iterator(); + while (it.hasNext()) { + String next = it.next(); + String res = HttpUtil.sendPost(addUser, null, new JSONObject().put("roleId", roleCode).put("authorizationUser", next).put("createId", createId)); + FineLoggerFactory.getLogger().info("delete role users res is {}", res); + } + } + + private void deleteRoleUser(String roleCode, Set delete) { + if (delete == null || delete.isEmpty()) { + return; + } + Iterator it = delete.iterator(); + while (it.hasNext()) { + String next = it.next(); + String res = HttpUtil.sendPost(deleteUser, null, new JSONObject().put("roleId", roleCode).put("authorizationUser", next).put("createId", createId)); + FineLoggerFactory.getLogger().info("delete role users res is {}", res); + } + } + + private Set getRoleUser(String roleCode) { + String res = HttpUtil.sendPost(getUser, null, new JSONObject().put("roleId", roleCode).put("createId", createId)); + FineLoggerFactory.getLogger().info("get role users res is {}", res); + JSONObject object = new JSONObject(res); + JSONArray date = object.getJSONObject("data").getJSONArray("userAuth"); + Set users = new HashSet<>(); + for (int i = 0; i < date.size(); i++) { + JSONObject entries = date.getJSONObject(i); + users.add(entries.getString("userCode")); + } + return users; + } + + private String addRole(CustomRole role) { + String code = role.getId().replaceAll("-", ""); + JSONObject object = new JSONObject().put("roleId", code).put("roleName", role.getName()).put("createId", createId); + String res = HttpUtil.sendPost(addRole, null, object); + FineLoggerFactory.getLogger().info("add role res is {}", res); + return code; + } + + + private Map getUsers(String roleId) throws Exception { + Set ids = UserMiddleRoleService.getInstance().getAllUserIdsByCustomRole(roleId); + List all = AuthorityContext.getInstance().getUserController().find(QueryFactory.create()); + Set usersMap = all.stream().filter(e -> ids.contains(e.getId())).map(e -> e.getUserName()).collect(Collectors.toSet()); + Map result = new HashMap<>(); + try { + for (int i = 0; i < dataModel.getRowCount(); i++) { + Object valueAt = dataModel.getValueAt(i, 4); + if (valueAt != null && usersMap.contains(valueAt.toString())) { + result.put(String.valueOf(dataModel.getValueAt(i, 7)), valueAt.toString()); + } + } + } catch (Exception e) { + + } + return result; + } +} diff --git a/门户同步/src/main/java/com/fr/plugin/patrol/sync/schedule/UserInfo.java b/门户同步/src/main/java/com/fr/plugin/patrol/sync/schedule/UserInfo.java new file mode 100644 index 0000000..fbb4fd0 --- /dev/null +++ b/门户同步/src/main/java/com/fr/plugin/patrol/sync/schedule/UserInfo.java @@ -0,0 +1,37 @@ +package com.fr.plugin.patrol.sync.schedule; + +/** + * @Author fr.open + * @Date 2021/7/29 + * @Description + **/ +public class UserInfo { + + private String name; + + private String id; + + public UserInfo() { + } + + public UserInfo(String name, String id) { + this.name = name; + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/门户同步/src/main/resources/patrol.properties b/门户同步/src/main/resources/patrol.properties new file mode 100644 index 0000000..a60b946 --- /dev/null +++ b/门户同步/src/main/resources/patrol.properties @@ -0,0 +1,18 @@ +##定时器参数,此配置为默认每小时执行一次 +cron=0 0/1 * * * ? * +##增加角色 +addRole=http://ip:port/api/FndRole/add +##获取角色下用户 +getUser=http://ip:port/api/FndRole/getUserList +##向角色添加用户 +addUser=http://ip:port/api/FndRole/addUser +##向角色删除角色 +deleteUser=http://ip:port/api/FndRole/deleteUser +##更新角色 +editRole=http://ip:port/api/FndRole/roleModify +##获取角色 +findRole=http://ip:port/api/FndRole/getRoleList +##授权系统 +createId=001xxx +##数据集名称 +name=xxxx \ No newline at end of file diff --git a/门户应用授权接口文档v1.2.docx b/门户应用授权接口文档v1.2.docx new file mode 100644 index 0000000000000000000000000000000000000000..78abf1043d51620361a25a1433b294843a92ae4c GIT binary patch literal 43850 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 z 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