Compare commits
25 Commits
1d3bde9fe7
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 26087172df | |||
| 281c3ff3c8 | |||
| 38d44c2487 | |||
| 8c88f8adf5 | |||
| 526734c5a5 | |||
| 44b48ad916 | |||
| 1a3ae4f61c | |||
| 859c509f08 | |||
| 0704f187af | |||
| 199d2b439e | |||
| 5f898ed034 | |||
| 5a9cb05c86 | |||
| 98936680d5 | |||
| fc043fd5f3 | |||
| 54531002a7 | |||
| 728a95c00d | |||
| 13c9951c1f | |||
| 8dfaa3c3e1 | |||
| 050c478dce | |||
| 2688e8b6e2 | |||
| a9f30f0ca5 | |||
| 1bf4a0595a | |||
| 74cd57fd99 | |||
| c9ac4c9945 | |||
| 3b3371ee1a |
@ -3,9 +3,6 @@ AIGC应用平台介绍
|
||||
|
||||
一个全栈式 AI 开发平台,旨在帮助开发者快速构建和部署个性化的 AI 应用。
|
||||
|
||||
> JDK说明:AI流程编排引擎暂时不支持jdk21,所以目前只能使用jdk8或者jdk17启动项目。
|
||||
|
||||
|
||||
JeecgBoot平台的AIGC功能模块,是一套类似`Dify`的`AIGC应用开发平台`+`知识库问答`,是一款基于LLM大语言模型AI应用平台和 RAG 的知识库问答系统。
|
||||
其直观的界面结合了 AI 流程编排、RAG 管道、知识库管理、模型管理、对接向量库、实时运行可观察等,让您可以快速从原型到生产,拥有AI服务能力。
|
||||
|
||||
|
||||
@ -1,126 +0,0 @@
|
||||
|
||||
JeecgBoot低代码平台(商业版介绍)
|
||||
===============
|
||||
|
||||
|
||||
|
||||
项目介绍
|
||||
-----------------------------------
|
||||
|
||||
<h3 align="center">企业级AI低代码平台</h3>
|
||||
|
||||
|
||||
JeecgBoot是一款集成AI应用的,基于BPM流程的低代码平台,旨在帮助企业快速实现低代码开发和构建个性化AI应用,支持MCP和插件,实现聊天式业务操作(如 “一句话创建用户”)!
|
||||
|
||||
前后端分离架构Ant Design&Vue3,SpringBoot,SpringCloud Alibaba,Mybatis-plus,Shiro。强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE, 帮助Java项目解决80%的重复工作,让开发更多关注业务,提高效率、节省成本,同时又不失灵活性!低代码能力:Online表单、表单设计、流程设计、Online报表、大屏/仪表盘设计、报表设计; AI应用平台功能:AI知识库问答、AI模型管理、AI流程编排、AI聊天等,支持含ChatGPT、DeepSeek、Ollama等多种AI大模型
|
||||
|
||||
JeecgBoot 提供了一系列 `低代码能力`,实现`真正的零代码`在线开发:Online表单开发、Online报表、复杂报表设计、打印设计、在线图表设计、仪表盘设计、大屏设计、移动图表能力、表单设计器、在线设计流程、流程自动化配置、插件能力(可插拔)
|
||||
|
||||
`AI赋能低代码:` 目前提供了AI应用、AI模型管理、AI流程编排、AI对话助手,AI建表、AI写文章、AI知识库问答、AI字段建议等功能;支持各种AI大模型ChatGPT、DeepSeek、Ollama、智普、千问等.
|
||||
|
||||
`JEECG宗旨是:` 简单功能由OnlineCoding配置实现,做到`零代码开发`;复杂功能由代码生成器生成进行手工Merge 实现`低代码开发`,既保证了`智能`又兼顾`灵活`;实现了低代码开发的同时又支持灵活编码,解决了当前低代码产品普遍不灵活的弊端!
|
||||
|
||||
`JEECG业务流程:` 采用工作流来实现、扩展出任务接口,供开发编写业务逻辑,表单提供多种解决方案: 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计(松耦合)、并支持任务节点灵活配置,既保证了公司流程的保密性,又减少了开发人员的工作量。
|
||||
|
||||
|
||||
|
||||
#### JeecgBoot商业版与同类产品区别
|
||||
-----------------------------------
|
||||
|
||||
- 灵活性:jeecgboot基于开源技术栈,设计初考虑到可插拔性和集成灵活性,确保平台的智能性与灵活性,避免因平台过于庞大而导致的扩展困难。
|
||||
- 流程管理:支持一个表单挂接多个流程,同时一个流程可以连接多个表单,增强了流程的灵活性和复杂性管理。
|
||||
- 符合中国国情的流程:针对中国市场的特定需求,jeecgboot能够实现各种符合中国国情的业务流程。
|
||||
- 强大的表单设计器:jeecgboot的表单设计器与敲敲云共享,具备高质量和智能化的特点,能够满足零代码应用的需求,业内同类产品中不多见。
|
||||
- 报表功能:自主研发的报表工具,拥有独立知识产权,功能上比业内老牌产品如帆软更智能,操作简便。
|
||||
- BI产品整合:提供大屏、仪表盘、门户等功能,完美解决这些需求,并支持移动面板的设计与渲染。
|
||||
- 自主研发的模块:jeecgboot的所有模块均为自主研发,具有独立的知识产权。
|
||||
- 颗粒度和功能细致:在功能细致度和颗粒度上,jeecgboot远超同类产品,尤其在零代码能力方面表现突出。
|
||||
- 零代码应用管理:最新版支持与敲敲云的零代码应用管理能力的集成,使得jeecgboot既具备低代码,又具备零代码的应用能力,业内独一无二。
|
||||
- 强大的代码生成器:作为开源代码生成器的先锋,jeecgboot在代码生成的智能化和在线低代码与代码生成的结合方面,优势明显。
|
||||
- 精细化权限管理:提供行级和列级的数据权限控制,满足企业在ERP和OA领域对权限管理的严格需求。
|
||||
- 多平台支持的APP:目前采用uniapp3实现,支持小程序、H5、App及鸿蒙、鸿蒙Next、Electron桌面应用等多种终端。
|
||||
|
||||
> 综上所述,jeecgboot不仅在功能上具备丰富性和灵活性,还在技术架构、权限管理和用户体验等方面展现出明显的优势,是一个综合性能强大的低代码平台。
|
||||
|
||||
|
||||
|
||||
商业版演示
|
||||
-----------------------------------
|
||||
|
||||
JeecgBoot vs 敲敲云
|
||||
> - JeecgBoot是低代码产品拥有系列低代码能力,比如流程设计、表单设计、大屏设计,代码生成器,适合半开发模式(开发+低代码结合),也可以集成零代码应用管理模块.
|
||||
> - 敲敲云是零代码产品,完全不写代码,通过配置搭建业务系统,其在jeecgboot基础上研发而成,删除了online、代码生成、OA等需要编码功能,只保留应用管理功能和聊天、日程、文件三个OA组件.
|
||||
|
||||
|
||||
- JeecgBoot低代码: https://boot3.jeecg.com
|
||||
- 敲敲云零代码:https://app.qiaoqiaoyun.com
|
||||
- APP演示(多端): http://jeecg.com/appIndex
|
||||
|
||||
|
||||
### 流程视频介绍
|
||||
|
||||
[](https://www.bilibili.com/video/BV1Nk4y1o7Qc)
|
||||
|
||||
|
||||
|
||||
### 商业版功能简述
|
||||
|
||||
> 详细的功能介绍,[请联系官方](https://jeecg.com/vip)
|
||||
|
||||
```
|
||||
│─更多商业功能
|
||||
│ ├─流程设计器
|
||||
│ ├─简流设计器(类钉钉版)
|
||||
│ ├─门户设计(NEW)
|
||||
│ ├─表单设计器
|
||||
│ ├─大屏设计器
|
||||
│ └─我的任务
|
||||
│ └─历史流程
|
||||
│ └─历史流程
|
||||
│ └─流程实例管理
|
||||
│ └─流程监听管理
|
||||
│ └─流程表达式
|
||||
│ └─我发起的流程
|
||||
│ └─我的抄送
|
||||
│ └─流程委派、抄送、跳转
|
||||
│ └─OA办公组件
|
||||
│ └─零代码应用管理(无需编码,在线搭建应用系统)
|
||||
│ ├─积木报表企业版(含jimureport、jimubi)
|
||||
│ ├─AI流程设计器源码
|
||||
│ ├─Online全模块功能和源码
|
||||
│ ├─AI写文章(CMS)
|
||||
│ ├─AI表单字段建议(表单设计器)
|
||||
│ ├─OA办公协同组件
|
||||
│ ├─在线聊天功能
|
||||
│ ├─设计表单移动适配
|
||||
│ ├─设计表单支持外部填报
|
||||
│ ├─设计表单AI字段建议
|
||||
│ ├─设计表单视图功能(支持多种类型含日历、表格、看板、甘特图)
|
||||
│ └─。。。
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
##### 流程设计
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
##### 表单设计器
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
22
README.md
@ -19,15 +19,17 @@ JeecgBoot AI低代码平台
|
||||
|
||||
<h3 align="center">企业级AI低代码平台</h3>
|
||||
|
||||
JeecgBoot 是一款基于BPM流程和代码生成的AI低代码平台,助力企业快速实现低代码开发和构建AI应用,支持MCP和插件,实现聊天式业务操作(如 “一句话创建用户”)!
|
||||
JeecgBoot 是一款融合代码生成与AI应用的低代码开发平台,助力企业快速实现低代码开发和构建AI应用。平台支持MCP和插件扩展,提供聊天式业务操作(如“一句话创建用户”),大幅提升开发效率与用户便捷性。
|
||||
|
||||
采用前后端分离架构(Ant Design&Vue3,SpringBoot3,SpringCloud Alibaba,Mybatis-plus),强大代码生成器实现前后端一键生成,无需手写代码。
|
||||
平台引领AI低代码开发模式:AI生成→在线编码→代码生成→手工合并,解决Java项目80%重复工作,提升效率,节省成本,兼顾灵活性。
|
||||
具备强大且颗粒化的权限控制,支持按钮权限和数据权限设置,满足大型业务系统需求。功能涵盖在线表单、表单设计、流程设计、门户设计、报表与大屏设计、OA办公、AI应用、AI知识库、大模型管理、AI流程编排、AI聊天,支持ChatGPT、DeepSeek、Ollama等多种AI大模型。
|
||||
|
||||
`AI赋能报表:` 积木报表是一款自主研发的强大开源企业级Web报表与大屏工具。它通过零编码的拖拽式操作,赋能用户如同搭积木般轻松构建各类复杂报表和数据大屏,全面满足企业数据可视化与分析需求,助力企业级数据产品的高效打造与应用。
|
||||
`傻瓜式报表:` JimuReport是一款自主研发的强大开源企业级Web报表工具。它通过零编码的拖拽式操作,赋能用户如同搭积木般轻松构建各类复杂报表,全面满足企业数据可视化与分析需求,助力企业级数据产品的高效打造与应用。
|
||||
|
||||
`AI赋能低代码:` 提供完善成熟的AI应用平台,涵盖AI应用管理、AI模型管理、智能对话助手、知识库问答、流程编排与设计器、AI建表等多项功能。平台兼容多种主流大模型,包括ChatGPT、DeepSeek、Ollama、智普、千问等,助力企业高效构建智能化应用,推动低代码开发与AI深度融合。
|
||||
`傻瓜式大屏:` JimuBI一款自主研发的强大的大屏和仪表盘设计工具。专注数字孪生与数据可视化,支持交互式大屏、仪表盘、门户和移动端,实现“一次开发,多端适配”。 大屏设计类Word风格,支持多屏切换,自由拖拽,轻松打造炫酷动态界面。
|
||||
|
||||
`成熟AI应用功能:` 提供一套完善AI应用平台: 涵盖AI应用管理、AI模型管理、智能对话助手、知识库问答、流程编排与设计器、AI建表、MCP插件配置等功能。平台兼容主流大模型,包括ChatGPT、DeepSeek、Ollama、智普、千问等,助力企业高效构建智能化应用,推动低代码开发与AI深度融合。
|
||||
|
||||
`JEECG宗旨是:` JEECG旨在通过OnlineCoding平台实现简单功能的零代码快速搭建,同时针对复杂功能采用代码生成器生成代码并手工合并,打造智能且灵活的低代码开发模式,有效解决了当前低代码产品普遍缺乏灵活性的问题,提升开发效率的同时兼顾系统的扩展性和定制化能力。
|
||||
|
||||
@ -230,20 +232,6 @@ JeecgBoot平台提供了一套完善的AI应用管理系统模块,是一套类
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
开源版与企业版区别?
|
||||
-----------------------------------
|
||||
|
||||
- JeecgBoot开源版采用 [Apache-2.0 license](LICENSE) 协议附加补充条款:允许商用使用,不会造成侵权行为,允许基于本平台软件开展业务系统开发(但在任何情况下,您不得使用本软件开发可能被认为与本软件竞争的软件).
|
||||
- 商业版与开源版主要区别在于商业版提供了技术支持 和 更多的企业级功能(例如:Online图表、流程监控、流程设计、流程审批、表单设计器、表单视图、积木报表企业版、OA办公、商业APP、零代码应用、Online模块源码等功能). [更多商业功能介绍,点击查看](README-Enterprise.md)
|
||||
- JeecgBoot未来发展方向是:零代码平台的建设,也就是团队的另外一款产品 [敲敲云零代码](https://www.qiaoqiaoyun.com) ,无需编码即可通过拖拽快速搭建企业级应用,与JeecgBoot低代码平台形成互补,满足从简单业务到复杂系统的全场景开发需求,目前已经开源,[欢迎下载](https://qiaoqiaoyun.com/downloadCode)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### Jeecg Boot 产品功能蓝图
|
||||

|
||||
|
||||
|
||||
BIN
jeecg-boot/db/其他数据库脚本/jeecgboot-oracle11g.dmp
Normal file
31499
jeecg-boot/db/其他数据库脚本/jeecgboot-oracle11g.sql
Normal file
27491
jeecg-boot/db/其他数据库脚本/jeecgboot-postgresql17.sql
Normal file
50451
jeecg-boot/db/其他数据库脚本/jeecgboot-sqlserver2017.sql
Normal file
@ -75,7 +75,7 @@
|
||||
<dependency>
|
||||
<groupId>org.jeecgframework.boot3</groupId>
|
||||
<artifactId>jeecg-aiflow</artifactId>
|
||||
<version>3.9.0</version>
|
||||
<version>3.9.0.1</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>commons-io</groupId>
|
||||
@ -85,10 +85,14 @@
|
||||
<groupId>commons-beanutils</groupId>
|
||||
<artifactId>commons-beanutils</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>com.yomahub</groupId>
|
||||
<artifactId>liteflow-script-python</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<!-- beigin 这两个依赖太多每个包50M左右,如果你发布需要使用,请把<scope>provided</scope>删掉 -->
|
||||
<!-- begin 注意:这几个依赖体积较大,每个约50MB。若发布时需要使用,请将 <scope>provided</scope> 删除 -->
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-scripting-jsr223</artifactId>
|
||||
@ -101,7 +105,13 @@
|
||||
<version>${liteflow.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<!-- end 这两个依赖太多每个包50M左右,如果你发布需要使用,请把<scope>provided</scope>删掉 -->
|
||||
<dependency>
|
||||
<groupId>com.yomahub</groupId>
|
||||
<artifactId>liteflow-script-python</artifactId>
|
||||
<version>${liteflow.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<!-- end 注意:这几个依赖体积较大,每个约50MB。若发布时需要使用,请将 <scope>provided</scope> 删除 -->
|
||||
|
||||
<!-- aiflow 脚本依赖 -->
|
||||
<dependency>
|
||||
@ -110,12 +120,6 @@
|
||||
<version>${liteflow.version}</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.yomahub</groupId>
|
||||
<artifactId>liteflow-script-python</artifactId>
|
||||
<version>${liteflow.version}</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.yomahub</groupId>
|
||||
<artifactId>liteflow-script-kotlin</artifactId>
|
||||
|
||||
@ -1,438 +0,0 @@
|
||||
package org.jeecg.modules.dlglong.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.jeecg.common.system.query.MatchTypeEnum;
|
||||
import org.jeecg.common.system.query.QueryCondition;
|
||||
import org.jeecg.common.system.query.QueryGenerator;
|
||||
import org.jeecg.common.constant.VxeSocketConst;
|
||||
import org.jeecg.modules.demo.mock.vxe.websocket.VxeSocket;
|
||||
import org.jeecg.modules.dlglong.entity.MockEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URLDecoder;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @Description: DlMockController
|
||||
* @author: jeecg-boot
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/mock/dlglong")
|
||||
public class DlMockController {
|
||||
|
||||
/**
|
||||
* 模拟更改状态
|
||||
*
|
||||
* @param id
|
||||
* @param status
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/change1")
|
||||
public Result mockChange1(@RequestParam("id") String id, @RequestParam("status") String status) {
|
||||
/* id 为 行的id(rowId),只要获取到rowId,那么只需要调用 VXESocket.sendMessageToAll() 即可 */
|
||||
|
||||
// 封装行数据
|
||||
JSONObject rowData = new JSONObject();
|
||||
// 这个字段就是要更改的行数据ID
|
||||
rowData.put("id", id);
|
||||
// 这个字段就是要更改的列的key和具体的值
|
||||
rowData.put("status", status);
|
||||
// 模拟更改数据
|
||||
this.mockChange(rowData);
|
||||
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟更改拖轮状态
|
||||
*
|
||||
* @param id
|
||||
* @param tugStatus
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/change2")
|
||||
public Result mockChange2(@RequestParam("id") String id, @RequestParam("tug_status") String tugStatus) {
|
||||
/* id 为 行的id(rowId),只要获取到rowId,那么只需要调用 VXESocket.sendMessageToAll() 即可 */
|
||||
|
||||
// 封装行数据
|
||||
JSONObject rowData = new JSONObject();
|
||||
// 这个字段就是要更改的行数据ID
|
||||
rowData.put("id", id);
|
||||
// 这个字段就是要更改的列的key和具体的值
|
||||
JSONObject status = JSON.parseObject(tugStatus);
|
||||
rowData.put("tug_status", status);
|
||||
// 模拟更改数据
|
||||
this.mockChange(rowData);
|
||||
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟更改进度条状态
|
||||
*
|
||||
* @param id
|
||||
* @param progress
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/change3")
|
||||
public Result mockChange3(@RequestParam("id") String id, @RequestParam("progress") String progress) {
|
||||
/* id 为 行的id(rowId),只要获取到rowId,那么只需要调用 VXESocket.sendMessageToAll() 即可 */
|
||||
|
||||
// 封装行数据
|
||||
JSONObject rowData = new JSONObject();
|
||||
// 这个字段就是要更改的行数据ID
|
||||
rowData.put("id", id);
|
||||
// 这个字段就是要更改的列的key和具体的值
|
||||
rowData.put("progress", progress);
|
||||
// 模拟更改数据
|
||||
this.mockChange(rowData);
|
||||
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
private void mockChange(JSONObject rowData) {
|
||||
// 封装socket数据
|
||||
JSONObject socketData = new JSONObject();
|
||||
// 这里的 socketKey 必须要和调度计划页面上写的 socketKey 属性保持一致
|
||||
socketData.put("socketKey", "page-dispatch");
|
||||
// 这里的 args 必须得是一个数组,下标0是行数据,下标1是caseId,一般不用传
|
||||
socketData.put("args", new Object[]{rowData, ""});
|
||||
// 封装消息字符串,这里的 type 必须是 VXESocketConst.TYPE_UVT
|
||||
String message = VxeSocket.packageMessage(VxeSocketConst.TYPE_UVT, socketData);
|
||||
// 调用 sendMessageToAll 发送给所有在线的用户
|
||||
VxeSocket.sendMessageToAll(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟更改【大船待审】状态
|
||||
*
|
||||
* @param status
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/change4")
|
||||
public Result mockChange4(@RequestParam("status") String status) {
|
||||
// 封装socket数据
|
||||
JSONObject socketData = new JSONObject();
|
||||
// 这里的 key 是前端注册时使用的key,必须保持一致
|
||||
socketData.put("key", "dispatch-dcds-status");
|
||||
// 这里的 args 必须得是一个数组,每一位都是注册方法的参数,按顺序传递
|
||||
socketData.put("args", new Object[]{status});
|
||||
|
||||
// 封装消息字符串,这里的 type 必须是 VXESocketConst.TYPE_UVT
|
||||
String message = VxeSocket.packageMessage(VxeSocketConst.TYPE_CSD, socketData);
|
||||
// 调用 sendMessageToAll 发送给所有在线的用户
|
||||
VxeSocket.sendMessageToAll(message);
|
||||
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 【模拟】即时保存单行数据
|
||||
*
|
||||
* @param rowData 行数据,实际使用时可以替换成一个实体类
|
||||
*/
|
||||
@PutMapping("/immediateSaveRow")
|
||||
public Result mockImmediateSaveRow(@RequestBody JSONObject rowData) throws Exception {
|
||||
System.out.println("即时保存.rowData:" + rowData.toJSONString());
|
||||
// 延时1.5秒,模拟网慢堵塞真实感
|
||||
Thread.sleep(500);
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 【模拟】即时保存整个表格的数据
|
||||
*
|
||||
* @param tableData 表格数据(实际使用时可以替换成一个List实体类)
|
||||
*/
|
||||
@PostMapping("/immediateSaveAll")
|
||||
public Result mockImmediateSaveAll(@RequestBody JSONArray tableData) throws Exception {
|
||||
// 【注】:
|
||||
// 1、tableData里包含该页所有的数据
|
||||
// 2、如果你实现了“即时保存”,那么除了新增的数据,其他的都是已经保存过的了,
|
||||
// 不需要再进行一次update操作了,所以可以在前端传数据的时候就遍历判断一下,
|
||||
// 只传新增的数据给后台insert即可,否者将会造成性能上的浪费。
|
||||
// 3、新增的行是没有id的,通过这一点,就可以判断是否是新增的数据
|
||||
|
||||
System.out.println("即时保存.tableData:" + tableData.toJSONString());
|
||||
// 延时1.5秒,模拟网慢堵塞真实感
|
||||
Thread.sleep(1000);
|
||||
return Result.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取模拟数据
|
||||
*
|
||||
* @param pageNo 页码
|
||||
* @param pageSize 页大小
|
||||
* @param parentId 父ID,不传则查询顶级
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/getData")
|
||||
public Result getMockData(
|
||||
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
|
||||
// 父级id,根据父级id查询子级,如果为空则查询顶级
|
||||
@RequestParam(name = "parentId", required = false) String parentId
|
||||
) {
|
||||
// 模拟JSON数据路径
|
||||
String path = "classpath:org/jeecg/modules/dlglong/json/dlglong.json";
|
||||
// 读取JSON数据
|
||||
JSONArray dataList = readJsonData(path);
|
||||
if (dataList == null) {
|
||||
return Result.error("读取数据失败!");
|
||||
}
|
||||
IPage<JSONObject> page = this.queryDataPage(dataList, parentId, pageNo, pageSize);
|
||||
return Result.ok(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取模拟“调度计划”页面的数据
|
||||
*
|
||||
* @param pageNo 页码
|
||||
* @param pageSize 页大小
|
||||
* @param parentId 父ID,不传则查询顶级
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/getDdjhData")
|
||||
public Result getMockDdjhData(
|
||||
// SpringMVC 会自动将参数注入到实体里
|
||||
MockEntity mockEntity,
|
||||
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
|
||||
// 父级id,根据父级id查询子级,如果为空则查询顶级
|
||||
@RequestParam(name = "parentId", required = false) String parentId,
|
||||
@RequestParam(name = "status", required = false) String status,
|
||||
// 高级查询条件
|
||||
@RequestParam(name = "superQueryParams", required = false) String superQueryParams,
|
||||
// 高级查询模式
|
||||
@RequestParam(name = "superQueryMatchType", required = false) String superQueryMatchType,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
// 获取查询条件(前台传递的查询参数)
|
||||
Map<String, String[]> parameterMap = request.getParameterMap();
|
||||
// 遍历输出到控制台
|
||||
System.out.println("\ngetDdjhData - 普通查询条件:");
|
||||
for (String key : parameterMap.keySet()) {
|
||||
System.out.println("-- " + key + ": " + JSON.toJSONString(parameterMap.get(key)));
|
||||
}
|
||||
// 输出高级查询
|
||||
try {
|
||||
System.out.println("\ngetDdjhData - 高级查询条件:");
|
||||
// 高级查询模式
|
||||
MatchTypeEnum matchType = MatchTypeEnum.getByValue(superQueryMatchType);
|
||||
if (matchType == null) {
|
||||
System.out.println("-- 高级查询模式:不识别(" + superQueryMatchType + ")");
|
||||
} else {
|
||||
System.out.println("-- 高级查询模式:" + matchType.getValue());
|
||||
}
|
||||
superQueryParams = URLDecoder.decode(superQueryParams, "UTF-8");
|
||||
List<QueryCondition> conditions = JSON.parseArray(superQueryParams, QueryCondition.class);
|
||||
if (conditions != null) {
|
||||
for (QueryCondition condition : conditions) {
|
||||
System.out.println("-- " + JSON.toJSONString(condition));
|
||||
}
|
||||
} else {
|
||||
System.out.println("-- 没有传递任何高级查询条件");
|
||||
}
|
||||
System.out.println();
|
||||
} catch (Exception e) {
|
||||
log.error("-- 高级查询操作失败:" + superQueryParams, e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
/* 注:实际使用中不用写上面那种繁琐的代码,这里只是为了直观的输出到控制台里而写的示例,
|
||||
使用下面这种写法更简洁方便 */
|
||||
|
||||
// 封装成 MyBatisPlus 能识别的 QueryWrapper,可以直接使用这个对象进行SQL筛选条件拼接
|
||||
// 这个方法也会自动封装高级查询条件,但是高级查询参数名必须是superQueryParams和superQueryMatchType
|
||||
QueryWrapper<MockEntity> queryWrapper = QueryGenerator.initQueryWrapper(mockEntity, parameterMap);
|
||||
System.out.println("queryWrapper: " + queryWrapper.getCustomSqlSegment());
|
||||
|
||||
// 模拟JSON数据路径
|
||||
String path = "classpath:org/jeecg/modules/dlglong/json/ddjh.json";
|
||||
String statusValue = "8";
|
||||
if (statusValue.equals(status)) {
|
||||
path = "classpath:org/jeecg/modules/dlglong/json/ddjh_s8.json";
|
||||
}
|
||||
// 读取JSON数据
|
||||
JSONArray dataList = readJsonData(path);
|
||||
if (dataList == null) {
|
||||
return Result.error("读取数据失败!");
|
||||
}
|
||||
|
||||
IPage<JSONObject> page = this.queryDataPage(dataList, parentId, pageNo, pageSize);
|
||||
// 逐行查询子表数据,用于计算拖轮状态
|
||||
List<JSONObject> records = page.getRecords();
|
||||
for (JSONObject record : records) {
|
||||
Map<String, Integer> tugStatusMap = new HashMap<>(5);
|
||||
String id = record.getString("id");
|
||||
// 查询出主表的拖轮
|
||||
String tugMain = record.getString("tug");
|
||||
// 判断是否有值
|
||||
if (StringUtils.isNotBlank(tugMain)) {
|
||||
// 拖轮根据分号分割
|
||||
String[] tugs = tugMain.split(";");
|
||||
// 查询子表数据
|
||||
List<JSONObject> subRecords = this.queryDataPage(dataList, id, null, null).getRecords();
|
||||
// 遍历子表和拖轮数据,找出进行计算反推拖轮状态
|
||||
for (JSONObject subData : subRecords) {
|
||||
String subTug = subData.getString("tug");
|
||||
if (StringUtils.isNotBlank(subTug)) {
|
||||
for (String tug : tugs) {
|
||||
if (tug.equals(subTug)) {
|
||||
// 计算拖轮状态逻辑
|
||||
int statusCode = 0;
|
||||
|
||||
/* 如果有发船时间、作业开始时间、作业结束时间、回船时间,则主表中的拖轮列中的每个拖轮背景色要即时变色 */
|
||||
|
||||
// 有发船时间,状态 +1
|
||||
String departureTime = subData.getString("departure_time");
|
||||
if (StringUtils.isNotBlank(departureTime)) {
|
||||
statusCode += 1;
|
||||
}
|
||||
// 有作业开始时间,状态 +1
|
||||
String workBeginTime = subData.getString("work_begin_time");
|
||||
if (StringUtils.isNotBlank(workBeginTime)) {
|
||||
statusCode += 1;
|
||||
}
|
||||
// 有作业结束时间,状态 +1
|
||||
String workEndTime = subData.getString("work_end_time");
|
||||
if (StringUtils.isNotBlank(workEndTime)) {
|
||||
statusCode += 1;
|
||||
}
|
||||
// 有回船时间,状态 +1
|
||||
String returnTime = subData.getString("return_time");
|
||||
if (StringUtils.isNotBlank(returnTime)) {
|
||||
statusCode += 1;
|
||||
}
|
||||
// 保存拖轮状态,key是拖轮的值,value是状态,前端根据不同的状态码,显示不同的颜色,这个颜色也可以后台计算完之后返回给前端直接使用
|
||||
tugStatusMap.put(tug, statusCode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 新加一个字段用于保存拖轮状态,不要直接覆盖原来的,这个字段可以不保存到数据库里
|
||||
record.put("tug_status", tugStatusMap);
|
||||
}
|
||||
page.setRecords(records);
|
||||
return Result.ok(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟查询数据,可以根据父ID查询,可以分页
|
||||
*
|
||||
* @param dataList 数据列表
|
||||
* @param parentId 父ID
|
||||
* @param pageNo 页码
|
||||
* @param pageSize 页大小
|
||||
* @return
|
||||
*/
|
||||
private IPage<JSONObject> queryDataPage(JSONArray dataList, String parentId, Integer pageNo, Integer pageSize) {
|
||||
// 根据父级id查询子级
|
||||
JSONArray dataDb = dataList;
|
||||
if (StringUtils.isNotBlank(parentId)) {
|
||||
JSONArray results = new JSONArray();
|
||||
List<String> parentIds = Arrays.asList(parentId.split(","));
|
||||
this.queryByParentId(dataDb, parentIds, results);
|
||||
dataDb = results;
|
||||
}
|
||||
// 模拟分页(实际中应用SQL自带的分页)
|
||||
List<JSONObject> records = new ArrayList<>();
|
||||
IPage<JSONObject> page;
|
||||
long beginIndex, endIndex;
|
||||
// 如果任意一个参数为null,则不分页
|
||||
if (pageNo == null || pageSize == null) {
|
||||
page = new Page<>(0, dataDb.size());
|
||||
beginIndex = 0;
|
||||
endIndex = dataDb.size();
|
||||
} else {
|
||||
page = new Page<>(pageNo, pageSize);
|
||||
beginIndex = page.offset();
|
||||
endIndex = page.offset() + page.getSize();
|
||||
}
|
||||
for (long i = beginIndex; (i < endIndex && i < dataDb.size()); i++) {
|
||||
JSONObject data = dataDb.getJSONObject((int) i);
|
||||
data = JSON.parseObject(data.toJSONString());
|
||||
// 不返回 children
|
||||
data.remove("children");
|
||||
records.add(data);
|
||||
}
|
||||
page.setRecords(records);
|
||||
page.setTotal(dataDb.size());
|
||||
return page;
|
||||
}
|
||||
|
||||
private void queryByParentId(JSONArray dataList, List<String> parentIds, JSONArray results) {
|
||||
for (int i = 0; i < dataList.size(); i++) {
|
||||
JSONObject data = dataList.getJSONObject(i);
|
||||
JSONArray children = data.getJSONArray("children");
|
||||
// 找到了该父级
|
||||
if (parentIds.contains(data.getString("id"))) {
|
||||
if (children != null) {
|
||||
// addAll 的目的是将多个子表的数据合并在一起
|
||||
results.addAll(children);
|
||||
}
|
||||
} else {
|
||||
if (children != null) {
|
||||
queryByParentId(children, parentIds, results);
|
||||
}
|
||||
}
|
||||
}
|
||||
results.addAll(new JSONArray());
|
||||
}
|
||||
|
||||
private JSONArray readJsonData(String path) {
|
||||
try {
|
||||
InputStream stream = getClass().getClassLoader().getResourceAsStream(path.replace("classpath:", ""));
|
||||
if (stream != null) {
|
||||
String json = IOUtils.toString(stream, "UTF-8");
|
||||
return JSON.parseArray(json);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取车辆最后一个位置
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/findLatestCarLngLat")
|
||||
public List findLatestCarLngLat() {
|
||||
// 模拟JSON数据路径
|
||||
String path = "classpath:org/jeecg/modules/dlglong/json/CarLngLat.json";
|
||||
// 读取JSON数据
|
||||
return readJsonData(path);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取车辆最后一个位置
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/findCarTrace")
|
||||
public List findCarTrace() {
|
||||
// 模拟JSON数据路径
|
||||
String path = "classpath:org/jeecg/modules/dlglong/json/CarTrace.json";
|
||||
// 读取JSON数据
|
||||
return readJsonData(path);
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,27 +0,0 @@
|
||||
package org.jeecg.modules.dlglong.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 模拟实体
|
||||
* @author: jeecg-boot
|
||||
*/
|
||||
@Data
|
||||
public class MockEntity {
|
||||
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
private String id;
|
||||
/**
|
||||
* 父级ID
|
||||
*/
|
||||
private String parentId;
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/* -- 省略其他字段 -- */
|
||||
|
||||
}
|
||||
@ -1,14 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "6891ba44421aa907bcb7390c",
|
||||
"alarm": "0",
|
||||
"altitude": "13",
|
||||
"direction": "0",
|
||||
"latitude": "38.918739",
|
||||
"longitude": "117.758737",
|
||||
"speed": "11",
|
||||
"status": "4980739",
|
||||
"timestamp": "2025-08-05T16:01:07",
|
||||
"imei": "18441136860"
|
||||
}
|
||||
]
|
||||
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 622 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 244 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 247 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 262 B After Width: | Height: | Size: 187 B |
|
Before Width: | Height: | Size: 1001 B After Width: | Height: | Size: 992 B |
|
Before Width: | Height: | Size: 380 B After Width: | Height: | Size: 333 B |
|
Before Width: | Height: | Size: 338 B After Width: | Height: | Size: 259 B |
|
Before Width: | Height: | Size: 280 B After Width: | Height: | Size: 209 B |
|
Before Width: | Height: | Size: 1015 B After Width: | Height: | Size: 1014 B |
|
Before Width: | Height: | Size: 709 B After Width: | Height: | Size: 383 B |
|
Before Width: | Height: | Size: 159 KiB After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 183 B After Width: | Height: | Size: 164 B |
|
Before Width: | Height: | Size: 273 B After Width: | Height: | Size: 186 B |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 251 B After Width: | Height: | Size: 159 B |
|
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 159 B |
|
Before Width: | Height: | Size: 333 B After Width: | Height: | Size: 307 B |
|
Before Width: | Height: | Size: 529 B After Width: | Height: | Size: 478 B |
|
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 182 B |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 317 B After Width: | Height: | Size: 302 B |
|
Before Width: | Height: | Size: 367 B After Width: | Height: | Size: 335 B |
|
Before Width: | Height: | Size: 499 B After Width: | Height: | Size: 497 B |
|
Before Width: | Height: | Size: 557 B After Width: | Height: | Size: 436 B |
|
Before Width: | Height: | Size: 711 B After Width: | Height: | Size: 512 B |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 182 B After Width: | Height: | Size: 134 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 328 B After Width: | Height: | Size: 227 B |
|
Before Width: | Height: | Size: 309 B After Width: | Height: | Size: 225 B |
|
Before Width: | Height: | Size: 166 B After Width: | Height: | Size: 159 B |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 701 B After Width: | Height: | Size: 701 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 205 B |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 701 B After Width: | Height: | Size: 701 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 4.2 KiB |
@ -1,370 +0,0 @@
|
||||
{
|
||||
"list": [
|
||||
{
|
||||
"key": "1717072932495_439966",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"isContainer": true,
|
||||
"list": [
|
||||
{
|
||||
"type": "input",
|
||||
"name": "名称",
|
||||
"className": "form-input",
|
||||
"icon": "icon-input",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"width": "100%",
|
||||
"defaultValue": "",
|
||||
"required": true,
|
||||
"dataType": null,
|
||||
"pattern": "",
|
||||
"placeholder": "",
|
||||
"clearable": false,
|
||||
"readonly": false,
|
||||
"disabled": false,
|
||||
"fillRuleCode": "",
|
||||
"showPassword": false,
|
||||
"unique": false,
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"remoteAPI": {
|
||||
"url": "",
|
||||
"executed": false
|
||||
},
|
||||
"key": "1717072932495_556479",
|
||||
"model": "input_1717072932495_556479",
|
||||
"modelType": "main",
|
||||
"rules": [
|
||||
{
|
||||
"required": true,
|
||||
"message": "${title}必须填写"
|
||||
}
|
||||
],
|
||||
"isSubItem": false
|
||||
},
|
||||
{
|
||||
"type": "number",
|
||||
"name": "数字",
|
||||
"className": "form-number",
|
||||
"icon": "icon-number",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"width": "",
|
||||
"required": false,
|
||||
"defaultValue": 0,
|
||||
"placeholder": "",
|
||||
"controls": false,
|
||||
"min": 0,
|
||||
"minUnlimited": true,
|
||||
"max": 100,
|
||||
"maxUnlimited": true,
|
||||
"step": 1,
|
||||
"disabled": false,
|
||||
"controlsPosition": "right",
|
||||
"unitText": "",
|
||||
"unitPosition": "suffix",
|
||||
"showPercent": false,
|
||||
"align": "left",
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "number",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"remoteAPI": {
|
||||
"url": "",
|
||||
"executed": false
|
||||
},
|
||||
"key": "1717072985868_606195",
|
||||
"model": "number_1717072985868_606195",
|
||||
"modelType": "main",
|
||||
"rules": [],
|
||||
"isSubItem": false
|
||||
}
|
||||
],
|
||||
"options": {
|
||||
"required": false,
|
||||
"hiddenOnAdd": false,
|
||||
"hidden": false,
|
||||
"fieldNote": ""
|
||||
},
|
||||
"model": "card_1717072932495_439966",
|
||||
"hideTitle": false,
|
||||
"modelType": "main"
|
||||
},
|
||||
{
|
||||
"key": "1717072988159_545097",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"isContainer": true,
|
||||
"list": [
|
||||
{
|
||||
"type": "money",
|
||||
"name": "金额",
|
||||
"className": "form-money",
|
||||
"icon": "icon-money",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"width": "180px",
|
||||
"placeholder": "请输入金额",
|
||||
"required": false,
|
||||
"unitText": "元",
|
||||
"unitPosition": "suffix",
|
||||
"precision": 2,
|
||||
"hidden": false,
|
||||
"disabled": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "number",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"remoteAPI": {
|
||||
"url": "",
|
||||
"executed": false
|
||||
},
|
||||
"key": "1717072988159_568693",
|
||||
"model": "money_1717072988159_568693",
|
||||
"modelType": "main",
|
||||
"rules": [],
|
||||
"isSubItem": false
|
||||
},
|
||||
{
|
||||
"type": "select",
|
||||
"name": "下拉选择框",
|
||||
"className": "form-select",
|
||||
"icon": "icon-select",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"defaultValue": "",
|
||||
"multiple": false,
|
||||
"disabled": false,
|
||||
"clearable": true,
|
||||
"placeholder": "",
|
||||
"required": false,
|
||||
"showLabel": false,
|
||||
"showType": "default",
|
||||
"width": "",
|
||||
"useColor": false,
|
||||
"colorIteratorIndex": 3,
|
||||
"options": [
|
||||
{
|
||||
"value": "下拉框1",
|
||||
"itemColor": "#2196F3"
|
||||
},
|
||||
{
|
||||
"value": "下拉框2",
|
||||
"itemColor": "#08C9C9"
|
||||
},
|
||||
{
|
||||
"value": "下拉框3",
|
||||
"itemColor": "#00C345"
|
||||
}
|
||||
],
|
||||
"remote": false,
|
||||
"filterable": false,
|
||||
"remoteOptions": [],
|
||||
"props": {
|
||||
"value": "value",
|
||||
"label": "label"
|
||||
},
|
||||
"remoteFunc": "",
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": ",",
|
||||
"customConfig": true
|
||||
}
|
||||
},
|
||||
"remoteAPI": {
|
||||
"url": "",
|
||||
"executed": false
|
||||
},
|
||||
"key": "1717072991431_622198",
|
||||
"model": "select_1717072991431_622198",
|
||||
"modelType": "main",
|
||||
"rules": [],
|
||||
"isSubItem": false
|
||||
}
|
||||
],
|
||||
"options": {
|
||||
"required": false,
|
||||
"hiddenOnAdd": false,
|
||||
"hidden": false,
|
||||
"fieldNote": ""
|
||||
},
|
||||
"model": "card_1717072988159_545097",
|
||||
"hideTitle": false,
|
||||
"modelType": "main"
|
||||
},
|
||||
{
|
||||
"key": "1717072932495_382575",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"isContainer": true,
|
||||
"list": [
|
||||
{
|
||||
"type": "imgupload",
|
||||
"name": "图片上传",
|
||||
"className": "form-tupian",
|
||||
"icon": "icon-tupian",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"defaultValue": [],
|
||||
"size": {
|
||||
"width": 100,
|
||||
"height": 100
|
||||
},
|
||||
"width": "",
|
||||
"tokenFunc": "funcGetToken",
|
||||
"token": "",
|
||||
"domain": "http://img.h5huodong.com",
|
||||
"disabled": false,
|
||||
"length": 9,
|
||||
"multiple": true,
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"required": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"key": "1717072996509_795340",
|
||||
"model": "imgupload_1717072996509_795340",
|
||||
"modelType": "main",
|
||||
"rules": [],
|
||||
"isSubItem": false
|
||||
},
|
||||
{
|
||||
"type": "file-upload",
|
||||
"name": "附件",
|
||||
"className": "form-file-upload",
|
||||
"icon": "icon-shangchuan",
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"defaultValue": [],
|
||||
"token": "",
|
||||
"length": 1,
|
||||
"drag": false,
|
||||
"multiple": false,
|
||||
"disabled": false,
|
||||
"buttonText": "添加附件",
|
||||
"tokenFunc": "funcGetToken",
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"required": false,
|
||||
"fieldNote": "",
|
||||
"autoWidth": 50
|
||||
},
|
||||
"key": "1717072932495_669325",
|
||||
"model": "file_upload_1717072932495_669325",
|
||||
"modelType": "main",
|
||||
"rules": [],
|
||||
"isSubItem": false
|
||||
}
|
||||
],
|
||||
"options": {
|
||||
"required": false,
|
||||
"hiddenOnAdd": false,
|
||||
"hidden": false,
|
||||
"fieldNote": ""
|
||||
},
|
||||
"model": "card_1717072932495_382575",
|
||||
"hideTitle": false,
|
||||
"modelType": "main"
|
||||
}
|
||||
],
|
||||
"config": {
|
||||
"titleField": "input_1717072932495_556479",
|
||||
"showHeaderTitle": true,
|
||||
"labelWidth": 100,
|
||||
"labelPosition": "top",
|
||||
"size": "small",
|
||||
"dialogOptions": {
|
||||
"top": 20,
|
||||
"width": 1000,
|
||||
"padding": {
|
||||
"top": 25,
|
||||
"right": 25,
|
||||
"bottom": 30,
|
||||
"left": 25
|
||||
}
|
||||
},
|
||||
"disabledAutoGrid": false,
|
||||
"designMobileView": false,
|
||||
"enableComment": true,
|
||||
"hasWidgets": [
|
||||
"input",
|
||||
"number",
|
||||
"card",
|
||||
"money",
|
||||
"select",
|
||||
"imgupload",
|
||||
"file-upload"
|
||||
],
|
||||
"expand": {
|
||||
"js": "",
|
||||
"css": "",
|
||||
"url": {
|
||||
"js": "",
|
||||
"css": ""
|
||||
}
|
||||
},
|
||||
"transactional": true,
|
||||
"customRequestURL": [
|
||||
{
|
||||
"url": ""
|
||||
}
|
||||
],
|
||||
"allowExternalLink": false,
|
||||
"externalLinkShowData": false,
|
||||
"headerImgUrl": "",
|
||||
"externalTitle": "",
|
||||
"enableNotice": false,
|
||||
"noticeMode": "external",
|
||||
"noticeType": "system",
|
||||
"noticeReceiver": "",
|
||||
"allowPrint": false,
|
||||
"allowJmReport": false,
|
||||
"jmReportURL": "",
|
||||
"bizRuleConfig": [],
|
||||
"bigDataMode": false
|
||||
}
|
||||
}
|
||||
@ -1,496 +0,0 @@
|
||||
{
|
||||
"list": [
|
||||
{
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"required": false
|
||||
},
|
||||
"isContainer": true,
|
||||
"model": "card_1717072902303_783177",
|
||||
"modelType": "main",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"list": [
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"executed": false,
|
||||
"url": ""
|
||||
},
|
||||
"icon": "icon-input",
|
||||
"className": "form-input",
|
||||
"rules": [
|
||||
{
|
||||
"required": true,
|
||||
"message": "${title}必须填写"
|
||||
}
|
||||
],
|
||||
"modelType": "main",
|
||||
"type": "input",
|
||||
"hideTitle": false,
|
||||
"name": "名称",
|
||||
"options": {
|
||||
"clearable": false,
|
||||
"hidden": false,
|
||||
"defaultValue": "",
|
||||
"pattern": "",
|
||||
"fillRuleCode": "",
|
||||
"fieldNote": "",
|
||||
"required": true,
|
||||
"readonly": false,
|
||||
"unique": false,
|
||||
"hiddenOnAdd": false,
|
||||
"width": "100%",
|
||||
"autoWidth": 100,
|
||||
"showPassword": false,
|
||||
"disabled": false,
|
||||
"placeholder": ""
|
||||
},
|
||||
"model": "input_1717072902303_477529",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"key": "1717072902303_477529"
|
||||
}
|
||||
],
|
||||
"key": "1717072902303_783177"
|
||||
},
|
||||
{
|
||||
"options": {
|
||||
"required": false,
|
||||
"hiddenOnAdd": false,
|
||||
"hidden": false,
|
||||
"fieldNote": ""
|
||||
},
|
||||
"isContainer": true,
|
||||
"model": "card_1717073019436_526262",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"list": [
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"executed": false,
|
||||
"url": ""
|
||||
},
|
||||
"icon": "icon-number",
|
||||
"className": "form-number",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "number",
|
||||
"hideTitle": false,
|
||||
"name": "数字",
|
||||
"options": {
|
||||
"controls": false,
|
||||
"showPercent": false,
|
||||
"hidden": false,
|
||||
"max": 100,
|
||||
"defaultValue": 0,
|
||||
"unitPosition": "suffix",
|
||||
"fieldNote": "",
|
||||
"maxUnlimited": true,
|
||||
"align": "left",
|
||||
"required": false,
|
||||
"min": 0,
|
||||
"minUnlimited": true,
|
||||
"hiddenOnAdd": false,
|
||||
"width": "",
|
||||
"autoWidth": 50,
|
||||
"step": 1,
|
||||
"disabled": false,
|
||||
"placeholder": "",
|
||||
"controlsPosition": "right",
|
||||
"unitText": ""
|
||||
},
|
||||
"model": "number_1717073019436_586474",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "number",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"key": "1717073019436_586474"
|
||||
},
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"executed": false,
|
||||
"url": ""
|
||||
},
|
||||
"icon": "icon-money",
|
||||
"className": "form-money",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "money",
|
||||
"hideTitle": false,
|
||||
"name": "金额",
|
||||
"options": {
|
||||
"hidden": false,
|
||||
"precision": 2,
|
||||
"hiddenOnAdd": false,
|
||||
"width": "180px",
|
||||
"autoWidth": 50,
|
||||
"unitPosition": "suffix",
|
||||
"disabled": false,
|
||||
"fieldNote": "",
|
||||
"placeholder": "请输入金额",
|
||||
"required": false,
|
||||
"unitText": "元"
|
||||
},
|
||||
"model": "money_1717073021100_526660",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "number",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"key": "1717073021100_526660"
|
||||
}
|
||||
],
|
||||
"key": "1717073019436_526262",
|
||||
"hideTitle": false,
|
||||
"modelType": "main"
|
||||
},
|
||||
{
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"required": false
|
||||
},
|
||||
"isContainer": true,
|
||||
"model": "card_1717072902303_118977",
|
||||
"modelType": "main",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"list": [
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"executed": false,
|
||||
"url": ""
|
||||
},
|
||||
"icon": "icon-select",
|
||||
"className": "form-select",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "select",
|
||||
"hideTitle": false,
|
||||
"name": "下拉选择框",
|
||||
"options": {
|
||||
"remoteFunc": "",
|
||||
"filterable": false,
|
||||
"clearable": true,
|
||||
"hidden": false,
|
||||
"defaultValue": "",
|
||||
"remoteOptions": [],
|
||||
"multiple": false,
|
||||
"fieldNote": "",
|
||||
"remote": false,
|
||||
"required": false,
|
||||
"showLabel": false,
|
||||
"useColor": false,
|
||||
"props": {
|
||||
"label": "label",
|
||||
"value": "value"
|
||||
},
|
||||
"colorIteratorIndex": 3,
|
||||
"hiddenOnAdd": false,
|
||||
"width": "",
|
||||
"options": [
|
||||
{
|
||||
"itemColor": "#2196F3",
|
||||
"value": "下拉框1"
|
||||
},
|
||||
{
|
||||
"itemColor": "#08C9C9",
|
||||
"value": "下拉框2"
|
||||
},
|
||||
{
|
||||
"itemColor": "#00C345",
|
||||
"value": "下拉框3"
|
||||
}
|
||||
],
|
||||
"autoWidth": 50,
|
||||
"showType": "default",
|
||||
"disabled": false,
|
||||
"placeholder": ""
|
||||
},
|
||||
"model": "select_1717073033259_273399",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": ",",
|
||||
"customConfig": true
|
||||
}
|
||||
},
|
||||
"key": "1717073033259_273399"
|
||||
},
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"executed": false,
|
||||
"url": ""
|
||||
},
|
||||
"icon": "icon-textarea",
|
||||
"className": "form-textarea",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "textarea",
|
||||
"hideTitle": false,
|
||||
"name": "描述",
|
||||
"options": {
|
||||
"readonly": false,
|
||||
"hidden": false,
|
||||
"defaultValue": "",
|
||||
"unique": false,
|
||||
"hiddenOnAdd": false,
|
||||
"width": "100%",
|
||||
"pattern": "",
|
||||
"autoWidth": 50,
|
||||
"disabled": false,
|
||||
"fieldNote": "",
|
||||
"placeholder": "",
|
||||
"required": false
|
||||
},
|
||||
"model": "textarea_1717072902303_129466",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": false
|
||||
}
|
||||
},
|
||||
"key": "1717072902303_129466"
|
||||
}
|
||||
],
|
||||
"key": "1717072902303_118977"
|
||||
},
|
||||
{
|
||||
"hideTitle": false,
|
||||
"options": {
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": "",
|
||||
"required": false
|
||||
},
|
||||
"isContainer": true,
|
||||
"model": "card_1717072902304_736053",
|
||||
"modelType": "main",
|
||||
"type": "card",
|
||||
"isAutoGrid": true,
|
||||
"list": [
|
||||
{
|
||||
"hideTitle": false,
|
||||
"isSubItem": false,
|
||||
"name": "图片上传",
|
||||
"icon": "icon-tupian",
|
||||
"options": {
|
||||
"hidden": false,
|
||||
"defaultValue": [],
|
||||
"length": 9,
|
||||
"multiple": true,
|
||||
"fieldNote": "",
|
||||
"required": false,
|
||||
"token": "",
|
||||
"size": {
|
||||
"width": 100,
|
||||
"height": 100
|
||||
},
|
||||
"tokenFunc": "funcGetToken",
|
||||
"domain": "http://img.h5huodong.com",
|
||||
"hiddenOnAdd": false,
|
||||
"width": "",
|
||||
"autoWidth": 50,
|
||||
"disabled": false
|
||||
},
|
||||
"className": "form-tupian",
|
||||
"model": "imgupload_1717073025137_563739",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "imgupload",
|
||||
"key": "1717073025137_563739"
|
||||
},
|
||||
{
|
||||
"hideTitle": false,
|
||||
"isSubItem": false,
|
||||
"name": "附件",
|
||||
"icon": "icon-shangchuan",
|
||||
"options": {
|
||||
"buttonText": "添加附件",
|
||||
"hidden": false,
|
||||
"defaultValue": [],
|
||||
"length": 1,
|
||||
"multiple": false,
|
||||
"fieldNote": "",
|
||||
"required": false,
|
||||
"token": "",
|
||||
"tokenFunc": "funcGetToken",
|
||||
"hiddenOnAdd": false,
|
||||
"autoWidth": 50,
|
||||
"disabled": false,
|
||||
"drag": false
|
||||
},
|
||||
"className": "form-file-upload",
|
||||
"model": "file_upload_1717072902304_442777",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "file-upload",
|
||||
"key": "1717072902304_442777"
|
||||
}
|
||||
],
|
||||
"key": "1717072902304_736053"
|
||||
},
|
||||
{
|
||||
"isSubItem": false,
|
||||
"remoteAPI": {
|
||||
"url": "",
|
||||
"executed": false
|
||||
},
|
||||
"icon": "icon-link",
|
||||
"className": "form-link-record",
|
||||
"rules": [],
|
||||
"modelType": "main",
|
||||
"type": "link-record",
|
||||
"hideTitle": false,
|
||||
"name": "主表@表单控件",
|
||||
"options": {
|
||||
"sourceCode": "ai_control_main",
|
||||
"showMode": "single",
|
||||
"showType": "card",
|
||||
"titleField": "wen_ben",
|
||||
"showFields": [],
|
||||
"allowView": true,
|
||||
"allowEdit": true,
|
||||
"allowAdd": true,
|
||||
"allowSelect": true,
|
||||
"buttonText": "添加记录",
|
||||
"twoWayModel": "sub_table_design_1717137038626_791984",
|
||||
"dataSelectAuth": "all",
|
||||
"filters": [
|
||||
{
|
||||
"matchType": "AND",
|
||||
"rules": []
|
||||
}
|
||||
],
|
||||
"search": {
|
||||
"enabled": false,
|
||||
"field": "",
|
||||
"rule": "like",
|
||||
"afterShow": false,
|
||||
"fields": []
|
||||
},
|
||||
"createMode": {
|
||||
"add": true,
|
||||
"select": false,
|
||||
"params": {
|
||||
"selectLinkModel": ""
|
||||
}
|
||||
},
|
||||
"width": "100%",
|
||||
"defaultValue": "",
|
||||
"defaultValType": "none",
|
||||
"required": false,
|
||||
"disabled": false,
|
||||
"hidden": false,
|
||||
"hiddenOnAdd": false,
|
||||
"fieldNote": ""
|
||||
},
|
||||
"model": "link_record_1717137044235_306956",
|
||||
"advancedSetting": {
|
||||
"defaultValue": {
|
||||
"type": "compose",
|
||||
"value": "",
|
||||
"format": "string",
|
||||
"allowFunc": true,
|
||||
"valueSplit": "",
|
||||
"customConfig": true
|
||||
}
|
||||
},
|
||||
"key": "1717137044235_306956"
|
||||
}
|
||||
],
|
||||
"config": {
|
||||
"jmReportURL": "",
|
||||
"enableComment": true,
|
||||
"dialogOptions": {
|
||||
"padding": {
|
||||
"top": 25,
|
||||
"left": 25,
|
||||
"bottom": 30,
|
||||
"right": 25
|
||||
},
|
||||
"top": 20,
|
||||
"width": 1000
|
||||
},
|
||||
"allowJmReport": false,
|
||||
"labelWidth": 100,
|
||||
"headerImgUrl": "",
|
||||
"noticeMode": "external",
|
||||
"noticeReceiver": "",
|
||||
"designMobileView": false,
|
||||
"labelPosition": "top",
|
||||
"allowPrint": false,
|
||||
"enableNotice": false,
|
||||
"bizRuleConfig": [],
|
||||
"showHeaderTitle": true,
|
||||
"bigDataMode": false,
|
||||
"titleField": "input_1717072902303_477529",
|
||||
"externalTitle": "",
|
||||
"noticeType": "system",
|
||||
"customRequestURL": [
|
||||
{
|
||||
"url": ""
|
||||
}
|
||||
],
|
||||
"hasWidgets": [
|
||||
"input",
|
||||
"card",
|
||||
"number",
|
||||
"money",
|
||||
"select",
|
||||
"textarea",
|
||||
"imgupload",
|
||||
"file-upload",
|
||||
"link-record"
|
||||
],
|
||||
"expand": {
|
||||
"css": "",
|
||||
"js": "",
|
||||
"url": {
|
||||
"css": "",
|
||||
"js": ""
|
||||
}
|
||||
},
|
||||
"size": "small",
|
||||
"disabledAutoGrid": false,
|
||||
"allowExternalLink": false,
|
||||
"externalLinkShowData": false,
|
||||
"transactional": true
|
||||
}
|
||||
}
|
||||
@ -40,11 +40,11 @@
|
||||
<groupId>org.jeecgframework.jimureport</groupId>
|
||||
<artifactId>jimureport-spring-boot3-starter</artifactId>
|
||||
</dependency>
|
||||
<!-- 积木报表 csv excel ES JSON mongodbSQL redis支持包-->
|
||||
<!-- 积木报表 csv excel ES JSON mongodbSQL redis支持包
|
||||
<dependency>
|
||||
<groupId>org.jeecgframework.jimureport</groupId>
|
||||
<artifactId>jimureport-nosql-starter</artifactId>
|
||||
</dependency>
|
||||
</dependency>-->
|
||||
<!-- 后台导出接口Echart图表支持包,按需引入
|
||||
<dependency>
|
||||
<groupId>org.jeecgframework.jimureport</groupId>
|
||||
|
||||
@ -225,6 +225,42 @@ public class SysUserController {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加用户【后台租户模式专用,敲敲云不要用这个】
|
||||
*
|
||||
* @param jsonObject
|
||||
* @return
|
||||
*/
|
||||
@RequiresPermissions("system:user:addTenantUser")
|
||||
@RequestMapping(value = "/addTenantUser", method = RequestMethod.POST)
|
||||
public Result<SysUser> addTenantUser(@RequestBody JSONObject jsonObject) {
|
||||
Result<SysUser> result = new Result<SysUser>();
|
||||
String selectedRoles = jsonObject.getString("selectedroles");
|
||||
String selectedDeparts = jsonObject.getString("selecteddeparts");
|
||||
try {
|
||||
SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class);
|
||||
user.setCreateTime(new Date());//设置创建时间
|
||||
String salt = oConvertUtils.randomGen(8);
|
||||
user.setSalt(salt);
|
||||
String passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), salt);
|
||||
user.setPassword(passwordEncode);
|
||||
user.setStatus(1);
|
||||
user.setDelFlag(CommonConstant.DEL_FLAG_0);
|
||||
//用户表字段org_code不能在这里设置他的值
|
||||
user.setOrgCode(null);
|
||||
// 保存用户走一个service 保证事务
|
||||
//获取租户ids
|
||||
String relTenantIds = jsonObject.getString("relTenantIds");
|
||||
sysUserService.saveUser(user, selectedRoles, selectedDeparts, relTenantIds, true);
|
||||
baseCommonService.addLog("添加用户,username: " + user.getUsername(), CommonConstant.LOG_TYPE_2, 2);
|
||||
result.success("添加成功!");
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
result.error500("操作失败");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除用户
|
||||
*/
|
||||
|
||||
@ -74,17 +74,17 @@
|
||||
<update id="updateUserDepart">
|
||||
UPDATE sys_user SET
|
||||
<if test="orgCode!=null and loginTenantId!=null">
|
||||
org_code = #{orgCode}
|
||||
,login_tenant_id = #{loginTenantId}
|
||||
org_code = #{orgCode, jdbcType=VARCHAR}
|
||||
,login_tenant_id = #{loginTenantId, jdbcType=VARCHAR}
|
||||
</if>
|
||||
<if test="orgCode==null and loginTenantId!=null">
|
||||
login_tenant_id = #{loginTenantId}
|
||||
login_tenant_id = #{loginTenantId, jdbcType=VARCHAR}
|
||||
</if>
|
||||
<if test="orgCode!=null and loginTenantId==null">
|
||||
org_code = #{orgCode}
|
||||
org_code = #{orgCode, jdbcType=VARCHAR}
|
||||
</if>
|
||||
<if test="orgCode==null and loginTenantId==null">
|
||||
org_code = #{orgCode}
|
||||
org_code = #{orgCode, jdbcType=VARCHAR}
|
||||
</if>
|
||||
where username = #{username}
|
||||
</update>
|
||||
|
||||
@ -11,7 +11,7 @@ import org.jeecgframework.codegenerate.window.CodeWindow;
|
||||
*/
|
||||
public class JeecgOneGUI {
|
||||
|
||||
/** 使用手册: https://help.jeecg.com/vue3/codegen/gui.html */
|
||||
/** 使用手册: https://help.jeecg.com/java/codegen/gui */
|
||||
public static void main(String[] args) {
|
||||
new CodeWindow().pack();
|
||||
}
|
||||
|
||||
@ -0,0 +1 @@
|
||||
update sys_depart set org_category = '2' where org_category ='1' and parent_id is not null
|
||||
@ -0,0 +1 @@
|
||||
INSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930223114757611522', '1890213291321749505', 'AI流程测试', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:debug', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-01 19:20:08', NULL, NULL, 0, 0, '1', 0);
|
||||
@ -20,6 +20,7 @@ spring:
|
||||
password: @config.password@
|
||||
config:
|
||||
import:
|
||||
- optional:classpath:config/application-liteflow.yml
|
||||
- optional:nacos:jeecg.yaml
|
||||
- optional:nacos:jeecg-@profile.name@.yaml
|
||||
# #shardingjdbc数据源
|
||||
|
||||
@ -63,7 +63,6 @@
|
||||
"path-to-regexp": "^6.3.0",
|
||||
"pinia": "2.1.7",
|
||||
"print-js": "^1.6.0",
|
||||
"pinyin-pro": "^3.27.0",
|
||||
"qs": "^6.14.0",
|
||||
"qrcode": "^1.5.4",
|
||||
"resize-observer-polyfill": "^1.5.1",
|
||||
@ -142,7 +141,7 @@
|
||||
"prettier": "^3.6.2",
|
||||
"pretty-quick": "^4.2.2",
|
||||
"rimraf": "^5.0.10",
|
||||
"rollup": "4.52.4",
|
||||
"rollup": "4.52.5",
|
||||
"rollup-plugin-visualizer": "5.14.0",
|
||||
"stylelint": "^16.25.0",
|
||||
"stylelint-config-prettier": "^9.0.5",
|
||||
@ -167,7 +166,7 @@
|
||||
"vite-plugin-qiankun": "^1.0.15",
|
||||
"@rys-fe/vite-plugin-theme": "^0.8.6",
|
||||
"vite-plugin-vue-setup-extend-plus": "^0.1.0",
|
||||
"unocss": "^66.5.2",
|
||||
"unocss": "^0.58.9",
|
||||
"vue-eslint-parser": "^9.4.3",
|
||||
"vue-tsc": "^1.8.27",
|
||||
"dingtalk-jsapi": "^3.2.0",
|
||||
|
||||
813
jeecgboot-vue3/pnpm-lock.yaml
generated
@ -1,14 +1,14 @@
|
||||
/**
|
||||
* @description: menu type
|
||||
* @description: 默认四种菜单主题
|
||||
*/
|
||||
export enum MenuTypeEnum {
|
||||
// left menu
|
||||
// 左侧边菜单导航风格
|
||||
SIDEBAR = 'sidebar',
|
||||
|
||||
MIX_SIDEBAR = 'mix-sidebar',
|
||||
// mixin menu
|
||||
// 顶部栏导航风格
|
||||
MIX = 'mix',
|
||||
// top menu
|
||||
// 侧边折叠导航风格
|
||||
MIX_SIDEBAR = 'mix-sidebar',
|
||||
//顶部混合导航风格
|
||||
TOP_MENU = 'top-menu',
|
||||
}
|
||||
|
||||
|
||||
@ -9,8 +9,7 @@ import { changeTheme } from '/@/logics/theme';
|
||||
import { updateDarkTheme } from '/@/logics/theme/dark';
|
||||
import { useRootSetting } from '/@/hooks/setting/useRootSetting';
|
||||
import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';
|
||||
import { HEADER_PRESET_BG_COLOR_LIST, SIDE_BAR_BG_COLOR_LIST } from '/@/settings/designSetting';
|
||||
import { getThemeColorByMenuType } from '/@/utils/getThemeColorByMenuType';
|
||||
import { getConfigByMenuType } from '../../../utils/getConfigByMenuType';
|
||||
import { isObject } from '/@/utils/is';
|
||||
import { ThemeEnum } from '/@/enums/appEnum';
|
||||
import { APP__THEME__COLOR } from '/@/enums/cacheEnum';
|
||||
@ -27,10 +26,10 @@ export function layoutHandler(event: HandlerEnum, value: any) {
|
||||
const appStore = useAppStore();
|
||||
const darkMode = appStore.getDarkMode === ThemeEnum.DARK;
|
||||
// 根据菜单类型动态获取主题色
|
||||
const dynamicThemeColor = getThemeColorByMenuType(value.type);
|
||||
const {themeColor: dynamicThemeColor, headerBgColor, sideBgColor } = getConfigByMenuType(value.type);
|
||||
if (isHTopMenu) {
|
||||
baseHandler(event, value);
|
||||
baseHandler(HandlerEnum.HEADER_THEME, HEADER_PRESET_BG_COLOR_LIST[4]);
|
||||
baseHandler(HandlerEnum.HEADER_THEME, headerBgColor);
|
||||
baseHandler(HandlerEnum.CHANGE_THEME_COLOR, dynamicThemeColor);
|
||||
if (darkMode) {
|
||||
updateHeaderBgColor();
|
||||
@ -39,8 +38,8 @@ export function layoutHandler(event: HandlerEnum, value: any) {
|
||||
baseHandler(HandlerEnum.TABS_THEME, tabsThemeOptions[1].value);
|
||||
} else if (isMixMenu) {
|
||||
baseHandler(event, value);
|
||||
baseHandler(HandlerEnum.HEADER_THEME, HEADER_PRESET_BG_COLOR_LIST[2]);
|
||||
baseHandler(HandlerEnum.MENU_THEME, SIDE_BAR_BG_COLOR_LIST[3]);
|
||||
baseHandler(HandlerEnum.HEADER_THEME, headerBgColor);
|
||||
baseHandler(HandlerEnum.MENU_THEME, sideBgColor);
|
||||
if (darkMode) {
|
||||
updateHeaderBgColor();
|
||||
updateSidebarBgColor();
|
||||
@ -51,8 +50,8 @@ export function layoutHandler(event: HandlerEnum, value: any) {
|
||||
} else if (isMixSidebarMenu) {
|
||||
baseHandler(event, value);
|
||||
baseHandler(HandlerEnum.CHANGE_THEME_COLOR, dynamicThemeColor);
|
||||
baseHandler(HandlerEnum.HEADER_THEME, HEADER_PRESET_BG_COLOR_LIST[0]);
|
||||
baseHandler(HandlerEnum.MENU_THEME, SIDE_BAR_BG_COLOR_LIST[0]);
|
||||
baseHandler(HandlerEnum.HEADER_THEME, headerBgColor);
|
||||
baseHandler(HandlerEnum.MENU_THEME, sideBgColor);
|
||||
if (darkMode) {
|
||||
updateHeaderBgColor();
|
||||
updateSidebarBgColor();
|
||||
@ -60,8 +59,8 @@ export function layoutHandler(event: HandlerEnum, value: any) {
|
||||
baseHandler(HandlerEnum.TABS_THEME, tabsThemeOptions[1].value);
|
||||
} else {
|
||||
baseHandler(event, value);
|
||||
baseHandler(HandlerEnum.HEADER_THEME, HEADER_PRESET_BG_COLOR_LIST[4]);
|
||||
baseHandler(HandlerEnum.MENU_THEME, SIDE_BAR_BG_COLOR_LIST[7]);
|
||||
baseHandler(HandlerEnum.HEADER_THEME, headerBgColor);
|
||||
baseHandler(HandlerEnum.MENU_THEME, sideBgColor);
|
||||
if (darkMode) {
|
||||
updateHeaderBgColor();
|
||||
updateSidebarBgColor();
|
||||
|
||||
@ -50,7 +50,9 @@ export function useTabDropdown(tabContentProps: TabContentProps, getIsTabs: Comp
|
||||
} else {
|
||||
// 【TV360X-1039】当只有首页和另一个tab页时关闭左侧禁用
|
||||
const validTabList = tabStore.getTabList.filter((item) => !item?.meta?.affix);
|
||||
return validTabList[0].path === state.current?.path;
|
||||
// update-begin--author:liaozhiyang---date:20251128---for:【issues/9098】tabs标签页关闭异常
|
||||
return validTabList[0]?.path === state.current?.path;
|
||||
// update-end--author:liaozhiyang---date:20251128---for:【issues/9098】tabs标签页关闭异常
|
||||
}
|
||||
};
|
||||
// Close other
|
||||
|
||||
@ -10,11 +10,14 @@ import {
|
||||
SessionTimeoutProcessingEnum,
|
||||
TabsThemeEnum,
|
||||
} from '/@/enums/appEnum';
|
||||
import { SIDE_BAR_BG_COLOR_LIST, HEADER_PRESET_BG_COLOR_LIST } from './designSetting';
|
||||
import { darkMode } from '/@/settings/designSetting';
|
||||
import { getThemeColorByMenuType } from '/@/utils/getThemeColorByMenuType';
|
||||
|
||||
import { getConfigByMenuType } from '../utils/getConfigByMenuType';
|
||||
// 修改此属性,实现默认的四个系统主题快速切换
|
||||
const menuType = MenuTypeEnum.SIDEBAR;
|
||||
|
||||
// update-begin--author:liaozhiyang---date:20251201---for【QQYUN-14176】修改一个配置就能切换默认四个主题,不需要额外修改颜色等
|
||||
const { themeColor, headerBgColor, sideBgColor, split, mode } = getConfigByMenuType(menuType);
|
||||
// update-end--author:liaozhiyang---date:20251201---for【QQYUN-14176】修改一个配置就能切换默认四个主题,不需要额外修改颜色等
|
||||
// ! 改动后需要清空浏览器缓存
|
||||
const setting: ProjectConfig = {
|
||||
// 是否显示SettingButton
|
||||
@ -43,7 +46,7 @@ const setting: ProjectConfig = {
|
||||
// SessionTimeoutProcessingEnum.PAGE_COVERAGE: 生成登录弹窗,覆盖当前页面
|
||||
sessionTimeoutProcessing: SessionTimeoutProcessingEnum.ROUTE_JUMP,
|
||||
// 项目主题色 - 根据导航栏模式确定主题色动态设置
|
||||
themeColor: getThemeColorByMenuType(menuType),
|
||||
themeColor: themeColor,
|
||||
// 项目主题模式
|
||||
themeMode: darkMode,
|
||||
|
||||
@ -71,7 +74,7 @@ const setting: ProjectConfig = {
|
||||
// 头部配置
|
||||
headerSetting: {
|
||||
// 背景色
|
||||
bgColor: HEADER_PRESET_BG_COLOR_LIST[4],
|
||||
bgColor: headerBgColor,
|
||||
// 固定头部
|
||||
fixed: true,
|
||||
// 是否显示顶部
|
||||
@ -93,7 +96,7 @@ const setting: ProjectConfig = {
|
||||
// 菜单配置
|
||||
menuSetting: {
|
||||
// 背景色
|
||||
bgColor: SIDE_BAR_BG_COLOR_LIST[0],
|
||||
bgColor: sideBgColor,
|
||||
// 是否固定住左侧菜单
|
||||
fixed: true,
|
||||
// 菜单折叠
|
||||
@ -110,15 +113,15 @@ const setting: ProjectConfig = {
|
||||
// 菜单宽度
|
||||
menuWidth: 210,
|
||||
// 菜单模式
|
||||
mode: MenuModeEnum.INLINE,
|
||||
mode,
|
||||
// 菜单类型
|
||||
type: MenuTypeEnum.SIDEBAR,
|
||||
type: menuType,
|
||||
// 菜单主题
|
||||
theme: ThemeEnum.DARK,
|
||||
theme: ThemeEnum.LIGHT,
|
||||
// 左侧导航栏文字颜色调整区分彩色和暗黑 (不对应配置)
|
||||
isThemeBright: false,
|
||||
// 分割菜单
|
||||
split: false,
|
||||
split,
|
||||
// 顶部菜单布局
|
||||
topMenuAlign: 'center',
|
||||
// 折叠触发器的位置
|
||||
|
||||
49
jeecgboot-vue3/src/utils/getConfigByMenuType.ts
Normal file
@ -0,0 +1,49 @@
|
||||
import { MenuTypeEnum, MenuModeEnum } from '/@/enums/menuEnum';
|
||||
import { APP_PRESET_COLOR_LIST, HEADER_PRESET_BG_COLOR_LIST, SIDE_BAR_BG_COLOR_LIST } from '/@/settings/designSetting';
|
||||
|
||||
/**
|
||||
* 根据菜单类型和模式获取对应的主题色
|
||||
* @param menuType 菜单类型
|
||||
*/
|
||||
export function getConfigByMenuType(menuType: MenuTypeEnum): {
|
||||
themeColor: string;
|
||||
headerBgColor: string;
|
||||
sideBgColor: string;
|
||||
split: boolean;
|
||||
mode: MenuModeEnum;
|
||||
} {
|
||||
let themeColor;
|
||||
let headerBgColor;
|
||||
let sideBgColor;
|
||||
let split = false;
|
||||
let mode: MenuModeEnum = MenuModeEnum.INLINE;
|
||||
if (menuType === MenuTypeEnum.TOP_MENU) {
|
||||
// 顶部栏导航
|
||||
themeColor = APP_PRESET_COLOR_LIST[1];
|
||||
headerBgColor = HEADER_PRESET_BG_COLOR_LIST[4];
|
||||
mode = MenuModeEnum.HORIZONTAL;
|
||||
} else if (menuType === MenuTypeEnum.MIX) {
|
||||
// 顶部混合菜单模式
|
||||
themeColor = APP_PRESET_COLOR_LIST[2];
|
||||
headerBgColor = HEADER_PRESET_BG_COLOR_LIST[2];
|
||||
sideBgColor = SIDE_BAR_BG_COLOR_LIST[3];
|
||||
split = true;
|
||||
} else if (menuType === MenuTypeEnum.MIX_SIDEBAR) {
|
||||
// 侧边折叠导航模式
|
||||
themeColor = APP_PRESET_COLOR_LIST[1];
|
||||
headerBgColor = HEADER_PRESET_BG_COLOR_LIST[0];
|
||||
sideBgColor = SIDE_BAR_BG_COLOR_LIST[0];
|
||||
} else if (menuType === MenuTypeEnum.SIDEBAR) {
|
||||
// 侧边栏导航
|
||||
themeColor = APP_PRESET_COLOR_LIST[1];
|
||||
headerBgColor = HEADER_PRESET_BG_COLOR_LIST[4];
|
||||
sideBgColor = SIDE_BAR_BG_COLOR_LIST[7];
|
||||
}
|
||||
return {
|
||||
themeColor,
|
||||
headerBgColor,
|
||||
sideBgColor,
|
||||
split,
|
||||
mode,
|
||||
};
|
||||
}
|
||||
@ -1,23 +0,0 @@
|
||||
import { MenuTypeEnum } from '/@/enums/menuEnum';
|
||||
import { APP_PRESET_COLOR_LIST } from '/@/settings/designSetting';
|
||||
|
||||
/**
|
||||
* 根据菜单类型和模式获取对应的主题色
|
||||
* @param menuType 菜单类型
|
||||
*/
|
||||
export function getThemeColorByMenuType(menuType: MenuTypeEnum): string {
|
||||
if (menuType === MenuTypeEnum.TOP_MENU) {
|
||||
// 顶部栏导航
|
||||
return APP_PRESET_COLOR_LIST[1];
|
||||
} else if (menuType === MenuTypeEnum.MIX) {
|
||||
// 顶部混合菜单使用青绿色主题
|
||||
return APP_PRESET_COLOR_LIST[2];
|
||||
} else if (menuType === MenuTypeEnum.MIX_SIDEBAR) {
|
||||
// 侧边折叠导航模式
|
||||
return APP_PRESET_COLOR_LIST[1];
|
||||
} else if (menuType === MenuTypeEnum.SIDEBAR) {
|
||||
// 侧边栏导航
|
||||
return APP_PRESET_COLOR_LIST[1];
|
||||
}
|
||||
return APP_PRESET_COLOR_LIST[1];
|
||||
}
|
||||