main
黄海 7 months ago
parent 6f1970e51c
commit 9ffb60cbbb

@ -0,0 +1,75 @@
第一步获取操作的Token
admin
DataEase@123456
地址:
http://10.10.14.203/de2api/login/localLogin
content-type: application/json
数据:
{
"name": "XkdqNzblA7zA9bmvcDs1lR4Dg2/bVaPnYN0+7y/VfyR2XoJ/Miu9gqKa5kVQe/reZyyAgUKqgD1AJwEKsvXC9fyeccIcAWqUwg6gKNoY7Wu4iZM6cJ6ri3CLhqtOGlHRLrn105btKxSrt/nM71pEy8a8lYbCBZRGqHnBDU1/JAs=",
"pwd": "a/w4bFGfyY2BqZ6xEM5cj6ChOxC7ves8sJM0wUAKnBtqdIYHwxMLBDWKgmua0EMH7EvRy5S6yirz3VZI+fpGQAZF8jX+7evIZxdQq2jJU7r5EJPY5L+AA/a3zbuOvoOEtOdh5Y9nNdI1jSEzqH4m9IP/ADRFhF1xEfmemQKmU08="
}
返回:
{
"code": 0,
"msg": null,
"data": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm9pZCI6MSwiZXhwIjoxNzM0MDQ4MDEyfQ.9-scx4pBDlsvjL28aI7VaWPcnO4lNkc7-KO8SuzWPzo",
"exp": 1734048012144
}
}
第二步:拷贝母屏生成可编辑临时副本
地址:
http://10.10.14.203/de2api/dataVisualization/copy
Header:
x-de-token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm9pZCI6MSwiZXhwIjoxNzM0MDQ2ODc3fQ.42oSabyyDAx-TPJbJoPgwsMFtsjRmZMM90Taqr1l7nQ
参数以json格式传递不要用form-data或者x-www-form-urlencoded等其它格式
{
"nodeType": "leaf",
"name": "云南省教育决策支持系统【市州】-copy",
"type": "dataV",
"id": "1036286881547030528",
"pid": "1036643788262608896"
}
响应:
{"code":0,"msg":null,"data":"1064853824788893696"}
第三步:将临时副本保存下来
地址:
http://10.10.14.203/de2api/dataVisualization/saveCanvas
数据:
{
"canvasStyleData": TODO ,
"componentData": TODO ,
"appData": null,
"id": "1064853824788893696",
"name": "云南省教育决策支持系统【市州】-copy",
"pid": "1036643788262608896",
"status": 1,
"selfWatermarkStatus": true,
"type": "dataV",
"creatorName": null,
"updateName": null,
"createTime": 1734047402783,
"updateTime": 1734047402783,
"watermarkInfo": null,
"weight": null,
"mobileLayout": false,
"dataState": "ready",
"optType": "copy"
}
其中 canvasStyleData 和 componentData 可以通过读取数据库母屏数据的办法获取到
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202412130756641.png)

File diff suppressed because one or more lines are too long

@ -0,0 +1,20 @@
{
"canvasStyleData": TODO ,
"componentData": TODO ,
"appData": null,
"id": "1064853824788893696",
"name": "云南省教育决策支持系统【市州】-copy",
"pid": "1036643788262608896",
"status": 1,
"selfWatermarkStatus": true,
"type": "dataV",
"creatorName": null,
"updateName": null,
"createTime": 1734047402783,
"updateTime": 1734047402783,
"watermarkInfo": null,
"weight": null,
"mobileLayout": false,
"dataState": "ready",
"optType": "copy"
}

@ -0,0 +1,89 @@
package com.dsideal.base.DataEase.Util;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.base.Tools.Util.LocalMysqlConnectUtil;
import com.dsideal.base.Util.FileUtil;
import com.jfinal.kit.PathKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import java.util.Locale;
import static com.dsideal.base.DataEase.Model.DataEaseModel.DB_NAME;
public class CallApiToCopy {
public static String urlPrefix = "http://10.10.14.203";
/**
* DataEaseToken
*
* @return
*/
public static String getToken() {
//登录获取Token
//读取Data目录下DataEaseLogin.json文件
JSONObject jo = FileUtil.readJsonFile(PathKit.getRootClassPath() + "/Data/DataEaseLogin.json");
String url = urlPrefix + "/de2api/login/localLogin";
//.header("Authorization", "Bearer " + token)
String res = HttpUtil.createPost(url).contentType("application/json")
.body(jo.toString()).execute().body();
return JSONObject.parseObject(res).getJSONObject("data").getString("token");
}
public static void main(String[] args) {
LocalMysqlConnectUtil.Init();
//母屏的id
String motherId = "1036286881547030528";
//母屏所在的文件夹ID
String pid = "1036643788262608896";
//要拷贝出来的屏幕名称
String screenName = "云南省教育决策支持系统【市州】-copy";
String sql = "select canvas_style_data,component_data from data_visualization_info where id=?";
Record record = Db.use(DB_NAME).findFirst(sql, motherId);
String canvas_style_data = record.getStr("canvas_style_data");
String component_data = record.getStr("component_data");
//拷贝
String url = urlPrefix + "/de2api/dataVisualization/copy";
JSONObject jo = new JSONObject();
jo.put("nodeType", "leaf");
jo.put("name", screenName);
jo.put("type", "dataV");
jo.put("id", motherId);
jo.put("pid", pid);
String res = HttpUtil.createPost(url).contentType("application/json")
.header("x-de-token", getToken())
.body(jo.toString()).execute().body();
String screenId = JSONObject.parseObject(res).getString("data");
System.out.println("生成大屏ID=" + screenId);
//将临时副本保存下来
url = urlPrefix + "/de2api/dataVisualization/saveCanvas";
jo = new JSONObject();
jo.put("canvasStyleData", canvas_style_data);
jo.put("componentData", component_data);
jo.put("appData", null);
jo.put("id", screenId);
jo.put("name", screenName);
jo.put("pid", pid);
jo.put("status", 1);
jo.put("type", "dataV");
jo.put("selfWatermarkStatus", true);
jo.put("creatorName", null);
jo.put("updateName", null);
jo.put("createTime", 1734047402783L);
jo.put("updateTime", 1734047402783L);
jo.put("watermarkInfo", null);
jo.put("weight", null);
jo.put("mobileLayout", false);
jo.put("dataState", "ready");
jo.put("optType", "copy");
res = HttpUtil.createPost(url).contentType("application/json")
.header("x-de-token", getToken())
.body(jo.toString()).execute().body();
System.out.println(res);
}
}

@ -8,9 +8,7 @@ import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record; import com.jfinal.plugin.activerecord.Record;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Random;
public class SyncCityScreen { public class SyncCityScreen {
@ -55,12 +53,7 @@ public class SyncCityScreen {
public static DataEaseModel dm = new DataEaseModel(); public static DataEaseModel dm = new DataEaseModel();
/** public static void clear(String dataVisualizationName){
*
* @param dataVisualizationName
* @throws InterruptedException
*/
public static void SyncCityScreen(String dataVisualizationName) throws InterruptedException {
//一、先删除后插入保持健康:保留:【云南省教育决策支持系统【市州】】,删除掉云南省教育决策支持系统【市州】+昆明市,云南省教育决策支持系统【市州】+楚雄州等数据 //一、先删除后插入保持健康:保留:【云南省教育决策支持系统【市州】】,删除掉云南省教育决策支持系统【市州】+昆明市,云南省教育决策支持系统【市州】+楚雄州等数据
String sql = "select * from data_visualization_info where name like '%" + dataVisualizationName + "%' and name <>'" + dataVisualizationName + "'"; String sql = "select * from data_visualization_info where name like '%" + dataVisualizationName + "%' and name <>'" + dataVisualizationName + "'";
List<Record> toDelList = Db.use(DataEaseModel.DB_NAME).find(sql); List<Record> toDelList = Db.use(DataEaseModel.DB_NAME).find(sql);
@ -72,14 +65,48 @@ public class SyncCityScreen {
//(2) 删除共享链接表 //(2) 删除共享链接表
sql = "delete from xpack_share WHERE resource_id=?"; sql = "delete from xpack_share WHERE resource_id=?";
Db.use(DataEaseModel.DB_NAME).update(sql, id); Db.use(DataEaseModel.DB_NAME).update(sql, id);
//(3) 删除主表数据
//(3) 删除可视化资源表
sql = "delete from core_opt_recent where resource_id=?";
Db.use(DataEaseModel.DB_NAME).update(sql, id);
// (4) 跳转记录表
sql = "delete from visualization_link_jump where source_dv_id=?";
Db.use(DataEaseModel.DB_NAME).update(sql, id);
// (5) 跳转配置表
sql = "select * from visualization_link_jump_info where target_dv_id=?";
List<Record> jumpList = Db.use(DataEaseModel.DB_NAME).find(sql, id);
for (Record r : jumpList) {
long jumpId = r.getLong("id");
sql = "delete from visualization_link_jump_target_view_info where link_jump_info_id =?";
Db.use(DataEaseModel.DB_NAME).update(sql, jumpId);
sql = "delete from visualization_link_jump_info where id=?";
Db.use(DataEaseModel.DB_NAME).update(sql, jumpId);
}
// (6) 外部参数关联关系表
// sql = "delete from visualization_outer_params where visualization_id=?";
// Db.use(DataEaseModel.DB_NAME).update(sql, id);
//(7) 删除主表数据
Db.use(DataEaseModel.DB_NAME).deleteById("data_visualization_info", id); Db.use(DataEaseModel.DB_NAME).deleteById("data_visualization_info", id);
} }
System.out.println("成功删除大屏数据" + toDelList.size() + "条~"); System.out.println("成功删除大屏数据" + toDelList.size() + "条~");
}
/**
*
*
* @param dataVisualizationName
* @throws InterruptedException
*/
public static void SyncCityScreen(String dataVisualizationName) throws InterruptedException {
// 二、开始全新插入数据 // 二、开始全新插入数据
//1、获取母屏数据 //1、获取母屏数据
sql = "select * from data_visualization_info where name =?"; String sql = "select * from data_visualization_info where name =?";
Record motherRecord = Db.use(DataEaseModel.DB_NAME).findFirst(sql, dataVisualizationName); Record motherRecord = Db.use(DataEaseModel.DB_NAME).findFirst(sql, dataVisualizationName);
long motherId = motherRecord.getLong("id"); long motherId = motherRecord.getLong("id");
//母屏细节表 //母屏细节表
@ -88,7 +115,25 @@ public class SyncCityScreen {
//母屏共享链接 //母屏共享链接
sql = "select * from xpack_share where resource_id=?"; sql = "select * from xpack_share where resource_id=?";
Record motherShareRecord = Db.use(DataEaseModel.DB_NAME).findFirst(sql, motherId); Record motherShareRecord = Db.use(DataEaseModel.DB_NAME).findFirst(sql, motherId);
//母屏的可视化资源表
sql = "select * from core_opt_recent where resource_id=?";
Record motherOptRecord = Db.use(DataEaseModel.DB_NAME).findFirst(sql, motherId);
//母屏的linkJump
sql = "select * from visualization_link_jump where source_dv_id=?";
List<Record> motherLinkJumpList = Db.use(DataEaseModel.DB_NAME).find(sql, motherId);
//母屏的linkJumpInfo
sql = "select * from visualization_link_jump_info where target_dv_id=?";
List<Record> motherLinkJumpInfoList = Db.use(DataEaseModel.DB_NAME).find(sql, motherId);
//母屏的外部参数关联关系表
sql = "select * from visualization_outer_params where visualization_id=?";
List<Record> motheRouterParamsList = Db.use(DataEaseModel.DB_NAME).find(sql, motherId);
//跳转目标仪表板图表字段配置表
sql = "select * from visualization_link_jump_target_view_info where link_jump_info_id in (" +
"select id from visualization_link_jump_info where target_dv_id=?)";
List<Record> motherLinkJumpTargetViewInfo = Db.use(DataEaseModel.DB_NAME).find(sql, motherId);
//2、需要哪16个城市 //2、需要哪16个城市
for (String cityName : dm.getCityNameList()) { for (String cityName : dm.getCityNameList()) {
//1复制16个大屏 //1复制16个大屏
@ -110,47 +155,89 @@ public class SyncCityScreen {
//批量保存 //批量保存
Db.use(DataEaseModel.DB_NAME).batchSave("core_chart_view", writeList, 100); Db.use(DataEaseModel.DB_NAME).batchSave("core_chart_view", writeList, 100);
// // (3) 修改地图中城市 // (3) 修改地图中城市
// List<Record> list = dm.getMap(bigScreenId); List<Record> list = dm.getMap(bigScreenId);
// //core_chart_view表 //core_chart_view表
// for (Record record : list) { for (Record record : list) {
// long id = record.getLong("id"); long id = record.getLong("id");
// JSONObject jo = JSONObject.fromObject(record.getStr("custom_attr")); JSONObject jo = JSONObject.fromObject(record.getStr("custom_attr"));
// //获取城市编码 //获取城市编码
// String area_code = dm.getCityCode(cityName); String area_code = dm.getCityCode(cityName);
// //修改前 //修改前
// //System.out.println("修改前=" + jo.getJSONObject("map")); //System.out.println("修改前=" + jo.getJSONObject("map"));
//
// //修改城市编码 //修改城市编码
// jo.getJSONObject("map").put("id", area_code); jo.getJSONObject("map").put("id", area_code);
// jo.getJSONObject("map").put("level", "city"); jo.getJSONObject("map").put("level", "city");
//
// //System.out.println("修改后=" + jo.getJSONObject("map")); //System.out.println("修改后=" + jo.getJSONObject("map"));
// //写到数据库 //写到数据库
// String jsonString = jo.toString(); String jsonString = jo.toString();
// Db.use(DataEaseModel.DB_NAME).update("update core_chart_view set custom_attr=? where id=?", jsonString, id); Db.use(DataEaseModel.DB_NAME).update("update core_chart_view set custom_attr=? where id=?", jsonString, id);
// } }
//
// // (4) 发布共享链接 // (4) 发布共享链接
// Record shareRecord = new Record().setColumns(motherShareRecord); Record shareRecord = new Record().setColumns(motherShareRecord);
// shareRecord.set("resource_id", bigScreenId); shareRecord.set("resource_id", bigScreenId);
// shareRecord.set("id", getSnowId()); shareRecord.set("id", getSnowId());
// shareRecord.set("uuid", randomString(8));//大小写字母和数字组合长度为8 shareRecord.set("uuid", randomString(8));//大小写字母和数字组合长度为8
// Db.use(DataEaseModel.DB_NAME).save("xpack_share", "id", shareRecord); Db.use(DataEaseModel.DB_NAME).save("xpack_share", "id", shareRecord);
//
// (5) 插入可视化资源表
Record optRecord = new Record().setColumns(motherOptRecord);
optRecord.set("resource_id", bigScreenId);
optRecord.set("id", getSnowId());
Db.use(DataEaseModel.DB_NAME).save("core_opt_recent", "id", optRecord);
// (6) 插入跳转配置表
for (Record rMotherLinkJump : motherLinkJumpList) {
Record rCityLinkJump = new Record().setColumns(rMotherLinkJump);//克隆出来
rCityLinkJump.set("id", getSnowId());
rCityLinkJump.set("source_dv_id", bigScreenId);
Db.use(DataEaseModel.DB_NAME).save("visualization_link_jump", "id", rCityLinkJump);
}
// (7) 插入跳转配置信息表
Map<Integer, Long> map = new HashMap<>();
int idx = 0;
for (Record rMotherLinkJumpInfo : motherLinkJumpInfoList) {
idx++;
Record rCityLinkJumpInfo = new Record().setColumns(rMotherLinkJumpInfo);//克隆出来
rCityLinkJumpInfo.set("id", getSnowId());
map.put(idx, rCityLinkJumpInfo.getLong("id"));
rCityLinkJumpInfo.set("target_dv_id", bigScreenId);
Db.use(DataEaseModel.DB_NAME).save("visualization_link_jump_info", "id", rCityLinkJumpInfo);
}
//TODO 外部参数比较复杂
/*
select * from visualization_outer_params where visualization_id=1036286881547030528;
*/
//(8) 跳转目标仪表板图表字段配置表visualization_link_jump_info
idx = 0;
for (Record record : motherLinkJumpTargetViewInfo) {
idx++;
Record rCityLinkJumpTargetViewInfo = new Record().setColumns(record);//克隆出来
rCityLinkJumpTargetViewInfo.set("target_id", getSnowId());
rCityLinkJumpTargetViewInfo.set("link_jump_info_id", map.get(idx));
Db.use(DataEaseModel.DB_NAME).save(
"visualization_link_jump_target_view_info", "target_id", rCityLinkJumpTargetViewInfo);
}
System.out.println("完成" + cityName + "的数据填充~"); System.out.println("完成" + cityName + "的数据填充~");
} }
// //查询出每个城市的共享链接 //查询出每个城市的共享链接
// for (String cityName : dm.getCityNameList()) { for (String cityName : dm.getCityNameList()) {
// String screenName = dataVisualizationName + cityName; String screenName = dataVisualizationName + cityName;
// sql = "select * from data_visualization_info where name =?"; sql = "select * from data_visualization_info where name =?";
// Record record = Db.use(DataEaseModel.DB_NAME).findFirst(sql, screenName); Record record = Db.use(DataEaseModel.DB_NAME).findFirst(sql, screenName);
// long id = record.getLong("id"); long id = record.getLong("id");
// sql = "select * from xpack_share where resource_id=?"; sql = "select * from xpack_share where resource_id=?";
// Record shareRecord = Db.use(DataEaseModel.DB_NAME).findFirst(sql, id); Record shareRecord = Db.use(DataEaseModel.DB_NAME).findFirst(sql, id);
// System.out.println(cityName + "的共享链接:" + shareRecord.getStr("uuid")); System.out.println(cityName + "的共享链接:" + shareRecord.getStr("uuid"));
// } }
System.out.println("生成完毕"); System.out.println("生成完毕");
} }
@ -158,7 +245,7 @@ public class SyncCityScreen {
LocalMysqlConnectUtil.Init(); LocalMysqlConnectUtil.Init();
//获取数据可视化名称 //获取数据可视化名称
String dataVisualizationName = LocalMysqlConnectUtil.PropKit.get("dataEase.dataVisualizationName"); String dataVisualizationName = LocalMysqlConnectUtil.PropKit.get("dataEase.dataVisualizationName");
clear(dataVisualizationName);
SyncCityScreen(dataVisualizationName); // SyncCityScreen(dataVisualizationName);
} }
} }

@ -0,0 +1,50 @@
package com.dsideal.base.DataEase.Util;
import com.github.shyiko.mysql.binlog.BinaryLogClient;
import com.github.shyiko.mysql.binlog.event.*;
import com.github.shyiko.mysql.binlog.event.deserialization.EventDeserializer;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
public class Watch {
//服务器id
public static int SERVER_ID = 12345;
public static void main(String[] args) throws IOException, URISyntaxException {
//获取数据库地址,端口号,用户名,密码
String jdbcUrl = "jdbc:mysql://10.10.14.203:3306/ds_db?rewriteBatchedStatements=true&useUnicode=true&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false";
URI uri = new URI(jdbcUrl.substring(5)); // 去掉 "jdbc:" 部分,因为 URI 不识别它
String host = uri.getHost(); // 获取IP地址
int port = uri.getPort(); // 获取端口号
String user = "root";//用户名
String password = "Password123@mysql";//密码
// 构建二进制日志客户端
BinaryLogClient client = new BinaryLogClient(host, port, user, password);
// 反序列化配置
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG);
// 设置反序列化配置
client.setEventDeserializer(eventDeserializer);
// 设置自己的client作为服务器的id
client.setServerId(SERVER_ID);
Map<Long,String> tableMap = new HashMap<>();
client.registerEventListener(event -> {
EventData data = event.getData();
if (data instanceof TableMapEventData) {
TableMapEventData tableMapEventData = (TableMapEventData) data;
tableMap.put(tableMapEventData.getTableId(), tableMapEventData.getTable());
}
if (data instanceof WriteRowsEventData) {
System.out.println("Insert:"+tableMap.get(((WriteRowsEventData) data).getTableId()));
}
});
client.connect();
}
}

@ -0,0 +1,4 @@
{
"name": "XkdqNzblA7zA9bmvcDs1lR4Dg2/bVaPnYN0+7y/VfyR2XoJ/Miu9gqKa5kVQe/reZyyAgUKqgD1AJwEKsvXC9fyeccIcAWqUwg6gKNoY7Wu4iZM6cJ6ri3CLhqtOGlHRLrn105btKxSrt/nM71pEy8a8lYbCBZRGqHnBDU1/JAs=",
"pwd": "a/w4bFGfyY2BqZ6xEM5cj6ChOxC7ves8sJM0wUAKnBtqdIYHwxMLBDWKgmua0EMH7EvRy5S6yirz3VZI+fpGQAZF8jX+7evIZxdQq2jJU7r5EJPY5L+AA/a3zbuOvoOEtOdh5Y9nNdI1jSEzqH4m9IP/ADRFhF1xEfmemQKmU08="
}
Loading…
Cancel
Save