mirror of
https://github.com/jeecgboot/JeecgBoot.git
synced 2025-12-08 17:12:28 +08:00
Compare commits
49 Commits
v3.8.2
...
v3.8.2last
| Author | SHA1 | Date | |
|---|---|---|---|
| fd60e49f5b | |||
| 5f1dc06067 | |||
| 208d9990ae | |||
| 4f3c71af5b | |||
| 70bd639206 | |||
| d245ef3037 | |||
| 7af8346b79 | |||
| 1b8a31f0d3 | |||
| 294ad5a6c9 | |||
| 065b255d90 | |||
| b7519d7199 | |||
| 81ba07c853 | |||
| 92ed296e63 | |||
| c2aff84914 | |||
| e002cd3bf3 | |||
| 1de07ff3ff | |||
| 35852d41f1 | |||
| a2cb1d9f25 | |||
| 2002af54d0 | |||
| 89747403a2 | |||
| 3db0995c3f | |||
| 950621dd88 | |||
| 033cf51d69 | |||
| fb9f367517 | |||
| b2da45d803 | |||
| 2840f0d325 | |||
| 6ace7eae8a | |||
| 3d88147c59 | |||
| ba0052d452 | |||
| 69fca254f0 | |||
| b3de596199 | |||
| f46273d15e | |||
| 0fe258dbc2 | |||
| de7f23c555 | |||
| d97e56b2f0 | |||
| c868496b78 | |||
| c5150baa69 | |||
| 3d9f59c69b | |||
| 420d6db3fb | |||
| 473a626039 | |||
| 0308b0597c | |||
| 2191f5d48c | |||
| 1158b0b6e7 | |||
| ead2cef1f4 | |||
| 83bb0a0a6a | |||
| b474e9e5a5 | |||
| 422373e300 | |||
| 1cf11a4c2a | |||
| 444c7140f6 |
@ -69,9 +69,13 @@ Jeecg-Boot AI low code platform can be applied in the development of any J2EE pr
|
|||||||
Starts the project
|
Starts the project
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
- [IDEA Quick start](https://help.jeecg.com/java/setup/idea/startup)
|
> Default account password: admin/123456
|
||||||
- [Docker Quick start](https://help.jeecg.com/java/docker/quick)
|
|
||||||
|
|
||||||
|
- [Development Environment setup](https://help.jeecg.com/java/setup/tools)
|
||||||
|
- [IDEA Quick start(single model)](https://help.jeecg.com/java/setup/idea/startup)
|
||||||
|
- [Docker Quick start(single model)](https://help.jeecg.com/java/docker/quick)
|
||||||
|
- [IDEA Quick start(microservices model)](https://help.jeecg.com/java/springcloud/switchcloud/monomer)
|
||||||
|
- [Docker Quick start(microservices model)](https://help.jeecg.com/java/docker/quickcloud)
|
||||||
|
|
||||||
|
|
||||||
Technical documentation
|
Technical documentation
|
||||||
|
|||||||
33
README.md
33
README.md
@ -20,7 +20,7 @@ JeecgBoot AI低代码平台
|
|||||||
<h3 align="center">企业级AI低代码平台</h3>
|
<h3 align="center">企业级AI低代码平台</h3>
|
||||||
|
|
||||||
JeecgBoot是一款企业级低代码平台集成了AI应用平台功能,旨在帮助开发者快速实现低代码开发和构建、部署个性化的 AI 应用。
|
JeecgBoot是一款企业级低代码平台集成了AI应用平台功能,旨在帮助开发者快速实现低代码开发和构建、部署个性化的 AI 应用。
|
||||||
前后端分离架构Ant Design4、Vue3,SpringBoot,SpringCloud Alibaba,Mybatis-plus,Shiro/SpringAuthorizationServer,强大的代码生成器让前后端代码一键生成,无需写任何代码;提供强大的报表和大屏工具,满足企业级数据产品需求!
|
前后端分离架构Ant Design4、Vue3,SpringBoot2/3,SpringCloud Alibaba,Mybatis-plus,Shiro/SpringAuthorizationServer,强大的代码生成器让前后端代码一键生成,无需写任何代码;提供强大的报表和大屏工具,满足企业级数据产品需求!
|
||||||
引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE, 帮助Java项目解决80%的重复工作,让开发更多关注业务,提高效率、节省成本,同时又不失灵活性!低代码能力:Online表单、表单设计、流程设计、Online报表、大屏/仪表盘设计、报表设计; AI应用平台功能:AI知识库问答、AI模型管理、AI流程编排、AI聊天等,支持含ChatGPT、DeepSeek、Ollama等多种AI大模型
|
引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE, 帮助Java项目解决80%的重复工作,让开发更多关注业务,提高效率、节省成本,同时又不失灵活性!低代码能力:Online表单、表单设计、流程设计、Online报表、大屏/仪表盘设计、报表设计; AI应用平台功能:AI知识库问答、AI模型管理、AI流程编排、AI聊天等,支持含ChatGPT、DeepSeek、Ollama等多种AI大模型
|
||||||
|
|
||||||
|
|
||||||
@ -48,10 +48,10 @@ JeecgBoot低代码平台,可以应用在任何J2EE项目的开发中,支持
|
|||||||
版本说明
|
版本说明
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
|下载 | JDK17/JDK8 + SpringBoot2.7 | JDK17 + SpringBoot3.3 + Shiro |JDK17 + SpringBoot3.3+ SpringAuthorizationServer |
|
|下载 | JDK17 + SpringBoot3.3 + Shiro |JDK17 + SpringBoot3.3+ SpringAuthorizationServer | JDK17/JDK8 + SpringBoot2.7 |
|
||||||
|------|----------------------------------------------------|-----------------------------------------------------------------------------|--------------------------------------------|
|
|------|----------------------------------------------------|-----------------------------------------------------------------------------|--------------------------------------------|
|
||||||
| Github | [`master`](https://github.com/jeecgboot/JeecgBoot) | [`springboot3`](https://github.com/jeecgboot/JeecgBoot/tree/springboot3) 分支 | [`springboot3_sas`](https://github.com/jeecgboot/JeecgBoot/tree/springboot3_sas) 分支 |
|
| Github | [`springboot3`](https://github.com/jeecgboot/JeecgBoot/tree/springboot3) | [`springboot3_sas`](https://github.com/jeecgboot/JeecgBoot/tree/springboot3_sas) 分支 |[`master`](https://github.com/jeecgboot/JeecgBoot) 分支|
|
||||||
| Gitee | [`master`](https://gitee.com/jeecg/JeecgBoot) | [`springboot3`](https://gitee.com/jeecg/JeecgBoot/tree/springboot3/) 分支 | [`springboot3_sas`](https://gitee.com/jeecg/JeecgBoot/tree/springboot3_sas) 分支 |
|
| Gitee | [`springboot3`](https://gitee.com/jeecg/JeecgBoot/tree/springboot3/) | [`springboot3_sas`](https://gitee.com/jeecg/JeecgBoot/tree/springboot3_sas) 分支 |[`master`](https://gitee.com/jeecg/JeecgBoot) 分支 |
|
||||||
|
|
||||||
|
|
||||||
- `jeecg-boot` 是后端JAVA源码项目(支持单体和微服务切换).
|
- `jeecg-boot` 是后端JAVA源码项目(支持单体和微服务切换).
|
||||||
@ -66,17 +66,22 @@ JeecgBoot低代码平台,可以应用在任何J2EE项目的开发中,支持
|
|||||||
启动项目
|
启动项目
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
- [IDEA启动前后端项目](https://help.jeecg.com/java/setup/idea/startup)
|
> 默认账号密码: admin/123456
|
||||||
- [Docker一键启动前后端](https://help.jeecg.com/java/docker/quick)
|
|
||||||
|
|
||||||
|
- [开发环境搭建](https://help.jeecg.com/java/setup/tools)
|
||||||
|
- [IDEA启动前后端(单体模式)](https://help.jeecg.com/java/setup/idea/startup)
|
||||||
|
- [Docker一键启动(单体模式)](https://help.jeecg.com/java/docker/quick)
|
||||||
|
- [IDEA启动前后端(微服务方式)](https://help.jeecg.com/java/springcloud/switchcloud/monomer)
|
||||||
|
- [Docker一键启动(微服务方式)](https://help.jeecg.com/java/docker/quickcloud)
|
||||||
|
|
||||||
|
|
||||||
技术文档
|
技术文档
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
- 官方网站: [http://www.jeecg.com](http://www.jeecg.com)
|
- 官方网站: [http://www.jeecg.com](http://www.jeecg.com)
|
||||||
- 入门指南: [快速入门](http://www.jeecg.com/doc/quickstart) | [开发文档](https://help.jeecg.com) | [AI应用使用手册](https://help.jeecg.com/aigc) | [技术博客](https://jeecg.blog.csdn.net)
|
- 在线演示: [平台演示](https://boot3.jeecg.com) | [APP演示](https://jeecg.com/appIndex)
|
||||||
- 技术支持: [反馈问题](https://github.com/jeecgboot/JeecgBoot/issues/new?template=bug_report.md) | [视频教程](http://jeecg.com/doc/video) | [低代码体验一分钟](https://jeecg.blog.csdn.net/article/details/106079007)
|
- 入门指南: [快速入门](http://www.jeecg.com/doc/quickstart) | [代码生成使用](https://help.jeecg.com/java/codegen/online) | [开发文档](https://help.jeecg.com) | [AI应用手册](https://help.jeecg.com/aigc) | [视频教程](http://jeecg.com/doc/video)
|
||||||
|
- 技术支持: [反馈问题](https://github.com/jeecgboot/JeecgBoot/issues/new?template=bug_report.md) | [低代码体验一分钟](https://jeecg.blog.csdn.net/article/details/106079007)
|
||||||
- QQ交流群 : 964611995、⑩716488839(满)、⑨808791225(满)、其他(满)
|
- QQ交流群 : 964611995、⑩716488839(满)、⑨808791225(满)、其他(满)
|
||||||
|
|
||||||
|
|
||||||
@ -97,7 +102,7 @@ JeecgBoot平台提供了一套完善的AI应用管理系统模块,是一套类
|
|||||||
|
|
||||||
为什么选择JeecgBoot?
|
为什么选择JeecgBoot?
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
- 1.采用最新主流前后分离框架(Spring Boot + MyBatis + Ant Design4 + Vue3),容易上手;代码生成器依赖性低,灵活的扩展能力,可快速实现二次开发。
|
- 1.采用最新主流前后分离框架(Spring Boot3 + MyBatis + Ant Design4 + Vue3),容易上手;代码生成器依赖性低,灵活的扩展能力,可快速实现二次开发。
|
||||||
- 2.前端大版本换代,最新版采用 Vue3.0 + TypeScript + Vite6 + Ant Design Vue4 等新技术方案。
|
- 2.前端大版本换代,最新版采用 Vue3.0 + TypeScript + Vite6 + Ant Design Vue4 等新技术方案。
|
||||||
- 3.支持微服务Spring Cloud Alibaba(Nacos、Gateway、Sentinel、Skywalking),提供简易机制,支持单体和微服务自由切换(这样可以满足各类项目需求)。
|
- 3.支持微服务Spring Cloud Alibaba(Nacos、Gateway、Sentinel、Skywalking),提供简易机制,支持单体和微服务自由切换(这样可以满足各类项目需求)。
|
||||||
- 4.开发效率高,支持在线建表和AI建表,提供强大代码生成器,单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用。
|
- 4.开发效率高,支持在线建表和AI建表,提供强大代码生成器,单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用。
|
||||||
@ -161,10 +166,10 @@ JeecgBoot平台提供了一套完善的AI应用管理系统模块,是一套类
|
|||||||
- IDE建议: IDEA (必须安装lombok插件 )
|
- IDE建议: IDEA (必须安装lombok插件 )
|
||||||
- 语言:Java 默认jdk17(支持jdk8、jdk21)
|
- 语言:Java 默认jdk17(支持jdk8、jdk21)
|
||||||
- 依赖管理:Maven
|
- 依赖管理:Maven
|
||||||
- 基础框架:Spring Boot 2.7.18
|
- 基础框架:Spring Boot 3.5.5/2.7.18
|
||||||
- 微服务框架: Spring Cloud Alibaba 2021.0.6.2
|
- 微服务框架: Spring Cloud Alibaba 2021.0.6.2
|
||||||
- 持久层框架:MybatisPlus 3.5.3.2
|
- 持久层框架:MybatisPlus 3.5.3.2
|
||||||
- 报表工具: JimuReport 1.9.5
|
- 报表工具: JimuReport 2.1.2
|
||||||
- 安全框架:Apache Shiro 1.13.0,Jwt 4.5.0
|
- 安全框架:Apache Shiro 1.13.0,Jwt 4.5.0
|
||||||
- 微服务技术栈:Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking
|
- 微服务技术栈:Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking
|
||||||
- 数据库连接池:阿里巴巴Druid 1.1.24
|
- 数据库连接池:阿里巴巴Druid 1.1.24
|
||||||
@ -195,12 +200,6 @@ JeecgBoot平台提供了一套完善的AI应用管理系统模块,是一套类
|
|||||||
|
|
||||||
## 微服务解决方案
|
## 微服务解决方案
|
||||||
|
|
||||||
> 微服务方式快速启动
|
|
||||||
> - [单体快速切换微服务](https://help.jeecg.com/java/springcloud/switchcloud/monomer)
|
|
||||||
> - [Docker一键启动微服务前后端](https://help.jeecg.com/java/docker/quickcloud)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- 1、服务注册和发现 Nacos √
|
- 1、服务注册和发现 Nacos √
|
||||||
- 2、统一配置中心 Nacos √
|
- 2、统一配置中心 Nacos √
|
||||||
- 3、路由网关 gateway(三种加载方式) √
|
- 3、路由网关 gateway(三种加载方式) √
|
||||||
|
|||||||
216
check_jeecgenv.py
Normal file
216
check_jeecgenv.py
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
from typing import Tuple, Optional
|
||||||
|
|
||||||
|
def run_command(cmd: str) -> Tuple[int, str]:
|
||||||
|
"""执行命令并返回退出码和输出"""
|
||||||
|
try:
|
||||||
|
result = subprocess.run(cmd, shell=True, check=False,
|
||||||
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
||||||
|
text=True)
|
||||||
|
return result.returncode, result.stdout.strip()
|
||||||
|
except Exception as e:
|
||||||
|
return -1, str(e)
|
||||||
|
|
||||||
|
def check_java() -> bool:
|
||||||
|
"""检查JDK 17+是否安装"""
|
||||||
|
print("\n检查JDK 17+...")
|
||||||
|
rc, output = run_command("java -version 2>&1")
|
||||||
|
if rc != 0:
|
||||||
|
print("❌ 未检测到Java,请安装JDK 17+")
|
||||||
|
return False
|
||||||
|
|
||||||
|
version_pattern = r'"(\d+)(?:\.\d+)*(?:_\d+)?'
|
||||||
|
match = re.search(version_pattern, output)
|
||||||
|
if not match:
|
||||||
|
print("❌ 无法解析Java版本")
|
||||||
|
return False
|
||||||
|
|
||||||
|
version = int(match.group(1))
|
||||||
|
if version >= 17:
|
||||||
|
print(f"✅ JDK版本 {version} (满足17+要求)")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print(f"❌ JDK版本 {version} (需要17+)")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def check_maven() -> bool:
|
||||||
|
"""检查Maven是否安装"""
|
||||||
|
print("\n检查Maven...")
|
||||||
|
rc, output = run_command("mvn -v")
|
||||||
|
if rc == 0:
|
||||||
|
print("✅ Maven已安装")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print("❌ Maven未安装")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def check_node() -> bool:
|
||||||
|
"""检查Node.js 20+是否安装"""
|
||||||
|
print("\n检查Node.js 20+...")
|
||||||
|
rc, output = run_command("node -v")
|
||||||
|
if rc != 0:
|
||||||
|
print("❌ Node.js未安装")
|
||||||
|
return False
|
||||||
|
|
||||||
|
version_pattern = r'v(\d+)\.\d+\.\d+'
|
||||||
|
match = re.search(version_pattern, output)
|
||||||
|
if not match:
|
||||||
|
print("❌ 无法解析Node.js版本")
|
||||||
|
return False
|
||||||
|
|
||||||
|
version = int(match.group(1))
|
||||||
|
if version >= 20:
|
||||||
|
print(f"✅ Node.js版本 {version} (满足20+要求)")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print(f"❌ Node.js版本 {version} (需要20+)")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def check_pnpm() -> bool:
|
||||||
|
"""检查PNPM 9+是否安装"""
|
||||||
|
print("\n检查PNPM 9+...")
|
||||||
|
rc, output = run_command("pnpm -v")
|
||||||
|
if rc != 0:
|
||||||
|
print("❌ PNPM未安装")
|
||||||
|
return False
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 处理可能的版本号格式:v9.0.0 或 9.0.0 或 9
|
||||||
|
version_str = output.strip().lstrip('v').split('.')[0]
|
||||||
|
version = int(version_str)
|
||||||
|
|
||||||
|
if version >= 9:
|
||||||
|
print(f"✅ PNPM版本 {output.strip()} (满足9+要求)")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print(f"❌ PNPM版本 {output.strip()} (需要9+)")
|
||||||
|
return False
|
||||||
|
except (ValueError, IndexError):
|
||||||
|
print(f"❌ 无法解析PNPM版本: {output.strip()}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def check_redis_connection() -> bool:
|
||||||
|
"""检查Redis连接"""
|
||||||
|
print("\n检查Redis连接...")
|
||||||
|
print("⚠️ 请确保已配置Redis连接信息并在jeecg-boot项目中正确配置")
|
||||||
|
print("⚠️ 此检查需要根据实际项目配置进行验证")
|
||||||
|
print("⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def check_mysql_connection() -> bool:
|
||||||
|
"""检查MySQL连接"""
|
||||||
|
print("\n检查MySQL连接...")
|
||||||
|
print("⚠️ 请确保已配置MySQL连接信息并在jeecg-boot项目中正确配置")
|
||||||
|
print("⚠️ 此检查需要根据实际项目配置进行验证")
|
||||||
|
print("⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def print_mysql_config():
|
||||||
|
"""打印MySQL配置并提示需要修改的位置"""
|
||||||
|
print("\nMySQL配置参考 (请检查以下配置是否正确):")
|
||||||
|
print("""
|
||||||
|
spring.datasource.dynamic.datasource:
|
||||||
|
master:
|
||||||
|
url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
|
||||||
|
username: root # ← 可能需要修改
|
||||||
|
password: root # ← 可能需要修改
|
||||||
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
|
""")
|
||||||
|
|
||||||
|
def check_ai_vector_db() -> bool:
|
||||||
|
"""检查AI向量库(pgvector)配置"""
|
||||||
|
print("\n检查AI知识库向量库配置...")
|
||||||
|
print("⚠️ 如果需要使用AI知识库功能,请配置pgvector向量库")
|
||||||
|
print("⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml")
|
||||||
|
print("\n配置参考:")
|
||||||
|
print("""
|
||||||
|
jeecg.ai-rag:
|
||||||
|
embed-store:
|
||||||
|
host: 127.0.0.1 # ← 可能需要修改
|
||||||
|
port: 5432 # ← 可能需要修改
|
||||||
|
database: postgres # ← 可能需要修改
|
||||||
|
user: postgres # ← 可能需要修改
|
||||||
|
password: postgres # ← 可能需要修改
|
||||||
|
table: embeddings # ← 可能需要修改
|
||||||
|
""")
|
||||||
|
print("⚠️ 注意: 请确保已安装PostgreSQL并添加pgvector扩展!docker安装参考:https://help.jeecg.com/aigc/config")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def check_ai_config() -> bool:
|
||||||
|
"""检查AI账号配置"""
|
||||||
|
print("\n检查AI功能配置...")
|
||||||
|
print("⚠️ 如果需要使用AI聊天功能,请配置AI账号信息")
|
||||||
|
print("⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml")
|
||||||
|
print("\n配置参考:")
|
||||||
|
print("""
|
||||||
|
jeecg:
|
||||||
|
# AI集成
|
||||||
|
ai-chat:
|
||||||
|
enabled: true # ← 启用AI功能
|
||||||
|
model: deepseek-chat # ← 模型名称
|
||||||
|
apiKey: ?? # ← 必须修改为您的API Key
|
||||||
|
apiHost: https://api.deepseek.com/v1 # ← API地址
|
||||||
|
timeout: 60 # ← 超时时间(秒)
|
||||||
|
""")
|
||||||
|
print("⚠️ 注意: 请确保已获取有效的API Key并正确配置!AI账号注册获取参考: https://help.jeecg.com/java/deepSeekSupport")
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def print_redis_config():
|
||||||
|
"""打印Redis配置并提示需要修改的位置"""
|
||||||
|
print("\nRedis配置参考 (请检查以下配置是否正确):")
|
||||||
|
print("""
|
||||||
|
spring.redis:
|
||||||
|
database: 0
|
||||||
|
host: 127.0.0.1 # ← 可能需要修改
|
||||||
|
port: 6379 # ← 可能需要修改
|
||||||
|
password: '' # ← 如果需要密码请修改
|
||||||
|
""")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("="*50)
|
||||||
|
print("JeecgBoot 运行环境检查脚本")
|
||||||
|
print("="*50)
|
||||||
|
|
||||||
|
all_checks_passed = True
|
||||||
|
|
||||||
|
# 检查各项依赖
|
||||||
|
if not check_java():
|
||||||
|
all_checks_passed = False
|
||||||
|
|
||||||
|
if not check_maven():
|
||||||
|
all_checks_passed = False
|
||||||
|
|
||||||
|
if not check_node():
|
||||||
|
all_checks_passed = False
|
||||||
|
|
||||||
|
if not check_pnpm():
|
||||||
|
all_checks_passed = False
|
||||||
|
|
||||||
|
# 数据库提示
|
||||||
|
print("="*50)
|
||||||
|
check_redis_connection()
|
||||||
|
print_redis_config()
|
||||||
|
print("="*50)
|
||||||
|
check_mysql_connection()
|
||||||
|
print_mysql_config()
|
||||||
|
print("="*50)
|
||||||
|
check_ai_config()
|
||||||
|
print("="*50)
|
||||||
|
check_ai_vector_db()
|
||||||
|
|
||||||
|
print("\n" + "="*50)
|
||||||
|
if all_checks_passed:
|
||||||
|
print("✅ 所有基础环境检查通过")
|
||||||
|
print("⚠️ 注意: 请确保Redis和MySQL、AI账号、向量库pgvector 已正确配置并连接成功")
|
||||||
|
else:
|
||||||
|
print("❌ 部分环境检查未通过,请根据上述提示解决问题")
|
||||||
|
|
||||||
|
print("="*50)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
input("\n按回车键退出...") # 等待用户输入
|
||||||
BIN
jeecg-boot/db/其他数据库脚本/jeecgboot-oracle11g.dmp
Normal file
BIN
jeecg-boot/db/其他数据库脚本/jeecgboot-oracle11g.dmp
Normal file
Binary file not shown.
5
jeecg-boot/db/其他数据库脚本/oracle11g dmp说明.txt
Normal file
5
jeecg-boot/db/其他数据库脚本/oracle11g dmp说明.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
oracle导出编码: export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
|
||||||
|
|
||||||
|
导出用户: jeecgbootos
|
||||||
|
|
||||||
|
导入命令: imp scott/tiger@orcl file=jeecgboot-oracle11g.dmp
|
||||||
@ -11,6 +11,7 @@ import java.util.regex.Matcher;
|
|||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
||||||
import org.apache.commons.beanutils.PropertyUtils;
|
import org.apache.commons.beanutils.PropertyUtils;
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
import org.jeecg.common.constant.DataBaseConstant;
|
import org.jeecg.common.constant.DataBaseConstant;
|
||||||
@ -257,7 +258,68 @@ public class QueryGenerator {
|
|||||||
if(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) {
|
if(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) {
|
||||||
order = parameterMap.get(ORDER_TYPE)[0];
|
order = parameterMap.get(ORDER_TYPE)[0];
|
||||||
}
|
}
|
||||||
log.debug("排序规则>>列:" + column + ",排序方式:" + order);
|
|
||||||
|
if(oConvertUtils.isNotEmpty(column)){
|
||||||
|
log.info("单字段排序规则>> column:" + column + ",排序方式:" + order);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. 列表多字段排序优先
|
||||||
|
if(parameterMap!=null&& parameterMap.containsKey("sortInfoString")) {
|
||||||
|
// 多字段排序
|
||||||
|
String sortInfoString = parameterMap.get("sortInfoString")[0];
|
||||||
|
log.info("多字段排序规则>> sortInfoString:" + sortInfoString);
|
||||||
|
List<OrderItem> orderItemList = SqlConcatUtil.getQueryConditionOrders(column, order, sortInfoString);
|
||||||
|
log.info(orderItemList.toString());
|
||||||
|
if (orderItemList != null && !orderItemList.isEmpty()) {
|
||||||
|
for (OrderItem item : orderItemList) {
|
||||||
|
// 一、获取排序数据库字段
|
||||||
|
String columnName = item.getColumn();
|
||||||
|
// 1.字典字段,去掉字典翻译文本后缀
|
||||||
|
if(columnName.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {
|
||||||
|
columnName = columnName.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));
|
||||||
|
}
|
||||||
|
// 2.实体驼峰字段转为数据库字段
|
||||||
|
columnName = SqlInjectionUtil.getSqlInjectSortField(columnName);
|
||||||
|
|
||||||
|
// 二、设置字段排序规则
|
||||||
|
if (item.isAsc()) {
|
||||||
|
queryWrapper.orderByAsc(columnName);
|
||||||
|
} else {
|
||||||
|
queryWrapper.orderByDesc(columnName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 列表单字段默认排序
|
||||||
|
if(oConvertUtils.isEmpty(column) && parameterMap!=null&& parameterMap.containsKey("defSortString")) {
|
||||||
|
// 多字段排序
|
||||||
|
String sortInfoString = parameterMap.get("defSortString")[0];
|
||||||
|
log.info("默认多字段排序规则>> defSortString:" + sortInfoString);
|
||||||
|
List<OrderItem> orderItemList = SqlConcatUtil.getQueryConditionOrders(column, order, sortInfoString);
|
||||||
|
log.info(orderItemList.toString());
|
||||||
|
if (orderItemList != null && !orderItemList.isEmpty()) {
|
||||||
|
for (OrderItem item : orderItemList) {
|
||||||
|
// 一、获取排序数据库字段
|
||||||
|
String columnName = item.getColumn();
|
||||||
|
// 1.字典字段,去掉字典翻译文本后缀
|
||||||
|
if(columnName.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {
|
||||||
|
columnName = columnName.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));
|
||||||
|
}
|
||||||
|
// 2.实体驼峰字段转为数据库字段
|
||||||
|
columnName = SqlInjectionUtil.getSqlInjectSortField(columnName);
|
||||||
|
|
||||||
|
// 二、设置字段排序规则
|
||||||
|
if (item.isAsc()) {
|
||||||
|
queryWrapper.orderByAsc(columnName);
|
||||||
|
} else {
|
||||||
|
queryWrapper.orderByDesc(columnName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//update-begin-author:scott date:2022-11-07 for:避免用户自定义表无默认字段{创建时间},导致排序报错
|
//update-begin-author:scott date:2022-11-07 for:避免用户自定义表无默认字段{创建时间},导致排序报错
|
||||||
//TODO 避免用户自定义表无默认字段创建时间,导致排序报错
|
//TODO 避免用户自定义表无默认字段创建时间,导致排序报错
|
||||||
|
|||||||
@ -1,13 +1,22 @@
|
|||||||
package org.jeecg.common.system.util;
|
package org.jeecg.common.system.util;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
import org.jeecg.common.constant.DataBaseConstant;
|
import org.jeecg.common.constant.DataBaseConstant;
|
||||||
import org.jeecg.common.constant.SymbolConstant;
|
import org.jeecg.common.constant.SymbolConstant;
|
||||||
|
import org.jeecg.common.exception.JeecgBootException;
|
||||||
import org.jeecg.common.system.query.QueryGenerator;
|
import org.jeecg.common.system.query.QueryGenerator;
|
||||||
import org.jeecg.common.system.query.QueryRuleEnum;
|
import org.jeecg.common.system.query.QueryRuleEnum;
|
||||||
import org.jeecg.common.util.CommonUtils;
|
import org.jeecg.common.util.CommonUtils;
|
||||||
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLDecoder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -240,4 +249,46 @@ public class SqlConcatUtil {
|
|||||||
return CommonUtils.getDatabaseType();
|
return CommonUtils.getDatabaseType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前端传过来的 "多字段排序信息: sortInfoString"
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static List<OrderItem> getQueryConditionOrders(String column, String order, String queryInfoString){
|
||||||
|
List<OrderItem> list = new ArrayList<>();
|
||||||
|
if(oConvertUtils.isEmpty(queryInfoString)){
|
||||||
|
//默认以创建时间倒序查询
|
||||||
|
if(CommonConstant.ORDER_TYPE_DESC.equalsIgnoreCase(order)){
|
||||||
|
list.add(OrderItem.desc(column));
|
||||||
|
}else{
|
||||||
|
list.add(OrderItem.asc(column));
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
// 【TV360X-967】URL解码(微服务下需要)
|
||||||
|
if (queryInfoString.contains("%22column%22")) {
|
||||||
|
log.info("queryInfoString 原生 = {}", queryInfoString);
|
||||||
|
try {
|
||||||
|
queryInfoString = URLDecoder.decode(queryInfoString, "UTF-8");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new JeecgBootException(e);
|
||||||
|
}
|
||||||
|
log.info("queryInfoString 解码 = {}", queryInfoString);
|
||||||
|
}
|
||||||
|
JSONArray array = JSONArray.parseArray(queryInfoString);
|
||||||
|
Iterator it = array.iterator();
|
||||||
|
while(it.hasNext()){
|
||||||
|
JSONObject json = (JSONObject)it.next();
|
||||||
|
String tempColumn = json.getString("column");
|
||||||
|
if(oConvertUtils.isNotEmpty(tempColumn)){
|
||||||
|
String tempOrder = json.getString("order");
|
||||||
|
if(CommonConstant.ORDER_TYPE_DESC.equalsIgnoreCase(tempOrder)){
|
||||||
|
list.add(OrderItem.desc(tempColumn));
|
||||||
|
}else{
|
||||||
|
list.add(OrderItem.asc(tempColumn));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,30 @@
|
|||||||
|
package org.jeecg.config.init;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
|
import org.jeecg.common.util.RedisUtil;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.ApplicationArguments;
|
||||||
|
import org.springframework.boot.ApplicationRunner;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shiro缓存清理
|
||||||
|
* 在应用启动时清除所有的Shiro授权缓存
|
||||||
|
* 主要用于解决重启项目,用户未重新登录,按钮权限不生效的问题
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class ShiroCacheClearRunner implements ApplicationRunner {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run(ApplicationArguments args) {
|
||||||
|
// 清空所有授权redis缓存
|
||||||
|
log.info("———————清空所有用户授权缓存———————clearAllCache——————— ");
|
||||||
|
redisUtil.removeAll(CommonConstant.PREFIX_USER_SHIRO_CACHE);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -412,8 +412,11 @@ public class SysTenantController {
|
|||||||
*/
|
*/
|
||||||
@PutMapping("/invitationUserJoin")
|
@PutMapping("/invitationUserJoin")
|
||||||
@RequiresPermissions("system:tenant:invitation:user")
|
@RequiresPermissions("system:tenant:invitation:user")
|
||||||
public Result<String> invitationUserJoin(@RequestParam("ids") String ids,@RequestParam("phone") String phone){
|
public Result<String> invitationUserJoin(@RequestParam("ids") String ids,@RequestParam(value = "phone", required = false) String phone, @RequestParam(value = "username", required = false) String username){
|
||||||
sysTenantService.invitationUserJoin(ids,phone);
|
if(oConvertUtils.isEmpty(phone) && oConvertUtils.isEmpty(username)){
|
||||||
|
return Result.error("手机号和用户账号不能同时为空!");
|
||||||
|
}
|
||||||
|
sysTenantService.invitationUserJoin(ids,phone,username);
|
||||||
return Result.ok("邀请用户成功");
|
return Result.ok("邀请用户成功");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -28,15 +28,16 @@
|
|||||||
,icon
|
,icon
|
||||||
,is_leaf
|
,is_leaf
|
||||||
FROM sys_permission
|
FROM sys_permission
|
||||||
WHERE 1=1
|
<where>
|
||||||
<choose>
|
<choose>
|
||||||
<when test="parentId != null and parentId != ''">
|
<when test="parentId != null and parentId != ''">
|
||||||
AND parent_id = #{parentId,jdbcType=VARCHAR}
|
parent_id = #{parentId,jdbcType=VARCHAR}
|
||||||
</when>
|
</when>
|
||||||
<otherwise>
|
<otherwise>
|
||||||
AND parent_id is null
|
parent_id is null
|
||||||
</otherwise>
|
</otherwise>
|
||||||
</choose>
|
</choose>
|
||||||
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 获取登录用户拥有的权限 -->
|
<!-- 获取登录用户拥有的权限 -->
|
||||||
@ -212,7 +213,7 @@
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!--根据用户名称和test角色id查询权限-->
|
<!--根据用户名称和test角色id查询权限-->
|
||||||
<select id="queryPermissionByTestRoleId" resultType="org.jeecg.modules.system.entity.SysPermission">
|
<select id="queryPermissionByTestRoleId" resultMap="SysPermission">
|
||||||
SELECT p.*
|
SELECT p.*
|
||||||
FROM sys_permission p
|
FROM sys_permission p
|
||||||
WHERE exists(
|
WHERE exists(
|
||||||
|
|||||||
@ -22,7 +22,7 @@ public class TreeModel implements Serializable {
|
|||||||
|
|
||||||
private String slotTitle;
|
private String slotTitle;
|
||||||
|
|
||||||
private boolean isLeaf;
|
private Boolean isLeaf;
|
||||||
|
|
||||||
private String icon;
|
private String icon;
|
||||||
|
|
||||||
@ -54,11 +54,11 @@ public class TreeModel implements Serializable {
|
|||||||
this.title = title;
|
this.title = title;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean getIsLeaf() {
|
public Boolean getIsLeaf() {
|
||||||
return isLeaf;
|
return isLeaf;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIsLeaf(boolean isLeaf) {
|
public void setIsLeaf(Boolean isLeaf) {
|
||||||
this.isLeaf = isLeaf;
|
this.isLeaf = isLeaf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -49,8 +49,9 @@ public interface ISysTenantService extends IService<SysTenant> {
|
|||||||
* 邀请用户加入租户,通过手机号
|
* 邀请用户加入租户,通过手机号
|
||||||
* @param ids
|
* @param ids
|
||||||
* @param phone
|
* @param phone
|
||||||
|
* @param username
|
||||||
*/
|
*/
|
||||||
void invitationUserJoin(String ids, String phone);
|
void invitationUserJoin(String ids, String phone,String username);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请离用户(租户)
|
* 请离用户(租户)
|
||||||
|
|||||||
@ -104,15 +104,27 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
|
@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
|
||||||
public void invitationUserJoin(String ids, String phone) {
|
public void invitationUserJoin(String ids, String phone,String username) {
|
||||||
String[] idArray = ids.split(SymbolConstant.COMMA);
|
String[] idArray = ids.split(SymbolConstant.COMMA);
|
||||||
|
String userId = null;
|
||||||
|
SysUser userByPhone = null;
|
||||||
//update-begin---author:wangshuai ---date:20230313 for:【QQYUN-4605】后台的邀请谁加入租户,没办法选不是租户下的用户,通过手机号邀请------------
|
//update-begin---author:wangshuai ---date:20230313 for:【QQYUN-4605】后台的邀请谁加入租户,没办法选不是租户下的用户,通过手机号邀请------------
|
||||||
SysUser userByPhone = userService.getUserByPhone(phone);
|
if(oConvertUtils.isNotEmpty(phone)){
|
||||||
//说明用户不存在
|
userByPhone = userService.getUserByPhone(phone);
|
||||||
if(null == userByPhone){
|
//说明用户不存在
|
||||||
throw new JeecgBootException("当前用户不存在,请核对手机号");
|
if(null == userByPhone){
|
||||||
|
throw new JeecgBootException("当前用户不存在,请核对手机号");
|
||||||
|
}
|
||||||
|
userId = userByPhone.getId();
|
||||||
|
}else{
|
||||||
|
userByPhone = userService.getUserByName(username);
|
||||||
|
//说明用户不存在
|
||||||
|
if(null == userByPhone){
|
||||||
|
throw new JeecgBootException("当前用户不存在,请核对手机号");
|
||||||
|
}
|
||||||
|
userId = userByPhone.getId();
|
||||||
}
|
}
|
||||||
String userId = userByPhone.getId();
|
|
||||||
//循环租户id
|
//循环租户id
|
||||||
for (String id:idArray) {
|
for (String id:idArray) {
|
||||||
//update-begin---author:wangshuai ---date:20221223 for:[QQYUN-3371]租户逻辑改造,改成关系表------------
|
//update-begin---author:wangshuai ---date:20221223 for:[QQYUN-3371]租户逻辑改造,改成关系表------------
|
||||||
|
|||||||
@ -1,27 +1,47 @@
|
|||||||
-- 注意:该页面对应的前台目录为views/${entityPackagePath}文件夹下
|
-- 注意:该页面对应的前台目录为views/${entityPackagePath}文件夹下
|
||||||
-- 如果你想更改到其他目录,请修改sql中component字段对应的值
|
-- 如果你想更改到其他目录,请修改sql中component字段对应的值
|
||||||
|
|
||||||
<#assign id = '${.now?string["yyyyMMddhhmmSSsss"]}0'>
|
<#assign mainId = "${.now?long}01">
|
||||||
|
<#assign addId = "${.now?long}02">
|
||||||
|
<#assign editId = "${.now?long}03">
|
||||||
|
<#assign delId = "${.now?long}04">
|
||||||
|
<#assign batchDelId = "${.now?long}05">
|
||||||
|
<#assign exportId = "${.now?long}06">
|
||||||
|
<#assign importId = "${.now?long}07">
|
||||||
|
|
||||||
|
-- 主菜单
|
||||||
INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external)
|
INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external)
|
||||||
VALUES ('${id}', NULL, '${tableVo.ftlDescription}', '/${entityPackagePath}/${entityName?uncap_first}List', '${entityPackagePath}/${entityName}List', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0);
|
VALUES ('${mainId}', NULL, '${tableVo.ftlDescription}', '/${entityPackagePath}/${entityName?uncap_first}List', '${entityPackagePath}/${entityName}List', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0);
|
||||||
|
|
||||||
-- 权限控制sql
|
|
||||||
-- 新增
|
-- 新增
|
||||||
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)
|
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 ('${.now?string["yyyyMMddhhmmSSsss"]}1', '${id}', '添加${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
VALUES ('${addId}', '${mainId}', '添加${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
||||||
|
|
||||||
-- 编辑
|
-- 编辑
|
||||||
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)
|
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 ('${.now?string["yyyyMMddhhmmSSsss"]}2', '${id}', '编辑${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
VALUES ('${editId}', '${mainId}', '编辑${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
||||||
|
|
||||||
-- 删除
|
-- 删除
|
||||||
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)
|
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 ('${.now?string["yyyyMMddhhmmSSsss"]}3', '${id}', '删除${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
VALUES ('${delId}', '${mainId}', '删除${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
||||||
|
|
||||||
-- 批量删除
|
-- 批量删除
|
||||||
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)
|
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 ('${.now?string["yyyyMMddhhmmSSsss"]}4', '${id}', '批量删除${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
VALUES ('${batchDelId}', '${mainId}', '批量删除${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
||||||
|
|
||||||
-- 导出excel
|
-- 导出excel
|
||||||
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)
|
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 ('${.now?string["yyyyMMddhhmmSSsss"]}5', '${id}', '导出excel_${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
VALUES ('${exportId}', '${mainId}', '导出excel_${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
||||||
|
|
||||||
-- 导入excel
|
-- 导入excel
|
||||||
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)
|
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 ('${.now?string["yyyyMMddhhmmSSsss"]}6', '${id}', '导入excel_${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
VALUES ('${importId}', '${mainId}', '导入excel_${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
|
||||||
|
|
||||||
|
-- 角色授权(以 admin 角色为例,role_id 可替换)
|
||||||
|
INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}08', 'f6817f48af4fb3af11b9e8bf182f618b', '${mainId}', NULL, '${.now?string["yyyy-MM-dd HH:mm:ss"]}', '127.0.0.1');
|
||||||
|
INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}09', 'f6817f48af4fb3af11b9e8bf182f618b', '${addId}', NULL, '${.now?string["yyyy-MM-dd HH:mm:ss"]}', '127.0.0.1');
|
||||||
|
INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}10', 'f6817f48af4fb3af11b9e8bf182f618b', '${editId}', NULL, '${.now?string["yyyy-MM-dd HH:mm:ss"]}', '127.0.0.1');
|
||||||
|
INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}11', 'f6817f48af4fb3af11b9e8bf182f618b', '${delId}', NULL, '${.now?string["yyyy-MM-dd HH:mm:ss"]}', '127.0.0.1');
|
||||||
|
INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}12', 'f6817f48af4fb3af11b9e8bf182f618b', '${batchDelId}', NULL, '${.now?string["yyyy-MM-dd HH:mm:ss"]}', '127.0.0.1');
|
||||||
|
INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}13', 'f6817f48af4fb3af11b9e8bf182f618b', '${exportId}', NULL, '${.now?string["yyyy-MM-dd HH:mm:ss"]}', '127.0.0.1');
|
||||||
|
INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}14', 'f6817f48af4fb3af11b9e8bf182f618b', '${importId}', NULL, '${.now?string["yyyy-MM-dd HH:mm:ss"]}', '127.0.0.1');
|
||||||
@ -33,7 +33,7 @@
|
|||||||
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'button'>
|
<#if btn.buttonStyle == 'button'>
|
||||||
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="ant-design:${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="ant-design:${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
||||||
</#if>
|
</#if>
|
||||||
@ -303,7 +303,7 @@
|
|||||||
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -339,7 +339,7 @@
|
|||||||
auth: '${entityPackage}:${tableName}:delete'
|
auth: '${entityPackage}:${tableName}:delete'
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -378,7 +378,7 @@
|
|||||||
</#if>
|
</#if>
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='button'>
|
<#if btn.buttonStyle=='button'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -107,7 +107,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='form'>
|
<#if btn.buttonStyle=='form'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -110,7 +110,7 @@
|
|||||||
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'button'>
|
<#if btn.buttonStyle == 'button'>
|
||||||
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="ant-design:${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="ant-design:${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
||||||
</#if>
|
</#if>
|
||||||
@ -368,7 +368,7 @@
|
|||||||
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -404,7 +404,7 @@
|
|||||||
auth: '${entityPackage}:${tableName}:delete'
|
auth: '${entityPackage}:${tableName}:delete'
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -484,7 +484,7 @@
|
|||||||
</#if>
|
</#if>
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='button'>
|
<#if btn.buttonStyle=='button'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -77,7 +77,7 @@
|
|||||||
visible.value = false;
|
visible.value = false;
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='form'>
|
<#if btn.buttonStyle=='form'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -38,7 +38,7 @@
|
|||||||
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'button'>
|
<#if btn.buttonStyle == 'button'>
|
||||||
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
||||||
</#if>
|
</#if>
|
||||||
@ -447,7 +447,7 @@
|
|||||||
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -483,7 +483,7 @@
|
|||||||
auth: '${entityPackage}:${tableName}:delete'
|
auth: '${entityPackage}:${tableName}:delete'
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -544,7 +544,7 @@
|
|||||||
</#if>
|
</#if>
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='button'>
|
<#if btn.buttonStyle=='button'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -157,7 +157,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='form'>
|
<#if btn.buttonStyle=='form'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -120,7 +120,7 @@
|
|||||||
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'button'>
|
<#if btn.buttonStyle == 'button'>
|
||||||
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="ant-design:${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="ant-design:${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
||||||
</#if>
|
</#if>
|
||||||
@ -518,7 +518,7 @@
|
|||||||
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -559,7 +559,7 @@
|
|||||||
auth: '${entityPackage}:${tableName}:delete'
|
auth: '${entityPackage}:${tableName}:delete'
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -597,7 +597,7 @@
|
|||||||
}
|
}
|
||||||
</#if>
|
</#if>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='button'>
|
<#if btn.buttonStyle=='button'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -33,7 +33,7 @@
|
|||||||
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'button'>
|
<#if btn.buttonStyle == 'button'>
|
||||||
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="ant-design:${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="ant-design:${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
||||||
</#if>
|
</#if>
|
||||||
@ -349,7 +349,7 @@
|
|||||||
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -384,7 +384,7 @@
|
|||||||
auth: '${entityPackage}:${tableName}:delete'
|
auth: '${entityPackage}:${tableName}:delete'
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -443,7 +443,7 @@
|
|||||||
</#if>
|
</#if>
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='button'>
|
<#if btn.buttonStyle=='button'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -106,7 +106,7 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='form'>
|
<#if btn.buttonStyle=='form'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -114,7 +114,7 @@
|
|||||||
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'button'>
|
<#if btn.buttonStyle == 'button'>
|
||||||
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="ant-design:${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="ant-design:${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
||||||
</#if>
|
</#if>
|
||||||
@ -389,7 +389,7 @@
|
|||||||
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
||||||
},
|
},
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -426,7 +426,7 @@
|
|||||||
auth: '${entityPackage}:${tableName}:delete'
|
auth: '${entityPackage}:${tableName}:delete'
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -464,7 +464,7 @@
|
|||||||
}
|
}
|
||||||
</#if>
|
</#if>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='button'>
|
<#if btn.buttonStyle=='button'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -79,7 +79,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='form'>
|
<#if btn.buttonStyle=='form'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'button'>
|
<#if btn.buttonStyle == 'button'>
|
||||||
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
||||||
</#if>
|
</#if>
|
||||||
@ -356,7 +356,7 @@
|
|||||||
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -392,7 +392,7 @@
|
|||||||
auth: '${entityPackage}:${tableName}:delete'
|
auth: '${entityPackage}:${tableName}:delete'
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -451,7 +451,7 @@
|
|||||||
</#if>
|
</#if>
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='button'>
|
<#if btn.buttonStyle=='button'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -252,7 +252,7 @@
|
|||||||
</#list>
|
</#list>
|
||||||
};
|
};
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='form'>
|
<#if btn.buttonStyle=='form'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -32,7 +32,7 @@
|
|||||||
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'button'>
|
<#if btn.buttonStyle == 'button'>
|
||||||
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
||||||
</#if>
|
</#if>
|
||||||
@ -330,7 +330,7 @@
|
|||||||
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -366,7 +366,7 @@
|
|||||||
auth: '${entityPackage}:${tableName}:delete'
|
auth: '${entityPackage}:${tableName}:delete'
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -425,7 +425,7 @@
|
|||||||
</#if>
|
</#if>
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='button'>
|
<#if btn.buttonStyle=='button'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -251,7 +251,7 @@
|
|||||||
</#list>
|
</#list>
|
||||||
};
|
};
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='form'>
|
<#if btn.buttonStyle=='form'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -113,7 +113,7 @@
|
|||||||
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'button'>
|
<#if btn.buttonStyle == 'button'>
|
||||||
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
||||||
</#if>
|
</#if>
|
||||||
@ -364,7 +364,7 @@
|
|||||||
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -401,7 +401,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -441,7 +441,7 @@
|
|||||||
</#if>
|
</#if>
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='button'>
|
<#if btn.buttonStyle=='button'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -59,7 +59,7 @@
|
|||||||
closeModal();
|
closeModal();
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='form'>
|
<#if btn.buttonStyle=='form'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
@ -75,7 +75,7 @@
|
|||||||
handleSubmit,
|
handleSubmit,
|
||||||
submitSuccess,
|
submitSuccess,
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='form'>
|
<#if btn.buttonStyle=='form'>
|
||||||
handle${btn.buttonCode?cap_first},
|
handle${btn.buttonCode?cap_first},
|
||||||
</#if>
|
</#if>
|
||||||
|
|||||||
@ -32,7 +32,7 @@
|
|||||||
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
<a-button type="primary" v-auth="'${entityPackage}:${tableName}:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
<j-upload-button type="primary" v-auth="'${entityPackage}:${tableName}:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'button'>
|
<#if btn.buttonStyle == 'button'>
|
||||||
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
<a-button type="primary" @click="handle${btn.buttonCode?cap_first}" <#if btn.buttonIcon??> preIcon="${btn.buttonIcon}" </#if>>${btn.buttonName}</a-button>
|
||||||
</#if>
|
</#if>
|
||||||
@ -329,7 +329,7 @@
|
|||||||
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
ifShow: !!record.bpmStatus && record.bpmStatus !== '1',
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -365,7 +365,7 @@
|
|||||||
auth: '${entityPackage}:${tableName}:delete'
|
auth: '${entityPackage}:${tableName}:delete'
|
||||||
}
|
}
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle == 'link'>
|
<#if btn.buttonStyle == 'link'>
|
||||||
,{
|
,{
|
||||||
label: '${btn.buttonName}',
|
label: '${btn.buttonName}',
|
||||||
@ -424,7 +424,7 @@
|
|||||||
</#if>
|
</#if>
|
||||||
|
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='button'>
|
<#if btn.buttonStyle=='button'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -286,7 +286,7 @@
|
|||||||
</#list>
|
</#list>
|
||||||
};
|
};
|
||||||
<#if buttonList?size gt 0>
|
<#if buttonList?size gt 0>
|
||||||
<#list buttonList?sort_by('orderNum') as btn>
|
<#list buttonList?filter(it -> it.orderNum?? && it.orderNum != null)?sort_by("orderNum") as btn>
|
||||||
<#if btn.buttonStyle=='form'>
|
<#if btn.buttonStyle=='form'>
|
||||||
function handle${btn.buttonCode?cap_first}(){
|
function handle${btn.buttonCode?cap_first}(){
|
||||||
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
createMessage.info('点击了${btn.buttonName}按钮,对应的业务逻辑需自行实现!');
|
||||||
|
|||||||
@ -25,6 +25,9 @@ management:
|
|||||||
include: metrics,jeecghttptrace
|
include: metrics,jeecghttptrace
|
||||||
|
|
||||||
spring:
|
spring:
|
||||||
|
# main:
|
||||||
|
# # 启动加速 (建议开发环境,开启后flyway自动升级失效)
|
||||||
|
# lazy-initialization: true
|
||||||
flyway:
|
flyway:
|
||||||
# 是否启用flyway
|
# 是否启用flyway
|
||||||
enabled: true
|
enabled: true
|
||||||
@ -46,7 +49,7 @@ spring:
|
|||||||
mail.smtp.writetimeout: 10000 # 写入超时(毫秒)
|
mail.smtp.writetimeout: 10000 # 写入超时(毫秒)
|
||||||
mail.smtp.auth: true
|
mail.smtp.auth: true
|
||||||
smtp.ssl.enable: true
|
smtp.ssl.enable: true
|
||||||
mail.debug: true # 启用调试模式(查看详细日志)
|
# mail.debug: true # 启用调试模式(查看详细日志)
|
||||||
## quartz定时任务,采用数据库方式
|
## quartz定时任务,采用数据库方式
|
||||||
quartz:
|
quartz:
|
||||||
job-store-type: jdbc
|
job-store-type: jdbc
|
||||||
@ -179,8 +182,8 @@ mybatis-plus:
|
|||||||
# 默认数据库表下划线命名
|
# 默认数据库表下划线命名
|
||||||
table-underline: true
|
table-underline: true
|
||||||
configuration:
|
configuration:
|
||||||
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
|
# # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
|
||||||
#log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||||
# 返回类型为Map,显示null对应的字段
|
# 返回类型为Map,显示null对应的字段
|
||||||
call-setters-on-nulls: true
|
call-setters-on-nulls: true
|
||||||
#jeecg专用配置
|
#jeecg专用配置
|
||||||
@ -262,6 +265,12 @@ jeecg:
|
|||||||
dataSourceSafe: false
|
dataSourceSafe: false
|
||||||
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
||||||
lowCodeMode: dev
|
lowCodeMode: dev
|
||||||
|
# 高德地图Api配置(v2.1.3+ BI新增高德地图)
|
||||||
|
gao-de-api:
|
||||||
|
# 应用key
|
||||||
|
api-key: ??
|
||||||
|
# 应用秘钥
|
||||||
|
secret-key: ??
|
||||||
#xxl-job配置
|
#xxl-job配置
|
||||||
xxljob:
|
xxljob:
|
||||||
enabled: false
|
enabled: false
|
||||||
@ -292,6 +301,7 @@ logging:
|
|||||||
level:
|
level:
|
||||||
org.flywaydb: debug
|
org.flywaydb: debug
|
||||||
org.jeecg.modules.system.mapper: info
|
org.jeecg.modules.system.mapper: info
|
||||||
|
org.jeecg.modules.demo.test.mapper: info
|
||||||
#swagger
|
#swagger
|
||||||
knife4j:
|
knife4j:
|
||||||
#开启增强配置
|
#开启增强配置
|
||||||
|
|||||||
@ -223,6 +223,12 @@ jeecg:
|
|||||||
dataSourceSafe: false
|
dataSourceSafe: false
|
||||||
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
||||||
lowCodeMode: dev
|
lowCodeMode: dev
|
||||||
|
# 高德地图Api配置(v2.1.3+ BI新增高德地图)
|
||||||
|
gao-de-api:
|
||||||
|
# 应用key
|
||||||
|
api-key: ??
|
||||||
|
# 应用秘钥
|
||||||
|
secret-key: ??
|
||||||
#xxl-job配置
|
#xxl-job配置
|
||||||
xxljob:
|
xxljob:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|||||||
@ -262,6 +262,12 @@ jeecg:
|
|||||||
dataSourceSafe: false
|
dataSourceSafe: false
|
||||||
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
||||||
lowCodeMode: dev
|
lowCodeMode: dev
|
||||||
|
# 高德地图Api配置(v2.1.3+ BI新增高德地图)
|
||||||
|
gao-de-api:
|
||||||
|
# 应用key
|
||||||
|
api-key: ??
|
||||||
|
# 应用秘钥
|
||||||
|
secret-key: ??
|
||||||
#xxl-job配置
|
#xxl-job配置
|
||||||
xxljob:
|
xxljob:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|||||||
@ -238,6 +238,12 @@ jeecg:
|
|||||||
dataSourceSafe: false
|
dataSourceSafe: false
|
||||||
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
||||||
lowCodeMode: dev
|
lowCodeMode: dev
|
||||||
|
# 高德地图Api配置(v2.1.3+ BI新增高德地图)
|
||||||
|
gao-de-api:
|
||||||
|
# 应用key
|
||||||
|
api-key: ??
|
||||||
|
# 应用秘钥
|
||||||
|
secret-key: ??
|
||||||
#xxl-job配置
|
#xxl-job配置
|
||||||
xxljob:
|
xxljob:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|||||||
@ -254,6 +254,12 @@ jeecg:
|
|||||||
dataSourceSafe: false
|
dataSourceSafe: false
|
||||||
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
||||||
lowCodeMode: dev
|
lowCodeMode: dev
|
||||||
|
# 高德地图Api配置(v2.1.3+ BI新增高德地图)
|
||||||
|
gao-de-api:
|
||||||
|
# 应用key
|
||||||
|
api-key: ??
|
||||||
|
# 应用秘钥
|
||||||
|
secret-key: ??
|
||||||
#xxl-job配置
|
#xxl-job配置
|
||||||
xxljob:
|
xxljob:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|||||||
@ -267,6 +267,12 @@ jeecg:
|
|||||||
dataSourceSafe: false
|
dataSourceSafe: false
|
||||||
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
||||||
lowCodeMode: dev
|
lowCodeMode: dev
|
||||||
|
# 高德地图Api配置(v2.1.3+ BI新增高德地图)
|
||||||
|
gao-de-api:
|
||||||
|
# 应用key
|
||||||
|
api-key: ??
|
||||||
|
# 应用秘钥
|
||||||
|
secret-key: ??
|
||||||
#xxl-job配置
|
#xxl-job配置
|
||||||
xxljob:
|
xxljob:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|||||||
@ -259,6 +259,12 @@ jeecg:
|
|||||||
dataSourceSafe: true
|
dataSourceSafe: true
|
||||||
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
||||||
lowCodeMode: prod
|
lowCodeMode: prod
|
||||||
|
# 高德地图Api配置(v2.1.3+ BI新增高德地图)
|
||||||
|
gao-de-api:
|
||||||
|
# 应用key
|
||||||
|
api-key: ??
|
||||||
|
# 应用秘钥
|
||||||
|
secret-key: ??
|
||||||
#xxl-job配置
|
#xxl-job配置
|
||||||
xxljob:
|
xxljob:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|||||||
@ -249,6 +249,12 @@ jeecg:
|
|||||||
dataSourceSafe: false
|
dataSourceSafe: false
|
||||||
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
||||||
lowCodeMode: dev
|
lowCodeMode: dev
|
||||||
|
# 高德地图Api配置(v2.1.3+ BI新增高德地图)
|
||||||
|
gao-de-api:
|
||||||
|
# 应用key
|
||||||
|
api-key: ??
|
||||||
|
# 应用秘钥
|
||||||
|
secret-key: ??
|
||||||
#xxl-job配置
|
#xxl-job配置
|
||||||
xxljob:
|
xxljob:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|||||||
@ -262,6 +262,12 @@ jeecg:
|
|||||||
dataSourceSafe: true
|
dataSourceSafe: true
|
||||||
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
|
||||||
lowCodeMode: prod
|
lowCodeMode: prod
|
||||||
|
# 高德地图Api配置(v2.1.3+ BI新增高德地图)
|
||||||
|
gao-de-api:
|
||||||
|
# 应用key
|
||||||
|
api-key: ??
|
||||||
|
# 应用秘钥
|
||||||
|
secret-key: ??
|
||||||
#xxl-job配置
|
#xxl-job配置
|
||||||
xxljob:
|
xxljob:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
#code_generate_project_path
|
# Module path to generate in the backend Java project
|
||||||
project_path=E:\\workspace\\jeecg-boot
|
project_path=F:\\gitcode\\JeecgBoot\\jeecg-boot\\jeecg-boot-module\\jeecg-module-demo
|
||||||
#bussi_package[User defined]
|
## Path to generate in the frontend VUE3 project
|
||||||
|
#ui_project_path=F:\\gitcode\\1jeecg-boot-github\\jeecgboot-vue3
|
||||||
|
# Business package path
|
||||||
bussi_package=org.jeecg.modules.demo
|
bussi_package=org.jeecg.modules.demo
|
||||||
|
|
||||||
|
|
||||||
#default code path
|
#default code path
|
||||||
#source_root_package=src
|
#source_root_package=src
|
||||||
#webroot_package=WebRoot
|
#webroot_package=WebRoot
|
||||||
|
|||||||
@ -69,9 +69,11 @@
|
|||||||
<!-- 日志输出级别 -->
|
<!-- 日志输出级别 -->
|
||||||
<root level="INFO">
|
<root level="INFO">
|
||||||
<appender-ref ref="STDOUT" />
|
<appender-ref ref="STDOUT" />
|
||||||
|
|
||||||
|
<!-- 开发环境关闭日志生成,项目启动快;生产环境请按需打开注释
|
||||||
<appender-ref ref="FILE" />
|
<appender-ref ref="FILE" />
|
||||||
<appender-ref ref="HTML" />
|
<appender-ref ref="HTML" />
|
||||||
<appender-ref ref="FILE_HTML" />
|
<appender-ref ref="FILE_HTML" /> -->
|
||||||
</root>
|
</root>
|
||||||
|
|
||||||
</configuration>
|
</configuration>
|
||||||
@ -3,6 +3,11 @@ server:
|
|||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
name: seata-account
|
name: seata-account
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
config:
|
||||||
|
import-check:
|
||||||
|
enabled: false
|
||||||
main:
|
main:
|
||||||
allow-bean-definition-overriding: true
|
allow-bean-definition-overriding: true
|
||||||
autoconfigure:
|
autoconfigure:
|
||||||
@ -12,9 +17,11 @@ spring:
|
|||||||
username: root
|
username: root
|
||||||
password: root
|
password: root
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
schema: classpath:sql/schema-account.sql
|
sql:
|
||||||
|
init:
|
||||||
|
schema-locations: classpath:sql/schema-account.sql
|
||||||
seata:
|
seata:
|
||||||
# enable-auto-data-source-proxy: false
|
enable-auto-data-source-proxy: false
|
||||||
service:
|
service:
|
||||||
grouplist:
|
grouplist:
|
||||||
default: 127.0.0.1:8091
|
default: 127.0.0.1:8091
|
||||||
@ -22,3 +29,7 @@ seata:
|
|||||||
springboot-seata-group: default
|
springboot-seata-group: default
|
||||||
# seata 事务组编号 用于TC集群名
|
# seata 事务组编号 用于TC集群名
|
||||||
tx-service-group: springboot-seata-group
|
tx-service-group: springboot-seata-group
|
||||||
|
|
||||||
|
# 无用配置,为了避免扫码全代码导致启动慢
|
||||||
|
minidao:
|
||||||
|
base-package: org.jeecg.modules.jmreport.*
|
||||||
@ -3,6 +3,11 @@ server:
|
|||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
name: seata-order
|
name: seata-order
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
config:
|
||||||
|
import-check:
|
||||||
|
enabled: false
|
||||||
main:
|
main:
|
||||||
allow-bean-definition-overriding: true
|
allow-bean-definition-overriding: true
|
||||||
autoconfigure:
|
autoconfigure:
|
||||||
@ -12,9 +17,11 @@ spring:
|
|||||||
url: jdbc:mysql://127.0.0.1:3306/jeecg_order?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
|
url: jdbc:mysql://127.0.0.1:3306/jeecg_order?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
|
||||||
username: root
|
username: root
|
||||||
password: root
|
password: root
|
||||||
schema: classpath:sql/schema-order.sql
|
sql:
|
||||||
|
init:
|
||||||
|
schema-locations: classpath:sql/schema-order.sql
|
||||||
seata:
|
seata:
|
||||||
# enable-auto-data-source-proxy: false
|
enable-auto-data-source-proxy: false
|
||||||
service:
|
service:
|
||||||
grouplist:
|
grouplist:
|
||||||
default: 127.0.0.1:8091
|
default: 127.0.0.1:8091
|
||||||
@ -22,3 +29,7 @@ seata:
|
|||||||
springboot-seata-group: default
|
springboot-seata-group: default
|
||||||
# seata 事务组编号 用于TC集群名
|
# seata 事务组编号 用于TC集群名
|
||||||
tx-service-group: springboot-seata-group
|
tx-service-group: springboot-seata-group
|
||||||
|
|
||||||
|
# 无用配置,为了避免扫码全代码导致启动慢
|
||||||
|
minidao:
|
||||||
|
base-package: org.jeecg.modules.jmreport.*
|
||||||
@ -3,6 +3,11 @@ server:
|
|||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
name: seata-product
|
name: seata-product
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
config:
|
||||||
|
import-check:
|
||||||
|
enabled: false
|
||||||
main:
|
main:
|
||||||
allow-bean-definition-overriding: true
|
allow-bean-definition-overriding: true
|
||||||
autoconfigure:
|
autoconfigure:
|
||||||
@ -12,9 +17,11 @@ spring:
|
|||||||
url: jdbc:mysql://127.0.0.1:3306/jeecg_product?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
|
url: jdbc:mysql://127.0.0.1:3306/jeecg_product?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
|
||||||
username: root
|
username: root
|
||||||
password: root
|
password: root
|
||||||
schema: classpath:sql/schema-product.sql
|
sql:
|
||||||
|
init:
|
||||||
|
schema-locations: classpath:sql/schema-product.sql
|
||||||
seata:
|
seata:
|
||||||
# enable-auto-data-source-proxy: false
|
enable-auto-data-source-proxy: false
|
||||||
service:
|
service:
|
||||||
grouplist:
|
grouplist:
|
||||||
default: 127.0.0.1:8091
|
default: 127.0.0.1:8091
|
||||||
@ -22,3 +29,7 @@ seata:
|
|||||||
springboot-seata-group: default
|
springboot-seata-group: default
|
||||||
# seata 事务组编号 用于TC集群名
|
# seata 事务组编号 用于TC集群名
|
||||||
tx-service-group: springboot-seata-group
|
tx-service-group: springboot-seata-group
|
||||||
|
|
||||||
|
# 无用配置,为了避免扫码全代码导致启动慢
|
||||||
|
minidao:
|
||||||
|
base-package: org.jeecg.modules.jmreport.*
|
||||||
@ -24,7 +24,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<artifactId>jeecg-boot-starter-seata</artifactId>
|
<artifactId>jeecg-boot-starter-seata</artifactId>
|
||||||
<version>${jeecgboot.version}</version>
|
<version>3.8.2-RC</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@ -37,9 +37,9 @@
|
|||||||
<spring-cloud.version>2021.0.8</spring-cloud.version>
|
<spring-cloud.version>2021.0.8</spring-cloud.version>
|
||||||
<spring-cloud-alibaba.version>2021.0.6.2</spring-cloud-alibaba.version>
|
<spring-cloud-alibaba.version>2021.0.6.2</spring-cloud-alibaba.version>
|
||||||
<alibaba.nacos.version>2.0.4</alibaba.nacos.version>
|
<alibaba.nacos.version>2.0.4</alibaba.nacos.version>
|
||||||
<seata.version>1.5.2</seata.version>
|
<seata.version>1.7.0</seata.version>
|
||||||
|
|
||||||
<xxl-job-core.version>2.4.1</xxl-job-core.version>
|
<xxl-job-core.version>2.4.1</xxl-job-core.version>
|
||||||
|
|
||||||
<fastjson.version>2.0.57</fastjson.version>
|
<fastjson.version>2.0.57</fastjson.version>
|
||||||
<aviator.version>5.2.6</aviator.version>
|
<aviator.version>5.2.6</aviator.version>
|
||||||
<pegdown.version>1.6.0</pegdown.version>
|
<pegdown.version>1.6.0</pegdown.version>
|
||||||
@ -56,9 +56,11 @@
|
|||||||
<dm8.version>8.1.1.49</dm8.version>
|
<dm8.version>8.1.1.49</dm8.version>
|
||||||
|
|
||||||
<!-- 积木报表-->
|
<!-- 积木报表-->
|
||||||
<jimureport-spring-boot-starter.version>2.1.2</jimureport-spring-boot-starter.version>
|
<jimureport-spring-boot-starter.version>2.1.3</jimureport-spring-boot-starter.version>
|
||||||
<jimubi-spring-boot-starter.version>2.1.2</jimubi-spring-boot-starter.version>
|
<jimubi-spring-boot-starter.version>2.1.3</jimubi-spring-boot-starter.version>
|
||||||
<minidao.version>1.10.11</minidao.version>
|
<minidao.version>1.10.14</minidao.version>
|
||||||
|
<autopoi-web.version>1.4.18</autopoi-web.version>
|
||||||
|
|
||||||
<!-- 持久层 -->
|
<!-- 持久层 -->
|
||||||
<mybatis-plus.version>3.5.12</mybatis-plus.version>
|
<mybatis-plus.version>3.5.12</mybatis-plus.version>
|
||||||
<dynamic-datasource-spring-boot-starter.version>4.1.3</dynamic-datasource-spring-boot-starter.version>
|
<dynamic-datasource-spring-boot-starter.version>4.1.3</dynamic-datasource-spring-boot-starter.version>
|
||||||
@ -72,8 +74,7 @@
|
|||||||
<shiro.version>1.13.0</shiro.version>
|
<shiro.version>1.13.0</shiro.version>
|
||||||
<shiro-redis.version>3.2.3</shiro-redis.version>
|
<shiro-redis.version>3.2.3</shiro-redis.version>
|
||||||
<java-jwt.version>4.5.0</java-jwt.version>
|
<java-jwt.version>4.5.0</java-jwt.version>
|
||||||
<codegenerate.version>1.4.9</codegenerate.version>
|
<codegenerate.version>1.5.1</codegenerate.version>
|
||||||
<autopoi-web.version>1.4.15</autopoi-web.version>
|
|
||||||
<minio.version>8.0.3</minio.version>
|
<minio.version>8.0.3</minio.version>
|
||||||
<justauth-spring-boot-starter.version>1.4.0</justauth-spring-boot-starter.version>
|
<justauth-spring-boot-starter.version>1.4.0</justauth-spring-boot-starter.version>
|
||||||
<dom4j.version>1.6.1</dom4j.version>
|
<dom4j.version>1.6.1</dom4j.version>
|
||||||
@ -240,7 +241,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<artifactId>jeecg-boot-starter-shardingsphere</artifactId>
|
<artifactId>jeecg-boot-starter-shardingsphere</artifactId>
|
||||||
<version>${jeecgboot.version}</version>
|
<version>3.8.2-RC</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.hibernate</groupId>
|
<groupId>org.hibernate</groupId>
|
||||||
|
|||||||
@ -25,6 +25,7 @@ module.exports = defineConfig({
|
|||||||
'plugin:jest/recommended',
|
'plugin:jest/recommended',
|
||||||
],
|
],
|
||||||
rules: {
|
rules: {
|
||||||
|
'prettier/prettier': 'off', // 彻底关闭 prettier 校验规则
|
||||||
'vue/script-setup-uses-vars': 'error',
|
'vue/script-setup-uses-vars': 'error',
|
||||||
'@typescript-eslint/ban-ts-ignore': 'off',
|
'@typescript-eslint/ban-ts-ignore': 'off',
|
||||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||||
@ -67,8 +68,8 @@ module.exports = defineConfig({
|
|||||||
{
|
{
|
||||||
html: {
|
html: {
|
||||||
void: 'always',
|
void: 'always',
|
||||||
normal: 'never',
|
normal: 'any',
|
||||||
component: 'always',
|
component: 'any',
|
||||||
},
|
},
|
||||||
svg: 'always',
|
svg: 'always',
|
||||||
math: 'always',
|
math: 'always',
|
||||||
|
|||||||
@ -15,6 +15,6 @@ module.exports = {
|
|||||||
requirePragma: false,
|
requirePragma: false,
|
||||||
proseWrap: 'never',
|
proseWrap: 'never',
|
||||||
htmlWhitespaceSensitivity: 'strict',
|
htmlWhitespaceSensitivity: 'strict',
|
||||||
endOfLine: 'auto',
|
endOfLine: 'auto', // 自动处理换行符(LF/CRLF)
|
||||||
rangeStart: 0,
|
rangeStart: 0,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -61,6 +61,7 @@
|
|||||||
import { useDesign } from '/@/hooks/web/useDesign';
|
import { useDesign } from '/@/hooks/web/useDesign';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import { useDebounceFn } from '@vueuse/core';
|
import { useDebounceFn } from '@vueuse/core';
|
||||||
|
import { isFunction, isObject } from '/@/utils/is';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'BasicForm',
|
name: 'BasicForm',
|
||||||
@ -145,9 +146,17 @@
|
|||||||
if (defaultValue && dateItemType.includes(component)) {
|
if (defaultValue && dateItemType.includes(component)) {
|
||||||
//update-begin---author:wangshuai ---date:20230410 for:【issues/435】代码生成的日期控件赋默认值报错------------
|
//update-begin---author:wangshuai ---date:20230410 for:【issues/435】代码生成的日期控件赋默认值报错------------
|
||||||
let valueFormat:string = "";
|
let valueFormat:string = "";
|
||||||
if(componentProps){
|
// update-begin--author:liaozhiyang---date:20250818---for:【issues/8683】DatePicker组件的componentProps使用函数形式时初始值获取不对
|
||||||
|
if(isObject(componentProps)) {
|
||||||
valueFormat = componentProps?.valueFormat;
|
valueFormat = componentProps?.valueFormat;
|
||||||
|
} else if (isFunction(componentProps)) {
|
||||||
|
try {
|
||||||
|
// @ts-ignore
|
||||||
|
valueFormat = componentProps({schema, tableAction: props.tableAction, formModel})?.valueFormat;
|
||||||
|
} catch (error) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// update-end--author:liaozhiyang---date:20250818---for【issues/8683】DatePicker组件的componentProps使用函数形式时初始值获取不对
|
||||||
if(!valueFormat){
|
if(!valueFormat){
|
||||||
console.warn("未配置valueFormat,可能导致格式化错误!");
|
console.warn("未配置valueFormat,可能导致格式化错误!");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,6 +57,7 @@ export function useFileCell(props, fileType: UploadTypeEnum, options?) {
|
|||||||
...originColumn.value.props,
|
...originColumn.value.props,
|
||||||
maxCount: maxCount.value,
|
maxCount: maxCount.value,
|
||||||
fileType: fileType,
|
fileType: fileType,
|
||||||
|
action: originColumn.value.action ?? void 0,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,12 +7,12 @@
|
|||||||
<template v-else>
|
<template v-else>
|
||||||
<Tooltip v-if="action.tooltip" v-bind="getTooltip(action.tooltip)">
|
<Tooltip v-if="action.tooltip" v-bind="getTooltip(action.tooltip)">
|
||||||
<PopConfirmButton v-bind="action">
|
<PopConfirmButton v-bind="action">
|
||||||
<Icon :icon="action.icon" :class="{ 'mr-1': !!action.label }" v-if="action.icon" />
|
<Icon :icon="action.icon" :class="{ 'mr-1': !!action.label }" v-if="action.icon" :color="action.iconColor"/>
|
||||||
<template v-if="action.label">{{ action.label }}</template>
|
<template v-if="action.label">{{ action.label }}</template>
|
||||||
</PopConfirmButton>
|
</PopConfirmButton>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<PopConfirmButton v-else v-bind="action">
|
<PopConfirmButton v-else v-bind="action">
|
||||||
<Icon :icon="action.icon" :class="{ 'mr-1': !!action.label }" v-if="action.icon" />
|
<Icon :icon="action.icon" :class="{ 'mr-1': !!action.label }" v-if="action.icon" :color="action.iconColor"/>
|
||||||
<template v-if="action.label">{{ action.label }}</template>
|
<template v-if="action.label">{{ action.label }}</template>
|
||||||
</PopConfirmButton>
|
</PopConfirmButton>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -100,7 +100,14 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
const getComponentProps = computed(() => {
|
const getComponentProps = computed(() => {
|
||||||
const compProps = props.column?.editComponentProps ?? {};
|
let compProps;
|
||||||
|
// update-begin--author:liaozhiyang---date:20250818---for:【issues/8680】editComponentProps可接受一个函数传入record
|
||||||
|
if (isFunction(props.column?.editComponentProps)) {
|
||||||
|
compProps = props.column?.editComponentProps(props.record);
|
||||||
|
} else {
|
||||||
|
compProps = props.column?.editComponentProps ?? {};
|
||||||
|
}
|
||||||
|
// update-end--author:liaozhiyang---date:20250818---for:【issues/8680】editComponentProps可接受一个函数传入record
|
||||||
const component = unref(getComponent);
|
const component = unref(getComponent);
|
||||||
const apiSelectProps: Recordable = {};
|
const apiSelectProps: Recordable = {};
|
||||||
if (component === 'ApiSelect') {
|
if (component === 'ApiSelect') {
|
||||||
|
|||||||
@ -222,14 +222,18 @@
|
|||||||
checkSelect.value = !!values.rowSelection;
|
checkSelect.value = !!values.rowSelection;
|
||||||
});
|
});
|
||||||
// update-begin--author:liaozhiyang---date:20240724---for:【issues/6908】多语言无刷新切换时,BasicColumn和FormSchema里面的值不能正常切换
|
// update-begin--author:liaozhiyang---date:20240724---for:【issues/6908】多语言无刷新切换时,BasicColumn和FormSchema里面的值不能正常切换
|
||||||
watch([localeStore, getColumnsRef], () => {
|
watch([localeStore], () => {
|
||||||
const columns = getColumns();
|
const columns = getColumns();
|
||||||
plainOptions.value = columns;
|
plainOptions.value = columns;
|
||||||
plainSortOptions.value = columns;
|
plainSortOptions.value = columns;
|
||||||
cachePlainOptions.value = columns;
|
cachePlainOptions.value = columns;
|
||||||
});
|
});
|
||||||
// update-end--author:liaozhiyang---date:20240724---for:【issues/6908】多语言无刷新切换时,BasicColumn和FormSchema里面的值不能正常切换
|
// update-end--author:liaozhiyang---date:20240724---for:【issues/6908】多语言无刷新切换时,BasicColumn和FormSchema里面的值不能正常切换
|
||||||
|
// update-begin--author:liaozhiyang---date:20250813---for:【issues/8529】setColumns将原本隐藏的列展示后,列配置里却没有勾选该列
|
||||||
|
watch([getColumnsRef], () => {
|
||||||
|
init();
|
||||||
|
});
|
||||||
|
// update-end--author:liaozhiyang---date:20250813---for:【issues/8529】setColumns将原本隐藏的列展示后,列配置里却没有勾选该列
|
||||||
function getColumns() {
|
function getColumns() {
|
||||||
const ret: Options[] = [];
|
const ret: Options[] = [];
|
||||||
// update-begin--author:liaozhiyang---date:20250403---for:【issues/7996】表格列组件取消所有或者只勾选中间,显示非预期
|
// update-begin--author:liaozhiyang---date:20250403---for:【issues/7996】表格列组件取消所有或者只勾选中间,显示非预期
|
||||||
|
|||||||
@ -348,6 +348,9 @@ export function useCustomSelection(
|
|||||||
onSelectChild(record, checked);
|
onSelectChild(record, checked);
|
||||||
updateSelected(record, checked);
|
updateSelected(record, checked);
|
||||||
onSelectParent(record, checked);
|
onSelectParent(record, checked);
|
||||||
|
// update-begin--author:liaozhiyang---date:20250813---for:【issues/8690】BasicTable的rowSelection新增onSelect方法
|
||||||
|
propsRef.value.rowSelection?.onSelect?.(toRaw(record), checked, toRaw(selectedRows.value));
|
||||||
|
// update-end--author:liaozhiyang---date:20250813---for:【issues/8690】BasicTable的rowSelection新增onSelect方法
|
||||||
emitChange();
|
emitChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -238,12 +238,20 @@ export function useDataSource(
|
|||||||
|
|
||||||
const { sortInfo = {}, filterInfo } = searchState;
|
const { sortInfo = {}, filterInfo } = searchState;
|
||||||
|
|
||||||
|
// 扩展默认排序多字段数组写法
|
||||||
|
let defSortInfo: Recordable<any> | undefined = {};
|
||||||
|
if (defSort && Array.isArray(defSort) && defSort.length > 0) {
|
||||||
|
defSortInfo['defSortString'] = JSON.stringify(defSort);
|
||||||
|
} else {
|
||||||
|
defSortInfo = defSort;
|
||||||
|
}
|
||||||
|
|
||||||
let params: Recordable = {
|
let params: Recordable = {
|
||||||
...pageParams,
|
...pageParams,
|
||||||
// 由于 getFieldsValue 返回的不是逗号分割的数据,所以改用 validate
|
// 由于 getFieldsValue 返回的不是逗号分割的数据,所以改用 validate
|
||||||
...(useSearchForm ? await validate() : {}),
|
...(useSearchForm ? await validate() : {}),
|
||||||
...searchInfo,
|
...searchInfo,
|
||||||
...defSort,
|
...defSortInfo,
|
||||||
...(opt?.searchInfo ?? {}),
|
...(opt?.searchInfo ?? {}),
|
||||||
...sortInfo,
|
...sortInfo,
|
||||||
...filterInfo,
|
...filterInfo,
|
||||||
|
|||||||
@ -25,7 +25,7 @@ export interface TableRowSelection<T = any> extends ITableRowSelection {
|
|||||||
* Callback executed when select/deselect one row
|
* Callback executed when select/deselect one row
|
||||||
* @type Function
|
* @type Function
|
||||||
*/
|
*/
|
||||||
onSelect?: (record: T, selected: boolean, selectedRows: Object[], nativeEvent: Event) => any;
|
onSelect?: (record: T, selected: boolean, selectedRows: Object[]) => any;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback executed when select/deselect all rows
|
* Callback executed when select/deselect all rows
|
||||||
@ -190,7 +190,7 @@ export interface BasicTableProps<T = any> {
|
|||||||
// 额外的请求参数
|
// 额外的请求参数
|
||||||
searchInfo?: Recordable;
|
searchInfo?: Recordable;
|
||||||
// 默认的排序参数
|
// 默认的排序参数
|
||||||
defSort?: Recordable;
|
defSort?: Recordable | Recordable[];
|
||||||
// 使用搜索表单
|
// 使用搜索表单
|
||||||
useSearchForm?: boolean;
|
useSearchForm?: boolean;
|
||||||
// 表单配置
|
// 表单配置
|
||||||
@ -459,7 +459,9 @@ export interface BasicColumn extends ColumnProps<Recordable> {
|
|||||||
editRow?: boolean;
|
editRow?: boolean;
|
||||||
editable?: boolean;
|
editable?: boolean;
|
||||||
editComponent?: ComponentType;
|
editComponent?: ComponentType;
|
||||||
editComponentProps?: Recordable;
|
// update-begin--author:liaozhiyang---date:20250818---for:【issues/8680】editComponentProps可接受一个函数传入record
|
||||||
|
editComponentProps?: Recordable | ((record: Recordable) => Recordable);
|
||||||
|
// update-end--author:liaozhiyang---date:20250818---for:【issues/8680】editComponentProps可接受一个函数传入record
|
||||||
editRule?: boolean | ((text: string, record: Recordable) => Promise<string>);
|
editRule?: boolean | ((text: string, record: Recordable) => Promise<string>);
|
||||||
editValueMap?: (value: any) => string;
|
editValueMap?: (value: any) => string;
|
||||||
onEditRow?: () => void;
|
onEditRow?: () => void;
|
||||||
|
|||||||
@ -54,8 +54,16 @@ export function useData(props: JVxeTableProps): JVxeDataProps {
|
|||||||
// 暂时关闭左右虚拟滚动
|
// 暂时关闭左右虚拟滚动
|
||||||
enabled: false,
|
enabled: false,
|
||||||
},
|
},
|
||||||
radioConfig: { highlight: true },
|
radioConfig: {
|
||||||
checkboxConfig: { highlight: true },
|
// 保留勾选状态
|
||||||
|
reserve: true,
|
||||||
|
highlight: true,
|
||||||
|
},
|
||||||
|
checkboxConfig: {
|
||||||
|
// 保留勾选状态
|
||||||
|
reserve: true,
|
||||||
|
highlight: true,
|
||||||
|
},
|
||||||
mouseConfig: { selected: false },
|
mouseConfig: { selected: false },
|
||||||
keyboardConfig: {
|
keyboardConfig: {
|
||||||
// 删除键功能
|
// 删除键功能
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { unref, computed } from 'vue';
|
import { unref, computed, ref, watch, nextTick } from 'vue';
|
||||||
import { merge } from 'lodash-es';
|
import { merge, debounce } from 'lodash-es';
|
||||||
import { isArray } from '/@/utils/is';
|
import { isArray } from '/@/utils/is';
|
||||||
import { useAttrs } from '/@/hooks/core/useAttrs';
|
import { useAttrs } from '/@/hooks/core/useAttrs';
|
||||||
import { useKeyboardEdit } from '../hooks/useKeyboardEdit';
|
import { useKeyboardEdit } from '../hooks/useKeyboardEdit';
|
||||||
@ -40,8 +40,9 @@ export function useFinallyProps(props: JVxeTableProps, data: JVxeDataProps, meth
|
|||||||
});
|
});
|
||||||
return events;
|
return events;
|
||||||
});
|
});
|
||||||
|
|
||||||
// vxe 最终 props
|
// vxe 最终 props
|
||||||
const vxeProps = computed(() => {
|
const vxePropsMerge = computed(() => {
|
||||||
// update-begin--author:liaozhiyang---date:20240417---for:【QQYUN-8785】online表单列位置的id未做限制,拖动其他列到id列上面,同步数据库时报错
|
// update-begin--author:liaozhiyang---date:20240417---for:【QQYUN-8785】online表单列位置的id未做限制,拖动其他列到id列上面,同步数据库时报错
|
||||||
let rowClass = {};
|
let rowClass = {};
|
||||||
if (props.dragSort) {
|
if (props.dragSort) {
|
||||||
@ -77,7 +78,7 @@ export function useFinallyProps(props: JVxeTableProps, data: JVxeDataProps, meth
|
|||||||
size: props.size,
|
size: props.size,
|
||||||
loading: false,
|
loading: false,
|
||||||
disabled: props.disabled,
|
disabled: props.disabled,
|
||||||
columns: unref(data.vxeColumns),
|
// columns: unref(data.vxeColumns),
|
||||||
editRules: unref(vxeEditRules),
|
editRules: unref(vxeEditRules),
|
||||||
height: props.height === 'auto' ? null : props.height,
|
height: props.height === 'auto' ? null : props.height,
|
||||||
maxHeight: props.maxHeight,
|
maxHeight: props.maxHeight,
|
||||||
@ -114,6 +115,25 @@ export function useFinallyProps(props: JVxeTableProps, data: JVxeDataProps, meth
|
|||||||
unref(keyboardEditConfig)
|
unref(keyboardEditConfig)
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// update-begin--author:sunjianlei---date:20250804---for:【issues/8593】修复列改变后内容不刷新
|
||||||
|
const vxeColumnsRef = ref(data.vxeColumns!.value || [])
|
||||||
|
const watchColumnsDebounce = debounce(async () => {
|
||||||
|
vxeColumnsRef.value = []
|
||||||
|
await nextTick()
|
||||||
|
vxeColumnsRef.value = data.vxeColumns!.value
|
||||||
|
}, 50)
|
||||||
|
watch(data.vxeColumns!, watchColumnsDebounce)
|
||||||
|
// update-end----author:sunjianlei---date:20250804---for:【issues/8593】修复列改变后内容不刷新
|
||||||
|
|
||||||
|
const vxeProps = computed(() => {
|
||||||
|
return {
|
||||||
|
...unref(vxePropsMerge),
|
||||||
|
// 【issue/8695】单独抽出 columns,防止性能问题
|
||||||
|
columns: unref(vxeColumnsRef),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
vxeProps,
|
vxeProps,
|
||||||
prefixCls: data.prefixCls,
|
prefixCls: data.prefixCls,
|
||||||
|
|||||||
@ -765,7 +765,8 @@ export function usePopBiz(ob, tableRef?) {
|
|||||||
if (props.param) {
|
if (props.param) {
|
||||||
Object.keys(props.param).map((key) => {
|
Object.keys(props.param).map((key) => {
|
||||||
let str = props.param[key];
|
let str = props.param[key];
|
||||||
if (key in queryParam) {
|
//【issues/8426】解决JPopup组件传参不能接收
|
||||||
|
if (key in queryParam.value) {
|
||||||
if (str && str.startsWith("'") && str.endsWith("'")) {
|
if (str && str.startsWith("'") && str.endsWith("'")) {
|
||||||
str = str.substring(1, str.length - 1);
|
str = str.substring(1, str.length - 1);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,7 +16,10 @@ interface ListPageOptions {
|
|||||||
// 样式作用域范围
|
// 样式作用域范围
|
||||||
designScope?: string;
|
designScope?: string;
|
||||||
// 【必填】表格参数配置
|
// 【必填】表格参数配置
|
||||||
tableProps: TableProps;
|
tableProps: TableProps & {
|
||||||
|
// 添加 defSort 类型定义
|
||||||
|
defSort?: DefSort;
|
||||||
|
};
|
||||||
// 是否分页
|
// 是否分页
|
||||||
pagination?: boolean;
|
pagination?: boolean;
|
||||||
// 导出配置
|
// 导出配置
|
||||||
@ -46,6 +49,11 @@ interface IDoRequestOptions {
|
|||||||
clearSelection?: boolean;
|
clearSelection?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface DefSort {
|
||||||
|
column: string;
|
||||||
|
order: 'asc' | 'desc';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* listPage页面公共方法
|
* listPage页面公共方法
|
||||||
*
|
*
|
||||||
@ -85,8 +93,17 @@ export function useListPage(options: ListPageOptions) {
|
|||||||
//update-end-author:taoyan date:20220507 for: erp代码生成 子表 导出报错,原因未知-
|
//update-end-author:taoyan date:20220507 for: erp代码生成 子表 导出报错,原因未知-
|
||||||
|
|
||||||
//update-begin-author:liusq date:20230410 for:[/issues/409]导出功能没有按排序结果导出,设置导出默认排序,创建时间倒序
|
//update-begin-author:liusq date:20230410 for:[/issues/409]导出功能没有按排序结果导出,设置导出默认排序,创建时间倒序
|
||||||
if(!paramsForm?.column){
|
// 获取表格的默认排序
|
||||||
Object.assign(paramsForm,{column:'createTime',order:'desc'});
|
const { defSort } = options?.tableProps ?? {};
|
||||||
|
if (defSort && !paramsForm?.column) {
|
||||||
|
// 使用类型断言确保 defSort 类型正确
|
||||||
|
Object.assign(paramsForm, {
|
||||||
|
column: (defSort as DefSort).column,
|
||||||
|
order: (defSort as DefSort).order,
|
||||||
|
});
|
||||||
|
} else if (!paramsForm?.column) {
|
||||||
|
// 如果没有默认排序,则使用创建时间倒序
|
||||||
|
Object.assign(paramsForm, { column: 'createTime', order: 'desc' });
|
||||||
}
|
}
|
||||||
//update-begin-author:liusq date:20230410 for: [/issues/409]导出功能没有按排序结果导出,设置导出默认排序,创建时间倒序
|
//update-begin-author:liusq date:20230410 for: [/issues/409]导出功能没有按排序结果导出,设置导出默认排序,创建时间倒序
|
||||||
|
|
||||||
|
|||||||
@ -141,10 +141,11 @@
|
|||||||
.@{prefix-cls} {
|
.@{prefix-cls} {
|
||||||
transition: width 0.2s;
|
transition: width 0.2s;
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
|
// update-begin--author:liaozhiyang---date:20250818---for:【issues/8709】LayoutContent样式多出1px
|
||||||
&--dark {
|
// &--dark {
|
||||||
margin-left: -1px;
|
// margin-left: -1px;
|
||||||
}
|
// }
|
||||||
|
// update-end--author:liaozhiyang---date:20250818---for:【issues/8709】LayoutContent样式多出1px
|
||||||
|
|
||||||
&--fixed {
|
&--fixed {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
|||||||
@ -7,7 +7,9 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
height: @header-height;
|
height: @header-height;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin-left: -1px;
|
// update-begin--author:liaozhiyang---date:20250818---for:【issues/8709】LayoutContent样式多出1px
|
||||||
|
// margin-left: -1px;
|
||||||
|
// update-end--author:liaozhiyang---date:20250818---for:【issues/8709】LayoutContent样式多出1px
|
||||||
line-height: @header-height;
|
line-height: @header-height;
|
||||||
color: @white;
|
color: @white;
|
||||||
background-color: @white;
|
background-color: @white;
|
||||||
@ -170,7 +172,9 @@
|
|||||||
&--dark {
|
&--dark {
|
||||||
background-color: @header-dark-bg-color !important;
|
background-color: @header-dark-bg-color !important;
|
||||||
// border-bottom: 1px solid @border-color-base;
|
// border-bottom: 1px solid @border-color-base;
|
||||||
border-left: 1px solid @border-color-base;
|
// update-begin--author:liaozhiyang---date:20250818---for:【issues/8709】LayoutContent样式多出1px
|
||||||
|
// border-left: 1px solid @border-color-base;
|
||||||
|
// update-end--author:liaozhiyang---date:20250818---for:【issues/8709】LayoutContent样式多出1px
|
||||||
|
|
||||||
.@{header-prefix-cls}-logo {
|
.@{header-prefix-cls}-logo {
|
||||||
&:hover {
|
&:hover {
|
||||||
|
|||||||
@ -86,7 +86,9 @@
|
|||||||
|
|
||||||
&-main {
|
&-main {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin-left: 1px;
|
// update-begin--author:liaozhiyang---date:20250818---for:【issues/8709】LayoutContent样式多出1px
|
||||||
|
// margin-left: 1px;
|
||||||
|
// update-end--author:liaozhiyang---date:20250818---for:【issues/8709】LayoutContent样式多出1px
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -116,7 +116,14 @@ export function getValueTypeBySchema(schema: FormSchema, formAction: FormActionT
|
|||||||
let valueType = 'string';
|
let valueType = 'string';
|
||||||
if (schema) {
|
if (schema) {
|
||||||
const componentProps = formAction.getSchemaComponentProps(schema);
|
const componentProps = formAction.getSchemaComponentProps(schema);
|
||||||
valueType = componentProps?.valueType ? componentProps?.valueType : valueType;
|
// update-begin--author:liaozhiyang---date:20250825---for:【issues/8738】componentProps是函数时获取不到valueType
|
||||||
|
if (isFunction(componentProps)) {
|
||||||
|
const result = componentProps(schema);
|
||||||
|
valueType = result?.valueType ?? valueType;
|
||||||
|
} else {
|
||||||
|
valueType = componentProps?.valueType ? componentProps?.valueType : valueType;
|
||||||
|
}
|
||||||
|
// update-end--author:liaozhiyang---date:20250825---for:【issues/8738】componentProps是函数时获取不到valueType
|
||||||
}
|
}
|
||||||
return valueType;
|
return valueType;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,6 +21,24 @@
|
|||||||
<template #JPopup="{ model, field }">
|
<template #JPopup="{ model, field }">
|
||||||
<JPopup v-model:value="model[field]" :formElRef="formElRef" code="report_user" :fieldConfig="[{ source: 'username', target: 'pop1' }]" />
|
<JPopup v-model:value="model[field]" :formElRef="formElRef" code="report_user" :fieldConfig="[{ source: 'username', target: 'pop1' }]" />
|
||||||
</template>
|
</template>
|
||||||
|
<template #JPopup2="{ model, field }">
|
||||||
|
<JPopup
|
||||||
|
v-model:value="model[field]"
|
||||||
|
:formElRef="formElRef"
|
||||||
|
code="withparamreport"
|
||||||
|
:param="{ sex: '1' }"
|
||||||
|
:fieldConfig="[{ source: 'name', target: 'pop2' }]"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<template #JPopup3="{ model, field }">
|
||||||
|
<JPopup
|
||||||
|
v-model:value="model[field]"
|
||||||
|
:formElRef="formElRef"
|
||||||
|
code="tj_user_report"
|
||||||
|
:param="{ sex: '1' }"
|
||||||
|
:fieldConfig="[{ source: 'realname', target: 'pop3' }]"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
<template #JAreaSelect="{ model, field }">
|
<template #JAreaSelect="{ model, field }">
|
||||||
<JAreaSelect v-model:value="model[field]" />
|
<JAreaSelect v-model:value="model[field]" />
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -626,6 +626,42 @@ export const schemas: FormSchema[] = [
|
|||||||
span: 12,
|
span: 12,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
field: 'pop2',
|
||||||
|
component: 'Input',
|
||||||
|
label: 'JPopup带参数示例',
|
||||||
|
helpMessage: ['插槽模式'],
|
||||||
|
slot: 'JPopup2',
|
||||||
|
colProps: {
|
||||||
|
span: 12,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'pop2',
|
||||||
|
component: 'JEllipsis',
|
||||||
|
label: '选中值',
|
||||||
|
colProps: {
|
||||||
|
span: 12,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'pop3',
|
||||||
|
component: 'Input',
|
||||||
|
label: 'JPopup带查询条件参数示例',
|
||||||
|
helpMessage: ['插槽模式'],
|
||||||
|
slot: 'JPopup3',
|
||||||
|
colProps: {
|
||||||
|
span: 12,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'pop3',
|
||||||
|
component: 'JEllipsis',
|
||||||
|
label: '选中值',
|
||||||
|
colProps: {
|
||||||
|
span: 12,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
field: 'JInputPop',
|
field: 'JInputPop',
|
||||||
component: 'JInputPop',
|
component: 'JInputPop',
|
||||||
|
|||||||
@ -146,11 +146,11 @@
|
|||||||
let multi_depart = loginResult.multi_depart;
|
let multi_depart = loginResult.multi_depart;
|
||||||
//0:无部门 1:一个部门 2:多个部门
|
//0:无部门 1:一个部门 2:多个部门
|
||||||
if (multi_depart == 0) {
|
if (multi_depart == 0) {
|
||||||
notification.warn({
|
// notification.warn({
|
||||||
message: '提示',
|
// message: '提示',
|
||||||
description: `您尚未归属部门,请确认账号信息`,
|
// description: `您尚未归属部门,请确认账号信息`,
|
||||||
duration: 3,
|
// duration: 3,
|
||||||
});
|
// });
|
||||||
isMultiDepart.value = false;
|
isMultiDepart.value = false;
|
||||||
} else if (multi_depart == 2) {
|
} else if (multi_depart == 2) {
|
||||||
isMultiDepart.value = true;
|
isMultiDepart.value = true;
|
||||||
|
|||||||
@ -123,11 +123,17 @@
|
|||||||
style: { textAlign: 'left' },
|
style: { textAlign: 'left' },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
//自定义默认排序
|
//自定义默认多字段排序
|
||||||
defSort: {
|
defSort: [
|
||||||
column: 'createTime,sex',
|
{
|
||||||
order: 'desc',
|
column: 'name',
|
||||||
},
|
order: 'desc',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
column: 'sex',
|
||||||
|
order: 'asc',
|
||||||
|
},
|
||||||
|
],
|
||||||
striped: true,
|
striped: true,
|
||||||
useSearchForm: true,
|
useSearchForm: true,
|
||||||
showTableSetting: true,
|
showTableSetting: true,
|
||||||
|
|||||||
@ -19,21 +19,43 @@ export default defineComponent({
|
|||||||
const title = ref<string>('邀请成员');
|
const title = ref<string>('邀请成员');
|
||||||
const [registerForm, { resetFields, validate }] = useForm({
|
const [registerForm, { resetFields, validate }] = useForm({
|
||||||
schemas: [
|
schemas: [
|
||||||
|
{
|
||||||
|
label: '邀请方式',
|
||||||
|
field: 'invitedMode',
|
||||||
|
component: 'RadioButtonGroup',
|
||||||
|
defaultValue: 1,
|
||||||
|
componentProps: {
|
||||||
|
options: [
|
||||||
|
{ label: '手机号', value: 1 },
|
||||||
|
{ label: '用户账号', value: 2 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: '手机号',
|
label: '手机号',
|
||||||
field: 'phone',
|
field: 'phone',
|
||||||
component: 'Input',
|
component: 'Input',
|
||||||
dynamicRules: () => {
|
ifShow: ({ values }) => values.invitedMode === 1,
|
||||||
return [
|
dynamicRules: ({ values }) => {
|
||||||
{ required: true, message: '请填写手机号' },
|
return values.invitedMode === 1
|
||||||
{ pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' },
|
? [
|
||||||
];
|
{ required: true, message: '请填写手机号' },
|
||||||
|
{ pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' },
|
||||||
|
]
|
||||||
|
: [{ pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' }];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'user',
|
||||||
|
component: 'Input',
|
||||||
|
label: '用户账号',
|
||||||
|
ifShow: ({ values }) => values.invitedMode === 2,
|
||||||
|
dynamicRules: ({ values }) => {
|
||||||
|
return values.invitedMode === 2 ? [{ required: true, message: '请输入用户账号' }] : [];
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
showActionButtonGroup: false,
|
showActionButtonGroup: false,
|
||||||
labelCol: { span: 24 },
|
|
||||||
wrapperCol: { span: 24 },
|
|
||||||
});
|
});
|
||||||
//表单赋值
|
//表单赋值
|
||||||
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
|
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
|
||||||
@ -47,7 +69,7 @@ export default defineComponent({
|
|||||||
*/
|
*/
|
||||||
async function handleSubmit() {
|
async function handleSubmit() {
|
||||||
let values = await validate();
|
let values = await validate();
|
||||||
emit('inviteOk',values.phone);
|
emit('inviteOk', values.phone, values.user);
|
||||||
closeModal();
|
closeModal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -156,12 +156,16 @@
|
|||||||
/**
|
/**
|
||||||
* 用户选择回调事件
|
* 用户选择回调事件
|
||||||
* @param options
|
* @param options
|
||||||
* @param value
|
* @param phone
|
||||||
|
* @param userSelectId
|
||||||
*/
|
*/
|
||||||
async function handleInviteUserOk(value) {
|
async function handleInviteUserOk(phone, username) {
|
||||||
//update-begin---author:wangshuai ---date:20230314 for:【QQYUN-4605】后台的邀请谁加入租户,没办法选不是租户下的用户------------
|
//update-begin---author:wangshuai ---date:20230314 for:【QQYUN-4605】后台的邀请谁加入租户,没办法选不是租户下的用户------------
|
||||||
if (value) {
|
if (phone) {
|
||||||
await invitationUserJoin({ ids: selectedRowKeys.value.join(','), phone: value });
|
await invitationUserJoin({ ids: selectedRowKeys.value.join(','), phone: phone });
|
||||||
|
}
|
||||||
|
if (username) {
|
||||||
|
await invitationUserJoin({ ids: selectedRowKeys.value.join(','), username: username });
|
||||||
}
|
}
|
||||||
//update-end---author:wangshuai ---date:20230314 for:【QQYUN-4605】后台的邀请谁加入租户,没办法选不是租户下的用户------------
|
//update-end---author:wangshuai ---date:20230314 for:【QQYUN-4605】后台的邀请谁加入租户,没办法选不是租户下的用户------------
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<BasicTable @register="registerTable" :rowSelection="rowSelection">
|
<BasicTable @register="registerTable" :rowSelection="rowSelection" @fetch-success="onFetchSuccess">
|
||||||
<template #tableTitle>
|
<template #tableTitle>
|
||||||
<a-button
|
<a-button
|
||||||
preIcon="ant-design:user-add-outlined"
|
preIcon="ant-design:user-add-outlined"
|
||||||
@ -67,7 +67,7 @@
|
|||||||
fixed: 'right',
|
fixed: 'right',
|
||||||
},
|
},
|
||||||
rowSelection:{
|
rowSelection:{
|
||||||
type: "radio"
|
type: "radio",
|
||||||
},
|
},
|
||||||
beforeFetch: (params) => {
|
beforeFetch: (params) => {
|
||||||
return Object.assign(params, { userTenantStatus: '1,3,4' });
|
return Object.assign(params, { userTenantStatus: '1,3,4' });
|
||||||
@ -76,6 +76,26 @@
|
|||||||
});
|
});
|
||||||
const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;
|
const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;
|
||||||
|
|
||||||
|
// 默认选中当前租户
|
||||||
|
function onFetchSuccess(data) {
|
||||||
|
let items = data.items;
|
||||||
|
console.log('items:', items);
|
||||||
|
// 当前登录租户ID
|
||||||
|
let loginTenantId = getTenantId();
|
||||||
|
console.log('loginTenantId:', loginTenantId);
|
||||||
|
// 如果当前登录租户ID在列表中,则默认选中
|
||||||
|
if (items && items.length > 0 && loginTenantId) {
|
||||||
|
for (let i = 0; i < items.length; i++) {
|
||||||
|
if (items[i].id == loginTenantId) {
|
||||||
|
console.log('items[i].id:', items[i].id);
|
||||||
|
selectedRowKeys.value = [items[i].id];
|
||||||
|
selectedRows.value = [items[i]];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作列定义
|
* 操作列定义
|
||||||
* @param record
|
* @param record
|
||||||
@ -99,11 +119,15 @@
|
|||||||
/**
|
/**
|
||||||
* 用户选择回调事件
|
* 用户选择回调事件
|
||||||
* @param options
|
* @param options
|
||||||
* @param value
|
* @param phone
|
||||||
|
* @param userSelectId
|
||||||
*/
|
*/
|
||||||
async function handleInviteUserOk(value) {
|
async function handleInviteUserOk(phone, username) {
|
||||||
if (value) {
|
if (phone) {
|
||||||
await invitationUserJoin({ ids: selectedRowKeys.value.join(','), phone: value });
|
await invitationUserJoin({ ids: selectedRowKeys.value.join(','), phone: phone });
|
||||||
|
}
|
||||||
|
if (username) {
|
||||||
|
await invitationUserJoin({ ids: selectedRowKeys.value.join(','), username: username });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -40,19 +40,19 @@ export const columns: BasicColumn[] = [
|
|||||||
title: '门牌号',
|
title: '门牌号',
|
||||||
width: 100,
|
width: 100,
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
dataIndex: 'position_dictText',
|
// dataIndex: 'position_dictText',
|
||||||
title: '职级',
|
// title: '职级',
|
||||||
width: 150
|
// width: 150
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
dataIndex: 'department_dictText',
|
// dataIndex: 'department_dictText',
|
||||||
title: '部门',
|
// title: '部门',
|
||||||
width: 150
|
// width: 150
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
dataIndex: 'createBy_dictText',
|
dataIndex: 'createBy_dictText',
|
||||||
title: '创建者(拥有者)',
|
title: '创建者(拥有)',
|
||||||
width: 150
|
width: 150
|
||||||
},
|
},
|
||||||
/* {
|
/* {
|
||||||
|
|||||||
Reference in New Issue
Block a user