diff --git a/JSD-8708-需求确认书V1.docx b/JSD-8708-需求确认书V1.docx new file mode 100644 index 0000000..1f6e64e Binary files /dev/null and b/JSD-8708-需求确认书V1.docx differ diff --git a/README.md b/README.md index 64c1a17..57f7b4f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ # open-JSD-8708 -JSD-8708 开源任务材料 \ No newline at end of file +JSD-8708 OA/企业微信 (定时)角色反向同步 开源任务材料\ +免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ +仅作为开发者学习参考使用!禁止用于任何商业用途!\ +为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 \ No newline at end of file diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..3a62394 --- /dev/null +++ b/plugin.xml @@ -0,0 +1,16 @@ + + + com.fr.plugin.patrol.sync + + yes + 1.5 + 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..977e5c1 --- /dev/null +++ b/src/main/java/com/fr/plugin/patrol/sync/PluginConstants.java @@ -0,0 +1,18 @@ +package com.fr.plugin.patrol.sync; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * @Author fr.open + * @Date 2021/3/1 + * @Description + **/ +public class PluginConstants { + + public static final String PLUGIN_ID = "com.fr.plugin.patrol.sync"; + + public static Set NAMES = new HashSet(Arrays.asList(new String[]{"安监日报","营销BI-xxxx","营销BI-xxx","营销BI-xx"})); + +} 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..7136ddf --- /dev/null +++ b/src/main/java/com/fr/plugin/patrol/sync/SyncFilter.java @@ -0,0 +1,76 @@ +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.record.analyzer.EnableMetrics; +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) +@EnableMetrics +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..6ce3474 --- /dev/null +++ b/src/main/java/com/fr/plugin/patrol/sync/schedule/SyncThread.java @@ -0,0 +1,243 @@ +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.plugin.patrol.sync.PluginConstants; +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.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.size()); + Map roleMap = getRoleMap(); + if(roleMap.isEmpty() || roleMap.size() < 4){ + FineLoggerFactory.getLogger().error("default tag is not exist,map is {}",roleMap); + return; + } + Map> remoteMap = new HashMap<>(); + Map> existMap = new HashMap<>(); + for(CustomRole role : customRoles) { + String roleName = getTagName(role.getName()); + if (StringUtils.isBlank(roleName)) { + FineLoggerFactory.getLogger().info("role {} get Mapping failed"); + continue; + } + String roleCode = roleMap.get(roleName); + //系统下的角色用户 + Map users = getUsers(role.getId()); + //门户角色下用户 + Set roleUsers = getRoleUser(roleCode); + remoteMap.put(roleCode,roleUsers); + Set ids = existMap.get(roleCode); + if(ids == null){ + ids = new HashSet<>(); + } + ids.addAll(users.keySet()); + existMap.put(roleCode,ids); + + Set add = users.keySet().stream().filter(e -> !roleUsers.contains(e)).collect(Collectors.toSet()); + addRoleUser(roleCode, add); + + } + + remoteMap.forEach((k,v)->{ + Set ids = existMap.get(k); + Set delete = v.stream().filter(e -> !ids.contains(e)).collect(Collectors.toSet()); + FineLoggerFactory.getLogger().info("remote users is {} exist users is {}",v,ids); + FineLoggerFactory.getLogger().info("delete users {} to tag:{}",delete,k); + deleteRoleUser(k, delete); + }); + /*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 String getTagName(String name) { + Iterator iterator = PluginConstants.NAMES.iterator(); + while (iterator.hasNext()){ + String key = iterator.next(); + if(key.equals("安监日报") && name.startsWith("安监-")){ + return key; + } + if(name.startsWith(key)){ + return key; + } + } + return StringUtils.EMPTY; + } + + 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); + if(PluginConstants.NAMES.contains(entries.getString("roleName"))){ + map.put(entries.getString("roleName"),entries.getString("roleId")); + } + } + 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("add 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..54508c9 --- /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=xxxx +##数据集名称 +name=xxxx \ No newline at end of file