Squashed commit of the following:

commit b7519d7199
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 19 15:18:52 2025 +0800

    中文乱码

commit 81ba07c853
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 19 15:09:21 2025 +0800

    增加代码生成用法文档

commit 92ed296e63
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 19 14:04:22 2025 +0800

    【issues/8709】LayoutContent样式多出1px

commit c2aff84914
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 19 14:04:09 2025 +0800

    【issues/8683】DatePicker组件的componentProps使用函数形式时初始值获取不对

commit e002cd3bf3
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 19 14:03:51 2025 +0800

    【issues/8680】editComponentProps 可接受一个函数传入record

commit 1de07ff3ff
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 19 14:03:32 2025 +0800

    -- author:liaozhiyang---date:20250813--for:【issues/8690】BasicTable的rowSelection新增onSelect方法 ---

commit 35852d41f1
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 19 14:03:04 2025 +0800

    jvxeTable表格切换disabled属性时,相邻的两个枚举下拉,如果值是一样的,但是label不一样,会把第二个下拉的显示值渲染到第一个下拉中 #8593

commit a2cb1d9f25
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 19 14:00:01 2025 +0800

    【issues/8529】setColumns将原本隐藏的列展示后,列配置里却没有勾选该列

commit 2002af54d0
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 19 13:59:42 2025 +0800

    JVxeTypes.image组件action字段只能定义第1张图片的上传接口,后面图片的接口还是使用公共上传接口 #8628

commit 89747403a2
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 19 13:59:28 2025 +0800

    JVxeTable组件全选翻页后会被取消选中 #8630

commit 3db0995c3f
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 19 11:23:19 2025 +0800

    [代码生成]前端代码支持直接生成到前端项目、菜单sql会自动生成到start项目的flyway目录

commit 950621dd88
Author: JEECG <445654970@qq.com>
Date:   Mon Aug 18 23:04:59 2025 +0800

    升级代码生成器,一键生成代码,vue3代码会生成到前端项目、菜单升级sql自动迁移到flyway目录重启自动执行(不需要手工迁移前端代码和手工执行升级sql)

commit 033cf51d69
Author: JEECG <445654970@qq.com>
Date:   Mon Aug 18 23:04:52 2025 +0800

    升级代码生成器,一键生成代码,vue3代码会生成到前端项目、菜单升级sql自动迁移到flyway目录重启自动执行(不需要手工迁移前端代码和手工执行升级sql)

commit fb9f367517
Author: JEECG <445654970@qq.com>
Date:   Mon Aug 18 23:02:53 2025 +0800

    代码生成,online自定义按钮无排序报错

commit b2da45d803
Author: JEECG <445654970@qq.com>
Date:   Mon Aug 18 16:23:22 2025 +0800

    演示地址

commit 2840f0d325
Author: JEECG <445654970@qq.com>
Date:   Mon Aug 18 15:37:10 2025 +0800

    默认账号密码

commit 6ace7eae8a
Author: JEECG <445654970@qq.com>
Date:   Sun Aug 17 15:11:45 2025 +0800

    开发环境关闭日志生成,项目启动快;生产环境请按需打开注释

commit 3d88147c59
Author: JEECG <445654970@qq.com>
Date:   Thu Aug 14 23:03:46 2025 +0800

    调整微服务启动文档

commit ba0052d452
Author: JEECG <445654970@qq.com>
Date:   Wed Aug 13 13:55:13 2025 +0800

    支持lazy-initialization启动,项目大了后启动会更快

commit 69fca254f0
Author: JEECG <445654970@qq.com>
Date:   Wed Aug 13 11:47:27 2025 +0800

    补充注释

commit b3de596199
Author: JEECG <445654970@qq.com>
Date:   Wed Aug 13 11:47:16 2025 +0800

    彻底关闭 prettier 校验规则

commit f46273d15e
Author: JEECG <445654970@qq.com>
Date:   Wed Aug 13 10:26:23 2025 +0800

    设置ESLint 的 vue/html-self-closing 自闭合标签警告配置

commit 0fe258dbc2
Author: JEECG <445654970@qq.com>
Date:   Wed Aug 13 09:26:16 2025 +0800

    修复 onExportXls defSort 不生效问题 #7570

commit de7f23c555
Merge: d97e56b2 444c7140
Author: JEECG <zhangdaiscott@163.com>
Date:   Wed Aug 13 09:20:31 2025 +0800

    Merge pull request #8496 from lileiAimee/developer

    解决TableAction中自定义图标颜色不起作用的问题

commit d97e56b2f0
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 12 19:08:43 2025 +0800

    多租户模式下系统系统会给租户默认增加上测试的角色菜单,但是后台获取菜单时异常,无法打开相关页面 #8667

commit c868496b78
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 12 19:02:49 2025 +0800

    映射警告

commit c5150baa69
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 12 18:18:34 2025 +0800

    支持通过用户账号邀请加入租户

commit 3d9f59c69b
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 12 18:17:55 2025 +0800

    邀请用户加入租户,支持通过用户账号

commit 420d6db3fb
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 12 18:06:20 2025 +0800

    登录用户没有部门,不提示警告

commit 473a626039
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 12 14:10:02 2025 +0800

    增加JPopup组件带参数示例

commit 0308b0597c
Author: JEECG <445654970@qq.com>
Date:   Tue Aug 12 14:08:18 2025 +0800

    【issues/8426】解决JPopup组件传参不能接收

commit 2191f5d48c
Author: JEECG <445654970@qq.com>
Date:   Mon Aug 11 22:43:07 2025 +0800

    调整位置

commit 1158b0b6e7
Author: JEECG <445654970@qq.com>
Date:   Mon Aug 11 22:30:39 2025 +0800

    升级seata到1.7.0;升级dynamic-datasource-spring-boot-starter到3.5.2

commit ead2cef1f4
Author: JEECG <445654970@qq.com>
Date:   Mon Aug 11 18:47:48 2025 +0800

    支持多字段默认排序defSort数组、解决多列排序无效 #8659

commit 83bb0a0a6a
Author: JEECG <445654970@qq.com>
Date:   Mon Aug 11 18:47:43 2025 +0800

    支持多字段默认排序defSort数组

commit b474e9e5a5
Author: JEECG <445654970@qq.com>
Date:   Sun Aug 10 17:06:01 2025 +0800

    开发环境安装

commit 422373e300
Author: JEECG <445654970@qq.com>
Date:   Sun Aug 10 16:30:13 2025 +0800

    提供JeecgBoot 运行环境python检查脚本

commit 1cf11a4c2a
Author: JEECG <445654970@qq.com>
Date:   Sat Aug 9 09:41:57 2025 +0800

    提供jeecgboot-oracle11g.dmp

commit 925f163784
Author: JEECG <445654970@qq.com>
Date:   Fri Aug 8 22:07:24 2025 +0800

    引入jeecg-boot-starter-job依赖启动报错 #8694

commit d01c1d7d47
Author: JEECG <445654970@qq.com>
Date:   Thu Aug 7 15:41:21 2025 +0800

    支持lazy-initialization

commit 3576b54945
Author: JEECG <445654970@qq.com>
Date:   Thu Aug 7 15:36:51 2025 +0800

    升级积木报表和积木BI到最新版v2.1.2

commit 444c7140f6
Author: lileiAimee <345697385@qq.com>
Date:   Wed Jun 25 09:55:07 2025 +0800

    解决TableAction中自定义图标颜色不起作用的问题

# Conflicts:
#	README-EN.md
#	README.md
#	jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/pom.xml
#	jeecg-boot/pom.xml
springboot3
JEECG 2025-08-19 22:58:12 +08:00
parent 08f245bdf9
commit db1ff0268b
53 changed files with 374 additions and 156 deletions

View File

@ -69,10 +69,13 @@ Jeecg-Boot AI low code platform can be applied in the development of any J2EE pr
Starts the project Starts the project
----------------------------------- -----------------------------------
- [Development Environment setup](https://help.jeecg.com/java/setup/tools) > Default account password admin/123456
- [IDEA Quick start](https://help.jeecg.com/java/setup/idea/startup)
- [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

View File

@ -66,18 +66,22 @@ JeecgBoot低代码平台可以应用在任何J2EE项目的开发中支持
启动项目 启动项目
----------------------------------- -----------------------------------
- [开发环境搭建](https://help.jeecg.com/java/setup/tools) > 默认账号密码: admin/123456
- [IDEA启动前后端项目](https://help.jeecg.com/java/setup/idea/startup)
- [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(满)、其他(满)
@ -196,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(三种加载方式) √

View File

@ -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("邀请用户成功");
} }

View File

@ -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(

View File

@ -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;
} }

View File

@ -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);
/** /**
* *

View File

@ -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]租户逻辑改造,改成关系表------------

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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>

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -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}按钮,对应的业务逻辑需自行实现!');

View File

@ -25,6 +25,9 @@ management:
include: metrics,httpexchanges,jeecghttptrace include: metrics,httpexchanges,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
@ -180,8 +183,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专用配置
@ -294,6 +297,7 @@ logging:
org.springframework.context.support.PostProcessorRegistrationDelegate: error org.springframework.context.support.PostProcessorRegistrationDelegate: error
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:
#开启增强配置 #开启增强配置

View File

@ -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

View File

@ -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>

View File

@ -71,8 +71,8 @@
<shiro.version>2.0.4</shiro.version> <shiro.version>2.0.4</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.14</autopoi-web.version> <autopoi-web.version>1.4.15</autopoi-web.version>
<minio.version>8.5.7</minio.version> <minio.version>8.5.7</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>
@ -443,6 +443,10 @@
<artifactId>druid</artifactId> <artifactId>druid</artifactId>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
</exclusion> </exclusion>
<exclusion>
<artifactId>autopoi</artifactId>
<groupId>org.jeecgframework</groupId>
</exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<!-- mongo、redis和文件数据集支持包按需引入 --> <!-- mongo、redis和文件数据集支持包按需引入 -->
@ -459,6 +463,10 @@
<artifactId>autopoi-web</artifactId> <artifactId>autopoi-web</artifactId>
<groupId>org.jeecgframework</groupId> <groupId>org.jeecgframework</groupId>
</exclusion> </exclusion>
<exclusion>
<artifactId>autopoi</artifactId>
<groupId>org.jeecgframework</groupId>
</exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<!-- 后台导出接口Echart图表支持包按需引入 --> <!-- 后台导出接口Echart图表支持包按需引入 -->
@ -472,6 +480,16 @@
<groupId>org.jeecgframework.jimureport</groupId> <groupId>org.jeecgframework.jimureport</groupId>
<artifactId>jimubi-spring-boot3-starter</artifactId> <artifactId>jimubi-spring-boot3-starter</artifactId>
<version>${jimubi-spring-boot-starter.version}</version> <version>${jimubi-spring-boot-starter.version}</version>
<exclusions>
<exclusion>
<artifactId>autopoi-web</artifactId>
<groupId>org.jeecgframework</groupId>
</exclusion>
<exclusion>
<artifactId>autopoi</artifactId>
<groupId>org.jeecgframework</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!-- chatgpt --> <!-- chatgpt -->
<dependency> <dependency>

View File

@ -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',

View File

@ -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,
}; };

View File

@ -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 forissues/435------------ //update-begin---author:wangshuai ---date:20230410 forissues/435------------
let valueFormat:string = ""; let valueFormat:string = "";
if(componentProps){ // update-begin--author:liaozhiyang---date:20250818---forissues/8683DatePickercomponentProps使
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---forissues/8683DatePickercomponentProps使
if(!valueFormat){ if(!valueFormat){
console.warn("未配置valueFormat,可能导致格式化错误!"); console.warn("未配置valueFormat,可能导致格式化错误!");
} }

View File

@ -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,
}); });
} }

View File

@ -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>

View File

@ -100,7 +100,14 @@
}); });
const getComponentProps = computed(() => { const getComponentProps = computed(() => {
const compProps = props.column?.editComponentProps ?? {}; let compProps;
// update-begin--author:liaozhiyang---date:20250818---forissues/8680editComponentPropsrecord
if (isFunction(props.column?.editComponentProps)) {
compProps = props.column?.editComponentProps(props.record);
} else {
compProps = props.column?.editComponentProps ?? {};
}
// update-end--author:liaozhiyang---date:20250818---forissues/8680editComponentPropsrecord
const component = unref(getComponent); const component = unref(getComponent);
const apiSelectProps: Recordable = {}; const apiSelectProps: Recordable = {};
if (component === 'ApiSelect') { if (component === 'ApiSelect') {

View File

@ -222,14 +222,18 @@
checkSelect.value = !!values.rowSelection; checkSelect.value = !!values.rowSelection;
}); });
// update-begin--author:liaozhiyang---date:20240724---forissues/6908BasicColumnFormSchema // update-begin--author:liaozhiyang---date:20240724---forissues/6908BasicColumnFormSchema
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---forissues/6908BasicColumnFormSchema // update-end--author:liaozhiyang---date:20240724---forissues/6908BasicColumnFormSchema
// update-begin--author:liaozhiyang---date:20250813---forissues/8529setColumns
watch([getColumnsRef], () => {
init();
});
// update-end--author:liaozhiyang---date:20250813---forissues/8529setColumns
function getColumns() { function getColumns() {
const ret: Options[] = []; const ret: Options[] = [];
// update-begin--author:liaozhiyang---date:20250403---forissues/7996 // update-begin--author:liaozhiyang---date:20250403---forissues/7996

View File

@ -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();
} }

View File

@ -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
@ -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---forissues/8680editComponentPropsrecord
editComponentProps?: Recordable | ((record: Recordable) => Recordable);
// update-end--author:liaozhiyang---date:20250818---forissues/8680editComponentPropsrecord
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;

View File

@ -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: {
// //

View File

@ -1,4 +1,4 @@
import { unref, computed } from 'vue'; import { unref, computed, ref, watch, nextTick } from 'vue';
import { merge } from 'lodash-es'; import { merge } 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';
@ -40,6 +40,16 @@ export function useFinallyProps(props: JVxeTableProps, data: JVxeDataProps, meth
}); });
return events; return events;
}); });
// update-begin--author:sunjianlei---date:20250804---for:issues/8593
const vxeColumnsRef = ref([])
watch(data.vxeColumns, async () => {
vxeColumnsRef.value = []
await nextTick()
vxeColumnsRef.value = data.vxeColumns.value
}, {immediate: true})
// update-end----author:sunjianlei---date:20250804---for:issues/8593
// vxe props // vxe props
const vxeProps = computed(() => { const vxeProps = computed(() => {
// update-begin--author:liaozhiyang---date:20240417---for:QQYUN-8785onlineidid // update-begin--author:liaozhiyang---date:20240417---for:QQYUN-8785onlineidid
@ -77,7 +87,8 @@ 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),
columns: vxeColumnsRef.value,
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,

View File

@ -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/8426JPopup
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);
} }

View File

@ -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],

View File

@ -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---forissues/8709LayoutContent1px
&--dark { // &--dark {
margin-left: -1px; // margin-left: -1px;
} // }
// update-end--author:liaozhiyang---date:20250818---forissues/8709LayoutContent1px
&--fixed { &--fixed {
position: fixed; position: fixed;

View File

@ -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 {

View File

@ -86,7 +86,9 @@
&-main { &-main {
width: 100%; width: 100%;
margin-left: 1px; // update-begin--author:liaozhiyang---date:20250818---forissues/8709LayoutContent1px
// margin-left: 1px;
// update-end--author:liaozhiyang---date:20250818---forissues/8709LayoutContent1px
} }
} }
</style> </style>

View File

@ -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>

View File

@ -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',

View File

@ -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;

View File

@ -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();
} }

View File

@ -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 forQQYUN-4605------------ //update-begin---author:wangshuai ---date:20230314 forQQYUN-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 forQQYUN-4605------------ //update-end---author:wangshuai ---date:20230314 forQQYUN-4605------------
} }

View File

@ -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 });
} }
} }

View File

@ -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
}, },
/* { /* {