VisualdevShortLinkController.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. package jnpf.base.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import com.alibaba.fastjson.JSONObject;
  4. import io.swagger.v3.oas.annotations.tags.Tag;
  5. import io.swagger.v3.oas.annotations.Parameter;
  6. import io.swagger.v3.oas.annotations.Parameters;
  7. import io.swagger.v3.oas.annotations.Operation;
  8. import jnpf.base.ActionResult;
  9. import jnpf.base.model.ColumnDataModel;
  10. import jnpf.base.model.OnlineImport.VisualdevModelDataInfoVO;
  11. import jnpf.base.model.VisualDevJsonModel;
  12. import jnpf.base.model.VisualWebTypeEnum;
  13. import jnpf.model.OnlineDevData;
  14. import jnpf.onlinedev.model.*;
  15. import jnpf.util.NoDataSourceBind;
  16. import jnpf.base.UserInfo;
  17. import jnpf.base.entity.VisualdevEntity;
  18. import jnpf.base.entity.VisualdevReleaseEntity;
  19. import jnpf.base.entity.VisualdevShortLinkEntity;
  20. import jnpf.base.model.shortLink.*;
  21. import jnpf.base.service.VisualdevReleaseService;
  22. import jnpf.base.service.VisualdevService;
  23. import jnpf.base.service.VisualdevShortLinkService;
  24. import jnpf.base.util.VisualUtil;
  25. import jnpf.base.vo.PaginationVO;
  26. import jnpf.config.ConfigValueUtil;
  27. import jnpf.constant.MsgCode;
  28. import jnpf.consts.DeviceType;
  29. import jnpf.database.util.TenantDataSourceUtil;
  30. import jnpf.exception.DataException;
  31. import jnpf.exception.LoginException;
  32. import jnpf.exception.WorkFlowException;
  33. import jnpf.onlinedev.service.VisualDevInfoService;
  34. import jnpf.onlinedev.service.VisualDevListService;
  35. import jnpf.onlinedev.service.VisualdevModelDataService;
  36. import jnpf.onlinedev.util.onlineDevUtil.OnlinePublicUtils;
  37. import jnpf.onlinedev.util.onlineDevUtil.OnlineSwapDataUtils;
  38. import jnpf.util.*;
  39. import jnpf.util.context.RequestContext;
  40. import org.springframework.beans.factory.annotation.Autowired;
  41. import org.springframework.web.bind.annotation.*;
  42. import jakarta.servlet.http.HttpServletResponse;
  43. import java.io.IOException;
  44. import java.sql.SQLException;
  45. import java.text.ParseException;
  46. import java.util.Date;
  47. import java.util.List;
  48. import java.util.Map;
  49. /**
  50. * 在线开发表单外链Controller
  51. *
  52. * @author JNPF开发平台组
  53. * @version V3.4.2
  54. * @copyright 引迈信息技术有限公司
  55. * @date 2022/12/30 11:33:17
  56. */
  57. @Tag(name = "表单外链" , description = "BaseShortLink" )
  58. @RestController
  59. @RequestMapping("/api/visualdev/ShortLink" )
  60. public class VisualdevShortLinkController extends SuperController<VisualdevShortLinkService, VisualdevShortLinkEntity> {
  61. @Autowired
  62. private VisualdevShortLinkService visualdevShortLinkService;
  63. @Autowired
  64. private ConfigValueUtil configValueUtil;
  65. @Autowired
  66. protected AuthUtil authUtil;
  67. @Autowired
  68. private VisualdevService visualdevService;
  69. @Autowired
  70. private VisualdevReleaseService visualdevReleaseService;
  71. @Autowired
  72. private VisualdevModelDataService visualdevModelDataService;
  73. @Autowired
  74. private OnlineSwapDataUtils onlineSwapDataUtils;
  75. @Autowired
  76. private VisualDevListService visualDevListService;
  77. @Autowired
  78. private VisualDevInfoService visualDevInfoService;
  79. @Operation(summary = "获取外链信息" )
  80. @Parameters({
  81. @Parameter(name = "id" , description = "主键" ),
  82. })
  83. @GetMapping("/{id}" )
  84. @SaCheckPermission("onlineDev.formDesign" )
  85. public ActionResult getInfo(@PathVariable("id" ) String id) {
  86. VisualdevShortLinkEntity info = visualdevShortLinkService.getById(id);
  87. VisualdevShortLinkVo vo;
  88. if (info != null) {
  89. vo = JsonUtil.getJsonToBean(info, VisualdevShortLinkVo.class);
  90. vo.setAlreadySave(true);
  91. } else {
  92. vo = new VisualdevShortLinkVo();
  93. vo.setId(id);
  94. }
  95. vo.setFormLink(geturl(id, "form" ));
  96. vo.setColumnLink(geturl(id, "list" ));
  97. return ActionResult.success(vo);
  98. }
  99. /**
  100. * 获取url
  101. *
  102. * @param
  103. * @return
  104. * @copyright 引迈信息技术有限公司
  105. * @date 2023/3/9
  106. */
  107. private String geturl(String id, String type) {
  108. String url = configValueUtil.getApiDomain() + "/api/visualdev/ShortLink/trigger/" + id + "?encryption=";
  109. UserInfo userInfo = UserProvider.getUser();
  110. JSONObject obj = new JSONObject();
  111. obj.put("type" , type);
  112. if (configValueUtil.isMultiTenancy()) {
  113. obj.put("tenantId" , userInfo.getTenantId());
  114. }
  115. //参数加密
  116. String encryption = DesUtil.aesOrDecode(obj.toJSONString(), true,true);
  117. url += encryption;
  118. return url;
  119. }
  120. @Operation(summary = "修改外链信息" )
  121. @PutMapping("" )
  122. @SaCheckPermission("onlineDev.formDesign" )
  123. public ActionResult saveOrupdate(@RequestBody VisualdevShortLinkForm data) {
  124. VisualdevShortLinkEntity entity = JsonUtil.getJsonToBean(data, VisualdevShortLinkEntity.class);
  125. if(entity.getFormLink().contains(configValueUtil.getApiDomain())){
  126. entity.setFormLink(entity.getFormLink().replace(configValueUtil.getApiDomain(),""));
  127. }
  128. if(entity.getColumnLink().contains(configValueUtil.getApiDomain())){
  129. entity.setColumnLink(entity.getColumnLink().replace(configValueUtil.getApiDomain(),""));
  130. }
  131. VisualdevShortLinkEntity info = visualdevShortLinkService.getById(data.getId());
  132. UserInfo userInfo = UserProvider.getUser();
  133. if (info != null) {
  134. entity.setLastModifyTime(new Date());
  135. entity.setLastModifyUserId(userInfo.getUserId());
  136. } else {
  137. entity.setCreatorTime(new Date());
  138. entity.setCreatorUserId(userInfo.getUserId());
  139. }
  140. String pcLink = "/formShortLink";
  141. String appLink ="/pages/formShortLink/index";
  142. entity.setRealPcLink(pcLink);
  143. entity.setRealAppLink(appLink);
  144. entity.setUserId(userInfo.getUserId());
  145. visualdevShortLinkService.saveOrUpdate(entity);
  146. return ActionResult.success(MsgCode.SU002.get());
  147. }
  148. /**
  149. * 参数解密切换数据源
  150. *
  151. * @param
  152. * @return
  153. * @copyright 引迈信息技术有限公司
  154. * @date 2023/3/9
  155. */
  156. private VisualdevShortLinkModel aesDecodeMatchDatabase(String encryption) throws LoginException {
  157. //参数解密
  158. String str = DesUtil.aesOrDecode(encryption, false,true);
  159. if (StringUtil.isEmpty(str)) {
  160. throw new LoginException(MsgCode.VS009.get());
  161. }
  162. VisualdevShortLinkModel model = JsonUtil.getJsonToBean(str, VisualdevShortLinkModel.class);
  163. if (configValueUtil.isMultiTenancy()) {
  164. if (StringUtil.isNotEmpty(model.getTenantId())) {
  165. //切换成租户库
  166. TenantDataSourceUtil.switchTenant(model.getTenantId());
  167. } else {
  168. throw new LoginException(MsgCode.LOG115.get());
  169. }
  170. }
  171. return model;
  172. }
  173. @NoDataSourceBind
  174. @Operation(summary = "外链请求入口" )
  175. @Parameters({
  176. @Parameter(name = "id" , description = "主键" ),
  177. })
  178. @GetMapping("/trigger/{id}" )
  179. public ActionResult getlink(@PathVariable("id" ) String id,
  180. @RequestParam(value = "encryption" ) String encryption,
  181. HttpServletResponse response) throws LoginException, IOException {
  182. VisualdevShortLinkModel model = aesDecodeMatchDatabase(encryption);
  183. String link = "";
  184. VisualdevShortLinkEntity entity = visualdevShortLinkService.getById(id);
  185. DeviceType deviceType = UserProvider.getDeviceForAgent();
  186. if (entity != null) {
  187. if (DeviceType.PC.equals(deviceType)) {
  188. link = configValueUtil.getFrontDomain() + entity.getRealPcLink();
  189. } else {
  190. link = configValueUtil.getAppDomain() + entity.getRealAppLink();
  191. }
  192. } else {
  193. return ActionResult.fail(MsgCode.VS010.get());
  194. }
  195. JSONObject obj = new JSONObject();
  196. obj.put("modelId" , id);
  197. obj.put("type" , model.getType());
  198. if (configValueUtil.isMultiTenancy()) {
  199. obj.put("tenantId" , model.getTenantId());
  200. }
  201. //新链接参数加密
  202. String encryptionNew = DesUtil.aesOrDecode(obj.toJSONString(), true,true);
  203. link += "?encryption=" + encryptionNew;
  204. // link += "&modelId=" + id;
  205. response.sendRedirect(link);
  206. return ActionResult.success(MsgCode.SU000.get());
  207. }
  208. @NoDataSourceBind
  209. @Operation(summary = "获取外链配置" )
  210. @Parameters({
  211. @Parameter(name = "id" , description = "主键" ),
  212. })
  213. @GetMapping("/getConfig/{id}" )
  214. public ActionResult getConfig(@PathVariable("id" ) String id, @RequestParam("encryption" ) String encryption) throws LoginException {
  215. aesDecodeMatchDatabase(encryption);
  216. VisualdevShortLinkEntity info = visualdevShortLinkService.getById(id);
  217. VisualdevShortLinkConfigVo vo = JsonUtil.getJsonToBean(info, VisualdevShortLinkConfigVo.class);
  218. vo.setFormLink(geturl(id, "form" ));
  219. vo.setColumnLink(geturl(id, "list" ));
  220. return ActionResult.success(vo);
  221. }
  222. @NoDataSourceBind
  223. @Operation(summary = "密码验证" )
  224. @PostMapping("/checkPwd" )
  225. public ActionResult checkPwd(@RequestBody VisualdevShortLinkPwd form) throws LoginException {
  226. //参数解密
  227. VisualdevShortLinkModel model = aesDecodeMatchDatabase(form.getEncryption());
  228. VisualdevShortLinkEntity info = visualdevShortLinkService.getById(form.getId());
  229. boolean flag = false;
  230. if (OnlineDevData.STATE_ENABLE.equals(info.getFormPassUse()) && 0 == form.getType()) {
  231. if (Md5Util.getStringMd5(info.getFormPassword()).equals(form.getPassword())) {
  232. flag = true;
  233. }
  234. } else if (OnlineDevData.STATE_ENABLE.equals(info.getColumnPassUse()) && 1 == form.getType()) {
  235. if (Md5Util.getStringMd5(info.getColumnPassword()).equals(form.getPassword())) {
  236. flag = true;
  237. }
  238. }
  239. if (flag) {
  240. return ActionResult.success();
  241. }
  242. return ActionResult.fail(MsgCode.VS011.get());
  243. }
  244. @NoDataSourceBind
  245. @Operation(summary = "获取列表表单配置JSON" )
  246. @GetMapping("/{modelId}/Config" )
  247. public ActionResult getData(@PathVariable("modelId" ) String modelId, @RequestParam(value = "type" , required = false) String type,
  248. @RequestParam("encryption" ) String encryption) throws WorkFlowException, LoginException {
  249. aesDecodeMatchDatabase(encryption);
  250. VisualdevEntity entity;
  251. //线上版本
  252. if ("0".equals(type)) {
  253. entity = visualdevService.getInfo(modelId);
  254. } else {
  255. VisualdevReleaseEntity releaseEntity = visualdevReleaseService.getById(modelId);
  256. entity = JsonUtil.getJsonToBean(releaseEntity, VisualdevEntity.class);
  257. }
  258. if (entity == null) {
  259. return ActionResult.fail(MsgCode.VS012.get());
  260. }
  261. String s = VisualUtil.checkPublishVisualModel(entity, MsgCode.VS005.get());
  262. if (s != null) {
  263. return ActionResult.fail(s);
  264. }
  265. DataInfoVO vo = JsonUtil.getJsonToBean(entity, DataInfoVO.class);
  266. return ActionResult.success(vo);
  267. }
  268. @NoDataSourceBind
  269. @Operation(summary = "外链数据列表" )
  270. @Parameters({
  271. @Parameter(name = "modelId" , description = "模板id" ),
  272. })
  273. @PostMapping("/{modelId}/ListLink" )
  274. public ActionResult ListLink(@PathVariable("modelId" ) String modelId, @RequestParam("encryption" ) String encryption,
  275. @RequestBody PaginationModel paginationModel) throws WorkFlowException, LoginException {
  276. aesDecodeMatchDatabase(encryption);
  277. VisualdevReleaseEntity visualdevEntity = visualdevReleaseService.getById(modelId);
  278. VisualDevJsonModel visualJsonModel = OnlinePublicUtils.getVisualJsonModel(visualdevEntity);
  279. //判断请求客户端来源
  280. if (!RequestContext.isOrignPc()) {
  281. visualJsonModel.setColumnData(visualJsonModel.getAppColumnData());
  282. }
  283. List<Map<String, Object>> realList;
  284. if (VisualWebTypeEnum.DATA_VIEW.getType().equals(visualdevEntity.getWebType())) {//
  285. //数据视图的接口数据获取、
  286. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class);
  287. realList = onlineSwapDataUtils.getInterfaceData(visualdevEntity, paginationModel, columnDataModel);
  288. } else {
  289. realList = visualDevListService.getDataListLink(visualJsonModel, paginationModel);
  290. }
  291. PaginationVO paginationVO = JsonUtil.getJsonToBean(paginationModel, PaginationVO.class);
  292. return ActionResult.page(realList, paginationVO);
  293. }
  294. @NoDataSourceBind
  295. @Operation(summary = "获取数据信息(带转换数据)" )
  296. @Parameters({
  297. @Parameter(name = "modelId" , description = "模板id" ),
  298. @Parameter(name = "id" , description = "数据id" ),
  299. })
  300. @GetMapping("/{modelId}/{id}/DataChange" )
  301. public ActionResult infoWithDataChange(@PathVariable("modelId" ) String modelId, @PathVariable("id" ) String id,
  302. @RequestParam("encryption" ) String encryption) throws DataException, ParseException, IOException, SQLException, LoginException {
  303. aesDecodeMatchDatabase(encryption);
  304. modelId = XSSEscape.escape(modelId);
  305. id = XSSEscape.escape(id);
  306. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  307. VisualdevModelDataInfoVO vo = visualDevInfoService.getDetailsDataInfo(id, visualdevEntity);
  308. return ActionResult.success(vo);
  309. }
  310. //**********以下微服务和单体不同
  311. @NoDataSourceBind
  312. @Operation(summary = "添加数据" )
  313. @Parameters({
  314. @Parameter(name = "modelId" , description = "模板id" ),
  315. @Parameter(name = "visualdevModelDataCrForm" , description = "功能数据创建表单" ),
  316. })
  317. @PostMapping("/{modelId}" )
  318. public ActionResult create(@PathVariable("modelId" ) String modelId, @RequestParam("encryption" ) String encryption,
  319. @RequestBody VisualdevModelDataCrForm visualdevModelDataCrForm) throws WorkFlowException, LoginException {
  320. VisualdevShortLinkModel visualdevShortLinkModel = aesDecodeMatchDatabase(encryption);
  321. VisualdevShortLinkEntity info = visualdevShortLinkService.getById(modelId);
  322. if (1 != info.getFormUse()) {
  323. return ActionResult.fail(MsgCode.VS013.get());
  324. }
  325. String tenantId=visualdevShortLinkModel.getTenantId();
  326. try {
  327. if (configValueUtil.isMultiTenancy()) {
  328. if (StringUtil.isNotEmpty(tenantId)) {
  329. //切换成租户库
  330. TenantDataSourceUtil.switchTenant(tenantId);
  331. } else {
  332. return ActionResult.fail(MsgCode.LOG115.get());
  333. }
  334. }
  335. VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(modelId);
  336. Map<String, Object> map = JsonUtil.stringToMap(visualdevModelDataCrForm.getData());
  337. visualdevModelDataService.visualCreate(VisualParamModel.builder().visualdevEntity(visualdevEntity).data(map).isLink(true).build());
  338. }catch (Exception e){
  339. throw new WorkFlowException(e.getMessage(), e);
  340. }
  341. return ActionResult.success(MsgCode.SU001.get());
  342. }
  343. }