13 changed files with 1048 additions and 1 deletions
@ -1,3 +1,6 @@
|
||||
# open-JSD-9326 |
||||
|
||||
JSD-9326 分页REST用户数据集 |
||||
JSD-9326 分页REST用户数据集\ |
||||
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 |
Binary file not shown.
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
<plugin> |
||||
<id>com.fr.plugin.third.party.jsdjdcg</id> |
||||
<name><![CDATA[用户信息数据集]]></name> |
||||
<active>yes</active> |
||||
<version>0.1</version> |
||||
<env-version>10.0</env-version> |
||||
<jartime>2019-01-01</jartime> |
||||
<vendor>fr.open</vendor> |
||||
<description><![CDATA[]]></description> |
||||
<change-notes><![CDATA[]]></change-notes> |
||||
<extra-decision> |
||||
<UniversalServerTableDataProvider class="com.fr.plugin.third.party.jsdjdcg.data.CustomUniversalServerTableDataProvider"/> |
||||
</extra-decision> |
||||
<extra-designer> |
||||
<ServerTableDataDefineProvider class="com.fr.plugin.third.party.jsdjdcg.data.CustomHttpTableDataDefine"/> |
||||
<TableDataDefineProvider class="com.fr.plugin.third.party.jsdjdcg.data.CustomHttpTableDataDefine"/> |
||||
</extra-designer> |
||||
<function-recorder class="com.fr.plugin.third.party.jsdjdcg.config.DataConfigInitializeMonitor"/> |
||||
<lifecycle-monitor class="com.fr.plugin.third.party.jsdjdcg.config.DataConfigInitializeMonitor"/> |
||||
</plugin> |
@ -0,0 +1,188 @@
|
||||
package com.fr.plugin.third.party.jsdjdcg; |
||||
|
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fanruan.api.util.StringKit; |
||||
import com.fr.third.org.apache.http.HttpEntity; |
||||
import com.fr.third.org.apache.http.HttpStatus; |
||||
import com.fr.third.org.apache.http.client.config.RequestConfig; |
||||
import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; |
||||
import com.fr.third.org.apache.http.client.methods.HttpGet; |
||||
import com.fr.third.org.apache.http.client.methods.HttpPost; |
||||
import com.fr.third.org.apache.http.conn.ssl.NoopHostnameVerifier; |
||||
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.CloseableHttpClient; |
||||
import com.fr.third.org.apache.http.impl.client.HttpClients; |
||||
import com.fr.third.org.apache.http.ssl.SSLContextBuilder; |
||||
import com.fr.third.org.apache.http.ssl.TrustStrategy; |
||||
import com.fr.third.org.apache.http.util.EntityUtils; |
||||
|
||||
import javax.net.ssl.HostnameVerifier; |
||||
import javax.net.ssl.SSLContext; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.IOException; |
||||
import java.security.cert.CertificateException; |
||||
import java.security.cert.X509Certificate; |
||||
import java.util.UUID; |
||||
|
||||
public class Utils { |
||||
public static String DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"; |
||||
public static RequestConfig REQUEST_CONFIG = RequestConfig.custom() |
||||
.setConnectionRequestTimeout(30000) |
||||
.setSocketTimeout(30000) // 服务端相应超时
|
||||
.setConnectTimeout(30000) // 建立socket链接超时时间
|
||||
.build(); |
||||
|
||||
public static CloseableHttpClient createSSLClientDefault() { |
||||
try { |
||||
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { |
||||
|
||||
@Override |
||||
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { |
||||
return true; |
||||
} |
||||
}).build(); |
||||
HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE; |
||||
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); |
||||
return HttpClients.custom().setSSLSocketFactory(sslsf).build(); |
||||
} catch (Exception e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
} |
||||
return HttpClients.createDefault(); |
||||
} |
||||
|
||||
public static synchronized CloseableHttpClient createHttpClient(String url) { |
||||
CloseableHttpClient httpClient = null; |
||||
if (StringKit.isEmpty(url)) { |
||||
httpClient = HttpClients.createDefault(); |
||||
return httpClient; |
||||
} |
||||
|
||||
if (url.startsWith("https://")) { |
||||
httpClient = createSSLClientDefault(); |
||||
return httpClient; |
||||
} |
||||
httpClient = HttpClients.createDefault(); |
||||
return httpClient; |
||||
} |
||||
|
||||
public static synchronized String createHttpGetContent(CloseableHttpClient httpClient, String url, String basicAuth) throws IOException { |
||||
if ((httpClient == null) || (StringKit.isEmpty(url))) { |
||||
return ""; |
||||
} |
||||
|
||||
HttpGet httpGet = new HttpGet(url); |
||||
httpGet.addHeader("User-Agent", Utils.DEFAULT_USER_AGENT); |
||||
if (StringKit.isNotEmpty(basicAuth)) { |
||||
httpGet.addHeader("Authorization", basicAuth); |
||||
} |
||||
|
||||
httpGet.setConfig(Utils.REQUEST_CONFIG); |
||||
CloseableHttpResponse response = httpClient.execute(httpGet); |
||||
int statusCode = response.getStatusLine().getStatusCode(); |
||||
if (statusCode != HttpStatus.SC_OK) { |
||||
response.close(); |
||||
LogKit.info("http请求出错,http status:" + statusCode); |
||||
return ""; |
||||
} |
||||
|
||||
HttpEntity httpEntity = response.getEntity(); |
||||
if (httpEntity == null) { |
||||
response.close(); |
||||
LogKit.info("http请求出错,http响应内容为空"); |
||||
return ""; |
||||
} |
||||
String responseContent = EntityUtils.toString(httpEntity, "UTF-8"); |
||||
response.close(); |
||||
if (StringKit.isEmpty(responseContent)) { |
||||
LogKit.info("http请求出错,http响应内容为空1"); |
||||
return ""; |
||||
} |
||||
return responseContent; |
||||
} |
||||
|
||||
public static synchronized String createHttpPostContent(CloseableHttpClient httpClient, String url, String bodyContent, String basicAuth,String contentType) throws IOException { |
||||
if ((httpClient == null) || (StringKit.isEmpty(url))) { |
||||
return ""; |
||||
} |
||||
|
||||
HttpPost httpPost = new HttpPost(url); |
||||
httpPost.addHeader("User-Agent", Utils.DEFAULT_USER_AGENT); |
||||
httpPost.setConfig(Utils.REQUEST_CONFIG); |
||||
if (StringKit.isNotEmpty(basicAuth)) { |
||||
httpPost.addHeader("Authorization", basicAuth); |
||||
} |
||||
if (StringKit.isNotEmpty(contentType)) { |
||||
httpPost.addHeader("Content-Type", contentType); |
||||
} |
||||
StringEntity bodyEntity = new StringEntity(bodyContent, "UTF-8"); |
||||
httpPost.setEntity(bodyEntity); |
||||
CloseableHttpResponse response = httpClient.execute(httpPost); |
||||
int statusCode = response.getStatusLine().getStatusCode(); |
||||
if (statusCode != HttpStatus.SC_OK) { |
||||
response.close(); |
||||
LogKit.info("http请求出错,http status:" + statusCode); |
||||
return ""; |
||||
} |
||||
|
||||
HttpEntity httpEntity = response.getEntity(); |
||||
if (httpEntity == null) { |
||||
response.close(); |
||||
LogKit.info("http请求出错,http响应内容为空"); |
||||
return ""; |
||||
} |
||||
String responseContent = EntityUtils.toString(httpEntity, "UTF-8"); |
||||
response.close(); |
||||
if (StringKit.isEmpty(responseContent)) { |
||||
LogKit.info("http请求出错,http响应内容为空1"); |
||||
return ""; |
||||
} |
||||
return responseContent; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 获取完整请求链接 |
||||
* |
||||
* @param req 请求 |
||||
* @return |
||||
*/ |
||||
public static String getFullRequestUrl(HttpServletRequest req) { |
||||
if (req == null) { |
||||
return ""; |
||||
} |
||||
String url = req.getRequestURL().toString(); |
||||
String queryUrl = req.getQueryString(); |
||||
if ((queryUrl == null) || "null".equalsIgnoreCase(queryUrl)) { |
||||
queryUrl = ""; |
||||
} else { |
||||
queryUrl = "?" + queryUrl; |
||||
} |
||||
String fullUrl = url + queryUrl; |
||||
return fullUrl; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 重定向 |
||||
* |
||||
* @param res |
||||
* @param url |
||||
*/ |
||||
public static void sendRedirect(HttpServletResponse res, String url) { |
||||
if ((res == null) || (StringKit.isEmpty(url))) { |
||||
return; |
||||
} |
||||
res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); |
||||
res.setHeader("Location", url); |
||||
} |
||||
|
||||
|
||||
public static synchronized String getUuid() { |
||||
String uuid = UUID.randomUUID().toString().replace("-", ""); |
||||
return uuid; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,66 @@
|
||||
package com.fr.plugin.third.party.jsdjdcg.config; |
||||
|
||||
import com.fr.config.*; |
||||
import com.fr.config.holder.Conf; |
||||
import com.fr.config.holder.factory.Holders; |
||||
|
||||
/** |
||||
* 配置数据保存 |
||||
*/ |
||||
@Visualization(category = "用户信息数据集配置") |
||||
public class CustomDataConfig extends DefaultConfiguration { |
||||
public String getNameSpace() { |
||||
return this.getClass().getName(); |
||||
} |
||||
|
||||
private static volatile CustomDataConfig config = null; |
||||
|
||||
public static CustomDataConfig getInstance() { |
||||
if (config == null) { |
||||
config = ConfigContext.getConfigInstance(CustomDataConfig.class); |
||||
} |
||||
return config; |
||||
} |
||||
|
||||
@Identifier(value = "dataSyncUrl", name = "数据地址", description = "", status = Status.SHOW) |
||||
private Conf<String> dataSyncUrl = Holders.simple(""); |
||||
|
||||
@Identifier(value = "dataUsername", name = "数据用户名", description = "", status = Status.HIDE) |
||||
private Conf<String> dataUsername = Holders.simple(""); |
||||
|
||||
@Identifier(value = "dataPassword", name = "数据密码", description = "", status = Status.HIDE) |
||||
private Conf<String> dataPassword = Holders.simple(""); |
||||
|
||||
public String getDataSyncUrl() { |
||||
return dataSyncUrl.get(); |
||||
} |
||||
|
||||
public void setDataSyncUrl(String dataSyncUrl) { |
||||
this.dataSyncUrl.set(dataSyncUrl); |
||||
} |
||||
|
||||
public String getDataUsername() { |
||||
return dataUsername.get(); |
||||
} |
||||
|
||||
public void setDataUsername(String dataUsername) { |
||||
this.dataUsername.set(dataUsername); |
||||
} |
||||
|
||||
public String getDataPassword() { |
||||
return dataPassword.get(); |
||||
} |
||||
|
||||
public void setDataPassword(String dataPassword) { |
||||
this.dataPassword.set(dataPassword); |
||||
} |
||||
|
||||
@Override |
||||
public Object clone() throws CloneNotSupportedException { |
||||
CustomDataConfig cloned = (CustomDataConfig) super.clone(); |
||||
cloned.dataSyncUrl = (Conf<String>) dataSyncUrl.clone(); |
||||
cloned.dataUsername = (Conf<String>) dataUsername.clone(); |
||||
cloned.dataPassword = (Conf<String>) dataPassword.clone(); |
||||
return cloned; |
||||
} |
||||
} |
@ -0,0 +1,26 @@
|
||||
package com.fr.plugin.third.party.jsdjdcg.config; |
||||
|
||||
import com.fr.intelli.record.Focus; |
||||
import com.fr.intelli.record.Original; |
||||
import com.fr.plugin.context.PluginContext; |
||||
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||
import com.fr.record.analyzer.EnableMetrics; |
||||
import com.fr.stable.fun.Authorize; |
||||
|
||||
/** |
||||
* 配置信息初始化 |
||||
*/ |
||||
@EnableMetrics |
||||
@Authorize(callSignKey = "com.fr.plugin.third.party.jsdjdcg") |
||||
public class DataConfigInitializeMonitor extends AbstractPluginLifecycleMonitor { |
||||
@Override |
||||
@Focus(id = "com.fr.plugin.third.party.jsdjdcg", text = "plugin-jsdjdcg", source = Original.PLUGIN) |
||||
public void afterRun(PluginContext pluginContext) { |
||||
CustomDataConfig.getInstance(); |
||||
} |
||||
|
||||
@Override |
||||
public void beforeStop(PluginContext pluginContext) { |
||||
|
||||
} |
||||
} |
@ -0,0 +1,196 @@
|
||||
package com.fr.plugin.third.party.jsdjdcg.data; |
||||
|
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fanruan.api.util.StringKit; |
||||
import com.fr.base.TableData; |
||||
import com.fr.data.AbstractDataModel; |
||||
import com.fr.general.data.TableDataException; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.context.PluginContexts; |
||||
import com.fr.plugin.third.party.jsdjdcg.Utils; |
||||
import com.fr.plugin.third.party.jsdjdcg.config.CustomDataConfig; |
||||
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; |
||||
import com.fr.utils.Base64; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
public class CustomHttpDataModel extends AbstractDataModel { |
||||
private static String[] COLUMN_NAMES = {"loginName", "userName", "userPwd", "orgId", "orgName", "parentId", "userJob"}; |
||||
private int rowCount = TableData.RESULT_ALL; |
||||
private DatasetData datas = new DatasetData(); |
||||
|
||||
public CustomHttpDataModel(int count) { |
||||
this.rowCount = count; |
||||
if (this.rowCount == 0) { |
||||
return; |
||||
} |
||||
queryData(); |
||||
} |
||||
|
||||
@Override |
||||
public int getColumnCount() throws TableDataException { |
||||
return COLUMN_NAMES.length; |
||||
} |
||||
|
||||
@Override |
||||
public String getColumnName(int i) throws TableDataException { |
||||
return COLUMN_NAMES[i]; |
||||
} |
||||
|
||||
@Override |
||||
public boolean hasRow(int rowIndex) throws TableDataException { |
||||
int count = getRowCount(); |
||||
return rowIndex < count; |
||||
} |
||||
|
||||
@Override |
||||
public int getRowCount() throws TableDataException { |
||||
if (this.datas == null) { |
||||
return 0; |
||||
} |
||||
List<List<Object>> values = this.datas.getValues(); |
||||
if (values == null) { |
||||
return 0; |
||||
} |
||||
int count = values.size(); |
||||
return count; |
||||
} |
||||
|
||||
@Override |
||||
public Object getValueAt(int rowIndex, int columnIndex) throws TableDataException { |
||||
if (this.datas == null) { |
||||
return ""; |
||||
} |
||||
List<List<Object>> values = this.datas.getValues(); |
||||
if ((values == null) || (values.size() <= rowIndex)) { |
||||
return ""; |
||||
} |
||||
List<Object> rowValues = values.get(rowIndex); |
||||
if ((rowValues == null) || (rowValues.size() <= columnIndex)) { |
||||
return ""; |
||||
} |
||||
return rowValues.get(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public void release() throws Exception { |
||||
this.datas = null; |
||||
} |
||||
|
||||
/** |
||||
* 查询数据 |
||||
*/ |
||||
private void queryData() { |
||||
try { |
||||
createDatas(); |
||||
} catch (Exception e) { |
||||
LogKit.error("用户信息数据集获取信息,请求出错," + e.getMessage() + "," + e.getCause(), e); |
||||
} |
||||
} |
||||
|
||||
private void createDatas() throws Exception { |
||||
String userSyncUrl = CustomDataConfig.getInstance().getDataSyncUrl(); |
||||
//String userSyncUsername = CustomDataConfig.getInstance().getDataUsername();
|
||||
///String userSyncPassword = CustomDataConfig.getInstance().getDataPassword();
|
||||
if (StringKit.isEmpty(userSyncUrl)) { |
||||
return; |
||||
} |
||||
|
||||
CloseableHttpClient httpClient = Utils.createHttpClient(userSyncUrl); |
||||
//String authValue = userSyncUsername + ":" + userSyncPassword;
|
||||
//String auth = "Basic " + Base64.getEncoder().encodeToString(authValue.getBytes("utf-8"));
|
||||
String content = ""; |
||||
LogKit.info("用户信息数据集,请求数据.."); |
||||
|
||||
//添加认证
|
||||
if (!PluginContexts.currentContext().isAvailable()) { |
||||
LogKit.error("用户信息数据集插件试用过期, 请购买许可证"); |
||||
return; |
||||
} |
||||
|
||||
String bodyContent = "{\n" + |
||||
" \"pageIndex\":\"0\",\n" + |
||||
" \"pageSize\":\"2000\"\n" + |
||||
"}"; |
||||
|
||||
int count = 0, count1 = 0; |
||||
int index = 0; |
||||
do { |
||||
bodyContent = getBodyContent(index); |
||||
content = Utils.createHttpPostContent(httpClient, userSyncUrl, bodyContent, "", "application/json"); |
||||
if (StringKit.isEmpty(content)) { |
||||
break; |
||||
} |
||||
LogKit.info("用户信息数据集" + index + ",json内容:\n" + content); |
||||
index++; |
||||
count = this.getRowCount(); |
||||
addDatas(content); |
||||
count1 = this.getRowCount(); |
||||
} |
||||
while (count1 > count); |
||||
httpClient.close(); |
||||
} |
||||
|
||||
private String getBodyContent(int index) { |
||||
String bodyContent = "{\n" + |
||||
" \"pageIndex\":\"" + index + "\",\n" + |
||||
" \"pageSize\":\"2000\"\n" + |
||||
"}"; |
||||
return bodyContent; |
||||
} |
||||
|
||||
private void addDatas(String content) throws TableDataException { |
||||
if (StringKit.isEmpty(content)) { |
||||
return; |
||||
} |
||||
JSONObject resJson = new JSONObject(content); |
||||
String status = resJson.getString("status"); |
||||
if (!StringKit.equals("000000", status)) { |
||||
return; |
||||
} |
||||
|
||||
JSONObject resultJson = resJson.getJSONObject("result"); |
||||
if (resultJson == null) { |
||||
return; |
||||
} |
||||
|
||||
JSONArray dataJsons = resultJson.getJSONArray("data"); |
||||
if ((dataJsons == null) || (dataJsons.size() <= 0)) { |
||||
return; |
||||
} |
||||
String loginName = "", userName = "", userPwd = "", orgId = "", orgName = "", parentId = "", userJob = ""; |
||||
JSONObject dataJson; |
||||
int tempCount = 0; |
||||
for (int i = 0, max = dataJsons.size() - 1; i <= max; i++) { |
||||
if ((this.rowCount >= 1) && (tempCount >= this.rowCount)) { |
||||
return; |
||||
} |
||||
dataJson = dataJsons.getJSONObject(i); |
||||
loginName = dataJson.getString("loginName", ""); |
||||
userName = dataJson.getString("userName", ""); |
||||
userPwd = dataJson.getString("userPwd", ""); |
||||
orgId = dataJson.getString("orgId", ""); |
||||
orgName = dataJson.getString("orgName", ""); |
||||
parentId = dataJson.getString("parentId", ""); |
||||
userJob = dataJson.getString("userJob", ""); |
||||
addRowDatas(loginName, userName, userPwd, orgId, orgName, parentId, userJob); |
||||
tempCount++; |
||||
} |
||||
} |
||||
|
||||
//"loginName", "userName", "userPwd", "orgId", "orgName", "parentId", "userJob"
|
||||
private void addRowDatas(String loginName, String userName, String userPwd, String orgId, String orgName, String parentId, String userJob) { |
||||
List<Object> rowDatas = new ArrayList<>(); |
||||
rowDatas.add(loginName); |
||||
rowDatas.add(userName); |
||||
rowDatas.add(userPwd); |
||||
rowDatas.add(orgId); |
||||
rowDatas.add(orgName); |
||||
rowDatas.add(parentId); |
||||
rowDatas.add(userJob); |
||||
List<List<Object>> values = this.datas.getValues(); |
||||
values.add(rowDatas); |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.fr.plugin.third.party.jsdjdcg.data; |
||||
|
||||
import com.fr.base.TableData; |
||||
import com.fr.data.AbstractParameterTableData; |
||||
import com.fr.general.data.DataModel; |
||||
import com.fr.script.Calculator; |
||||
|
||||
public class CustomHttpTableData extends AbstractParameterTableData { |
||||
@Override |
||||
public DataModel createDataModel(Calculator calculator) { |
||||
return createDataModel(calculator, TableData.RESULT_ALL); |
||||
} |
||||
|
||||
@Override |
||||
public DataModel createDataModel(Calculator calculator, int rowCount) { |
||||
return new CustomHttpDataModel(rowCount); |
||||
} |
||||
} |
@ -0,0 +1,50 @@
|
||||
package com.fr.plugin.third.party.jsdjdcg.data; |
||||
|
||||
|
||||
import com.fr.base.TableData; |
||||
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; |
||||
import com.fr.design.fun.ServerTableDataDefineProvider; |
||||
import com.fr.design.fun.impl.AbstractTableDataDefineProvider; |
||||
import com.fr.design.i18n.Toolkit; |
||||
|
||||
|
||||
public class CustomHttpTableDataDefine extends AbstractTableDataDefineProvider implements ServerTableDataDefineProvider { |
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
@Override |
||||
public Class<? extends TableData> classForTableData() { |
||||
return CustomHttpTableData.class; |
||||
} |
||||
|
||||
@Override |
||||
public Class<? extends TableData> classForInitTableData() { |
||||
return CustomHttpTableData.class; |
||||
} |
||||
|
||||
@Override |
||||
public Class<? extends AbstractTableDataPane> appearanceForTableData() { |
||||
|
||||
return CustomHttpTableDataPane.class; |
||||
} |
||||
|
||||
@Override |
||||
public String nameForTableData() { |
||||
return Toolkit.i18nText("用户信息数据集"); |
||||
} |
||||
|
||||
@Override |
||||
public String prefixForTableData() { |
||||
return "user_data"; |
||||
} |
||||
|
||||
@Override |
||||
public String iconPathForTableData() { |
||||
return ""; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,76 @@
|
||||
package com.fr.plugin.third.party.jsdjdcg.data; |
||||
|
||||
import com.fanruan.api.design.DesignKit; |
||||
import com.fanruan.api.design.ui.component.UIButton; |
||||
import com.fr.design.data.datapane.preview.PreviewTablePane; |
||||
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; |
||||
import com.fr.general.IOUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
|
||||
|
||||
public class CustomHttpTableDataPane extends AbstractTableDataPane<CustomHttpTableData> { |
||||
public CustomHttpTableDataPane() { |
||||
super(); |
||||
createContent(); |
||||
} |
||||
|
||||
|
||||
|
||||
@Override |
||||
public void populateBean(CustomHttpTableData ob) { |
||||
if (ob == null) { |
||||
return; |
||||
} |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public CustomHttpTableData updateBean() { |
||||
CustomHttpTableData tableData = new CustomHttpTableData(); |
||||
return tableData; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return DesignKit.i18nText("用户信息数据集"); |
||||
} |
||||
|
||||
|
||||
private void createContent() { |
||||
setLayout(new BorderLayout()); |
||||
JPanel contentPane = new JPanel(); |
||||
contentPane.setLayout(new BorderLayout()); |
||||
add(contentPane, BorderLayout.CENTER); |
||||
|
||||
|
||||
JPanel connectionPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5)); |
||||
|
||||
UIButton previewButton = createIconButton("Fine-Design_Basic_Preview", "/com/fr/design/images/m_file/preview.png"); |
||||
previewButton.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
PreviewTablePane.previewTableData(updateBean()); |
||||
} |
||||
}); |
||||
connectionPanel.add(previewButton); |
||||
contentPane.add(connectionPanel, BorderLayout.NORTH); |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 获取图标按钮 |
||||
* |
||||
* @param toolTip 提示信息,国际化key |
||||
* @param iconPath 图标路径 |
||||
* @return |
||||
*/ |
||||
public static UIButton createIconButton(String toolTip, String iconPath) { |
||||
UIButton iconButton = new UIButton(IOUtils.readIcon(iconPath)); |
||||
iconButton.setToolTipText(DesignKit.i18nText(toolTip)); |
||||
return iconButton; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,44 @@
|
||||
package com.fr.plugin.third.party.jsdjdcg.data; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractUniversalServerTableDataProvider; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.web.struct.Atom; |
||||
import com.fr.web.struct.Component; |
||||
import com.fr.web.struct.browser.RequestClient; |
||||
import com.fr.web.struct.category.ParserType; |
||||
import com.fr.web.struct.category.ScriptPath; |
||||
|
||||
public class CustomUniversalServerTableDataProvider extends AbstractUniversalServerTableDataProvider<CustomHttpTableData> { |
||||
@Override |
||||
public Class classForTableData() { |
||||
return CustomHttpTableData.class; |
||||
} |
||||
|
||||
@Override |
||||
public String nameForTableData() { |
||||
return "custom_user_data"; |
||||
} |
||||
|
||||
@Override |
||||
public JSONObject serialize(CustomHttpTableData data) { |
||||
//bean.setParameters(parameterBeans);
|
||||
//return JSONObject.mapFrom(bean);
|
||||
return new JSONObject(); |
||||
} |
||||
|
||||
@Override |
||||
public CustomHttpTableData deserialize(CustomHttpTableData data, JSONObject config ) { |
||||
CustomHttpTableData dataSet = new CustomHttpTableData(); |
||||
return dataSet; |
||||
} |
||||
|
||||
@Override |
||||
public Atom client() { |
||||
return new Component(){ |
||||
@Override |
||||
public ScriptPath script(RequestClient client ) { |
||||
return ScriptPath.build("com/fr/plugin/third/party/jsdjdcg/web/tabledata.js", ParserType.DYNAMIC); |
||||
} |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,67 @@
|
||||
package com.fr.plugin.third.party.jsdjdcg.data; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 数据集数据 |
||||
*/ |
||||
public class DatasetData { |
||||
private String name; |
||||
private List<String> columns; |
||||
private List<List<Object>> values; |
||||
|
||||
public DatasetData() { |
||||
columns = new ArrayList<String>(); |
||||
values = new ArrayList<List<Object>>(); |
||||
} |
||||
|
||||
/** |
||||
* 获取表名 |
||||
* @return 表名 |
||||
*/ |
||||
public String getName() { |
||||
return this.name; |
||||
} |
||||
|
||||
/** |
||||
* 设置表名 |
||||
* @param name 表名 |
||||
*/ |
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
/** |
||||
* 获取列名 |
||||
* @return 列名 |
||||
*/ |
||||
public List<String> getColumns() { |
||||
return this.columns; |
||||
} |
||||
|
||||
/** |
||||
* 设置列名 |
||||
* @param columns 列名 |
||||
*/ |
||||
public void setColumns(List<String> columns) { |
||||
this.columns = columns; |
||||
} |
||||
|
||||
/** |
||||
* 获取表数据 |
||||
* @return 表数据 |
||||
*/ |
||||
public List<List<Object>> getValues() { |
||||
return this.values; |
||||
} |
||||
|
||||
/** |
||||
* 设置表数据 |
||||
* @param values |
||||
*/ |
||||
public void setValues(List<List<Object>> values) { |
||||
this.values = values; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,292 @@
|
||||
!(function () { |
||||
var Model = BI.inherit(Fix.Model, { |
||||
_init: function () { |
||||
this.service = BI.Services.getService("dec.service.data.set"); |
||||
}, |
||||
context: ["dataSetName", "ableSave"], |
||||
state: function () { |
||||
var val = this.options.value.datasetData || {}; |
||||
return { |
||||
config: val.config || "", |
||||
parameters: val.parameters || [] |
||||
}; |
||||
}, |
||||
childContext: ["previewAble", "previewedDataSet"], |
||||
watch: { |
||||
previewAble: function (v) { |
||||
this.setAbleSave(v); |
||||
} |
||||
}, |
||||
computed: { |
||||
paramHeader: function () { |
||||
//定义参数列表表头
|
||||
var map = BI.map(BI.Constants.getConstant("dec.constants.data.set.sql.header"), function (i, v) { |
||||
return BI.extend({ |
||||
textAlign: "left", |
||||
height: 30, |
||||
hgap: 10 |
||||
}, v); |
||||
}); |
||||
map.push({ |
||||
textAlign: "left", |
||||
height: 30, |
||||
hgap: 10, |
||||
text: "" |
||||
}); |
||||
return [map]; |
||||
}, |
||||
paramItems: function () { |
||||
var self = this; |
||||
return BI.map(this.model.parameters, function (i, param) { |
||||
return [{ |
||||
type: "bi.text_editor", |
||||
value: param.name, |
||||
textAlign: "left", |
||||
height: 30, |
||||
lgap: 10, |
||||
listeners: [{ |
||||
eventName: BI.TextEditor.EVENT_CHANGE, |
||||
action: function () { |
||||
self.setParamName(i, this.getValue()); |
||||
} |
||||
}] |
||||
}, { |
||||
type: "bi.icon_text_value_combo", |
||||
cls: "field-type-change", |
||||
height: 30, |
||||
items: BI.Constants.getConstant("dec.constants.data.set.sql.field"), |
||||
value: param.type, |
||||
listeners: [{ |
||||
eventName: BI.IconTextValueCombo.EVENT_CHANGE, |
||||
action: function () { |
||||
self.setParamType(i, this.getValue()[0]); |
||||
} |
||||
}] |
||||
}, self.service.createParameterValueItem(param, function (val) { |
||||
self.setParamValue(i, val); |
||||
}), { |
||||
type: "bi.icon_button", |
||||
cls: "default-delete-font", |
||||
height: 30, |
||||
lgap: 10, |
||||
title: BI.i18nText("Dec-Basic_Delete"), |
||||
handler: function () { |
||||
self.deleteParameter(i); |
||||
} |
||||
}]; |
||||
}); |
||||
}, |
||||
previewAble: function () { |
||||
return true; |
||||
}, |
||||
previewedDataSet: function () { |
||||
return { |
||||
datasetType: DecCst.DataSet.Type.CUSTOM_USER_DATA, |
||||
datasetName: this.model.dataSetName, |
||||
datasetData: { |
||||
parameters:[] |
||||
} |
||||
}; |
||||
} |
||||
}, |
||||
actions: { |
||||
initPage: function (cb) { |
||||
var self = this; |
||||
cb(); |
||||
}, |
||||
setConfig: function (v) { |
||||
this.model.config = v; |
||||
}, |
||||
refreshParam: function () { |
||||
var self = this; |
||||
Dec.Utils.getDataSetParameters(this.model.previewedDataSet, function (res) { |
||||
self.model.parameters = self.service.getParameters(res.data, self.model.parameters); |
||||
}); |
||||
}, |
||||
addParamter: function (v) { |
||||
this.model.parameters.push(v); |
||||
}, |
||||
deleteParameter: function (index) { |
||||
this.model.parameters.splice(index, 1); |
||||
}, |
||||
setParamName: function (index, name) { |
||||
this.model.parameters[index].name = name; |
||||
}, |
||||
setParamType: function (index, type) { |
||||
if (this.model.parameters[index].type !== type) { |
||||
this.model.parameters[index].type = type; |
||||
this.model.parameters[index].value = this.service.getDefaultValueByType(type); |
||||
this.model.parameters.splice(0, 0); |
||||
} |
||||
}, |
||||
setParamValue: function (index, val) { |
||||
this.model.parameters[index].value = val; |
||||
}, |
||||
setAbleSave: function (v) { |
||||
this.model.ableSave = v; |
||||
} |
||||
} |
||||
}); |
||||
BI.model("dec.model.data.set.type.demo.data", Model); |
||||
|
||||
|
||||
var DemoData = BI.inherit(BI.Widget, { |
||||
props: { |
||||
baseCls: "dec-data-set-sql", |
||||
$testId: "dec-data-set-sql", |
||||
value: { |
||||
datasetData: {} |
||||
} |
||||
}, |
||||
_store: function () { |
||||
return BI.Models.getModel("dec.model.data.set.type.demo.data", this.options); |
||||
}, |
||||
watch: { |
||||
config: function (v) { |
||||
this.configEditor.setValue(v); |
||||
}, |
||||
"config || parameters.**": function () { |
||||
this.previewPane.resetPreview(); |
||||
}, |
||||
parameters: function () { |
||||
this.paramSettingPane.populate(this.model.paramItems, this.model.paramHeader); |
||||
} |
||||
}, |
||||
beforeInit: function (cb) { |
||||
this.store.initPage(cb); |
||||
}, |
||||
mounted: function () { |
||||
// 在render方法里的子组件被渲染到页面之后的钩子函数
|
||||
this.previewPane.resetPreview(); |
||||
this.store.setAbleSave(true); |
||||
}, |
||||
render: function () { |
||||
var self = this; |
||||
return { |
||||
type: "bi.htape", |
||||
items: [ |
||||
//左侧的配置界面
|
||||
/*{ |
||||
el: { |
||||
type: "bi.vtape", |
||||
items: [ |
||||
{ |
||||
height: 24, |
||||
type: "bi.label", |
||||
cls: "dec-font-weight-bold", |
||||
text: "Config", |
||||
title: "Config", |
||||
textAlign: "left", |
||||
}, |
||||
{ |
||||
height: 220, |
||||
type: "bi.textarea_editor", |
||||
cls: "bi-border", |
||||
value: this.model.config, |
||||
ref: function (_ref) { |
||||
self.configEditor = _ref; |
||||
}, |
||||
listeners: [{ |
||||
eventName: BI.FormulaEditor.EVENT_CHANGE, |
||||
action: function () { |
||||
self.store.setConfig(this.getValue()); |
||||
} |
||||
}] |
||||
}, |
||||
//下面是参数面板
|
||||
{ |
||||
type: "bi.left_right_vertical_adapt", |
||||
height: 24, |
||||
items: { |
||||
left: [{ |
||||
type: "bi.label", |
||||
cls: "dec-font-weight-bold", |
||||
text: BI.i18nText("Dec-Basic_Parameter_Setting") |
||||
}], |
||||
right: [{ |
||||
type: "bi.icon_button", |
||||
cls: "add-keyword-font", |
||||
level: "ignore", |
||||
lgap: 10, |
||||
handler: function () { |
||||
self.store.addParamter({ |
||||
type: "String", |
||||
name: "", |
||||
value: "" |
||||
}); |
||||
} |
||||
}, { |
||||
type: "bi.icon_button", |
||||
cls: "refresh-font", |
||||
lgap: 10, |
||||
level: "ignore", |
||||
handler: function () { |
||||
self.store.refreshParam(); |
||||
} |
||||
}] |
||||
} |
||||
}, { |
||||
type: "bi.components.style_table", |
||||
cls: "param-table", |
||||
width: 420, |
||||
columnSize: [130, 120, 120, ""], |
||||
items: this.model.paramItems, |
||||
header: this.model.paramHeader, |
||||
ref: function () { |
||||
self.paramSettingPane = this; |
||||
} |
||||
} |
||||
], |
||||
lgap: 10, |
||||
vgap: 15 |
||||
}, |
||||
width: 410, |
||||
lgap: 10, |
||||
vgap: 15 |
||||
},*/ |
||||
//右侧的预览界面
|
||||
{ |
||||
el: { |
||||
type: "bi.absolute", |
||||
cls: "bi-sortable-holder", |
||||
items: [{ |
||||
el: { |
||||
type: "dec.data.set.preview", |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function () { |
||||
//self.store.refreshParam();
|
||||
self.previewPane.previewData(); |
||||
} |
||||
}], |
||||
ref: function (_ref) { |
||||
self.previewPane = _ref; |
||||
} |
||||
}, top: 10, right: 10, bottom: 10, left: 10 |
||||
}] |
||||
}, |
||||
hgap: 10, |
||||
vgap: 15 |
||||
} |
||||
] |
||||
}; |
||||
}, |
||||
getValue: function () { |
||||
return { |
||||
config: this.model.config, |
||||
parameters: this.model.parameters |
||||
}; |
||||
} |
||||
}); |
||||
BI.shortcut("dec.data.set.type.custom.data", DemoData); |
||||
|
||||
$.extend(DecCst.DataSet.Type, {CUSTOM_USER_DATA: "custom_user_data"}); |
||||
BI.config("dec.provider.data.set", function (provider) { |
||||
provider.registerDataSetType({ |
||||
value: DecCst.DataSet.Type.CUSTOM_USER_DATA, |
||||
text: "用户信息数据集", |
||||
cardType: "dec.data.set.type.custom.data", |
||||
iconCls: "user-font" |
||||
}); |
||||
}); |
||||
})(); |
Loading…
Reference in new issue