mirror of
https://github.com/jeecgboot/JeecgBoot.git
synced 2025-12-08 17:12:28 +08:00
Compare commits
22 Commits
v3.7.1spri
...
v3.7.1last
| Author | SHA1 | Date | |
|---|---|---|---|
| 64b29f47e0 | |||
| 6198a3702f | |||
| 453acb9b4e | |||
| 565753e370 | |||
| e2aaf0f978 | |||
| 32c8370ef2 | |||
| a79004b924 | |||
| eb1612f8dd | |||
| a35555619c | |||
| b3e3951064 | |||
| 44ec26574e | |||
| 55a25caafd | |||
| 62f7b0d489 | |||
| b16fdef8dc | |||
| b5b667058b | |||
| 6c0c259742 | |||
| ca56c54aa0 | |||
| 74297af987 | |||
| fedb6b84b9 | |||
| fdc713339e | |||
| f28a2dbbeb | |||
| b81435aaca |
@ -75,7 +75,7 @@ Technical documentation
|
|||||||
- Demo : [OnlineDemo](http://boot3.jeecg.com) | [APP](http://jeecg.com/appIndex)
|
- Demo : [OnlineDemo](http://boot3.jeecg.com) | [APP](http://jeecg.com/appIndex)
|
||||||
- Doc: [http://help.jeecg.com](http://help.jeecg.com)
|
- Doc: [http://help.jeecg.com](http://help.jeecg.com)
|
||||||
- Newbie guide: [Quick start](http://www.jeecg.com/doc/quickstart) | [Q&A ](http://www.jeecg.com/doc/qa) | [1 minute experience](https://my.oschina.net/jeecg/blog/3083313)
|
- Newbie guide: [Quick start](http://www.jeecg.com/doc/quickstart) | [Q&A ](http://www.jeecg.com/doc/qa) | [1 minute experience](https://my.oschina.net/jeecg/blog/3083313)
|
||||||
- QQ group : ⑨808791225、⑧825232878、⑦791696430、⑥730954414(full)、683903138(full)、⑤860162132(full)、④774126647(full)、③816531124(full)、②769925425(full)、①284271917(full)
|
- QQ group : ⑩716488839、⑨808791225、⑧825232878、⑦791696430、⑥730954414(full)、683903138(full)、⑤860162132(full)、④774126647(full)、③816531124(full)、②769925425(full)、①284271917(full)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
18
README.md
18
README.md
@ -18,7 +18,7 @@ JeecgBoot 低代码开发平台
|
|||||||
|
|
||||||
<h3 align="center">Java Low Code Platform for Enterprise web applications</h3>
|
<h3 align="center">Java Low Code Platform for Enterprise web applications</h3>
|
||||||
|
|
||||||
JeecgBoot 是一款基于代码生成器的`低代码开发平台`!前后端分离架构 SpringBoot2.x和3.x,SpringCloud,Ant Design Vue3,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成,实现低代码开发! JeecgBoot 引领新的低代码开发模式(OnlineCoding-> 代码生成器-> 手工MERGE), 帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高效率,节省研发成本,同时又不失灵活性!
|
JeecgBoot 是一款基于代码生成器的`低代码开发平台`!前后端分离架构 SpringBoot2.x和3.x,SpringCloud,Ant Design Vue3,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成,实现低代码开发! JeecgBoot集成AI模型能力,引领新的低代码开发模式(OnlineCoding-> 代码生成器-> 手工MERGE), 帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高效率,节省研发成本,同时又不失灵活性!
|
||||||
|
|
||||||
JeecgBoot 提供了一系列`低代码模块`,实现在线开发`真正的零代码`:Online表单开发、Online报表、报表配置能力、在线图表设计、仪表盘设计、大屏设计、移动配置能力、表单设计器、在线设计流程、流程自动化配置、插件能力(可插拔)等等!
|
JeecgBoot 提供了一系列`低代码模块`,实现在线开发`真正的零代码`:Online表单开发、Online报表、报表配置能力、在线图表设计、仪表盘设计、大屏设计、移动配置能力、表单设计器、在线设计流程、流程自动化配置、插件能力(可插拔)等等!
|
||||||
|
|
||||||
@ -33,7 +33,6 @@ JeecgBoot 提供了一系列`低代码模块`,实现在线开发`真正的零
|
|||||||
Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,支持信创国产化(默认适配达梦和人大金仓)。尤其适合SAAS项目、企业信息管理系统(MIS)、内部办公系统(OA)、企业资源计划系统(ERP)、客户关系管理系统(CRM)等,其半智能手工Merge的开发方式,可以显著提高开发效率70%以上,极大降低开发成本。
|
Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,支持信创国产化(默认适配达梦和人大金仓)。尤其适合SAAS项目、企业信息管理系统(MIS)、内部办公系统(OA)、企业资源计划系统(ERP)、客户关系管理系统(CRM)等,其半智能手工Merge的开发方式,可以显著提高开发效率70%以上,极大降低开发成本。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### 项目说明
|
#### 项目说明
|
||||||
|
|
||||||
| 项目名 | 说明 |
|
| 项目名 | 说明 |
|
||||||
@ -43,6 +42,17 @@ Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,
|
|||||||
| `jeecg-uniapp` | [配套APP框架](https://github.com/jeecgboot/jeecg-uniapp) 适配多个终端,支持APP、小程序、H5 |
|
| `jeecg-uniapp` | [配套APP框架](https://github.com/jeecgboot/jeecg-uniapp) 适配多个终端,支持APP、小程序、H5 |
|
||||||
|
|
||||||
|
|
||||||
|
开源协议说明
|
||||||
|
-----------------------------------
|
||||||
|
JeecgBoot开源版本,底层完全开源可以自主开发,遵循Apache2.0协议,详细见 https://github.com/jeecgboot/JeecgBoot#Apache-2.0-1-ov-file
|
||||||
|
|
||||||
|
开源协议中文释意如下:
|
||||||
|
- 1.JeecgBoot开源版本无任何限制,在遵循本开源协议条款下,允许商用使用,不会造成侵权行为。
|
||||||
|
- 2.允许基于本平台软件开展业务系统开发。
|
||||||
|
- 3.在任何情况下,您不得使用本软件开发可能被认为与本软件竞争的软件。
|
||||||
|
- 4.针对企业用户我们也提供“企业级版本”,详细见 https://jeecg.com/vip
|
||||||
|
|
||||||
|
|
||||||
技术文档
|
技术文档
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
@ -51,7 +61,7 @@ Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,
|
|||||||
- 开发文档: [https://help.jeecg.com](https://help.jeecg.com)
|
- 开发文档: [https://help.jeecg.com](https://help.jeecg.com)
|
||||||
- 反馈问题: [在Github上提Issues](https://github.com/jeecgboot/JeecgBoot/issues/new)
|
- 反馈问题: [在Github上提Issues](https://github.com/jeecgboot/JeecgBoot/issues/new)
|
||||||
- 新手指南: [快速入门](http://www.jeecg.com/doc/quickstart) | [入门视频](http://jeecg.com/doc/video)
|
- 新手指南: [快速入门](http://www.jeecg.com/doc/quickstart) | [入门视频](http://jeecg.com/doc/video)
|
||||||
- QQ交流群 : ⑨808791225、其他(满)
|
- QQ交流群 : ⑩716488839、⑨808791225(满)、其他(满)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -152,7 +162,7 @@ Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,
|
|||||||
-----------------------------------
|
-----------------------------------
|
||||||
* 1.采用最新主流前后分离框架(Springboot+Mybatis+antd+vue3),容易上手; 代码生成器依赖性低,灵活的扩展能力,可快速实现二次开发;
|
* 1.采用最新主流前后分离框架(Springboot+Mybatis+antd+vue3),容易上手; 代码生成器依赖性低,灵活的扩展能力,可快速实现二次开发;
|
||||||
* 2.支持微服务SpringCloud Alibaba(Nacos、Gateway、Sentinel、Skywalking),提供切换机制支持单体和微服务自由切换
|
* 2.支持微服务SpringCloud Alibaba(Nacos、Gateway、Sentinel、Skywalking),提供切换机制支持单体和微服务自由切换
|
||||||
* 3.开发效率高,采用代码生成器,单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用;
|
* 3.开发效率高,采用代码生成器,单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用;引入AI能力,支持自动建表等功能;
|
||||||
* 4.代码生成器提供强大模板机制,支持自定义模板,目前提供四套风格模板(单表两套、树模型一套、一对多三套)
|
* 4.代码生成器提供强大模板机制,支持自定义模板,目前提供四套风格模板(单表两套、树模型一套、一对多三套)
|
||||||
* 5.代码生成器非常智能,在线业务建模、在线配置、所见即所得支持23种类控件,一键生成前后端代码,大幅度提升开发效率,不再为重复工作发愁。
|
* 5.代码生成器非常智能,在线业务建模、在线配置、所见即所得支持23种类控件,一键生成前后端代码,大幅度提升开发效率,不再为重复工作发愁。
|
||||||
* 6.低代码能力:Online在线表单(无需编码,通过在线配置表单,实现表单的增删改查,支持单表、树、一对多、一对一等模型,实现人人皆可编码)
|
* 6.低代码能力:Online在线表单(无需编码,通过在线配置表单,实现表单的增删改查,支持单表、树、一对多、一对一等模型,实现人人皆可编码)
|
||||||
|
|||||||
@ -35,7 +35,7 @@ JeecgBoot 是一款基于代码生成器的`低代码开发平台`!前后端
|
|||||||
|
|
||||||
- 官方网站: [http://www.jeecg.com](http://www.jeecg.com)
|
- 官方网站: [http://www.jeecg.com](http://www.jeecg.com)
|
||||||
- 新手指南: [快速入门](http://www.jeecg.com/doc/quickstart)
|
- 新手指南: [快速入门](http://www.jeecg.com/doc/quickstart)
|
||||||
- QQ交流群 : ⑨808791225、其他(满)
|
- QQ交流群 : ⑩716488839、⑨808791225、其他(满)
|
||||||
- 在线演示 : [在线演示](http://boot3.jeecg.com) | [APP演示](http://jeecg.com/appIndex)
|
- 在线演示 : [在线演示](http://boot3.jeecg.com) | [APP演示](http://jeecg.com/appIndex)
|
||||||
> 演示系统的登录账号密码,请点击 [获取账号密码](http://jeecg.com/doc/demo) 获取
|
> 演示系统的登录账号密码,请点击 [获取账号密码](http://jeecg.com/doc/demo) 获取
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -3,6 +3,7 @@
|
|||||||
> JeecgBoot属于平台级产品,每次升级改动较大,目前做不到平滑升级。
|
> JeecgBoot属于平台级产品,每次升级改动较大,目前做不到平滑升级。
|
||||||
|
|
||||||
### 增量升级方案
|
### 增量升级方案
|
||||||
|
|
||||||
#### 1.代码合并
|
#### 1.代码合并
|
||||||
本地通过svn或git做好主干,在分支上做业务开发,jeecg每次版本发布,可以手工覆盖主干的代码,对比合并代码;
|
本地通过svn或git做好主干,在分支上做业务开发,jeecg每次版本发布,可以手工覆盖主干的代码,对比合并代码;
|
||||||
|
|
||||||
@ -11,5 +12,12 @@
|
|||||||
- 其他库请手工执行SQL, 目录: `jeecg-module-system\jeecg-system-start\src\main\resources\flyway\sql\mysql`
|
- 其他库请手工执行SQL, 目录: `jeecg-module-system\jeecg-system-start\src\main\resources\flyway\sql\mysql`
|
||||||
> 注意: 升级sql只提供mysql版本;如果有权限升级, 还需要手工角色授权,退出重新登录才好使。
|
> 注意: 升级sql只提供mysql版本;如果有权限升级, 还需要手工角色授权,退出重新登录才好使。
|
||||||
|
|
||||||
#### 3.兼容问题
|
#### 3.其他数据库脚本说明
|
||||||
|
原先官方默认提供oracle和SqlServer的脚本,但是维护成本太高,未提供脚本的数据库,可以参考下面的文档自己转
|
||||||
|
https://my.oschina.net/jeecg/blog/4905722
|
||||||
|
(注意:定时任务的表qrtz_*,需要删掉用原始的脚本重新执行一下)
|
||||||
|
quartz-2.2.3-distribution.tar.gz放到百度网盘中,大家自己下载,执行所需数据库脚本
|
||||||
|
https://pan.baidu.com/s/1WrmZdUuAPg3iBwJ-LoHWyg?pwd=8mdz
|
||||||
|
|
||||||
|
#### 4.兼容问题
|
||||||
每次发版,会针对不兼容地方重点说明。
|
每次发版,会针对不兼容地方重点说明。
|
||||||
@ -106,9 +106,10 @@ public class DynamicDBUtil {
|
|||||||
dataSource.getConnection().commit();
|
dataSource.getConnection().commit();
|
||||||
dataSource.getConnection().close();
|
dataSource.getConnection().close();
|
||||||
dataSource.close();
|
dataSource.close();
|
||||||
|
DataSourceCachePool.removeCache(dbKey);
|
||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
log.info(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
package org.jeecg.config.shiro;
|
package org.jeecg.config.shiro;
|
||||||
|
|
||||||
import lombok.SneakyThrows;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
|
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
|
||||||
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
|
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
|
||||||
@ -18,17 +17,15 @@ import org.jeecg.config.shiro.filters.CustomShiroFilterFactoryBean;
|
|||||||
import org.jeecg.config.shiro.filters.JwtFilter;
|
import org.jeecg.config.shiro.filters.JwtFilter;
|
||||||
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
|
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
|
||||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
|
||||||
import org.springframework.context.annotation.*;
|
|
||||||
import org.springframework.core.annotation.AnnotationUtils;
|
|
||||||
import org.springframework.core.env.Environment;
|
|
||||||
import org.springframework.core.type.filter.AnnotationTypeFilter;
|
|
||||||
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
|
||||||
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
|
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
|
||||||
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.DependsOn;
|
||||||
|
import org.springframework.core.env.Environment;
|
||||||
|
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import org.springframework.web.filter.DelegatingFilterProxy;
|
import org.springframework.web.filter.DelegatingFilterProxy;
|
||||||
import redis.clients.jedis.HostAndPort;
|
import redis.clients.jedis.HostAndPort;
|
||||||
import redis.clients.jedis.JedisCluster;
|
import redis.clients.jedis.JedisCluster;
|
||||||
@ -36,7 +33,6 @@ import redis.clients.jedis.JedisCluster;
|
|||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.DispatcherType;
|
import javax.servlet.DispatcherType;
|
||||||
import javax.servlet.Filter;
|
import javax.servlet.Filter;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -127,6 +123,9 @@ public class ShiroConfig {
|
|||||||
filterChainDefinitionMap.put("/**/*.ttf", "anon");
|
filterChainDefinitionMap.put("/**/*.ttf", "anon");
|
||||||
filterChainDefinitionMap.put("/**/*.woff", "anon");
|
filterChainDefinitionMap.put("/**/*.woff", "anon");
|
||||||
filterChainDefinitionMap.put("/**/*.woff2", "anon");
|
filterChainDefinitionMap.put("/**/*.woff2", "anon");
|
||||||
|
|
||||||
|
filterChainDefinitionMap.put("/**/*.glb", "anon");
|
||||||
|
filterChainDefinitionMap.put("/**/*.wasm", "anon");
|
||||||
//update-end--Author:scott Date:20221116 for:排除静态资源后缀
|
//update-end--Author:scott Date:20221116 for:排除静态资源后缀
|
||||||
|
|
||||||
filterChainDefinitionMap.put("/druid/**", "anon");
|
filterChainDefinitionMap.put("/druid/**", "anon");
|
||||||
@ -190,12 +189,24 @@ public class ShiroConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//update-begin---author:chenrui ---date:20240126 for:【QQYUN-7932】AI助手------------
|
//update-begin---author:chenrui ---date:20240126 for:【QQYUN-7932】AI助手------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* spring过滤装饰器 <br/>
|
||||||
|
* 因为shiro的filter不支持异步请求,导致所有的异步请求都会报错. <br/>
|
||||||
|
* 所以需要用spring的FilterRegistrationBean再代理一下shiro的filter.为他扩展异步支持. <br/>
|
||||||
|
* 后续所有异步的接口都需要再这里增加registration.addUrlPatterns("/xxx/xxx");
|
||||||
|
* @return
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2024/12/3 19:49
|
||||||
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public FilterRegistrationBean shiroFilterRegistration() {
|
public FilterRegistrationBean shiroFilterRegistration() {
|
||||||
FilterRegistrationBean registration = new FilterRegistrationBean();
|
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||||
registration.setFilter(new DelegatingFilterProxy("shiroFilterFactoryBean"));
|
registration.setFilter(new DelegatingFilterProxy("shiroFilterFactoryBean"));
|
||||||
registration.setEnabled(true);
|
registration.setEnabled(true);
|
||||||
registration.addUrlPatterns("/*");
|
//update-begin---author:chenrui ---date:20241202 for:[issues/7491]运行时间好长,效率慢 ------------
|
||||||
|
registration.addUrlPatterns("/test/ai/chat/send");
|
||||||
|
//update-end---author:chenrui ---date:20241202 for:[issues/7491]运行时间好长,效率慢 ------------
|
||||||
//支持异步
|
//支持异步
|
||||||
registration.setAsyncSupported(true);
|
registration.setAsyncSupported(true);
|
||||||
registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC);
|
registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC);
|
||||||
|
|||||||
@ -34,10 +34,10 @@
|
|||||||
<groupId>org.jeecgframework.jimureport</groupId>
|
<groupId>org.jeecgframework.jimureport</groupId>
|
||||||
<artifactId>jimureport-spring-boot-starter</artifactId>
|
<artifactId>jimureport-spring-boot-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- 积木仪表盘 -->
|
<!-- 积木BI -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.jimureport</groupId>
|
<groupId>org.jeecgframework.jimureport</groupId>
|
||||||
<artifactId>jimureport-dashboard-spring-boot-starter</artifactId>
|
<artifactId>jimubi-spring-boot-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- 积木报表 mongo redis 支持包
|
<!-- 积木报表 mongo redis 支持包
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -1,79 +1,77 @@
|
|||||||
/*
|
-- -------------------------------- The script used when storeMode is 'db' --------------------------------
|
||||||
Navicat Premium Data Transfer
|
-- the table to store GlobalSession data
|
||||||
|
|
||||||
Source Server : localhost
|
|
||||||
Source Server Type : MariaDB
|
|
||||||
Source Server Version : 100316
|
|
||||||
Source Host : localhost:3300
|
|
||||||
Source Schema : seata
|
|
||||||
|
|
||||||
Target Server Type : MariaDB
|
|
||||||
Target Server Version : 100316
|
|
||||||
File Encoding : 65001
|
|
||||||
|
|
||||||
Date: 05/01/2022 20:25:07
|
|
||||||
*/
|
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
|
||||||
SET FOREIGN_KEY_CHECKS = 0;
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- Table structure for branch_table
|
|
||||||
-- ----------------------------
|
|
||||||
DROP TABLE IF EXISTS `branch_table`;
|
|
||||||
CREATE TABLE `branch_table` (
|
|
||||||
`branch_id` bigint(20) NOT NULL,
|
|
||||||
`xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
|
|
||||||
`transaction_id` bigint(20) NULL DEFAULT NULL,
|
|
||||||
`resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
|
||||||
`resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
|
||||||
`branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
|
||||||
`status` tinyint(4) NULL DEFAULT NULL,
|
|
||||||
`client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
|
||||||
`application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
|
||||||
`gmt_create` datetime(6) NULL DEFAULT NULL,
|
|
||||||
`gmt_modified` datetime(6) NULL DEFAULT NULL,
|
|
||||||
PRIMARY KEY (`branch_id`) USING BTREE,
|
|
||||||
INDEX `idx_xid`(`xid`) USING BTREE
|
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- Table structure for global_table
|
|
||||||
-- ----------------------------
|
|
||||||
DROP TABLE IF EXISTS `global_table`;
|
DROP TABLE IF EXISTS `global_table`;
|
||||||
CREATE TABLE `global_table` (
|
CREATE TABLE IF NOT EXISTS `global_table`
|
||||||
`xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
|
(
|
||||||
`transaction_id` bigint(20) NULL DEFAULT NULL,
|
`xid` VARCHAR(128) NOT NULL,
|
||||||
`status` tinyint(4) NOT NULL,
|
`transaction_id` BIGINT,
|
||||||
`application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
`status` TINYINT NOT NULL,
|
||||||
`transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
`application_id` VARCHAR(32),
|
||||||
`transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
`transaction_service_group` VARCHAR(32),
|
||||||
`timeout` int(11) NULL DEFAULT NULL,
|
`transaction_name` VARCHAR(128),
|
||||||
`begin_time` bigint(20) NULL DEFAULT NULL,
|
`timeout` INT,
|
||||||
`application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
`begin_time` BIGINT,
|
||||||
`gmt_create` datetime(0) NULL DEFAULT NULL,
|
`application_data` VARCHAR(2000),
|
||||||
`gmt_modified` datetime(0) NULL DEFAULT NULL,
|
`gmt_create` DATETIME,
|
||||||
PRIMARY KEY (`xid`) USING BTREE,
|
`gmt_modified` DATETIME,
|
||||||
INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,
|
PRIMARY KEY (`xid`),
|
||||||
INDEX `idx_transaction_id`(`transaction_id`) USING BTREE
|
KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
|
KEY `idx_transaction_id` (`transaction_id`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8mb4;
|
||||||
|
|
||||||
-- ----------------------------
|
-- the table to store BranchSession data
|
||||||
-- Table structure for lock_table
|
DROP TABLE IF EXISTS `branch_table`;
|
||||||
-- ----------------------------
|
CREATE TABLE IF NOT EXISTS `branch_table`
|
||||||
|
(
|
||||||
|
`branch_id` BIGINT NOT NULL,
|
||||||
|
`xid` VARCHAR(128) NOT NULL,
|
||||||
|
`transaction_id` BIGINT,
|
||||||
|
`resource_group_id` VARCHAR(32),
|
||||||
|
`resource_id` VARCHAR(256),
|
||||||
|
`branch_type` VARCHAR(8),
|
||||||
|
`status` TINYINT,
|
||||||
|
`client_id` VARCHAR(64),
|
||||||
|
`application_data` VARCHAR(2000),
|
||||||
|
`gmt_create` DATETIME(6),
|
||||||
|
`gmt_modified` DATETIME(6),
|
||||||
|
PRIMARY KEY (`branch_id`),
|
||||||
|
KEY `idx_xid` (`xid`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8mb4;
|
||||||
|
|
||||||
|
-- the table to store lock data
|
||||||
DROP TABLE IF EXISTS `lock_table`;
|
DROP TABLE IF EXISTS `lock_table`;
|
||||||
CREATE TABLE `lock_table` (
|
CREATE TABLE IF NOT EXISTS `lock_table`
|
||||||
`row_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
|
(
|
||||||
`xid` varchar(96) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
`row_key` VARCHAR(128) NOT NULL,
|
||||||
`transaction_id` bigint(20) NULL DEFAULT NULL,
|
`xid` VARCHAR(128),
|
||||||
`branch_id` bigint(20) NOT NULL,
|
`transaction_id` BIGINT,
|
||||||
`resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
`branch_id` BIGINT NOT NULL,
|
||||||
`table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
`resource_id` VARCHAR(256),
|
||||||
`pk` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
`table_name` VARCHAR(32),
|
||||||
`gmt_create` datetime(0) NULL DEFAULT NULL,
|
`pk` VARCHAR(36),
|
||||||
`gmt_modified` datetime(0) NULL DEFAULT NULL,
|
`status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
|
||||||
PRIMARY KEY (`row_key`) USING BTREE,
|
`gmt_create` DATETIME,
|
||||||
INDEX `idx_branch_id`(`branch_id`) USING BTREE
|
`gmt_modified` DATETIME,
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
|
PRIMARY KEY (`row_key`),
|
||||||
|
KEY `idx_status` (`status`),
|
||||||
|
KEY `idx_branch_id` (`branch_id`),
|
||||||
|
KEY `idx_xid` (`xid`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8mb4;
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
DROP TABLE IF EXISTS `distributed_lock`;
|
||||||
|
CREATE TABLE IF NOT EXISTS `distributed_lock`
|
||||||
|
(
|
||||||
|
`lock_key` CHAR(20) NOT NULL,
|
||||||
|
`lock_value` VARCHAR(20) NOT NULL,
|
||||||
|
`expire` BIGINT,
|
||||||
|
primary key (`lock_key`)
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8mb4;
|
||||||
|
|
||||||
|
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
|
||||||
|
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
|
||||||
|
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
|
||||||
|
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
|
||||||
@ -6,20 +6,15 @@ spring:
|
|||||||
main:
|
main:
|
||||||
allow-bean-definition-overriding: true
|
allow-bean-definition-overriding: true
|
||||||
autoconfigure:
|
autoconfigure:
|
||||||
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
|
exclude: com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration
|
||||||
datasource:
|
datasource:
|
||||||
dynamic:
|
url: jdbc:mysql://127.0.0.1:3306/jeecg_account?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
|
||||||
seata: true # 开启对 seata的支持
|
username: root
|
||||||
primary: account
|
password: root
|
||||||
datasource:
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
account:
|
schema: classpath:sql/schema-account.sql
|
||||||
url: jdbc:mysql://127.0.0.1:3306/jeecg_account?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
|
|
||||||
username: root
|
|
||||||
password: root
|
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
|
||||||
schema: 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
|
||||||
|
|||||||
@ -6,21 +6,15 @@ spring:
|
|||||||
main:
|
main:
|
||||||
allow-bean-definition-overriding: true
|
allow-bean-definition-overriding: true
|
||||||
autoconfigure:
|
autoconfigure:
|
||||||
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
|
exclude: com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration
|
||||||
datasource:
|
datasource:
|
||||||
dynamic:
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
primary: order
|
url: jdbc:mysql://127.0.0.1:3306/jeecg_order?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
|
||||||
seata: true # 开启对 seata的支持
|
username: root
|
||||||
datasource:
|
password: root
|
||||||
# 设置 账号数据源配置
|
schema: classpath:sql/schema-order.sql
|
||||||
order:
|
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
|
||||||
url: jdbc:mysql://127.0.0.1:3306/jeecg_order?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
|
|
||||||
username: root
|
|
||||||
password: root
|
|
||||||
schema: 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
|
||||||
|
|||||||
@ -5,21 +5,16 @@ spring:
|
|||||||
name: seata-product
|
name: seata-product
|
||||||
main:
|
main:
|
||||||
allow-bean-definition-overriding: true
|
allow-bean-definition-overriding: true
|
||||||
|
autoconfigure:
|
||||||
|
exclude: com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration
|
||||||
datasource:
|
datasource:
|
||||||
dynamic:
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
primary: product
|
url: jdbc:mysql://127.0.0.1:3306/jeecg_product?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
|
||||||
seata: true # 开启对 seata的支持
|
username: root
|
||||||
seata-mode: AT #支持XA及AT模式,默认AT
|
password: root
|
||||||
datasource:
|
schema: classpath:sql/schema-product.sql
|
||||||
# 设置 账号数据源配置
|
|
||||||
product:
|
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
|
||||||
url: jdbc:mysql://127.0.0.1:3306/jeecg_product?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
|
|
||||||
username: root
|
|
||||||
password: root
|
|
||||||
schema: 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
|
||||||
|
|||||||
@ -60,7 +60,7 @@
|
|||||||
<druid.version>1.2.22</druid.version>
|
<druid.version>1.2.22</druid.version>
|
||||||
|
|
||||||
<!-- 积木报表-->
|
<!-- 积木报表-->
|
||||||
<jimureport-spring-boot-starter.version>1.8.1</jimureport-spring-boot-starter.version>
|
<jimureport-spring-boot-starter.version>1.9.1</jimureport-spring-boot-starter.version>
|
||||||
<commons-io.version>2.11.0</commons-io.version>
|
<commons-io.version>2.11.0</commons-io.version>
|
||||||
<commons.version>2.6</commons.version>
|
<commons.version>2.6</commons.version>
|
||||||
<aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version>
|
<aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version>
|
||||||
@ -403,27 +403,17 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- 积木BI-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jeecgframework.jimureport</groupId>
|
||||||
|
<artifactId>jimubi-spring-boot-starter</artifactId>
|
||||||
|
<version>${jimureport-spring-boot-starter.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.jimureport</groupId>
|
<groupId>org.jeecgframework.jimureport</groupId>
|
||||||
<artifactId>jimureport-nosql-starter</artifactId>
|
<artifactId>jimureport-nosql-starter</artifactId>
|
||||||
<version>1.6.0</version>
|
<version>1.6.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- 积木仪表盘-->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.jeecgframework.jimureport</groupId>
|
|
||||||
<artifactId>jimureport-dashboard-spring-boot-starter</artifactId>
|
|
||||||
<version>1.8.1-beta</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>autopoi-web</artifactId>
|
|
||||||
<groupId>org.jeecgframework</groupId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>org.jeecgframework.jimureport</groupId>
|
|
||||||
<artifactId>jimureport-spring-boot-starter</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<!-- chatgpt -->
|
<!-- chatgpt -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
|
|||||||
@ -27,7 +27,7 @@ JeecgBoot-Vue3采用 Vue3.0、Vite、 Ant-Design-Vue4、TypeScript 等新技术
|
|||||||
|
|
||||||
- 官方文档:[https://help.jeecg.com](https://help.jeecg.com)
|
- 官方文档:[https://help.jeecg.com](https://help.jeecg.com)
|
||||||
- 快速入门:[快速入门](http://jeecg.com/doc/quickstart) | [常见问题](http://help.jeecg.com/qa.html)
|
- 快速入门:[快速入门](http://jeecg.com/doc/quickstart) | [常见问题](http://help.jeecg.com/qa.html)
|
||||||
- QQ交流群:⑨808791225、其他满
|
- QQ交流群:⑩716488839、⑨808791225、其他满
|
||||||
- 在线演示 : [系统演示](http://boot3.jeecg.com) | [APP演示](http://jeecg.com/appIndex)
|
- 在线演示 : [系统演示](http://boot3.jeecg.com) | [APP演示](http://jeecg.com/appIndex)
|
||||||
> 演示系统的登录账号密码,请点击 [获取账号密码](http://jeecg.com/doc/demo) 获取
|
> 演示系统的登录账号密码,请点击 [获取账号密码](http://jeecg.com/doc/demo) 获取
|
||||||
|
|
||||||
|
|||||||
@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
title: { type: String, default: '' },
|
title: { type: String, default: '' },
|
||||||
|
defaultExpan: { type: Boolean, default: true },
|
||||||
loading: { type: Boolean },
|
loading: { type: Boolean },
|
||||||
/**
|
/**
|
||||||
* Can it be expanded
|
* Can it be expanded
|
||||||
@ -58,8 +59,9 @@
|
|||||||
*/
|
*/
|
||||||
lazyTime: { type: Number, default: 0 },
|
lazyTime: { type: Number, default: 0 },
|
||||||
});
|
});
|
||||||
|
// update-begin-author:liaozhiyang---date:2024-11-11--for:【issues/7402】CollapseContainer组件增加默认不展开属性
|
||||||
const show = ref(true);
|
const show = ref(props.defaultExpan);
|
||||||
|
// update-begin-author:liaozhiyang---date:2024-11-11--for:【issues/7402】CollapseContainer组件增加默认不展开属性
|
||||||
|
|
||||||
const { prefixCls } = useDesign('collapse-container');
|
const { prefixCls } = useDesign('collapse-container');
|
||||||
|
|
||||||
|
|||||||
@ -31,7 +31,9 @@ export function useSelectBiz(getList, props, emit?) {
|
|||||||
if (selectValues['change'] == false && !isEmpty(selectValues['value'])) {
|
if (selectValues['change'] == false && !isEmpty(selectValues['value'])) {
|
||||||
//update-end-author:liusq---date:2023-10-19--for: [issues/788]判断有设置数值才去加载
|
//update-end-author:liusq---date:2023-10-19--for: [issues/788]判断有设置数值才去加载
|
||||||
//update-begin---author:wangshuai ---date:20220412 for:[VUEN-672]发文草稿箱编辑时拟稿人显示用户名------------
|
//update-begin---author:wangshuai ---date:20220412 for:[VUEN-672]发文草稿箱编辑时拟稿人显示用户名------------
|
||||||
let params = { isMultiTranslate: 'true' };
|
// update-begin-author:liaozhiyang---date:2024-11-11--for:【issues/7405】部门选择用户同时全部选择两页用户,回显到父页面。第二页用户显示的不是真是姓名
|
||||||
|
let params = { isMultiTranslate: 'true', pageSize: selectValues.value?.length };
|
||||||
|
// update-end-author:liaozhiyang---date:2024-10-11--for:【issues/7405】部门选择用户同时全部选择两页用户,回显到父页面。第二页用户显示的不是真是姓名
|
||||||
params[props.rowKey] = selectValues['value'].join(',');
|
params[props.rowKey] = selectValues['value'].join(',');
|
||||||
//update-end---author:wangshuai ---date:20220412 for:[VUEN-672]发文草稿箱编辑时拟稿人显示用户名--------------
|
//update-end---author:wangshuai ---date:20220412 for:[VUEN-672]发文草稿箱编辑时拟稿人显示用户名--------------
|
||||||
loadingEcho.value = isFirstLoadEcho;
|
loadingEcho.value = isFirstLoadEcho;
|
||||||
|
|||||||
@ -222,7 +222,7 @@
|
|||||||
// update-end--author:sunjianlei---date:220230630---for:【QQYUN-5571】自封装选择列,解决数据行选择卡顿问题
|
// update-end--author:sunjianlei---date:220230630---for:【QQYUN-5571】自封装选择列,解决数据行选择卡顿问题
|
||||||
);
|
);
|
||||||
|
|
||||||
const { getScrollRef, redoHeight } = useTableScroll(getProps, tableElRef, getColumnsRef, getRowSelectionRef, getDataSourceRef);
|
const { getScrollRef, redoHeight } = useTableScroll(getProps, tableElRef, getColumnsRef, getRowSelectionRef, getDataSourceRef, slots);
|
||||||
|
|
||||||
const { customRow } = useCustomRow(getProps, {
|
const { customRow } = useCustomRow(getProps, {
|
||||||
setSelectedRowKeys,
|
setSelectedRowKeys,
|
||||||
@ -605,7 +605,12 @@
|
|||||||
.ant-table > .ant-table-footer {
|
.ant-table > .ant-table-footer {
|
||||||
padding: 12px 0 0;
|
padding: 12px 0 0;
|
||||||
}
|
}
|
||||||
|
.ant-table > .ant-table-footer {
|
||||||
|
// update-begin--author:liaozhiyang---date:20241111---for:【issues/7413】合计行有点对不齐
|
||||||
|
padding-left: 0 !important;
|
||||||
|
padding-right: 0 !important;
|
||||||
|
// update-end--author:liaozhiyang---date:20241111---for:【issues/7413】合计行有点对不齐
|
||||||
|
}
|
||||||
.ant-table.ant-table-bordered > .ant-table-footer {
|
.ant-table.ant-table-bordered > .ant-table-footer {
|
||||||
border: 0;
|
border: 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -185,6 +185,10 @@ export function useCustomSelection(
|
|||||||
let bodyResizeObserver: Nullable<ResizeObserver> = null;
|
let bodyResizeObserver: Nullable<ResizeObserver> = null;
|
||||||
// 获取首行行高
|
// 获取首行行高
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
|
// update-begin--author:liaozhiyang---date:20241111---for:【issues/7442】basicTable从默认切换到宽松紧凑时多选框显示异常
|
||||||
|
// 这种写法是为了监听到 size 的变化
|
||||||
|
propsRef.value.size && void 0;
|
||||||
|
// update-end--author:liaozhiyang---date:20241111---for:【issues/7442】basicTable从默认切换到宽松紧凑时多选框显示异常
|
||||||
if (bodyEl.value) {
|
if (bodyEl.value) {
|
||||||
// 监听div高度变化
|
// 监听div高度变化
|
||||||
bodyResizeObserver = new ResizeObserver((entries) => {
|
bodyResizeObserver = new ResizeObserver((entries) => {
|
||||||
@ -198,13 +202,15 @@ export function useCustomSelection(
|
|||||||
bodyResizeObserver.observe(bodyEl.value);
|
bodyResizeObserver.observe(bodyEl.value);
|
||||||
const el = bodyEl.value?.querySelector('tbody.ant-table-tbody tr.ant-table-row') as HTMLDivElement;
|
const el = bodyEl.value?.querySelector('tbody.ant-table-tbody tr.ant-table-row') as HTMLDivElement;
|
||||||
if (el) {
|
if (el) {
|
||||||
rowHeight.value = el.offsetHeight;
|
// update-begin--author:liaozhiyang---date:20241111---for:【issues/7442】basicTable从默认切换到宽松紧凑时多选框显示异常
|
||||||
|
nextTick(() => {
|
||||||
|
rowHeight.value = el.offsetHeight;
|
||||||
|
});
|
||||||
|
// update-end--author:liaozhiyang---date:20241111---for:【issues/7442】basicTable从默认切换到宽松紧凑时多选框显示异常
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rowHeight.value = 50;
|
rowHeight.value = 50;
|
||||||
// 这种写法是为了监听到 size 的变化
|
|
||||||
propsRef.value.size && void 0;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
onMountedOrActivated(async () => {
|
onMountedOrActivated(async () => {
|
||||||
|
|||||||
@ -38,24 +38,34 @@ export function useTableFooter(
|
|||||||
});
|
});
|
||||||
|
|
||||||
function handleSummary() {
|
function handleSummary() {
|
||||||
const { showSummary } = unref(propsRef);
|
const { showSummary, canResize } = unref(propsRef);
|
||||||
if (!showSummary || unref(getIsEmptyData)) return;
|
if (!showSummary || unref(getIsEmptyData)) return;
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
const tableEl = unref(tableElRef);
|
const tableEl = unref(tableElRef);
|
||||||
if (!tableEl) return;
|
if (!tableEl) return;
|
||||||
const bodyDom = tableEl.$el.querySelector('.ant-table-content');
|
let bodyDom;
|
||||||
useEventListener({
|
// update-begin--author:liaozhiyang---date:20241111---for:【issues/7422】BasicTable列表canResize属性为true时合计行不能横向滚动
|
||||||
el: bodyDom,
|
if (canResize) {
|
||||||
name: 'scroll',
|
setTimeout(() => {
|
||||||
listener: () => {
|
bodyDom = tableEl.$el.querySelector('.ant-table-body');
|
||||||
const footerBodyDom = tableEl.$el.querySelector('.ant-table-footer .ant-table-content') as HTMLDivElement;
|
}, 0);
|
||||||
if (!footerBodyDom || !bodyDom) return;
|
} else {
|
||||||
footerBodyDom.scrollLeft = bodyDom.scrollLeft;
|
bodyDom = tableEl.$el.querySelector('.ant-table-content');
|
||||||
},
|
}
|
||||||
wait: 0,
|
setTimeout(() => {
|
||||||
options: true,
|
useEventListener({
|
||||||
});
|
el: bodyDom,
|
||||||
|
name: 'scroll',
|
||||||
|
listener: () => {
|
||||||
|
const footerBodyDom = tableEl.$el.querySelector('.ant-table-footer .ant-table-content') as HTMLDivElement;
|
||||||
|
if (!footerBodyDom || !bodyDom) return;
|
||||||
|
footerBodyDom.scrollLeft = bodyDom.scrollLeft;
|
||||||
|
},
|
||||||
|
wait: 0,
|
||||||
|
options: true,
|
||||||
|
});
|
||||||
|
}, 0);
|
||||||
|
// update-end--author:liaozhiyang---date:20241111---for:【issues/7422】BasicTable列表canResize属性为true时合计行不能横向滚动
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return { getFooterProps };
|
return { getFooterProps };
|
||||||
|
|||||||
@ -129,6 +129,9 @@
|
|||||||
// update-begin--author:liaozhiyang---date:20240124---for:【QQYUN-7970】国际化
|
// update-begin--author:liaozhiyang---date:20240124---for:【QQYUN-7970】国际化
|
||||||
createMessage.success(t('layout.header.refreshCacheComplete'));
|
createMessage.success(t('layout.header.refreshCacheComplete'));
|
||||||
// update-end--author:liaozhiyang---date:20240124---for:【QQYUN-7970】国际化
|
// update-end--author:liaozhiyang---date:20240124---for:【QQYUN-7970】国际化
|
||||||
|
// update-begin--author:wangshuai---date:20241112---for:【issues/7433】vue3 数据字典优化建议
|
||||||
|
userStore.setAllDictItems(res.result);
|
||||||
|
// update-end--author:wangshuai---date:20241112---for:【issues/7433】vue3 数据字典优化建议
|
||||||
} else {
|
} else {
|
||||||
// update-begin--author:liaozhiyang---date:20240124---for:【QQYUN-7970】国际化
|
// update-begin--author:liaozhiyang---date:20240124---for:【QQYUN-7970】国际化
|
||||||
createMessage.error(t('layout.header.refreshCacheFailure'));
|
createMessage.error(t('layout.header.refreshCacheFailure'));
|
||||||
|
|||||||
@ -3,6 +3,9 @@ export const REDIRECT_NAME = 'Redirect';
|
|||||||
export const PARENT_LAYOUT_NAME = 'ParentLayout';
|
export const PARENT_LAYOUT_NAME = 'ParentLayout';
|
||||||
|
|
||||||
export const PAGE_NOT_FOUND_NAME = 'PageNotFound';
|
export const PAGE_NOT_FOUND_NAME = 'PageNotFound';
|
||||||
|
// update-begin--author:liaozhiyang---date:202401127---for:【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去
|
||||||
|
export const PAGE_NOT_FOUND_NAME_404 = 'PageNotFound404';
|
||||||
|
// update-end--author:liaozhiyang---date:202401127---for:【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去
|
||||||
|
|
||||||
export const EXCEPTION_COMPONENT = () => import('/@/views/sys/exception/Exception.vue');
|
export const EXCEPTION_COMPONENT = () => import('/@/views/sys/exception/Exception.vue');
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import { RootRoute } from '/@/router/routes';
|
|||||||
import { isOAuth2AppEnv } from '/@/views/sys/login/useLogin';
|
import { isOAuth2AppEnv } from '/@/views/sys/login/useLogin';
|
||||||
import { OAUTH2_THIRD_LOGIN_TENANT_ID } from "/@/enums/cacheEnum";
|
import { OAUTH2_THIRD_LOGIN_TENANT_ID } from "/@/enums/cacheEnum";
|
||||||
import { setAuthCache } from "/@/utils/auth";
|
import { setAuthCache } from "/@/utils/auth";
|
||||||
|
import { PAGE_NOT_FOUND_NAME_404 } from '/@/router/constant';
|
||||||
|
|
||||||
const LOGIN_PATH = PageEnum.BASE_LOGIN;
|
const LOGIN_PATH = PageEnum.BASE_LOGIN;
|
||||||
//auth2登录路由
|
//auth2登录路由
|
||||||
@ -162,12 +163,13 @@ export function createPermissionGuard(router: Router) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//==============================【首次登录并且是企业微信或者钉钉的情况下才会调用】==================
|
//==============================【首次登录并且是企业微信或者钉钉的情况下才会调用】==================
|
||||||
|
// update-begin--author:liaozhiyang---date:202401127---for:【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去
|
||||||
// Jump to the 404 page after processing the login
|
// Jump to the 404 page after processing the login
|
||||||
if (from.path === LOGIN_PATH && to.name === PAGE_NOT_FOUND_ROUTE.name && to.fullPath !== (userStore.getUserInfo.homePath || PageEnum.BASE_HOME)) {
|
if (from.path === LOGIN_PATH && to.name === PAGE_NOT_FOUND_NAME_404 && to.fullPath !== (userStore.getUserInfo.homePath || PageEnum.BASE_HOME)) {
|
||||||
next(userStore.getUserInfo.homePath || PageEnum.BASE_HOME);
|
next(userStore.getUserInfo.homePath || PageEnum.BASE_HOME);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// update-end--author:liaozhiyang---date:202401127---for:【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去
|
||||||
|
|
||||||
//update-begin---author:scott ---date:2024-02-21 for:【QQYUN-8326】刷新首页,不需要重新获取用户信息---
|
//update-begin---author:scott ---date:2024-02-21 for:【QQYUN-8326】刷新首页,不需要重新获取用户信息---
|
||||||
// // get userinfo while last fetch time is empty
|
// // get userinfo while last fetch time is empty
|
||||||
@ -199,8 +201,8 @@ export function createPermissionGuard(router: Router) {
|
|||||||
|
|
||||||
router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
|
router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
|
||||||
permissionStore.setDynamicAddedRoute(true);
|
permissionStore.setDynamicAddedRoute(true);
|
||||||
|
// update-begin--author:liaozhiyang---date:202401127---for:【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去
|
||||||
if (to.name === PAGE_NOT_FOUND_ROUTE.name) {
|
if (to.name === PAGE_NOT_FOUND_NAME_404) {
|
||||||
// 动态添加路由后,此处应当重定向到fullPath,否则会加载404页面内容
|
// 动态添加路由后,此处应当重定向到fullPath,否则会加载404页面内容
|
||||||
next({ path: to.fullPath, replace: true, query: to.query });
|
next({ path: to.fullPath, replace: true, query: to.query });
|
||||||
} else {
|
} else {
|
||||||
@ -209,5 +211,6 @@ export function createPermissionGuard(router: Router) {
|
|||||||
const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect };
|
const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect };
|
||||||
next(nextData);
|
next(nextData);
|
||||||
}
|
}
|
||||||
|
// update-end--author:liaozhiyang---date:202401127---for:【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,11 @@
|
|||||||
import type { AppRouteRecordRaw } from '/@/router/types';
|
import type { AppRouteRecordRaw } from '/@/router/types';
|
||||||
import { t } from '/@/hooks/web/useI18n';
|
import { t } from '/@/hooks/web/useI18n';
|
||||||
import { REDIRECT_NAME, LAYOUT, EXCEPTION_COMPONENT, PAGE_NOT_FOUND_NAME } from '/@/router/constant';
|
import { REDIRECT_NAME, LAYOUT, EXCEPTION_COMPONENT, PAGE_NOT_FOUND_NAME, PAGE_NOT_FOUND_NAME_404 } from '/@/router/constant';
|
||||||
|
|
||||||
// 404 on a page
|
// 404 on a page
|
||||||
export const PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = {
|
export const PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = {
|
||||||
path: '/:path(.*)*',
|
path: '/:path(.*)*',
|
||||||
|
|
||||||
name: PAGE_NOT_FOUND_NAME,
|
name: PAGE_NOT_FOUND_NAME,
|
||||||
component: LAYOUT,
|
component: LAYOUT,
|
||||||
meta: {
|
meta: {
|
||||||
@ -15,7 +16,9 @@ export const PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = {
|
|||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: '/:path(.*)*',
|
path: '/:path(.*)*',
|
||||||
name: PAGE_NOT_FOUND_NAME,
|
// update-begin--author:liaozhiyang---date:202401127---for:【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去
|
||||||
|
name: PAGE_NOT_FOUND_NAME_404,
|
||||||
|
// update-end--author:liaozhiyang---date:202401127---for:【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去
|
||||||
component: EXCEPTION_COMPONENT,
|
component: EXCEPTION_COMPONENT,
|
||||||
meta: {
|
meta: {
|
||||||
title: 'ErrorPage',
|
title: 'ErrorPage',
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import type { RouteLocationNormalized, RouteLocationRaw, Router } from 'vue-rout
|
|||||||
import { toRaw, unref } from 'vue';
|
import { toRaw, unref } from 'vue';
|
||||||
import { defineStore } from 'pinia';
|
import { defineStore } from 'pinia';
|
||||||
import { store } from '/@/store';
|
import { store } from '/@/store';
|
||||||
|
import { PAGE_NOT_FOUND_NAME_404 } from '/@/router/constant';
|
||||||
|
|
||||||
import { useGo, useRedo } from '/@/hooks/web/usePage';
|
import { useGo, useRedo } from '/@/hooks/web/usePage';
|
||||||
import { Persistent } from '/@/utils/cache/persistent';
|
import { Persistent } from '/@/utils/cache/persistent';
|
||||||
@ -152,15 +153,17 @@ export const useMultipleTabStore = defineStore({
|
|||||||
|
|
||||||
async addTab(route: RouteLocationNormalized) {
|
async addTab(route: RouteLocationNormalized) {
|
||||||
const { path, name, fullPath, params, query, meta } = getRawRoute(route);
|
const { path, name, fullPath, params, query, meta } = getRawRoute(route);
|
||||||
|
// update-begin--author:liaozhiyang---date:202401127---for:【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去
|
||||||
// 404 The page does not need to add a tab
|
// 404 The page does not need to add a tab
|
||||||
if (
|
if (
|
||||||
path === PageEnum.ERROR_PAGE ||
|
path === PageEnum.ERROR_PAGE ||
|
||||||
path === PageEnum.BASE_LOGIN ||
|
path === PageEnum.BASE_LOGIN ||
|
||||||
!name ||
|
!name ||
|
||||||
[REDIRECT_ROUTE.name, PAGE_NOT_FOUND_ROUTE.name].includes(name as string)
|
[REDIRECT_ROUTE.name, PAGE_NOT_FOUND_NAME_404].includes(name as string)
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// update-end--author:liaozhiyang---date:202401127---for:【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去
|
||||||
|
|
||||||
let updateIndex = -1;
|
let updateIndex = -1;
|
||||||
// Existing pages, do not add tabs repeatedly
|
// Existing pages, do not add tabs repeatedly
|
||||||
|
|||||||
@ -249,7 +249,10 @@ export const useUserStore = defineStore({
|
|||||||
try {
|
try {
|
||||||
const { goHome = true, mode, ...loginParams } = params;
|
const { goHome = true, mode, ...loginParams } = params;
|
||||||
const data = await phoneLoginApi(loginParams, mode);
|
const data = await phoneLoginApi(loginParams, mode);
|
||||||
const { token } = data;
|
//update-begin---author:wangshuai---date:2024-11-25---for:【issues/7488】手机号码登录,在请求头中无法获取租户id---
|
||||||
|
const { token , userInfo } = data;
|
||||||
|
this.setTenant(userInfo!.loginTenantId);
|
||||||
|
//update-end---author:wangshuai---date:2024-11-25---for:【issues/7488】手机号码登录,在请求头中无法获取租户id---
|
||||||
// save token
|
// save token
|
||||||
this.setToken(token);
|
this.setToken(token);
|
||||||
return this.afterLoginAction(goHome, data);
|
return this.afterLoginAction(goHome, data);
|
||||||
|
|||||||
Reference in New Issue
Block a user