Merge branch 'master-jdk17' of https://gitee.com/zhijiantianya/yudao-cloud
# Conflicts: # pom.xml # yudao-dependencies/pom.xml # yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.javapull/113/head
commit
2bd9fd97bb
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,8 @@
|
||||||
|
# 忽略python虚拟环境
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
|
@ -0,0 +1,101 @@
|
||||||
|
## 0. 友情提示
|
||||||
|
|
||||||
|
在 `sql/tools` 目录下,我们提供一些数据库相关的工具,包括测试数据库的快速启动、MySQL 转换其它数据库等等。
|
||||||
|
|
||||||
|
注意!所有的操作,必须在 `sql/tools` 目录下执行。
|
||||||
|
|
||||||
|
## 1. 测试数据库的快速启动
|
||||||
|
|
||||||
|
基于 Docker Compose,快速启动 MySQL、Oracle、PostgreSQL、SQL Server 等数据库。
|
||||||
|
|
||||||
|
注意!使用 Docker Compose 启动完测试数据后,因为会自动导入项目的 SQL 脚本,所以可能需要等待 1-2 分钟。
|
||||||
|
|
||||||
|
### 1.1 MySQL
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
docker compose up -d mysql
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 1.2 Oracle
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
docker compose up -d oracle
|
||||||
|
```
|
||||||
|
|
||||||
|
暂不支持 MacBook Apple Silicon,因为 Oracle 官方没有提供 Apple Silicon 版本的 Docker 镜像。
|
||||||
|
|
||||||
|
### 1.3 PostgreSQL
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
docker compose up -d postgres
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.4 SQL Server
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
docker compose up -d sqlserver
|
||||||
|
# 注意:启动完 sqlserver 后,需要手动再执行如下命令,因为 SQL Server 不支持初始化脚本
|
||||||
|
docker compose exec sqlserver bash /tmp/create_schema.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
暂不支持 MacBook Apple Silicon,因为 SQL Server 官方没有提供 Apple Silicon 版本的 Docker 镜像。
|
||||||
|
|
||||||
|
### 1.5 DM 达梦
|
||||||
|
|
||||||
|
① 下载达梦 Docker 镜像:https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar
|
||||||
|
|
||||||
|
② 加载镜像文件,在镜像 tar 文件所在目录运行:
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar
|
||||||
|
````
|
||||||
|
|
||||||
|
③ 在项目 `sql/tools` 目录下运行:
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
docker compose up -d dm8
|
||||||
|
# 注意:启动完 dm 后,需要手动再执行如下命令,因为 dm 不支持初始化脚本
|
||||||
|
docker compose exec dm8 bash -c "exec /opt/dmdbms/bin/disql SYSDBA/SYSDBA001 \`/tmp/schema.sql"
|
||||||
|
exit
|
||||||
|
```
|
||||||
|
|
||||||
|
**注意**: `sql/dm/ruoyi-vue-pro-dm8.sql` 文件编码必须为 `GBK` 或者 `GBK` 超集,否则会出现中文乱码。
|
||||||
|
|
||||||
|
暂不支持 MacBook Apple Silicon,因为 达梦 官方没有提供 Apple Silicon 版本的 Docker 镜像。
|
||||||
|
|
||||||
|
## 1.X 容器的销毁重建
|
||||||
|
|
||||||
|
开发测试过程中,有时候需要创建全新干净的数据库。由于测试数据 Docker 容器采用数据卷 Volume 挂载数据库实例的数据目录,因此销毁数据需要停止容器后,删除数据卷,然后再重新创建容器。
|
||||||
|
|
||||||
|
以 postgres 为例,操作如下:
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
docker compose down postgres
|
||||||
|
docker volume rm ruoyi-vue-pro_postgres
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. MySQL 转换其它数据库
|
||||||
|
|
||||||
|
### 2.1 实现原理
|
||||||
|
|
||||||
|
通过读取 MySQL 的 `sql/mysql/ruoyi-vue-pro.sql` 数据库文件,转换成 Oracle、PostgreSQL、SQL Server 等数据库的脚本。
|
||||||
|
|
||||||
|
### 2.2 使用方法
|
||||||
|
|
||||||
|
① 安装依赖库 `simple-ddl-parser`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install simple-ddl-parser
|
||||||
|
# pip3 install simple-ddl-parser
|
||||||
|
```
|
||||||
|
|
||||||
|
② 执行如下命令打印生成 postgres 的脚本内容,其他可选参数有:`oracle`、`sqlserver`、`dm8`:
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
python3 convertor.py postgres
|
||||||
|
# python3 convertor.py postgres > tmp.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
程序将 SQL 脚本打印到终端,可以重定向到临时文件 `tmp.sql`。
|
||||||
|
|
||||||
|
确认无误后,可以利用 IDEA 进行格式化。当然,也可以直接导入到数据库中。
|
|
@ -0,0 +1,781 @@
|
||||||
|
# encoding=utf8
|
||||||
|
"""芋道系统数据库迁移工具
|
||||||
|
|
||||||
|
Author: dhb52 (https://gitee.com/dhb52)
|
||||||
|
|
||||||
|
pip install simple-ddl-parser
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import pathlib
|
||||||
|
import re
|
||||||
|
import time
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from typing import Dict, Generator, Optional, Tuple, Union
|
||||||
|
|
||||||
|
from simple_ddl_parser import DDLParser
|
||||||
|
|
||||||
|
PREAMBLE = """/*
|
||||||
|
Yudao Database Transfer Tool
|
||||||
|
|
||||||
|
Source Server Type : MySQL
|
||||||
|
|
||||||
|
Target Server Type : {db_type}
|
||||||
|
|
||||||
|
Date: {date}
|
||||||
|
*/
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def load_and_clean(sql_file: str) -> str:
|
||||||
|
"""加载源 SQL 文件,并清理内容方便下一步 ddl 解析
|
||||||
|
|
||||||
|
Args:
|
||||||
|
sql_file (str): sql文件路径
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 清理后的sql文件内容
|
||||||
|
"""
|
||||||
|
REPLACE_PAIR_LIST = (
|
||||||
|
(" CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ", " "),
|
||||||
|
(" KEY `", " INDEX `"),
|
||||||
|
("UNIQUE INDEX", "UNIQUE KEY"),
|
||||||
|
("b'0'", "'0'"),
|
||||||
|
("b'1'", "'1'"),
|
||||||
|
)
|
||||||
|
|
||||||
|
content = open(sql_file).read()
|
||||||
|
for replace_pair in REPLACE_PAIR_LIST:
|
||||||
|
content = content.replace(*replace_pair)
|
||||||
|
content = re.sub(r"ENGINE.*COMMENT", "COMMENT", content)
|
||||||
|
content = re.sub(r"ENGINE.*;", ";", content)
|
||||||
|
return content
|
||||||
|
|
||||||
|
|
||||||
|
class Convertor(ABC):
|
||||||
|
def __init__(self, src: str, db_type) -> None:
|
||||||
|
self.src = src
|
||||||
|
self.db_type = db_type
|
||||||
|
self.content = load_and_clean(self.src)
|
||||||
|
self.table_script_list = re.findall(r"CREATE TABLE [^;]*;", self.content)
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]) -> str:
|
||||||
|
"""字段类型转换
|
||||||
|
|
||||||
|
Args:
|
||||||
|
type (str): 字段类型
|
||||||
|
size (Optional[Union[int, Tuple[int]]]): 字段长度描述, 如varchar(255), decimal(10,2)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 类型定义
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def gen_create(self, table_ddl: Dict) -> str:
|
||||||
|
"""生成 create 脚本
|
||||||
|
|
||||||
|
Args:
|
||||||
|
table_ddl (Dict): 表DDL
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 生成脚本
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def gen_pk(self, table_name: str) -> str:
|
||||||
|
"""生成主键定义
|
||||||
|
|
||||||
|
Args:
|
||||||
|
table_name (str): 表名
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 生成脚本
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def gen_index(self, ddl: Dict) -> str:
|
||||||
|
"""生成索引定义
|
||||||
|
|
||||||
|
Args:
|
||||||
|
table_ddl (Dict): 表DDL
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 生成脚本
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def gen_comment(self, table_sql: str, table_name: str) -> str:
|
||||||
|
"""生成字段/表注释
|
||||||
|
|
||||||
|
Args:
|
||||||
|
table_sql (str): 原始表SQL
|
||||||
|
table_name (str): 表名
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 生成脚本
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def gen_insert(self, table_name: str) -> str:
|
||||||
|
"""生成 insert 语句块
|
||||||
|
|
||||||
|
Args:
|
||||||
|
table_name (str): 表名
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 生成脚本
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def gen_dual(self) -> str:
|
||||||
|
"""生成虚拟 dual 表
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 生成脚本, 默认返回空脚本, 表示当前数据库无需手工创建
|
||||||
|
"""
|
||||||
|
return ""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def inserts(table_name: str, script_content: str) -> Generator:
|
||||||
|
PREFIX = f"INSERT INTO `{table_name}`"
|
||||||
|
|
||||||
|
# 收集 `table_name` 对应的 insert 语句
|
||||||
|
for line in script_content.split("\n"):
|
||||||
|
if line.startswith(PREFIX):
|
||||||
|
head, tail = line.replace(PREFIX, "").split(" VALUES ", maxsplit=1)
|
||||||
|
head = head.strip().replace("`", "").lower()
|
||||||
|
tail = tail.strip().replace(r"\"", '"')
|
||||||
|
# tail = tail.replace("b'0'", "'0'").replace("b'1'", "'1'")
|
||||||
|
yield f"INSERT INTO {table_name.lower()} {head} VALUES {tail}"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def index(ddl: Dict) -> Generator:
|
||||||
|
"""生成索引定义
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ddl (Dict): 表DDL
|
||||||
|
|
||||||
|
Yields:
|
||||||
|
Generator[str]: create index 语句
|
||||||
|
"""
|
||||||
|
|
||||||
|
def generate_columns(columns):
|
||||||
|
keys = [
|
||||||
|
f"{col['name'].lower()}{' ' + col['order'].lower() if col['order'] != 'ASC' else ''}"
|
||||||
|
for col in columns[0]
|
||||||
|
]
|
||||||
|
return ", ".join(keys)
|
||||||
|
|
||||||
|
for no, index in enumerate(ddl["index"], 1):
|
||||||
|
columns = generate_columns(index["columns"])
|
||||||
|
table_name = ddl["table_name"].lower()
|
||||||
|
yield f"CREATE INDEX idx_{table_name}_{no:02d} ON {table_name} ({columns})"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def filed_comments(table_sql: str) -> Generator:
|
||||||
|
for line in table_sql.split("\n"):
|
||||||
|
match = re.match(r"^`([^`]+)`.* COMMENT '([^']+)'", line.strip())
|
||||||
|
if match:
|
||||||
|
field = match.group(1)
|
||||||
|
comment_string = match.group(2).replace("\\n", "\n")
|
||||||
|
yield field, comment_string
|
||||||
|
|
||||||
|
def table_comment(self, table_sql: str) -> str:
|
||||||
|
match = re.search(r"COMMENT \= '([^']+)';", table_sql)
|
||||||
|
return match.group(1) if match else None
|
||||||
|
|
||||||
|
def print(self):
|
||||||
|
"""打印转换后的sql脚本到终端"""
|
||||||
|
print(
|
||||||
|
PREAMBLE.format(
|
||||||
|
db_type=self.db_type,
|
||||||
|
date=time.strftime("%Y-%m-%d %H:%M:%S"),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
dual = self.gen_dual()
|
||||||
|
if dual:
|
||||||
|
print(
|
||||||
|
f"""-- ----------------------------
|
||||||
|
-- Table structure for dual
|
||||||
|
-- ----------------------------
|
||||||
|
{dual}
|
||||||
|
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
error_scripts = []
|
||||||
|
for table_sql in self.table_script_list:
|
||||||
|
ddl = DDLParser(table_sql.replace("`", "")).run()
|
||||||
|
|
||||||
|
# 如果parse失败, 需要跟进
|
||||||
|
if len(ddl) == 0:
|
||||||
|
error_scripts.append(table_sql)
|
||||||
|
continue
|
||||||
|
|
||||||
|
table_ddl = ddl[0]
|
||||||
|
table_name = table_ddl["table_name"]
|
||||||
|
|
||||||
|
# 忽略 quartz 的内容
|
||||||
|
if table_name.lower().startswith("qrtz"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 为每个表生成个5个基本部分
|
||||||
|
create = self.gen_create(table_ddl)
|
||||||
|
pk = self.gen_pk(table_name)
|
||||||
|
index = self.gen_index(table_ddl)
|
||||||
|
comment = self.gen_comment(table_sql, table_name)
|
||||||
|
inserts = self.gen_insert(table_name)
|
||||||
|
|
||||||
|
# 组合当前表的DDL脚本
|
||||||
|
script = f"""{create}
|
||||||
|
|
||||||
|
{pk}
|
||||||
|
|
||||||
|
{index}
|
||||||
|
|
||||||
|
{comment}
|
||||||
|
|
||||||
|
{inserts}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 清理
|
||||||
|
script = re.sub("\n{3,}", "\n\n", script).strip() + "\n"
|
||||||
|
|
||||||
|
print(script)
|
||||||
|
|
||||||
|
# 将parse失败的脚本打印出来
|
||||||
|
if error_scripts:
|
||||||
|
for script in error_scripts:
|
||||||
|
print(script)
|
||||||
|
|
||||||
|
|
||||||
|
class PostgreSQLConvertor(Convertor):
|
||||||
|
def __init__(self, src):
|
||||||
|
super().__init__(src, "PostgreSQL")
|
||||||
|
|
||||||
|
def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]):
|
||||||
|
"""类型转换"""
|
||||||
|
|
||||||
|
type = type.lower()
|
||||||
|
|
||||||
|
if type == "varchar":
|
||||||
|
return f"varchar({size})"
|
||||||
|
if type == "int":
|
||||||
|
return "int4"
|
||||||
|
if type == "bigint" or type == "bigint unsigned":
|
||||||
|
return "int8"
|
||||||
|
if type == "datetime":
|
||||||
|
return "timestamp"
|
||||||
|
if type == "bit":
|
||||||
|
return "bool"
|
||||||
|
if type in ("tinyint", "smallint"):
|
||||||
|
return "int2"
|
||||||
|
if type == "text":
|
||||||
|
return "text"
|
||||||
|
if type in ("blob", "mediumblob"):
|
||||||
|
return "bytea"
|
||||||
|
if type == "decimal":
|
||||||
|
return (
|
||||||
|
f"numeric({','.join(str(s) for s in size)})" if len(size) else "numeric"
|
||||||
|
)
|
||||||
|
|
||||||
|
def gen_create(self, ddl: Dict) -> str:
|
||||||
|
"""生成 create"""
|
||||||
|
|
||||||
|
def _generate_column(col):
|
||||||
|
name = col["name"].lower()
|
||||||
|
if name == "deleted":
|
||||||
|
return "deleted int2 NOT NULL DEFAULT 0"
|
||||||
|
|
||||||
|
type = col["type"].lower()
|
||||||
|
full_type = self.translate_type(type, col["size"])
|
||||||
|
nullable = "NULL" if col["nullable"] else "NOT NULL"
|
||||||
|
default = f"DEFAULT {col['default']}" if col["default"] is not None else ""
|
||||||
|
return f"{name} {full_type} {nullable} {default}"
|
||||||
|
|
||||||
|
table_name = ddl["table_name"].lower()
|
||||||
|
columns = [f"{_generate_column(col).strip()}" for col in ddl["columns"]]
|
||||||
|
filed_def_list = ",\n ".join(columns)
|
||||||
|
script = f"""-- ----------------------------
|
||||||
|
-- Table structure for {table_name}
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS {table_name};
|
||||||
|
CREATE TABLE {table_name} (
|
||||||
|
{filed_def_list}
|
||||||
|
);"""
|
||||||
|
|
||||||
|
return script
|
||||||
|
|
||||||
|
def gen_index(self, ddl: Dict) -> str:
|
||||||
|
return "\n".join(f"{script};" for script in self.index(ddl))
|
||||||
|
|
||||||
|
def gen_comment(self, table_sql: str, table_name: str) -> str:
|
||||||
|
"""生成字段及表的注释"""
|
||||||
|
|
||||||
|
script = ""
|
||||||
|
for field, comment_string in self.filed_comments(table_sql):
|
||||||
|
script += (
|
||||||
|
f"COMMENT ON COLUMN {table_name}.{field} IS '{comment_string}';" + "\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
table_comment = self.table_comment(table_sql)
|
||||||
|
if table_comment:
|
||||||
|
script += f"COMMENT ON TABLE {table_name} IS '{table_comment}';\n"
|
||||||
|
|
||||||
|
return script
|
||||||
|
|
||||||
|
def gen_pk(self, table_name) -> str:
|
||||||
|
"""生成主键定义"""
|
||||||
|
return f"ALTER TABLE {table_name} ADD CONSTRAINT pk_{table_name} PRIMARY KEY (id);\n"
|
||||||
|
|
||||||
|
def gen_insert(self, table_name: str) -> str:
|
||||||
|
"""生成 insert 语句,以及根据最后的 insert id+1 生成 Sequence"""
|
||||||
|
|
||||||
|
inserts = list(Convertor.inserts(table_name, self.content))
|
||||||
|
## 生成 insert 脚本
|
||||||
|
script = ""
|
||||||
|
last_id = 0
|
||||||
|
if inserts:
|
||||||
|
inserts_lines = "\n".join(inserts)
|
||||||
|
script += f"""\n\n-- ----------------------------
|
||||||
|
-- Records of {table_name.lower()}
|
||||||
|
-- ----------------------------
|
||||||
|
-- @formatter:off
|
||||||
|
BEGIN;
|
||||||
|
{inserts_lines}
|
||||||
|
COMMIT;
|
||||||
|
-- @formatter:on"""
|
||||||
|
match = re.search(r"VALUES \((\d+),", inserts[-1])
|
||||||
|
if match:
|
||||||
|
last_id = int(match.group(1))
|
||||||
|
|
||||||
|
# 生成 Sequence
|
||||||
|
script += (
|
||||||
|
"\n\n"
|
||||||
|
+ f"""DROP SEQUENCE IF EXISTS {table_name}_seq;
|
||||||
|
CREATE SEQUENCE {table_name}_seq
|
||||||
|
START {last_id + 1};"""
|
||||||
|
)
|
||||||
|
|
||||||
|
return script
|
||||||
|
|
||||||
|
def gen_dual(self) -> str:
|
||||||
|
return """DROP TABLE IF EXISTS dual;
|
||||||
|
CREATE TABLE dual
|
||||||
|
(
|
||||||
|
);"""
|
||||||
|
|
||||||
|
|
||||||
|
class OracleConvertor(Convertor):
|
||||||
|
def __init__(self, src):
|
||||||
|
super().__init__(src, "Oracle")
|
||||||
|
|
||||||
|
def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]):
|
||||||
|
"""类型转换"""
|
||||||
|
type = type.lower()
|
||||||
|
|
||||||
|
if type == "varchar":
|
||||||
|
return f"varchar2({size if size < 4000 else 4000})"
|
||||||
|
if type == "int":
|
||||||
|
return "number"
|
||||||
|
if type == "bigint" or type == "bigint unsigned":
|
||||||
|
return "number"
|
||||||
|
if type == "datetime":
|
||||||
|
return "date"
|
||||||
|
if type == "bit":
|
||||||
|
return "number(1,0)"
|
||||||
|
if type in ("tinyint", "smallint"):
|
||||||
|
return "smallint"
|
||||||
|
if type == "text":
|
||||||
|
return "clob"
|
||||||
|
if type in ("blob", "mediumblob"):
|
||||||
|
return "blob"
|
||||||
|
if type == "decimal":
|
||||||
|
return (
|
||||||
|
f"number({','.join(str(s) for s in size)})" if len(size) else "number"
|
||||||
|
)
|
||||||
|
|
||||||
|
def gen_create(self, ddl) -> str:
|
||||||
|
"""生成 CREATE 语句"""
|
||||||
|
|
||||||
|
def generate_column(col):
|
||||||
|
name = col["name"].lower()
|
||||||
|
if name == "deleted":
|
||||||
|
return "deleted number(1,0) DEFAULT 0 NOT NULL"
|
||||||
|
|
||||||
|
type = col["type"].lower()
|
||||||
|
full_type = self.translate_type(type, col["size"])
|
||||||
|
nullable = "NULL" if col["nullable"] else "NOT NULL"
|
||||||
|
default = f"DEFAULT {col['default']}" if col["default"] is not None else ""
|
||||||
|
# Oracle 中 size 不能作为字段名
|
||||||
|
field_name = '"size"' if name == "size" else name
|
||||||
|
# Oracle DEFAULT 定义在 NULLABLE 之前
|
||||||
|
return f"{field_name} {full_type} {default} {nullable}"
|
||||||
|
|
||||||
|
table_name = ddl["table_name"].lower()
|
||||||
|
columns = [f"{generate_column(col).strip()}" for col in ddl["columns"]]
|
||||||
|
field_def_list = ",\n ".join(columns)
|
||||||
|
script = f"""-- ----------------------------
|
||||||
|
-- Table structure for {table_name}
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE {table_name} (
|
||||||
|
{field_def_list}
|
||||||
|
);"""
|
||||||
|
|
||||||
|
# oracle INSERT '' 不能通过 NOT NULL 校验
|
||||||
|
script = script.replace("DEFAULT '' NOT NULL", "DEFAULT '' NULL")
|
||||||
|
|
||||||
|
return script
|
||||||
|
|
||||||
|
def gen_index(self, ddl: Dict) -> str:
|
||||||
|
return "\n".join(f"{script};" for script in self.index(ddl))
|
||||||
|
|
||||||
|
def gen_comment(self, table_sql: str, table_name: str) -> str:
|
||||||
|
script = ""
|
||||||
|
for field, comment_string in self.filed_comments(table_sql):
|
||||||
|
script += (
|
||||||
|
f"COMMENT ON COLUMN {table_name}.{field} IS '{comment_string}';" + "\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
table_comment = self.table_comment(table_sql)
|
||||||
|
if table_comment:
|
||||||
|
script += f"COMMENT ON TABLE {table_name} IS '{table_comment}';\n"
|
||||||
|
|
||||||
|
return script
|
||||||
|
|
||||||
|
def gen_pk(self, table_name: str) -> str:
|
||||||
|
"""生成主键定义"""
|
||||||
|
return f"ALTER TABLE {table_name} ADD CONSTRAINT pk_{table_name} PRIMARY KEY (id);\n"
|
||||||
|
|
||||||
|
def gen_index(self, ddl: Dict) -> str:
|
||||||
|
return "\n".join(f"{script};" for script in self.index(ddl))
|
||||||
|
|
||||||
|
def gen_insert(self, table_name: str) -> str:
|
||||||
|
"""拷贝 INSERT 语句"""
|
||||||
|
inserts = []
|
||||||
|
for insert_script in Convertor.inserts(table_name, self.content):
|
||||||
|
# 对日期数据添加 TO_DATE 转换
|
||||||
|
insert_script = re.sub(
|
||||||
|
r"('\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}')",
|
||||||
|
r"to_date(\g<1>, 'SYYYY-MM-DD HH24:MI:SS')",
|
||||||
|
insert_script,
|
||||||
|
)
|
||||||
|
inserts.append(insert_script)
|
||||||
|
|
||||||
|
## 生成 insert 脚本
|
||||||
|
script = ""
|
||||||
|
last_id = 0
|
||||||
|
if inserts:
|
||||||
|
inserts_lines = "\n".join(inserts)
|
||||||
|
script += f"""\n\n-- ----------------------------
|
||||||
|
-- Records of {table_name.lower()}
|
||||||
|
-- ----------------------------
|
||||||
|
-- @formatter:off
|
||||||
|
{inserts_lines}
|
||||||
|
COMMIT;
|
||||||
|
-- @formatter:on"""
|
||||||
|
match = re.search(r"VALUES \((\d+),", inserts[-1])
|
||||||
|
if match:
|
||||||
|
last_id = int(match.group(1))
|
||||||
|
|
||||||
|
# 生成 Sequence
|
||||||
|
script += f"""
|
||||||
|
|
||||||
|
CREATE SEQUENCE {table_name}_seq
|
||||||
|
START WITH {last_id + 1};"""
|
||||||
|
|
||||||
|
return script
|
||||||
|
|
||||||
|
|
||||||
|
class SQLServerConvertor(Convertor):
|
||||||
|
"""_summary_
|
||||||
|
|
||||||
|
Args:
|
||||||
|
Convertor (_type_): _description_
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, src):
|
||||||
|
super().__init__(src, "Microsoft SQL Server")
|
||||||
|
|
||||||
|
def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]):
|
||||||
|
"""类型转换"""
|
||||||
|
|
||||||
|
type = type.lower()
|
||||||
|
|
||||||
|
if type == "varchar":
|
||||||
|
return f"nvarchar({size if size < 4000 else 4000})"
|
||||||
|
if type == "int":
|
||||||
|
return "int"
|
||||||
|
if type == "bigint" or type == "bigint unsigned":
|
||||||
|
return "bigint"
|
||||||
|
if type == "datetime":
|
||||||
|
return "datetime2"
|
||||||
|
if type == "bit":
|
||||||
|
return "varchar(1)"
|
||||||
|
if type in ("tinyint", "smallint"):
|
||||||
|
return "tinyint"
|
||||||
|
if type == "text":
|
||||||
|
return "nvarchar(max)"
|
||||||
|
if type in ("blob", "mediumblob"):
|
||||||
|
return "varbinary(max)"
|
||||||
|
if type == "decimal":
|
||||||
|
return (
|
||||||
|
f"numeric({','.join(str(s) for s in size)})" if len(size) else "numeric"
|
||||||
|
)
|
||||||
|
|
||||||
|
def gen_create(self, ddl: Dict) -> str:
|
||||||
|
"""生成 create"""
|
||||||
|
|
||||||
|
def _generate_column(col):
|
||||||
|
name = col["name"].lower()
|
||||||
|
if name == "id":
|
||||||
|
return "id bigint NOT NULL PRIMARY KEY IDENTITY"
|
||||||
|
if name == "deleted":
|
||||||
|
return "deleted bit DEFAULT 0 NOT NULL"
|
||||||
|
|
||||||
|
type = col["type"].lower()
|
||||||
|
full_type = self.translate_type(type, col["size"])
|
||||||
|
nullable = "NULL" if col["nullable"] else "NOT NULL"
|
||||||
|
default = f"DEFAULT {col['default']}" if col["default"] is not None else ""
|
||||||
|
return f"{name} {full_type} {default} {nullable}"
|
||||||
|
|
||||||
|
table_name = ddl["table_name"].lower()
|
||||||
|
columns = [f"{_generate_column(col).strip()}" for col in ddl["columns"]]
|
||||||
|
filed_def_list = ",\n ".join(columns)
|
||||||
|
script = f"""-- ----------------------------
|
||||||
|
-- Table structure for {table_name}
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS {table_name};
|
||||||
|
CREATE TABLE {table_name} (
|
||||||
|
{filed_def_list}
|
||||||
|
)
|
||||||
|
GO"""
|
||||||
|
|
||||||
|
return script
|
||||||
|
|
||||||
|
def gen_comment(self, table_sql: str, table_name: str) -> str:
|
||||||
|
"""生成字段及表的注释"""
|
||||||
|
|
||||||
|
script = ""
|
||||||
|
|
||||||
|
for field, comment_string in self.filed_comments(table_sql):
|
||||||
|
script += f"""EXEC sp_addextendedproperty
|
||||||
|
'MS_Description', N'{comment_string}',
|
||||||
|
'SCHEMA', N'dbo',
|
||||||
|
'TABLE', N'{table_name}',
|
||||||
|
'COLUMN', N'{field}'
|
||||||
|
GO
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
table_comment = self.table_comment(table_sql)
|
||||||
|
if table_comment:
|
||||||
|
script += f"""EXEC sp_addextendedproperty
|
||||||
|
'MS_Description', N'{table_comment}',
|
||||||
|
'SCHEMA', N'dbo',
|
||||||
|
'TABLE', N'{table_name}'
|
||||||
|
GO
|
||||||
|
|
||||||
|
"""
|
||||||
|
return script
|
||||||
|
|
||||||
|
def gen_pk(self, table_name: str) -> str:
|
||||||
|
"""生成主键定义"""
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def gen_index(self, ddl: Dict) -> str:
|
||||||
|
"""生成 index"""
|
||||||
|
return "\n".join(f"{script}\nGO" for script in self.index(ddl))
|
||||||
|
|
||||||
|
def gen_insert(self, table_name: str) -> str:
|
||||||
|
"""生成 insert 语句"""
|
||||||
|
|
||||||
|
# 收集 `table_name` 对应的 insert 语句
|
||||||
|
inserts = []
|
||||||
|
for insert_script in Convertor.inserts(table_name, self.content):
|
||||||
|
# SQLServer: 字符串前加N,hack,是否存在替换字符串内容的风险
|
||||||
|
insert_script = insert_script.replace(", '", ", N'").replace(
|
||||||
|
"VALUES ('", "VALUES (N')"
|
||||||
|
)
|
||||||
|
# 删除 insert 的结尾分号
|
||||||
|
insert_script = re.sub(";$", r"\nGO", insert_script)
|
||||||
|
inserts.append(insert_script)
|
||||||
|
|
||||||
|
## 生成 insert 脚本
|
||||||
|
script = ""
|
||||||
|
if inserts:
|
||||||
|
inserts_lines = "\n".join(inserts)
|
||||||
|
script += f"""\n\n-- ----------------------------
|
||||||
|
-- Records of {table_name.lower()}
|
||||||
|
-- ----------------------------
|
||||||
|
-- @formatter:off
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
GO
|
||||||
|
SET IDENTITY_INSERT {table_name.lower()} ON
|
||||||
|
GO
|
||||||
|
{inserts_lines}
|
||||||
|
SET IDENTITY_INSERT {table_name.lower()} OFF
|
||||||
|
GO
|
||||||
|
COMMIT
|
||||||
|
GO
|
||||||
|
-- @formatter:on"""
|
||||||
|
|
||||||
|
return script
|
||||||
|
|
||||||
|
def gen_dual(self) -> str:
|
||||||
|
return """DROP TABLE IF EXISTS dual
|
||||||
|
GO
|
||||||
|
|
||||||
|
CREATE TABLE dual
|
||||||
|
(
|
||||||
|
id int NULL
|
||||||
|
)
|
||||||
|
GO
|
||||||
|
|
||||||
|
EXEC sp_addextendedproperty
|
||||||
|
'MS_Description', N'数据库连接的表',
|
||||||
|
'SCHEMA', N'dbo',
|
||||||
|
'TABLE', N'dual'
|
||||||
|
GO"""
|
||||||
|
|
||||||
|
|
||||||
|
class DM8Convertor(Convertor):
|
||||||
|
def __init__(self, src):
|
||||||
|
super().__init__(src, "DM8")
|
||||||
|
|
||||||
|
def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]):
|
||||||
|
"""类型转换"""
|
||||||
|
type = type.lower()
|
||||||
|
|
||||||
|
if type == "varchar":
|
||||||
|
return f"varchar({size})"
|
||||||
|
if type == "int":
|
||||||
|
return "int"
|
||||||
|
if type == "bigint" or type == "bigint unsigned":
|
||||||
|
return "bigint"
|
||||||
|
if type == "datetime":
|
||||||
|
return "datetime"
|
||||||
|
if type == "bit":
|
||||||
|
return "bit"
|
||||||
|
if type in ("tinyint", "smallint"):
|
||||||
|
return "smallint"
|
||||||
|
if type == "text":
|
||||||
|
return "text"
|
||||||
|
if type == "blob":
|
||||||
|
return "blob"
|
||||||
|
if type == "mediumblob":
|
||||||
|
return "varchar(10240)"
|
||||||
|
if type == "decimal":
|
||||||
|
return (
|
||||||
|
f"decimal({','.join(str(s) for s in size)})" if len(size) else "decimal"
|
||||||
|
)
|
||||||
|
|
||||||
|
def gen_create(self, ddl) -> str:
|
||||||
|
"""生成 CREATE 语句"""
|
||||||
|
|
||||||
|
def generate_column(col):
|
||||||
|
name = col["name"].lower()
|
||||||
|
if name == "id":
|
||||||
|
return "id bigint NOT NULL PRIMARY KEY IDENTITY"
|
||||||
|
|
||||||
|
type = col["type"].lower()
|
||||||
|
full_type = self.translate_type(type, col["size"])
|
||||||
|
nullable = "NULL" if col["nullable"] else "NOT NULL"
|
||||||
|
default = f"DEFAULT {col['default']}" if col["default"] is not None else ""
|
||||||
|
return f"{name} {full_type} {default} {nullable}"
|
||||||
|
|
||||||
|
table_name = ddl["table_name"].lower()
|
||||||
|
columns = [f"{generate_column(col).strip()}" for col in ddl["columns"]]
|
||||||
|
field_def_list = ",\n ".join(columns)
|
||||||
|
script = f"""-- ----------------------------
|
||||||
|
-- Table structure for {table_name}
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE {table_name} (
|
||||||
|
{field_def_list}
|
||||||
|
);"""
|
||||||
|
|
||||||
|
# oracle INSERT '' 不能通过 NOT NULL 校验
|
||||||
|
script = script.replace("DEFAULT '' NOT NULL", "DEFAULT '' NULL")
|
||||||
|
|
||||||
|
return script
|
||||||
|
|
||||||
|
def gen_index(self, ddl: Dict) -> str:
|
||||||
|
return "\n".join(f"{script};" for script in self.index(ddl))
|
||||||
|
|
||||||
|
def gen_comment(self, table_sql: str, table_name: str) -> str:
|
||||||
|
script = ""
|
||||||
|
for field, comment_string in self.filed_comments(table_sql):
|
||||||
|
script += (
|
||||||
|
f"COMMENT ON COLUMN {table_name}.{field} IS '{comment_string}';" + "\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
table_comment = self.table_comment(table_sql)
|
||||||
|
if table_comment:
|
||||||
|
script += f"COMMENT ON TABLE {table_name} IS '{table_comment}';\n"
|
||||||
|
|
||||||
|
return script
|
||||||
|
|
||||||
|
def gen_pk(self, table_name: str) -> str:
|
||||||
|
"""生成主键定义"""
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def gen_index(self, ddl: Dict) -> str:
|
||||||
|
return "\n".join(f"{script};" for script in self.index(ddl))
|
||||||
|
|
||||||
|
def gen_insert(self, table_name: str) -> str:
|
||||||
|
"""拷贝 INSERT 语句"""
|
||||||
|
inserts = list(Convertor.inserts(table_name, self.content))
|
||||||
|
|
||||||
|
## 生成 insert 脚本
|
||||||
|
script = ""
|
||||||
|
if inserts:
|
||||||
|
inserts_lines = "\n".join(inserts)
|
||||||
|
script += f"""\n\n-- ----------------------------
|
||||||
|
-- Records of {table_name.lower()}
|
||||||
|
-- ----------------------------
|
||||||
|
-- @formatter:off
|
||||||
|
SET IDENTITY_INSERT {table_name.lower()} ON;
|
||||||
|
{inserts_lines}
|
||||||
|
COMMIT;
|
||||||
|
SET IDENTITY_INSERT {table_name.lower()} OFF;
|
||||||
|
-- @formatter:on"""
|
||||||
|
|
||||||
|
return script
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="芋道系统数据库转换工具")
|
||||||
|
parser.add_argument(
|
||||||
|
"type",
|
||||||
|
type=str,
|
||||||
|
help="目标数据库类型",
|
||||||
|
choices=["postgres", "oracle", "sqlserver", "dm8"],
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
sql_file = pathlib.Path("../mysql/ruoyi-vue-pro.sql").resolve().as_posix()
|
||||||
|
convertor = None
|
||||||
|
if args.type == "postgres":
|
||||||
|
convertor = PostgreSQLConvertor(sql_file)
|
||||||
|
elif args.type == "oracle":
|
||||||
|
convertor = OracleConvertor(sql_file)
|
||||||
|
elif args.type == "sqlserver":
|
||||||
|
convertor = SQLServerConvertor(sql_file)
|
||||||
|
elif args.type == "dm8":
|
||||||
|
convertor = DM8Convertor(sql_file)
|
||||||
|
else:
|
||||||
|
raise NotImplementedError(f"不支持目标数据库类型: {args.type}")
|
||||||
|
|
||||||
|
convertor.print()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,94 @@
|
||||||
|
name: ruoyi-vue-pro
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
mysql: { }
|
||||||
|
postgres: { }
|
||||||
|
sqlserver: { }
|
||||||
|
dm8: { }
|
||||||
|
|
||||||
|
services:
|
||||||
|
mysql:
|
||||||
|
image: mysql:8.0.33
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
MYSQL_ROOT_PASSWORD: 123456
|
||||||
|
MYSQL_DATABASE: ruoyi-vue-pro
|
||||||
|
ports:
|
||||||
|
- "3306:3306"
|
||||||
|
volumes:
|
||||||
|
- mysql:/var/lib/mysql/
|
||||||
|
# 注入初始化脚本
|
||||||
|
- ./mysql/ruoyi-vue-pro.sql:/docker-entrypoint-initdb.d/init.sql:ro
|
||||||
|
command:
|
||||||
|
--default-authentication-plugin=mysql_native_password
|
||||||
|
--character-set-server=utf8mb4
|
||||||
|
--collation-server=utf8mb4_general_ci
|
||||||
|
--explicit_defaults_for_timestamp=true
|
||||||
|
--lower_case_table_names=1
|
||||||
|
|
||||||
|
postgres:
|
||||||
|
image: postgres:14.2
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: root
|
||||||
|
POSTGRES_PASSWORD: 123456
|
||||||
|
POSTGRES_DB: ruoyi-vue-pro
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
|
volumes:
|
||||||
|
- postgres:/var/lib/postgresql/data
|
||||||
|
# 注入初始化脚本
|
||||||
|
- ../postgresql/quartz.sql:/docker-entrypoint-initdb.d/quartz.sql:ro
|
||||||
|
- ../postgresql/ruoyi-vue-pro.sql:/docker-entrypoint-initdb.d/ruoyi-vue-pro.sql:ro
|
||||||
|
|
||||||
|
oracle:
|
||||||
|
image: gvenzl/oracle-xe:18-slim-faststart
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
## 登录信息 SID: XE user: system password: oracle
|
||||||
|
ORACLE_PASSWORD: oracle
|
||||||
|
ports:
|
||||||
|
- "1521:1521"
|
||||||
|
volumes:
|
||||||
|
- ../oracle/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
|
||||||
|
# 创建app用户: ROOT/123456@//localhost/XEPDB1
|
||||||
|
- ./oracle/1_create_user.sql:/docker-entrypoint-initdb.d/1_create_user.sql:ro
|
||||||
|
- ./oracle/2_create_schema.sh:/docker-entrypoint-initdb.d/2_create_schema.sh:ro
|
||||||
|
|
||||||
|
sqlserver:
|
||||||
|
image: mcr.microsoft.com/mssql/server:2017-latest
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
ACCEPT_EULA: "Y"
|
||||||
|
SA_PASSWORD: "Yudao@2024"
|
||||||
|
ports:
|
||||||
|
- "1433:1433"
|
||||||
|
volumes:
|
||||||
|
- sqlserver:/var/opt/mssql
|
||||||
|
- ../sqlserver/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
|
||||||
|
# docker compose exec sqlserver bash /tmp/create_schema.sh
|
||||||
|
- ./sqlserver/create_schema.sh:/tmp/create_schema.sh:ro
|
||||||
|
|
||||||
|
|
||||||
|
dm8:
|
||||||
|
# wget https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar
|
||||||
|
# docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar
|
||||||
|
image: dm8_single:dm8_20230808_rev197096_x86_rh6_64
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
PAGE_SIZE: 16
|
||||||
|
LD_LIBRARY_PATH: /opt/dmdbms/bin
|
||||||
|
EXTENT_SIZE: 32
|
||||||
|
BLANK_PAD_MODE: 1
|
||||||
|
LOG_SIZE: 1024
|
||||||
|
UNICODE_FLAG: 1
|
||||||
|
LENGTH_IN_CHAR: 1
|
||||||
|
INSTANCE_NAME: dm8_test
|
||||||
|
ports:
|
||||||
|
- "5236:5236"
|
||||||
|
volumes:
|
||||||
|
- dm8:/opt/dmdbms/data
|
||||||
|
- ../dm/ruoyi-vue-pro-dm8.sql:/tmp/schema.sql:ro
|
||||||
|
# docker compose exec dm8 bash -c "exec /opt/dmdbms/bin/disql SYSDBA/SYSDBA001 \`/tmp/schema.sql"
|
|
@ -0,0 +1,3 @@
|
||||||
|
ALTER SESSION SET CONTAINER=XEPDB1;
|
||||||
|
CREATE USER ROOT IDENTIFIED BY 123456 QUOTA UNLIMITED ON USERS;
|
||||||
|
GRANT CONNECT, RESOURCE TO ROOT;
|
|
@ -0,0 +1 @@
|
||||||
|
sqlplus -s ROOT/123456@//localhost/XEPDB1 @/tmp/schema.sql
|
|
@ -0,0 +1,5 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SA_PASSWORD} -Q "CREATE DATABASE [ruoyi-vue-pro];
|
||||||
|
GO"
|
||||||
|
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SA_PASSWORD} -d 'ruoyi-vue-pro' -i /tmp/schema.sql
|
|
@ -23,7 +23,7 @@ public class YudaoDataSourceAutoConfiguration {
|
||||||
* 创建 DruidAdRemoveFilter 过滤器,过滤 common.js 的广告
|
* 创建 DruidAdRemoveFilter 过滤器,过滤 common.js 的广告
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnProperty(name = "spring.datasource.druid.web-stat-filter.enabled", havingValue = "true")
|
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true")
|
||||||
public FilterRegistrationBean<DruidAdRemoveFilter> druidAdRemoveFilterFilter(DruidStatProperties properties) {
|
public FilterRegistrationBean<DruidAdRemoveFilter> druidAdRemoveFilterFilter(DruidStatProperties properties) {
|
||||||
// 获取 druid web 监控页面的参数
|
// 获取 druid web 监控页面的参数
|
||||||
DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
|
DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
|
||||||
|
|
|
@ -5,7 +5,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.SortablePageParam;
|
import cn.iocoder.yudao.framework.common.pojo.SortablePageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.SortingField;
|
import cn.iocoder.yudao.framework.common.pojo.SortingField;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
||||||
|
import com.baomidou.mybatisplus.annotation.DbType;
|
||||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
@ -20,6 +22,7 @@ import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力
|
* 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力
|
||||||
|
@ -147,6 +150,11 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
|
||||||
* @param entities 实体们
|
* @param entities 实体们
|
||||||
*/
|
*/
|
||||||
default Boolean insertBatch(Collection<T> entities) {
|
default Boolean insertBatch(Collection<T> entities) {
|
||||||
|
// 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
|
||||||
|
if (Objects.equals(SqlConstants.DB_TYPE, DbType.SQL_SERVER)) {
|
||||||
|
entities.forEach(this::insert);
|
||||||
|
return CollUtil.isNotEmpty(entities);
|
||||||
|
}
|
||||||
return Db.saveBatch(entities);
|
return Db.saveBatch(entities);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,6 +165,11 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
|
||||||
* @param size 插入数量 Db.saveBatch 默认为 1000
|
* @param size 插入数量 Db.saveBatch 默认为 1000
|
||||||
*/
|
*/
|
||||||
default Boolean insertBatch(Collection<T> entities, int size) {
|
default Boolean insertBatch(Collection<T> entities, int size) {
|
||||||
|
// 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
|
||||||
|
if (Objects.equals(SqlConstants.DB_TYPE, DbType.SQL_SERVER)) {
|
||||||
|
entities.forEach(this::insert);
|
||||||
|
return CollUtil.isNotEmpty(entities);
|
||||||
|
}
|
||||||
return Db.saveBatch(entities, size);
|
return Db.saveBatch(entities, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ public class ApiAccessLogInterceptor implements HandlerInterceptor {
|
||||||
log.info("[preHandle][开始请求 URL({}) 无参数]", request.getRequestURI());
|
log.info("[preHandle][开始请求 URL({}) 无参数]", request.getRequestURI());
|
||||||
} else {
|
} else {
|
||||||
log.info("[preHandle][开始请求 URL({}) 参数({})]", request.getRequestURI(),
|
log.info("[preHandle][开始请求 URL({}) 参数({})]", request.getRequestURI(),
|
||||||
StrUtil.nullToDefault(requestBody, queryString.toString()));
|
StrUtil.blankToDefault(requestBody, queryString.toString()));
|
||||||
}
|
}
|
||||||
// 计时
|
// 计时
|
||||||
StopWatch stopWatch = new StopWatch();
|
StopWatch stopWatch = new StopWatch();
|
||||||
|
|
|
@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
|
import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
|
||||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
|
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
||||||
|
@ -31,6 +32,7 @@ import javax.validation.ConstraintViolationException;
|
||||||
import javax.validation.ValidationException;
|
import javax.validation.ValidationException;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.*;
|
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.*;
|
||||||
|
|
||||||
|
@ -44,6 +46,11 @@ import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeC
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class GlobalExceptionHandler {
|
public class GlobalExceptionHandler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 忽略的 ServiceException 错误提示,避免打印过多 logger
|
||||||
|
*/
|
||||||
|
public static final Set<String> IGNORE_ERROR_MESSAGES = SetUtils.asSet("无效的刷新令牌");
|
||||||
|
|
||||||
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
|
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
|
||||||
private final String applicationName;
|
private final String applicationName;
|
||||||
|
|
||||||
|
@ -198,7 +205,10 @@ public class GlobalExceptionHandler {
|
||||||
*/
|
*/
|
||||||
@ExceptionHandler(value = ServiceException.class)
|
@ExceptionHandler(value = ServiceException.class)
|
||||||
public CommonResult<?> serviceExceptionHandler(ServiceException ex) {
|
public CommonResult<?> serviceExceptionHandler(ServiceException ex) {
|
||||||
|
if (!IGNORE_ERROR_MESSAGES.contains(ex.getMessage())) {
|
||||||
|
// 不包含的时候,才进行打印,避免 ex 堆栈过多
|
||||||
log.info("[serviceExceptionHandler]", ex);
|
log.info("[serviceExceptionHandler]", ex);
|
||||||
|
}
|
||||||
return CommonResult.error(ex.getCode(), ex.getMessage());
|
return CommonResult.error(ex.getCode(), ex.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,17 +39,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -40,27 +40,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -66,7 +66,7 @@ public class CrmBusinessSaveReqVO {
|
||||||
private Long contactId; // 使用场景,在【联系人详情】添加商机时,如果需要关联两者,需要传递 contactId 字段
|
private Long contactId; // 使用场景,在【联系人详情】添加商机时,如果需要关联两者,需要传递 contactId 字段
|
||||||
|
|
||||||
@Schema(description = "产品列表")
|
@Schema(description = "产品列表")
|
||||||
private List<BusinessProduct> businessProducts;
|
private List<BusinessProduct> products;
|
||||||
|
|
||||||
@Schema(description = "产品列表")
|
@Schema(description = "产品列表")
|
||||||
@Data
|
@Data
|
||||||
|
|
|
@ -89,7 +89,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
||||||
success = CRM_BUSINESS_CREATE_SUCCESS)
|
success = CRM_BUSINESS_CREATE_SUCCESS)
|
||||||
public Long createBusiness(CrmBusinessSaveReqVO createReqVO, Long userId) {
|
public Long createBusiness(CrmBusinessSaveReqVO createReqVO, Long userId) {
|
||||||
// 1.1 校验产品项的有效性
|
// 1.1 校验产品项的有效性
|
||||||
List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(createReqVO.getBusinessProducts());
|
List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(createReqVO.getProducts());
|
||||||
// 1.2 校验关联字段
|
// 1.2 校验关联字段
|
||||||
validateRelationDataExists(createReqVO);
|
validateRelationDataExists(createReqVO);
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
||||||
// 1.1 校验存在
|
// 1.1 校验存在
|
||||||
CrmBusinessDO oldBusiness = validateBusinessExists(updateReqVO.getId());
|
CrmBusinessDO oldBusiness = validateBusinessExists(updateReqVO.getId());
|
||||||
// 1.2 校验产品项的有效性
|
// 1.2 校验产品项的有效性
|
||||||
List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(updateReqVO.getBusinessProducts());
|
List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(updateReqVO.getProducts());
|
||||||
// 1.3 校验关联字段
|
// 1.3 校验关联字段
|
||||||
validateRelationDataExists(updateReqVO);
|
validateRelationDataExists(updateReqVO);
|
||||||
|
|
||||||
|
|
|
@ -38,17 +38,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
data:
|
data:
|
||||||
|
|
|
@ -39,27 +39,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -38,17 +38,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -39,27 +39,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -3,18 +3,22 @@ package cn.iocoder.yudao.module.infra.service.db;
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
|
||||||
import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
|
import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
|
||||||
|
import com.baomidou.mybatisplus.annotation.DbType;
|
||||||
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
|
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
|
||||||
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
|
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
|
||||||
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
|
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
|
||||||
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
|
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
|
||||||
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
|
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
|
||||||
import com.baomidou.mybatisplus.generator.config.rules.DateType;
|
import com.baomidou.mybatisplus.generator.config.rules.DateType;
|
||||||
|
import com.baomidou.mybatisplus.generator.query.SQLQuery;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -45,10 +49,14 @@ public class DatabaseTableServiceImpl implements DatabaseTableService {
|
||||||
// 获得数据源配置
|
// 获得数据源配置
|
||||||
DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId);
|
DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId);
|
||||||
Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId);
|
Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId);
|
||||||
|
DbType dbType = JdbcUtils.getDbType(config.getUrl());
|
||||||
|
|
||||||
// 使用 MyBatis Plus Generator 解析表结构
|
// 使用 MyBatis Plus Generator 解析表结构
|
||||||
DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(),
|
DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(),
|
||||||
config.getPassword()).build();
|
config.getPassword());
|
||||||
|
if (Objects.equals(dbType, DbType.SQL_SERVER)) { // 特殊:SQLServer jdbc 非标准,参见 https://github.com/baomidou/mybatis-plus/issues/5419
|
||||||
|
dataSourceConfigBuilder.databaseQueryClass(SQLQuery.class);
|
||||||
|
}
|
||||||
StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder().enableSkipView(); // 忽略视图,业务上一般用不到
|
StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder().enableSkipView(); // 忽略视图,业务上一般用不到
|
||||||
if (StrUtil.isNotEmpty(name)) {
|
if (StrUtil.isNotEmpty(name)) {
|
||||||
strategyConfig.addInclude(name);
|
strategyConfig.addInclude(name);
|
||||||
|
@ -59,8 +67,9 @@ public class DatabaseTableServiceImpl implements DatabaseTableService {
|
||||||
strategyConfig.addExclude("IMPDP_[\\S\\s]+|ALL_[\\S\\s]+|HS_[\\S\\\\s]+");
|
strategyConfig.addExclude("IMPDP_[\\S\\s]+|ALL_[\\S\\s]+|HS_[\\S\\\\s]+");
|
||||||
strategyConfig.addExclude("[\\S\\s]+\\$[\\S\\s]+|[\\S\\s]+\\$"); // 表里不能有 $,一般有都是系统的表
|
strategyConfig.addExclude("[\\S\\s]+\\$[\\S\\s]+|[\\S\\s]+\\$"); // 表里不能有 $,一般有都是系统的表
|
||||||
}
|
}
|
||||||
|
|
||||||
GlobalConfig globalConfig = new GlobalConfig.Builder().dateType(DateType.TIME_PACK).build(); // 只使用 LocalDateTime 类型,不使用 LocalDate
|
GlobalConfig globalConfig = new GlobalConfig.Builder().dateType(DateType.TIME_PACK).build(); // 只使用 LocalDateTime 类型,不使用 LocalDate
|
||||||
ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfig, strategyConfig.build(),
|
ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfigBuilder.build(), strategyConfig.build(),
|
||||||
null, globalConfig, null);
|
null, globalConfig, null);
|
||||||
// 按照名字排序
|
// 按照名字排序
|
||||||
List<TableInfo> tables = builder.getTableInfoList();
|
List<TableInfo> tables = builder.getTableInfoList();
|
||||||
|
|
|
@ -39,17 +39,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -44,27 +44,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -192,7 +192,9 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
||||||
if (CollUtil.isEmpty(ids)) {
|
if (CollUtil.isEmpty(ids)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
return productSpuMapper.selectBatchIds(ids);
|
Map<Long, ProductSpuDO> spuMap = convertMap(productSpuMapper.selectBatchIds(ids), ProductSpuDO::getId);
|
||||||
|
// 需要按照 ids 顺序返回。例如说:店铺装修选择了 [3, 1, 2] 三个商品,返回结果还是 [3, 1, 2] 这样的顺序
|
||||||
|
return convertList(ids, spuMap::get);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -39,17 +39,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -40,27 +40,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.CouponTemplatePageReqVO;
|
import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.CouponTemplatePageReqVO;
|
||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponTemplateDO;
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponTemplateDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTemplateValidityTypeEnum;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
@ -67,9 +68,9 @@ public interface CouponTemplateMapper extends BaseMapperX<CouponTemplateDO> {
|
||||||
canTakeConsumer = w ->
|
canTakeConsumer = w ->
|
||||||
w.eq(CouponTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) // 1. 状态为可用的
|
w.eq(CouponTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) // 1. 状态为可用的
|
||||||
.in(CouponTemplateDO::getTakeType, canTakeTypes) // 2. 领取方式一致
|
.in(CouponTemplateDO::getTakeType, canTakeTypes) // 2. 领取方式一致
|
||||||
.and(ww -> ww.isNull(CouponTemplateDO::getValidEndTime) // 3. 未过期
|
.and(ww -> ww.gt(CouponTemplateDO::getValidEndTime, LocalDateTime.now()) // 3.1 未过期
|
||||||
.or().gt(CouponTemplateDO::getValidEndTime, LocalDateTime.now()))
|
.or().eq(CouponTemplateDO::getValidityType, CouponTemplateValidityTypeEnum.TERM.getType())) // 3.2 领取之后
|
||||||
.apply(" take_count < total_count "); // 4. 剩余数量大于 0
|
.apply(" (take_count < total_count OR total_count = -1 )"); // 4. 剩余数量大于 0,或者无限领取
|
||||||
}
|
}
|
||||||
return canTakeConsumer;
|
return canTakeConsumer;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollectionUtil;
|
||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO;
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO;
|
||||||
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO;
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO;
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO;
|
||||||
|
@ -17,6 +18,7 @@ import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountProductMappe
|
||||||
import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;
|
import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;
|
||||||
import cn.iocoder.yudao.module.promotion.util.PromotionUtils;
|
import cn.iocoder.yudao.module.promotion.util.PromotionUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
@ -48,31 +50,30 @@ public class DiscountActivityServiceImpl implements DiscountActivityService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<DiscountProductDO> getMatchDiscountProductList(Collection<Long> skuIds) {
|
public List<DiscountProductDO> getMatchDiscountProductList(Collection<Long> skuIds) {
|
||||||
// TODO @zhangshuai:这里是不是可以直接 return discountProductMapper.getMatchDiscountProductList(skuIds); 一般来说,如果 idea 报“黄色”的警告,尽量都处理下哈;原则是,一切警告,皆为异常(错误),这样可以写出更好的代码。
|
return discountProductMapper.getMatchDiscountProductList(skuIds);
|
||||||
List<DiscountProductDO> matchDiscountProductList = discountProductMapper.getMatchDiscountProductList(skuIds);
|
|
||||||
return matchDiscountProductList;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public Long createDiscountActivity(DiscountActivityCreateReqVO createReqVO) {
|
public Long createDiscountActivity(DiscountActivityCreateReqVO createReqVO) {
|
||||||
// 校验商品是否冲突
|
// 校验商品是否冲突
|
||||||
validateDiscountActivityProductConflicts(null, createReqVO.getProducts());
|
validateDiscountActivityProductConflicts(null, createReqVO.getProducts());
|
||||||
|
|
||||||
// 插入活动
|
// 插入活动
|
||||||
DiscountActivityDO discountActivity = DiscountActivityConvert.INSTANCE.convert(createReqVO)
|
DiscountActivityDO discountActivity = DiscountActivityConvert.INSTANCE.convert(createReqVO)
|
||||||
// TODO @zhangshuai:这里的调用去掉哈,强制就是开启的;
|
.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||||
.setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getEndTime()));
|
|
||||||
discountActivityMapper.insert(discountActivity);
|
discountActivityMapper.insert(discountActivity);
|
||||||
// 插入商品
|
// 插入商品
|
||||||
// TODO @zhangshuai:activityStatus 最好代码里,也做下设置噢。
|
List<DiscountProductDO> discountProducts = BeanUtils.toBean(createReqVO.getProducts(), DiscountProductDO.class,
|
||||||
List<DiscountProductDO> discountProducts = convertList(createReqVO.getProducts(),
|
product -> product.setActivityId(discountActivity.getId()).setActivityStatus(discountActivity.getStatus())
|
||||||
product -> DiscountActivityConvert.INSTANCE.convert(product).setActivityId(discountActivity.getId()));
|
.setActivityStartTime(createReqVO.getStartTime()).setActivityEndTime(createReqVO.getEndTime()));
|
||||||
discountProductMapper.insertBatch(discountProducts);
|
discountProductMapper.insertBatch(discountProducts);
|
||||||
// 返回
|
// 返回
|
||||||
return discountActivity.getId();
|
return discountActivity.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void updateDiscountActivity(DiscountActivityUpdateReqVO updateReqVO) {
|
public void updateDiscountActivity(DiscountActivityUpdateReqVO updateReqVO) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
DiscountActivityDO discountActivity = validateDiscountActivityExists(updateReqVO.getId());
|
DiscountActivityDO discountActivity = validateDiscountActivityExists(updateReqVO.getId());
|
||||||
|
|
|
@ -39,17 +39,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -40,27 +40,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -58,7 +58,7 @@ public interface TradeOrderStatisticsMapper extends BaseMapperX<TradeStatisticsD
|
||||||
|
|
||||||
Long selectCountByStatusAndDeliveryType(@Param("status") Integer status, @Param("deliveryType") Integer deliveryType);
|
Long selectCountByStatusAndDeliveryType(@Param("status") Integer status, @Param("deliveryType") Integer deliveryType);
|
||||||
|
|
||||||
TradeOrderSummaryRespVO selectPaySummaryByStatusAndPayTimeBetween(@Param("status") Integer status,
|
TradeOrderSummaryRespVO selectPaySummaryByPayStatusAndPayTimeBetween(@Param("payStatus") Integer payStatus,
|
||||||
@Param("beginTime") LocalDateTime beginTime,
|
@Param("beginTime") LocalDateTime beginTime,
|
||||||
@Param("endTime") LocalDateTime endTime);
|
@Param("endTime") LocalDateTime endTime);
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ public class TradeOrderStatisticsServiceImpl implements TradeOrderStatisticsServ
|
||||||
private TradeOrderSummaryRespVO getPayPriceSummary(LocalDateTime date) {
|
private TradeOrderSummaryRespVO getPayPriceSummary(LocalDateTime date) {
|
||||||
LocalDateTime beginTime = LocalDateTimeUtil.beginOfDay(date);
|
LocalDateTime beginTime = LocalDateTimeUtil.beginOfDay(date);
|
||||||
LocalDateTime endTime = LocalDateTimeUtil.beginOfDay(date);
|
LocalDateTime endTime = LocalDateTimeUtil.beginOfDay(date);
|
||||||
return tradeOrderStatisticsMapper.selectPaySummaryByStatusAndPayTimeBetween(
|
return tradeOrderStatisticsMapper.selectPaySummaryByPayStatusAndPayTimeBetween(
|
||||||
PayOrderStatusEnum.SUCCESS.getStatus(), beginTime, endTime);
|
PayOrderStatusEnum.SUCCESS.getStatus(), beginTime, endTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,17 +39,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -40,27 +40,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -93,12 +93,12 @@
|
||||||
AND deleted = FALSE
|
AND deleted = FALSE
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectPaySummaryByStatusAndPayTimeBetween"
|
<select id="selectPaySummaryByPayStatusAndPayTimeBetween"
|
||||||
resultType="cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeOrderSummaryRespVO">
|
resultType="cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeOrderSummaryRespVO">
|
||||||
SELECT IFNULL(SUM(pay_price), 0) AS orderPayPrice,
|
SELECT IFNULL(SUM(pay_price), 0) AS orderPayPrice,
|
||||||
COUNT(1) AS orderPayCount
|
COUNT(1) AS orderPayCount
|
||||||
FROM trade_order
|
FROM trade_order
|
||||||
WHERE status = #{status}
|
WHERE pay_status = #{payStatus}
|
||||||
AND pay_time BETWEEN #{beginTime} AND #{endTime}
|
AND pay_time BETWEEN #{beginTime} AND #{endTime}
|
||||||
AND deleted = FALSE
|
AND deleted = FALSE
|
||||||
</select>
|
</select>
|
||||||
|
|
|
@ -14,7 +14,7 @@ import lombok.RequiredArgsConstructor;
|
||||||
public enum TradeOrderOperateTypeEnum {
|
public enum TradeOrderOperateTypeEnum {
|
||||||
|
|
||||||
MEMBER_CREATE(1, "用户下单"),
|
MEMBER_CREATE(1, "用户下单"),
|
||||||
ADMIN_UPDATE_PRICE(2, "订单价格 {oldPayPrice} 修改,实际支付金额为 {newPayPrice} 元"),
|
ADMIN_UPDATE_PRICE(2, "订单价格 {oldPayPrice} 修改,调整价格 {adjustPrice},实际支付金额为 {newPayPrice} 元"),
|
||||||
MEMBER_PAY(10, "用户付款成功"),
|
MEMBER_PAY(10, "用户付款成功"),
|
||||||
ADMIN_UPDATE_ADDRESS(11, "收货地址修改"),
|
ADMIN_UPDATE_ADDRESS(11, "收货地址修改"),
|
||||||
ADMIN_DELIVERY(20, "已发货,快递公司:{deliveryName},快递单号:{logisticsNo}"),
|
ADMIN_DELIVERY(20, "已发货,快递公司:{deliveryName},快递单号:{logisticsNo}"),
|
||||||
|
|
|
@ -631,7 +631,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
||||||
|
|
||||||
// 2. 更新订单
|
// 2. 更新订单
|
||||||
tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())
|
tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())
|
||||||
.setAdjustPrice(reqVO.getAdjustPrice()).setPayPrice(newPayPrice));
|
.setAdjustPrice(reqVO.getAdjustPrice() + order.getAdjustPrice()).setPayPrice(newPayPrice));
|
||||||
|
|
||||||
// 3. 更新 TradeOrderItem,需要做 adjustPrice 的分摊
|
// 3. 更新 TradeOrderItem,需要做 adjustPrice 的分摊
|
||||||
List<TradeOrderItemDO> orderOrderItems = tradeOrderItemMapper.selectListByOrderId(order.getId());
|
List<TradeOrderItemDO> orderOrderItems = tradeOrderItemMapper.selectListByOrderId(order.getId());
|
||||||
|
@ -639,9 +639,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
||||||
List<TradeOrderItemDO> updateItems = new ArrayList<>();
|
List<TradeOrderItemDO> updateItems = new ArrayList<>();
|
||||||
for (int i = 0; i < orderOrderItems.size(); i++) {
|
for (int i = 0; i < orderOrderItems.size(); i++) {
|
||||||
TradeOrderItemDO item = orderOrderItems.get(i);
|
TradeOrderItemDO item = orderOrderItems.get(i);
|
||||||
// TODO puhui999: 已有分摊记录的情况下价格是否会不对,也就是说之前订单项 1 分摊了 10 块这次是 -100
|
updateItems.add(new TradeOrderItemDO().setId(item.getId()).setAdjustPrice(item.getAdjustPrice() + dividePrices.get(i))
|
||||||
// 那么 setPayPrice 是否改为 (item.getPayPrice()-item.getAdjustPrice()) + dividePrices.get(i) 先减掉原来的价格再加上调价。经过验证可行,修改后订单价格增减都能正确分摊
|
|
||||||
updateItems.add(new TradeOrderItemDO().setId(item.getId()).setAdjustPrice(dividePrices.get(i))
|
|
||||||
.setPayPrice((item.getPayPrice() - item.getAdjustPrice()) + dividePrices.get(i)));
|
.setPayPrice((item.getPayPrice() - item.getAdjustPrice()) + dividePrices.get(i)));
|
||||||
}
|
}
|
||||||
tradeOrderItemMapper.updateBatch(updateItems);
|
tradeOrderItemMapper.updateBatch(updateItems);
|
||||||
|
@ -652,6 +650,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
||||||
// 5. 记录订单日志
|
// 5. 记录订单日志
|
||||||
TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus(),
|
TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus(),
|
||||||
MapUtil.<String, Object>builder().put("oldPayPrice", MoneyUtils.fenToYuanStr(order.getPayPrice()))
|
MapUtil.<String, Object>builder().put("oldPayPrice", MoneyUtils.fenToYuanStr(order.getPayPrice()))
|
||||||
|
.put("adjustPrice", MoneyUtils.fenToYuanStr(reqVO.getAdjustPrice()))
|
||||||
.put("newPayPrice", MoneyUtils.fenToYuanStr(newPayPrice)).build());
|
.put("newPayPrice", MoneyUtils.fenToYuanStr(newPayPrice)).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -245,7 +245,7 @@ public class TradePriceCalculatorHelper {
|
||||||
* @return 分摊金额数组,和传入的 orderItems 一一对应
|
* @return 分摊金额数组,和传入的 orderItems 一一对应
|
||||||
*/
|
*/
|
||||||
public static List<Integer> dividePrice2(List<TradeOrderItemDO> items, Integer price) {
|
public static List<Integer> dividePrice2(List<TradeOrderItemDO> items, Integer price) {
|
||||||
Integer total = getSumValue(items, TradeOrderItemDO::getPrice, Integer::sum);
|
Integer total = getSumValue(items, TradeOrderItemDO::getPayPrice, Integer::sum);
|
||||||
assert total != null;
|
assert total != null;
|
||||||
// 遍历每一个,进行分摊
|
// 遍历每一个,进行分摊
|
||||||
List<Integer> prices = new ArrayList<>(items.size());
|
List<Integer> prices = new ArrayList<>(items.size());
|
||||||
|
@ -254,15 +254,11 @@ public class TradePriceCalculatorHelper {
|
||||||
TradeOrderItemDO orderItem = items.get(i);
|
TradeOrderItemDO orderItem = items.get(i);
|
||||||
int partPrice;
|
int partPrice;
|
||||||
if (i < items.size() - 1) { // 减一的原因,是因为拆分时,如果按照比例,可能会出现.所以最后一个,使用反减
|
if (i < items.size() - 1) { // 减一的原因,是因为拆分时,如果按照比例,可能会出现.所以最后一个,使用反减
|
||||||
// partPrice = (int) (price * (1.0D * orderItem.getPayPrice() / total));
|
|
||||||
// pr fix: 改为了使用订单原价来计算比例
|
|
||||||
partPrice = (int) (price * (1.0D * orderItem.getPrice() / total));
|
partPrice = (int) (price * (1.0D * orderItem.getPrice() / total));
|
||||||
remainPrice -= partPrice;
|
remainPrice -= partPrice;
|
||||||
} else {
|
} else {
|
||||||
partPrice = remainPrice;
|
partPrice = remainPrice;
|
||||||
}
|
}
|
||||||
// TODO puhui999: 如果是减价的情况这里过不了
|
|
||||||
// Assert.isTrue(partPrice >= 0, "分摊金额必须大于等于 0");
|
|
||||||
prices.add(partPrice);
|
prices.add(partPrice);
|
||||||
}
|
}
|
||||||
return prices;
|
return prices;
|
||||||
|
|
|
@ -39,17 +39,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -40,27 +40,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -39,17 +39,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -40,27 +40,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -39,17 +39,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -40,27 +40,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -39,17 +39,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -40,27 +40,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.report.framework.jmreport.config;
|
||||||
import cn.iocoder.yudao.framework.security.config.SecurityProperties;
|
import cn.iocoder.yudao.framework.security.config.SecurityProperties;
|
||||||
import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
|
import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
|
||||||
import cn.iocoder.yudao.module.report.framework.jmreport.core.service.JmReportTokenServiceImpl;
|
import cn.iocoder.yudao.module.report.framework.jmreport.core.service.JmReportTokenServiceImpl;
|
||||||
|
import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
|
||||||
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
|
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
@ -19,8 +20,10 @@ public class JmReportConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
|
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
|
||||||
public JmReportTokenServiceI jmReportTokenService(OAuth2TokenApi oAuth2TokenApi, SecurityProperties securityProperties) {
|
public JmReportTokenServiceI jmReportTokenService(OAuth2TokenApi oAuth2TokenApi,
|
||||||
return new JmReportTokenServiceImpl(oAuth2TokenApi, securityProperties);
|
PermissionApi permissionApi,
|
||||||
|
SecurityProperties securityProperties) {
|
||||||
|
return new JmReportTokenServiceImpl(oAuth2TokenApi, permissionApi, securityProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,8 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
||||||
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
|
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
|
||||||
import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
|
import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
|
||||||
import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
|
import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
|
||||||
|
import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
|
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
|
||||||
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpHeaders;
|
||||||
|
@ -36,6 +38,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
|
||||||
private static final String AUTHORIZATION_FORMAT = SecurityFrameworkUtils.AUTHORIZATION_BEARER + " %s";
|
private static final String AUTHORIZATION_FORMAT = SecurityFrameworkUtils.AUTHORIZATION_BEARER + " %s";
|
||||||
|
|
||||||
private final OAuth2TokenApi oauth2TokenApi;
|
private final OAuth2TokenApi oauth2TokenApi;
|
||||||
|
private final PermissionApi permissionApi;
|
||||||
|
|
||||||
private final SecurityProperties securityProperties;
|
private final SecurityProperties securityProperties;
|
||||||
|
|
||||||
|
@ -129,9 +132,12 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] getRoles(String s) {
|
public String[] getRoles(String token) {
|
||||||
// 暂时不用实现,因为不用 JmReport 的角色
|
// 参见文档 https://help.jeecg.com/jimureport/prodSafe.html 文档
|
||||||
return null;
|
// 适配:如果是本系统的管理员,则转换成 jimu 报表的管理员
|
||||||
|
Long userId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
|
return permissionApi.hasAnyRoles(userId, RoleCodeEnum.SUPER_ADMIN.getCode()).getCheckedData()
|
||||||
|
? new String[]{"admin"} : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -39,17 +39,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -41,27 +41,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -20,7 +20,7 @@ import java.util.Set;
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@TableName(value = "system_users", autoResultMap = true) // 由于 SQL Server 的 system_user 是关键字,所以使用 system_users
|
@TableName(value = "system_users", autoResultMap = true) // 由于 SQL Server 的 system_user 是关键字,所以使用 system_users
|
||||||
@KeySequence("system_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
@KeySequence("system_users_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Builder
|
@Builder
|
||||||
|
|
|
@ -39,17 +39,14 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://400-infra.server.iocoder.cn:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
username: root
|
||||||
password: 3WLiVUBEwTbvAfsh
|
password: 123456
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -40,27 +40,23 @@ spring:
|
||||||
primary: master
|
primary: master
|
||||||
datasource:
|
datasource:
|
||||||
master:
|
master:
|
||||||
name: ruoyi-vue-pro
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
|
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
|
||||||
|
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
# username: sa # SQL Server 连接的示例
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
|
||||||
|
# username: SYSDBA # DM 连接的示例
|
||||||
|
# password: SYSDBA # DM 连接的示例
|
||||||
slave: # 模拟从库,可根据自己需要修改
|
slave: # 模拟从库,可根据自己需要修改
|
||||||
name: ruoyi-vue-pro
|
lazy: true # 开启懒加载,保证启动速度
|
||||||
url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
|
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
|
|
||||||
# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
|
|
||||||
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
|
|
||||||
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
|
|
||||||
username: root
|
username: root
|
||||||
password: 123456
|
password: 123456
|
||||||
# username: sa
|
|
||||||
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
|
|
||||||
|
|
||||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||||
redis:
|
redis:
|
||||||
|
|
Loading…
Reference in New Issue